Browse Source

Merge branch 'master' into xqc_1035

bding 2 weeks ago
parent
commit
665ef5c0f6

+ 1 - 1
config/prod.test.env.js

@@ -1,7 +1,7 @@
 module.exports = {
     NODE_ENV:'"test"',
   	// API_ROOT:'"http://rddpapi.brilliantstart.cn/adminapi"',  //测试环境
-  	API_ROOT:'"http://8.136.199.33:7777/adminapi/"',  //测试环境
+  	API_ROOT:'"http://8.136.199.33:7777/adminapi"',  //测试环境
 	Domain:'"brilliantstart.cn"',
 	// Login:'"http://rddpapi.brilliantstart.cn/login"',
 	Login:'"http://8.136.199.33:7777/login"',

+ 13 - 0
src/api/modules/roadshowApi.js

@@ -368,6 +368,19 @@ const roadshowInterence={
 	rai_serve_search_chcck_PermissionName:params => {
 		return http.get('/cygx/rai_serve/chcck_PermissionName',params)
 	},	
+
+	// 路演客户问答保存
+	addRoadShowQuestion:params=>{
+		return http.post('/roadshow/question/save',params)
+	},
+	// 路演问答详情
+	roadShowQuestionInfo:params=>{
+		return http.get('/roadshow/question/list',params)
+	},
+	// 客户路演问答汇总
+	roadShowQuestionSummary:params=>{
+		return http.get('/roadshow/question/summary/list',params)
+	}
 }
 
 export {

+ 5 - 0
src/routes/modules/roadShowRoutes.js

@@ -54,6 +54,11 @@ export default [
 				name: "销售员日历",
 				component: () => import('@/views/roadshow_manage/sellerCalendar.vue')
 			},
+			{
+				path: "roadshowQuestion",
+				name: "客户路演问题汇总",
+				component: () => import('@/views/roadshow_manage/roadshowQuestion.vue')
+			},
 		]
 	},
 ]

+ 1 - 1
src/views/rai_manage/components/addChoiceness.vue

@@ -496,7 +496,7 @@ export default {
               clearInterval(this.timeInterval);
               sessionStorage.removeItem("addChoicenessQY");
               this.$message.success("操作成功!");
-              this.init();
+              type != "保存" && this.init();
               type != "保存" && this.$router.back();
             }
           }

+ 90 - 5
src/views/roadshow_manage/compononts/activityDetailDia.vue

@@ -3,11 +3,36 @@
       v-dialogDrag
       :title="title"
       :visible.sync="isShow"
-      :modal-append-to-body="false"
+      :modal-append-to-body="true"
+    	:append-to-body="true"
       @close="cancel"
-			width="850px"
+			width="900px"
 			class="statistic-dialog-cont"
     >
+		<div>
+			<!-- 区域筛选 -->
+			<el-select v-model="regionValue" v-if="region!=='oversea'" @change="getStatisticDetail">
+				<el-option :value="-1" label="全部区域"></el-option>
+				<el-option :value="0" label="国内"></el-option>
+				<el-option :value="1" label="海外"></el-option>
+			</el-select>
+			<template v-if="hasQustion">
+			<el-select v-model="statusType" @change="getStatisticDetail">
+				<el-option label="全部" :value="0"></el-option>
+				<el-option label="已完成" :value="1"></el-option>
+			</el-select>
+			<el-tooltip 
+				effect="dark"
+				placement="top"
+			>
+				<div slot="content">
+					<div>已完成:研究员已接受、已填写客户问答的路演</div>
+					<div>全部:研究员已接受的路演</div>
+				</div>
+				<i class="el-icon-info"></i>
+			</el-tooltip>
+			</template>
+		</div>
 		<el-table
 			:data="tableData"
 			class="table-cont"
@@ -44,26 +69,50 @@
 
 						<el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
 							<i class="el-icon-info"/>
+							
 							<div slot="content" v-if="companyInfo">
+								<!-- 国内客户 -->
+								<template v-if="companyInfo.EnglishCompany===0">
 								<p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
 								<p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
 								<p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通{{form.departmentType == '权益'  ? '行业:':'品种:'}}{{companyInfo.PermissionName}}</p>
 								<p style="margin: 6px 0;">{{form.departmentType == '权益' ? '累计互动次数':'累计报告阅读次数'}}:{{companyInfo.ReportReadTotal}}</p>
+								</template>
+								<!-- 海外客户 -->
+								<template v-if="companyInfo.EnglishCompany===1">
+								<p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+								<p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
+								<p style="margin: 6px 0;">{{form.departmentType == '权益' ? '累计互动次数':'累计报告阅读次数'}}:{{companyInfo.EnglishViewTotal}}</p>
+								</template>
 							</div>
 						</el-tooltip>
 					</span>
+					<div v-else-if="item.key==='roadAnswer'">
+						<span v-if="row.CompanyIndustry">客户行业:{{ row.CompanyIndustry }}</span>
+						<span v-if="row.CompanyClassify">客户分类:{{ row.CompanyClassify }}</span>
+						<el-button type="text" @click="handleShowRoasShowQuestion(row)" v-if="row.QuestionStatus===1">问答详情</el-button>
+					</div>
 
 					<span v-else>{{ row[item.key] || '——' }}</span>
 
 				</template>
 			</el-table-column>
 		</el-table>
+
+		<!-- 查看问答 -->
+    <viewAnswer 
+			:isShow.sync="isShowViewAnswer"
+      :roadAnswerData="currentAddAnswerData"
+      :RsCalendarResearcherId="currentAddAnswerData.RsCalendarResearcherId"
+    />
 	</el-dialog>	
 </template>
 
 <script>
 import { roadshowInterence } from '@/api/api.js';
