Przeglądaj źródła

Merge branch 'master' into crm_15.4.1

bding 3 miesięcy temu
rodzic
commit
af95ae40dc

+ 12 - 0
src/api/modules/crmApi.js

@@ -1140,6 +1140,18 @@ const equityContacts = {
   getUserTableCompanyList: (params) => {
     return http.get("/cygx/user/table/companyList", params);
   },
+  // 交流反馈列表接口
+  userFeedbacklist:(params)=>{
+    return http.get("/cygx/user_feedback/list",params)
+  }, 
+  // 添加交流反馈接口
+  userFeedbackAdd:(params)=>{
+    return http.post("/cygx/user_feedback/add",params)
+  }, 
+  // 删除交流反馈接口
+  userFeedbackDel:(params)=>{
+    return http.post("/cygx/user_feedback/del",params)
+  }, 
 };
 
 /*

+ 8 - 8
src/api/modules/ficcApi.js

@@ -209,12 +209,12 @@ export const ficcManageInterface={
 	delSpeakerCheck:params=>{
 		return http.post('/yb/speaker/del_check',params)
 	},
-  //全时会议分享销售
-  qs_shareSeller:params=>{
-    return http.post('/yb/activity/qs_share2seller',params)
-  },
-  //进门到会分享销售
-  jm_shareSeller:params=>{
-    return http.post('/yb/activity/comein/share2seller',params)
-  }
+	//全时会议分享销售
+	qs_shareSeller:params=>{
+		return http.post('/yb/activity/qs_share2seller',params)
+	},
+	//进门到会分享销售
+	jm_shareSeller:params=>{
+		return http.post('/yb/activity/comein/share2seller',params)
+	}
 }

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

@@ -360,6 +360,14 @@ const roadshowInterence={
 	getResearcherBusinessTrip: params => {
 		return http.get('/roadshow/report/researcher/business_trip',params)
 	},
+	//标签搜索(研究员日历添加到会信息)
+	rai_serve_search_tag:params => {
+		return http.get('/cygx/rai_serve/search_tag_by_calendar',params)
+	},	
+	//校验是否属于策略固收接口
+	rai_serve_search_chcck_PermissionName:params => {
+		return http.get('/cygx/rai_serve/chcck_PermissionName',params)
+	},	
 }
 
 export {

+ 46 - 4
src/api/modules/statisticApi.js

@@ -396,17 +396,59 @@ const dataMainInterface = {
   */
   incrementalCompanyContractPercentageList:params => {
 	return http.get('/statistic_report/merge_company/company_contract_percentage/list',params);
-},
-incrementalCompanyContractPercentageListV2: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  
+  */
+  getRaiServeList:params => {
+	return http.get('/cygx/rai_serve/list',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  
+  */
+  getRaiServeBillList:params => {
+	return http.get('/cygx/rai_serve/bill_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);
+  },
 }
 
 export {

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

@@ -121,7 +121,12 @@ export default [
 				},
 				hidden: true
 			}, */
-
+			{
+				path: 'equityServiceStatistics',
+				component: () => import('@/views/dataReport_manage/equityServiceStatistics.vue'),
+				name: '权益服务统计',
+				hidden: false
+			},
 		]
 	},
 ]

+ 2 - 2
src/views/Home.vue

@@ -62,7 +62,7 @@
                   </template>
                   <el-menu-item
                     v-for="child in item.children"
-                    :index="child.path=='etaForum'?null:child.path"
+                    :index="child.path=='etaForum'?'etaForum':child.path"
                     :path="child.path"
                     :key="child.path"
                     v-show="!child.hidden"
@@ -925,7 +925,7 @@ export default {
       this.$router.push({ path: "/resetpsd" });
     },
     handleselect: function (a, b) {
-      
+
       // 清除筛选条件
       sessionStorage.removeItem('pickListBack');
       sessionStorage.removeItem('customSearchBack');

+ 4 - 0
src/views/custom_manage/contacts/compontents/chartItem.vue

@@ -25,6 +25,9 @@ export default {
       type: "string",
       default: "",
     },
+    activeTypeName: {
+      type: Number,
+    },
   },
   data() {
     return {
@@ -46,6 +49,7 @@ export default {
         Source: 4,
         PageSize: this.pageSize,
         CurrentIndex: this.page,
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.publicHaveMoveCompany = !res.Data.Paging.IsEnd;

+ 461 - 7
src/views/custom_manage/contacts/compontents/contactsColums.js

@@ -35,7 +35,7 @@ export const tableColums = (type) => {
         },
         {
           label: "阅读来源",
-          key: "RegisterPlatform",
+          key: "RegisterPlatformText",
           widthsty: 80,
         },
       ]
@@ -249,7 +249,124 @@ export const tableColums = (type) => {
           key: "CreateTime",
           // widthsty: 300,
         },
-    ]      
+      ]
+    : type === 11
+    ? [
+        {
+          label: "文章标题",
+          key: "Title",
+        },
+        {
+          label: "文章类型",
+          key: "SpecialType",
+          // widthsty: 200,
+        },
+        {
+          label: "标签",
+          key: "IndustryName",
+          // widthsty: 300,
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读时长",
+          key: "StopTime",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读来源",
+          key: "RegisterPlatformText",
+          // widthsty: 300,
+        },
+      ]
+    : type === 12
+    ? [
+        {
+          label: "文章标题",
+          key: "Title",
+        },
+        {
+          label: "文章类型",
+          key: "SpecialType",
+          // widthsty: 200,
+        },
+        {
+          label: "标签",
+          key: "IndustryName",
+          // widthsty: 300,
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+          // widthsty: 300,
+        },
+        {
+          label: "收藏时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+      ]
+    : type === 13
+    ? [
+        {
+          label: "专栏名称",
+          key: "Title",
+        },
+        {
+          label: "作者昵称",
+          key: "NickName",
+        },
+        {
+          label: "关注时间",
+          key: "CreateTime",
+        },
+        {
+          label: "已发布文章",
+          key: "ArticleNum",
+        },
+        {
+          label: "粉丝",
+          key: "FansNum",
+        },
+      ]
+    : type === 14
+    ? [
+        {
+          label: "反馈内容",
+          key: "KeyWord",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 15
+    ? [
+        {
+          label: "路演时间",
+          key: "ActivityTimeText",
+        },
+        {
+          label: "研究员",
+          key: "ResearcherName",
+        },
+        {
+          label: "路演形式",
+          key: "ActivityType",
+        },
+        {
+          label: "主题标签",
+          key: "LabelKeyWord",
+        },
+      ]
     : [];
 };
 
@@ -272,7 +389,7 @@ export const interactionColums = [
         label: "阅读时长",
         key: "StopTime",
         widthsty: 80,
-      }
+      },
     ],
   },
   {
@@ -407,10 +524,9 @@ export const organizationTableColums = (type) => {
         },
         {
           label: "阅读来源",
-          key: "RegisterPlatform",
+          key: "RegisterPlatformText",
           widthsty: 80,
         },
-        
       ]
     : type === 2
     ? [
@@ -673,7 +789,7 @@ export const organizationTableColums = (type) => {
         {
           label: "活动类型",
           key: "ActivityTypes",
-        },        
+        },
         {
           label: "相关产业",
           key: "SubjectNames",
@@ -688,6 +804,158 @@ export const organizationTableColums = (type) => {
           key: "CreateTime",
         },
       ]
+    : type === 11
+    ? [
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 130,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "文章标题",
+          key: "Title",
+        },
+        {
+          label: "文章类型",
+          key: "SpecialType",
+          // widthsty: 200,
+        },
+        {
+          label: "标签",
+          key: "IndustryName",
+          // widthsty: 300,
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读时长",
+          key: "StopTime",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读来源",
+          key: "RegisterPlatformText",
+          // widthsty: 300,
+        },
+      ]
+    : type === 12
+    ? [
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 130,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "文章标题",
+          key: "Title",
+        },
+        {
+          label: "文章类型",
+          key: "SpecialType",
+          // widthsty: 200,
+        },
+        {
+          label: "标签",
+          key: "IndustryName",
+          // widthsty: 300,
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+          // widthsty: 300,
+        },
+        {
+          label: "收藏时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+      ]
+    : type === 13
+    ? [
+        {
+          label: "姓名",
+          key: "RealName",
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        { label: "专栏名称", key: "Title" },
+        {
+          label: "作者昵称",
+          key: "NickName",
+        },
+        {
+          label: "关注时间",
+          key: "CreateTime",
+        },
+        {
+          label: "已发布文章",
+          key: "ArticleNum",
+        },
+        {
+          label: "粉丝",
+          key: "FansNum",
+        },
+      ]
+    : type === 14
+    ? [
+        {
+          label: "反馈人姓名",
+          key: "RealName",
+        },
+        {
+          label: "反馈内容",
+          key: "KeyWord",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 15
+    ? [
+        {
+          label: "姓名",
+          key: "RealName",
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "路演时间",
+          key: "ActivityTimeText",
+        },
+        {
+          label: "研究员",
+          key: "ResearcherName",
+        },
+        {
+          label: "路演形式",
+          key: "ActivityType",
+        },
+        {
+          label: "主题标签",
+          key: "LabelKeyWord",
+        },
+      ]
     : [];
 };
 
@@ -747,7 +1015,7 @@ export const wholeOrganizationTableColums = (type) => {
         },
         {
           label: "阅读来源",
-          key: "RegisterPlatform",
+          key: "RegisterPlatformText",
           widthsty: 80,
         },
       ]
@@ -1099,5 +1367,191 @@ export const wholeOrganizationTableColums = (type) => {
           key: "CreateTime",
         },
       ]
+    : type === 11
+    ? [
+        {
+          label: "公司名",
+          key: "CompanyName",
+          // widthsty: 200,
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 100,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+          // widthsty: 100,
+        },
+        {
+          label: "文章标题",
+          key: "Title",
+        },
+        {
+          label: "文章类型",
+          key: "SpecialType",
+          // widthsty: 200,
+        },
+        {
+          label: "标签",
+          key: "IndustryName",
+          // widthsty: 300,
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读时长",
+          key: "StopTime",
+          // widthsty: 300,
+        },
+        {
+          label: "阅读来源",
+          key: "RegisterPlatformText",
+          // widthsty: 300,
+        },
+      ]
+    : type === 12
+    ? [
+        {
+          label: "公司名",
+          key: "CompanyName",
+          // widthsty: 200,
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 100,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+          // widthsty: 100,
+        },
+        {
+          label: "文章标题",
+          key: "Title",
+        },
+        {
+          label: "文章类型",
+          key: "SpecialType",
+          // widthsty: 200,
+        },
+        {
+          label: "标签",
+          key: "IndustryName",
+          // widthsty: 300,
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+          // widthsty: 300,
+        },
+        {
+          label: "收藏时间",
+          key: "CreateTime",
+          // widthsty: 300,
+        },
+      ]
+    : type === 13
+    ? [
+        {
+          label: "公司名",
+          key: "CompanyName",
+          // widthsty: 200,
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+          // widthsty: 100,
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+          // widthsty: 100,
+        },
+        {
+          label: "专栏名称",
+          key: "Title",
+        },
+        {
+          label: "作者昵称",
+          key: "NickName",
+        },
+        {
+          label: "关注时间",
+          key: "CreateTime",
+        },
+        {
+          label: "已发布文章",
+          key: "ArticleNum",
+        },
+        {
+          label: "粉丝",
+          key: "FansNum",
+        },
+      ]
+    : type === 14
+    ? [
+        {
+          label: "客户名称",
+          key: "CompanyName",
+        },
+        {
+          label: "反馈人姓名",
+          key: "RealName",
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "反馈内容",
+          key: "KeyWord",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 15
+    ? [
+        {
+          label: "客户名称",
+          key: "CompanyName",
+        },
+        {
+          label: "姓名",
+          key: "RealName",
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "路演时间",
+          key: "ActivityTimeText",
+        },
+        {
+          label: "研究员",
+          key: "ResearcherName",
+        },
+        {
+          label: "路演形式",
+          key: "ActivityType",
+        },
+        {
+          label: "主题标签",
+          key: "LabelKeyWord",
+        },
+      ]
     : [];
 };

+ 32 - 0
src/views/custom_manage/contacts/compontents/details.scss

@@ -16,6 +16,38 @@
   }
 }
 
