Browse Source

Merge branch 'crm_15.9' into debug

bding 11 months ago
parent
commit
49cd40074b

+ 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)
+  }, 
 };
 
 /*

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

+ 49 - 0
src/views/custom_manage/contacts/compontents/contactsColums.js

@@ -337,6 +337,17 @@ export const tableColums = (type) => {
           key: "FansNum",
         },
       ]
+    : type === 14
+    ? [
+        {
+          label: "反馈内容",
+          key: "KeyWord",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
     : [];
 };
 
@@ -811,6 +822,21 @@ export const organizationTableColums = (type) => {
           // widthsty: 300,
         },
       ]
+    : type === 14
+    ? [
+        {
+          label: "反馈人姓名",
+          key: "RealName",
+        },
+        {
+          label: "反馈内容",
+          key: "KeyWord",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
     : [];
 };
 
@@ -1309,5 +1335,28 @@ export const wholeOrganizationTableColums = (type) => {
           key: "FansNum",
         },
       ]
+    : type === 14
+    ? [
+        {
+          label: "客户名称",
+          key: "CompanyName",
+        },
+        {
+          label: "反馈人姓名",
+          key: "RealName",
+        },
+        {
+          label: "手机号",
+          key: "Mobile",
+        },
+        {
+          label: "反馈内容",
+          key: "KeyWord",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
     : [];
 };

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

+ 22 - 1
src/views/custom_manage/contacts/mutualList.vue

@@ -1,7 +1,10 @@
 <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>
@@ -208,6 +211,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>
@@ -221,6 +235,13 @@ 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>

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

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

@@ -0,0 +1,129 @@
+<template>
+  <el-dialog v-dialogDrag :visible.sync="isServiceDetailsShow" 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="addrServeTypeNameess" label="服务类型" width="120"> </el-table-column>
+      <el-table-column align="center" prop="address" label="主题标签">
+        <template slot-scope="{ row }">
+          <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;
+          if (scroll <= 1 && !this.noMoreData) {
+            this.page_no++;
+            this.loadData();
+          }
+        }, 300)
+      );
+    },
+
+    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.$emit("update:isServiceDetailsShow", false);
+    },
+    // 时间的计算
+    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>

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

@@ -0,0 +1,347 @@
+<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>
+                <p>服务覆盖率为截至前一天的数据,非当前实时数据</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="15" :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() {},
+    // 获取表格数据
+    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>