瀏覽代碼

Merge branch 'master' into crm_16.8

bding 1 周之前
父節點
當前提交
27d853d5f7
共有 35 個文件被更改,包括 3151 次插入1026 次删除
  1. 1 1
      config/prod.test.env.js
  2. 13 1
      src/api/modules/crmApi.js
  3. 13 0
      src/api/modules/roadshowApi.js
  4. 421 403
      src/api/modules/statisticApi.js
  5. 二進制
      src/assets/img/icons/black_tip.png
  6. 5 0
      src/routes/modules/roadShowRoutes.js
  7. 6 0
      src/routes/modules/statisticRoutes.js
  8. 58 0
      src/views/custom_manage/contacts/compontents/addLabelDlg.vue
  9. 135 83
      src/views/custom_manage/contacts/compontents/contactsColums.js
  10. 53 96
      src/views/custom_manage/contacts/compontents/interactionDlg.vue
  11. 96 25
      src/views/custom_manage/contacts/compontents/labelDlg.vue
  12. 116 45
      src/views/custom_manage/contacts/contactsList.vue
  13. 1 1
      src/views/custom_manage/customList/addCustom.vue
  14. 23 1
      src/views/custom_manage/customList/customDetail.vue
  15. 1 1
      src/views/custom_manage/customList/customList.vue
  16. 1 1
      src/views/custom_manage/customList/customShareList.vue
  17. 6 2
      src/views/custom_manage/customList/pickCustom.vue
  18. 122 0
      src/views/dataReport_manage/components/DataSummary.vue
  19. 151 24
      src/views/dataReport_manage/configdata.js
  20. 328 0
      src/views/dataReport_manage/equityDataSummary.vue
  21. 34 0
      src/views/ficc_manage/chapterVariety.vue
  22. 41 1
      src/views/ficc_manage/reportVariety.vue
  23. 5 4
      src/views/rai_manage/activityManage/activityManage.vue
  24. 1 1
      src/views/rai_manage/components/addChoiceness.vue
  25. 2 3
      src/views/rai_manage/cygxManage/components/lableDlg.vue
  26. 110 12
      src/views/roadshow_manage/compononts/activityDetailDia.vue
  27. 290 0
      src/views/roadshow_manage/compononts/addAnswer.vue
  28. 180 0
      src/views/roadshow_manage/compononts/viewAnswer.vue
  29. 319 184
      src/views/roadshow_manage/myCalendar.vue
  30. 397 0
      src/views/roadshow_manage/roadshowQuestion.vue
  31. 2 1
      src/views/roadshow_manage/roleConfig/myCalendarConfig.js
  32. 21 0
      src/views/roadshow_manage/statistics/index.scss
  33. 73 9
      src/views/roadshow_manage/statistics/mixin.js
  34. 102 75
      src/views/roadshow_manage/statistics/researcher.vue
  35. 24 52
      src/views/roadshow_manage/statistics/seller.vue

+ 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 - 1
src/api/modules/crmApi.js