+.department-tabs {
+  display: flex;
+  flex-wrap: wrap;
+  margin: 20px 0 10px;
+  .item {
+    cursor: pointer;
+    background: #FFF;
+    border: 1px solid #DCDFE6;
+    font-weight: 500;
+    color: #606266;
+    text-align: center;
+    box-sizing: border-box;
+    position: relative;
+    cursor: pointer;
+    padding: 8px 20px;
+    font-size: 14px;
+  }
+  .item:first-child{
+    border-radius: 4px 0 0 4px;
+
+  }
+  .item:last-child{
+    border-left: none;
+    border-radius: 0 4px 4px 0;
+
+  }
+  .active {
+    background-color: #409eff;
+    color: #fff;
+  }
+}
+
 .tooltip-item {
   margin-left: 20px;
 }

+ 105 - 0
src/views/custom_manage/contacts/compontents/feedbackDlg.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="container-feedbackDlg">
+    <el-dialog v-dialogDrag :visible.sync="showFeedbackDlg" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center title="交流反馈">
+      <div>
+        <el-input type="textarea" :rows="3" placeholder="请输入反馈内容" v-model="feedbackText"> </el-input>
+        <div class="save-box">
+          <el-button type="primary" @click="addHandler">保存</el-button>
+        </div>
+        <el-table border :data="tableData" style="margin: 20px 0">
+          <el-table-column align="center" prop="Content" label="反馈内容"> </el-table-column>
+          <el-table-column align="center" prop="CreateTime" label="创建时间"> </el-table-column>
+          <el-table-column align="center" prop="date" label="操作">
+            <template slot-scope="{ row }">
+              <span class="deletesty" @click="deleteHandler(row)"> 删除</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { equityContacts } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {
+    showFeedbackDlg: {
+      type: Boolean,
+      default: false,
+    },
+    remindList: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      tableData: [],
+      feedbackText: "",
+    };
+  },
+  computed: {},
+  watch: {
+    showFeedbackDlg: {
+      handler(val) {
+        if (val) {
+          this.getDataList();
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    // 获取数据
+    async getDataList() {
+      const res = await equityContacts.userFeedbacklist({
+        UserId: this.remindList.UserId,
+      });
+      if (res.Ret === 200) {
+        this.tableData = res.Data.List || [];
+      }
+    },
+    // 删除
+    async deleteHandler(item) {
+      const res = await equityContacts.userFeedbackDel({
+        UserFeedbackId: item.UserFeedbackId,
+      });
+      if (res.Ret === 200) {
+        this.getDataList();
+      }
+    },
+    // 添加
+    async addHandler() {
+      if (!this.feedbackText) return this.$message.error("请输入内容");
+      const res = await equityContacts.userFeedbackAdd({
+        Content: this.feedbackText,
+        UserId: this.remindList.UserId,
+      });
+      if (res.Ret === 200) {
+        this.feedbackText = "";
+        this.getDataList();
+      }
+    },
+    cancelHandle() {
+      this.$emit("update:showFeedbackDlg", false);
+      this.$emit("update:remindList", {});
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.container-feedbackDlg {
+  .save-box {
+    margin: 20px auto;
+    display: flex;
+    justify-content: center;
+  }
+}
+</style>

+ 18 - 15
src/views/custom_manage/contacts/contactsList.vue

@@ -56,7 +56,7 @@
     <el-card>
       <el-table :data="tableData" style="width: 100%" border @sort-change="sortChangeHandle">
         <el-table-column align="center" prop="RealName" width="90" label="姓名"> </el-table-column>
-        <el-table-column align="center" prop="Mobile" width="130" label="手机号/邮箱">
+        <el-table-column align="center" prop="Mobile" width="110" label="手机号/邮箱">
           <template slot-scope="{ row }"> {{ row.Mobile || row.Email }} </template>
         </el-table-column>
         <el-table-column align="center" prop="CompanyName" label="公司名称">
@@ -64,20 +64,20 @@
             <span class="editsty" @click="goDetail(scope.row)">{{ scope.row.CompanyName }}</span></template
           >
         </el-table-column>
-        <el-table-column align="center" prop="Status" width="100" label="状态"> </el-table-column>
+        <el-table-column align="center" prop="Status" width="110" label="状态"> </el-table-column>
         <el-table-column align="center" prop="SellerName" width="110" label="所属销售"> </el-table-column>
         <el-table-column align="center" prop="IsMaker" width="80" label="是否KP">
           <template slot-scope="{ row }">
             {{ row.IsMaker == 1 ? "是" : "否" }}
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="RegisterTime" width="130" label="注册时间"> </el-table-column>
-        <el-table-column align="center" width="130" label="是否关注公众号">
+        <el-table-column align="center" prop="RegisterTime" width="110" label="注册时间"> </el-table-column>
+        <el-table-column align="center" width="120" label="是否关注公众号">
           <template slot-scope="{ row }">
             {{ row.IsSubscribeCygx == 1 ? "是" : "否" }}
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="InteractionNum" width="130" label="互动量" :render-header="renderHeader" sortable="custom">
+        <el-table-column align="center" prop="InteractionNum" width="110" label="互动量" :render-header="renderHeader" sortable="custom">
           <template slot-scope="{ row }">
             <span class="editsty" @click="lookInteraction(row, '个人')">{{ row.InteractionNum }}</span> /
             <el-popover trigger="hover" placement="right" @show="isShowOrganization(row)">
@@ -95,14 +95,7 @@
           <div slot="header" slot-scope="{}" style="text-align: center">标签</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)"
-              >
+              <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>
@@ -119,9 +112,11 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="" label="操作" width="100">
+        <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>
+            &nbsp;&nbsp;&nbsp;&nbsp;
+            <span class="editsty" @click="feedbackHandler(row)">交流反馈</span>
           </template>
         </el-table-column>
       </el-table>
@@ -154,6 +149,7 @@
     <InteractionDlg :interactionDlg.sync="interactionDlg" :interactionFrom="interactionFrom" />
     <label-dlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelChildren="labelChildren" :userLabel="userLabel" />
     <remind-dlg :isShowRemindDlg.sync="isShowRemindDlg" :remindList.sync="remindList" />
+    <FeedbackDlg :showFeedbackDlg.sync="showFeedbackDlg" :remindList.sync="remindList" />
   </div>
 </template>
 
@@ -164,9 +160,10 @@ import mDialog from "@/components/mDialog.vue";
 import InteractionDlg from "./compontents/interactionDlg.vue";
 import LabelDlg from "./compontents/labelDlg.vue";
 import RemindDlg from "./compontents/remindDlg.vue";
+import FeedbackDlg from "./compontents/feedbackDlg.vue";
 export default {
   name: "",
-  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg },
+  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg },
   props: {},
   data() {
     return {
@@ -222,6 +219,7 @@ export default {
       dlgLabelList: {}, //
       isShowRemindDlg: false, // 消息提醒的弹框
       remindList: {}, // 消息提醒的数据
+      showFeedbackDlg: false, // 交流反馈的弹框
     };
   },
   computed: {},
@@ -436,6 +434,11 @@ export default {
       this.dlgLabelList = row;
       this.isShowLabelDlg = true;
     },
+    // 点击了交流反馈
+    feedbackHandler(item) {
+      this.remindList = item;
+      this.showFeedbackDlg = true;
+    },
   },
   /* 页面跳转前记录参数 */
   beforeRouteLeave(to, from, next) {

+ 19 - 24
src/views/custom_manage/contacts/mixins/mutualAssistance.js

@@ -1,5 +1,5 @@
 import { screenList, meetingList } from "../compontents/contactsColums";
-import { customInterence, equityContacts } from "@/api/api.js";
+import { customInterence } from "@/api/api.js";
 
 var moment = require("moment");
 moment().format();
@@ -45,6 +45,11 @@ export const mutualMixin = {
       dialogVisibleActivity: false, //专项调研
       specialDetailId: null,
       dialogTitle: "",
+      typeList: [
+        { label: "权益", value: 1 },
+        { label: "研选", value: 2 },
+      ],
+      activeTypeName: 1,
     };
   },
   computed: {
@@ -54,6 +59,13 @@ export const mutualMixin = {
     meetingList() {
       return meetingList;
     },
+    showSelectBox() {
+      return this.activeName === 1 || this.activeName === 2 || this.activeName === 11 || this.activeName === 12;
+    },
+    tableColumsList() {
+      let arr = this.activeTypeName === 2 ? this.tableColums.filter((_) => _.key != "PermissionName") : this.tableColums;
+      return arr;
+    },
   },
   methods: {
     /* 获取销售 */
@@ -102,31 +114,14 @@ export const mutualMixin = {
     handleRowStyle(key) {
       const style = {
         Title: "color: #409eff; cursor: pointer",
-        ActivityName: "color: #409eff; cursor: pointer",
+        ActivityName: this.activeName == 1 || this.activeName == 8 ? "color: #409eff; cursor: pointer" : "",
       };
-      return style[key] && (this.activeName == 1 || this.activeName == 8) ? style[key] : "";
+      return style[key] ? style[key] : "";
     },
     /* 表格行的点击事件 */
     handleRowClick(row, key) {
       if (key === "Title") {
-        if (row.SpecialType > 0) {
-          let href = `${process.env.CYGX_WEB}/column/detail/${row.ArticleId}`;
-          window.open(href, "_blank");
-          return;
-        }
-        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");
-        }
+        window.open(row.HttpUrl, "_blank");
       } else if (key === "ActivityName" && this.activeName === 8) {
         this.themeDetails(row.ActivityId);
       }
@@ -143,9 +138,9 @@ export const mutualMixin = {
       } else if (key == "Source") {
         return row[key] == 1 ? "纪要" : row[key] == 2 ? "图表" : row[key] == 3 ? "纪要/图表" : row[key] == 4 ? "产业资源包" : row[key] == 5 ? "报告" : "活动";
       } else if (key == "ActivityType") {
-        return row[key] == 1 ? "线上" : `线下(${row["City"]})`;
-      } else if (key == "RegisterPlatform") {
-        return row[key] == 1 ? "小程序" : row[key] == 2 ? "网页版" : row[key] == 3 ? "策略平台" : "";
+        return row[key] == 1 ? "线上" : row["City"] ? `线下(${row["City"]})` : "线下";
+      } else if (key == "SpecialType") {
+        return row[key] == 1 ? "笔记" : row[key] == 2 ? "观点" : "";
       } else {
         return row[key];
       }

+ 52 - 6
src/views/custom_manage/contacts/mutualList.vue

@@ -1,11 +1,18 @@
 <template>
   <div class="container-mutualList">
     <el-card>
-      <span class="intro">{{ userForm.UserName }}-{{ userForm.Mobile }}-{{ userForm.ComapnyName }}</span>
+      <div>
+        <span class="intro">{{ userForm.UserName }}-{{ userForm.Mobile }}-{{ userForm.ComapnyName }}</span>
+        <span class="organization-details" @click="goWholeDetail">机构互动详情>></span>
+      </div>
+      <div class="department-tabs">
+        <span :class="['item', activeTypeName == item.value && 'active']" v-for="item in typeList" :key="item.value" @click="typeHandleClick(item)">{{ item.label }}</span>
+      </div>
       <div class="tabs">
         <span :class="['item', activeName == item.Source && 'active']" v-for="item in list" :key="item.Source" @click="handleTabsClick(item)">{{ item.PermissionName }} ({{ item.TotalNum }})</span>
       </div>
-      <div class="son-box" v-if="activeName === 2 || activeName === 1">
+      <!--  -->
+      <div class="son-box" v-if="showSelectBox">
         <div style="display: flex; align-items: center" v-if="activeName === 2">
           <el-checkbox-group v-model="checkActiveList" @change="dataChangeHandler">
             <el-checkbox :label="item.key" v-for="item in screenList" :key="item.key">{{ item.name }}</el-checkbox>
@@ -23,7 +30,7 @@
             type="date"
             range
             value-type="format"
-            :placeholder="activeName === 1 ? '阅读时间' : '活动时间'"
+            :placeholder="activeName === 2 ? '活动时间' : '阅读时间'"
             :editable="false"
             @change="dateChange"
             style="width: 200px; margin-right: 20px"
@@ -41,9 +48,14 @@
       </div>
       <template v-if="activeName != 4">
         <el-table style="margin-top: 20px" :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border>
-          <el-table-column v-for="item in tableColums" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
+          <el-table-column v-for="item in tableColumsList" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
             <template slot-scope="{ row }">
-              <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+              <span v-if="item.key !== 'LabelKeyWord'" @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+              <div v-else>
+                <template v-if="row.LabelKeyWord">
+                  <el-tag style="margin: 5px" type="info" size="small" v-for="tag in row.LabelKeyWord.split(',')" :key="tag">{{ tag }}</el-tag>
+                </template>
+              </div>
             </template>
           </el-table-column>
           <div slot="empty" style="padding: 20px 0">
@@ -106,6 +118,7 @@ export default {
         EndDate: this.end_date,
         StartDate: this.start_date,
         KeyWord: this.searchVal,
+        ClassType: this.activeTypeName,
       };
       for (let key in params) {
         paramStr = `${paramStr}&${key}=${params[key]}`;
@@ -117,17 +130,25 @@ export default {
     return {};
   },
   mixins: [mutualMixin],
-  watch: {},
   created() {},
   mounted() {
     this.tableColums = tableColums(1);
     this.getCygxMutualList();
   },
   methods: {
+    // 类型的点击事件
+    typeHandleClick(item) {
+      if (this.activeTypeName == item.value) return;
+      this.activeTypeName = item.value;
+      this.activeName = 1;
+      this.tableColums = tableColums(this.activeName);
+      this.getCygxMutualList();
+    },
     //获取基础数据
     async getCygxMutualList() {
       const res = await equityContacts.getCygxMutualList({
         UserId: Number(this.$route.query.id),
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.list = res.Data.List || [];
@@ -147,6 +168,7 @@ export default {
         MeetType: this.checkActiveList.join(","),
         EndDate: this.end_date,
         StartDate: this.start_date,
+        ClassType: this.activeTypeName,
         KeyWord: this.searchVal,
       });
       if (res.Ret === 200) {
@@ -161,6 +183,7 @@ export default {
         Source: this.activeName,
         PageSize: this.pageSize,
         CurrentIndex: this.page_no,
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.publicHaveMove = res.Data ? this.page_no < res.Data.Paging.Pages : false;
@@ -193,6 +216,17 @@ export default {
     chartDetial(item) {
       window.open(item.HttpUrl, "_blank");
     },
+    // 机构互助详情
+    goWholeDetail() {
+      const { href } = this.$router.resolve({
+        path: "/organizationList",
+        query: {
+          id: this.$route.query.id,
+          CompanyId: this.$route.query.CompanyId,
+        },
+      });
+      window.open(href, "_blank");
+    },
   },
 };
 </script>
@@ -206,5 +240,17 @@ export default {
     border-radius: 4px;
   }
   @import "./compontents/details.scss";
+  .organization-details {
+    display: inline-block;
+    margin-left: 20px;
+    cursor: pointer;
+    font-size: 14px;
+    color: #3385ff;
+  }
+}
+</style>
+<style>
+.el-tabs__nav-wrap::after {
+  background-color: rgba(255, 255, 255, 0.5);
 }
 </style>

+ 31 - 6
src/views/custom_manage/contacts/organizationList.vue

@@ -6,6 +6,9 @@
         <span class="attention">注:机构的互动详情,是截止至昨天24点的数据,非当前实时数据</span>
         <span class="organization-details" @click="goWholeDetail">全机构互动详情>></span>
       </div>
+      <div class="department-tabs">
+        <span :class="['item', activeTypeName == item.value && 'active']" v-for="item in typeList" :key="item.value" @click="typeHandleClick(item)">{{ item.label }}</span>
+      </div>
       <div class="tabs">
         <span :class="['item', activeName == item.Source && 'active']" v-for="item in list" :key="item.Source" @click="handleTabsClick(item)">{{ item.PermissionName }} ({{ item.TotalNum }})</span>
       </div>
@@ -21,8 +24,8 @@
             <i class="el-icon-info"></i>
           </el-tooltip>
         </div>
-        <div class="dataReport-top">
-          <template v-if="activeName == 1 || activeName == 2">
+        <div class="dataReport-top"  v-if="showSelectBox">
+          <template>
             <date-picker
               v-model="filterObj.date"
               type="date"
@@ -43,16 +46,21 @@
           <el-input v-if="activeName == 2" placeholder="活动名称" v-model="activityName" style="width: 200px" @input="handleSearchActivity" clearable>
             <i slot="prefix" class="el-input__icon el-icon-search"></i>
           </el-input>
-          <a :href="exportExcel" download v-if="activeName == 1 || activeName == 2">
+          <a :href="exportExcel" download >
             <button class="button-sty act">下载EXCEL</button>
           </a>
         </div>
       </div>
       <template v-if="activeName != 4">
         <el-table style="margin-top: 20px" :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border>
-          <el-table-column v-for="item in tableColums" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
+          <el-table-column v-for="item in tableColumsList" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
             <template slot-scope="{ row }">
-              <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+              <span v-if="item.key !== 'LabelKeyWord'" @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+              <div v-else>
+                <template v-if="row.LabelKeyWord">
+                  <el-tag style="margin: 5px" type="info" size="small" v-for="tag in row.LabelKeyWord.split(',')" :key="tag">{{ tag }}</el-tag>
+                </template>
+              </div>
             </template>
           </el-table-column>
           <div slot="empty" style="padding: 20px 0">
@@ -68,7 +76,7 @@
         <template v-if="publicHaveMoveCompany">
           <div v-for="item in chartList" :key="item.UserId">
             <template v-if="item.ListChart">
-              <ChartItem :chartData="item" />
+              <ChartItem :chartData="item" :activeTypeName="activeTypeName" />
             </template>
           </div>
         </template>
@@ -116,6 +124,7 @@ export default {
         StartDate: this.start_date,
         KeyWord: this.searchVal,
         ActivityName: this.activityName,
+        ClassType: this.activeTypeName,
       };
       for (let key in params) {
         paramStr = `${paramStr}&${key}=${params[key]}`;
@@ -131,10 +140,19 @@ export default {
     this.getSale();
   },
   methods: {
+    // 类型的点击事件
+    typeHandleClick(item) {
+      if (this.activeTypeName == item.value) return;
+      this.activeTypeName = item.value;
+      this.activeName = 1;
+      this.tableColums = organizationTableColums(this.activeName);
+      this.getCygxMutualList();
+    },
     //获取基础数据
     async getCygxMutualList() {
       const res = await equityContacts.getCompanyTableList({
         CompanyId: Number(this.$route.query.CompanyId),
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.list = res.Data.List || [];
@@ -180,6 +198,7 @@ export default {
         StartDate: this.start_date,
         KeyWord: this.searchVal,
         ActivityName: this.activityName,
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.total = res.Data.Paging.Totals;
@@ -195,6 +214,7 @@ export default {
         CurrentIndex: this.page_no,
         IdentityType: 2,
         KeyWord: this.searchVal,
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.publicHaveMove = res.Data ? this.page_no < res.Data.Paging.Pages : false;
@@ -254,3 +274,8 @@ export default {
   }
 }
 </style>
+<style>
+.el-tabs__nav-wrap::after {
+  background-color: rgba(255, 255, 255, 0.5);
+}
+</style>

+ 31 - 7
src/views/custom_manage/contacts/wholeOrganization.vue

@@ -2,6 +2,9 @@
   <div class="container-whole-organization">
     <el-card>
       <div class="introduce">注:机构的互动详情,是截止至昨天24点的数据,非当前实时数据</div>
+      <div class="department-tabs">
+        <span :class="['item', activeTypeName == item.value && 'active']" v-for="item in typeList" :key="item.value" @click="typeHandleClick(item)">{{ item.label }}</span>
+      </div>
       <div class="tabs">
         <span :class="['item', activeName == item.Source && 'active']" v-for="item in list" :key="item.Source" @click="handleTabsClick(item)">{{ item.PermissionName }} ({{ item.TotalNum }})</span>
       </div>
@@ -17,8 +20,8 @@
             <i class="el-icon-info"></i>
           </el-tooltip>
         </div>
-        <div class="dataReport-top">
-          <template v-if="activeName == 1 || activeName == 2">
+        <div class="dataReport-top" v-if="showSelectBox">
+          <template>
             <date-picker
               v-model="filterObj.date"
               type="date"
@@ -49,16 +52,21 @@
           <el-input v-if="activeName == 2" placeholder="活动名称" v-model="activityName" style="width: 200px" @input="handleSearchActivity" clearable>
             <i slot="prefix" class="el-input__icon el-icon-search"></i>
           </el-input>
-          <a :href="exportExcel" download v-if="activeName == 1 || activeName == 2">
+          <a :href="exportExcel" download>
             <button class="button-sty act">下载EXCEL</button>
           </a>
         </div>
       </div>
       <template v-if="activeName != 4">
         <el-table style="margin-top: 20px" :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border>
-          <el-table-column v-for="item in tableColums" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
+          <el-table-column v-for="item in tableColumsList" :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center">
             <template slot-scope="{ row }">
-              <span @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+              <span v-if="item.key !== 'LabelKeyWord'" @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+              <div v-else>
+                <template v-if="row.LabelKeyWord">
+                  <el-tag style="margin: 5px" type="info" size="small" v-for="tag in row.LabelKeyWord.split(',')" :key="tag">{{ tag }}</el-tag>
+                </template>
+              </div>
             </template>
           </el-table-column>
           <div slot="empty" style="padding: 20px 0">
@@ -74,7 +82,7 @@
         <template v-if="publicHaveMoveCompany">
           <div v-for="item in chartList" :key="item.UserId">
             <template v-if="item.ListChart">
-              <ChartItem :chartData="item" :companyName="item.CompanyName" />
+              <ChartItem :chartData="item" :companyName="item.CompanyName" :activeTypeName="activeTypeName" />
             </template>
           </div>
           <el-col :span="24" class="toolbar">
@@ -131,6 +139,7 @@ export default {
         KeyWord: this.searchVal,
         ActivityName: this.activityName,
         AdminId: salesArr.join(","),
+        ClassType: this.activeTypeName,
       };
       for (let key in params) {
         paramStr = `${paramStr}&${key}=${params[key]}`;
@@ -146,9 +155,17 @@ export default {
     this.getSale();
   },
   methods: {
+    // 类型的点击事件
+    typeHandleClick(item) {
+      if (this.activeTypeName == item.value) return;
+      this.activeTypeName = item.value;
+      this.activeName = 1;
+      this.tableColums = wholeOrganizationTableColums(this.activeName);
+      this.getCygxMutualList();
+    },
     //获取基础数据
     async getCygxMutualList() {
-      const res = await equityContacts.getUserTableCompanyList({});
+      const res = await equityContacts.getUserTableCompanyList({ ClassType: this.activeTypeName });
       if (res.Ret === 200) {
         this.list = res.Data.List || [];
         this.userForm = res.Data;
@@ -199,6 +216,7 @@ export default {
         KeyWord: this.searchVal,
         ActivityName: this.activityName,
         AdminId: salesArr.join(","),
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.total = res.Data.Paging.Totals;
@@ -222,6 +240,7 @@ export default {
         PageSize: this.pageSize,
         CurrentIndex: this.page_no,
         AdminId: salesArr.join(","),
+        ClassType: this.activeTypeName,
       });
       if (res.Ret === 200) {
         this.chartList = res.Data.List || [];
@@ -257,3 +276,8 @@ export default {
   @import "./compontents/details.scss";
 }
 </style>
+<style>
+.el-tabs__nav-wrap::after {
+  background-color: rgba(255, 255, 255, 0.5);
+}
+</style>

+ 94 - 0
src/views/dataReport_manage/components/CoverageRateDlg.vue

@@ -0,0 +1,94 @@
+<template>
+  <el-dialog v-dialogDrag :visible.sync="isCoverageRateShow" @close="handleClose" :modal-append-to-body="false" center title="近4周服务覆盖率">
+    <el-table :data="dataList" border max-height="250" style="width: 100%; margin-bottom: 20px">
+      <el-table-column align="center" prop="ThisWeekAmount">
+        <template slot="header" slot-scope="{}">
+          <p>本周服务覆盖率</p>
+          <p>{{ getWeekRange(0) }}</p>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="LastWeekAmount">
+        <template slot="header" slot-scope="{}">
+          <p>上周服务覆盖率</p>
+          <p>{{ getWeekRange(-1) }}</p>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="TwoWeekAmount">
+        <template slot="header" slot-scope="{}">
+          <p>上上周服务覆盖率</p>
+          <p>{{ getWeekRange(-2) }}</p>
+        </template></el-table-column
+      >
+      <el-table-column align="center" prop="ThreeWeekAmount">
+        <template slot="header" slot-scope="{}">
+          <p>上三周服务覆盖率</p>
+          <p>{{ getWeekRange(-3) }}</p>
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script>
+import { dataMainInterface } from "@/api/api.js";
+export default {
+  props: {
+    dlgForm: {
+      type: Object,
+      default: null,
+    },
+    isCoverageRateShow: {
+      type: Boolean,
+      require: true,
+    },
+  },
+  data() {
+    return {
+      dataList: [],
+    };
+  },
+  methods: {
+    async getDataList() {
+      const res = await dataMainInterface.getRaiServeCoverageRate({
+        CompanyId: this.dlgForm.CompanyId,
+      });
+      if (res.Ret == 200) {
+        this.dataList = [res.Data] || [];
+      }
+    },
+    // 时间的计算
+    getWeekRange(offset) {
+      const now = new Date();
+      const startOfWeek = new Date(now);
+      startOfWeek.setDate(now.getDate() - now.getDay() + 1 + offset * 7); // 设置为每周的周一
+      const endOfWeek = new Date(startOfWeek);
+      endOfWeek.setDate(startOfWeek.getDate() + 6); // 设置为每周的周日
+
+      const formatDate = (date) => {
+        const year = date.getFullYear();
+        const month = ("0" + (date.getMonth() + 1)).slice(-2);
+        const day = ("0" + date.getDate()).slice(-2);
+        return `${month}-${day}`;
+      };
+
+      return `(${formatDate(startOfWeek)} ~ ${formatDate(endOfWeek)})`;
+    },
+    // 关闭弹框
+    handleClose() {
+      this.$emit("update:isCoverageRateShow", false);
+      this.$emit("update:dlgForm", {});
+    },
+  },
+  watch: {
+    isCoverageRateShow(val) {
+      if (val) {
+        this.getDataList();
+      } else {
+        this.dataList = [];
+      }
+    },
+  },
+};
+</script>
+
+<style></style>

+ 134 - 0
src/views/dataReport_manage/components/ServiceDetailsDlg.vue

@@ -0,0 +1,134 @@
+<template>
+  <el-dialog v-dialogDrag :visible.sync="isServiceDetailsShow" destroy-on-close width="1000px" @close="handleClose" :modal-append-to-body="false" center :title="`服务明细--${dlgForm.CompanyName}`">
+    <el-table ref="updateTable" :data="tableData" style="width: 100%; margin-bottom: 20px" border height="400px">
+      <el-table-column align="center" prop="Content" label="服务内容"> </el-table-column>
+      <el-table-column align="center" prop="ServeTypeName" label="服务类型" width="120"> </el-table-column>
+      <el-table-column align="center" prop="address" label="主题标签">
+        <template slot-scope="{ row }" v-if="row.Tag">
+          <el-tag style="margin: 5px" type="info" size="small" v-for="item in row.Tag.split(',')" :key="item">{{ item }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="RealName" label="参与人" width="100"> </el-table-column>
+      <el-table-column align="center" prop="IsKp" label="是否kp" width="80">
+        <template slot-scope="{ row }">
+          <span>{{ row.IsKp == 1 ? "是" : "否" }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="ServeCount" label="服务量小计" width="100"> </el-table-column>
+      <el-table-column align="center" prop="ViewTime" label="时间">
+        <template slot="header" slot-scope="{}">
+          <span>时间</span>
+          <el-tooltip class="item" effect="dark" content="时间指的是:活动开始时间,一对一路演开始时间,报告阅读时间,交流反馈提交时间" placement="top-start">
+            <i class="el-icon-warning"></i>
+          </el-tooltip>
+        </template>
+        <template slot-scope="{ row }">
+          <span>{{ row.ViewTime }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+</template>
+
+<script>
+import { dataMainInterface, raiInterface } from "@/api/api.js";
+export default {
+  props: {
+    dlgForm: {
+      type: Object,
+      default: {},
+    },
+    isServiceDetailsShow: {
+      type: Boolean,
+      require: true,
+    },
+    selectForm: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      tableData: [], // 初始表格数据
+      page_no: 1, // 当前页码
+      pageSize: 10, // 每页显示的行数
+      noMoreData: false,
+    };
+  },
+  methods: {
+    /* 滚动监听 */
+    loadMoveHandler() {
+      let dom = this.$refs.updateTable.bodyWrapper;
+      dom.addEventListener(
+        "scroll",
+        _.throttle(() => {
+          const scroll = dom.scrollHeight - dom.scrollTop - dom.clientHeight;
+          console.log(scroll <= 1, !this.noMoreData);
+          if (scroll <= 1 && !this.noMoreData) {
+            this.page_no++;
+            this.loadData();
+          }
+        }, 500)
+      );
+    },
+
+    async loadData() {
+      const res = await dataMainInterface.getRaiServeBillList({
+        CompanyId: this.dlgForm.CompanyId,
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        TagType: this.selectForm.TagType,
+        TagId: this.selectForm.TagId,
+        ServeTypeId: this.selectForm.ServeTypeId,
+        WhatWeek: this.selectForm.WhatWeek,
+      });
+      if (res.Ret == 200) {
+        this.tableData = this.tableData.concat(res.Data.List);
+        this.noMoreData = res.Data.Paging.IsEnd;
+      }
+    },
+    // 关闭弹框
+    handleClose() {
+      this.tableData = [];
+      this.noMoreData = false;
+      this.page_no = 1;
+      this.$emit("update:isServiceDetailsShow", false);
+      this.$emit("update:dlgForm", {});
+    },
+    // 时间的计算
+    getWeekRange(offset) {
+      const now = new Date();
+      const startOfWeek = new Date(now);
+      startOfWeek.setDate(now.getDate() - now.getDay() + 1 + offset * 7); // 设置为每周的周一
+      const endOfWeek = new Date(startOfWeek);
+      endOfWeek.setDate(startOfWeek.getDate() + 6); // 设置为每周的周日
+
+      const formatDate = (date) => {
+        const year = date.getFullYear();
+        const month = ("0" + (date.getMonth() + 1)).slice(-2);
+        const day = ("0" + date.getDate()).slice(-2);
+        return `${month}-${day}`;
+      };
+
+      return `(${formatDate(startOfWeek)} ~ ${formatDate(endOfWeek)})`;
+    },
+  },
+  watch: {
+    isServiceDetailsShow: {
+      handler(val) {
+        if (val) {
+          this.loadData();
+          this.$nextTick(() => {
+            this.loadMoveHandler();
+          });
+        } else {
+          this.tableData = [];
+        }
+      },
+      deep: true,
+    },
+  },
+};
+</script>
+
+<style></style>

+ 349 - 0
src/views/dataReport_manage/equityServiceStatistics.vue

@@ -0,0 +1,349 @@
+<template>
+  <div class="dataReport-service-container">
+    <el-card>
+      <el-cascader
+        v-model="filterObj.sale"
+        placeholder="请选择销售"
+        style="width: 230px; margin-right: 10px"
+        :options="salesArr"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        @change="changeFilter"
+      >
+      </el-cascader>
+      <el-select clearable multiple v-model="filterObj.serveTypeId" placeholder="请选择咨询销售" style="width: 230px; margin-right: 10px" @change="changeFilter">
+        <el-option v-for="item in customSellerList" :key="item.AdminId" :label="item.RealName" :value="item.AdminId"> </el-option>
+      </el-select>
+      <el-select clearable v-model="filterObj.status" placeholder="客户状态" style="width: 230px; margin-right: 10px" @change="changeFilter">
+        <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+      </el-select>
+      <el-select clearable v-model="filterObj.serviceType" placeholder="服务类型" style="width: 230px; margin-right: 10px" @change="changeFilter">
+        <el-option v-for="item in serviceTypeOptions" :key="item.ServeTypeId" :label="item.ServeTypeName" :value="item.ServeTypeId"> </el-option>
+      </el-select>
+      <el-select
+        v-model="filterObj.lable"
+        clearable
+        filterable
+        remote
+        reserve-keyword
+        placeholder="请输入服务主题标签"
+        :remote-method="remoteMethod"
+        style="width: 230px; margin-right: 10px"
+        @change="selectLableHandler"
+      >
+        <el-option v-for="item in lableOptions" :key="item.Md5Key" :label="item.TagName" :value="item.Md5Key"> </el-option>
+      </el-select>
+      <a :href="exportExcel" download>
+        <el-button type="primary">下载</el-button>
+      </a>
+    </el-card>
+    <el-card style="margin-top: 20px">
+      <el-table :data="tableData" border style="width: 100%" @sort-change="sortChangeHandle">
+        <el-table-column align="center" prop="CompanyName" label="客户名称" width="180">
+          <template slot-scope="{ row }">
+            <el-tooltip effect="dark" placement="top-start" content="过去4周,kp均未覆盖服务" v-if="row.IsRed">
+              <span class="deletesty" @click="goDetail(row)">{{ row.CompanyName }}</span>
+            </el-tooltip>
+            <span v-else class="editsty" @click="goDetail(row)">{{ row.CompanyName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="ServeCoverageRate" width="180">
+          <template slot="header" slot-scope="{}">
+            <span>近4周平均服务覆盖率</span>
+            <el-tooltip effect="dark" placement="top-start">
+              <div slot="content">
+                <p>近4周服务覆盖率的平均值</p>
+              </div>
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+          </template>
+          <template slot-scope="{ row }">
+            <span @click="clickCoverage(row)" class="editsty">{{ row.ServeCoverageRate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="Status" label="当前状态" width="80"> </el-table-column>
+        <el-table-column align="center" prop="SellerName" label="销售" width="100"> </el-table-column>
+        <el-table-column align="center" prop="ShareSeller" label="服务组销售" width="100"> </el-table-column>
+        <el-table-column align="center" prop="StartDate" label="合同期限" width="180">
+          <template slot-scope="{ row }">
+            <span>{{ row.StartDate }}~{{ row.EndDate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="Money" sortable label="合同金额" width="110"> </el-table-column>
+        <el-table-column align="center" prop="PermissionName" label="签约套餐"> </el-table-column>
+        <el-table-column align="center" prop="ThisWeekAmount" width="118">
+          <template slot="header" slot-scope="{}">
+            <p>本周服务量</p>
+            <p>{{ getWeekRange(0) }}</p>
+          </template>
+          <template slot-scope="{ row }">
+            <span @click="billClickHandler(row, 1)" class="editsty">{{ row.ThisWeekAmount }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="LastWeekAmount" width="118">
+          <template slot="header" slot-scope="{}">
+            <p>上周服务量</p>
+            <p>{{ getWeekRange(-1) }}</p>
+          </template>
+          <template slot-scope="{ row }">
+            <span @click="billClickHandler(row, 2)" class="editsty">{{ row.LastWeekAmount }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="TwoWeekAmount" width="118">
+          <template slot="header" slot-scope="{}">
+            <p>上上周服务量</p>
+            <p>{{ getWeekRange(-2) }}</p>
+          </template>
+          <template slot-scope="{ row }">
+            <span @click="billClickHandler(row, 3)" class="editsty">{{ row.TwoWeekAmount }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="ThreeWeekAmount" width="118">
+          <template slot="header" slot-scope="{}">
+            <p>上三周服务量</p>
+            <p>{{ getWeekRange(-3) }}</p>
+          </template>
+          <template slot-scope="{ row }">
+            <span @click="billClickHandler(row, 4)" class="editsty">{{ row.ThreeWeekAmount }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 页数选择器 -->
+      <m-page style="margin: 20px 0" :page_no="page_no" :pageSize="pageSize" :total="total" @handleCurrentChange="pageChange" />
+    </el-card>
+    <!-- 覆盖率弹框 -->
+    <coverage-rate-dlg :isCoverageRateShow.sync="isCoverageRateShow" :dlgForm.sync="dlgForm" />
+    <!-- 服务明细- -->
+    <service-details-dlg
+      :isServiceDetailsShow.sync="isServiceDetailsShow"
+      :dlgForm.sync="dlgForm"
+      :selectForm="{
+        TagType: this.tagType,
+        TagId: this.tagId,
+        ServeTypeId: this.filterObj.serviceType,
+        WhatWeek: this.whatWeek,
+      }"
+    />
+  </div>
+</template>
+
+<script>
+import { dataMainInterface, customInterence } from "@/api/api.js";
+import CoverageRateDlg from "./components/CoverageRateDlg.vue";
+import ServiceDetailsDlg from "./components/ServiceDetailsDlg.vue";
+import mPage from "@/components/mPage.vue";
+
+export default {
+  name: "",
+  components: { CoverageRateDlg, ServiceDetailsDlg, mPage },
+  props: {},
+  data() {
+    return {
+      page_no: 1,
+      total: 0,
+      pageSize: 10,
+      salesArr: [], //销售列表
+      tableData: [],
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+      filterObj: {
+        sale: "",
+        status: "",
+        serviceType: "",
+        lable: "",
+        ServeTypeId: "",
+      },
+      statusOptions: [
+        { label: "正式客户", value: "正式" },
+        { label: "未续约客户", value: "未续约" },
+      ],
+      serviceTypeOptions: [],
+      isCoverageRateShow: false, //覆盖率弹框
+      isServiceDetailsShow: false, //服务明细弹框
+      dlgForm: {},
+      sortType: "",
+      lableOptions: [],
+      tagType: "",
+      tagId: "",
+      whatWeek: "",
+      customSellerList: [],
+    };
+  },
+  computed: {
+    exportExcel() {
+      let salesArr = [];
+      if (this.filterObj.sale.length) {
+        salesArr = this.filterObj.sale.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let baseUrl = process.env.API_ROOT + "/cygx/rai_serve/list";
+      let token = localStorage.getItem("auth") || "";
+      let paramStr = "";
+      let parmsa = {
+        SellerId: salesArr.join(","),
+        ShareSellerId: this.filterObj.serveTypeId ? this.filterObj.serveTypeId.join(",") : "", //共享小时id
+        ServeTypeId: this.filterObj.serviceType,
+        TagType: this.tagType,
+        TagId: this.tagId,
+        Status: this.filterObj.status,
+        SortType: this.sortType,
+        IsExport: true,
+      };
+      for (let key in parmsa) {
+        paramStr = `${paramStr}&${key}=${parmsa[key]}`;
+      }
+      return `${baseUrl}?${token}${paramStr}`;
+    },
+  },
+  watch: {},
+  created() {},
+  mounted() {
+    this.getSale();
+    this.getRaiServeTypeList();
+    this.getDataList();
+    this.getRaiServeCustomSellerList();
+  },
+  methods: {
+    /* 获取销售 */
+    getSale() {
+      customInterence.getSalesRaiData().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArr = res.Data.List;
+        }
+      });
+    },
+    /* 筛选改变时 */
+    changeFilter() {
+      this.page_no = 1;
+      this.getDataList();
+    },
+    // 时间的计算
+    getWeekRange(offset) {
+      const now = new Date();
+      const startOfWeek = new Date(now);
+      startOfWeek.setDate(now.getDate() - now.getDay() + 1 + offset * 7); // 设置为每周的周一
+      const endOfWeek = new Date(startOfWeek);
+      endOfWeek.setDate(startOfWeek.getDate() + 6); // 设置为每周的周日
+
+      const formatDate = (date) => {
+        const year = date.getFullYear();
+        const month = ("0" + (date.getMonth() + 1)).slice(-2);
+        const day = ("0" + date.getDate()).slice(-2);
+        return `${month}-${day}`;
+      };
+
+      return `(${formatDate(startOfWeek)} ~ ${formatDate(endOfWeek)})`;
+    },
+    pageChange(page_no) {
+      this.page_no = page_no;
+      this.getDataList();
+    },
+    // 获取表格数据
+    async getDataList() {
+      let salesArr = [];
+      if (this.filterObj.sale.length) {
+        salesArr = this.filterObj.sale.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      const res = await dataMainInterface.getRaiServeList({
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        SellerId: salesArr.join(","),
+        ShareSellerId: this.filterObj.serveTypeId ? this.filterObj.serveTypeId.join(",") : "", //共享小时id
+        ServeTypeId: this.filterObj.serviceType,
+        TagType: this.tagType,
+        TagId: this.tagId,
+        Status: this.filterObj.status,
+        SortType: this.sortType,
+      });
+      if (res.Ret === 200) {
+        this.tableData = res.Data.List || [];
+        this.total = res.Data.Paging.Totals;
+      }
+    },
+
+    sortChangeHandle({ column, prop, order }) {
+      this.sortType = order === "ascending" ? "asc" : order === "descending" ? "desc" : "";
+      this.page = 1;
+      this.getDataList();
+    },
+    /* 详情页 */
+    goDetail(item) {
+      const { href } = this.$router.resolve({
+        path: "/customDetail",
+        query: {
+          id: item.CompanyId,
+        },
+      });
+      window.open(href, "_blank");
+    },
+    // 搜索标签
+    async remoteMethod(query) {
+      if (query !== "") {
+        const res = await dataMainInterface.getRaiServeSearchTag({
+          KeyWord: query,
+        });
+        if (res.Ret === 200) {
+          this.lableOptions = res.Data.List || [];
+        }
+      } else {
+        this.lableOptions;
+      }
+    },
+    // 远程搜索标签
+    selectLableHandler() {
+      if (this.filterObj.lable) {
+        this.lableOptions.forEach((item) => {
+          if (item.Md5Key === this.filterObj.lable) {
+            this.tagType = item.TagType;
+            this.tagId = item.TagId;
+          }
+        });
+      } else {
+        this.tagType = "";
+        this.tagId = "";
+      }
+      this.changeFilter();
+    },
+    // 近四周覆盖率
+    clickCoverage(item) {
+      this.isCoverageRateShow = true;
+      this.dlgForm = item;
+    },
+    // 点击了明细
+    billClickHandler(item, type) {
+      this.whatWeek = type;
+      this.isServiceDetailsShow = true;
+      this.dlgForm = item;
+    },
+    // 获取服务类型列表
+    async getRaiServeTypeList() {
+      const res = await dataMainInterface.getRaiServeTypeList();
+      if (res.Ret === 200) {
+        this.serviceTypeOptions = res.Data.List || [];
+      }
+    },
+    //
+    async getRaiServeCustomSellerList() {
+      const res = await dataMainInterface.getRaiServeCustomSellerList();
+      if (res.Ret === 200) {
+        this.customSellerList = res.Data || [];
+        console.log(this.customSellerList, res);
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.dataReport-service-container {
+}
+</style>

+ 5 - 3
src/views/ficc_manage/chapterVariety.vue

@@ -196,10 +196,12 @@ import { bannerupload, getchapterTypeList,editChapterType } from 'api/api.js';
 export default {
     components: { mDialog },
   beforeRouteEnter(to, from, next) {
-    if (to.query.reportType == 'day') {
+    if (to.query.reportType === 'day') {
       to.matched[1].name = '晨报章节设置'
-    } else {
+    } else if(to.query.reportType === 'week') {
       to.matched[1].name = '周报章节设置'
+    }else {
+      to.matched[1].name = '章节设置'
     }
     next()
   },
@@ -222,7 +224,7 @@ export default {
   },
   methods: {
     async getList() {
-      getchapterTypeList({ ReportType: this.$route.query.reportType == 'week' ? 'week' : 'day' }).then(res => {
+      getchapterTypeList({ ClassifyId:Number(this.$route.query.id) }).then(res => {
         if (res.Ret === 200) {
           this.list = res.Data.List || []
         }

+ 27 - 8
src/views/ficc_manage/reportVariety.vue

@@ -30,7 +30,7 @@
           </div>
 
           <div class="opt-box">
-            <span class="editsty" v-if="['晨报','周报'].includes(data.ClassifyName)" @click="chapterSetting(data)">章节设置</span>
+            <span class="editsty" v-if="!data.Child" @click="chapterSetting(data)">章节设置</span>
             <span
               style="cursor: pointer; color: #409eff"
               @click.stop="handleShowEdit(data)"
@@ -54,7 +54,7 @@
         >
           <el-form-item
             prop="showType"
-            label="展示形式"
+            label="列表页展示"
             v-if="aeForm.parent_id == 0"
           >
             <el-select
@@ -67,6 +67,22 @@
               <el-option label="品种" :value="3"></el-option>
             </el-select>
           </el-form-item>
+          
+          <el-form-item
+            prop="showType"
+            label="详情页展示"
+            v-if="aeForm.isLastLevel"
+          >
+            <el-select
+              v-model="aeForm.reportDetailShowType"
+              placeholder="请选择"
+              style="width: 400px"
+            >
+              <el-option label="拼接" :value="1"></el-option>
+              <el-option label="目录" :value="2"></el-option>
+            </el-select>
+          </el-form-item>
+
           <!-- 一级目录子目录 -->
           <el-form-item
             label="子目录"
@@ -225,7 +241,6 @@
               >
             </el-input>
           </el-form-item>
-          
 
           <!-- 二级分类配置列表背景图 -->
           <el-form-item
@@ -295,7 +310,7 @@
           <el-form-item
             label="关联线上路演"
             prop="RelateVideo"
-            v-if="aeForm.parent_id!=0"
+            v-if="aeForm.isLastLevel"
           >
             <el-switch
               v-model="aeForm.RelateVideo"
@@ -429,6 +444,7 @@ export default {
         YbRightBanner: '',//报告合集配图
         relate: [],
         RelateVideo:false,//关联线上路演
+        reportDetailShowType: 1,//详情展示形式
       },
       aerules: {
         abstract: [{
@@ -544,13 +560,13 @@ export default {
   },
   methods: {
     chapterSetting(row){
-      let reportType;
+      let reportType='';
 			if(row.ClassifyName=='周报'){
 				reportType='week'
-			}else{
+			}else if(row.ClassifyName=='晨报'){
 				reportType='day'
 			}
-			this.$router.push({path:'chapterVariety',query:{reportType}})
+			this.$router.push({path:'chapterVariety',query:{id:row.Id,reportType}})
     },
     showInput(index){
 			if(index!=-1){
@@ -598,6 +614,7 @@ export default {
             MenuList:[],
             RelateTel:this.aeForm.relate.includes(1)?1:0,
             RelateVideo:this.aeForm.RelateVideo?1:0,
+            ReportDetailShowType: this.aeForm.reportDetailShowType
           }
           params.MenuList=this.ClassifyMenuList.map(item=>{
 						return {
@@ -650,7 +667,9 @@ export default {
         ClassifyMenuId: item.ClassifyMenuId || '',
         YbRightBanner: item.YbRightBanner || '',
         relate: [item.RelateTel == 1 ? 1 : null, item.RelateVideo == 1 ? 2 : null],
-        RelateVideo:item.RelateVideo == 1?true:false
+        RelateVideo:item.RelateVideo == 1?true:false,
+        isLastLevel: item.Child ? false : true,
+        reportDetailShowType: item.ReportDetailShowType||1
       }
       this.ClassifyMenuList = item.ClassifyMenuList ? item.ClassifyMenuList.map(item => {
         return {

+ 2 - 1
src/views/report_manage/components/setVarietyPause.vue

@@ -63,10 +63,11 @@ export default {
 		'isOpenDialog': {
 			handler(newval) {
         if(newval) {
+          console.log(this.setArr)
           this.pauseList = this.setArr.map(_=>({
             id: _.ReportChapterTypeId,
             name: _.ReportChapterTypeName,
-            date: _.PauseStartTime ? [_.PauseStartTime,_.PauseEndTime] : []
+            date: _.PauseStartTime ? [_.PauseStartTime,_.PauseEndTime] : [this.$moment().format('YYYY-MM-DD'),this.$moment().format('YYYY-MM-DD')]
           }))
         }
 			}

+ 261 - 187
src/views/roadshow_manage/compononts/addParticipateDia.vue

@@ -1,208 +1,282 @@
 <template>
-    <el-dialog
-        title="提交参会名单"
-        :visible.sync="isAddParticipateShow"
-        width="500px"
-        append-to-body
-        @close="$emit('close')"
-    >
-        <div class="partic-dialog-container">
-            <div class="inline" v-for="(item, index) in dynamicItem" :key="index">
-                <div class="inline-content">
-                    <el-autocomplete
-                        class="inline-input"
-                        v-model.trim="item.name"
-                        :fetch-suggestions="callbackHandle"
-                        placeholder="请输入姓名"
-                        @input="getCompany(item.name)"
-                        @select="selectCompany(item, index)"
-                        @blur="focusCompany(item.name)"
-                        :trigger-on-focus="false"
-                        clearable
-                    ></el-autocomplete>
-                    <img
-                        @click="deleteItem(index)"
-                        src="~@/assets/img/icons/delete-Item.png"
-                        :class="index == 0 ? 'defaultyi' : ''"
-                        alt=""
-                    />
-                </div>
-                <p v-if="item.isShow">
-                    系统中无此人,请先将其添加到对应公司的联系人列表下
-                </p>
-            </div>
-            <div @click="addItem" class="add-box">
-                <img :src="$icons.addblue" alt="" />
-                <span>添加</span>
-            </div>
+  <el-dialog title="提交参会名单" :visible.sync="isAddParticipateShow" width="500px" append-to-body @close="closeDlg">
+    <div class="partic-dialog-container">
+      <template v-if="isType !== '查看'">
+        <div v-if="isShowPermission" style="margin-bottom: 20px">
+          <el-tag type="info" size="small"> {{ this.chartPermissionName }}</el-tag>
         </div>
-        <div slot="footer" class="dialog-footer" style="text-align: center;">
-            <el-button type="primary" @click="confirmPerson">确定</el-button>
-            <el-button @click="$emit('close')">取消</el-button>
+        <el-select
+          v-else
+          v-model="hashtagValue"
+          multiple
+          filterable
+          remote
+          reserve-keyword
+          placeholder="请输入路演主题标签(可多选)"
+          :remote-method="remoteMethodHandler"
+          style="width: 392px; margin-bottom: 20px"
+          @change="tagSelectHandler"
+        >
+          <el-option v-for="item in hashtagOptions" :key="item.Md5Key" :label="item.TagName" :value="item.Md5Key"> </el-option>
+        </el-select>
+      </template>
+      <div class="inline" v-for="(item, index) in dynamicItem" :key="index">
+        <div class="inline-content">
+          <el-autocomplete
+            class="inline-input"
+            v-model.trim="item.name"
+            :fetch-suggestions="callbackHandle"
+            placeholder="请输入姓名"
+            @input="getCompany(item.name)"
+            @select="selectCompany(item, index)"
+            @blur="focusCompany(item.name)"
+            :trigger-on-focus="false"
+            clearable
+          ></el-autocomplete>
+          <img @click="deleteItem(index)" src="~@/assets/img/icons/delete-Item.png" :class="index == 0 ? 'defaultyi' : ''" alt="" />
         </div>
-    </el-dialog>
+        <p v-if="item.isShow">系统中无此人,请先将其添加到对应公司的联系人列表下</p>
+      </div>
+      <div @click="addItem" class="add-box">
+        <img :src="$icons.addblue" alt="" />
+        <span>添加</span>
+      </div>
+    </div>
+    <div slot="footer" class="dialog-footer" style="text-align: center">
+      <el-button type="primary" @click="confirmPerson">确定</el-button>
+      <el-button @click="closeDlg">取消</el-button>
+    </div>
+  </el-dialog>
 </template>
 
 <script>
-import { raiInterface,roadshowInterence } from "@/api/api.js";
+import { raiInterface, roadshowInterence } from "@/api/api.js";
 export default {
-    props:{
-        isAddParticipateShow:{
-            type:Boolean,
-            default:false
-        },
-        RsCalendarId:{
-            type:Number,
-            default:0
-        }
+  props: {
+    isAddParticipateShow: {
+      type: Boolean,
+      default: false,
     },
-    watch:{
-        isAddParticipateShow(newval){
-            if(newval){
-                this.dynamicItem = [{name:'',isShow:false}]
-            }
-        }
+    RsCalendarId: {
+      type: Number,
+      default: 0,
     },
-    data() {
-        return {
-            dynamicItem:[{name:'',isShow:false}],
-            companyList:[],
-            timeout:0,
-            warningIsShow:false
-        };
-    },
-    methods: {
-        getCompany(query){
-            if (query.includes(",")) return;
-            if (query) {
-                raiInterface
-                .activitySignupUserList({
-                    KeyWord: query,
-                })
-                .then((res) => {
-                    if (res.Ret === 200) {
-                    let arr = [];
-                    res.Data.List &&
-                        res.Data.List.forEach((item) => {
-                        let obj = {
-                            ...item,
-                            value: item.RealName + " , " + item.Mobile + " , " + item.CompanyName,
-                        };
-                        arr.push(obj);
-                        });
-                    this.companyList = arr;
-                    }
-                });
-            } else {
-                this.companyList = [];
-            }
-        },
-        callbackHandle(data,cb){
-            let results = data
-                ? this.companyList.filter((item) => {
-                    return item.value.includes(data);
-                })
-                : this.companyList;
-            clearTimeout(this.timeout);
-            this.timeout = setTimeout(() => {
-                cb(results);
-            }, 300);
-            if (results.length == 0) {
-                this.warningIsShow = true;
-            } else {
-                this.warningIsShow = false;
-            }
-        },
-        selectCompany(val, index) {
-            this.companyList.forEach((item) => {
-                if (item.value == val.name) {
-                this.dynamicItem.splice(index, 1, { name: val.name, isShow: false, id: item.UserId});
-                }
-            });
-        },
-        focusCompany(name){
-            if ((name.length && this.companyList.length == 0) || this.warningIsShow) {
-                this.dynamicItem.forEach((item) => {
-                    if (item.name == name) {
-                        item.isShow = true;
-                    }
-                });
-            } else {
-                this.dynamicItem.forEach((item) => {
-                    if (item.name == name) {
-                        item.isShow = false;
-                    }
+    ResearcherId: {
+      type: Number,
+      default: 0,
+    },
+    isType: {
+      type: String,
+      default: "",
+    },
+  },
+  watch: {
+    isAddParticipateShow(newval) {
+      if (newval) {
+        this.dynamicItem = [{ name: "", isShow: false }];
+        this.getIsPermissionName();
+      }
+    },
+  },
+  data() {
+    return {
+      dynamicItem: [{ name: "", isShow: false }],
+      companyList: [],
+      timeout: 0,
+      warningIsShow: false,
+      hashtagValue: "", // 主题标签
+      hashtagOptions: [], // 主题数据
+      tagList: [], // /标签类型
+      tagName: "",
+      chartPermissionName: "",
+      isShowPermission: false,
+    };
+  },
+  methods: {
+    getCompany(query) {
+      if (query.includes(",")) return;
+      if (query) {
+        raiInterface
+          .activitySignupUserList({
+            KeyWord: query,
+          })
+          .then((res) => {
+            if (res.Ret === 200) {
+              let arr = [];
+              res.Data.List &&
+                res.Data.List.forEach((item) => {
+                  let obj = {
+                    ...item,
+                    value: item.RealName + " , " + item.Mobile + " , " + item.CompanyName,
+                  };
+                  arr.push(obj);
                 });
+              this.companyList = arr;
             }
-        },
-        deleteItem(index){
-            this.dynamicItem.splice(index, 1);
-        },
-        addItem(){
-            this.dynamicItem.push({name:'',isShow:false})
-        },
-        confirmPerson(){
-            //校验
-            const useId = this.dynamicItem.map(i=>i.id).filter(i=>i)
-            if(!useId.length) return this.$message.error('请输入姓名')
-            roadshowInterence.addMeetingUser({
-                RsCalendarId:this.RsCalendarId,
-                UserId:useId
-            }).then(res=>{
-                if(res.Ret!==200) return 
-                this.$message.success('提交成功')
-                this.$emit('confirm')
-            })
-        },
+          });
+      } else {
+        this.companyList = [];
+      }
+    },
+    callbackHandle(data, cb) {
+      let results = data
+        ? this.companyList.filter((item) => {
+            return item.value.includes(data);
+          })
+        : this.companyList;
+      clearTimeout(this.timeout);
+      this.timeout = setTimeout(() => {
+        cb(results);
+      }, 300);
+      if (results.length == 0) {
+        this.warningIsShow = true;
+      } else {
+        this.warningIsShow = false;
+      }
+    },
+    selectCompany(val, index) {
+      this.companyList.forEach((item) => {
+        if (item.value == val.name) {
+          this.dynamicItem.splice(index, 1, { name: val.name, isShow: false, id: item.UserId });
+        }
+      });
+    },
+    focusCompany(name) {
+      if ((name.length && this.companyList.length == 0) || this.warningIsShow) {
+        this.dynamicItem.forEach((item) => {
+          if (item.name == name) {
+            item.isShow = true;
+          }
+        });
+      } else {
+        this.dynamicItem.forEach((item) => {
+          if (item.name == name) {
+            item.isShow = false;
+          }
+        });
+      }
+    },
+    deleteItem(index) {
+      this.dynamicItem.splice(index, 1);
+    },
+    addItem() {
+      this.dynamicItem.push({ name: "", isShow: false });
+    },
+    confirmPerson() {
+      //校验
+      const useId = this.dynamicItem.map((i) => i.id).filter((i) => i);
+      if (!useId.length) return this.$message.error("请输入姓名");
+      roadshowInterence
+        .addMeetingUser({
+          RsCalendarId: this.RsCalendarId,
+          UserId: useId,
+          TagList: this.tagList,
+        })
+        .then((res) => {
+          if (res.Ret !== 200) return;
+          this.$message.success("提交成功");
+          this.$emit("confirm");
+        });
     },
+    // 获取标签
+    async remoteMethodHandler(query) {
+      if (query !== "") {
+        let KeyWord = this.tagName ? this.tagName + "," + query : query;
+        const res = await roadshowInterence.rai_serve_search_tag({
+          KeyWord,
+          ResearcherId: this.ResearcherId,
+        });
+        if (res.Ret === 200) {
+          this.hashtagOptions = res.Data.List || [];
+        }
+      } else if (!this.hashtagValue.length && !query) {
+        this.hashtagOptions = [];
+      }
+    },
+    // 选择标签
+    tagSelectHandler() {
+      let tagListArr = [];
+      let nameArr = [];
+      this.hashtagOptions.forEach((item) => {
+        if (this.hashtagValue.length && this.hashtagValue.includes(item.Md5Key)) {
+          tagListArr.push({
+            TagType: item.TagType,
+            TagId: item.TagId,
+          });
+          nameArr.push(item.TagName);
+        }
+      });
+      this.tagList = tagListArr;
+      this.tagName = nameArr.join(",");
+    },
+    // 进入看看是否是策略
+    async getIsPermissionName() {
+      const res = await roadshowInterence.rai_serve_search_chcck_PermissionName({ ResearcherId: this.ResearcherId });
+      if (res.Ret === 200) {
+        this.chartPermissionName = res.Data.ChartPermissionName;
+        this.isShowPermission = res.Data.Belong;
+        this.tagList = res.Data.List;
+      }
+    },
+    // 关闭弹框
+    closeDlg() {
+      this.hashtagValue = ""; // 主题标签
+      this.hashtagOptions = []; // 主题数据
+      this.tagList = []; // /标签类型
+      this.tagName = "";
+      this.chartPermissionName = "";
+      this.isShowPermission = false;
+      this.$emit("close");
+    },
+  },
 };
 </script>
 
 <style lang="scss">
-.partic-dialog-container{
-    .inline {
-        margin-bottom: 20px;
-        width: 100%;
-        .inline-input {
-            width: 392px !important;
-        }
-        p {
-            padding-top: 5px;
-            font-size: 14px;
-            font-family: PingFang SC;
-            font-weight: 500;
-            line-height: 20px;
-            color: #ef5858;
-            opacity: 1;
-        }
-        .inline-content {
-            padding-right: 20px;
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            img {
-                width: 14px;
-                height: 14px;
-                cursor: pointer;
-            }
-        }
-        .defaultyi {
-            display: none !important;
-        }
-        .el-input {
-            width: 392px !important;
-        }
+.partic-dialog-container {
+  .inline {
+    margin-bottom: 20px;
+    width: 100%;
+    .inline-input {
+      width: 392px !important;
+    }
+    p {
+      padding-top: 5px;
+      font-size: 14px;
+      font-family: PingFang SC;
+      font-weight: 500;
+      line-height: 20px;
+      color: #ef5858;
+      opacity: 1;
     }
-    .add-box {
-        display: flex;
-        align-items: center;
-        color: #5882ef;
+    .inline-content {
+      padding-right: 20px;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      img {
+        width: 14px;
+        height: 14px;
         cursor: pointer;
-        img {
-            width: 16px;
-            height: 16px;
-            margin-right: 10px;
-        }
+      }
+    }
+    .defaultyi {
+      display: none !important;
+    }
+    .el-input {
+      width: 392px !important;
+    }
+  }
+  .add-box {
+    display: flex;
+    align-items: center;
+    color: #5882ef;
+    cursor: pointer;
+    img {
+      width: 16px;
+      height: 16px;
+      margin-right: 10px;
     }
+  }
 }
 </style>

+ 94 - 4
src/views/roadshow_manage/compononts/showParticipateListDia.vue

@@ -4,9 +4,15 @@
         :visible.sync="isParticipateShow"
         width="700px"
         append-to-body
-        @close="$emit('close')"
+        @close="closeDlg"
     >
         <div class="partic-list-dialog-container">
+            <div v-if="isShowPermission" style="margin-bottom:20px">
+              <el-tag type="info" size="small"> {{this.chartPermissionName}}</el-tag>
+            </div>
+            <el-select v-else v-model="hashtagValue" multiple filterable remote reserve-keyword placeholder="请输入路演主题标签(可多选)" :remote-method="remoteMethodHandler" style="width:392px;margin-bottom:20px" @change="tagSelectHandler">
+                <el-option v-for="item in hashtagOptions" :key="item.Md5Key" :label="item.TagName" :value="item.Md5Key"> </el-option>
+            </el-select>
             <el-table :data="tableData" border>
                 <el-table-column align="center"
                     prop="RealName" label="姓名"
@@ -29,12 +35,14 @@
             </div>
         </div>
         <div slot="footer" class="dialog-footer" style="text-align: center;">
-            <el-button type="primary" @click="$emit('close')">确定</el-button>
-            <el-button @click="$emit('close')">取消</el-button>
+            <el-button @click="closeDlg">关闭</el-button>
+            <el-button type="primary" @click="saveTagsHandler">保存</el-button>
+
         </div>
         <addParticipateDia 
             :isAddParticipateShow="isAddShow"
             :RsCalendarId="RsCalendarId"
+            isType="查看"
             @close="isAddShow=false;"
             @confirm="getTableData();isAddShow=false;"
         />
@@ -53,18 +61,29 @@ export default {
         RsCalendarId: {
             type: Number,
             default: 0
+        },
+        ResearcherId:{
+            type:Number,
+            default:0
         }
     },
     data() {
         return {
             tableData: [],
-            isAddShow:false
+            isAddShow:false,
+            hashtagValue:[],// 主题标签
+            hashtagOptions:[],// 主题数据
+            tagList:[],// /标签类型
+            tagName: '',
+            chartPermissionName:'',
+            isShowPermission:false
         };
     },
     watch: {
         isParticipateShow(newval) {
             if (newval) {
                 this.getTableData();
+                this.getIsPermissionName()
             }
         },
     },
@@ -76,6 +95,15 @@ export default {
                 if (res.Ret !== 200)
                     return;
                 this.tableData = res.Data.List;
+                this.hashtagOptions = res.Data.ListLebel
+                console.log(res);
+                if(this.hashtagOptions.length){
+                    this.hashtagValue = []
+                    this.hashtagOptions.forEach(item=>{
+                        this.hashtagValue.push(item.Md5Key)
+                    })
+                    this.tagSelectHandler()
+                }
             });
         },
         addItem() {
@@ -90,6 +118,68 @@ export default {
                 this.getTableData()
             })
         },
+        // 获取标签
+        async remoteMethodHandler(query){
+          if (query !== '') {
+            let KeyWord = this.tagName? this.tagName + ',' + query : query;
+            const res = await roadshowInterence.rai_serve_search_tag({
+                KeyWord,
+                ResearcherId:this.ResearcherId,
+            })
+            if( res.Ret===200 ){
+                this.hashtagOptions = res.Data.List || []
+            }
+          }else if(!this.hashtagValue.length && !query){
+            this.hashtagOptions =[]
+          }
+        },
+        // 标签选择后处理
+        tagSelectHandler(){
+            let tagListArr = []
+            let nameArr = []
+            this.hashtagOptions.forEach(item=>{
+                if(this.hashtagValue.length && this.hashtagValue.includes(item.Md5Key)) {
+                    tagListArr.push({
+                       TagType: item.TagType,
+                       TagId: item.TagId,
+                    })
+                    nameArr.push(item.TagName)
+                }
+            })
+            this.tagList = tagListArr
+            this.tagName = nameArr.join(',')
+        },
+        // 提交标签
+        saveTagsHandler(){
+            if(!this.tagList.length) return this.$message.error('请输入主题标签')
+            roadshowInterence.addMeetingUser({
+                RsCalendarId:this.RsCalendarId,
+                TagList:this.tagList
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.$message.success('提交成功')
+                this.closeDlg()
+            })
+        },
+        // 进入看看是否是策略
+        async getIsPermissionName(){
+            const res = await roadshowInterence.rai_serve_search_chcck_PermissionName({ResearcherId:this.ResearcherId})
+              if( res.Ret===200 ){
+                this.chartPermissionName = res.Data.ChartPermissionName
+                this.isShowPermission = res.Data.Belong
+                this.tagList = res.Data.List
+            }
+        },
+        // 关闭弹框
+         closeDlg(){
+            this.hashtagValue = ''// 主题标签
+            this.hashtagOptions = []// 主题数据
+            this.tagList = []// /标签类型
+            this.tagName =  ''
+            this.chartPermissionName = ''
+            this.isShowPermission = false
+            this.$emit('close')
+        }
     },
     components: { addParticipateDia }
 };

+ 13 - 5
src/views/roadshow_manage/myCalendar.vue

@@ -158,12 +158,12 @@
                   <span 
                     class="deletesty"
                     v-if="row.SubmitButton"
-                    @click="currentRsCalendarId=row.RsCalendarId;isAddParticipateShow=true;"
+                    @click="submitAttendees(row,'提交')"
                   >提交参会名单</span>
                   <span
                     class="editsty"
                     v-if="row.ViewButton"
-                    @click="currentRsCalendarId=row.RsCalendarId;isParticipateShow=true;"
+                    @click="submitAttendees(row,'查看')"
                   >查看参会名单
                   </span>
             </template>
@@ -296,6 +296,7 @@
     <addParticipateDia 
         :isAddParticipateShow="isAddParticipateShow"
         :RsCalendarId="currentRsCalendarId"
+        :ResearcherId="currentResearcherId"
         @close="isAddParticipateShow=false"
         @confirm="getCalendarList();isAddParticipateShow=false;"
     />
@@ -303,6 +304,7 @@
     <showParticipateListDia 
         :isParticipateShow="isParticipateShow"
         :RsCalendarId="currentRsCalendarId"
+        :ResearcherId="currentResearcherId"
         @close="isParticipateShow=false"
     />
   </div>
@@ -405,7 +407,8 @@ export default {
           text:'',
           time:''
       },
-      isReasonDiaShow:false
+      isReasonDiaShow:false,
+      currentResearcherId:0,
     };
   },
   methods: {
@@ -733,8 +736,13 @@ export default {
       this.default_tab = this.$route.query.act_tab ? this.$route.query.act_tab : this.Role === 'admin' ? 3 : 1;
       this.tableColums = tableColums(this.default_tab);
       this.handleArr = handleArr(this.default_tab);
-    }
-
+    },
+    // 提交参会名单
+    submitAttendees(row,type){
+      type==='查看'? (this.isParticipateShow = true)  : (this.isAddParticipateShow = true)
+      this.currentRsCalendarId = row.RsCalendarId
+      this.currentResearcherId = row.ResearcherId
+    },
   },
   mounted() {
     this.init();