+import viewAnswer from './viewAnswer.vue'
 export default {
+	components:{viewAnswer},
 	props: {
 		title: {
 			type: String
@@ -82,6 +131,10 @@ export default {
 		region: {
 			type: String,
 			default: 'home'
+		},
+		hasQustion:{//是否显示问答
+			type:Boolean,
+			default:false
 		}
 	},
 	watch: {
@@ -96,11 +149,20 @@ export default {
 		return {
 			companyInfo: null,
 			tableColumns:[], //
-			tableData: []
+			tableData: [],
+			statusType:1,
+			isShowViewAnswer:false,
+			currentAddAnswerData:{},
+			regionValue:-1,
 		}
 	},
 	methods: {
 
+		handleShowRoasShowQuestion(item){
+			this.currentAddAnswerData=item
+			this.isShowViewAnswer=true
+		},
+
 		/* 获取列表 */
 		getStatisticDetail() {
 			const { startDate,endDate,userid,key } = this.form;
@@ -139,7 +201,9 @@ export default {
 					StartDate: startDate,
 					EndDate: endDate,
 					AdminId: userid,
-					AdminType: this.fromType
+					AdminType: this.fromType,
+					Status:this.hasQustion?this.statusType:0,
+					EnglishCompany:this.regionValue,
 				}).then(res => {
 					const { Ret,Data } = res;
 
@@ -154,6 +218,8 @@ export default {
 
 		/* 取消 */
 		cancel() {
+			this.statusType=this.hasQustion?1:0
+			this.regionValue=-1
 			this.$emit('update:isShow', false);
 		},
 
@@ -162,7 +228,9 @@ export default {
       const { Data }  = await roadshowInterence.componyDetail({ 
 		CompanyId:row.CompanyId,
 		RsReportRecordId:row.RsReportRecordId,
-		CompanyType:this.form.departmentType 
+		CompanyType:this.form.departmentType,
+		SellerId:row.SellerId,
+		EnglishCompany:row.EnglishCompany
 		});
       this.companyInfo = Data;
     },
@@ -220,6 +288,23 @@ export default {
 						},
 						{ ...dynamic_column }
 				]	
+			// 增加问答列
+			if(this.hasQustion&&this.title==='路演详情'){
+				this.tableColumns=[
+					...this.tableColumns,
+					{
+						label: '客户类型',
+						key: 'CompanyType',
+						minwidthsty: '100px',
+					},
+					{
+						label: '客户问答',
+						key: 'roadAnswer',
+						minwidthsty: '250px',
+					},
+				]
+				this.statusType=1
+			}
 			this.tableColumns = this.tableColumnsHandler()
 			this.$refs.tableRef && this.$refs.tableRef.clearSort()
 			this.$nextTick(()=>{

+ 290 - 0
src/views/roadshow_manage/compononts/addAnswer.vue

@@ -0,0 +1,290 @@
+<template>
+  <el-dialog
+    v-dialogDrag
+    :title="companyName+'客户问答'"
+    :visible.sync="isShow"
+    :modal-append-to-body="true"
+    :append-to-body="true"
+    @close="handleCancel"
+    width="750px"
+    class="answer-dialog"
+  >
+    <el-form 
+      :model="ruleForm" 
+      :rules="rules" 
+      label-width="80px"
+      ref="ruleForm"
+      class="ruleForm-wrap"
+    >
+      <div class="flex-box">
+        <el-form-item label="客户行业" prop="industry">
+          <el-select v-model="ruleForm.industry" placeholder="请选择客户行业">
+            <el-option 
+              v-for="item in industryOpts" 
+              :key="item.value" 
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户分类" prop="type">
+          <el-select v-model="ruleForm.type" placeholder="请选择客户分类">
+            <el-option 
+              v-for="item in customTypeOpts" 
+              :key="item.value" 
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </div>
+      <div class="answer-list">
+        <div class="answer-item" v-for="item,index in ruleForm.list" :key="index">
+          <img class="del-icon" src="~@/assets/img/icons/delete-Item.png" alt="" v-if="ruleForm.list.length>2" @click="handleDelQuestion(index)">
+          <el-form-item
+            :label="'Q'+(index+1)"
+            :prop="`list.${index}.question`"
+            :rules="{
+              required: true,
+              message: '请填写问题',
+              trigger: 'blur',
+            }"
+          >
+            <el-input
+              placeholder="请输入内容"
+              v-model="item.question"
+              style="width: 580px;"
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            :label="'A'+(index+1)"
+            :prop="`list.${index}.answer`"
+            :rules="[
+              {
+                required: true,
+                message: '请输入内容',
+                trigger: 'blur',
+              },
+              {
+                type: 'string',
+                min: 30,
+                message: '字数不少于30字',
+                trigger: 'blur'
+              }
+            ]"
+          >
+            <el-input
+              placeholder="请输入内容"
+              type="textarea"
+              v-model="item.answer"
+              style="width: 580px;"
+            ></el-input>
+          </el-form-item>
+        </div>
+      </div>
+    </el-form>
+    <div class="add-btn-box" @click="handleAddQuestion">
+      <img class="add-icon" src="~@/assets/img/icons/add_blue.png">
+      <span>添加更多</span>
+    </div>
+    <div class="btn-group">
+      <el-button @click="handleCancel">取消</el-button>
+      <el-button type="primary" @click="handleSubmit">提交</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+export default {
+  props: {
+		isShow: {
+			type: Boolean
+		},
+    companyName:'',
+    RsCalendarResearcherId:{
+      type:Number,
+      default:0
+    },
+    RsCalendarId:{
+      type:Number,
+      default:0
+    }
+	},
+	watch: {
+		isShow(newval) {
+			if(newval) {
+						
+			}
+		}
+	},
+  data () {
+    return {
+      industryOpts:[
+        {
+          label:'黑色',
+          value:'黑色'
+        },
+        {
+          label:'有色',
+          value:'有色'
+        },
+        {
+          label:'能化',
+          value:'能化'
+        },
+        {
+          label:'综合',
+          value:'综合'
+        },
+        {
+          label:'金融',
+          value:'金融'
+        },
+        {
+          label:'农产品',
+          value:'农产品'
+        }
+      ],
+      customTypeOpts:[ 
+      {
+          label:'上游',
+          value:'上游'
+        },
+        {
+          label:'中游',
+          value:'中游',
+        },
+        {
+          label:'下游',
+          value:'下游',
+        },
+        {
+          label:'投资',
+          value:'投资',
+        }
+      ],
+      ruleForm:{
+        industry:'',
+        type:'',
+        list:[
+          {
+            question:'',
+            answer:''
+          },
+          {
+            question:'',
+            answer:''
+          }
+        ]
+      },
+      rules:{
+        industry:[{ required: true, message: '请选择客户行业', trigger: 'change' }],
+        type:[{ required: true, message: '请选择客户类型', trigger: 'change' }]
+      }
+    }
+  },
+  methods: {
+    handleCancel(){
+      this.$refs.ruleForm.resetFields();
+      this.$emit('update:isShow', false);
+    },
+
+    async handleSubmit(){
+      await this.$refs.ruleForm.validate();
+      await this.$confirm('客户问答只能提交一次,确认提交吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+      const qArr=this.ruleForm.list.map(item=>{
+        return {
+          QuestionContent:item.question,
+          ReplyContent:item.answer
+        }
+      })
+      const res=await roadshowInterence.addRoadShowQuestion({
+        RsCalendarId:this.RsCalendarId,
+        RsCalendarResearcherId:this.RsCalendarResearcherId,
+        CompanyIndustry:this.ruleForm.industry,
+        CompanyClassify:this.ruleForm.type,
+        QuestionList:qArr
+      })
+      if(res.Ret===200){
+        this.$message.success('提交成功')
+        this.$emit('success')
+        this.handleCancel()
+      }
+    },
+
+    handleAddQuestion(){
+      this.ruleForm.list.push({
+        question:'',
+        answer:''
+      })
+    },
+
+    handleDelQuestion(index){
+      this.ruleForm.list.splice(index, 1)
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.ruleForm-wrap{
+  padding-right: 50px;
+  .flex-box{
+    display: flex;
+    justify-content: space-between;
+    .el-form-item{
+      flex-shrink: 0;
+      min-width: 300px;
+    }
+  }
+  .answer-list{
+    // max-height: 50vh;
+    // overflow-y: auto;
+    .answer-item{
+      position: relative;
+      .del-icon{
+        width: 20px;
+        height: 20px;
+        position: absolute;
+        top: 10px;
+        right: -25px;
+        cursor: pointer;
+      }
+    }
+  }
+}
+.answer-dialog{
+  .ruleForm-wrap{
+    overflow-y: auto;
+    max-height: 60vh;
+    &::-webkit-scrollbar{
+      width: 2px;
+      background: #ccc
+    }
+  }
+  .add-btn-box{
+    padding-left: 34px;
+    display: flex;
+    align-items: center;
+    gap: 0 5px;
+    color: #456DD6;
+    cursor: pointer;
+    .add-icon{
+      width: 16px;
+      height: 16px;
+    }
+  }
+  .btn-group {
+    margin: 20px 0;
+    text-align: center;
+    .el-button {
+      width: 140px;
+    }
+  }
+}
+</style>

+ 180 - 0
src/views/roadshow_manage/compononts/viewAnswer.vue

@@ -0,0 +1,180 @@
+<template>
+  <el-dialog
+    v-dialogDrag
+    :title="roadAnswerData.CompanyName+'客户问答'"
+    :visible.sync="isShow"
+    :modal-append-to-body="true"
+    :append-to-body="true"
+    @close="handleCancel"
+    width="750px"
+    class="answer-dialog"
+  >
+    <!-- 单个研究员的问题详情 -->
+    <div class="answer-wrap" v-if="ResearcherId.split(',').length<2">
+      <div class="top-box">
+        <div style="flex: 1;">
+          <span class="label">客户行业:</span>
+          <span>{{roadAnswerData.CompanyIndustry}}</span>
+        </div>
+        <div style="flex: 1;">
+          <span class="label">客户分类:</span>
+          <span>{{roadAnswerData.CompanyClassify}}</span>
+        </div>
+      </div>
+      <div class="answer-list">
+        <div class="answer-item" v-for="item,index in list" :key="index">
+          <div class="info-item">
+            <div class="label">Q{{ index +1}}:</div>
+            <div>{{item.QuestionContent}}</div>
+          </div>
+          <div class="info-item">
+            <div class="label">A{{ index+1 }}:</div>
+            <div>{{item.ReplyContent}}</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 多个研究员 -->
+    <div class="answer-list" v-else>
+      <div class="group-item" v-for="group in list" :key="group.id">
+        <div class="answer-item" v-for="item,index in group.list" :key="index">
+          <div class="info-item">
+            <div class="label">
+              <span v-if="index===0" style="color:#333">{{ group.name }}</span>
+              Q{{ index +1}}:
+            </div>
+            <div>{{item.QuestionContent}}</div>
+          </div>
+          <div class="info-item">
+            <div class="label">A{{ index+1 }}:</div>
+            <div>{{item.ReplyContent}}</div>
+          </div>
+        </div>
+      </div>
+      
+    </div>
+
+  </el-dialog>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+export default {
+  props: {
+		isShow: {
+			type: Boolean
+		},
+    roadAnswerData:{},
+
+    RsCalendarResearcherId:{
+      type:Number,
+      default:0
+    },
+    RsCalendarId:{
+      type:Number,
+      default:0
+    },
+    ResearcherId:{//如果是在路演问题统计表中来的则有该字段数据 这时候根据是否有多个人来判断
+      type:String,
+      default:''
+    }
+	},
+	watch: {
+		isShow(newval) {
+			if(newval&&this.RsCalendarResearcherId) {
+				this.getInfo()
+			}
+		}
+	},
+  data () {
+    return {
+      list:[]
+    }
+  },
+  methods: {
+    handleCancel(){
+      this.$emit('update:isShow', false);
+    },
+    groupById(arr) {
+      const grouped = arr.reduce((acc, item) => {
+        const id = item.ResearcherId;
+        // 如果当前id不存在,初始化一个分组
+        if (!acc[id]) {
+          acc[id] = { id: id,name:item.ResearcherName, list: [] };
+        }
+        // 将当前项添加到对应的list中
+        acc[id].list.push(item);
+        return acc;
+      }, {}); // 初始值为空对象,用于存储按id分组的临时数据
+
+      // 将分组对象转换为数组
+      return Object.values(grouped);
+    },
+
+    async getInfo(){
+      let params={}
+      if(this.ResearcherId.split(',').length>1){
+        params={
+          RsCalendarId:this.RsCalendarId
+        }
+      }else{
+        params={
+          RsCalendarResearcherId:this.RsCalendarResearcherId
+        }
+      }
+      const res=await roadshowInterence.roadShowQuestionInfo(params)
+      if(res.Ret===200){
+        let arr=res.Data||[]
+        // 根据研究员划分
+        if(this.ResearcherId.split(',').length>1){
+          arr=this.groupById(arr)
+        }
+        this.list=arr
+      }
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.answer-wrap{
+  .label{
+    color: #999999;
+    flex-shrink: 0;
+    display: inline-block;
+    width: 100px;
+    text-align: right;
+  }
+  .top-box{
+    display: flex;
+    margin-bottom: 10px;
+  }
+  
+}
+.answer-list{
+  max-height: 60vh;
+  overflow-y: auto;
+  .group-item{
+    border-bottom: 1px dashed #C0C4CC;
+    margin-bottom: 10px;
+    &:last-child{
+      border: none;
+    }
+  }
+    .answer-item{
+      margin-bottom: 14px;
+      .info-item{
+        display: flex;
+        margin-bottom: 14px;
+        line-height: 1.5;
+        .label{
+          flex-shrink: 0;
+          text-align: right;
+          width: 100px;
+          color: #999999;
+        }
+      }
+    }
+  }
+
+</style>

+ 306 - 179
src/views/roadshow_manage/myCalendar.vue

@@ -1,193 +1,246 @@
 <template>
   <div class="my-calendar">
     <el-card class="my-calendar-list">
-      <ul class="tabs-type">
-        <li :class="['type-item',{ 'act': default_tab === tab.key }]" v-for="tab in tabs" :key="tab.key"  @click="default_tab=tab.key">{{tab.label}}</li>
-      </ul>
+      <div class="top-wrap">
+        <ul class="tabs-type">
+          <li :class="['type-item',{ 'act': default_tab === tab.key }]" v-for="tab in tabs" :key="tab.key"  @click="default_tab=tab.key">{{tab.label}}</li>
+        </ul>
+        <!-- 已处理申请筛选模块 -->
+        <div class="filter-wrap" v-if="default_tab===2 ">
+          <el-select placeholder="请选择状态" v-model="roadStatus" clearable @change="handleCurrentChange(1)">
+            <el-option 
+              v-for="item in roadStatusOpts" 
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+          <el-date-picker
+            clearable
+            v-model="roadTime"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+            @change="handleCurrentChange(1)"
+          />
+          <el-input
+            placeholder="客户名称"
+            prefix-icon="el-icon-search"
+            v-model="roadSearchVal"
+            style="display:inline-block;width:300px;margin-left: auto;"
+            clearable
+            @change="handleCurrentChange(1)"
+          />
+        </div>
+      </div>
       <el-table
 				:data="tableData"
         v-loading="tableLoading"
         element-loading-text="数据加载中..." 
 				style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top:20px;"
-				border>
-					<el-table-column
-            v-if="!item.hidden"
-						v-for="item in tableColums"
-						:key="item.label"
-						:label="item.label"
-						:width="item.widthsty"
-						:min-width="item.minwidthsty"
-						align="center"
-					>
-						<template slot-scope="{row}">
-
-              <!-- 时间处理 -->
-              <span v-if="item.key === 'time'">
-                {{
-                  row.StartDate === row.EndDate
-                  ? ($moment(row.StartDate + " " + row.StartTime).format(
-                    "MM.DD(ddd) HH:mm") + '~' +  $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
-                  : (
-                    $moment(row.StartDate + " " + row.StartTime).format(
-                    "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
-                  )
-                }}
-              </span>
-
-              <!-- 活动形式 -->
-              <span v-else-if="item.key === 'RoadshowType'">
-                {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
-              </span>
-
-              <!-- 状态 -->
-              <span v-else-if="item.key === 'Status'" 
-              :class="row.Status === 2 ? 'successty' : row.Status === 3 ? 'deletesty' : '' ">
-                {{statusMap.get(row.Status)}}
-                <i 
-                  class="el-icon-info" 
-                  style="color:#666;" 
-                  v-if="[3,4].includes(row.Status) && ENUM_RESEARCHLIST.includes(Role)"
-                  @click="iconClick(row)"
-                />
-              </span>
-
-              <!-- 客户拼接 -->
-              <span v-else-if="item.key === 'company'">
-                {{ row.CooperationName || row.CompanyName || '——'}}
-
-                <el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
-                  <i class="el-icon-info"/>
-                  <div slot="content" v-if="companyInfo">
-                    <!-- 权益客户 -->
-                    <template v-if="Role.includes('rai')">
-                        <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
-                        <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
-                        <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">行业权限:{{companyInfo.PermissionName}}</p>
-                        <p style="margin: 6px 0;">累计互动次数:{{companyInfo.ReportReadTotal}}</p>
-                    </template>
-                    <!-- ficc客户分国内海外 -->
-                    <template v-else>
-                        <template v-if="companyInfo.EnglishCompany===1">
-                            <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
-                            <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
-                        </template>
-                        <template v-else>
-                            <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
-                            <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
-                            <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
-                            <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
-                        </template>
-                    </template>
-                  </div>
-                </el-tooltip>
-              </span>
-
-							<span v-else>{{ row[item.key] || '——' }}</span>
-						</template>
-					</el-table-column>
-          <el-table-column label="操作" align="center" v-if="handleArr.length">
-            <template slot-scope="{ row }" >
-            
-            <template  v-if="![4,6].includes(row.Status) && ($moment(`${row.StartDate} ${row.StartTime}`).valueOf() > new Date().getTime())">
-              <template v-if="default_tab === 1">
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('撤回')"
-                  @click="revocation(row)"
-                  >撤回</span>
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('接受')"
-                  @click="accept(row)"
-                  >接受</span>
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('拒绝')"
-                  @click="refuse(row)"
-                  >拒绝</span>
-              </template>
+				border
+      >
+        <el-table-column
+          v-if="!item.hidden"
+          v-for="item in tableColums"
+          :key="item.label"
+          :label="item.label"
+          :width="item.widthsty"
+          :min-width="item.minwidthsty"
+          align="center"
+        >
+          <template slot-scope="{row}">
+
+            <!-- 时间处理 -->
+            <span v-if="item.key === 'time'">
+              {{
+                row.StartDate === row.EndDate
+                ? ($moment(row.StartDate + " " + row.StartTime).format(
+                  "MM.DD(ddd) HH:mm") + '~' +  $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
+                : (
+                  $moment(row.StartDate + " " + row.StartTime).format(
+                  "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
+                )
+              }}
+            </span>
+
+            <!-- 活动形式 -->
+            <span v-else-if="item.key === 'RoadshowType'">
+              {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
+            </span>
+
+            <!-- 状态 -->
+            <span v-else-if="item.key === 'Status'" 
+            :class="row.Status === 2 ? 'successty' : row.Status === 3 ? 'deletesty' : '' ">
+              {{statusMap.get(row.Status)}}{{row.Status===2&&row.QuestionStatus===1?'(已填写)':''}}
+              <i 
+                class="el-icon-info" 
+                style="color:#666;" 
+                v-if="[3,4].includes(row.Status) && ENUM_RESEARCHLIST.includes(Role)"
+                @click="iconClick(row)"
+              />
+            </span>
+
+            <!-- 客户拼接 -->
+            <span v-else-if="item.key === 'company'">
+              {{ row.CooperationName || row.CompanyName || '——'}}
+
+              <el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
+                <i class="el-icon-info"/>
+                <div slot="content" v-if="companyInfo">
+                  <!-- 权益客户 -->
+                  <template v-if="Role.includes('rai')">
+                      <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+                      <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+                      <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">行业权限:{{companyInfo.PermissionName}}</p>
+                      <p style="margin: 6px 0;">累计互动次数:{{companyInfo.ReportReadTotal}}</p>
+                  </template>
+                  <!-- ficc客户分国内海外 -->
+                  <template v-else>
+                      <template v-if="companyInfo.EnglishCompany===1">
+                          <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
+                          <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
+                      </template>
+                      <template v-else>
+                          <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+                          <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+                          <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
+                          <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
+                      </template>
+                  </template>
+                </div>
+              </el-tooltip>
+            </span>
+
+            <span v-else>{{ row[item.key] || '——' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" v-if="handleArr.length">
+          <template slot-scope="{ row }" >
+          
+          <template  v-if="![4,6].includes(row.Status) && ($moment(`${row.StartDate} ${row.StartTime}`).valueOf() > new Date().getTime())">
+            <template v-if="default_tab === 1">
+              <span
+                class="editsty"
+                v-if="handleArr.includes('撤回')"
+                @click="revocation(row)"
+                >撤回</span>
+              <span
+                class="editsty"
+                v-if="handleArr.includes('接受')"
+                @click="accept(row)"
+                >接受</span>
+              <span
+                class="editsty"
+                v-if="handleArr.includes('拒绝')"
+                @click="refuse(row)"
+                >拒绝</span>
+            </template>
 
-              <template v-if="default_tab === 2">
-                <span
-                  class="deletesty"
-                  v-if="handleArr.includes('删除') && row.Status === 2"
-                  @click="deleteRoadshow(row)"
-                  >删除</span
-                >
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('拒绝理由') && row.Status === 3"
-                  @click="showRefuseReason(row)"
-                  >拒绝理由</span>
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('修改重提') &&  [3,5].includes(row.Status)"
-                  @click="resubmit(row)"
-                  >修改重提</span>
-              </template>
+            <template v-if="default_tab === 2"> 
+              <span
+                class="deletesty"
+                v-if="handleArr.includes('删除') && row.Status === 2"
+                @click="deleteRoadshow(row)"
+                >删除</span
+              >
+              <span
+                class="editsty"
+                v-if="handleArr.includes('拒绝理由') && row.Status === 3"
+                @click="showRefuseReason(row)"
+                >拒绝理由</span>
+              <span
+                class="editsty"
+                v-if="handleArr.includes('修改重提') &&  [3,5].includes(row.Status)"
+                @click="resubmit(row)"
+                >修改重提</span>
+            </template>
 
-              <template v-if="[3,4].includes(default_tab)">
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('修改')"
-                  @click="editActivityHandle(row)"
-                  >修改</span>
-                <span
-                  class="deletesty"
-                  @click="delNormalHandle(row)"
-                  v-if="handleArr.includes('删除')"
-                  >删除</span>
-              </template>
+            <template v-if="[3,4].includes(default_tab)">
+              <span
+                class="editsty"
+                v-if="handleArr.includes('修改')"
+                @click="editActivityHandle(row)"
+                >修改</span>
+              <span
+                class="deletesty"
+                @click="delNormalHandle(row)"
+                v-if="handleArr.includes('删除')"
+                >删除</span>
             </template>
-            <!-- 事项的操作栏由后端控制 -->
-            <template v-if="default_tab===5">
-                <!-- <span class="editsty" v-if="row.EditReason" @click="showReason(row)">最近修改记录</span> -->
+          </template>
+          <!-- 事项的操作栏由后端控制 -->
+          <template v-if="default_tab===5">
+              <!-- <span class="editsty" v-if="row.EditReason" @click="showReason(row)">最近修改记录</span> -->
+              <span
+                class="editsty"
+                v-if="!row.ButtonAuth.EditDisabled"
+                @click="editActivityHandle(row)"
+                >修改</span>
+              <span
+                class="deletesty"
+                @click="delNormalHandle(row)"
+                v-if="!row.ButtonAuth.RemoveDisabled"
+                >删除</span>
+          </template>
+          <!-- 提交/查看参会名单 按钮由后端控制 -->
+          <template v-if="default_tab===2&&!ENUM_RESEARCHLIST.includes(Role)">
+            <span
+                class="editsty"
+                v-if="row.EditButton"
+                @click="editActivityHandle(row)"
+                >修改</span>
+                <span 
+                  class="deletesty"
+                  v-if="row.SubmitButton"
+                  @click="submitAttendees(row,'提交')"
+                >提交参会名单</span>
                 <span
                   class="editsty"
-                  v-if="!row.ButtonAuth.EditDisabled"
-                  @click="editActivityHandle(row)"
-                  >修改</span>
+                  v-if="row.ViewButton"
+                  @click="submitAttendees(row,'查看')"
+                >查看参会名单
+                </span>
                 <span
-                  class="deletesty"
-                  @click="delNormalHandle(row)"
-                  v-if="!row.ButtonAuth.RemoveDisabled"
-                  >删除</span>
-            </template>
-            <!-- 提交/查看参会名单 按钮由后端控制 -->
-            <template v-if="default_tab===2">
-              <span
                   class="editsty"
-                  v-if="row.EditButton"
-                  @click="editActivityHandle(row)"
-                  >修改</span>
-                  <span 
-                    class="deletesty"
-                    v-if="row.SubmitButton"
-                    @click="submitAttendees(row,'提交')"
-                  >提交参会名单</span>
-                  <span
-                    class="editsty"
-                    v-if="row.ViewButton"
-                    @click="submitAttendees(row,'查看')"
-                  >查看参会名单
-                  </span>
-            </template>
-
-            </template>
-          </el-table-column>
-					<div slot="empty" style="padding: 20px 0;">
-						<img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
-						<span>暂无数据</span>
-					</div>
-				</el-table>
-        <el-col :span="24" class="toolbar">
-            <m-page
-              :total="total"
-              :page_no="page_no"
-              :pageSize="10"
-              @handleCurrentChange="handleCurrentChange"
-            />
-          </el-col>
+                  v-if="row.QuestionStatus===1"
+                  @click="handleShowAddAnswer(row,'view')"
+                >问答详情
+            </span>
+          </template>
+
+          <!-- 客户问答、问答详情(仅针对路演) -->
+          <template v-if="default_tab===2&&ENUM_RESEARCHLIST.includes(Role)">
+            <span 
+              class="editsty"
+              v-if="row.Status===2&&row.ActivityType==='路演'&&row.QuestionStatus===0"
+              @click="handleShowAddAnswer(row)"
+            >填写客户问答</span> 
+            <span
+              class="editsty"
+              v-if="row.QuestionStatus===1"
+              @click="handleShowAddAnswer(row,'view')"
+            >问答详情
+            </span>
+          </template>
+
+          </template>
+        </el-table-column>
+        <div slot="empty" style="padding: 20px 0;">
+          <img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
+          <span>暂无数据</span>
+        </div>
+			</el-table>
+      <el-col :span="24" class="toolbar">
+        <m-page
+          :total="total"
+          :page_no="page_no"
+          :pageSize="10"
+          @handleCurrentChange="handleCurrentChange"
+        />
+      </el-col>
 
     </el-card>
     <el-card class="my-calendar-context" v-if="Role!=='admin'">
@@ -313,6 +366,20 @@
         :ResearcherId="currentResearcherId"
         @close="isParticipateShow=false"
     />
+    <!-- 添加问答 -->
+    <addAnswer 
+      :companyName="currentAddAnswerData.CompanyName"
+      :RsCalendarResearcherId="edit_rs_id"
+      :RsCalendarId="edit_id"
+      :isShow.sync="isShowAddAnswer"
+      @success="getCalendarList()"
+    />
+    <!-- 查看问答 -->
+    <viewAnswer 
+      :isShow.sync="isShowViewAnswer"
+      :roadAnswerData="currentAddAnswerData"
+      :RsCalendarResearcherId="edit_rs_id"
+    />
   </div>
 </template>
 
@@ -326,6 +393,8 @@ import addActivityBtnDia from "./compononts/addActivityBtnDia.vue";
 import addParticipateDia from "./compononts/addParticipateDia.vue";
 import mPage from "@/components/mPage.vue";
 import showParticipateListDia from "./compononts/showParticipateListDia.vue";
+import addAnswer from "./compononts/addAnswer.vue";
+import viewAnswer from './compononts/viewAnswer.vue'
 
 export default {
   components: {
@@ -335,7 +404,9 @@ export default {
     addActivityBtnDia,
     addActivityCellDia,
     addParticipateDia,
-    showParticipateListDia
+    showParticipateListDia,
+    addAnswer,
+    viewAnswer
 },
   watch: {
     default_tab(newval) {
@@ -415,10 +486,52 @@ export default {
       },
       isReasonDiaShow:false,
       currentResearcherId:0,
-      isRaiEditType:''
+      isRaiEditType:'',
+
+      currentAddAnswerData:{},
+      isShowAddAnswer:false,//添加问答
+      isShowViewAnswer:false,//查看客户问答
+      roadStatus:'',
+      roadStatusOpts:[
+        {
+          label:'已结束',
+          value:6
+        },
+        {
+          label:'已接受',
+          value:2
+        },
+        {
+          label:'已撤回',
+          value:5
+        },
+        {
+          label:'已删除',
+          value:4
+        },
+        {
+          label:'已拒绝',
+          value:3
+        },
+      ],
+      roadTime:'',
+      roadSearchVal:''
     };
   },
   methods: {
+    // 填写客户问答
+    handleShowAddAnswer(row,type){
+      this.edit_id = row.RsCalendarId;
+      this.edit_rs_id = row.RsCalendarResearcherId;
+      this.currentAddAnswerData=row
+      if(type==='view'){
+        this.isShowViewAnswer=true
+      }else{
+        this.isShowAddAnswer = true;
+      }
+      
+    },
+
     // 添加事项按钮
     addMatterBtn() {
       const { currentStart } = this.$refs.calendarRef.calendarApi.view;
@@ -438,6 +551,10 @@ export default {
         PageSize: 10,
         CurrentIndex: this.page_no,
         CalendarType: this.default_tab,
+        Status:this.roadStatus,
+        StartDate:this.roadTime?this.roadTime[0]:'',
+        EndDate:this.roadTime?this.roadTime[1]:'',
+        Keyword:this.roadSearchVal,
       });
 
       this.tableLoading = false;
@@ -456,8 +573,8 @@ export default {
     },
     
     /* 获取客户信息 */
-    async getCompanyInfo({CompanyId,EnglishCompany,ActivityType,ResearcherId}) {
-      const { Data }  = await roadshowInterence.componyDetail({ CompanyId,EnglishCompany });
+    async getCompanyInfo({CompanyId,EnglishCompany,ActivityType,ResearcherId,SysUserId}) {
+      const { Data }  = await roadshowInterence.componyDetail({ CompanyId,EnglishCompany,SellerId:SysUserId });
       this.companyInfo = Data;
     },
 
@@ -768,7 +885,17 @@ export default {
 <style lang="scss">
 .my-calendar {
   .my-calendar-list {
+    .top-wrap{
+      display: flex;
+      .filter-wrap{
+        flex: 1;
+        display: flex;
+        align-items: center;
+        gap: 0 5px;
+      }
+    }
     .tabs-type {
+      flex-shrink: 0;
       display: flex;
       align-items: center;
       .type-item {

+ 397 - 0
src/views/roadshow_manage/roadshowQuestion.vue

@@ -0,0 +1,397 @@
+<template>
+  <div class="roadshow-question-page">
+    <div class="filter-wrap">
+      <date-picker
+        v-model="filterData.time" 
+        type="date" 
+        range
+        value-type="format"
+        clearable
+        @change="handleCurrentChange(1)"
+        placeholder="请选择路演时间"
+      />
+      <el-cascader
+        v-model="filterData.researcher"
+        placeholder="请选择研究员"
+        style="width: 230px"
+        :options="researcherList"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        :key="cascaderIdx"
+        @change="handleCurrentChange(1)"
+        @remove-tag="handleRemoveResearcherTag"
+      ></el-cascader>
+      <el-select 
+        v-model="filterData.industry" 
+        placeholder="请选择客户行业" 
+        clearable
+        @change="handleCurrentChange(1)"
+      >
+        <el-option 
+          v-for="item in industryOpts" 
+          :key="item.value" 
+          :label="item.label"
+          :value="item.value"
+        ></el-option>
+      </el-select>
+      <el-select 
+        v-model="filterData.type" 
+        placeholder="请选择客户分类" 
+        clearable
+        @change="handleCurrentChange(1)"
+      >
+        <el-option 
+          v-for="item in customTypeOpts" 
+          :key="item.value" 
+          :label="item.label"
+          :value="item.value"
+        ></el-option>
+      </el-select>
+      <a :href="exportExcel" download>
+        <el-button type="primary">导出EXCEL</el-button>
+      </a>
+      <el-input
+        placeholder="客户名称"
+        prefix-icon="el-icon-search"
+        v-model="filterData.keyword"
+        style="display:inline-block;width:300px;margin-left: auto;"
+        clearable
+        @change="handleCurrentChange(1)"
+      />
+    </div>
+
+    <el-table
+      :data="tableData"
+      v-loading="tableLoading"
+      element-loading-text="数据加载中..." 
+      style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top:20px;"
+      border
+    >
+      <el-table-column
+        v-for="item in tableColums"
+        :key="item.label"
+        :label="item.label"
+        :width="item.widthsty"
+        :min-width="item.minwidthsty"
+        align="center"
+      >
+        <template slot-scope="{row}">
+
+          <!-- 时间处理 -->
+          <span v-if="item.key === 'time'">
+            {{
+              row.StartDate === row.EndDate
+              ? ($moment(row.StartDate + " " + row.StartTime).format(
+                "MM.DD(ddd) HH:mm") + '~' +  $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
+              : (
+                $moment(row.StartDate + " " + row.StartTime).format(
+                "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
+              )
+            }}
+          </span>
+          <!-- 活动形式 -->
+          <span v-else-if="item.key === 'RoadshowType'">
+            {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
+          </span>
+          <!-- 客户拼接 -->
+          <span v-else-if="item.key === 'company'">
+            {{ row.CooperationName || row.CompanyName }}
+
+						<el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
+							<i class="el-icon-info"/>
+							<div slot="content" v-if="companyInfo">
+								<p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+								<p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+								<p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通{{companyInfo.CompanyType == 'FICC'  ? '品种:':'行业:'}}{{companyInfo.PermissionName}}</p>
+								<p style="margin: 6px 0;">{{companyInfo.CompanyType == 'FICC' ? '累计报告阅读次数':'累计互动次数'}}:{{companyInfo.ReportReadTotal}}</p>
+							</div>
+						</el-tooltip>
+          </span>
+          <el-button type="text" v-else-if="item.key === 'question_btn'"  @click="handleShowQuestionDetail(row)">问答详情</el-button>
+          <span v-else>{{ row[item.key] || '——' }}</span>
+        </template>
+      </el-table-column>
+      <div slot="empty" style="padding: 20px 0;">
+        <img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
+        <span>暂无数据</span>
+      </div>
+    </el-table>
+    <div style="height:60px;padding-top: 20px;">
+      <m-page
+        :total="total"
+        :page_no="page_no"
+        :pageSize="pageSize"
+        @handleCurrentChange="handleCurrentChange"
+      />
+    </div>
+
+    <!-- 查看问答 -->
+    <viewAnswer 
+      :isShow.sync="isShowViewAnswer"
+      :roadAnswerData="currentAddAnswerData"
+      :RsCalendarResearcherId="currentAddAnswerData.RsCalendarResearcherId"
+      :RsCalendarId="currentAddAnswerData.RsCalendarId"
+      :ResearcherId="currentAddAnswerData.ResearcherId"
+    />
+  </div>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+import mPage from "@/components/mPage.vue";
+import viewAnswer from './compononts/viewAnswer.vue'
+export default {
+  name:'RoadShowQuestion',
+  components:{mPage,viewAnswer},
+  computed: {
+    Role() {
+      return localStorage.getItem("Role");
+    },
+    exportExcel(){
+			let baseUrl = process.env.API_ROOT + "/roadshow/question/summary/export";
+			let token = localStorage.getItem("auth") || "";
+			let paramStr = "";
+			let obj = {
+				StartDate:this.filterData.time?this.filterData.time[0]:'',
+        EndDate:this.filterData.time?this.filterData.time[1]:'',
+        ResearcherId:this.filterData.researcher?this.filterData.researcher.join(','):'',
+        Keyword:this.filterData.keyword,
+        CompanyIndustry:this.filterData.industry,
+        CompanyClassify:this.filterData.type
+			};
+			for (let key in obj) {
+				paramStr = `${paramStr}&${key}=${obj[key]}`;
+			}
+			return `${baseUrl}?${token}${paramStr}`;
+		}
+  },
+  data () {
+    return {
+      industryOpts:[
+        {
+          label:'黑色',
+          value:'黑色'
+        },
+        {
+          label:'有色',
+          value:'有色'
+        },
+        {
+          label:'能化',
+          value:'能化'
+        },
+        {
+          label:'综合',
+          value:'综合'
+        },
+        {
+          label:'金融',
+          value:'金融'
+        },
+        {
+          label:'农产品',
+          value:'农产品'
+        }
+      ],
+      customTypeOpts:[ 
+        {
+          label:'上游',
+          value:'上游'
+        },
+        {
+          label:'中游',
+          value:'中游',
+        },
+        {
+          label:'下游',
+          value:'下游',
+        },
+        {
+          label:'投资',
+          value:'投资',
+        }
+      ],
+      researcherList: [], // 研究员列表
+      defaultSalesProps: {
+        multiple: true,
+        children: "ResearcherList",
+        value: "AdminId",
+        emitPath: false,
+      }, //研究员配置
+      cascaderIdx:1,
+
+      filterData:{
+        time:'',
+        keyword:'',
+        researcher:'',
+        industry:'',
+        type:''
+      },
+
+      companyInfo:{},
+
+      tableColums:[
+        {
+          label: '路演时间',
+          key: 'time',
+        },
+        {
+          label: '客户名称',
+          key: 'company',
+        },
+        {
+          label: '路演形式',
+          key: 'RoadshowType',
+        },
+        {
+          label: '发起人',
+          key: 'SysUserRealName',
+        },
+        {
+          label: '研究员',
+          key: 'ResearcherName',
+        },
+        {
+          label: '客户问答',
+          key: 'question_btn',
+        },
+      ],
+      tableLoading:false,
+      tableData:[],
+      total:0,
+      page_no:1,
+      pageSize:10,
+
+      isShowViewAnswer:false,
+      currentAddAnswerData:{}
+    }
+  },
+  created() {
+    this.getResearcherList()
+    this.getRoadShowQuestionList()
+  },
+  methods: {
+    handleShowQuestionDetail(e){
+      this.currentAddAnswerData=e
+      this.isShowViewAnswer=true
+    },
+
+    async getRoadShowQuestionList(){
+      this.tableLoading=true
+      const res=await roadshowInterence.roadShowQuestionSummary({
+        PageSize:this.pageSize,
+        CurrentIndex:this.page_no,
+        StartDate:this.filterData.time?this.filterData.time[0]:'',
+        EndDate:this.filterData.time?this.filterData.time[1]:'',
+        ResearcherId:this.filterData.researcher?this.filterData.researcher.join(','):'',
+        Keyword:this.filterData.keyword,
+        CompanyIndustry:this.filterData.industry,
+        CompanyClassify:this.filterData.type
+      })
+      this.tableLoading=false
+
+      if(res.Ret===200){
+        this.tableData=res.Data.List||[]
+        this.total=res.Data.Paging.Totals 
+      }
+
+    },
+
+    handleCurrentChange(page){
+      this.page_no=page
+      this.getRoadShowQuestionList()
+    },
+
+    handleRemoveResearcherTag(e){
+      this.filterData.researcher=this.filterData.researcher.filter(i=>i!==e)
+      this.cascaderIdx++
+      if(this.filterData.researcher.length===0){
+        this.handleCurrentChange(1)
+      }
+    },
+
+    /* 获取客户信息 */
+    async getCompanyInfo(row) {
+      const { Data }  = await roadshowInterence.componyDetail({ 
+        CompanyId:row.CompanyId,
+        SellerId:row.SysUserId,
+        EnglishCompany:row.EnglishCompany
+      });
+      this.companyInfo = Data;
+    },
+
+    // 获取研究员列表
+    async getResearcherList() {
+      // 发送请求
+      const res = await roadshowInterence.getResearcherList();
+      if (res.Ret === 200) {
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
+      }
+    },
+    // 对获取到的研究员列表做处理
+    formatResearcherList(list) {
+      list.forEach((group) => {
+        // 对组做处理
+        group.label = group.GroupName;
+        // 如果有列表
+        group.ResearcherList &&
+          group.ResearcherList.forEach((item) => {
+            // 对研究员做处理
+            item.label = item.RealName;
+            item.value = {
+              ResearcherId: item.AdminId,
+              ResearcherName: item.RealName,
+            };
+          });
+      });
+      // 去掉ficc全体选项
+      return list.filter((group) => group.GroupName !== "ficc全体");
+    },
+
+  },
+} 
+</script>
+<style lang="scss">
+.company-tip-poper {
+	max-width: 400px;
+}
+</style>
+<style lang="scss" scoped>
+.roadshow-question-page{
+  background-color: #fff;
+  padding: 20px;
+}
+.page-type-box{
+  display: flex;
+  align-content: center;
+  gap: 0 30px;
+  font-size: 16px;
+  line-height: 2;
+  margin-bottom: 20px;
+  div{
+    cursor: pointer;
+  }
+  .item_active{
+    color: #409EFF;
+    border-bottom: 1px solid #409EFF;
+  }
+}
+.filter-wrap{
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 5px;
+
+}
+</style>

+ 2 - 1
src/views/roadshow_manage/roleConfig/myCalendarConfig.js

@@ -244,7 +244,8 @@ export const tableColums = (type) => {
 export const handleArr = (type) => {
 	if(type === 1 && sellerList.includes(localStorage.getItem('Role'))) return ['撤回']
 	if(type === 1 && ENUM_RESEARCHLIST.includes(localStorage.getItem('Role'))) return ['接受','拒绝']
-	if(type === 2 && sellerList.includes(localStorage.getItem('Role'))) return ['拒绝理由','修改重提','删除']
+	if(type === 2 && ENUM_RESEARCHLIST.includes(localStorage.getItem('Role'))) return ['填写客户问答','问答详情']
+	if(type === 2 && sellerList.includes(localStorage.getItem('Role'))) return ['拒绝理由','修改重提','删除','问答详情']
 	if([3,4,5].includes(type)) return ['修改','删除']
 
 	return []

+ 37 - 2
src/views/roadshow_manage/statistics/mixin.js

@@ -7,7 +7,7 @@ export default {
 			dataLoading: false,
 			default_tab: '周度统计表',
 			select_date: '',
-			staticTabs: [ '周度统计表','月度统计表','近1个月','近3个月','近6个月' ],
+			// staticTabs: [ '周度统计表','季度统计表','月度统计表','近1个月','近3个月','近6个月' ],
 			tableTheadColumns: this.$route.path === '/sellerStatisticSeller' 
 				? [
 					`本周(${this.getWeekOrMonthDate(0)})`,
@@ -29,11 +29,25 @@ export default {
 		}
 	},
 	computed:{
+		staticTabs(){
+			// 研究员路演统计增加季度统计表
+			if(this.$route.path === '/statisticResearcher') return [ '周度统计表','季度统计表','月度统计表','近1个月','近3个月','近6个月' ]
+
+			return [ '周度统计表','月度统计表','近1个月','近3个月','近6个月' ]
+		},
 		departmentTheadColumns(){
 			return this.departmentAct == 'ficc' ?  ['试用路演','正式路演','公开会议'] :  ['路演','沙龙']
 		}
 	},
 	methods: {
+		// 格式化表中的数字显示
+		formatTableValue(data){
+			// 如果有askNum 则表示要显示路演问答统计数据
+			if(data.askNum!==undefined){
+				return data.value !== 0 ? `${data.askNum||0}/${data.value||0}` : ''
+			}
+			return data.value !== 0 ? data.value : ''
+		},
 
 		/* 切换顶部tab */
 		changeTabHandle(tab,type) {
@@ -68,6 +82,13 @@ export default {
 								this.getWeekOrMonthDate(3,'month'),
 							];
 					break;
+				case '季度统计表':
+						this.tableTheadColumns= [
+							`本季度(${this.getWeekOrMonthDate(0,'quarter')})`,
+							`上一季度(${this.getWeekOrMonthDate(1,'quarter')})`,
+							`上两个季度(${this.getWeekOrMonthDate(2,'quarter')})`,
+						];
+						break;
 				default:
 					this.tableTheadColumns = this.departmentTheadColumns;
 					break;
@@ -90,6 +111,7 @@ export default {
 				{
 					key: '试用路演',
 					value: item.TryOutNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -97,6 +119,7 @@ export default {
 				{
 					key: '正式路演',
 					value: item.FormalNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -112,6 +135,7 @@ export default {
 				{
 					key: '路演',
 					value: item.RoadShowNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -154,6 +178,13 @@ export default {
 				this.select_date = '';
 			}
 		},
+		// 格式化季度为 "YYYY.MM-MM" 字符串
+		formatQuarter(quarter, year) {
+			const startMonth = (quarter - 1) * 3; // 季度起始月份(0-based)
+			const startStr = String(startMonth + 1).padStart(2, '0'); // 转换为两位月份
+			const endStr = String(startMonth + 3).padStart(2, '0'); // 结束月份(startMonth + 3,如0+3=3 → 4月,但需要显示为03)
+			return `${year}.${startStr}~${year}.${endStr}`;
+		},
 
 		/* 	获取几周前 周一周日日期 或前几月月份*/
 		getWeekOrMonthDate(weeknum,type='week') {
@@ -163,7 +194,11 @@ export default {
 	
 				// console.log(weekStart,weekEnd)
 				return `${weekStart}~${weekEnd}`;
-			} else {
+			}else if(type==='quarter'){
+				if(weeknum===0) return this.formatQuarter(this.$moment().quarter(),this.$moment().year())
+				const previousMoment = this.$moment().subtract(weeknum, 'quarters'); 
+				return this.formatQuarter(previousMoment.quarter(),previousMoment.year())
+			}else {
 				const month = this.$moment().subtract(weeknum,'M').format('YYYY.MM');
 				return month;
 			}

+ 35 - 5
src/views/roadshow_manage/statistics/researcher.vue

@@ -15,6 +15,17 @@
 			:clearable="false"
 			@change="dateChange"
 			placeholder="请选择统计时间"/>
+
+			<el-tooltip 
+				effect="dark" 
+				content="前面数字表示研究员已接受、已填写客户问答的路演,后面数字表示研究员已接受的路演" 
+				placement="top"
+			>
+				<i class="el-icon-info"></i>
+			</el-tooltip>
+			<a :href="exportExcel" download style="margin-left: auto;">
+				<el-button type="primary">导出excel</el-button>
+			</a>
 		</div>
 		<div class="table-cont" v-show="dataLoading" >
 			<div class="table-body-wrapper" ref="bodyRef">
@@ -22,9 +33,9 @@
 					<thead>
 						<tr>
 							<td rowspan="2" :class="['thead-rs']">组别</td>
-							<td rowspan="2" :class="['thead-rs']">销售</td>
+							<td rowspan="2" :class="['thead-rs']">研究员</td>
 							<td
-								:colspan="departmentAct == '权益' && ['周度统计表','月度统计表'].includes(default_tab) ? 2 : ['周度统计表','月度统计表'].includes(default_tab) ? 3 : 1"
+								:colspan="departmentAct == '权益' && ['周度统计表','季度统计表','月度统计表'].includes(default_tab) ? 2 : ['周度统计表','季度统计表','月度统计表'].includes(default_tab) ? 3 : 1"
 								v-for="item in tableTheadColumns" 
 								:key="item" 
 								class="head-column"
@@ -37,7 +48,7 @@
 								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
 							</template>
 						</tr>
-						<tr v-if="['周度统计表'].includes(default_tab)">
+						<tr v-if="['周度统计表','季度统计表'].includes(default_tab)">
 							<template v-for="(item,index) in new Array(3)">
 								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
 							</template>
@@ -57,7 +68,7 @@
 										:key="data_key" 
 										@click="openDiaHandle(data)"
 									>
-										{{ data.value !== 0 ? data.value : '' }}
+										{{ formatTableValue(data) }}
 									</td>
 
 								</tr>
@@ -95,6 +106,7 @@
 			:title="diaTitle"
 			:form="dialogForm"
 			fromType="researcher"
+			:hasQustion="['试用路演','正式路演','路演'].includes(dialogForm.key)"
 		/>
 
 	</div>
@@ -108,6 +120,23 @@ export default {
 	name:'',
 	mixins: [ mixin ],
 	components: { actiyityDetailDia },
+	computed:{
+		exportExcel(){
+			let baseUrl = process.env.API_ROOT + "/roadshow/report/researcher/export";
+			let token = localStorage.getItem("auth") || "";
+			let paramStr = "";
+			let obj = {
+				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month':this.default_tab === '季度统计表' ? 'quarter' : 'time_interval',
+				StartDate: this.select_date ? this.select_date[0] : '',
+				EndDate: this.select_date ? this.select_date[1] : '',
+				CompanyType:this.departmentAct
+			};
+			for (let key in obj) {
+				paramStr = `${paramStr}&${key}=${obj[key]}`;
+			}
+			return `${baseUrl}?${token}${paramStr}`;
+		}
+	},
 	data () {
 		return {
 		};
@@ -118,7 +147,7 @@ export default {
 		getTableData() {
 			this.dataLoading = false;
 			roadshowInterence.researcherStatistic({
-				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month' : 'time_interval',
+				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month':this.default_tab === '季度统计表' ? 'quarter' : 'time_interval',
 				StartDate: this.select_date ? this.select_date[0] : '',
 				EndDate: this.select_date ? this.select_date[1] : '',
 				CompanyType:this.departmentAct
@@ -148,6 +177,7 @@ export default {
 
 				const dynamic_width = {
 					'周度统计表': '9%',
+					'季度统计表': '9%',
 					'月度统计表': '7%',
 				}
 				this.$nextTick(() => {