@@ -1144,7 +1144,7 @@ const equityContacts = {
   },
   //用户相关互动接口
   getInteractionRelevant: (params) => {
-    return http.get("/cygx/user/interaction/relevant", params);
+    return http.get("/cygx/use_rai_label/detail", params);
   },
   //机构状态搜索栏互助
   getInteractionNum: (params) => {
@@ -1182,6 +1182,18 @@ const equityContacts = {
   userFeedbackDel:(params)=>{
     return http.post("/cygx/user_feedback/del",params)
   }, 
+  // 删除销售输入标签接口
+  userRaiLabelDel:(params)=>{
+    return http.post("/cygx/use_rai_label/delte",params)
+  }, 
+  // 销售输入标签接口
+  userRaiLabelAdd:(params)=>{
+    return http.post("/cygx/use_rai_label/add",params)
+  }, 
+  // 获取标签详情接口
+  getLabelList:(params)=>{
+    return http.get("/cygx/use_rai_label/list",params)
+  }, 
 };
 
 /*

+ 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 {

+ 421 - 403
src/api/modules/statisticApi.js

@@ -1,395 +1,394 @@
-import http from "@/api/http.js"
-
+import http from "@/api/http.js";
 
 /* 数据报表模块 */
 const dataMainInterface = {
-	/* 工作台 */
-	workdata: params => {
-		return http.get('/statistic_report/home')
-	},
-	/**
-	 * 获取即将过期的客户列表接口
-	 * @param {PageSize } params 
-	 * @param {CurrentIndex } params 
-	 * @param {EndDate } params 结束日期
-	 * @param {CompanyType} params 
-	 * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-	 * @param {RegionType } params 
-	 * @returns 
-	 */
-	expireList:params => {
-		return http.get('/statistic_report/will_expire_list',params);
-	},
-	/**
-	 * 获取存量客户列表接口
-	 * @param {PageSize } params 
-	 * @param {CurrentIndex } params 
-	 * @param {CompanyType} params 
-	 * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-	 * @param {RegionType } params 
-	 * @param {Date} params 
-	 * @param {DataType} params 
-	 * @returns 
-	 */
-	stackList:params => {
-		return http.get('/statistic_report/stack_company_list',params);
-	},
-	raiStackList:params => {
-		return http.get('/statistic_report/stack_company_list_rai',params);
-	},
-	/**
-	 * 获取增量客户列表接口
-	 * @param {PageSize} params 
-	 * @param {CurrentIndex} params 
-	 * @param {EndDate} params 结束日期
-	 * @param {CompanyType} params 
-	 * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-	 * @param {RegionType } params 
-	 * @param {StartDate} params 
-	 * @param {DataType} params 
-	 * @param {IsConfirm} params  是否确认续约: -1-默认全部; 0-待确认; 1-已确认
-	 * @param {CompanyAscribeId} params  归因Id
-	 * @returns  
-	 */
-	incrementalList:params => {
-		return http.get('/statistic_report/incremental_company_list',params);
-	},
-	/**
-	 * 权益客户统计列表接口
-	 * @param {PageSize} params 
-	 * @param {CurrentIndex} params 
-	 * @param {EndDate} params 结束日期
-	 * @param {CompanyType} params 
-	 * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-	 * @param {RegionType } params 
-	 * @param {StartDate} params 
-	 * @param {DataType} params 
-	 * @param {IsConfirm} params  是否确认续约: -1-默认全部; 0-待确认; 1-已确认
-	 * @param {CompanyAscribeId} params  归因Id
-	 * @returns  
-	 */
-	incrementalEquityList:params => {
-		return http.get('/statistic_report/merge_company_list',params);
-	},
-	/**
- * 获取未续约备注列表
- * @param {CompanyId} params 公司ID
- * @param {ProductId} params 产品ID 1:FICC ,2权益
- * @returns 
- */
-	getNotRenewedRemarkList:params => {
-		return http.get('/custom/company_no_renewed_note/list',params);
-	},
-	/**
- * 添加未续约备注
- * @param {CompanyId} params 公司ID
- * @param {ProductId} params 产品ID 1:FICC ,2权益
- * @param {Content} params 内容
- * @returns 
- */
-	addNotRenewedRemark:params => {
-		return http.post('/custom/company_no_renewed_note/add',params);
-	},
-	/**
- * 获取归因列表
- * @param {KeyWord} params 
- * @returns  
- */
-	getAscribList:params => {
-		return http.get('/custom/company_ascribe/list',params);
-	},
-	/**
-	 * 新增归因
-	 * @param {KeyWord} params 
-	 * @returns  
-	*/
-	addAscrib:params => {
-		return http.post('/custom/company_ascribe/add',params);
-	},
-	/**
-	 * 合同通过归因添加确认不续约接口
-	 * @param {KeyWord} params 
-	 * @returns  
-	*/
-	addAscribContract:params => {
-		return http.post('/custom/company_contract_no_renewed_ascribe/add',params);
-	},
-	/**
-	 * 修改归因标签
-	* @param {CompanyId} params 公司ID
-	* @param {ProductId} params 产品ID 1:FICC ,2权益
-	* @param {Content} params 内容
-	* @param {CompanyAscribeId} params 归因Id
-	 * @returns  
-	*/
-	addNoRenewedAscribe:params => {
-		return http.post('/custom/company_no_renewed_ascribe/add',params);
-	},
-	/**
-	 * 归因标签详情
-	* @param {CompanyId} params 公司ID
-	* @param {ProductId} params 产品ID 1:FICC ,2权益
-	 * @returns  
-	*/
-	infoNoRenewedAscribe:params => {
-		return http.get('/custom/company_no_renewed_ascribe/detail',params);
-	},
-	/**
-	 * 合同确认归因不续约详情接口
-	* @param {CompanyContractId} params 合同ID
-	 * @returns  
-	*/
-	contractInfoNoRenewedAscribe:params => {
-		return http.get('/custom/company_contract_no_renewed_ascribe/detail',params);
-	},
-	/**
-	 * 获取收入统计列表接口
-	 * @param {PageSize} params 
-	 * @param {CurrentIndex} params 
-	 * @param {EndDate} params 结束日期
-	 * @param {CompanyType} params 
-	 * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-	 * @param {RegionType } params
-	 * @returns 
-	 */
-	incomeList:params => {
-		return http.get('/statistic_report/income_list',params);
-	},
-	/**
-	 * 获取合同数据报表接口
-	 * @param {PageSize} params 
-	 * @param {CurrentIndex} params 
-	 * @param {EndDate} params 结束日期
-	 * @param {CompanyType} params 
-	 * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-	 * @param {RegionType } params
-	 * @returns 
-	 */
-	contractList:params => {
-		return http.get('/statistic_report/contract_list',params);
-	},
-	/**
-	 * 获取企业客户的合同数据报表接口
-	 * @param {CompanyId  } params
-	 * @returns 
-	 */
-	companyContractList:params => {
-		return http.get('/statistic_report/company_contract_list',params);
-	},
-	// 系统合同类调此接口
-	companyContractDetailList:params => {
-		return http.get('/statistic_report/contract_detail_list',params);
-	},
+  /* 工作台 */
+  workdata: (params) => {
+    return http.get("/statistic_report/home");
+  },
+  /**
+   * 获取即将过期的客户列表接口
+   * @param {PageSize } params
+   * @param {CurrentIndex } params
+   * @param {EndDate } params 结束日期
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @returns
+   */
+  expireList: (params) => {
+    return http.get("/statistic_report/will_expire_list", params);
+  },
+  /**
+   * 获取存量客户列表接口
+   * @param {PageSize } params
+   * @param {CurrentIndex } params
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @param {Date} params
+   * @param {DataType} params
+   * @returns
+   */
+  stackList: (params) => {
+    return http.get("/statistic_report/stack_company_list", params);
+  },
+  raiStackList: (params) => {
+    return http.get("/statistic_report/stack_company_list_rai", params);
+  },
+  /**
+   * 获取增量客户列表接口
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {EndDate} params 结束日期
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @param {StartDate} params
+   * @param {DataType} params
+   * @param {IsConfirm} params  是否确认续约: -1-默认全部; 0-待确认; 1-已确认
+   * @param {CompanyAscribeId} params  归因Id
+   * @returns
+   */
+  incrementalList: (params) => {
+    return http.get("/statistic_report/incremental_company_list", params);
+  },
+  /**
+   * 权益客户统计列表接口
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {EndDate} params 结束日期
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @param {StartDate} params
+   * @param {DataType} params
+   * @param {IsConfirm} params  是否确认续约: -1-默认全部; 0-待确认; 1-已确认
+   * @param {CompanyAscribeId} params  归因Id
+   * @returns
+   */
+  incrementalEquityList: (params) => {
+    return http.get("/statistic_report/merge_company_list", params);
+  },
+  /**
+   * 获取未续约备注列表
+   * @param {CompanyId} params 公司ID
+   * @param {ProductId} params 产品ID 1:FICC ,2权益
+   * @returns
+   */
+  getNotRenewedRemarkList: (params) => {
+    return http.get("/custom/company_no_renewed_note/list", params);
+  },
+  /**
+   * 添加未续约备注
+   * @param {CompanyId} params 公司ID
+   * @param {ProductId} params 产品ID 1:FICC ,2权益
+   * @param {Content} params 内容
+   * @returns
+   */
+  addNotRenewedRemark: (params) => {
+    return http.post("/custom/company_no_renewed_note/add", params);
+  },
+  /**
+   * 获取归因列表
+   * @param {KeyWord} params
+   * @returns
+   */
+  getAscribList: (params) => {
+    return http.get("/custom/company_ascribe/list", params);
+  },
+  /**
+   * 新增归因
+   * @param {KeyWord} params
+   * @returns
+   */
+  addAscrib: (params) => {
+    return http.post("/custom/company_ascribe/add", params);
+  },
+  /**
+   * 合同通过归因添加确认不续约接口
+   * @param {KeyWord} params
+   * @returns
+   */
+  addAscribContract: (params) => {
+    return http.post("/custom/company_contract_no_renewed_ascribe/add", params);
+  },
+  /**
+   * 修改归因标签
+   * @param {CompanyId} params 公司ID
+   * @param {ProductId} params 产品ID 1:FICC ,2权益
+   * @param {Content} params 内容
+   * @param {CompanyAscribeId} params 归因Id
+   * @returns
+   */
+  addNoRenewedAscribe: (params) => {
+    return http.post("/custom/company_no_renewed_ascribe/add", params);
+  },
+  /**
+   * 归因标签详情
+   * @param {CompanyId} params 公司ID
+   * @param {ProductId} params 产品ID 1:FICC ,2权益
+   * @returns
+   */
+  infoNoRenewedAscribe: (params) => {
+    return http.get("/custom/company_no_renewed_ascribe/detail", params);
+  },
+  /**
+   * 合同确认归因不续约详情接口
+   * @param {CompanyContractId} params 合同ID
+   * @returns
+   */
+  contractInfoNoRenewedAscribe: (params) => {
+    return http.get("/custom/company_contract_no_renewed_ascribe/detail", params);
+  },
+  /**
+   * 获取收入统计列表接口
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {EndDate} params 结束日期
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @returns
+   */
+  incomeList: (params) => {
+    return http.get("/statistic_report/income_list", params);
+  },
+  /**
+   * 获取合同数据报表接口
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {EndDate} params 结束日期
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @returns
+   */
+  contractList: (params) => {
+    return http.get("/statistic_report/contract_list", params);
+  },
+  /**
+   * 获取企业客户的合同数据报表接口
+   * @param {CompanyId  } params
+   * @returns
+   */
+  companyContractList: (params) => {
+    return http.get("/statistic_report/company_contract_list", params);
+  },
+  // 系统合同类调此接口
+  companyContractDetailList: (params) => {
+    return http.get("/statistic_report/contract_detail_list", params);
+  },
 
-	// 客户数据未续约说明更多
-	moreRenewReason:params => {
-		return http.get('/statistic_report/more_renew_reason',params);
-	},
-	// 客户数据未续约说明更多
-	mergeCompanyPreviousDetail:params => {
-		return http.get('/statistic_report/merge_company_previous/detail',params);
-	},
-	// 客户数据未续约说明更多上一年
-	mergeCompanyPreviousDetailYear:params => {
-		return http.get('/statistic_report/merge_company_previous/last_year',params);
-	},
-	/**
-	 * 	// 获取图表阅读统计列表
-	 * @param {PageSize} params 
-	 * @param {CurrentIndex} params 
-	 * @param {ClassifyId} params 分类ID
-	 * @param {Order} params 排序
-	 * @returns 
-	 */
-	getchartCensusList:params => {
-		return http.get('/yb/chartCensus/getVisitList',params);
-	},
-	/**
-	 * 	// 图表阅读统计详情列表
-	 * @param {PageSize} params 
-	 * @param {CurrentIndex} params 
-	 * @param {ClassifyId} params 分类ID
-	 * @param {Order} params 排序
-	 * @returns 
-	 */
-	 getchartgetVisitDetailList:params => {
-	   return http.get('yb/chartCensus/getVisitDetailList',params);
-	 },
-	 /**
-	 * 	// 用户图表访问明细
-	 * @returns 
-	 */
-	  getCompanyChartVisitDetail:params => {
-		return http.get('yb/chartCensus/getCompanyChartVisitDetail',params);
-	  },
-	 /**
-	 * 	// 图库权限开通客户统计列表
-	 * @returns 
-	 */
-	 getCompanyAuthCensusList:params => {
-		return http.get('yb/chartCensus/getCompanyAuthCensusList',params);
-	  },
-	  
-	/**新增客户统计 
-	 * StartDate EndDate DataType
-	 * @return 
-	 */
-	newcustomStatistic: params => {
-		return http.get('/statistic_report/report/incremental_company',params)
-	},
-	/**
-	 * 存量客户统计
-	 * Date
-	 * @return
-	 */
-	stockcustomStatistic: params => {
-		return http.get('/statistic_report/report/stack_company',params)
-	},
-	/**续约客户统计 
-	 * StartDate 统计开始时间
-	 * EndDate 统计结束时间
-	 * DataType 统计范围类型
-	 * ProductId 项目类型 1 ficc  2 权益
-	 * @return 
-	 */
-	 renewalCustomStatistic: params => {
-		return http.get('/statistic_report/report/renew_company',params)
-	},
+  // 客户数据未续约说明更多
+  moreRenewReason: (params) => {
+    return http.get("/statistic_report/more_renew_reason", params);
+  },
+  // 客户数据未续约说明更多
+  mergeCompanyPreviousDetail: (params) => {
+    return http.get("/statistic_report/merge_company_previous/detail", params);
+  },
+  // 客户数据未续约说明更多上一年
+  mergeCompanyPreviousDetailYear: (params) => {
+    return http.get("/statistic_report/merge_company_previous/last_year", params);
+  },
+  /**
+   * 	// 获取图表阅读统计列表
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {ClassifyId} params 分类ID
+   * @param {Order} params 排序
+   * @returns
+   */
+  getchartCensusList: (params) => {
+    return http.get("/yb/chartCensus/getVisitList", params);
+  },
+  /**
+   * 	// 图表阅读统计详情列表
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {ClassifyId} params 分类ID
+   * @param {Order} params 排序
+   * @returns
+   */
+  getchartgetVisitDetailList: (params) => {
+    return http.get("yb/chartCensus/getVisitDetailList", params);
+  },
+  /**
+   * 	// 用户图表访问明细
+   * @returns
+   */
+  getCompanyChartVisitDetail: (params) => {
+    return http.get("yb/chartCensus/getCompanyChartVisitDetail", params);
+  },
+  /**
+   * 	// 图库权限开通客户统计列表
+   * @returns
+   */
+  getCompanyAuthCensusList: (params) => {
+    return http.get("yb/chartCensus/getCompanyAuthCensusList", params);
+  },
+
+  /**新增客户统计
+   * StartDate EndDate DataType
+   * @return
+   */
+  newcustomStatistic: (params) => {
+    return http.get("/statistic_report/report/incremental_company", params);
+  },
+  /**
+   * 存量客户统计
+   * Date
+   * @return
+   */
+  stockcustomStatistic: (params) => {
+    return http.get("/statistic_report/report/stack_company", params);
+  },
+  /**续约客户统计
+   * StartDate 统计开始时间
+   * EndDate 统计结束时间
+   * DataType 统计范围类型
+   * ProductId 项目类型 1 ficc  2 权益
+   * @return
+   */
+  renewalCustomStatistic: (params) => {
+    return http.get("/statistic_report/report/renew_company", params);
+  },
 
-	// 续约异常客户统计
-	unusualRenewalCustomStatistic: params => {
-		return http.get('/statistic_report/report/unusual_renew_company',params)
-	},
-	//续约异常客户统计图表数据
-	unusualRenewalCustomStatisticChartData:params=>{
-		return http.get('/statistic_report/report/unusual_renew_company/chart',params)
-	},
+  // 续约异常客户统计
+  unusualRenewalCustomStatistic: (params) => {
+    return http.get("/statistic_report/report/unusual_renew_company", params);
+  },
+  //续约异常客户统计图表数据
+  unusualRenewalCustomStatisticChartData: (params) => {
+    return http.get("/statistic_report/report/unusual_renew_company/chart", params);
+  },
 
-	/**
-	 * 新增客户列表
-	 * @param {} params PageSize CurrentIndex SortParam SortType 	CompanyIds
-	 * @return
-	 */
-	newcustomList: params => {
-		return http.post('/statistic_report/report/company_list',params)
-	},
-	/**
-	 * 销售To do统计
-	 * DataType ProductId StartDate EndDate
-	 * @return
-	 */
-	 todoStatistic: params => {
-		return http.get('/statistic_report/report/seller_company_todo',params)
-	},
+  /**
+   * 新增客户列表
+   * @param {} params PageSize CurrentIndex SortParam SortType 	CompanyIds
+   * @return
+   */
+  newcustomList: (params) => {
+    return http.post("/statistic_report/report/company_list", params);
+  },
+  /**
+   * 销售To do统计
+   * DataType ProductId StartDate EndDate
+   * @return
+   */
+  todoStatistic: (params) => {
+    return http.get("/statistic_report/report/seller_company_todo", params);
+  },
 
-	/**
-	 * 语音播报统计
-	 * @param SectionId	板块id
-	 * @param VarietyId 品种id
-	 * @param AdminId  语音管理员id
-	 * @param ClickSort 排序 1升序 2降序
-	 * @param Title 搜索关键词
-	 */
-	voicePlayStatistic:params=>{
-		return http.get('/yb/voice/broadcast/list',params)
-	},
+  /**
+   * 语音播报统计
+   * @param SectionId	板块id
+   * @param VarietyId 品种id
+   * @param AdminId  语音管理员id
+   * @param ClickSort 排序 1升序 2降序
+   * @param Title 搜索关键词
+   */
+  voicePlayStatistic: (params) => {
+    return http.get("/yb/voice/broadcast/list", params);
+  },
 
-	/**
-	 * 语音播报详情
-	 * @param BroadcastId
-	 */
-	voicePlayDetailSta:params=>{
-		return http.get('/yb/voice/broadcast/deatil',params)
-	},
+  /**
+   * 语音播报详情
+   * @param BroadcastId
+   */
+  voicePlayDetailSta: (params) => {
+    return http.get("/yb/voice/broadcast/deatil", params);
+  },
 
-	/**
-	 * 价格驱动点击量-列表
-	 */
-	priceDrivenStatisticsList:params=>{
-		return http.get('/yb/price_driven/click_census_list',params)
-	},
-	/**
-	 * 价格驱动点击量-详情
-	 */
-	 priceDrivenStatisticsDetail:params=>{
-		return http.get('/yb/price_driven/click_census_detail',params)
-	},
+  /**
+   * 价格驱动点击量-列表
+   */
+  priceDrivenStatisticsList: (params) => {
+    return http.get("/yb/price_driven/click_census_list", params);
+  },
+  /**
+   * 价格驱动点击量-详情
+   */
+  priceDrivenStatisticsDetail: (params) => {
+    return http.get("/yb/price_driven/click_census_detail", params);
+  },
 
-	//ficc产品阅读统计
-	ficcProductStatistic:params=>{
-		return http.get('/statistic_report/report/seller_yb_log',params)
-	},
+  //ficc产品阅读统计
+  ficcProductStatistic: (params) => {
+    return http.get("/statistic_report/report/seller_yb_log", params);
+  },
 
-	/**
-	 * 分产品阅读客户统计-- 新增客户列表
-	 * @param {} params PageSize CurrentIndex SortParam SortType SellerIds ProductId ProductType StartDate EndDate CompanyStatus
-	 * @return
-	*/
-		newCustomProductionList: params => {
-		return http.post('/statistic_report/report/seller_yb_log/user',params)
-	},
+  /**
+   * 分产品阅读客户统计-- 新增客户列表
+   * @param {} params PageSize CurrentIndex SortParam SortType SellerIds ProductId ProductType StartDate EndDate CompanyStatus
+   * @return
+   */
+  newCustomProductionList: (params) => {
+    return http.post("/statistic_report/report/seller_yb_log/user", params);
+  },
 
   /**
    * 分产品阅读统计 -- 收藏统计
    * @param Datatype
    */
-  collectStatistic:params=>{
-    return http.get('/statistic_report/report/seller_collect_log',params)
+  collectStatistic: (params) => {
+    return http.get("/statistic_report/report/seller_collect_log", params);
   },
 
   /**
    * 分产品阅读统计 -- 收藏统计用户详情
    * @param Datatype
    */
-   collectStatisticList:params=>{
-    return http.post('/statistic_report/report/seller_collect_log/user',params)
+  collectStatisticList: (params) => {
+    return http.post("/statistic_report/report/seller_collect_log/user", params);
   },
 
   /**
    * 分产品阅读统计 -- 收藏详情详情
    * @param CollectionType
    */
-   collectDetailList:params=>{
-    return http.post('/statistic_report/report/seller_collect_log/detail',params)
+  collectDetailList: (params) => {
+    return http.post("/statistic_report/report/seller_collect_log/detail", params);
   },
-   /**
+  /**
    * 分产品阅读统计 -- 图收藏统计
    * @param Datatype
    */
-    chartStatistic:params=>{
-      return http.get('/statistic_report/report/seller_chart_collect_log',params)
-    },
+  chartStatistic: (params) => {
+    return http.get("/statistic_report/report/seller_chart_collect_log", params);
+  },
   /**
    * 分产品阅读统计 -- 图收藏统计用户详情
    * @param Datatype
    */
-  chartStatisticList:params=>{
-    return http.post('/statistic_report/report/seller_chart_collect_log/user',params)
+  chartStatisticList: (params) => {
+    return http.post("/statistic_report/report/seller_chart_collect_log/user", params);
   },
   /**
    * 分产品阅读统计 -- 图收藏详情列表
    * @param CollectionType
    */
-   chartDetailList:params=>{
-    return http.post('/statistic_report/report/seller_chart_collect_log/detail',params)
+  chartDetailList: (params) => {
+    return http.post("/statistic_report/report/seller_chart_collect_log/detail", params);
+  },
+  /**
+   * 权益客户统计列表接口
+   * @param {PageSize} params
+   * @param {CurrentIndex} params
+   * @param {EndDate} params 结束日期
+   * @param {CompanyType} params
+   * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
+   * @param {RegionType } params
+   * @param {StartDate} params
+   * @param {DataType} params
+   * @param {IsConfirm} params  是否确认续约: -1-默认全部; 0-待确认; 1-已确认
+   * @param {CompanyAscribeId} params  归因Id
+   * @returns
+   */
+  incrementalCompanyContractPermissionList: (params) => {
+    return http.get("/statistic_report/merge_company/company_contract_permission/list", params);
   },
- /**
-  * 权益客户统计列表接口
-  * @param {PageSize} params 
-  * @param {CurrentIndex} params 
-  * @param {EndDate} params 结束日期
-  * @param {CompanyType} params 
-  * @param {AdminId } params 销售id,多个用英文逗号隔开,空字符串为全部
-  * @param {RegionType } params 
-  * @param {StartDate} params 
-  * @param {DataType} params 
-  * @param {IsConfirm} params  是否确认续约: -1-默认全部; 0-待确认; 1-已确认
-  * @param {CompanyAscribeId} params  归因Id
-  * @returns  
-  */
- incrementalCompanyContractPermissionList:params => {
- 	return http.get('/statistic_report/merge_company/company_contract_permission/list',params);
- },
   /**
   * 权益客户续约率统计
   * @param {PageSize} params 
@@ -401,77 +400,96 @@ const dataMainInterface = {
 
   * @returns  
   */
-  incrementalCompanyContractPercentageList:params => {
-	return http.get('/statistic_report/merge_company/company_contract_percentage/list',params);
+  incrementalCompanyContractPercentageList: (params) => {
+    return http.get("/statistic_report/merge_company/company_contract_percentage/list", params);
   },
-  incrementalCompanyContractPercentageListV2:params => {
-	return http.get('/statistic_report/merge_company/company_contract_percentage/listV2',params);
+  incrementalCompanyContractPercentageListV2: (params) => {
+    return http.get("/statistic_report/merge_company/company_contract_percentage/listV2", params);
   },
   /**
-  * 权益客户续约率统计所能查询的年份
-  * @returns  
-  */
-  incrementalCompanyContractGetYearList:params => {
-	return http.get('/statistic_report/merge_company/get_year_list',params);
+   * 权益客户续约率统计所能查询的年份
+   * @returns
+   */
+  incrementalCompanyContractGetYearList: (params) => {
+    return http.get("/statistic_report/merge_company/get_year_list", params);
   },
   /**
-  * 权益服务统计列表接口
-  * @returns  
-  */
-  getRaiServeList:params => {
-	return http.get('/cygx/rai_serve/list',params);
+   * 权益服务统计列表接口
+   * @returns
+   */
+  getRaiServeList: (params) => {
+    return http.get("/cygx/rai_serve/list", params);
   },
   /**
-  * 标签搜索接口
-  * @returns  
-  */
-  getRaiServeSearchTag:params => {
-	return http.get('/cygx/rai_serve/search_tag',params);
+   * 标签搜索接口
+   * @returns
+   */
+  getRaiServeSearchTag: (params) => {
+    return http.get("/cygx/rai_serve/search_tag", params);
   },
   /**
-  * 近四周覆盖率
-  * @returns  
-  */
-  getRaiServeCoverageRate:params => {
-	return http.get('/cygx/rai_serve/coverage_rate',params);
+   * 近四周覆盖率
+   * @returns
+   */
+  getRaiServeCoverageRate: (params) => {
+    return http.get("/cygx/rai_serve/coverage_rate", params);
   },
   /**
-  * 明细列表接口
-  * @returns  
-  */
-  getRaiServeBillList:params => {
-	return http.get('/cygx/rai_serve/bill_list',params);
+   * 明细列表接口
+   * @returns
+   */
+  getRaiServeBillList: (params) => {
+    return http.get("/cygx/rai_serve/bill_list", params);
   },
   /**
-  * 服务类型列表接口
-  * @returns  
-  */
-  getRaiServeTypeList:params => {
-	return http.get('/cygx/rai_serve/type_list',params);
+   * 服务类型列表接口
+   * @returns
+   */
+  getRaiServeTypeList: (params) => {
+    return http.get("/cygx/rai_serve/type_list", params);
   },
   /**
-  * 获取权益服务组销售列表
-  * @returns  
-  */
-  getRaiServeCustomSellerList:params => {
-	return http.get('/custom/seller/rai_serve/list',params);
+   * 获取权益服务组销售列表
+   * @returns
+   */
+  getRaiServeCustomSellerList: (params) => {
+    return http.get("/custom/seller/rai_serve/list", params);
   },
   /**
-  * 历史备注列表
-  * @returns  
-  */
-  getRaiServeRemarkList:params => {
-	return http.get('/cygx/rai_serve/remark/list',params);
+   * 历史备注列表
+   * @returns
+   */
+  getRaiServeRemarkList: (params) => {
+    return http.get("/cygx/rai_serve/remark/list", params);
   },
   /**
-  * 新增历史备注
-  * @returns  
-  */
-  getRaiServeRemarkAdd:params => {
-	return http.post('/cygx/rai_serve/remark/add',params);
+   * 新增历史备注
+   * @returns
+   */
+  getRaiServeRemarkAdd: (params) => {
+    return http.post("/cygx/rai_serve/remark/add", params);
+  },
+  /**
+   * 权益数据汇总列表接口
+   * @returns
+   */
+  getRaiDataSummary: (params) => {
+    return http.get("/statistic_report/rai_data_summary/list", params);
+  },
+  /**
+   * 获取权益开拓组或者服务组下面的销售接口
+   * @returns
+   */
+  getListRaiSellerServer: (params) => {
+    return http.get("/custom/seller/check/list_rai/server_type", params);
+  },
+  /**
+   * 获取权益弹窗详情接口
+   * @returns
+   */
+  getRaiDataSummaryList: (params) => {
+    return http.get("/statistic_report/rai_data_summary/detail", params);
   },
-}
+};
 
-export {
-	dataMainInterface
-}
+export { dataMainInterface };

二進制
src/assets/img/icons/black_tip.png


+ 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')
+			},
 		]
 	},
 ]

+ 6 - 0
src/routes/modules/statisticRoutes.js

@@ -133,6 +133,12 @@ export default [
 				name: '权益服务统计',
 				hidden: false
 			},
+			{
+				path: 'equityDataSummary',
+				component: () => import('@/views/dataReport_manage/equityDataSummary.vue'),
+				name: '权益数据汇总',
+				hidden: false
+			},
 		]
 	},
 ]

+ 58 - 0
src/views/custom_manage/contacts/compontents/addLabelDlg.vue

@@ -0,0 +1,58 @@
+<template>
+  <div class="container-feedbackDlg">
+    <el-dialog v-dialogDrag :visible.sync="addIsShow" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center title="添加标签" width="500px">
+      <el-input style="width: 100%" type="text" placeholder="请输入标签名称" v-model="lableText"> </el-input>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="cancelHandle">取 消</el-button>
+        <el-button type="primary" @click="remindBtnHandler">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { equityContacts } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {
+    addIsShow: {
+      type: Boolean,
+      default: false,
+    },
+    interactionFrom: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      lableText: "",
+    };
+  },
+  computed: {},
+
+  methods: {
+    // 弹框关闭的事件
+    cancelHandle() {
+      this.$emit("update:addIsShow", false);
+      this.lableText = "";
+    },
+    // 确认事件
+    async remindBtnHandler() {
+      if (!this.lableText) return;
+      const res = await equityContacts.userRaiLabelAdd({
+        Label: this.lableText,
+        UserId: this.interactionFrom.UserId,
+      });
+      if (res.Ret === 200) {
+        this.cancelHandle();
+        this.$emit("updateList");
+        this.$message.success("添加成功!");
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss"></style>

+ 135 - 83
src/views/custom_manage/contacts/compontents/contactsColums.js

@@ -375,90 +375,142 @@ export const tableColums = (type) => {
 };
 
 //表格列
-export const interactionColums = [
-  {
-    title: "报告阅读",
-    tableName: "List1",
-    table: [
-      {
-        label: "报告标题",
-        key: "Title",
-        minwidthsty: 140,
-      },
-      {
-        label: "阅读时间",
-        key: "CreateTime",
-      },
-      {
-        label: "阅读时长",
-        key: "StopTime",
-        widthsty: 80,
-      },
-    ],
-  },
-  {
-    title: "报告收藏",
-    tableName: "List2",
-    table: [
-      {
-        label: "报告标题",
-        key: "Title",
-        minwidthsty: 140,
-      },
-      {
-        label: "收藏时间",
-        key: "CreateTime",
-      },
-    ],
-  },
-  {
-    tableName: "List3",
-    title: "活动互动",
-    table: [
-      {
-        label: "活动名称",
-        key: "ActivityName",
-        minwidthsty: 140,
-      },
-      {
-        label: "活动形式",
-        key: "ActivityType",
-      },
-      {
-        label: "活动时间",
-        key: "ActivityTime",
-      },
-      {
-        label: "参会总时长",
-        key: "Duration",
-      },
-    ],
-  },
-  {
-    tableName: "List4",
-    title: "专项调研",
-    table: [
-      {
-        label: "调研主题",
-        key: "ActivityName",
-        minwidthsty: 140,
-      },
-      {
-        label: "行业",
-        key: "PermissionName",
-      },
-      {
-        label: "活动时间",
-        key: "ActivityTime",
-      },
-      {
-        label: "调研形式",
-        key: "ActivityType",
-      },
-    ],
-  },
-];
+export const interactionColums = (type) => {
+  return type === 1
+    ? [
+        {
+          label: "关键字",
+          key: "Label",
+        },
+        {
+          label: "搜索时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 2
+    ? [
+        {
+          label: "活动名称",
+          key: "ActivityName",
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypeName",
+        },
+        {
+          label: "活动时间",
+          key: "ActivityTime",
+        },
+        {
+          label: "参会时长",
+          key: "Duration",
+        },
+        {
+          label: "活动标签",
+          key: "Label",
+        },
+      ]
+    : type === 4
+    ? [
+        {
+          label: "活动名称",
+          key: "ActivityName",
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypeName",
+        },
+        {
+          label: "活动时间",
+          key: "ActivityTime",
+        },
+
+        {
+          label: "活动标签",
+          key: "Label",
+        },
+      ]
+    : type === 3 || type === 5
+    ? [
+        {
+          label: "研究员",
+          key: "ResearcherName",
+        },
+        {
+          label: "路演时间",
+          key: "RoadShowTime",
+        },
+        {
+          label: "路演主题",
+          key: "Theme",
+        },
 
+        {
+          label: "主题标签",
+          key: "Label",
+        },
+      ]
+    : type === 6
+    ? [
+        {
+          label: "输入关键字",
+          key: "Label",
+        },
+        {
+          label: "创建人",
+          key: "SysUserRealName",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 9
+    ? [
+        {
+          label: "音视频名称",
+          key: "Title",
+        },
+        {
+          label: "活动时间",
+          key: "ActivityTime",
+        },
+        {
+          label: "活动标签",
+          key: "Label",
+        },
+        {
+          label: "查看时间",
+          key: "CreateTime",
+        },
+      ]
+    : [
+        {
+          label: "报告标题",
+          key: "Title",
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+        },
+        {
+          label: "阅读时间",
+          key: "CreateTime",
+        },
+        {
+          label: "阅读来源",
+          key: "SourceText",
+        },
+        {
+          label: "阅读时长",
+          key: "StopTime",
+        },
+        {
+          label: type === 8 ? "报告类型" : "报告标签",
+          key: "Label",
+        },
+      ];
+};
 //活动的筛选
 export const screenList = [
   {

+ 53 - 96
src/views/custom_manage/contacts/compontents/interactionDlg.vue

@@ -1,55 +1,19 @@
 <template>
   <div class="container-interaction-dlg">
-    <el-dialog
-      v-dialogDrag
-      :visible.sync="interactionDlg"
-      :close-on-click-modal="false"
-      :modal-append-to-body="false"
-      @close="cancelHandle"
-      center
-      width="800px"
-    >
-      <div slot="title">
-        <i
-          class="el-icon-close"
-          style="fontsize: 24px; cursor: pointer; position: absolute; right: 20px; top: 50%; transform: translateY(-50%)"
-          @click="cancelHandle"
-        ></i>
-        <span style="fontsize: 16px">{{ industryName }} - 相关互动</span>
-      </div>
+    <el-dialog v-dialogDrag :visible.sync="interactionDlg" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" :title="dlgTitle" center width="800px">
       <div>
-        <template v-if="isFllow">
-          <img src="~@/assets/img/attention.png" alt="" />
-          关注的产业
-        </template>
-        <div class="tabs-box">
-          <span v-for="item in interactionColums" :key="item.title" :class="tabsActive === item.title ? 'active' : ''" @click="tabsHandle(item)">
-            {{ item.title }}</span
-          >
-        </div>
         <div class="content">
-          <div v-for="item in interactionColums" :key="item.title">
-            <template v-if="tabsActive === item.title">
-              <el-table :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border height="350">
-                <el-table-column
-                  v-for="val in item.table"
-                  :key="val.label"
-                  :label="val.label"
-                  :width="val.widthsty"
-                  :min-width="val.minwidthsty"
-                  align="center"
-                >
-                  <template slot-scope="{ row }">
-                    <span @click="handleRowClick(row, val.key)" :style="handleRowStyle(val.key)">{{ handleRowContent(row, val.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>
-            </template>
-          </div>
+          <el-table :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border height="350">
+            <el-table-column v-for="val in dataColums" :key="val.label" :label="val.label" :width="val.widthsty" :min-width="val.minwidthsty" align="center">
+              <template slot-scope="{ row }">
+                <span>{{ row[val.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>
       </div>
     </el-dialog>
@@ -67,22 +31,41 @@ export default {
       type: Boolean,
       default: false,
     },
-    interactionFrom: {
-      type: Object,
+    raiLabelId: {
+      type: Number,
     },
   },
   data() {
     return {
       tableLoading: false,
       tableData: [],
-      tabsActive: "报告阅读",
-      industryName: "",
-      isFllow: false,
+      sourceType: "",
+      dataColums: [],
     };
   },
   computed: {
-    interactionColums() {
-      return interactionColums;
+    dlgTitle() {
+      switch (this.sourceType) {
+        case 1:
+          return "搜索关键字";
+        case 2:
+          return "线下活动";
+        case 3:
+          return "线下路演";
+        case 4:
+          return "线上活动";
+        case 5:
+          return "线上路演";
+        case 6:
+          return "输入标签";
+        case 7:
+        case 8:
+          return "阅读报告";
+        case 9:
+          return "路演回放";
+        default:
+          return ""; // 返回一个空对象表示没有样式
+      }
     },
   },
   watch: {
@@ -99,59 +82,33 @@ export default {
   methods: {
     async getInteractionRelevant() {
       const res = await equityContacts.getInteractionRelevant({
-        UserId: this.interactionFrom.id,
-        KeyWord: this.interactionFrom.key,
-        Source: this.tabsActive === "报告阅读" ? 1 : this.tabsActive === "报告收藏" ? 2 : this.tabsActive === "活动互动" ? 3 : 4,
+        RaiLabelId: this.raiLabelId,
       });
       if (res.Ret === 200) {
-        this.industryName = res.Data.IndustryName;
-        this.isFllow = res.Data.IsFllow;
-        this.tableData = res.Data.List || [];
+        this.sourceType = res.Data.SourceType;
+        this.dataColums = interactionColums(this.sourceType);
+        this.tableData =
+          res.Data.SourceType == 1
+            ? [res.Data.KeyWord]
+            : res.Data.SourceType == 2 || res.Data.SourceType == 4
+            ? [res.Data.Activity]
+            : res.Data.SourceType == 3 || res.Data.SourceType == 5
+            ? [res.Data.RoadShow]
+            : res.Data.SourceType == 6
+            ? [res.Data.Seller]
+            : res.Data.SourceType == 9
+            ? [res.Data.ActivityVivo]
+            : [res.Data.Article];
       }
     },
     tabsHandle(item) {
-      this.tabsActive = item.title;
       this.tableData = [];
       this.getInteractionRelevant();
     },
     //关闭弹框
     cancelHandle() {
-      this.tabsActive = "报告阅读";
       this.$emit("update:interactionDlg", false);
     },
-    /* 表格行的样式 */
-    handleRowStyle(key) {
-      const style = {
-        Title: "color: #409eff; cursor: pointer",
-      };
-      return style[key] ? style[key] : "";
-    },
-    /* 表格行的数据处理 */
-    handleRowContent(row, key) {
-      if (["ActivityType"].includes(key)) {
-        return row[key] == 1 ? "线上" : "线下";
-      } else {
-        return row[key];
-      }
-    },
-    /* 表格行的点击事件 */
-    handleRowClick(row, key) {
-      if (key === "Title") {
-        if (row.ArticleType == 1) {
-          let url =
-            process.env.NODE_ENV === "production"
-              ? "https://details.hzinsights.com/cygx/report"
-              : process.env.NODE_ENV === "test"
-              ? "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report"
-              : "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report";
-          let href = `${url}?id=${row.ArticleIdMd5}`;
-          window.open(href, "_blank");
-        } else {
-          let href = `https://vmp.hzinsights.com/v2/articles/${row.ArticleId}`;
-          window.open(href, "_blank");
-        }
-      }
-    },
   },
 };
 </script>

+ 96 - 25
src/views/custom_manage/contacts/compontents/labelDlg.vue

@@ -1,35 +1,25 @@
 <template>
   <div class="container-labrlDlg">
-    <el-dialog
-      title="标签"
-      v-dialogDrag
-      :visible.sync="isShowLabelDlg"
-      :close-on-click-modal="false"
-      :modal-append-to-body="false"
-      @close="cancelHandle"
-      center
-      width="800px"
-    >
+    <el-dialog title="标签" v-dialogDrag :visible.sync="isShowLabelDlg" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center width="800px">
       <div class="popover-item">
-        <el-tag
-          size="mini"
-          style="margin: 5px 8px; cursor: pointer"
-          v-for="item in lookLabelListNumber()"
-          :key="item"
-          :type="userLabel == item && 'danger'"
-          @click="labelChildren(item)"
-        >
-          {{ item }}
-        </el-tag>
+        <span class="label-tag" :style="lookLabelColor(item)" v-for="item in lableListL" :key="item.RaiLabelId" @click="labelChildren(item.RaiLabelId)">
+          {{ item.Label }}
+          <i @click.stop="deleteLabel(item)" v-if="item.SourceType == 6" class="el-icon-circle-close"></i>
+        </span>
+        <span @click="labelChildrenAdd" class="label-tag" style="margin: 5px 8px; cursor: pointer" effect="dark" color="#EAF3FE"> 添加标签 <i class="el-icon-circle-plus-outline"></i></span>
       </div>
     </el-dialog>
+    <AddLabelDlg :interactionFrom="interactionFrom" :addIsShow.sync="addLabelDlgVisibility" @updateList="getUpdateList" />
   </div>
 </template>
 
 <script>
+import AddLabelDlg from "./addLabelDlg.vue";
+import { equityContacts } from "@/api/api.js";
+
 export default {
   name: "",
-  components: {},
+  components: { AddLabelDlg },
   props: {
     isShowLabelDlg: {
       default: false,
@@ -45,38 +35,119 @@ export default {
     },
   },
   data() {
-    return {};
+    return {
+      lableListL: [],
+      interactionFrom: "",
+      addLabelDlgVisibility: false,
+    };
   },
   computed: {},
-  watch: {},
+  watch: {
+    isShowLabelDlg: {
+      handler(newVal) {
+        newVal && this.getDataList();
+      },
+    },
+  },
   created() {},
   mounted() {},
   methods: {
+    async getDataList() {
+      const res = await equityContacts.getLabelList({
+        UserId: this.dlgLabelList.UserId,
+      });
+      if (res.Ret === 200) {
+        this.lableListL = res.Data.List || [];
+      }
+    },
     // 类型的处理
     lookLabelListNumber() {
       let arr = this.dlgLabelList.Labels ? this.dlgLabelList.Labels.split(",") : [];
       return arr;
     },
     // 点击标签的事件
-    labelChildren(key) {
-      this.$emit("labelChildren", key, this.dlgLabelList);
+    labelChildren(item) {
+      this.$emit("labelClick", item);
+    },
+    // 点击标签的事件
+    deleteLabel(item) {
+      this.$emit("update:isShowLabelDlg", false);
+      if (item.SourceType == 6) {
+        this.$confirm("确定要删除此标签吗?", "删除标签", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(async () => {
+          const res = await equityContacts.userRaiLabelDel({
+            RaiLabelId: item.RaiLabelId,
+          });
+          if (res.Ret == 200) {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+            this.getDataList();
+            this.$emit("getUpdateList");
+          }
+        });
+      }
     },
     // 关闭了弹框
     cancelHandle() {
       this.$emit("update:dlgLabelList", {});
       this.$emit("update:isShowLabelDlg", false);
     },
+    // 标签的颜色
+    lookLabelColor(item) {
+      switch (item.SourceType) {
+        case 1:
+          return { backgroundColor: "#FFE5E6", color: "#D60808" };
+        case 2:
+        case 3:
+          return { backgroundColor: "#FDE5FF", color: "#891B98" };
+        case 4:
+        case 5:
+          return { backgroundColor: "#FFEEE5", color: "#DD4D00" };
+        case 7:
+          return { backgroundColor: "#E5FCFF", color: "#076873" };
+        case 8:
+          return { backgroundColor: "#E5EAFF", color: "#1A31C5" };
+        default:
+          return {}; // 返回一个空对象表示没有样式
+      }
+    },
+    // 添加销售输入标签接口
+    labelChildrenAdd() {
+      this.addLabelDlgVisibility = true;
+      this.interactionFrom = this.dlgLabelList;
+    },
+    // 添加标签后的更新列表事件
+    getUpdateList() {
+      this.getDataList();
+      this.$emit("getUpdateList");
+    },
   },
 };
 </script>
 <style scoped lang="scss">
 .container-labrlDlg {
   .popover-item {
+    display: flex;
+    flex-wrap: wrap;
     padding-bottom: 30px;
   }
   .popover-not-have {
     width: 100%;
     text-align: center;
   }
+  .label-tag {
+    padding: 0 10px;
+    font-size: 14px;
+    border-radius: 4px;
+    background-color: #eaf3fe;
+    color: #409eff;
+    margin: 5px 8px;
+    cursor: pointer;
+  }
 }
 </style>

+ 116 - 45
src/views/custom_manage/contacts/contactsList.vue

@@ -33,25 +33,7 @@
         :props="{ value: 'TryStage', label: 'Name', children: 'List', checkStrictly: true }"
         @change="handelGetData"
       ></el-cascader>
-      <el-autocomplete
-        style="width: 200px; margin-bottom: 20px"
-        prefix-icon="el-icon-search"
-        clearable
-        class="inline-input"
-        v-model="userLabel"
-        :fetch-suggestions="querySearchHandler"
-        placeholder="用户标签搜索"
-        @clear="handelGetData"
-        :trigger-on-focus="false"
-        @select="handelGetData"
-      >
-        <template slot-scope="scope">
-          <div v-if="scope.item.IndustryName">
-            {{ scope.item.IndustryName }}
-          </div>
-          <div v-else style="text-align: center">暂无数据</div>
-        </template>
-      </el-autocomplete>
+      <el-input style="width: 200px; margin-bottom: 20px" prefix-icon="el-icon-search" clearable class="inline-input" v-model="userLabel" placeholder="用户标签搜索" @input="handelGetData"> </el-input>
     </div>
     <el-card>
       <el-table :data="tableData" style="width: 100%" border @sort-change="sortChangeHandle" :row-class-name="setRowClass">
@@ -111,26 +93,31 @@
           </template>
         </el-table-column>
         <el-table-column prop="" width="350">
-          <div slot="header" slot-scope="{}" style="text-align: center">标签</div>
+          <div slot="header" slot-scope="{}" style="text-align: center">
+            <el-popover placement="top-start" width="376" trigger="hover">
+              <span slot="reference">
+                <p style="cursor: pointer">标签 <i class="el-icon-info" style="color: #606266" /></p>
+              </span>
+              <div class="popover-item">
+                <span class="label-tag" :style="lookLabelColor(item)" v-for="item in lableDescribe" :key="item.SourceType" @click="labelChildren(item.RaiLabelId)">
+                  {{ item.Label }}
+                  <i @click.stop="deleteLabel(item)" v-if="item.SourceType == 6" class="el-icon-circle-close"></i>
+                </span>
+                <p style="margin:10px 15px">仅标记客户4个月以内的互动行为</p>
+              </div>
+            </el-popover>
+          </div>
           <template slot-scope="{ row }">
             <div class="popover-item">
-              <el-tag size="mini" style="margin: 5px 8px; cursor: pointer" v-for="item in lookLabelListNumber(row)" :key="item" :type="userLabel == item && 'danger'" @click="labelChildren(item, row)">
-                {{ item }}
-              </el-tag>
-              <span @click="showLabelDlg(row)" style="font-weight: 700; padding: 5px 10px" class="editsty" v-if="row.Labels && row.Labels.split(',').length > 10">...</span>
+              <span class="label-tag" :style="lookLabelColor(item)" v-for="item in lookLabelListNumber(row)" :key="item.RaiLabelId" @click="labelChildren(item.RaiLabelId)">
+                {{ item.Label }}
+                <i @click.stop="deleteLabel(item)" v-if="item.SourceType == 6" class="el-icon-circle-close"></i>
+              </span>
+              <span @click="showLabelDlg(row)" style="font-weight: 700; padding: 5px 10px" class="editsty" v-if="row.RaiLabelList && row.RaiLabelList.length > 6">...</span>
+              <span @click="labelChildrenAdd(row)" class="label-tag" style="margin: 5px 8px; cursor: pointer" effect="dark" color="#EAF3FE"> 添加标签 <i class="el-icon-circle-plus-outline"></i></span>
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column align="center" prop="" label="备注" width="90">
-          <template slot-scope="{ row }">
-            <div class="remark-list">
-              <div class="button">
-                <span class="editsty" @click="lookOver(row, '添加')">添加</span>
-                <span v-if="row.Content" style="font-weight: 700; padding: 5px 10px" class="editsty" @click="lookOver(row, '历史')">...</span>
-              </div>
-            </div>
-          </template>
-        </el-table-column> -->
         <el-table-column align="center" prop="" label="操作" width="160">
           <template slot-scope="{ row }">
             <span :class="row.IsRemind ? 'deletesty' : 'editsty'" @click="remindHandler(row)">{{ row.IsRemind ? "取消提醒" : "互动提醒" }}</span>
@@ -165,11 +152,12 @@
         </template>
       </div>
     </el-dialog>
-    <InteractionDlg :interactionDlg.sync="interactionDlg" :interactionFrom="interactionFrom" />
-    <label-dlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelChildren="labelChildren" :userLabel="userLabel" />
+    <InteractionDlg :interactionDlg.sync="interactionDlg" :raiLabelId="raiLabelId" />
+    <label-dlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelClick="labelChildren" @deleteClick="deleteLabel" @getUpdateList="getCygxContactsList" />
     <remind-dlg :isShowRemindDlg.sync="isShowRemindDlg" :remindList.sync="remindList" />
     <FeedbackDlg :showFeedbackDlg.sync="showFeedbackDlg" :remindList.sync="remindList" />
     <ContactTransfer :contactTransferDlgVisible.sync="contactTransferDlgVisible" :TransferMobile.sync="TransferMobile" />
+    <AddLabelDlg :interactionFrom="interactionFrom" :addIsShow.sync="addLabelDlgVisibility" @updateList="getCygxContactsList" />
   </div>
 </template>
 
@@ -182,10 +170,11 @@ import LabelDlg from "./compontents/labelDlg.vue";
 import RemindDlg from "./compontents/remindDlg.vue";
 import FeedbackDlg from "./compontents/feedbackDlg.vue";
 import ContactTransfer from "../customList/components/ContactTransferDlg.vue";
+import AddLabelDlg from "./compontents/addLabelDlg.vue";
 
 export default {
   name: "",
-  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg, ContactTransfer },
+  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg, ContactTransfer, AddLabelDlg },
   props: {},
   data() {
     return {
@@ -246,6 +235,36 @@ export default {
       TransferMobile: 0,
 
       contactTransferDlgVisible: false, //联系人转移的弹框
+
+      addLabelDlgVisibility: false, // 销售输入标签
+      raiLabelId: "",
+
+      lableDescribe: [
+        {
+          Label: "搜索关键词标签",
+          SourceType: 1,
+        },
+        {
+          Label: "产业/个股标签(线上活动/路演/路演回放)",
+          SourceType: 5,
+        },
+        {
+          Label: "报告类型标签",
+          SourceType: 8,
+        },
+        {
+          Label: "产业/个股标签(线下活动/路演)",
+          SourceType: 2,
+        },
+        {
+          Label: "销售输入标签",
+          SourceType: 6,
+        },
+        {
+          Label: "产业/个股标签(报告)",
+          SourceType: 7,
+        },
+      ],
     };
   },
   computed: {},
@@ -399,12 +418,35 @@ export default {
       window.open(href, "_blank");
     },
     /* 标签下的单独的某一个 */
-    labelChildren(key, row) {
+    labelChildren(id) {
       this.interactionDlg = true;
-      this.interactionFrom = {
-        id: row.UserId,
-        key,
-      };
+      this.raiLabelId = id;
+    },
+    // 点击删除标签的某一个
+    deleteLabel(item) {
+      if (item.SourceType == 6) {
+        this.$confirm("确定要删除此标签吗?", "删除标签", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(async () => {
+          const res = await equityContacts.userRaiLabelDel({
+            RaiLabelId: item.RaiLabelId,
+          });
+          if (res.Ret == 200) {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+            this.getCygxContactsList();
+          }
+        });
+      }
+    },
+    // 添加销售输入标签接口
+    labelChildrenAdd(item) {
+      this.addLabelDlgVisibility = true;
+      this.interactionFrom = item;
     },
     //鼠标经过了 机构互助量
     async isShowOrganization(row) {
@@ -446,13 +488,12 @@ export default {
       this.isShowRemindDlg = true;
     },
     sortChangeHandle(item) {
-      console.log(item.order);
       this.orderTable = item.order === "ascending" ? "asc" : item.order === "descending" ? "desc" : "";
       this.getCygxContactsList();
     },
     // 处理标签不能超过10个
     lookLabelListNumber(row) {
-      let arr = row.Labels ? row.Labels.split(",").splice(0, 10) : [];
+      let arr = row.RaiLabelList ? _.cloneDeep(row.RaiLabelList).splice(0, 6) : [];
       return arr;
     },
     // 展示弹框
@@ -473,10 +514,28 @@ export default {
     // 设置表格行的样式
     setRowClass({ row }) {
       if (row.IsMaker == 1) {
-        console.log(row);
         return "not-read-seven-days";
       }
     },
+    lookLabelColor(item) {
+      switch (item.SourceType) {
+        case 1:
+          return { backgroundColor: "#FFE5E6", color: "#D60808" };
+        case 2:
+        case 3:
+          return { backgroundColor: "#FDE5FF", color: "#891B98" };
+        case 4:
+        case 5:
+        case 9:
+          return { backgroundColor: "#FFEEE5", color: "#DD4D00" };
+        case 7:
+          return { backgroundColor: "#E5FCFF", color: "#076873" };
+        case 8:
+          return { backgroundColor: "#E5EAFF", color: "#1A31C5" };
+        default:
+          return {}; // 返回一个空对象表示没有样式
+      }
+    },
   },
   /* 页面跳转前记录参数 */
   beforeRouteLeave(to, from, next) {
@@ -568,9 +627,21 @@ export default {
   }
 }
 .popover-item {
+  display: flex;
+  flex-wrap: wrap;
   overflow: hidden;
   overflow-y: auto;
+  .label-tag {
+    padding: 0 10px;
+    font-size: 14px;
+    border-radius: 4px;
+    background-color: #eaf3fe;
+    color: #409eff;
+    margin: 5px 8px;
+    cursor: pointer;
+  }
 }
+
 .popover-not-have {
   width: 100%;
   text-align: center;

+ 1 - 1
src/views/custom_manage/customList/addCustom.vue

@@ -83,7 +83,7 @@
 			<el-form-item label="客户状态" prop="cuStatus" style="marginRight:120px;">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 				<el-radio-group v-model="dataForm.cuStatus" size="medium" style="width:400px;">
-					<el-radio border label="试用"  style="width:184px;">试用(2个月)</el-radio>
+					<el-radio border label="试用"  style="width:184px;">试用({{typeArr.includes('权益') ? 1 : 2}}个月)</el-radio>
 					<el-radio border label="永续" style="width:184px;marginLeft:0;" v-if="Role=='admin'">永续</el-radio>
 				</el-radio-group>
 			</el-form-item>

+ 23 - 1
src/views/custom_manage/customList/customDetail.vue

@@ -417,6 +417,7 @@
 								>图表权限</span>
 								</block> -->
 								<p v-if="isUserYanXuanButtonShow" class="editsty" @click="isOpenMfyxStatusHandler(scope.row)">{{scope.row.MfyxStatus =='试用'?'关闭研选订阅试用':'开通研选订阅试用'}} </p>
+								<p  class="editsty" @click="lookUserLabler(scope.row)">查看个人标签 </p>
 							</div>
 						</template>
 					</el-table-column>
@@ -733,6 +734,10 @@
 		<HistoricalNotesDlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId"/>
 		<ContactTransfer :contactTransferDlgVisible.sync="contactTransferDlgVisible" :TransferMobile.sync="TransferMobile"/>
 		<edit-mobile :editMobileDialogVisible.sync="editMobileDialogVisible" :editMobileId="editMobileId" :outboundMobile="outboundMobile" isType="客户" />
+		<!-- <interactionDlg />	 -->
+		<InteractionDlg  :interactionDlg.sync="interactionDlg" :raiLabelId="raiLabelId"/>
+		 
+		 <LabelDlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelClick="labelChildren"  @getUpdateList="getuserTable"/>
 	</div>	
 </template>
 
@@ -756,9 +761,11 @@ import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
 import ContactTransfer from './components/ContactTransferDlg.vue'
 
 import EditMobile from "../../rai_manage/components/editMobile.vue";
+import InteractionDlg from '../contacts/compontents/interactionDlg.vue'
+import LabelDlg from '../contacts/compontents/labelDlg.vue'
 export default {
 	name:'',
-	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract, HistoricalNotesDlg, ContactTransfer, EditMobile},
+	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract, HistoricalNotesDlg, ContactTransfer, EditMobile, InteractionDlg ,LabelDlg},
 	computed:{
 		Role() {
 			let role = localStorage.getItem('Role') || '';
@@ -896,6 +903,12 @@ export default {
 			editMobileDialogVisible: false,
 			editMobileId :0,
 			outboundMobile :0,
+
+			// 查看权益个人标签模块
+			isShowLabelDlg:false,
+			dlgLabelList:{},
+			interactionDlg:false,
+			raiLabelId:'',
 		};
 	},
 	methods: {
@@ -1729,6 +1742,15 @@ export default {
       this.editMobileId = id;
       this.outboundMobile = value;
     },
+	// 查看个人标签
+	lookUserLabler(row){
+		this.dlgLabelList = row;
+		this.isShowLabelDlg = true
+	},
+	labelChildren(id){
+		this.interactionDlg = true;
+      	this.raiLabelId = id;
+	},
 	},
 	mounted() {
 		this.getDetail();

+ 1 - 1
src/views/custom_manage/customList/customList.vue

@@ -532,7 +532,7 @@
 		center>
 			<div slot="title" style="display:flex;alignItems:center;">
 				<!-- <img :src="$icons.auth" style="color:#fff;width:16px;height:16px;marginRight:5px;"> -->
-				<span style="fontSize:16px;">增开试用(默认两个月)</span>
+				<span style="fontSize:16px;">增开试用(默认{{ RoleType == '权益' ? '一' : ''}}个月)</span>
 			</div>
 			<Cauthlist
 			:autharr="authList"

+ 1 - 1
src/views/custom_manage/customList/customShareList.vue

@@ -475,7 +475,7 @@
 		v-dialogDrag
 		center>
 			<div slot="title" style="display:flex;alignItems:center;">
-				<span style="fontSize:16px;">增开试用(默认两个月)</span>
+				<span style="fontSize:16px;">增开试用(默认{{ RoleType == '权益' ? '一' : ''}}个月)</span>
 			</div>
 			<Cauthlist
 				:autharr="authList"

+ 6 - 2
src/views/custom_manage/customList/pickCustom.vue

@@ -16,7 +16,7 @@
 				</li>
 				<li>
 					<label style="marginRight:60px;width:80px;textAlign:right;display:inline-block;">客户状态</label>
-					<el-radio border :label="basicInfo.cuStatus" style="width:184px;marignRight:200px;" v-model="basicInfo.cuStatus">{{basicInfo.cuStatus=='试用'?'试用(2个月)':basicInfo.cuStatus}}</el-radio>
+					<el-radio border :label="basicInfo.cuStatus" style="width:184px;marignRight:200px;" v-model="basicInfo.cuStatus">{{basicInfo.cuStatus=='试用'?`试用(${roleType == '权益' ? 1 : 2}个月)`:basicInfo.cuStatus}}</el-radio>
 				</li>
 				<li>
 					<label style="marginRight:60px;width:80px;textAlign:right;display:inline-block;">客户类型</label>
@@ -78,7 +78,7 @@
 						<el-form-item label="客户状态" prop="cuStatus">
 							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 							<el-radio-group v-model="pickForm.cuStatus" size="medium">
-								<el-radio border label="试用" style="width:184px;">试用(2个月)</el-radio>
+								<el-radio border label="试用" style="width:184px;">试用({{roleType == '权益' ? 1 : 2}}个月)</el-radio>
 							</el-radio-group>
 						</el-form-item>
 						<el-form-item label="客户类型" prop="custype" style="marginRight:120px;">
@@ -170,6 +170,10 @@ export default {
 			let role = localStorage.getItem('Role') || '';
 			return role;
 		},
+		roleType() {
+			let type = localStorage.getItem('RoleType') || '';
+			return type;
+		}
 	},	
 	data () {
 		return {

+ 122 - 0
src/views/dataReport_manage/components/DataSummary.vue

@@ -0,0 +1,122 @@
+<template>
+  <div>
+    <el-dialog v-dialogDrag :title="title" :visible.sync="visible" :close-on-click-modal="false" :modal-append-to-body="false" width="60%" @close="closeDialog" top="5vh">
+      <p v-if="isShowText">共{{ CompanyNum }}家客户,其中{{ CompanyMultiple }}家客户有多份合同</p>
+      <el-table :data="tableData" border style="margin: 20px 0" height="600">
+        <el-table-column v-for="(col, index) in columns" :key="index" :prop="col.prop" :label="col.label" align="center">
+          <template slot-scope="{ row }">
+            <span v-if="col.label === '操作'" style="color: #409eff; cursor: pointer; font-size: 14px; margin-right: 20px" @click="historicalNotesClickHandler(row)">历史备注</span>
+            <span v-else>{{ handleRowContent(row, col) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-col :span="24" class="toolbar" v-if="total">
+        <m-page :total="total" :page_no="page_no" @handleCurrentChange="handleCurrentChange" />
+      </el-col>
+    </el-dialog>
+    <HistoricalNotesDlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId" />
+  </div>
+</template>
+
+<script>
+import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
+import { dataMainInterface } from "@/api/api.js";
+import mPage from "@/components/mPage.vue";
+
+export default {
+  name: "",
+  components: { HistoricalNotesDlg, mPage },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    title: {
+      type: String,
+      default: "",
+    },
+    columns: {
+      type: Array,
+      default: [],
+    },
+    dataItem: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      tableData: [],
+      historicalNotesDlgVisible: false, //历史备注的弹框
+      historicalNotesId: 0,
+      total: 0,
+      pageSize: 10,
+      page_no: 1,
+      CompanyMultiple: 0,
+      CompanyNum: 0,
+    };
+  },
+  computed: {
+    isShowText() {
+      return ["新签合同", "到期合同", "续约合同", "确认不续约合同"].includes(this.title);
+    },
+  },
+  watch: {
+    visible(val) {
+      if (val) {
+        this.getData();
+      }
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    closeDialog() {
+      this.tableData = [];
+      this.historicalNotesDlgVisible = false; //历史备注的弹框
+      this.historicalNotesId = 0;
+      this.total = 0;
+      this.pageSize = 10;
+      this.page_no = 1;
+      this.CompanyMultiple = 0;
+      this.CompanyNum = 0;
+      this.$emit("update:visible", false);
+      this.$emit("update:dataItem", {});
+    },
+    // 点击了历史留言
+    historicalNotesClickHandler(row) {
+      this.historicalNotesDlgVisible = true;
+      this.historicalNotesId = row.CompanyId;
+    },
+    handleCurrentChange(val) {
+      this.page_no = val;
+      this.getData();
+    },
+    // 获取数据
+    async getData() {
+      const res = await dataMainInterface.getRaiDataSummaryList({
+        DataType: this.dataItem.DataType,
+        SellerId: this.dataItem.SellerId,
+        IsServerSeller: this.dataItem.IsServerSeller,
+        CurrentIndex: this.page_no,
+        PageSize: this.pageSize,
+        PopupType: this.title,
+      });
+      if (res.Ret === 200) {
+        this.tableData = res.Data.List;
+        this.total = res.Data.Paging.Totals;
+        this.CompanyMultiple = res.Data.CompanyMultiple;
+        this.CompanyNum = res.Data.CompanyNum;
+      }
+    },
+    // 处理表格内容
+    handleRowContent(row, col) {
+      if (col.label === "合同期限") {
+        return `${row.StartDate} ~ ${row.EndDate}`;
+      }
+      return row[col.prop];
+    },
+  },
+};
+</script>
+<style scoped lang=""></style>

+ 151 - 24
src/views/dataReport_manage/configdata.js

@@ -231,7 +231,7 @@ export const RaiStockTableColums = [
   {
     label: "合同期限",
     dataType: "新签客户,续约客户",
-    key: "StartDate"
+    key: "StartDate",
   },
   {
     label: "合同金额",
@@ -450,27 +450,154 @@ export const equityTableColums = (type) => {
           sort: true,
         },
       ]
-    : type === "新增试用客户" 
-    ? [ {
-      label: "客户名称",
-      key: "CompanyName",
-      widthsty: "300px",
-      textsty: "color:#409EFF;cursor:pointer;",
-      link: true,
-    },
-    {
-      label: "所属销售",
-      key: "SellerName",
-      widthsty: "150px",
-    },
-    {
-      label: "新增类型",
-      key: "Operation",
-      widthsty: "150px",
-    },
-    {
-      label: "新增时间",
-      key: "CreateTime",
-    }]
-    :[];
+    : type === "新增试用客户"
+    ? [
+        {
+          label: "客户名称",
+          key: "CompanyName",
+          widthsty: "300px",
+          textsty: "color:#409EFF;cursor:pointer;",
+          link: true,
+        },
+        {
+          label: "所属销售",
+          key: "SellerName",
+          widthsty: "150px",
+        },
+        {
+          label: "新增类型",
+          key: "Operation",
+          widthsty: "150px",
+        },
+        {
+          label: "新增时间",
+          key: "CreateTime",
+        },
+      ]
+    : [];
+};
+
+export const tableConfigs = {
+  AddTrialCount: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "新增类型", prop: "AddType" },
+    { label: "新增时间", prop: "CreateTime" },
+  ],
+  // 新签合同
+  NewContractData: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同期限", prop: "StartDate" },
+    { label: "合同金额", prop: "Money" },
+    { label: "签约套餐", prop: "PermissionName" },
+    { label: "操作", prop: "actions" },
+  ],
+  // 到期合同
+  ExpiredContractData: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同期限", prop: "StartDate" },
+    { label: "合同金额", prop: "Money" },
+    { label: "签约套餐", prop: "PermissionName" },
+    { label: "操作", prop: "actions" },
+  ],
+  // 续约合同
+  RenewedContractData: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同期限", prop: "StartDate" },
+    { label: "合同金额", prop: "Money" },
+    { label: "签约套餐", prop: "PermissionName" },
+    { label: "操作", prop: "actions" },
+  ],
+  // 续约率
+  RenewalRateData: [
+    { label: "", prop: "TbaleNameAText" },
+    { label: "续约金额(续约客户数)", prop: "RenewedContractMoney" },
+    { label: "到期金额(到期客户数)", prop: "ExpiredContractMoney" },
+    { label: "续约/到期", prop: "RenewalRate" },
+  ],
+  //确认不续约合同
+  ConfirmedNoRenewalContractData: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同期限", prop: "StartDate" },
+    { label: "合同金额", prop: "Money" },
+    { label: "签约套餐", prop: "PermissionName" },
+    { label: "操作", prop: "actions" },
+  ],
+  //确认不续约率
+  ConfirmNonRenewalRateData: [
+    { label: "", prop: "TbaleNameAText" },
+    { label: "不续约金额(不续约客户数)", prop: "RenewedContractMoney" },
+    { label: "到期金额(到期客户数)", prop: "ExpiredContractMoney" },
+    { label: "不续约/到期", prop: "RenewalRate" },
+  ],
+  // 签约客户数量
+  SignedClientCount: [
+    { label: "新签客户数量", prop: "NewContractCompany" },
+    { label: "新签合同数量", prop: "NewContract" },
+    { label: "续约客户数量", prop: "RenewedContractCompany" },
+    { label: "续约合同数量", prop: "RenewedContract" },
+  ],
+  // 客单价
+  AverageRevenueCount: [
+    { label: "签约总金额", prop: "ContractMoney" },
+    { label: "签约客户数", prop: "ContractNum" },
+  ],
+  // 开票金额
+  InvoiceAmountCount: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同编号", prop: "ContractCode" },
+    { label: "开票金额", prop: "InvoicedAmount" },
+    { label: "开票日期", prop: "CreateTime" },
+  ],
+  // 新客开票
+  NewCustomerInvoicingCount: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同编号", prop: "ContractCode" },
+    { label: "开票金额", prop: "InvoicedAmount" },
+    { label: "开票日期", prop: "CreateTime" },
+  ],
+  // 到款金额
+  PaymentReceivedCount: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同编号", prop: "ContractCode" },
+    { label: "到款金额", prop: "PaymentAmount" },
+    { label: "到款日期", prop: "CreateTime" },
+  ],
+  // 新客到款
+  NewCustomerPaymentsReceivedCount: [
+    { label: "客户名称", prop: "CompanyName" },
+    { label: "所属销售", prop: "SellerName" },
+    { label: "合同编号", prop: "ContractCode" },
+    { label: "到款金额", prop: "PaymentAmount" },
+    { label: "到款日期", prop: "CreateTime" },
+  ],
+  // 未到款比例
+  UnpaidRatioCount: [
+    { label: "开票金额", prop: "InvoicedAmount" },
+    { label: "到款金额", prop: "PaymentAmount" },
+    { label: "未到款金额", prop: "NotReceivedtAmount" },
+  ],
+};
+export const tableDlgTitle = {
+  AddTrialCount: "新增试用", //新增试用
+  NewContractData: "新签合同", //新签合同(金额/数量)
+  ExpiredContractData: "到期合同", //到期合同(金额/数量)
+  RenewedContractData: "续约合同", //续约合同(金额/数量)
+  RenewalRateData: "续约率", //续约率(金额/数量)
+  ConfirmedNoRenewalContractData: "确认不续约合同", //确认不续约合同(金额/数量)
+  SignedClientCount: "签约客户数量", //签约客户数量
+  AverageRevenueCount: "客单价", //客单价
+  InvoiceAmountCount: "开票金额", //开票金额
+  PaymentReceivedCount: "到款金额", //到款金额
+  UnpaidRatioCount: "未到款比例", //未到款比例
+  NewCustomerInvoicingCount: "新客开票", //新客开票
+  NewCustomerPaymentsReceivedCount: "新客到款", //新客到款
+  ConfirmNonRenewalRateData: "确认不续约率",
 };

+ 328 - 0
src/views/dataReport_manage/equityDataSummary.vue

@@ -0,0 +1,328 @@
+<template>
+  <div class="data-summary-container">
+    <el-card>
+      <div style="display: flex">
+        <div class="data-summary-top">
+          <span :class="['button-sty', { act: monthType === item.label }]" v-for="item in monthLabel" @click="toggleMonth(item.label)" :key="item.label">
+            {{ item.label }}
+          </span>
+        </div>
+        <date-picker v-model="timeRange" type="year" range value-type="format" placeholder="开始至结束" :editable="false" @change="dateChange" :disabled-date="disabledDate" @pick="onPick" clearable />
+      </div>
+    </el-card>
+    <div class="dataReport-main">
+      <!-- 合同类型帅选项 -->
+      <div style="display: flex; flex-wrap: wrap">
+        <div class="data-summary-top">
+          <span :class="['button-sty btn-filter', { act: selectedFilters.includes(item) }]" v-for="(fields, item) in filterOptions" @click="toggleFilter(item)" :key="item">
+            {{ item }}
+          </span>
+        </div>
+        <el-cascader
+          v-model="pathfinderSales"
+          :options="salesArrRai"
+          :props="salesArrProps"
+          clearable
+          @change="salesChangeHandedl"
+          placeholder="选择开拓组销售"
+          :disabled="serviceGroupSalesAct.length"
+          style="margin-right: 20px"
+        ></el-cascader>
+        <el-cascader
+          v-model="serviceGroupSalesAct"
+          :options="serviceGroupSales"
+          :props="salesArrProps"
+          clearable
+          @change="salesChangeHandedl"
+          placeholder="选择服务组销售"
+          :disabled="pathfinderSales.length"
+        ></el-cascader>
+        <div class="switch-box">
+          <span>开拓组</span>
+          <el-switch v-model="pathfinderSwitch" :disabled="isSwitchDisabled" @change="salesChangeHandedl"></el-switch>
+          <span>服务组</span>
+          <el-switch v-model="serviceGroupSwitch" :disabled="isSwitchDisabled" @change="salesChangeHandedl"></el-switch>
+        </div>
+      </div>
+      <!-- 数据表格 -->
+      <el-table :data="flattenedData" border style="width: 100%; margin-top: 20px" :span-method="mergeRows">
+        <!-- DataType 作为合并行 -->
+        <el-table-column prop="DataType" label="" align="center" width="120px" />
+
+        <!-- 销售姓名 -->
+        <el-table-column prop="SellerName" label="销售姓名" align="center" width="150px" />
+
+        <el-table-column v-for="col in dynamicColumns" :key="col.key" :prop="col.key" align="center">
+          <template slot="header" slot-scope="{ row }">
+            <el-tooltip :content="col.tooltip" placement="top">
+              <div style="display: inline-flex; align-items: center">
+                <span style="margin-right: 4px">{{ col.label }}</span>
+                <i class="el-icon-info" style="color: #333333" />
+              </div>
+            </el-tooltip>
+          </template>
+          <template slot-scope="{ row }">
+            <span class="editsty" @click="handlerRowClick(row, col.key)">{{ row[col.key] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <DataSummary :visible.sync="showDlg" :title="titleDlg" :columns="columnsDlg" :dataItem.sync="dataItem" />
+  </div>
+</template>
+
+<script>
+import { dataMainInterface } from "@/api/api.js";
+import DataSummary from "./components/DataSummary.vue";
+import { tableConfigs, tableDlgTitle } from "./configdata.js";
+export default {
+  components: { DataSummary },
+  data() {
+    const currentYear = new Date().getFullYear() + "";
+    return {
+      timeRange: [currentYear, currentYear],
+      timePick: "",
+      monthType: "季度",
+      monthLabel: [
+        {
+          label: "季度",
+        },
+        {
+          label: "半年度",
+        },
+        {
+          label: "年度",
+        },
+      ],
+      selectedFilters: localStorage.getItem("userName") == "梁春悦6" ? ["续约"] : ["新签", "续约", "收入"], // 用户选择的筛选项
+      // 示例数据(与后端返回的 key 对应)
+      tableData: [],
+      // 扁平化后的数据
+      flattenedData: [],
+      showDlg: false,
+      titleDlg: "",
+      columnsDlg: [],
+      salesArrRai: [], //开拓者销售
+      pathfinderSales: [], //选中的开拓者销售
+      salesArrProps: {
+        multiple: true,
+        value: "AdminId",
+        label: "RealName",
+        children: "ChildrenList",
+      },
+      serviceGroupSales: [], //服务组销售
+      serviceGroupSalesAct: [], //选中的服务组销售
+      pathfinderSwitch: false, //开拓者开关
+      serviceGroupSwitch: false, //服务组开关
+      dataItem: {}, //数据项
+    };
+  },
+  methods: {
+    /* 选择时间后的处理 */
+    dateChange() {
+      this.$nextTick(() => {
+        if (this.timeRange.length) this.timePick = this.timeRange[0];
+        this.getDataList();
+      });
+    },
+    // 处理结束年份变化的逻辑
+    disabledDate(time) {
+      if (this.timePick) {
+        const minTime = +this.timePick;
+        const maxTime = +this.timePick + 4; // 结束年份最大为开始年份限制5年   +4
+        return this.$moment(time).format("YYYY") < minTime || this.$moment(time).format("YYYY") > maxTime;
+      }
+    },
+    // 选了时间的事件
+    onPick(date) {
+      this.timePick = this.$moment(date).format("YYYY");
+    },
+    // 获取表格数据
+    async getDataList() {
+      let AdminId = this.pathfinderSales.map((item) => item[item.length - 1]).join(",");
+      let ServiceAdminId = this.serviceGroupSalesAct.map((item) => item[item.length - 1]).join(",");
+      let params = {
+        StartYear: this.timeRange[0],
+        EndYear: this.timeRange[1],
+        DataType: this.monthType,
+        AdminId,
+        ServiceAdminId,
+        DevelopButton: this.pathfinderSwitch,
+        ServerButton: this.serviceGroupSwitch,
+      };
+      const res = await dataMainInterface.getRaiDataSummary(params);
+      this.tableData = res.Data.List;
+      this.flattenedData = this.tableData.flatMap((item) => item.DataList.map((row) => ({ ...row, DataType: item.DataType })));
+    },
+    // 处理合并行
+    mergeRows({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0) {
+        // 只合并 DataType (第1列)
+        const currentType = row.DataType;
+        const prevType = rowIndex > 0 ? this.flattenedData[rowIndex - 1].DataType : null;
+
+        if (rowIndex === 0 || currentType !== prevType) {
+          // 计算 rowspan(找到相同 DataType 的总行数)
+          const rowspan = this.flattenedData.filter((item) => item.DataType === currentType).length;
+          return { rowspan, colspan: 1 };
+        } else {
+          return { rowspan: 0, colspan: 0 };
+        }
+      }
+    },
+    // 点击表格
+    handlerRowClick(row, key) {
+      this.showDlg = true;
+      this.dataItem = row;
+      this.titleDlg = tableDlgTitle[key];
+      this.columnsDlg = tableConfigs[key];
+    },
+    // 点击头部筛选项
+    toggleMonth(key) {
+      if (this.monthType !== key) {
+        this.monthType = key;
+        this.getDataList();
+      }
+    },
+    // 点击了标签
+    toggleFilter(item) {
+      // 维护固定顺序的参照数组
+      const fixedOrder = ["新签", "续约", "收入"];
+      if (this.selectedFilters.includes(item)) {
+        // 移除时直接过滤
+        this.selectedFilters = this.selectedFilters.filter((key) => key !== item);
+      } else {
+        // 添加时直接推入数组
+        this.selectedFilters.push(item);
+      }
+
+      // 按照固定顺序重新排序
+      this.selectedFilters = fixedOrder.filter((key) => this.selectedFilters.includes(key));
+      this.getDataList();
+    },
+    /* 获取权益销售 */
+    getSaleRai() {
+      dataMainInterface.getListRaiSellerServer().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArrRai = res.Data.List;
+          this.serviceGroupSales = res.Data.ListServer;
+        }
+      });
+    },
+    salesChangeHandedl() {
+      this.getDataList();
+    },
+  },
+  computed: {
+    // 计算动态表头
+    dynamicColumns() {
+      let columns = [];
+      // 判断是否同时选择了新签和续约
+      const hasBoth = this.selectedFilters.includes("新签") && this.selectedFilters.includes("续约");
+
+      this.selectedFilters.forEach((key) => {
+        if (this.filterOptions[key]) {
+          this.filterOptions[key].forEach((field) => {
+            // 如果是续约分类的特殊字段
+            if (key === "续约" && ["SignedClientCount", "AverageRevenueCount"].includes(field.key)) {
+              // 仅在同时选择新签和续约时显示
+              if (!hasBoth) return;
+            }
+            columns.push({ label: field.label, key: field.key, tooltip: field.tooltip });
+          });
+        }
+      });
+      return columns;
+    },
+    // 开关选择是否禁用
+    isSwitchDisabled() {
+      return this.pathfinderSales.length || this.serviceGroupSalesAct.length;
+    },
+    // 筛选项映射的表头字段(新增后端 key)
+    filterOptions() {
+      let useName = localStorage.getItem("userName");
+      let obj = {
+        新签: [
+          { label: "新增试用", key: "AddTrialCount", tooltip: "新增试用客户的时间,包含在所选时间段内的客户数(包括新建和领取流失)" },
+          { label: "新签合同(金额/数量)", key: "NewContractData", tooltip: "起始时间在所选时间段内的新签合同(第一份合同起始时间一年内的再次签约仍属于新签合同)" },
+        ],
+        续约: [
+          { label: "到期合同(金额/数量)", key: "ExpiredContractData", tooltip: "结束时间在所选时间段内的合用" },
+          { label: "续约合同(金额/数量)", key: "RenewedContractData", tooltip: "起始时间在所选时间段内的续约合同(第一份合同起始时间一年以后的再次签约均属于续约合同)" },
+          { label: "续约率(金额/客户)", key: "RenewalRateData", tooltip: "续约合同/到期合同" },
+          { label: "确认不续约合同(金额/数量)", key: "ConfirmedNoRenewalContractData", tooltip: "已确认不续约的到期合同" },
+          { label: "确认不续约率(金额/客户)", key: "ConfirmNonRenewalRateData", tooltip: "确认不续约合同(剔除非业务不续约)/到期合同" },
+          { label: "签约客户数量", key: "SignedClientCount", tooltip: "新签和续约的客户数" },
+          { label: "客单价", key: "AverageRevenueCount", tooltip: "新签合同和续约合同的总金额/签约客户数量" },
+        ],
+        收入: [
+          { label: "开票金额", key: "InvoiceAmountCount", tooltip: "财务系统中已经登记开票的金额" },
+          { label: "到款金额", key: "PaymentReceivedCount", tooltip: "财务系统中已经登记到账的金额" },
+          { label: "未到款比例", key: "UnpaidRatioCount", tooltip: "开票金额-到款金额 / 开票金额" },
+          { label: "新客开票", key: "NewCustomerInvoicingCount", tooltip: "财务系统中已经登记开票的新签合同金额" },
+          { label: "新客到款", key: "NewCustomerPaymentsReceivedCount", tooltip: "财务系统中已经登记开票的新签合同金额" },
+        ],
+      };
+      return useName == "梁春悦6" ? { 续约: obj.续约 } : obj;
+    },
+  },
+  mounted() {
+    this.getDataList();
+    this.getSaleRai();
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.data-summary-container {
+  .data-summary-top {
+    box-sizing: border-box;
+    height: 40px;
+    border: #dcdfe6 1px solid;
+    border-radius: 4px;
+    margin-right: 20px;
+    overflow: hidden;
+  }
+  .button-sty {
+    display: inline-block;
+    text-align: center;
+    line-height: 40px;
+    width: 120px;
+    height: 40px;
+    cursor: pointer;
+    &:nth-child(2) {
+      border-left: 1px solid #dcdfe6;
+      border-right: 1px solid #dcdfe6;
+    }
+  }
+  .act {
+    background-color: #409eff !important;
+    color: #fff !important;
+  }
+  .dataReport-main {
+    padding: 20px 20px 80px;
+    background: #fff;
+    margin-top: 20px;
+    border: 1px solid #ececec;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+    .btn-filter {
+      background-color: #eaf3fe;
+      color: #333;
+    }
+    .switch-box {
+      display: flex;
+      align-items: center;
+      span {
+        flex-shrink: 0;
+        display: inline-block;
+        margin: 0 10px 0 20px;
+      }
+    }
+  }
+}
+.dete-partition {
+  display: inline-block;
+  margin: 0 10px;
+}
+</style>

+ 34 - 0
src/views/ficc_manage/chapterVariety.vue

@@ -48,6 +48,12 @@
             label="未选中icon"
             prop="UnselectedIcon"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>未选中icon</span>
+              <el-tooltip class="item" effect="dark" content="晨/周报PC端章节详情下方品种未选中样式" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -78,6 +84,12 @@
             label="选中icon"
             prop="selectedIcon"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>选中icon</span>
+              <el-tooltip class="item" effect="dark" content="晨/周报PC端章节详情下方品种选中样式" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -108,6 +120,12 @@
             label="带字icon"
             prop="wordIcon"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>带字icon</span>
+              <el-tooltip class="item" effect="dark" content="晨/周报移动端章节详情下方品种样式" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -138,6 +156,12 @@
             label="章节配图"
             prop="bgImg"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>章节配图</span>
+              <el-tooltip class="item" effect="dark" content="后台写报告展示的章节配图" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -363,4 +387,14 @@ export default {
     }
   }
 }
+.item-label-wrap{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  flex-wrap: wrap;
+  .tip-cion{
+    width: 16px;
+    height: 16px;
+  }
+}
 </style>

+ 41 - 1
src/views/ficc_manage/reportVariety.vue

@@ -50,7 +50,7 @@
           ref="aeForm"
           label-position="left"
           hide-required-asterisk
-          label-width="100px"
+          label-width="120px"
         >
           <el-form-item
             prop="showType"
@@ -153,6 +153,12 @@
             v-if="aeForm.parent_id == 0"
             prop="YbFiccIcon"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>FICC页icon</span>
+              <el-tooltip class="item" effect="dark" content="移动端研报列表该分类报告icon" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -184,6 +190,12 @@
             v-if="aeForm.parent_id == 0 && aeForm.showType !== 2"
             prop="YbRightBanner"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>报告合集配图</span>
+              <el-tooltip class="item" effect="dark" content="PC端该研报详情右侧报告合集配图" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -215,6 +227,12 @@
             prop="YbShareBgImg"
             v-if="aeForm.parent_id == 0"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>分享链接配图</span>
+              <el-tooltip class="item" effect="dark" content="该报告转发分析链接中的配图" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -248,6 +266,12 @@
             v-if="aeForm.parent_id != 0 && (parentIsList || parentIsVariety)"
             prop="YbListImg"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>列表背景图</span>
+              <el-tooltip class="item" effect="dark" content="进入该报告的一级分类列表,报告所在的二级分类配图" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -280,6 +304,12 @@
             prop="YbShareBgImg_"
             v-if="aeForm.parent_id != 0 && (parentIsList || parentIsVariety)"
           >
+            <span slot="label" class="item-label-wrap">
+              <span>分享链接配图</span>
+              <el-tooltip class="item" effect="dark" content="该报告转发分析链接中的配图" placement="top">
+                 <img src="../../assets/img/icons/black_tip.png" class="tip-cion">
+              </el-tooltip>
+            </span>
             <input
               type="file"
               size="small"
@@ -823,4 +853,14 @@ export default {
     }
   }
 }
+.item-label-wrap{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  flex-wrap: wrap;
+  .tip-cion{
+    width: 16px;
+    height: 16px;
+  }
+}
 </style>

+ 5 - 4
src/views/rai_manage/activityManage/activityManage.vue

@@ -71,7 +71,8 @@
               <p :class="row.PublishStatus == 3 ? 'grey-color' : 'editsty'" @click="editBtn(row.ActivityId, row.PublishStatus)">编辑</p>
               &nbsp;&nbsp;
               <p class="deletesty" v-if="row.PublishStatus == 0 && tabsPitchon == 0" @click="operationBtn(row.ActivityId, '删除')">删除</p>
-              <p class="editsty" v-if="row.IsShowSigninButton" @click="handleDownLoadImg(row)">下载签到码</p>
+              <p class="editsty" v-if="row.IsShowSigninButton" @click="handleDownLoadImg(row, '签到')">下载签到码</p>
+              <p class="editsty" v-if="row.ActiveState == 1 && !isResearch" @click="handleDownLoadImg(row, '详情')">下载小程序码</p>
               <p v-if="row.ChartPermissionId === 31 && tabsPitchon == 0 && row.PublishStatus == 1" class="editsty" @click="overheadHandler(row.ActivityId, '置顶')">
                 &nbsp;&nbsp;{{ row.TopTime == 0 ? "置顶" : "取消置顶" }}
               </p>
@@ -307,10 +308,10 @@ export default {
       this.dialogVisible = true;
     },
     // 下载图片
-    handleDownLoadImg(row) {
+    handleDownLoadImg(row, type) {
       let img = new Image();
       img.setAttribute("crossOrigin", "anonymous");
-      img.src = row.SigninImg;
+      img.src = type == "签到" ? row.SigninImg : row.XcxDetailImg;
       img.onload = () => {
         let canvas = document.createElement("canvas");
         canvas.width = img.width;
@@ -319,7 +320,7 @@ export default {
         context.drawImage(img, 0, 0, img.width, img.height);
         let dataURL = canvas.toDataURL("image/png", 1);
         const a = document.createElement("a");
-        a.setAttribute("download", "签到码.png");
+        a.setAttribute("download", `${row.ActivityName}签到码.png`);
         a.style.display = "none";
         a.href = dataURL;
         document.body.appendChild(a);

+ 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();
             }
           }

+ 2 - 3
src/views/rai_manage/cygxManage/components/lableDlg.vue

@@ -11,7 +11,7 @@
           添加活动
         </div>
       </div>
-      <div class="text-content" v-else>{{ visibleText }}</div>
+      <div class="text-content" v-else v-html="visibleText"></div>
       <span slot="footer" class="dialog-footer">
         <template v-if="dataRegular.TagType == 1">
           <el-button @click="handleClose">取 消</el-button>
@@ -58,7 +58,7 @@ export default {
           : this.dataRegular.TagType == 4
           ? "所有问答系列音频"
           : this.dataRegular.TagType == 5
-          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研,策略-每日复盘,固收-债市复盘"
+          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研,策略-每日复盘<br/>固收-债市复盘,消费-产业跟踪"
           : "";
       return str;
     },
@@ -165,7 +165,6 @@ export default {
 .lable-add-content {
   .text-content {
     width: 620px;
-    height: 40px;
     line-height: 40px;
     border-radius: 4px;
     border: 1px solid #dcdfe6;

+ 110 - 12
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"
@@ -40,30 +65,54 @@
 					</span>
 
 					<span v-else-if="item.key === 'company'">
-						{{ row.CooperationName || row.CompanyName }} <span v-if="fromType == 'seller' || fromType == 'special'">{{`(${row.CompanyStatus})`}} </span>
+						{{ row.CooperationName || row.CompanyName }} <span v-if="(fromType == 'seller' || fromType == 'special') && row.CompanyStatus">{{`(${row.CompanyStatus})`}} </span>
 
-						<el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row.CompanyId)" popper-class="company-tip-poper">
+						<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;">开通品种:{{companyInfo.PermissionName}}</p>
-								<p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</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;
@@ -130,13 +192,18 @@ export default {
 					试用路演: 'try_out',
 					正式路演: 'formal',
 					公开会议: 'meeting',
+					路演: 'road_show',
+					沙龙: 'salon',
 				}
+				
 				roadshowInterence.statisticDetailList({
 					DataType: typeMapObj[key] && typeMapObj[key],
 					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;
 
@@ -151,16 +218,24 @@ export default {
 
 		/* 取消 */
 		cancel() {
+			this.statusType=this.hasQustion?1:0
+			this.regionValue=-1
 			this.$emit('update:isShow', false);
 		},
 
 		/* 获取客户信息 */
-    async getCompanyInfo(CompanyId) {
-      const { Data }  = await roadshowInterence.componyDetail({ CompanyId });
+    async getCompanyInfo(row) {
+      const { Data }  = await roadshowInterence.componyDetail({ 
+		CompanyId:row.CompanyId,
+		RsReportRecordId:row.RsReportRecordId,
+		CompanyType:this.form.departmentType,
+		SellerId:row.SellerId,
+		EnglishCompany:row.EnglishCompany
+		});
       this.companyInfo = Data;
     },
 
-		initState() {
+	initState() {
 			const dynamic_column = this.fromType === 'researcher' ? {
 				label: '发起人',
 				key: 'SellerName',
@@ -213,12 +288,35 @@ 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(()=>{
 				// 滚动条高度归零
 				this.$refs.tableRef && (this.$refs.tableRef.$el.querySelector('.el-table__body-wrapper').scrollTop=0)
 			})
-		}
+	},
+	// 处理下 权益下面 没有合作方的表格
+	tableColumnsHandler(){
+	let arr = this.tableColumns.filter(item=> !(this.form.departmentType && this.form.departmentType=='权益' && item.label =='合作方'))
+	 return arr
+	}
 	},
 	created() {},
 	mounted() {},

+ 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>

+ 319 - 184
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;
     },
 
@@ -580,10 +697,14 @@ export default {
 
     /* 编辑活动 或事项 */
     editActivityHandle(row) {
+      //编辑活动
       this.isRaiEditType ='RaiEdit'
       if(this.default_tab==5){
         this.editMatterHandle(row);
       }else{
+        if(!row.RsMattersId && row.ActivityType === '内部会议') {
+           this.resubmitData = this.editInfoBack(row,2);
+        } 
         this.raiEditMatterHandle(row)
       }
     },
@@ -699,11 +820,11 @@ export default {
                   partnersName: CooperationName, // 合作方名称
                   activityClass: ActivityCategory, // 活动类别
                   District: District || '',
-
+                  
                   selectResearchers: [
                     // 选择的研究员
                     {
-                      researcherId: Number(ResearcherId),
+                      researcherId: ResearcherId.split(',').length > 1 ? ResearcherId.split(',').map(item => Number(item)) : Number(ResearcherId),
                       startDate: new Date(StartDate),
                       startTime: new Date(`${StartDate} ${StartTime}`),
                       endDate: new Date(EndDate),
@@ -711,9 +832,13 @@ export default {
                     },
                   ],
                 };
-                this.edit_id = RsCalendarId;
-                this.edit_rs_id = RsCalendarResearcherId;
-                this.isActivityCellDiaShow = true;
+        this.edit_id = RsCalendarId;
+        this.edit_rs_id = RsCalendarResearcherId;
+        if(!RsMattersId && ActivityType === '内部会议') {
+          this.isActivityBtnDiaShow = true;
+        }else {
+          this.isActivityCellDiaShow = true;
+        }
     },
     /* 编辑事项 */
     editMatterHandle({ RsMattersId,StartDate,StartTime,EndDate,EndTime,MatterContent }) {
@@ -760,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 []

+ 21 - 0
src/views/roadshow_manage/statistics/index.scss

@@ -84,4 +84,25 @@
 			}
 		}
 	}
+	.tabs-content {
+		display:flex;
+		align-items: center;
+		margin-bottom: 20px;
+		.item {
+			display:block;
+			margin-right: 60px;
+			font-size: 18px;
+			padding-bottom: 6px;
+			border-bottom: 2px solid rgba(255, 255, 255, 0);
+			cursor: pointer;
+			color: #999999;
+		}
+		.item-act {
+			border-bottom: 2px solid #409EFF;
+				color: #409EFF;
+		}
+	}
+	.rai_thead-rs {
+		width: 120px;
+	}
 }

+ 73 - 9
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)})`,
@@ -23,14 +23,35 @@ export default {
 			diaTitle: '路演详情',
 			datalist:[],//表格数据
 			totalGroupArr: [],//总合计列表
+
+			departmentTabs:[{label:'ficc',val:'ficc'},{label:'权益',val:'权益'}],
+			departmentAct:'ficc'
 		}
 	},
+	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) {
-			if(tab === this.default_tab) return
+			// if(tab === this.default_tab) return
 			$('.table-body-wrapper')[0].scrollTop = 0;
 			this.default_tab = tab;
 			switch(tab) {
@@ -61,9 +82,15 @@ 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.tableTheadColumns = this.departmentTheadColumns;
 					break;
 			}
 
@@ -80,10 +107,11 @@ export default {
 
 		/* 处理数据结构 便于页面渲染 userid 时间用于弹窗获取列表*/
 		filterTableData(data,userid= '') {
-			let list = data.map(item => ([
+			let list = this.departmentAct == 'ficc' ? data.map(item => ([
 				{
 					key: '试用路演',
 					value: item.TryOutNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -91,6 +119,7 @@ export default {
 				{
 					key: '正式路演',
 					value: item.FormalNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -102,6 +131,22 @@ export default {
 					endDate: item.EndDate,
 					userid
 				}
+			])) :data.map(item => ([
+				{
+					key: '路演',
+					value: item.RoadShowNum,
+					askNum:item.AskNum,
+					startDate: item.StartDate,
+					endDate: item.EndDate,
+					userid
+				},
+				{
+					key: '沙龙',
+					value: item.SalonNum,
+					startDate: item.StartDate,
+					endDate: item.EndDate,
+					userid
+				},
 			]))
 			
 			return list.flat(Infinity);
@@ -111,12 +156,13 @@ export default {
 		openDiaHandle({ startDate,endDate,userid,value,key }) {
 			if(value === 0) return;
 
-			this.diaTitle = key === '公开会议' ? `${key}详情` : '路演详情';
+			this.diaTitle = key === '路演' || key === '沙龙' || key === '公开会议' ? `${key}详情` : '路演详情';
 			this.dialogForm = {
 				startDate,
 				endDate,
 				userid,
-				key
+				key,
+				departmentType:this.departmentAct
 			}
 			this.isShowDia = true;
 		},
@@ -132,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') {
@@ -141,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;
 			}
@@ -150,9 +207,16 @@ export default {
 		/* 选择日期改变清空高亮按钮 */
 		dateChange() {
 			this.default_tab = '';
-			this.tableTheadColumns = ['试用路演','正式路演','公开会议'];
+			this.tableTheadColumns = this.departmentTheadColumns;
 
 			this.getTableData();
+		},
+		// 头部的点击事件
+		tabsHandler(item) {
+			// this.default_tab = '周度统计表';
+			this.departmentAct = item.val;
+			this.changeTabHandle('周度统计表')
+			// this.getTableData();
 		}
 	}
 }

+ 102 - 75
src/views/roadshow_manage/statistics/researcher.vue

@@ -1,5 +1,8 @@
 <template>
 	<div class="statistic-container">
+		<div class="tabs-content">
+			<span @click="tabsHandler(item)" :class="['item',departmentAct==item.val && 'item-act']" v-for="item in departmentTabs" :key="item.val">{{item.label}}</span>
+		</div>
 		<div class="frequency-cont">
 			<ul class="frequency-ul">
 				<li v-for="tab in staticTabs" :key="tab" :class="{act: tab=== default_tab}" @click="changeTabHandle(tab)">{{ tab }}</li>
@@ -12,85 +15,89 @@
 			:clearable="false"
 			@change="dateChange"
 			placeholder="请选择统计时间"/>
-		</div>
-		<div class="table-cont" v-show="dataLoading">
-			<table>
-				<thead>
-					<tr>
-						<td rowspan="2" class="thead-rs">组别</td>
-						<td rowspan="2" class="thead-rs">研究员</td>
-						<td 
-							:colspan="['周度统计表','月度统计表'].includes(default_tab) ? 3 : 1" 
-							v-for="item in tableTheadColumns" 
-							:key="item" 
-							class="head-column"
-						>
-							{{item}}
-						</td>	
-					</tr>
-					<tr v-if="['月度统计表'].includes(default_tab)">
-						<template v-for="(item,index) in new Array(4)">
-							<td :key="index+'_0'">试用路演</td>
-							<td :key="index+'_1'">正式路演</td>
-							<td :key="index+'_2'">公开会议</td>
-						</template>
-					</tr>
-					<tr v-if="['周度统计表'].includes(default_tab)">
-						<template v-for="(item,index) in new Array(3)">
-							<td :key="index+'_0'">试用路演</td>
-							<td :key="index+'_1'">正式路演</td>
-							<td :key="index+'_2'">公开会议</td>
-						</template>
-					</tr>
-				</thead>
-			</table>
 
+			<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">
 				<table>
+					<thead>
+						<tr>
+							<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"
+								v-for="item in tableTheadColumns" 
+								:key="item" 
+								class="head-column"
+							>
+								{{item}}
+							</td>	
+						</tr>
+						<tr v-if="['月度统计表'].includes(default_tab)">
+							<template v-for="(item,index) in new Array(4)">
+								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
+							</template>
+						</tr>
+						<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>
+						</tr>
+					</thead>
 					<tbody v-for="item in datalist" :key="item.Name">
-							<tr>
-								<td :rowspan="item.Item.length+1" class="thead-rs">{{item.Name}}</td>
-							</tr>
-
-							<tr v-for="rs in item.Item" :key="rs.AdminId">
-								<td class="thead-rs">{{rs.Name}}</td>
-
-								<td
-									class="data-cell"
-									v-for="(data,data_key) in rs.dataArr" 
-									:key="data_key" 
-									@click="openDiaHandle(data)"
-								>
-									{{ data.value !== 0 ? data.value : '' }}
-								</td>
-
-							</tr>
-							
-							<tr>
-								<td colspan="2">组合计</td>
-								<td 
-									v-for="(group_data,group_data_key) in item.subGroupArr" 
-									:key="group_data_key"
-								>
-									{{ group_data.value !== 0 ? group_data.value : '' }}
-								</td>
-
-							</tr>
-					</tbody>
-
-						<tfoot>
-							<tr>
-								<td colspan="2">总合计</td>
-								<td 
-									v-for="(total_data,total_data_key) in totalGroupArr" 
-									:key="total_data_key"
-								>
-									{{  total_data.value !== 0 ? total_data.value : '' }}
-								</td>
-							</tr>
-						</tfoot>
+								<tr>
+									<td :rowspan="item.Item.length+1" class="thead-rs">{{item.Name}}</td>
+								</tr>
+
+								<tr v-for="rs in item.Item" :key="rs.AdminId">
+									<td class="thead-rs">{{rs.Name}}</td>
+
+									<td
+										class="data-cell"
+										v-for="(data,data_key) in rs.dataArr" 
+										:key="data_key" 
+										@click="openDiaHandle(data)"
+									>
+										{{ formatTableValue(data) }}
+									</td>
+
+								</tr>
+								
+								<tr>
+									<td colspan="2">组合计</td>
+									<td 
+										v-for="(group_data,group_data_key) in item.subGroupArr" 
+										:key="group_data_key"
+									>
+										{{ group_data.value !== 0 ? group_data.value : '' }}
+									</td>
+
+								</tr>
+						</tbody>
+
+							<tfoot>
+								<tr>
+									<td colspan="2">总合计</td>
+									<td 
+										v-for="(total_data,total_data_key) in totalGroupArr" 
+										:key="total_data_key"
+									>
+										{{  total_data.value !== 0 ? total_data.value : '' }}
+									</td>
+								</tr>
+							</tfoot>
 				</table>
-			</div>	
+			</div>
 		</div>
 
 		<!-- 详情弹窗 -->
@@ -99,6 +106,7 @@
 			:title="diaTitle"
 			:form="dialogForm"
 			fromType="researcher"
+			:hasQustion="['试用路演','正式路演','路演'].includes(dialogForm.key)"
 		/>
 
 	</div>
@@ -112,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 {
 		};
@@ -122,9 +147,10 @@ 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
 			}).then(res => {
 				const { Data,Ret } = res;
 				if(Ret !== 200) return
@@ -151,6 +177,7 @@ export default {
 
 				const dynamic_width = {
 					'周度统计表': '9%',
+					'季度统计表': '9%',
 					'月度统计表': '7%',
 				}
 				this.$nextTick(() => {

+ 24 - 52
src/views/roadshow_manage/statistics/seller.vue

@@ -1,5 +1,8 @@
 <template>
 	<div class="statistic-container">
+		<div class="tabs-content">
+			<span @click="tabsHandler(item)" :class="['item',departmentAct==item.val && 'item-act']" v-for="item in departmentTabs" :key="item.val">{{item.label}}</span>
+		</div>
 		<div class="frequency-cont">
 			<ul class="frequency-ul">
 				<li v-for="tab in staticTabs" :key="tab" :class="{act: tab=== default_tab}" @click="changeTabHandle(tab)">{{ tab }}</li>
@@ -14,45 +17,14 @@
 			placeholder="请选择统计时间"/>
 		</div>
 		<div class="table-cont" v-show="dataLoading">
-			<!-- <table>
-				<thead>
-					<tr>
-						<td rowspan="2" class="thead-rs">组别</td>
-						<td rowspan="2" class="thead-rs">销售</td>
-						<td
-							:colspan="['周度统计表','月度统计表'].includes(default_tab) ? 3 : 1"
-							v-for="item in tableTheadColumns" 
-							:key="item" 
-							class="head-column"
-						>
-							{{item}}
-						</td>	
-					</tr>
-					<tr v-if="['月度统计表'].includes(default_tab)">
-						<template v-for="(item,index) in new Array(4)">
-							<td :key="index+'_0'">试用路演</td>
-							<td :key="index+'_1'">正式路演</td>
-							<td :key="index+'_2'">公开会议</td>
-						</template>
-					</tr>
-					<tr v-if="['周度统计表'].includes(default_tab)">
-						<template v-for="(item,index) in new Array(3)">
-							<td :key="index+'_0'">试用路演</td>
-							<td :key="index+'_1'">正式路演</td>
-							<td :key="index+'_2'">公开会议</td>
-						</template>
-					</tr>
-				</thead>
-			</table>	 -->
-
 			<div class="table-body-wrapper">
 				<table>
 					<thead>
 						<tr>
-							<td rowspan="2" class="thead-rs">组别</td>
-							<td rowspan="2" class="thead-rs">销售</td>
+							<td rowspan="2" :class="['thead-rs',departmentAct == '权益' && !['周度统计表','月度统计表'].includes(default_tab) && 'rai_thead-rs']">组别</td>
+							<td rowspan="2" :class="['thead-rs',departmentAct == '权益' && !['周度统计表','月度统计表'].includes(default_tab) && 'rai_thead-rs']">销售</td>
 							<td
-								:colspan="['周度统计表','月度统计表'].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"
@@ -62,16 +34,12 @@
 						</tr>
 						<tr v-if="['月度统计表'].includes(default_tab)">
 							<template v-for="(item,index) in new Array(6)">
-								<td :key="index+'_0'">试用路演</td>
-								<td :key="index+'_1'">正式路演</td>
-								<td :key="index+'_2'">公开会议</td>
+								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
 							</template>
 						</tr>
 						<tr v-if="['周度统计表'].includes(default_tab)">
 							<template v-for="(item,index) in new Array(6)">
-								<td :key="index+'_0'">试用路演</td>
-								<td :key="index+'_1'">正式路演</td>
-								<td :key="index+'_2'">公开会议</td>
+								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
 							</template>
 						</tr>
 					</thead>
@@ -84,22 +52,22 @@
 							</tr>
 							<template v-if="item.Item.length">
 								<tr v-show="item.showDetail">
-								<td :rowspan="item.Item.length+1" class="thead-rs">{{item.Name}}</td>
-							</tr>
+									<td :rowspan="item.Item.length+1" class="thead-rs">{{item.Name}}</td>
+								</tr>
 
-							<tr v-for="rs in item.Item" :key="rs.AdminId" v-show="item.showDetail">
-								<td class="thead-rs">{{rs.Name}}</td>
+								<tr v-for="rs in item.Item" :key="rs.AdminId" v-show="item.showDetail">
+									<td class="thead-rs">{{rs.Name}}</td>
 
-								<td class="data-cell" v-for="(data,data_key) in rs.dataArr" :key="data_key" @click="openDiaHandle(data)">
-									{{ data.value !== 0 ? data.value : '' }}
-								</td>
-								
-							</tr>
+									<td class="data-cell" v-for="(data,data_key) in rs.dataArr" :key="data_key" @click="openDiaHandle(data)">
+										{{ data.value !== 0 ? data.value : '' }}
+									</td>
+									
+								</tr>
 							</template>
 					</tbody>
 					<tfoot>
 						<tr>
-							<td colspan="2">ficc总合计</td>
+							<td colspan="2">{{departmentAct}}总合计</td>
 							<td v-for="(total_data,total_data_key) in totalGroupArr" :key="total_data_key">
 								{{ total_data.value !== 0 ? total_data.value : '' }}
 							</td>
@@ -131,6 +99,7 @@ export default {
 	data () {
 		return {
 			Role:localStorage.getItem('Role') || '',
+			
 		};
 	},
 	methods: {
@@ -141,6 +110,7 @@ export default {
 				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month' : 'time_interval',
 				StartDate: this.select_date ? this.select_date[0] : '',
 				EndDate: this.select_date ? this.select_date[1] : '',
+				CompanyType: this.departmentAct,
 			}).then(res => {
 
 				const { Data,Ret } = res;
@@ -153,7 +123,7 @@ export default {
 				//处理数据结构
 				let data = _.cloneDeep(Data.List);
 				data.forEach(item => {
-					item.showDetail=false
+					item.showDetail = this.departmentAct == '权益' ? true : false;
 					let groupDataArr = this.filterTableData(item.RsReportRecordNumList);
 					this.$set(item,'subGroupArr',groupDataArr)
 
@@ -168,7 +138,8 @@ export default {
 				this.datalist = data;
 				this.dataLoading = true;
 			})
-		}
+		},
+
 	},
 	mounted() {
 		this.getTableData();
@@ -178,4 +149,5 @@ export default {
 <style lang='scss' scoped>
 *{ box-sizing: border-box;}
 @import './index.scss';
+
 </style>