Эх сурвалжийг харах

Merge branch 'master' into cygx_13.9

bding 3 сар өмнө
parent
commit
086f050f25
42 өөрчлөгдсөн 1797 нэмэгдсэн , 584 устгасан
  1. 27 1
      src/api/modules/crmApi.js
  2. 13 1
      src/api/modules/rai/raiApi.js
  3. 5 0
      src/api/modules/sealApi.js
  4. 7 0
      src/api/modules/statisticApi.js
  5. BIN
      src/assets/img/contact_transfer.jpg
  6. BIN
      src/assets/img/is_maker_icon.png
  7. 1 1
      src/components/searchDistPicker.vue
  8. 7 1
      src/routes/modules/statisticRoutes.js
  9. 1 1
      src/views/Home.vue
  10. 10 0
      src/views/business_trip_manage/businessApplication.vue
  11. 10 0
      src/views/business_trip_manage/businessApproval.vue
  12. 24 2
      src/views/business_trip_manage/businessCalendar.vue
  13. 15 2
      src/views/business_trip_manage/components/tripApplicationDia.vue
  14. 19 0
      src/views/business_trip_manage/components/tripApproveDia.vue
  15. 14 5
      src/views/contract_manage/addContract.vue
  16. 1 1
      src/views/contract_manage/components/QyServiceTable.vue
  17. 58 11
      src/views/custom_manage/contacts/contactsList.vue
  18. 82 25
      src/views/custom_manage/contractStatistics.vue
  19. 12 9
      src/views/custom_manage/customList/applyTurn.vue
  20. 81 0
      src/views/custom_manage/customList/components/ContactTransferDlg.vue
  21. 326 280
      src/views/custom_manage/customList/components/raiPermissionbox.vue
  22. 51 5
      src/views/custom_manage/customList/customDetail.vue
  23. 4 4
      src/views/custom_manage/customList/updateServe.vue
  24. 82 0
      src/views/dataReport_manage/components/NotRenewedDlg.vue
  25. 6 4
      src/views/dataReport_manage/components/previousDetail.vue
  26. 103 23
      src/views/dataReport_manage/configdata.js
  27. 89 85
      src/views/dataReport_manage/equityCustomStatistics.vue
  28. 10 1
      src/views/dataReport_manage/equityServiceStatistics.vue
  29. 486 0
      src/views/dataReport_manage/raiStockCutomList.vue
  30. 2 0
      src/views/rai_manage/activityManage/components/addActivity.vue
  31. 2 0
      src/views/rai_manage/activityManage/components/addComopnents/ResearchDeduct.vue
  32. 85 67
      src/views/rai_manage/components/addChoiceness.vue
  33. 29 14
      src/views/rai_manage/components/editMobile.vue
  34. 1 1
      src/views/rai_manage/components/matchingDlg.vue
  35. 6 6
      src/views/rai_manage/components/report_preview/choicenessPre.vue
  36. 3 3
      src/views/rai_manage/cygxManage/components/lableDlg.vue
  37. 3 0
      src/views/roadshow_manage/compononts/addActivityCellDia.vue
  38. 2 2
      src/views/roadshow_manage/compononts/addMatterDia.vue
  39. 8 14
      src/views/roadshow_manage/myCalendar.vue
  40. 80 14
      src/views/seal_manage/approvalList.vue
  41. 31 0
      src/views/seal_manage/updateSeal.vue
  42. 1 1
      src/views/system_manage/approvalManage.vue

+ 27 - 1
src/api/modules/crmApi.js

@@ -781,6 +781,16 @@ const customInterence = {
   getSimpleServiceList: () => {
     return http.get('/statistic_report/contract/service/simple')
   },
+  /**
+   * --------开票到款统计
+  */
+  /**
+   * 销售下拉
+   * @returns 
+   */
+  sellerSelectList: () => {
+    return http.get('/custom/seller/check/invoice_payment/list')
+  },
   /**
    * 获取客户合同商品到款列表
   * @param data.page_size - 每页数据量 - 必填
@@ -1073,7 +1083,23 @@ const customInterence = {
    */
   yananxuanPermissionOpen:(params)=>{
     return http.post("/custom/update/user/yananxuan/permission",params)
-  }
+  },
+  //查询移动记录列表
+    /**
+   * 
+   * @returns 
+   */
+  getCustomListMoveLog:(params)=>{
+      return http.get("/custom/user/listMoveLog",params)
+  },
+  //修改联系人外呼手机号接口
+    /**
+   * 
+   * @returns 
+   */
+  editOutboundMobile:(params)=>{
+      return http.post("/custom/user/edit/outbound_mobile",params)
+   }
 };
 
 /*

+ 13 - 1
src/api/modules/rai/raiApi.js

@@ -1005,7 +1005,15 @@ const raiInterface = {
   getReportSelectionArticle: (params) => {
     return http.get("/cygx/reportSelection/getArticle", params);
   },
-
+  /**
+   *  获取综述报告
+   * @param {ThirdName} params
+   * @param {ChartPermissionId} params
+   * @returns
+   */
+  getReportSelectionThird_name: (params) => {
+    return http.post("/cygx/reportSelection/add/third_name", params);
+  },
   /**
    * 上
    * 周
@@ -1095,6 +1103,10 @@ const raiInterface = {
   industrialSubjectSearch: (params) => {
     return http.get("cygx/industrialSubject/search", params);
   },
+  // 查找标的
+  industrialAndSubjectSearch: (params) => {
+    return http.get("cygx/industrialAndSubject/search", params);
+  },
   // 查找标的 标的详情搜索
   industrialSubjectSearchInfo: (params) => {
     return http.get("/cygx/industrialSubject/searchInfo", params);

+ 5 - 0
src/api/modules/sealApi.js

@@ -70,6 +70,11 @@ const sealInterence={
 	//上传/更新签回附件
 	sealCheckFileUpload:params=>{
 		return http.post('/seal/uploadCheckBackFile',params)
+	},
+
+	//获取归属公司
+	getBelongCompany: params => {
+		return http.get('/seal/getAffiliatedCompany')
 	}
 }
 

+ 7 - 0
src/api/modules/statisticApi.js

@@ -34,6 +34,9 @@ const dataMainInterface = {
 	stackList:params => {
 		return http.get('/statistic_report/stack_company_list',params);
 	},
+	raiStackList:params => {
+		return http.get('/statistic_report/stack_company_list_rai',params);
+	},
 	/**
 	 * 获取增量客户列表接口
 	 * @param {PageSize} params 
@@ -186,6 +189,10 @@ const dataMainInterface = {
 	mergeCompanyPreviousDetail:params => {
 		return http.get('/statistic_report/merge_company_previous/detail',params);
 	},
+	// 客户数据未续约说明更多上一年
+	mergeCompanyPreviousDetailYear:params => {
+		return http.get('/statistic_report/merge_company_previous/last_year',params);
+	},
 	/**
 	 * 	// 获取图表阅读统计列表
 	 * @param {PageSize} params 

BIN
src/assets/img/contact_transfer.jpg


BIN
src/assets/img/is_maker_icon.png


+ 1 - 1
src/components/searchDistPicker.vue

@@ -106,7 +106,7 @@ export default {
                     }else{
                         this.city = {cityKey:'',cityName:this.cityInfo}
                     }
-                    if(this.city.cityKey){
+                    if(this.city.cityKey && this.showArea){
                         const areaResult = Object.entries(area_sorce[this.city.cityKey]).find(([key,val])=>val===this.areaInfo)||['',this.areaInfo]
                         this.area={areaKey:areaResult[0],areaName:areaResult[1]}
                     }else{

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

@@ -27,6 +27,12 @@ export default [
 				name: '存量客户数据',
 				hidden: false
 			},
+			{
+				path: 'raiStocklist',
+				component: () => import('@/views/dataReport_manage/raiStockCutomList.vue'),
+				name: '权益存量客户',
+				hidden: false
+			},
 			{
 				path: 'contractlist',
 				component: () => import('@/views/dataReport_manage/contractList.vue'),
@@ -48,7 +54,7 @@ export default [
 			{
 				path: 'equityCustomStatistics',
 				component: () => import('@/views/dataReport_manage/equityCustomStatistics.vue'),
-				name: '权益客户统计',
+				name: '权益增量客户',
 				hidden: false
 			},
 			{

+ 1 - 1
src/views/Home.vue

@@ -62,7 +62,7 @@
                   </template>
                   <el-menu-item
                     v-for="child in item.children"
-                    :index="child.path=='etaForum'?'etaForum':child.path"
+                    :index="child.path=='etaForum'?$route.fullPath:child.path"
                     :path="child.path"
                     :key="child.path"
                     v-show="!child.hidden"

+ 10 - 0
src/views/business_trip_manage/businessApplication.vue

@@ -39,6 +39,11 @@
           {{ row.Transportation.indexOf('其他')!=-1?row.Transportation.substring(row.Transportation.indexOf('-')+1):row.Transportation }}
         </template>
       </el-table-column>
+      <el-table-column label="行程说明" show-overflow-tooltip prop="Itinerary" align="center">
+        <template slot-scope="{row}">
+          {{ row.Itinerary }}
+        </template>
+      </el-table-column>
       <el-table-column label="同行人" prop="PeerPeopleName" align="center" show-overflow-tooltip>
         <template slot-scope="{row}">
           {{ row.PeerPeopleName || '无' }}
@@ -262,4 +267,9 @@ import mPage from "@/components/mPage.vue";
       }
     }
   }
+</style>
+<style lang="scss">
+.el-tooltip__popper{ 
+  max-width:700px;
+} 
 </style>

+ 10 - 0
src/views/business_trip_manage/businessApproval.vue

@@ -36,6 +36,11 @@
           {{ row.Transportation.indexOf('其他')!=-1?row.Transportation.substring(row.Transportation.indexOf('-')+1):row.Transportation }}
         </template>
       </el-table-column>
+      <el-table-column label="行程说明" show-overflow-tooltip prop="Itinerary" align="center">
+        <template slot-scope="{row}">
+          {{ row.Itinerary }}
+        </template>
+      </el-table-column>
       <el-table-column label="同行人" prop="PeerPeopleName" align="center" show-overflow-tooltip>
         <template slot-scope="{row}">
           {{ row.PeerPeopleName || '无' }}
@@ -204,4 +209,9 @@ import mPage from "@/components/mPage.vue";
       }
     }
   }
+</style>
+<style lang="scss">
+.el-tooltip__popper{ 
+  max-width:700px;
+} 
 </style>

+ 24 - 2
src/views/business_trip_manage/businessCalendar.vue

@@ -108,14 +108,22 @@
           {{ detailItem.Province+' '+detailItem.City }}
         </div>        
         <div class="detail-item">
-          <div class="detail-item-label"> 出差事由:</div>
+          <div class="detail-item-label">出差事由:</div>
           {{ detailItem.Reason }}
         </div>
         <div class="detail-item">
           <div class="detail-item-label">交通工具:</div>
           {{ detailItem.Transportation && detailItem.Transportation.indexOf('其他')!=-1?
           detailItem.Transportation.substring(detailItem.Transportation.indexOf('-')+1):detailItem.Transportation }}
-        </div>        
+        </div>
+        <div class="detail-item">
+          <div class="detail-item-label">行程说明:</div>
+          <el-tooltip popper-class="item-top-intro" :disabled="detailItem.Itinerary&&detailItem.Itinerary.length<61" effect="dark" :content="detailItem.Itinerary" placement="top">
+            <div class="itinerary-text">
+              {{ detailItem.Itinerary }}
+            </div>
+          </el-tooltip>
+        </div>    
         <div class="detail-item" style="line-height: 20px;" v-show="detailItem.PeerPeopleName">
           <div class="detail-item-label">同行人:</div>
           {{ detailItem.PeerPeopleName }}
@@ -391,6 +399,15 @@ import bussinessTrip from '@/views/business_trip_manage/mixins/bussinessTrip'
         min-width: 80px;
         text-align: right;
       }
+      .itinerary-text{
+        width:100%;
+        overflow:hidden; 
+        text-overflow:ellipsis;
+        display:-webkit-box;
+        line-clamp: 5;
+        -webkit-box-orient:vertical;
+        -webkit-line-clamp:5;
+      }
     }
     .detail-date{
       margin-bottom: 14px;
@@ -400,3 +417,8 @@ import bussinessTrip from '@/views/business_trip_manage/mixins/bussinessTrip'
   }
 }
 </style>
+<style lang="scss">
+.item-top-intro{
+  max-width: 400px;
+}
+</style>

+ 15 - 2
src/views/business_trip_manage/components/tripApplicationDia.vue

@@ -47,6 +47,14 @@
           placeholder="请输入交通工具" v-if="dataForm.vehicle=='其他'"></el-input>
         </div>
       </el-form-item>
+      <el-form-item label="行程说明" prop="Itinerary">
+        <el-input
+          type="textarea"
+          :autosize="{ minRows: 2, maxRows: 4}"
+          placeholder="请输入行程说明"
+          v-model="dataForm.Itinerary">
+        </el-input>
+      </el-form-item>
       <el-form-item label="同行人" prop="companion" >
         <el-cascader :options="userList" v-model="companionSelectList" filterable 
         ref="companionCascader" @remove-tag="removeTag"
@@ -93,6 +101,7 @@ import searchDistPicker from '@/components/searchDistPicker.vue';
         if(value&&this.reapply.BusinessApplyId){
           this.dataForm={
             BusinessApplyId:this.reapply.BusinessApplyId,
+            Itinerary:this.reapply.Itinerary,
             arriveTime:this.reapply.ArriveDate,
             backTime:this.reapply.ReturnDate,
             province:this.reapply.Province,
@@ -125,10 +134,12 @@ import searchDistPicker from '@/components/searchDistPicker.vue';
           vehicle:'',
           companion:'',
           companionName:'',
-          otherVehicle:''
+          otherVehicle:'',
+          Itinerary:''
         },
         companionSelectList:[],
         rules:{
+          Itinerary:{required:true,message:"行程说明不能为空",trigger:'blur'},
           arriveTime:{required:true,message:"到达日期不能为空",trigger:'change'},
           backTime:{required:true,message:"返程日期不能为空",trigger:'change'},
           city:{required:true,message:"目的地不能为空",trigger:'change'},
@@ -212,7 +223,8 @@ import searchDistPicker from '@/components/searchDistPicker.vue';
           vehicle:'',
           companion:'',
           companionName:'',
-          otherVehicle:''
+          otherVehicle:'',
+          Itinerary:''
         }
         this.companionSelectList=[]
         this.$nextTick(()=>{
@@ -240,6 +252,7 @@ import searchDistPicker from '@/components/searchDistPicker.vue';
               Transportation:this.dataForm.vehicle=='其他'?`${this.dataForm.vehicle}-${this.dataForm.otherVehicle}`:this.dataForm.vehicle,
               PeerPeopleId:this.dataForm.companion,
               PeerPeopleName:this.dataForm.companionName,
+              Itinerary:this.dataForm.Itinerary
             }
             // console.log(params);
             if(this.dataForm.BusinessApplyId){

+ 19 - 0
src/views/business_trip_manage/components/tripApproveDia.vue

@@ -29,6 +29,13 @@
         approveItem.Transportation.substring(approveItem.Transportation.indexOf('-')+1):
         approveItem.Transportation }}
       </el-form-item>
+      <el-form-item label="行程说明">
+        <el-tooltip popper-class="item-top-intro" :disabled="approveItem.Itinerary&&approveItem.Itinerary.length<51" effect="dark" :content="approveItem.Itinerary" placement="top">
+          <div class="itinerary-text">
+            {{ approveItem.Itinerary }}
+          </div>
+        </el-tooltip>
+      </el-form-item>
       <el-form-item label="同行人" v-show="approveItem.PeerPeopleName">
         {{ approveItem.PeerPeopleName }}
       </el-form-item>
@@ -117,6 +124,15 @@ import {businessTripInterence} from "api/api.js"
 </script>
 
 <style lang="scss" scoped>
+.itinerary-text{
+  width: 100%;
+  overflow:hidden; 
+  text-overflow:ellipsis;
+  display:-webkit-box;
+  line-clamp: 3;
+  -webkit-box-orient:vertical;
+  -webkit-line-clamp:3;
+}
 .dialog-footer{
   text-align: center;
   padding:60px 40px 20px ;
@@ -125,4 +141,7 @@ import {businessTripInterence} from "api/api.js"
 
 <style lang="scss">
 @import "../style/trip-dialog.scss";
+.item-top-intro{
+  max-width: 400px !important;
+}
 </style>

+ 14 - 5
src/views/contract_manage/addContract.vue

@@ -63,7 +63,7 @@
               <span>{{ RoleType === "ficc_seller" ? "FICC" : "权益" }}</span>
             </el-form-item>
           </div>
-          <el-form-item label="合同类型" prop="constractType" class="border-top">
+          <el-form-item label="合同类型" prop="constractType" class="border-top" v-if="!raiCompanyType && !raiCompanyStatus">
             <el-radio-group v-model="formData.constractType">
               <div style="display:flex">
                 <div style="margin-right:10px;">
@@ -106,15 +106,17 @@
           </div>
 
           <div class="flex border-top">
-            <el-form-item label="合同金额" prop="price" style="width: 50%">
-              <el-input v-model="formData.price" @focus="handlePriceBoxFocus('price')" @blur="handlePriceBoxBlur('price')" placeholder="请输入合同金额" style="width: 220px"></el-input>
+            <el-form-item :label="raiCompanyType ? '服务费总报价' : '合同金额'" prop="price" style="width: 50%">
+              <el-input v-model="formData.price" @focus="handlePriceBoxFocus('price')" @blur="handlePriceBoxBlur('price')" :placeholder="raiCompanyType ? '请输入服务费总报价(优惠前)' : '请输入合同金额'" style="width: 220px"></el-input>
             </el-form-item>
             <span style="line-height: 40px">{{ formData.price | digitUppercase }}</span>
           </div>
 
           <div class="flex border-top">
-            <el-form-item label="优惠后金额" prop="price2" style="width: 50%">
-              <el-input v-model="formData.price2" @focus="handlePriceBoxFocus('price2')" @blur="handlePriceBoxBlur('price2')" placeholder="请输入优惠后金额" style="width: 220px"></el-input>
+            <el-form-item  :label="raiCompanyType ? '实际付款金额' : '优惠后金额'"  prop="price2" style="width: 50%">
+              <el-input v-model="formData.price2" @focus="handlePriceBoxFocus('price2')" @blur="handlePriceBoxBlur('price2')" 
+              :placeholder="raiCompanyType ? '请输入实际付款金额(优惠后)' : '请输入优惠后金额'"
+              style="width: 220px"></el-input>
             </el-form-item>
             <span style="line-height: 40px">{{ formData.price2 | digitUppercase }}</span>
           </div>
@@ -368,6 +370,9 @@ export default {
       selectServiceData: [],
       editValue: {}, //修改小套餐的value
       PayChannelOptions:[],//搜索出付款方列表
+
+      raiCompanyType: false,// 是否是权益客户类型
+      raiCompanyStatus: false// 权益客户状态
     };
   },
   created() {
@@ -497,6 +502,10 @@ export default {
         this.formData.customeXYM=res.Data.Item.CreditCode
         this.formData.province=res.Data.Item.Province
         this.formData.city=res.Data.Item.City
+        this.raiCompanyType = res.Data.RaiItem && res.Data.RaiItem.ProductName == '权益'
+        this.raiCompanyStatus = res.Data.RaiItem && res.Data.RaiItem.Status.includes('X类试用')
+        console.log( this.raiCompanyType);
+        
       }
       // 获取以前的合同自动 填充部分信息
       let res4=await contractInterface.getHistoryContract({CompanyId:item.CompanyId})

+ 1 - 1
src/views/contract_manage/components/QyServiceTable.vue

@@ -404,7 +404,7 @@ export default {
         }
       }
       // 45万 70万 医药、消费、科技、智造的升级
-      if([5,6,23,24,25,26,12].includes(row.ServiceTemplateId)){
+      if([5,6,23,24,25,26,12,27].includes(row.ServiceTemplateId)){
         if(columnIndex==1){
           return [1,2]
         }else if(columnIndex==2){

+ 58 - 11
src/views/custom_manage/contacts/contactsList.vue

@@ -54,31 +54,46 @@
       </el-autocomplete>
     </div>
     <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 :data="tableData" style="width: 100%" border @sort-change="sortChangeHandle" :row-class-name="setRowClass">
+        <el-table-column align="center" prop="RealName" width="90" label="姓名">
+          <template slot-scope="{ row }">
+            <span>{{ row.RealName }}</span>
+
+            <img v-if="row.IsMaker == 1" class="name-maker" src="~@/assets/img/is_maker_icon.png" alt="" />
+          </template>
+        </el-table-column>
         <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="公司名称">
-          <template slot-scope="{row}">
+          <template slot-scope="{ row }">
             <el-tooltip effect="dark" placement="top-start" content="过去4周,kp均未覆盖服务" v-if="row.IsUserMaker == -1">
               <span class="deletesty" @click="goDetail(row)">{{ row.CompanyName }}</span>
             </el-tooltip>
             <span v-else class="editsty" @click="goDetail(row)">{{ row.CompanyName }}</span>
             <!-- <span class="editsty" @click="goDetail(scope.row)">{{ scope.row.CompanyName }}</span> -->
-            </template>
+          </template>
         </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">
+        <el-table-column align="center" prop="IsMaker" width="80" label="职位">
           <template slot-scope="{ row }">
-            {{ row.IsMaker == 1 ? "是" : "否" }}
+            {{ row.Position }}
           </template>
         </el-table-column>
         <el-table-column align="center" prop="RegisterTime" width="110" label="注册时间"> </el-table-column>
-        <el-table-column align="center" width="120" label="是否关注公众号">
+        <el-table-column align="center" width="140" label="可接收公众号推送">
           <template slot-scope="{ row }">
-            {{ row.IsSubscribeCygx == 1 ? "是" : "否" }}
+            <div style="text-align: left">
+              <img v-if="row.IsSubscribeCygx == 1" style="width: 16px; height: 16px" src="~@/assets/img/icons/icon_1.png" alt="" />
+              <img v-else style="width: 16px; height: 16px" src="~@/assets/img/icons/icon_2.png" alt="" />
+              <span>查研观向小助手</span>
+            </div>
+            <div style="text-align: left">
+              <img v-if="row.IsSubscribeMfyx == 1" style="width: 16px; height: 16px" src="~@/assets/img/icons/icon_1.png" alt="" />
+              <img v-else style="width: 16px; height: 16px" src="~@/assets/img/icons/icon_2.png" alt="" />
+              <span>买方研选</span>
+            </div>
           </template>
         </el-table-column>
         <el-table-column align="center" prop="InteractionNum" width="110" label="互动量" :render-header="renderHeader" sortable="custom">
@@ -106,7 +121,7 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="" label="备注" width="90">
+        <!-- <el-table-column align="center" prop="" label="备注" width="90">
           <template slot-scope="{ row }">
             <div class="remark-list">
               <div class="button">
@@ -115,7 +130,7 @@
               </div>
             </div>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column align="center" prop="" label="操作" width="160">
           <template slot-scope="{ row }">
             <span :class="row.IsRemind ? 'deletesty' : 'editsty'" @click="remindHandler(row)">{{ row.IsRemind ? "取消提醒" : "互动提醒" }}</span>
@@ -154,6 +169,7 @@
     <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" />
+    <ContactTransfer :contactTransferDlgVisible.sync="contactTransferDlgVisible" :TransferMobile.sync="TransferMobile" />
   </div>
 </template>
 
@@ -165,9 +181,11 @@ import InteractionDlg from "./compontents/interactionDlg.vue";
 import LabelDlg from "./compontents/labelDlg.vue";
 import RemindDlg from "./compontents/remindDlg.vue";
 import FeedbackDlg from "./compontents/feedbackDlg.vue";
+import ContactTransfer from "../customList/components/ContactTransferDlg.vue";
+
 export default {
   name: "",
-  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg },
+  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg, ContactTransfer },
   props: {},
   data() {
     return {
@@ -224,6 +242,10 @@ export default {
       isShowRemindDlg: false, // 消息提醒的弹框
       remindList: {}, // 消息提醒的数据
       showFeedbackDlg: false, // 交流反馈的弹框
+
+      TransferMobile: 0,
+
+      contactTransferDlgVisible: false, //联系人转移的弹框
     };
   },
   computed: {},
@@ -443,6 +465,18 @@ export default {
       this.remindList = item;
       this.showFeedbackDlg = true;
     },
+    // 点击了共享联系人
+    clickContactTransfer(item) {
+      this.contactTransferDlgVisible = true;
+      this.TransferMobile = item.Mobile;
+    },
+    // 设置表格行的样式
+    setRowClass({ row }) {
+      if (row.IsMaker == 1) {
+        console.log(row);
+        return "not-read-seven-days";
+      }
+    },
   },
   /* 页面跳转前记录参数 */
   beforeRouteLeave(to, from, next) {
@@ -468,8 +502,21 @@ export default {
   },
 };
 </script>
+<style>
+.not-read-seven-days {
+  background-color: #fff8f8 !important;
+}
+</style>
 <style scoped lang="scss">
 .container-contactsList {
+  .name-maker {
+    width: 20px;
+    height: 14px;
+    position: absolute;
+    right: 0;
+    top: 0;
+  }
+
   .el-select {
     width: 200px;
     margin-right: 20px;

+ 82 - 25
src/views/custom_manage/contractStatistics.vue

@@ -2,26 +2,51 @@
   <div id="customer-statistics-container" class="customer-statistics-container">
     <div class="search-zone">
       <div class="search-box">
-        <el-input v-model="searchParams.Keyword" placeholder="请输入客户名称" clearable class="search-item"
-        @input="searchList" prefix-icon="el-icon-search" style="width: 240px;" ></el-input>
-        <el-cascader :options="serviceList" style="width: 240px;margin: 0 0 8px 20px;" filterable v-model="checkedService"
-          @change="serviceChange" placeholder="请选择套餐信息" clearable collapse-tags :show-all-levels="false"
-          :props="{multiple:true,label:'title',value:'service_template_id',children:'children',emitPath:false}" key="serivce" >
-        </el-cascader>
-        <div class="date-box">
-          <el-date-picker v-model="searchDate" type="daterange" @change="currentDateTab=0" style="max-width: 240px;margin-right: 20px;"
-            value-format="yyyy-MM-dd" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-          <el-select v-model="searchParams.TimeType" placeholder="请选择日期类型" @change="searchList"
-          style="width: 240px;margin-right: 20px;" clearable>
-            <el-option :label="item.label" :value="item.value" v-for="item in timeTypeData" :key="item.value"></el-option>
-          </el-select>
-          <div class="composition-button-tabs">
-            <el-button size="large" v-for="(item,index) in dateButtonData" :key="item.tabId"
-            class="date-button" 
-            :class="[index==0?'first-button':index==(dateButtonData.length-1)?'last-button':'inner-button',currentDateTab==item.tabId?'selectTab':'']" 
-            @click="changeDateType(item)">{{ item.text }}</el-button>
-          </div>
-        </div>
+        <el-form label-width="0" :inline="true" :model="formInline">
+            <el-form-item label="">
+              <el-input v-model="searchParams.Keyword" placeholder="请输入客户名称" clearable class="search-item"
+              @input="searchList" prefix-icon="el-icon-search" style="width: 240px;" ></el-input>
+            </el-form-item>
+            <el-form-item label="" v-if="currentSdId==AdminId ||Role=='admin'||Role=='ficc_admin'||Role=='rai_admin'">
+              <el-cascader :options="saleList" style="width: 240px;margin: 0 0 8px 0;" filterable v-model="checkedSale"
+                @change="saleChange" placeholder="请选择销售" clearable collapse-tags :show-all-levels="false"
+                :props="{multiple:true,label:'RealName',value:'AdminId',children:'ChildrenList',emitPath:false}" key="sale" >
+              </el-cascader>
+            </el-form-item>
+            <el-form-item label="">
+              <el-cascader :options="serviceList" style="width: 240px;margin: 0 0 8px 0;" filterable v-model="checkedService"
+                @change="serviceChange" placeholder="请选择套餐信息" clearable collapse-tags :show-all-levels="false"
+                :props="{multiple:true,label:'title',value:'service_template_id',children:'children',emitPath:false}" key="serivce" >
+              </el-cascader>
+            </el-form-item>
+            <el-form-item label="">
+              <div class="date-box">
+                <el-date-picker v-model="searchDate" type="daterange" @change="currentDateTab=0" style="max-width: 240px;margin-right: 15px;"
+                  value-format="yyyy-MM-dd" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+                <div class="composition-button-tabs">
+                  <el-button size="large" v-for="(item,index) in dateButtonData" :key="item.tabId"
+                  class="date-button" 
+                  :class="[index==0?'first-button':index==(dateButtonData.length-1)?'last-button':'inner-button',currentDateTab==item.tabId?'selectTab':'']" 
+                  @click="changeDateType(item)">{{ item.text }}</el-button>
+                </div>
+              </div>
+            </el-form-item>
+            <el-form-item label="">
+              <el-select v-model="searchParams.TimeType" placeholder="请选择日期类型" @change="searchList" style="width: 240px;" clearable>
+                  <el-option :label="item.label" :value="item.value" v-for="item in timeTypeData" :key="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="">
+              <el-select v-model="searchParams.HasInvoice" placeholder="请选择开票状态" @change="searchList" style="width: 240px;" clearable>
+                  <el-option :label="item.label" :value="item.value" v-for="item in invoiceData" :key="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="">
+              <el-select v-model="searchParams.HasPayment" placeholder="请选择到款状态" @change="searchList" style="width: 240px;" clearable>
+                  <el-option :label="item.label" :value="item.value" v-for="item in paymentData" :key="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+        </el-form>
       </div>
     </div>
     <div class="amount-show-zone">
@@ -174,12 +199,17 @@ import {customInterence} from '@/api/api.js'
 
       this.payTypeArray=[{id:0,type:''},{id:1,type:'年付'},{id:2,type:'半年付'},{id:3,type:'季付'},{id:4,type:'次付'}]
       this.timeTypeData=[{label:'开票日期',value:1},{label:'到款日期',value:2},{label:'开票日期&到款日期',value:3}]
+      this.invoiceData=[{label:'未开票',value:0 },{label:'已开票',value:1}]
+      this.paymentData=[{label:'未到款',value:0 },{label:'到款',value:1}]
       this.dateButtonData=[{text:'近1周',tabId:1,type:'week',diff:1},{text:'近1月',tabId:2,type:'month',diff:1},
         {text:'近2月',tabId:3,type:'month',diff:2},{text:'近3月',tabId:4,type:'month',diff:3}]
 
       return {
+        currentSdId:process.env.NODE_ENV=='production'?13:233,
         serviceList:[],
+        saleList:[],
         checkedService:[],
+        checkedSale:[],
         searchParams:{
           CurrentIndex:1,
           PageSize:10,
@@ -191,6 +221,9 @@ import {customInterence} from '@/api/api.js'
           TimeType:1,
           SortType:'',
           SortParam:'',
+          HasInvoice:'',// 开票状态 0未开票,1已开票
+          HasPayment:'',// 到款状态 0未到款,1到款
+          SellerIds:''
         },
         currentDateTab:0,
         searchDate:[startDate,endDate],
@@ -206,6 +239,9 @@ import {customInterence} from '@/api/api.js'
       }
     },
     created(){
+      if(this.currentSdId==this.AdminId ||this.Role=='admin'||this.Role=='ficc_admin'||this.Role=='rai_admin'){
+        this.saleSelect()
+      }
       this.getSimpleServiceList()
       this.getList()
     },
@@ -223,8 +259,16 @@ import {customInterence} from '@/api/api.js'
     },
     computed:{
       isAdmin(){
-        return localStorage.getItem('Role').indexOf('admin')!=-1
-      }
+        return localStorage.getItem('Role').indexOf('admin')!=-1 || localStorage.getItem('RoleIdentity').indexOf('ficc_group')!=-1
+      },
+      Role() {
+        let role = localStorage.getItem('Role') || '';
+        return role;
+      },
+      AdminId() {
+        let role = localStorage.getItem('AdminId') || '';
+        return role;
+      },
     },
     methods: {
       getSimpleServiceList(){
@@ -266,6 +310,10 @@ import {customInterence} from '@/api/api.js'
         this.searchParams.CurrentIndex = pageNo
         this.getList()
       },
+      saleChange(value){
+        this.searchParams.SellerIds = value.join(',')
+        this.searchList()
+      },
       serviceChange(value){
         this.searchParams.ServiceType = value.join(',')
         this.searchList()
@@ -299,6 +347,13 @@ import {customInterence} from '@/api/api.js'
       disabledCheck(e){
         if(!this.domList[e]) return true
         return this.domList[e].offsetWidth<=this.domList[e].parentNode.offsetWidth
+      },
+      // 获取销售下拉列表
+      saleSelect(){
+        customInterence.sellerSelectList({}).then(res=>{
+          console.log(res)
+          this.saleList = res.Data.List || []
+        })
       }
     },
     mounted(){
@@ -323,18 +378,17 @@ import {customInterence} from '@/api/api.js'
       background-color: white;
       border-radius: 4px;
       .search-box{
-        margin-left: -20px;
         display: flex;
         align-items: center;
         flex-wrap: wrap;
         .search-item{
           width: 232px;
-          margin: 0 0 8px 20px;
+          margin: 0 0 8px 0;
         }
         .date-box{
           display: flex;
           align-items: center;
-          margin: 0 0 8px 20px;
+          margin: 0 0 8px 0;
           .composition-button-tabs{
             white-space: nowrap;
             .date-button{
@@ -468,4 +522,7 @@ import {customInterence} from '@/api/api.js'
       }
     }
   }
+  .el-form-item{
+    margin-bottom: 0;
+  }
 </style>

+ 12 - 9
src/views/custom_manage/customList/applyTurn.vue

@@ -49,7 +49,7 @@
 					ref="formData" 
 					label-width="100px"
 					class="demo-ruleForm">
-						<el-form-item label="合同类型" prop="contract_type" style="width:100%" v-if="formData.contract_type">
+						<el-form-item label="合同类型" prop="contract_type" style="width:100%" v-if="formData.contract_type && !isRaiCompany">
 							<el-radio style="margin-right:5px" v-model="formData.contract_type" :label="formData.contract_type"/>
 							<el-tooltip
 								style="cursor: pointer;"
@@ -96,7 +96,7 @@
 							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 							<el-input 
 							v-model.number="formData.amount"
-							placeholder="请输入金额"
+							:placeholder="isRaiCompany ? '请输入实际付款金额(优惠后)':'请输入金额'"
 							style="width:400px"
 							clearable></el-input>
 							<span style="color:#666;">元</span>
@@ -200,7 +200,10 @@ export default {
 	computed:{
 		isXClassCustom(){
 			return	this.companyInfo.Status.includes('永续') || this.companyInfo.Status.includes('X类试用')
-		}
+		},
+		isRaiCompany(){
+			return this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益'
+		},
 	},
 	data () {
 		return {
@@ -273,15 +276,15 @@ export default {
 					this.selectedQuarters = res.Data.Item.Quarter.split(',')
 					let newArr = [];
 					/* 处理权限列表 */
-					if((this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益') && !this.isXClassCustom ) {
+					if(this.isRaiCompany && !this.isXClassCustom ) {
 						res.Data.Item.PermissionList[0].Items.map(item => {
 							item.disabled=item.isIndeterminate=false								
 							if(item.ChartPermissionId==22 && (!item.Child)) this.hasNoChild=true
 						})
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
-						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54,138,62].includes(key.ChartPermissionId))
+						let arr = item.Items.filter(key=> [22,21,20,19,23,30,148,62].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {
@@ -317,15 +320,15 @@ export default {
 			}).then(res => {
 				let newArr = [];
 				if(res.Ret === 200) {
-					if((this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益') && !this.isXClassCustom) {
+					if(this.isRaiCompany && !this.isXClassCustom) {
 						res.Data.List[0].Items.map(item => {
 							item.disabled=item.isIndeterminate=false								
 							if(item.ChartPermissionId==22 && (!item.Child)) this.hasNoChild=true
 						})
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.List.length&&res.Data.List.forEach(item => {
-						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54,138,62].includes(key.ChartPermissionId))
+						let arr = item.Items.filter(key=> [22,21,20,19,23,30,148,62].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032,52,53,54].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {

+ 81 - 0
src/views/custom_manage/customList/components/ContactTransferDlg.vue

@@ -0,0 +1,81 @@
+<template>
+  <div class="container">
+    <el-dialog
+      :visible.sync="contactTransferDlgVisible"
+      :close-on-click-modal="false"
+      :modal-append-to-body="true"
+      :append-to-body="true"
+      title="联系人转移记录"
+      @close="$emit('update:contactTransferDlgVisible', false)"
+      width="800px"
+      v-dialogDrag
+      center
+    >
+      <el-table :data="dataList" border max-height="300">
+        <el-table-column label="转移时间" prop="CreateTime" align="center"> </el-table-column>
+        <el-table-column label="原公司" prop="CompanyName" align="center"> </el-table-column>
+        <el-table-column label="移至公司" prop="CompanyNameMove" align="center"> </el-table-column>
+      </el-table>
+      <div class="container-close">
+        <el-button @click="$emit('update:contactTransferDlgVisible', false)">关闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { customInterence } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {
+    contactTransferDlgVisible: {
+      type: Boolean,
+      default: false,
+    },
+    TransferMobile:{
+      type: Number,
+      default: 0,
+    }
+  },
+  data() {
+    return {
+      dataList: [],
+    };
+  },
+  computed: {},
+  watch: {
+    contactTransferDlgVisible: {
+      handler(val) {
+        if (val) {
+          this.getDateList();
+        }
+      },
+      deep: true,
+      immediate: true,
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    async getDateList() {
+      const res = await customInterence.getCustomListMoveLog({
+        Mobile: this.TransferMobile,
+      });
+      if (res.Ret === 200) {
+        this.dataList = res.Data.List;
+      }
+      console.log(res, "-----");
+    },
+  },
+};
+</script>
+<style scoped>
+.container-close {
+  margin: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+</style>

+ 326 - 280
src/views/custom_manage/customList/components/raiPermissionbox.vue

@@ -1,59 +1,90 @@
 <template>
   <div class="rai-checkbox-content" id="rai-checkbox-content">
     <div class="rai-checkbox-bigS-box">
-      <el-checkbox v-model="itB.Checked" v-for="itB in data.ItemsBig" :key="itB.PermissionName"
-      @change="(e)=>bigServeCheck(e,itB,data)"
-      :indeterminate="itB.isIndeterminate && !itB.disabled" class="bigS-item" 
-      :disabled="itB.disabled || (formData.qyBigServeCheck!=getQyBigServeCheckNumber(itB.PermissionName) && formData.qyBigServeCheck!=0)"
-      >{{itB.PermissionName}}</el-checkbox>
+      <el-checkbox
+        v-model="itB.Checked"
+        v-for="itB in data.ItemsBig"
+        :key="itB.PermissionName"
+        @change="(e) => bigServeCheck(e, itB, data)"
+        :indeterminate="itB.isIndeterminate && !itB.disabled"
+        class="bigS-item"
+        :disabled="itB.disabled || (formData.qyBigServeCheck != getQyBigServeCheckNumber(itB.PermissionName) && formData.qyBigServeCheck != 0)"
+        >{{ itB.PermissionName }}</el-checkbox
+      >
     </div>
     <div class="rai-checkbox-box">
       <div class="rai-checkbox-main-container">
         <div class="rai-checkbox-main-row">
-          <div class="rai-checkbox-item" v-for="it in data.Items" :key="it.ChartPermissionId" 
-          :style="{'width':it.ChartPermissionId==23?'84px':it.ChartPermissionId==30?'110px':'168px'}">
+          <div
+            class="rai-checkbox-item"
+            v-for="it in data.Items"
+            :key="it.ChartPermissionId"
+            :style="{ width: [23, 148, 62].includes(it.ChartPermissionId) ? '84px' : it.ChartPermissionId == 30 ? '110px' : '168px' }"
+          >
             <template v-if="it.Child">
-              <el-checkbox :label="it.PermissionName" style="margin-right: 8px;" v-model="it.Checked"
-              @change="handleItemCheck(it,data)" :indeterminate="it.isIndeterminate" :disabled="it.disabled"></el-checkbox>
-              <el-checkbox-group v-model="data.CheckList" style="height: unset;" @change="handleQYChecked(it,data)" 
-              :disabled="it.disabled">
-                <div class="rai-checkbox-serve-box" >
-                  <el-checkbox :label="itChild.ChartPermissionId" v-for="itChild in it.Child" :key="itChild.ChartPermissionId"
-                  class="small-item" >{{ itChild.PermissionName }}</el-checkbox>
+              <el-checkbox
+                :label="it.PermissionName"
+                style="margin-right: 8px"
+                v-model="it.Checked"
+                @change="handleItemCheck(it, data)"
+                :indeterminate="it.isIndeterminate"
+                :disabled="it.disabled"
+              ></el-checkbox>
+              <el-checkbox-group v-model="data.CheckList" style="height: unset" @change="handleQYChecked(it, data)" :disabled="it.disabled">
+                <div class="rai-checkbox-serve-box">
+                  <el-checkbox :label="itChild.ChartPermissionId" v-for="itChild in it.Child" :key="itChild.ChartPermissionId" class="small-item">{{ itChild.PermissionName }}</el-checkbox>
                 </div>
               </el-checkbox-group>
             </template>
             <template v-else>
-              <el-checkbox-group v-model="data.CheckList" style="height: unset;margin-right: 8px;" @change="handleQYChecked(it,data)">
+              <el-checkbox-group v-model="data.CheckList" style="height: unset; margin-right: 8px" @change="handleQYChecked(it, data)">
                 <el-checkbox :label="it.ChartPermissionId" :disabled="it.disabled">{{ it.PermissionName }}</el-checkbox>
               </el-checkbox-group>
             </template>
           </div>
         </div>
-        <el-checkbox-group v-model="data.CheckList" style="height: unset;">
-          <div class="rai-checkbox-upS-box" >
-            <el-checkbox :label="itU.ChartPermissionId" v-for="itU in data.ItemsUp" :key="itU.ChartPermissionId"
-            class="rai-checkbox-item upS-item" :disabled="itU.disabled" 
-            @change="(e) => handleUpdateChecked(e,itU.PermissionName,data)">{{ itU.PermissionName }}</el-checkbox>
+        <el-checkbox-group v-model="data.CheckList" style="height: unset">
+          <div class="rai-checkbox-upS-box">
+            <el-checkbox
+              :label="itU.ChartPermissionId"
+              v-for="itU in data.ItemsUp"
+              :key="itU.ChartPermissionId"
+              class="rai-checkbox-item upS-item"
+              :disabled="itU.disabled"
+              @change="(e) => handleUpdateChecked(e, itU.PermissionName, data)"
+              >{{ itU.PermissionName }}</el-checkbox
+            >
           </div>
         </el-checkbox-group>
       </div>
       <div class="rai-checkbox-private-container">
-        <el-checkbox-group v-model="data.CheckList" style="height: unset;">
-          <div class="rai-checkbox-upS-box" >
-            <el-checkbox :label="itP.ChartPermissionId" v-for="(itP,inP) in data.ItemsPrivate" 
-            :key="itP.ChartPermissionId" :disabled="itP.disabled" :style="{'height':hasNoChild?'48px':'95px','width':itP.ChartPermissionId == 52 && data.CheckList.includes(52)? '220px' : itP.PermissionName.includes('研选')?'130px':'84px'}"
-            class="rai-checkbox-item upS-item" @change="e => handlePrivateChecked(e,itP,data)">
-            {{ itP.PermissionName }}
-            <p v-if="itP.ChartPermissionId == 31" class="checkbox-text">(30000元/年)</p>
-            <p v-if="itP.ChartPermissionId == 52" class="checkbox-text">(点/2000元)</p>
-            <input @click.stop @input="validateInteger" placeholder="请输入点数" style="margin-left:10px" v-if="itP.ChartPermissionId == 52 && data.CheckList.includes(52)" v-model="minus_sign_val" />
+        <el-checkbox-group v-model="data.CheckList" style="height: unset">
+          <div class="rai-checkbox-upS-box">
+            <el-checkbox
+              :label="itP.ChartPermissionId"
+              v-for="(itP, inP) in data.ItemsPrivate"
+              :key="itP.ChartPermissionId"
+              :disabled="itP.disabled"
+              :style="{ height: hasNoChild ? '48px' : '95px', width: itP.ChartPermissionId == 52 && data.CheckList.includes(52) ? '220px' : itP.PermissionName.includes('研选') ? '130px' : '84px' }"
+              class="rai-checkbox-item upS-item"
+              @change="(e) => handlePrivateChecked(e, itP, data)"
+            >
+              {{ itP.PermissionName }}
+              <p v-if="itP.ChartPermissionId == 31" class="checkbox-text">(30000元/年)</p>
+              <p v-if="itP.ChartPermissionId == 52" class="checkbox-text">(点/2000元)</p>
+              <input
+                @click.stop
+                @input="validateInteger"
+                placeholder="请输入点数"
+                style="margin-left: 10px"
+                v-if="itP.ChartPermissionId == 52 && data.CheckList.includes(52)"
+                v-model="minus_sign_val"
+              />
             </el-checkbox>
           </div>
         </el-checkbox-group>
-        <div class="rai-checkbox-notice-box" v-if="data.ItemsUp.length>0">
-          <span class="rai-checkbox-notice" v-if="formData.qyBigServeCheck">
-            同时包含{{formData.qyBigServeCheck==2?"10":"16"}}次专项调研</span>
+        <div class="rai-checkbox-notice-box" v-if="data.ItemsUp.length > 0">
+          <span class="rai-checkbox-notice" v-if="formData.qyBigServeCheck"> 同时包含{{ formData.qyBigServeCheck == 2 ? "12" : "16" }}次专项调研</span>
           <p class="rai-checkbox-notice" v-if="equityGroupDisabled(data.CheckList)">同时包含升级行业各5次专项调研</p>
         </div>
       </div>
@@ -62,268 +93,283 @@
 </template>
 
 <script>
-  export default {
-    name:'raiPermissionbox',
-    data() {
-      return {
-        minus_sign_val:''
+export default {
+  name: "raiPermissionbox",
+  data() {
+    return {
+      minus_sign_val: "",
+    };
+  },
+  props: {
+    data: {
+      required: true,
+      type: Object,
+    },
+    formData: {
+      //formData.qyBigServeCheck  0-无 1- 70万 2- 45万
+      required: true,
+      type: Object,
+    },
+    hasNoChild: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  created() {
+    // 回显
+    if (this.data.CheckList && this.data.CheckList.length > 0) {
+      this.data.Items.map((item) => {
+        if (item.Child) {
+          item.Child.map((t) => {
+            this.handleQYChecked(item, this.data);
+          });
+        } else {
+          this.handleQYChecked(item, this.data);
+        }
+      });
+      this.data.ItemsPrivate.map((itP) => {
+        let flag = this.data.CheckList.includes(itP.ChartPermissionId);
+        this.handlePrivateChecked(flag, itP, this.data);
+      });
+      this.data.ItemsUp.map((itU) => {
+        let flag = this.data.CheckList.includes(itU.ChartPermissionId);
+        this.handleUpdateChecked(flag, itU.PermissionName, this.data);
+      });
+    }
+  },
+  methods: {
+    // 套餐选中逻辑修复
+    bigServeCheck(value, itB, item) {
+      this.formData.qyBigServeCheck = value ? this.getQyBigServeCheckNumber(itB.PermissionName) : 0;
+
+      // 更新 `indeterminate` 状态
+      item.ItemsBig.forEach((itB) => (itB.isIndeterminate = false));
+
+      const bigServeItems = this.hasNoChild
+        ? [22, 21, 20, 19, 23, 30]
+        : process.env.NODE_ENV === "production"
+        ? [22, 39, 21, 38, 20, 37, 19, 36, 23, 30, 148, 62]
+        : [22, 37, 21, 36, 20, 35, 19, 34, 23, 30, 148, 62];
+
+      if (value) {
+        item.CheckList = [...new Set([...item.CheckList, ...bigServeItems])];
+      } else {
+        item.CheckList = item.CheckList.filter((t) => !bigServeItems.includes(t));
+      }
+
+      if (!this.hasNoChild) {
+        // 更新子级状态
+        item.Items.forEach((ele) => {
+          if (ele.Child) {
+            ele.Checked = value;
+            this.handleItemCheck(ele, item);
+          }
+        });
+      }
+    },
+    // 医药、消费、科技、智造(有主客观)选中
+    // 父子选中逻辑修复
+    handleItemCheck(it, item) {
+      const childIds = it.Child.map((t) => t.ChartPermissionId);
+
+      if (it.Checked) {
+        item.CheckList = [...new Set([...item.CheckList, ...childIds])];
+      } else {
+        item.CheckList = item.CheckList.filter((t) => !childIds.includes(t));
       }
+
+      this.updateParentStatus(it, item);
     },
-    props:{
-      data:{
-        required:true,
-        type:Object
-      },
-      formData:{ //formData.qyBigServeCheck  0-无 1- 70万 2- 45万
-        required:true,
-        type:Object
-      },
-      hasNoChild:{
-        type:Boolean,
-        default:false
+    // 更新父级状态
+    updateParentStatus(it, item) {
+      let count = 0;
+
+      if (it.Child) {
+        it.Child.forEach((child) => {
+          if (item.CheckList.includes(child.ChartPermissionId)) count++;
+        });
+        it.Checked = count === it.Child.length;
+        it.isIndeterminate = count > 0 && count < it.Child.length;
+      }
+
+      // 更新禁用状态
+      const relatedItem = item.ItemsUp.find((up) => up.PermissionName.includes(it.PermissionName));
+      if (relatedItem) {
+        relatedItem.disabled = count !== 0;
       }
     },
-    created(){
-      // 回显
-      if(this.data.CheckList && this.data.CheckList.length>0){
-        this.data.Items.map(item =>{
-          if(item.Child){
-            item.Child.map(t =>{
-              this.handleQYChecked(item,this.data)
-            })
-          }else{
-            this.handleQYChecked(item,this.data)
-          }
-        })
-        this.data.ItemsPrivate.map(itP =>{
-          let flag = this.data.CheckList.includes(itP.ChartPermissionId)
-          this.handlePrivateChecked(flag,itP,this.data)
-        })
-        this.data.ItemsUp.map(itU =>{
-          let flag = this.data.CheckList.includes(itU.ChartPermissionId)
-          this.handleUpdateChecked(flag,itU.PermissionName,this.data)
-        })
+    handleQYChecked(it, item) {
+      // console.log(it,item);
+      let count = 0;
+      if (it.Child) {
+        // 有主客观
+        it.Child.map((t) => {
+          if (item.CheckList.includes(t.ChartPermissionId)) count++;
+        });
+        it.Checked = count == 2;
+        it.isIndeterminate = count == 1;
+      }
+      if (this.hasNoChild) {
+        if (item.CheckList.includes(it.ChartPermissionId)) count++;
       }
+      // 设置升级套餐的禁用
+      let changeItem = item.ItemsUp.find((itUp) => itUp.PermissionName.includes(it.PermissionName));
+      if (changeItem) changeItem.disabled = count != 0;
+      // 设置大套餐的状态
+      let bigServeCheckNum;
+      if (this.formData.qyBigServeCheck) {
+        //qyBigServeCheck有值就作用在对应的大套餐
+        bigServeCheckNum = this.formData.qyBigServeCheck == 1 ? 1 : 0;
+      } else {
+        // 默认作用在45万上 原本有状态的话,就作用在有状态的大套餐
+        bigServeCheckNum = item.ItemsBig[1].isIndeterminate || item.ItemsBig[1].Checked ? 1 : 0;
+      }
+      // 正式服 各行业的客观的chartPermissionId和测试服的不一样
+      let allChartPermissionIds = process.env.NODE_ENV === "production" ? [22, 39, 21, 38, 20, 37, 19, 36, 23, 30, 148, 62] : [22, 37, 21, 36, 20, 35, 19, 34, 23, 30, 148, 62];
+
+      let bigServeItems = this.hasNoChild ? [22, 21, 20, 19, 23, 30] : allChartPermissionIds;
+      if (bigServeItems.every((t) => item.CheckList.includes(t))) {
+        item.ItemsBig[bigServeCheckNum].Checked = true;
+        this.formData.qyBigServeCheck = this.getQyBigServeCheckNumber(item.ItemsBig[bigServeCheckNum].PermissionName);
+      } else {
+        item.ItemsBig[bigServeCheckNum].Checked = false;
+        this.formData.qyBigServeCheck = 0;
+      }
+      item.ItemsBig[bigServeCheckNum].isIndeterminate = bigServeItems.some((t) => item.CheckList.includes(t)) && !item.ItemsBig[bigServeCheckNum].Checked;
     },
-    methods:{
-      // 套餐选中
-      bigServeCheck(value,itB,item){
-        // console.log(value,item);
-        this.formData.qyBigServeCheck = value?this.getQyBigServeCheckNumber(itB.PermissionName):0
-        item.ItemsBig.map(itB => itB.isIndeterminate=false)
-        if(value){
-          // 策略
-          item.CheckList= [...new Set([...item.CheckList,23,30])]
-        }else{
-          item.CheckList = item.CheckList.filter(t => ![23,30].includes(t))
+    handleUpdateChecked(value, name, item) {
+      let isDisabled = item.ItemsUp.some((itU) => item.CheckList.includes(itU.ChartPermissionId));
+      // 设置大套餐禁用
+      item.ItemsBig.map((itb) => (itb.disabled = isDisabled));
+      // 设置基础套餐禁用
+      item.Items.find((its) => name.includes(its.PermissionName)).disabled = value;
+    },
+    handlePrivateChecked(value, itP, item) {
+      if (![20032, 20031, 31].includes(itP.ChartPermissionId)) return;
+      // 买方严选的互斥
+      item.ItemsPrivate.forEach((itPri) => {
+        if ([20032, 20031, 31].includes(itPri.ChartPermissionId) && itP.ChartPermissionId != itPri.ChartPermissionId && value) {
+          itPri.disabled = true;
+        } else {
+          itPri.disabled = false;
         }
-        if(this.hasNoChild){
-          // 没有主客观
-          if(value){
-            item.CheckList= [...new Set([...item.CheckList,22, 21, 20, 19])]
-          }else{
-            item.CheckList = item.CheckList.filter(t => ![22, 21, 20, 19].includes(t))
+      });
+    },
+    equityGroupDisabled(item) {
+      return item.some((key) => key > 100000);
+    },
+    getQyBigServeCheckNumber(permissionName) {
+      return permissionName.includes("70") ? 1 : 2;
+    },
+    // 数字输入校验
+    validateInteger() {
+      this.minus_sign_val = this.minus_sign_val.replace(/[^0-9]/g, "");
+      if (this.minus_sign_val !== "") {
+        this.minus_sign_val = parseInt(this.minus_sign_val, 10);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.rai-checkbox-content {
+  // width: 100%;
+  // height: 160px;
+  padding: 20px 0 20px 20px;
+  border: 1px dashed #aab4cc;
+  // display: flex;
+  .rai-checkbox-bigS-box {
+    display: flex;
+    .bigS-item {
+      display: inline-flex;
+      align-items: center;
+      padding: 4px 8px;
+      height: 22px;
+      margin: 0 20px 20px 0;
+    }
+  }
+  .rai-checkbox-box {
+    display: flex;
+    // flex-wrap: wrap;
+    .rai-checkbox-main-container {
+      .rai-checkbox-main-row {
+        display: flex;
+        .small-item {
+          display: inline-flex;
+          align-items: center;
+          border: solid 1px #dcdfe6;
+          padding: 4px 12px;
+          height: 48px;
+          width: 84px;
+          margin-right: -1px;
+          margin-bottom: -1px;
+          &:first-child {
+            margin-top: -1px;
           }
-          // 设置升级禁用状态
-          item.ItemsUp.map(u =>{
-            u.disabled=value
-          })
-        }else{
-          item.Items.map(ele =>{
-            if(ele.Child){
-              ele.Checked=value
-              this.handleItemCheck(ele,item)
-            }
-          })
-        }
-      },
-      // 医药、消费、科技、智造(有主客观)选中
-      handleItemCheck(it,item){
-        // console.log(it,item);
-        it.isIndeterminate=false
-        let childIds=it.Child.map(t => t.ChartPermissionId)
-        if(it.Checked){
-          item.CheckList= [...new Set([...item.CheckList,...childIds])]
-        }else{
-          item.CheckList = item.CheckList.filter(t => !childIds.includes(t))
-        }
-        this.handleQYChecked(it,item)
-      },
-      handleQYChecked(it,item){
-        // console.log(it,item);
-        let count=0
-        if(it.Child){
-          // 有主客观
-          it.Child.map(t => {
-            if(item.CheckList.includes(t.ChartPermissionId)) count++
-          })
-          it.Checked=count==2
-          it.isIndeterminate=count==1
         }
-        if(this.hasNoChild){
-          if(item.CheckList.includes(it.ChartPermissionId)) count++
-        }
-        // 设置升级套餐的禁用
-        let changeItem=item.ItemsUp.find(itUp => itUp.PermissionName.includes(it.PermissionName))
-        if(changeItem) changeItem.disabled=count!=0
-        // 设置大套餐的状态
-        let bigServeCheckNum
-        if(this.formData.qyBigServeCheck){
-          //qyBigServeCheck有值就作用在对应的大套餐
-          bigServeCheckNum=this.formData.qyBigServeCheck==1?1:0
-        }else{
-          // 默认作用在45万上 原本有状态的话,就作用在有状态的大套餐
-          bigServeCheckNum= item.ItemsBig[1].isIndeterminate || item.ItemsBig[1].Checked?1:0
+      }
+    }
+    .rai-checkbox-private-container {
+      .rai-checkbox-notice-box {
+        display: flex;
+        align-items: center;
+        border: solid 1px #dcdfe6;
+        border-left: none;
+        height: 48px;
+        margin-right: -1px;
+        margin-left: -276px;
+        padding-left: 200px;
+        .rai-checkbox-notice {
+          color: #f00;
         }
-        // 正式服 各行业的客观的chartPermissionId和测试服的不一样
-        let allChartPermissionIds=process.env.NODE_ENV === 'production'?[22,39,21,38,20,37,19,36,23,30]:[22,37,21,36,20,35,19,34,23,30]
-        
-        let bigServeItems=this.hasNoChild?[22,21,20,19,23,30]:allChartPermissionIds
-        if(bigServeItems.every(t => item.CheckList.includes(t))){
-          item.ItemsBig[bigServeCheckNum].Checked=true
-          this.formData.qyBigServeCheck=this.getQyBigServeCheckNumber(item.ItemsBig[bigServeCheckNum].PermissionName)
-        }else{
-          item.ItemsBig[bigServeCheckNum].Checked=false
-          this.formData.qyBigServeCheck=0
+      }
+    }
+    .rai-checkbox-upS-box {
+      display: flex;
+      .upS-item {
+        position: relative;
+        justify-content: flex-start;
+        .checkbox-text {
+          position: absolute;
+          font-size: 12px;
+          color: #999;
+          bottom: 15px;
+          left: 20px;
         }
-        item.ItemsBig[bigServeCheckNum].isIndeterminate=
-        bigServeItems.some(t =>item.CheckList.includes(t)) && (!item.ItemsBig[bigServeCheckNum].Checked)
-      },
-      handleUpdateChecked(value,name,item){
-        let isDisabled = item.ItemsUp.some(itU => item.CheckList.includes(itU.ChartPermissionId))
-        // 设置大套餐禁用
-        item.ItemsBig.map(itb => itb.disabled=isDisabled)
-        // 设置基础套餐禁用
-        item.Items.find(its => name.includes(its.PermissionName)).disabled=value
-      },
-      handlePrivateChecked(value,itP,item){
-        if(![20032,20031,31].includes(itP.ChartPermissionId)) return 
-        // 买方严选的互斥
-        item.ItemsPrivate.forEach(itPri => {
-         if([20032,20031,31].includes(itPri.ChartPermissionId)&&itP.ChartPermissionId!=itPri.ChartPermissionId && value){
-             itPri.disabled =true
-          }else {
-             itPri.disabled =false
-          }
-        })
-      },
-      equityGroupDisabled(item){
-        return item.some(key=> key>100000);
-      },
-      getQyBigServeCheckNumber(permissionName){
-        return permissionName.includes('70')?1:2
-      },
-      // 只允许输入数字和删除键
-      validateInteger() {
-        this.minus_sign_val = this.minus_sign_val.replace(/[^0-9]/g, '');
-
-        // 如果输入不为空,则转换为整数
-        if (this.minus_sign_val !== '') {
-          this.minus_sign_val = parseInt(this.minus_sign_val, 10);
+        input {
+          width: 90px;
+          height: 30px;
+          border-radius: 4px;
+          padding-left: 10px;
+          border: 1px solid #dcdfe6;
         }
       }
     }
+    .rai-checkbox-item {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      border: solid 1px #dcdfe6;
+      margin-bottom: -1px;
+      margin-right: -1px;
+      padding-left: 12px;
+      min-height: 48px;
+      width: 168px;
+      .rai-checkbox-serve-box {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-start;
+        height: unset;
+      }
+    }
   }
-</script>
-
-<style lang="scss" scoped>
-	.rai-checkbox-content {
-		// width: 100%;
-		// height: 160px;
-		padding: 20px 0 20px 20px;
-		border:1px dashed #aab4cc;
-		// display: flex;
-		.rai-checkbox-bigS-box{
-			display: flex;
-			.bigS-item{
-				display: inline-flex;
-				align-items: center;
-				padding: 4px 8px;
-				height: 22px;
-				margin:0 20px 20px 0;
-			}
-		}
-		.rai-checkbox-box{
-			display: flex;
-			// flex-wrap: wrap;
-			.rai-checkbox-main-container{
-				.rai-checkbox-main-row{
-					display: flex;
-					.small-item{
-						display: inline-flex;
-						align-items: center;
-						border: solid 1px #DCDFE6;
-						padding: 4px 12px;
-						height: 48px;
-						width: 84px;
-						margin-right: -1px;
-						margin-bottom:-1px;
-						&:first-child{
-							margin-top:-1px;
-						}
-					}
-				}
-			}
-			.rai-checkbox-private-container{
-				.rai-checkbox-notice-box{
-					display: flex;
-					align-items: center;
-					border: solid 1px #DCDFE6;
-          border-left: none;
-					height: 48px;
-					margin-right: -1px;
-					margin-left: -192px;
-					padding-left: 200px;
-					.rai-checkbox-notice {
-						color: #f00;
-					}
-				}
-			}
-			.rai-checkbox-upS-box{
-				display: flex;
-				.upS-item{
-          position: relative;
-					justify-content: flex-start;
-          .checkbox-text {
-            position: absolute;
-            font-size: 12px;
-            color: #999;
-            bottom: 15px;
-            left: 20px;
-          }
-          input {
-            width: 90px;
-            height: 30px;
-            border-radius: 4px;
-            padding-left: 10px;
-            border: 1px solid #dcdfe6;
-          }
-				}
-			}
-			.rai-checkbox-item{
-				display: flex;
-				align-items: center;
-				justify-content: space-between;
-				border: solid 1px #DCDFE6;
-				margin-bottom:-1px;
-				margin-right: -1px;
-				padding-left: 12px;
-				min-height: 48px;
-				width: 168px;
-				.rai-checkbox-serve-box{
-					display: flex;
-					flex-direction: column;
-					align-items: flex-start;
-					height: unset;
-				}
-			}
-		}
-	}
+}
 </style>
 <style lang="scss">
-	#rai-checkbox-content{
-		.el-checkbox{
-			color: #333333;
-		}
-	}
-</style>
+#rai-checkbox-content {
+  .el-checkbox {
+    color: #333333;
+  }
+}
+</style>

+ 51 - 5
src/views/custom_manage/customList/customDetail.vue

@@ -234,6 +234,8 @@
 							@click="reviewCard(scope.row.BusinessCardUrl)">
 							<img src="~@/assets/img/icons/like-heart.png" class="name-follow-heart" v-if="scope.row.IsFollow==1">
 							<span :class="{'isShared':scope.row.IsShared}">{{scope.row.RealName}}</span>
+							<img v-if="scope.row.HaveMoveButton" width="16" style="vertical-align: middle;cursor: pointer;" src="../../../assets/img/contact_transfer.jpg" alt="" @click="clickContactTransfer(scope.row)">
+							<img v-if="scope.row.IsMaker == 1" class="name-maker" src="../../../assets/img/is_maker_icon.png" alt="">
 						</template>
 					</el-table-column>
 					<el-table-column prop="Position" label="职位" align="center" min-width="80px"></el-table-column>
@@ -244,6 +246,12 @@
 					min-width="100">
 						<template slot-scope="scope"><span v-if="scope.row.Mobile&&scope.row.CountryCode">{{scope.row.CountryCode}}-</span><span>{{scope.row.Mobile+(scope.row.MobileTwo?'/'+scope.row.MobileTwo:'')}}</span> </template>
 					</el-table-column>
+					<el-table-column v-if="isUserYanXuanButtonShow" min-width="140" align="center" key="outboundMobile" label="外呼号码">
+						<template slot-scope="scope">
+							<span>{{ scope.row.OutboundMobile }}</span>
+							<img @click="modification(scope.row.UserId, scope.row.OutboundMobile)" :src="$icons.amend" style="color: #fff; width: 12px; height: 12px; margin-left: 5px; vertical-align: middle" />
+						</template>
+					</el-table-column>
 					<el-table-column
 					prop="Email"
 					label="邮箱"
@@ -252,6 +260,7 @@
 						<template slot-scope="scope"> <span>{{scope.row.Email}}</span> </template>
 					</el-table-column>
 					<el-table-column
+					v-if="!isUserYanXuanButtonShow"
 					prop="IsMaker"
 					label="是否KP"
 					align="center">
@@ -297,8 +306,8 @@
 					</template>
 					<el-table-column
 					prop="IsSubscribeHzyj"
-					label="是否关注公众号"
-					min-width="90"
+					:label="isUserYanXuanButtonShow ? '可接受公众号推送':'是否关注公众号'"
+					min-width="140"
 					align="center">
 						<template slot-scope="scope">
 							<div style="text-align:left" v-if="RoleType !=='权益'">
@@ -311,6 +320,11 @@
 								<img v-else style="width:16px;height:16px" src="~@/assets/img/icons/icon_2.png" alt="">
 								<span>查研观向小助手</span>
 							</div>
+							<div style="text-align:left">
+								<img v-if="scope.row.IsSubscribeMfyx == 1" style="width:16px;height:16px" src="~@/assets/img/icons/icon_1.png" alt="">
+								<img v-else style="width:16px;height:16px" src="~@/assets/img/icons/icon_2.png" alt="">
+								<span>买方研选</span>
+							</div>
 						</template>
 					</el-table-column>
 					<!-- crm 14.7 -->
@@ -380,6 +394,7 @@
 								<span class="editsty move" style="margin:0 5px;" @click="handleShowMove(scope.row)">移动</span>
 								<span style="margin-right:5px;" :class="scope.row.IsFollow==1?'deletesty':'editsty'"
 								@click="followContact(scope.row)"
+								v-if="!isUserYanXuanButtonShow"
 								>{{ scope.row.IsFollow==1?'取消关注':'关注' }}</span>
 								<span class="deletesty" @click.stop="delConcat(scope.row)">删除</span>
 								<!-- <block v-if="RoleType!='权益'&&ficcform&&['正式','试用','永续'].includes(ficcform.Status)">
@@ -716,6 +731,8 @@
 			@close="isPreview=false"
 		/>
 		<HistoricalNotesDlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId"/>
+		<ContactTransfer :contactTransferDlgVisible.sync="contactTransferDlgVisible" :TransferMobile.sync="TransferMobile"/>
+		<edit-mobile :editMobileDialogVisible.sync="editMobileDialogVisible" :editMobileId="editMobileId" :outboundMobile="outboundMobile" isType="客户" />
 	</div>	
 </template>
 
@@ -736,9 +753,12 @@ import DeductDetailDlg from './components/deductDetailDlg.vue'
 import HistoryContract from '../compontents/historyContract.vue'
 
 import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
+import ContactTransfer from './components/ContactTransferDlg.vue'
+
+import EditMobile from "../../rai_manage/components/editMobile.vue";
 export default {
 	name:'',
-	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract, HistoricalNotesDlg },
+	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract, HistoricalNotesDlg, ContactTransfer, EditMobile},
 	computed:{
 		Role() {
 			let role = localStorage.getItem('Role') || '';
@@ -869,6 +889,13 @@ export default {
 
 			historicalNotesDlgVisible:false,//历史备注的弹框
 			historicalNotesId: 0,
+
+			contactTransferDlgVisible: false, //联系人转移的弹框
+			TransferMobile:0,
+			// 修改外呼号码的
+			editMobileDialogVisible: false,
+			editMobileId :0,
+			outboundMobile :0,
 		};
 	},
 	methods: {
@@ -1681,7 +1708,7 @@ export default {
     },
 	// 设置表格行的样式
 	setRowClass({row}){
-		if(row.NotRead && row.IsFollow==1){
+		if((row.NotRead && row.IsFollow==1) || (this.isUserYanXuanButtonShow && row.IsMaker==1)){
 			return "not-read-seven-days"
 		}
 	},
@@ -1690,6 +1717,18 @@ export default {
       this.historicalNotesDlgVisible = true;
 	  this.historicalNotesId = Number(this.companyId);
     },
+
+	// 点击了共享联系人
+	clickContactTransfer(item) {
+		this.contactTransferDlgVisible = true;
+		this.TransferMobile = item.Mobile;
+	},
+	// 点击了修改预约外呼
+    modification(id, value) {
+      this.editMobileDialogVisible = true;
+      this.editMobileId = id;
+      this.outboundMobile = value;
+    },
 	},
 	mounted() {
 		this.getDetail();
@@ -1834,7 +1873,14 @@ export default {
 		height: 15px;
 		position: absolute;
 		left: 0;
-    top: 0;
+    	top: 0;
+	}
+	.name-maker{
+		width:20px;
+		height: 14px;
+		position: absolute;
+		right: 0;
+    	top: 0;
 	}
 	.not-read-seven-days{
 		background-color: #FFF8F8;

+ 4 - 4
src/views/custom_manage/customList/updateServe.vue

@@ -432,8 +432,8 @@ export default {
 						})
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
-						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54,138,62].includes(key.ChartPermissionId))
+						let arr = item.Items.filter(key=> [22,21,20,19,23,30,148,62].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {
@@ -508,8 +508,8 @@ export default {
 						})
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.List.length&&res.Data.List.forEach(item => {
-						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54,138,62].includes(key.ChartPermissionId))
+						let arr = item.Items.filter(key=> [22,21,20,19,23,30,148,62].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,52,20031,20032,53,54].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {

+ 82 - 0
src/views/dataReport_manage/components/NotRenewedDlg.vue

@@ -0,0 +1,82 @@
+<template>
+  <el-dialog :visible.sync="isNotRenewedDlg" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center title="下载未续约率" width="35%">
+    <div>
+      <el-radio-group v-model="radio">
+        <el-radio style="margin-bottom: 20px" :label="1">下载当前销售的合同明细数据</el-radio>
+        <el-radio :label="2">下载所有销售未续约数据列表</el-radio>
+      </el-radio-group>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="cancelHandle">取 消</el-button>
+      <el-button type="primary" @click="downloadHandle">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { dataMainInterface } from "@/api/api.js";
+export default {
+  props: {
+    isNotRenewedDlg: {
+      type: Boolean,
+      default: false,
+    },
+    start_date: {
+      type: String,
+      default: "",
+    },
+    end_date: {
+      type: String,
+      default: "",
+    },
+    adminId: {
+      type: Array,
+      default: [],
+    },
+  },
+  watch: {},
+  data() {
+    return {
+      radio: 1,
+    };
+  },
+  methods: {
+    // 关闭弹框
+    cancelHandle() {
+      this.$emit("update:isNotRenewedDlg", false);
+    },
+    // 下载
+    downloadHandle() {
+      let paramStr = "";
+
+      let baseUrl = process.env.API_ROOT + "/statistic_report/merge_company/company_contract_percentage/list_export";
+      let token = localStorage.getItem("auth") || "";
+      let salesArr = [];
+      if (this.adminId.length) {
+        salesArr = this.adminId.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let obj = {
+        EndDate: this.end_date,
+        StartDate: this.start_date,
+        ExportType: this.radio,
+        AdminId: salesArr.join(","),
+      };
+      for (let key in obj) {
+        paramStr = `${paramStr}&${key}=${obj[key]}`;
+      }
+      let link = document.createElement("a");
+      link.style.display = "none";
+      link.href = `${baseUrl}?${token}${paramStr}`;
+      link.setAttribute("download", name);
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+    },
+  },
+  created() {},
+  mounted() {},
+};
+</script>
+<style lang="scss"></style>

+ 6 - 4
src/views/dataReport_manage/components/previousDetail.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog v-dialogDrag :visible.sync="previousDetailDlg" @close="handleClose" :modal-append-to-body="false" center title="维持套餐">
-    <p>上一合同信息</p>
+    <p>上一合同信息</p>
     <el-table :data="dataList" border max-height="250" style="margin: 20px 0">
       <el-table-column label="合同期限" prop="StartDate" align="center" width="220">
         <template slot-scope="{ row }">
@@ -43,12 +43,14 @@ export default {
     },
     async getrenewalReasonList() {
       console.log(this.rowInfo);
-      const res = await dataMainInterface.mergeCompanyPreviousDetail({
+      const res = await dataMainInterface.mergeCompanyPreviousDetailYear({
         CompanyContractId: this.rowInfo.CompanyContractId,
       });
       if (res.Ret == 200) {
-        this.dataList = [res.Data.Detail];
-        console.log(this.dataList);
+
+        this.dataList = res.Data.List || []
+
+        // console.log(this.dataList);
       }
     },
   },

+ 103 - 23
src/views/dataReport_manage/configdata.js

@@ -62,11 +62,6 @@ export const incrementTableColums = [
     textsty: "color:#409EFF;cursor:pointer;",
     link: true,
   },
-  {
-    label: "客户类型",
-    key: "ProductName",
-    widthsty: "100px",
-  },
   {
     label: "不续约归因",
     key: "AscribeContent",
@@ -136,7 +131,6 @@ export const incrementTableColums = [
     sort: true,
   },
 ];
-/* 存量客户表格列 */
 export const stockTableColums = [
   {
     label: "客户名称",
@@ -202,6 +196,79 @@ export const stockTableColums = [
     dataType: "未续约客户",
   },
 ];
+
+/* 存量客户表格列 */
+export const RaiStockTableColums = [
+  {
+    label: "客户名称",
+    key: "CompanyName",
+    widthsty: "300px",
+    textsty: "color:#409EFF;cursor:pointer;",
+    link: true,
+  },
+  {
+    label: "不续约归因",
+    key: "AscribeContent",
+    dataType: "未续约客户",
+    notRenewedConfirm: 1,
+    sort: true,
+  },
+  {
+    label: "客户状态",
+    key: "Status",
+    dataType: "未续约客户",
+  },
+  {
+    label: "所属销售",
+    key: "SellerName",
+    widthsty: "150px",
+  },
+  {
+    label: "服务销售",
+    key: "ShareSeller",
+    dataType: "新签客户,续约客户",
+  },
+  {
+    label: "合同期限",
+    dataType: "新签客户,续约客户",
+    key: "StartDate"
+  },
+  {
+    label: "合同金额",
+    dataType: "新签客户,续约客户",
+    key: "Money",
+  },
+  {
+    label: "签约套餐",
+    dataType: "新签客户,续约客户",
+    key: "PermissionName",
+  },
+  {
+    label: "最近合同到期时间",
+    key: "EndDate",
+    dataType: "未续约客户",
+  },
+  {
+    label: "备注",
+    key: "Remark",
+    dataType: "未续约客户",
+    widthsty: "100px",
+    sort: true,
+  },
+  {
+    label: "未续约说明",
+    key: "RenewalReason",
+    dataType: "未续约客户",
+    widthsty: "300px",
+  },
+  {
+    label: "超出到期时间(天)",
+    key: "ExpireDay",
+    widthsty: "150px",
+    dataType: "未续约客户",
+  },
+];
+
 /* 合同列表表格列 */
 export const contractTableColums = [
   {
@@ -315,6 +382,11 @@ export const equityTableColums = (type) => {
           key: "SellerName",
           widthsty: "150px",
         },
+        {
+          label: "服务销售",
+          key: "ShareSeller",
+          widthsty: "150px",
+        },
         {
           label: "合同期限",
           align: "center",
@@ -351,8 +423,13 @@ export const equityTableColums = (type) => {
           widthsty: "150px",
         },
         {
-          label: "合同到期时间",
-          key: "EndDate",
+          label: "服务销售",
+          key: "ShareSeller",
+          widthsty: "150px",
+        },
+        {
+          label: "合同期限",
+          key: "StartDate",
           dataType: "未续约客户",
           sort: true,
         },
@@ -366,20 +443,6 @@ export const equityTableColums = (type) => {
           key: "Money",
           dataType: "新签客户",
         },
-        {
-          label: "未续约说明",
-          key: "RenewalReason",
-          dataType: "未续约客户",
-          widthsty: "300px",
-          sort: true,
-        },
-        {
-          label: "备注",
-          key: "Remark",
-          dataType: "未续约客户",
-          widthsty: "100px",
-          sort: true,
-        },
         {
           label: "不续约归因",
           key: "AscribeContent",
@@ -387,5 +450,22 @@ export const equityTableColums = (type) => {
           sort: true,
         },
       ]
-    : [];
+    : type === "新增试用客户" 
+    ? [ {
+      label: "客户名称",
+      key: "CompanyName",
+      widthsty: "300px",
+      textsty: "color:#409EFF;cursor:pointer;",
+      link: true,
+    },
+    {
+      label: "所属销售",
+      key: "SellerName",
+      widthsty: "150px",
+    },
+    {
+      label: "新增时间",
+      key: "CreateTime",
+    }]
+    :[];
 };

+ 89 - 85
src/views/dataReport_manage/equityCustomStatistics.vue

@@ -37,7 +37,10 @@
                 {{ lableTextDisplay(item.label) }}数
                 <el-tooltip class="item" effect="dark" :content="item.label === '新签客户' ? '<br />' : item.label === '续约客户' ? '起始时间在所选时间段内的续约合同' : ''" placement="top">
                   <template slot="content">
-                    <div v-if="item.label === '新签客户'">
+                    <div v-if="item.label === '新增试用客户'">
+                      <p>新建试用客户的时间,包含在所选时间段内的客户数(流失领取的不计入)</p>
+                    </div>
+                    <div v-else-if="item.label === '新签客户'">
                       <p>起始时间在所选时间段内的新签合同</p>
                       <p>(第一份合同起始时间一年内的再次签约仍属于新签合同)</p>
                     </div>
@@ -45,7 +48,7 @@
                       <p>起始时间在所选时间段内的续约合同</p>
                       <p>(第一份合同起始时间一年以后的再次签约均属于续约合同)</p>
                     </div>
-                    <p v-else>合同截止时间在所选时间段内的非正式、非永续客户</p>
+                    <p v-else>当前客户状态为非正式、非X类试用,且截止时间在所选时间段内的合同数(打分客户佣金不计入)</p>
                   </template>
                   <i class="el-icon-info"></i>
                 </el-tooltip>
@@ -53,7 +56,9 @@
             </div>
             <div class="card-cont">
               {{
-                item.label === "新签客户"
+                item.label === "新增试用客户"
+                  ? TrialTotal
+                  : item.label === "新签客户"
                   ? NewCompanyTotal
                   : item.label === "续约客户"
                   ? RenewalCompanyTotal
@@ -64,54 +69,45 @@
             </div>
           </el-card>
         </div>
-        <div class="annual-select-content">
-          <div class="select-content">
-            <div class="lable-text">
-              不续约率
-              <el-tooltip style="margin-right: 16px" class="item" effect="dark" content="所选年度的续约合同/所选年度的到期合同" placement="top-start">
-                <template slot="content">
-                  <div>
-                    <p>所选时间段的已确认不续约的合同金额/所选时间段的到期的合同金额</p>
-                    <p>(剔除非业务不续约的金额)</p>
-                  </div>
-                </template>
-                <i class="el-icon-info" style="color: #999"></i>
-              </el-tooltip>
-            </div>
-            <el-date-picker
-              v-model="yearValue"
-              type="daterange"
-              format="yyyy-MM-dd"
-              value-format="yyyy-MM-dd"
-              :clearable="false"
-              @change="getIncrementalCompanyContractPercentageList"
-              range-separator="至"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-            >
-            </el-date-picker>
-          </div>
-          <div class="select-content">
-            <span class="editsty" v-if="RenewalDataForm.RenewalRateMoney" @click="renewalRateLableHandler">&nbsp;&nbsp;{{ RenewalDataForm.RenewalRateMoney }}&nbsp;&nbsp;</span>
-            {{ RenewalDataForm.RenewalRateTotalContent ? `(${RenewalDataForm.RenewalRateTotalContent})` : " -  -" }}
-          </div>
-        </div>
       </div>
       <div class="tabs-box">
-        <div class="tabs-box-confirm">
+        <div class="tabs-box-confirm"  v-if="filterObj.data_type == '续约客户'">
           <div style="margin-bottom: 0px" class="tabs-box-confirm" v-for="(item, index) in packageTypeList" :key="item">
             <div :class="['confirm-box-li', PackageDifference == item && 'active']" @click="notPackageDifferenceChange(item)">{{ item }}</div>
             <div v-if="index != 2" class="center-line"></div>
           </div>
+            <el-tooltip style="margin-right: 16px" class="item" effect="dark" content="今年续约合同总金额与上年度合同总金额对比" placement="top-start">
+             
+              <i class="el-icon-info" style="color: #999"></i>
+            </el-tooltip>
         </div>
       </div>
       <div class="tabs-box" v-if="filterObj.data_type == '未续约客户'">
-        <el-radio-group v-model="isNotRenewedConfirm" class="tabs-box-confirm" @change="notRenewedConfirmChange">
-          <el-radio-button :label="1">已确认</el-radio-button>
-          <div class="center-line"></div>
-          <el-radio-button :label="0">待确认</el-radio-button>
-        </el-radio-group>
-        <div class="tabs-box-status" v-show="isNotRenewedConfirm">
+        <div style="display: flex; align-items: cente; margin-bottom: 20px">
+          <el-radio-group v-model="isNotRenewedConfirm" style="margin: 0px 20px 0 0" class="tabs-box-confirm" @change="notRenewedConfirmChange">
+            <el-radio-button :label="1">已确认</el-radio-button>
+            <div class="center-line"></div>
+            <el-radio-button :label="0">待确认</el-radio-button>
+            <div class="center-line"></div>
+            <el-radio-button :label="2">到期合同</el-radio-button>
+          </el-radio-group>
+          <div class="lable-text">
+            未续约率
+            <el-tooltip style="margin-right: 16px" class="item" effect="dark" content="所选年度的续约合同/所选年度的到期合同" placement="top-start">
+              <template slot="content">
+                <div>
+                  <p>所选时间段的已确认不续约的合同金额/所选时间段的到期的合同金额</p>
+                  <p>(剔除非业务不续约的金额)</p>
+                </div>
+              </template>
+              <i class="el-icon-info" style="color: #999"></i>
+            </el-tooltip>
+            <p class="editsty" v-if="RenewalDataForm.RenewalRateMoney" @click="renewalRateLableHandler">&nbsp;&nbsp;{{ RenewalDataForm.RenewalRateMoney }}&nbsp;&nbsp;</p>
+            {{ RenewalDataForm.RenewalRateTotalContent ? `(${RenewalDataForm.RenewalRateTotalContent})` : " -  -" }}
+            <el-button v-if="canConfirmNotRenewed" type="primary" size="mini" style="margin-left: 20px" @click="isNotRenewedDlg = true">下载</el-button>
+          </div>
+        </div>
+        <div v-show="isNotRenewedConfirm">
           <el-select v-model="noRenewalReasonId" placeholder="请选择不续约归因" clearable @change="getTableData" style="width: 240px; margin-right: 50px">
             <el-option :label="item.AscribeContent" :value="item.CompanyAscribeId" v-for="item in noRenewalReasonList" :key="item.reasonId"></el-option>
           </el-select>
@@ -207,6 +203,7 @@
     <previous-detail :previousDetailDlg.sync="previousDetailDlg" :rowInfo="rowInfo" />
     <RenewalRateDetail :showRenewalRateDetailDlg.sync="showRenewalRateDetailDlg" :renewalRateDetailForm.sync="renewalRateDetailForm" :noRenewalReasonListSon="noRenewalReasonList" />
     <historical-notes-dlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId" />
+    <NotRenewedDlg :isNotRenewedDlg.sync="isNotRenewedDlg" :start_date="start_date" :end_date="end_date" :adminId="filterObj.sale" />
   </div>
 </template>
 
@@ -221,12 +218,13 @@ import confirmedNoRenewal from "./components/noRenewalReasonDia/confirmedNoRenew
 import PreviousDetail from "./components/previousDetail.vue";
 import RenewalRateDetail from "./components/renewalRateDetail.vue";
 import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
-
+import NotRenewedDlg from "./components/NotRenewedDlg.vue";
 var moment = require("moment");
 moment().format();
 export default {
   name: "",
-  components: { mPage, renewalListDia, addRemark, viewRemark, confirmedNoRenewal, PreviousDetail, RenewalRateDetail, HistoricalNotesDlg },
+  components: { mPage, renewalListDia, addRemark, viewRemark, confirmedNoRenewal, PreviousDetail, RenewalRateDetail, HistoricalNotesDlg, NotRenewedDlg },
+
   computed: {
     exportExcel() {
       let baseUrl = process.env.API_ROOT + "/statistic_report/merge_company_list";
@@ -283,7 +281,7 @@ export default {
         month: "近1个月",
         date: [],
         sale: "",
-        data_type: "新客户",
+        data_type: "新增试用客户",
       },
       monthLabel: [
         {
@@ -307,6 +305,9 @@ export default {
       page_no: sessionStorage.getItem("incrementBack") ? JSON.parse(sessionStorage.getItem("incrementBack")).page_no : 1,
       total: 0,
       data_typeArr: [
+        {
+          label: "新增试用客户",
+        },
         {
           label: "新签客户",
         },
@@ -328,6 +329,7 @@ export default {
         { name: "冻结/流失", value: "非试用" },
       ],
       tabsActiveName: "",
+      TrialTotal: 0, //新增试用数
       NotRenewalNotTryOut: 0, //冻结流失的人数
       NotRenewalTryOut: 0, //试用的人数
       isNotRenewedConfirm: 1, //未续约的是否已确认
@@ -356,6 +358,8 @@ export default {
 
       historicalNotesDlgVisible: false, //历史备注的弹框
       historicalNotesId: 0,
+
+      isNotRenewedDlg: false, //未续约 弹框
     };
   },
   /* 页面跳转前记录参数 */
@@ -420,7 +424,7 @@ export default {
       this.page_no = 1;
       this.getTableData();
     },
-    notPackageDifferenceChange(type) {
+    notPackageDifferenceChange(type) {      
       if (this.PackageDifference == type) {
         this.PackageDifference = "";
       } else {
@@ -456,6 +460,7 @@ export default {
         if (res.Ret === 200) {
           this.tableData = res.Data.List || [];
           this.total = res.Data.Paging.Totals;
+          this.TrialTotal = res.Data.TrialTotal;
           this.NewCompanyTotal = res.Data.NewCompanyTotal;
           this.RenewalCompanyTotal = res.Data.RenewalCompanyTotal;
           this.NotRenewalCompanyTotal = res.Data.NotRenewalCompanyTotal;
@@ -479,6 +484,7 @@ export default {
       this.filterObj.month = label;
       let days = label == "近1个月" ? 1 : label == "近2个月" ? 2 : label == "近3个月" ? 3 : 0;
       this.filterDate(days);
+      this.getIncrementalCompanyContractPercentageList();
     },
     /* 选择服务日期 */
     dateChange(e) {
@@ -496,10 +502,13 @@ export default {
     },
     /* 切换数据类型 */
     toggleType(label) {
+      console.log(this.filterObj.data_type);
+      
       this.filterObj.data_type = label;
       this.incrementTableColums = equityTableColums(this.filterObj.data_type);
       this.noRenewalReasonId = "";
       if (label == "未续约客户") {
+        this.getIncrementalCompanyContractPercentageList();
         this.getNORenewalReasonList();
       }
       this.tabsActiveName = "";
@@ -511,9 +520,7 @@ export default {
       this.page_no = 1;
       this.searchVal = "";
       this.getTableData();
-      if (this.yearValue.length > 0) {
-        this.getIncrementalCompanyContractPercentageList();
-      }
+      this.getIncrementalCompanyContractPercentageList();
     },
     /* 切换页码 */
     handleCurrentChange(page) {
@@ -628,14 +635,15 @@ export default {
       this.previousDetailDlg = true;
     },
     lableTextDisplay(text) {
-      let str = text == "新签客户" ? "新签合同" : text == "续约客户" ? "续约合同" : "未续约客户";
+      
+      let str = text == "新增试用客户" ? "新增试用客户" : text == "新签客户" ? "新签合同" : text == "续约客户" ? "续约合同" : "未续约客户";
       return str;
     },
-    // 年度续约的标签点击事件
-    annualSelectHandler(item) {
-      this.annualSelectActivue = item.name;
-      this.getIncrementalCompanyContractPercentageList();
-    },
+    // // 年度续约的标签点击事件
+    // annualSelectHandler(item) {
+    //   this.annualSelectActivue = item.name;
+    //   this.getIncrementalCompanyContractPercentageList();
+    // },
     // 点击了续约率
     renewalRateLableHandler() {
       this.showRenewalRateDetailDlg = true;
@@ -643,6 +651,7 @@ export default {
     },
     // 获取年度续约的数据
     async getIncrementalCompanyContractPercentageList() {
+      if (this.filterObj.data_type != "未续约客户") return;
       let params = this.initCompanyContractPercentageList();
       const res = await dataMainInterface.incrementalCompanyContractPercentageListV2(params);
       if (res.Ret === 200) {
@@ -658,8 +667,8 @@ export default {
         });
       }
       let params = {
-        EndDate: this.yearValue.length > 0 ? this.yearValue[1] : "",
-        StartDate: this.yearValue.length > 0 ? this.yearValue[0] : "",
+        EndDate: this.end_date,
+        StartDate: this.start_date,
         AdminId: salesArr.join(","),
       };
       return params;
@@ -748,34 +757,29 @@ export default {
 .package-difference {
   cursor: pointer;
 }
-.annual-select-content {
-  .select-content {
-    display: flex;
-    align-items: center;
-    margin-bottom: 15px;
-    .lable-text {
-      flex-shrink: 0;
-    }
-    .select-lable {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      box-sizing: border-box;
-      margin-left: 10px;
-      width: 92px;
-      height: 40px;
-      color: #409eff;
-      background-color: #ecf5ff;
-      border: 1px solid #b3d8ff;
-      border-radius: 4px;
-      cursor: pointer;
-    }
-    .act-select-lable {
-      color: #fff;
-      background-color: #409eff;
-      border: none;
-    }
-  }
+
+.lable-text {
+  display: flex;
+  align-items: center;
+}
+.select-lable {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-sizing: border-box;
+  margin-left: 10px;
+  width: 92px;
+  height: 40px;
+  color: #409eff;
+  background-color: #ecf5ff;
+  border: 1px solid #b3d8ff;
+  border-radius: 4px;
+  cursor: pointer;
+}
+.act-select-lable {
+  color: #fff;
+  background-color: #409eff;
+  border: none;
 }
 </style>
 <style lang="scss">

+ 10 - 1
src/views/dataReport_manage/equityServiceStatistics.vue

@@ -58,7 +58,16 @@
     </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">
+        <el-table-column align="center" prop="CompanyName" width="180">
+          <template slot="header" slot-scope="{}">
+            <span>客户名称</span>
+            <el-tooltip effect="dark" placement="top-start">
+              <div slot="content">
+                <p>分配或者取消分配服务销售后,最多10分钟后客户会在此列表更新</p>
+              </div>
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+          </template>
           <template slot-scope="{ row }">
             <el-tooltip effect="dark" placement="top-start" content="过去4周,kp均未覆盖服务" v-if="row.IsUserMaker == -1">
               <span class="deletesty" @click="goDetail(row)">{{ row.CompanyName }}</span>

+ 486 - 0
src/views/dataReport_manage/raiStockCutomList.vue

@@ -0,0 +1,486 @@
+<template>
+  <div class="dataReport-container">
+    <div class="dataReport-main first">
+      <div class="main-top" style="display: flex; align-items: center">
+        <a :href="exportExcel" download>
+          <el-button type="primary" style="margin-right: 10px; margin-bottom: 8px">导出EXCEL</el-button>
+        </a>
+
+        <el-cascader
+          v-if="Role == 'finance' || Role == 'admin' || Role == 'ficc_admin' || Role == 'rai_admin' || ManageType != 0"
+          v-model="filterObj.sale"
+          placeholder="请选择销售"
+          style="min-width: 250px; margin-right: 10px; margin-bottom: 8px"
+          :options="salesArr"
+          :props="defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="changeFilter"
+        >
+        </el-cascader>
+
+        <el-input placeholder="请输入客户名称" v-model="searchVal" style="max-width: 400px; margin-left: auto; margin-bottom: 8px" @input="handleSearch" clearable>
+          <i slot="prefix" class="el-input__icon el-icon-search"></i>
+        </el-input>
+      </div>
+      <div class="main-section">
+        <el-row :gutter="36">
+          <el-col :span="8" v-for="item in data_typeArr" :key="item.label">
+            <el-card :class="['base-card', { 'main-card': filterObj.data_type === item.label }]" shadow="hover" @click.native="toggleType(item.label)">
+              <div slot="header" class="clearfix">
+                <span>
+                  {{ item.label }}数
+                  <el-tooltip
+                    class="item"
+                    effect="dark"
+                    :content="
+                      item.label === '新签客户'
+                        ? '当前为正式状态,且处于第一份合同起始日一年以内的客户'
+                        : item.label === '续约客户'
+                        ? '当前为正式状态,且处于第一份合同起始日一年以外的客户'
+                        : '历史上有过正式记录,且当前为非正式、非X类试用状态的客户'
+                    "
+                    placement="top"
+                  >
+                    <i class="el-icon-info"></i>
+                  </el-tooltip>
+                </span>
+              </div>
+              <div class="card-cont">
+                {{ item.label === "新签客户" ? NewCompanyTotal : item.label === "续约客户" ? RenewalCompanyTotal : item.label === "未续约客户" ? NotRenewalCompanyTotal : "" }}
+              </div>
+            </el-card>
+          </el-col>
+        </el-row>
+      </div>
+      <div>
+        <el-select v-model="noRenewalReasonId" placeholder="请选择不续约归因" v-show="filterObj.data_type == '未续约客户'" clearable @change="getTableData" style="width: 240px; margin-top: 40px">
+          <el-option :label="item.AscribeContent" :value="item.CompanyAscribeId" v-for="item in noRenewalReasonList" :key="item.reasonId"></el-option>
+        </el-select>
+        <el-select v-model="tabsActiveName" placeholder="当前状态" v-show="filterObj.data_type == '未续约客户'" clearable @change="getTableData" style="width: 240px; margin-left: 20px">
+          <el-option :label="item.name" :value="item.value" v-for="item in tabsList" :key="item.value"></el-option>
+        </el-select>
+      </div>
+
+      <el-table :data="tableData" border v-loading="isShowloadding" element-loading-text="数据加载中..." style="margin-top: 20px; min-height: 400px">
+        <template v-for="item in stockTableColums">
+          <el-table-column :key="item.label" :label="item.label" :width="item.widthsty" align="center" v-if="!item.dataType || item.dataType.split(',').includes(filterObj.data_type)">
+            <template slot-scope="scope">
+              <span :style="item.textsty" @click="jumpHandle(scope.row, item)" v-if="item.label == '服务期限' || item.label == '最近合同到期时间'">
+                {{
+                  item.label == "服务期限" && scope.row.StartDate.indexOf("/") == -1
+                    ? scope.row.StartDate + "~" + scope.row.EndDate
+                    : item.label == "服务期限" && scope.row.StartDate.indexOf("/") != -1
+                    ? scope.row.StartDate.substr(0, 10) + "~" + scope.row.EndDate.substr(0, 10) + "/" + scope.row.StartDate.substr(11) + "~" + scope.row.EndDate.substr(11)
+                    : scope.row[item.key] | formatTime
+                }}
+              </span>
+              <span v-else-if="item.label == '合同期限'">
+                <span>{{ scope.row.StartDate }} ~ {{ scope.row.EndDate }}</span>
+              </span>
+              <span v-else-if="item.label == '未续约说明'">
+                <span style="display: block" v-if="scope.row[item.key]">最新情况:{{ scope.row[item.key] }}</span>
+                <span v-if="scope.row.RenewalTodo">To Do 事项:{{ scope.row.RenewalTodo }}</span>
+                <span v-if="scope.row[item.key] || scope.row.RenewalTodo" style="color: #409eff; cursor: pointer" @click="renewalReasonMore(scope.row)">&emsp;更多>></span>
+              </span>
+              <!-- <div v-else-if="item.key == 'CompanyName'" style="padding: 4px 0">
+                <span :style="item.textsty" @click="jumpHandle(scope.row, item)">
+                  {{ scope.row[item.key] }}
+                </span>
+                <div class="package-difference" v-if="scope.row.PackageDifference">
+                  {{ scope.row.PackageDifference }}
+                </div>
+              </div> -->
+               <div v-else-if="item.key == 'CompanyName'" style="padding: 4px 0">
+                <el-tooltip effect="dark" placement="top-start" content="过去4周,kp均未覆盖服务" v-if="scope.row.IsUserMaker == -1">
+                  <span class="deletesty" @click="jumpHandle(scope.row, item)">{{ scope.row[item.key] }}</span>
+                </el-tooltip>
+                <span v-else class="editsty" @click="jumpHandle(scope.row, item)">{{ scope.row[item.key] }}</span>
+                <div class="package-difference" v-if="scope.row.PackageDifference" @click="previousDetailHadler(scope.row)">
+                  {{ scope.row.PackageDifference }}
+                </div>
+              </div>
+              <div v-else-if="item.key === 'Remark'" class="remark-row">
+                <span class="remark-text" @click="viewHistoryRemarkFun(scope.row)" v-if="scope.row.IsShowNoRenewedNote">...</span>
+              </div>
+              <div v-else-if="item.key == 'AscribeContent'">
+                <span style="color: #409eff; cursor: pointer" @click="editReasonLabel(scope.row)">
+                  {{ scope.row[item.key] }}
+                </span>
+              </div>
+              <span v-else :style="item.textsty" @click="jumpHandle(scope.row, item)">
+                {{ scope.row[item.key] }}
+              </span>
+            </template>
+          </el-table-column>
+        </template>
+        <el-table-column label="操作" width="180px" align="center">
+          <template slot-scope="{ row }">
+            <span v-if="isRoleType == 'admin' || isRoleType == '权益'" @click="historicalNotesClickHandler(row)" class="editsty">历史备注</span>
+          </template>
+        </el-table-column>
+        <div slot="empty" style="lineheight: 44px; margin: 60px 0; color: #999">
+          <img src="~@/assets/img/cus_m/nodata.png" alt="" style="display: block; width: 160px; height: 128px; margin: auto" />
+          <span>暂无数据</span>
+        </div>
+      </el-table>
+      <el-col :span="24" class="toolbar" v-if="total">
+        <m-page :total="total" :page_no="page_no" @handleCurrentChange="handleCurrentChange" />
+      </el-col>
+    </div>
+    <!-- 未续约说明列表弹窗 -->
+    <renewalListDia :isShow.sync="isRenewalShow" :rowInfo="rowInfo" />
+    <!-- 历史备注弹窗 -->
+    <viewRemark :isShow.sync="isViewRemarkShow" :tableData="historyRemarkList" />
+    <!-- 确认不续约弹窗 -->
+    <confirmedNoRenewal
+      :isShow.sync="isConfirmNoRenewalShow"
+      :dataForm="confirmNoRenewalForm"
+      :noRenewalReasonList="noRenewalReasonList"
+      @refreshReasonList="getNORenewalReasonList"
+      @saveLabel="saveLabel"
+    />
+
+    <!-- 历史备注的弹框 -->
+    <HistoricalNotesDlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId" />
+  </div>
+</template>
+
+<script>
+import { RaiStockTableColums } from "./configdata.js";
+import { dataMainInterface, customInterence } from "@/api/api.js";
+import mPage from "@/components/mPage.vue";
+import renewalListDia from "./components/renewalListDia.vue";
+import viewRemark from "./components/noRenewalReasonDia/viewRemark.vue";
+import confirmedNoRenewal from "./components/noRenewalReasonDia/confirmedNoRenewal.vue";
+import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
+
+var moment = require("moment");
+moment().format();
+export default {
+  name: "",
+  components: { mPage, renewalListDia, viewRemark, confirmedNoRenewal, HistoricalNotesDlg },
+  computed: {
+    exportExcel() {
+      let baseUrl = process.env.API_ROOT + "/statistic_report/stack_company_list_rai";
+      let token = localStorage.getItem("auth") || "";
+      let paramStr = "";
+      // 处理销售筛选
+      let salesArr = [];
+      if (this.filterObj.sale.length) {
+        salesArr = this.filterObj.sale.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let obj = {
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        CompanyType: this.filterObj.type,
+        AdminId: salesArr.join(","),
+        RegionType: this.filterObj.area,
+        Date: this.filterObj.date,
+        DataType: this.filterObj.data_type,
+        Keyword: this.searchVal,
+        IsExport: true,
+        IsConfirm: this.filterObj.data_type == "未续约客户" ? 1 : -1,
+        CompanyAscribeId: this.noRenewalReasonId,
+      };
+      for (let key in obj) {
+        paramStr = `${paramStr}&${key}=${obj[key]}`;
+      }
+      return `${baseUrl}?${token}${paramStr}`;
+    },
+
+    stockTableColums() {
+      return RaiStockTableColums;
+    },
+    Role() {
+      let role = localStorage.getItem("Role") || "";
+      return role;
+    },
+    //管理权限
+    ManageType() {
+      return localStorage.getItem("ManageType") || "";
+    },
+    // crm 15.9.1 历史备注 区分权益FICC的展示
+    isRoleType() {
+      return localStorage.getItem("RoleType") || "";
+    },
+  },
+  data() {
+    return {
+      searchVal: sessionStorage.getItem("stockBack") ? JSON.parse(sessionStorage.getItem("stockBack")).searchVal : "",
+
+      tableData: [],
+      isShowloadding: false,
+      /* 筛选条件 */
+      filterObj: {
+        date: moment().format("YYYY-MM-DD"),
+        type: "",
+        sale: "",
+        area: "",
+        data_type: this.$route.query.type || "新签客户",
+      },
+      salesArr: [], //销售列表
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+      typeArr: [
+        {
+          name: "ficc",
+        },
+        {
+          name: "权益",
+        },
+      ], //类型
+      areaArr: ["国内", "海外"],
+      pageSize: 10,
+      page_no: sessionStorage.getItem("stockBack") ? JSON.parse(sessionStorage.getItem("stockBack")).page_no : 1,
+      total: 0,
+      data_typeArr: [
+        {
+          label: "新签客户",
+        },
+        {
+          label: "续约客户",
+        },
+        {
+          label: "未续约客户",
+        },
+      ], //数据类型
+      NewCompanyTotal: 0, //新签客户数
+      NotRenewalCompanyTotal: 0, //未续约客户数
+      RenewalCompanyTotal: 0, //续约客户数
+      isRenewalShow: false, //未续约说明列表弹框是否显示
+      rowInfo: null, // 未续约说明更多行信息
+      tabsList: [
+        { name: "试用", value: "试用" },
+        { name: "冻结/流失", value: "非试用" },
+      ],
+      tabsActiveName: "",
+      NotRenewalNotTryOut: 0, //冻结流失的人数
+      NotRenewalTryOut: 0, //试用的人数
+      noRenewalReasonList: [],
+      noRenewalReasonId: "",
+      selectItemRow: {}, // 当前选中的row
+      //历史备注
+      isViewRemarkShow: false,
+      historyRemarkList: [],
+      //确认不续约
+      isConfirmNoRenewalShow: false,
+      confirmNoRenewalForm: {
+        reason: "",
+        detailReason: "",
+      },
+
+      historicalNotesDlgVisible: false, //历史备注的弹框
+      historicalNotesId: 0,
+    };
+  },
+  /* 页面跳转前记录参数 */
+  beforeRouteLeave(to, form, next) {
+    let backData = {
+      page_no: this.page_no,
+      filterObj: this.filterObj,
+      searchVal: this.searchVal,
+    };
+    sessionStorage.setItem("stockBack", JSON.stringify(backData));
+    next();
+  },
+  /* 页面进入前是否清除参数 */
+  beforeRouteEnter(to, from, next) {
+    if (from.path != "/customDetail") {
+      sessionStorage.removeItem("stockBack");
+    }
+    next();
+  },
+  methods: {
+    // 搜索
+    handleSearch() {
+      this.page_no = 1;
+      this.filterObj = {
+        date: this.filterObj.date,
+        type: "",
+        sale: "",
+        area: "",
+        data_type: this.filterObj.data_type,
+      };
+      this.getTableData();
+    },
+    //tabs 的点击事件
+    tabsHandler(item) {
+      this.tabsActiveName = item.value;
+      this.page_no = 1;
+      this.getTableData();
+    },
+    /* 获取表格 */
+    getTableData() {
+      this.isShowloadding = true;
+      // 处理销售筛选
+      let salesArr = [];
+      if (this.filterObj.sale.length) {
+        salesArr = this.filterObj.sale.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let params = {
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        CompanyType: this.filterObj.type,
+        AdminId: salesArr.join(","),
+        RegionType: this.filterObj.area,
+        Date: this.filterObj.date,
+        DataType: this.filterObj.data_type,
+        Keyword: this.searchVal,
+        TryOutType: this.filterObj.data_type == "未续约客户" ? this.tabsActiveName : "",
+        IsConfirm: -1,
+        CompanyAscribeId: this.noRenewalReasonId,
+      };
+      dataMainInterface.raiStackList(params).then((res) => {
+        if (res.Ret === 200) {
+          this.tableData = res.Data.List || [];
+          this.total = res.Data.Paging.Totals;
+          this.NewCompanyTotal = res.Data.NewCompanyTotal;
+          this.RenewalCompanyTotal = res.Data.RenewalCompanyTotal;
+          this.NotRenewalCompanyTotal = res.Data.NotRenewalCompanyTotal;
+          this.NotRenewalTryOut = res.Data.NotRenewalTryOut || 0;
+          this.NotRenewalNotTryOut = res.Data.NotRenewalNotTryOut || 0;
+          this.isShowloadding = false;
+        }
+      });
+    },
+    /* 获取销售 */
+    getSale() {
+      customInterence.getSalesRaiData().then((res) => {
+        if (res.Ret === 200) {
+          this.salesArr = res.Data.List;
+        }
+      });
+    },
+    /* 切换数据类型 */
+    toggleType(label) {
+      this.filterObj.data_type = label;
+      if (label == "未续约客户") {
+        this.getNORenewalReasonList();
+      }
+      this.noRenewalReasonId = "";
+      this.tabsActiveName = "";
+      this.page_no = 1;
+      this.searchVal = "";
+      this.getTableData();
+    },
+    /* 筛选改变时 */
+    changeFilter() {
+      this.page_no = 1;
+      this.searchVal = "";
+      this.getTableData();
+    },
+    /* 切换页码 */
+    handleCurrentChange(page) {
+      this.page_no = page;
+      this.getTableData();
+    },
+    /* 跳转 */
+    jumpHandle(row, item) {
+      if (item.link) {
+        this.$router.push({
+          path: "/customDetail",
+          query: {
+            id: row.CompanyId,
+          },
+        });
+      }
+    },
+
+    // 未续约说明更多按钮
+    renewalReasonMore(row) {
+      this.rowInfo = {
+        CompanyId: row.CompanyId,
+        ProductId: row.ProductId,
+      };
+      this.isRenewalShow = true;
+    },
+    getNORenewalReasonList() {
+      dataMainInterface.getAscribList().then((res) => {
+        if (res.Ret == 200) {
+          this.noRenewalReasonList = res.Data.List || [];
+        }
+      });
+    },
+    // 查看历史备注
+    viewHistoryRemarkFun(row) {
+      // console.log(row);
+      dataMainInterface.getNotRenewedRemarkList({ CompanyId: row.CompanyId, ProductId: row.ProductId }).then((res) => {
+        if (res.Ret == 200) {
+          this.historyRemarkList = res.Data.List || [];
+          this.isViewRemarkShow = true;
+        }
+      });
+    },
+    editReasonLabel(row) {
+      // console.log(row);
+      dataMainInterface.infoNoRenewedAscribe({ CompanyId: row.CompanyId, ProductId: row.ProductId }).then((res) => {
+        if (res.Ret == 200) {
+          this.confirmNoRenewalForm.reason = res.Data.Detail ? res.Data.Detail.CompanyAscribeId || "" : "";
+          this.confirmNoRenewalForm.detailReason = res.Data.Detail ? res.Data.Detail.Content || "" : "";
+          this.selectItemRow = row;
+          this.isConfirmNoRenewalShow = true;
+        }
+      });
+    },
+    saveLabel(item) {
+      // console.log(item);
+      let params = {
+        CompanyId: this.selectItemRow.CompanyId,
+        ProductId: this.selectItemRow.ProductId,
+        CompanyAscribeId: item.CompanyAscribeId,
+        Content: item.Content,
+      };
+      dataMainInterface.addNoRenewedAscribe(params).then((res) => {
+        if (res.Ret == 200) {
+          this.$message.success("确认成功");
+          this.isConfirmNoRenewalShow = false;
+          this.selectItemRow = {};
+          this.getTableData();
+        }
+      });
+    },
+    // 点击了历史留言
+    historicalNotesClickHandler(item) {
+      this.historicalNotesDlgVisible = true;
+      this.historicalNotesId = item.CompanyId;
+    },
+  },
+  created() {},
+  mounted() {
+    this.getSale();
+    if (sessionStorage.getItem("stockBack")) {
+      let backData = JSON.parse(sessionStorage.getItem("stockBack"));
+      this.page_no = backData.page_no;
+      this.filterObj = backData.filterObj;
+      this.searchVal = backData.searchVal;
+    }
+    this.getTableData();
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./index.scss";
+.remark-row {
+  display: flex;
+  justify-content: center;
+  .remark-text {
+    width: 18px;
+    height: 18px;
+    margin-right: 8px;
+    font-size: 18px;
+    color: #409eff;
+    cursor: pointer;
+  }
+}
+</style>

+ 2 - 0
src/views/rai_manage/activityManage/components/addActivity.vue

@@ -562,6 +562,7 @@ export default {
           RefPage.isCanAppointmentMinutes = Data.IsCanAppointmentMinutes == 1 ? true : false;
           RefPage.isYidongConduct = Data.IsYidongConduct == 1 ? true : false;
           RefPage.isExternalLabel = Data.IsExternalLabel == 1 ? true : false;
+          RefPage.isZoom = Data.IsZoom == 1 ? true : false;
           RefPage.isCanOutboundCall = Data.IsCanOutboundCall == 1 ? true : false;
           RefPage.isDeduct = Data.IsResearchPoints == 1 ? true : false;
           RefPage.provideEmail = Data.IsNeedEmail == 1 ? true : false;
@@ -694,6 +695,7 @@ export default {
         VideoDetail,
         IsYidongConduct: RefPage.isYidongConduct ? 1 : 0,
         IsExternalLabel: RefPage.isExternalLabel ? 1 : 0,
+        IsZoom: RefPage.isZoom ? 1 : 0,
         IsCanOutboundCall: RefPage.isCanOutboundCall ? 1 : 0,
         IsResearchPoints: RefPage.isDeduct ? 1 : 0,
         IsNeedEmail: RefPage.provideEmail ? 1 : 0,

+ 2 - 0
src/views/rai_manage/activityManage/components/addComopnents/ResearchDeduct.vue

@@ -8,6 +8,7 @@
     </el-checkbox>
     <el-checkbox v-if="isResearch && [1, 3, 5, 8].includes(cactivityType)" v-model="isShowHz"> 同时在弘则活动页展示 </el-checkbox>
     <el-checkbox v-if="cactivityType == 3" v-model="isExternalLabel"> 外部资源 </el-checkbox>
+    <el-checkbox v-if="cactivityType == 3" v-model="isZoom"> zoom办会(请用zoom模板建会) </el-checkbox>
     <template v-if="cactivityType == 7 || cactivityType == 2">
       <el-checkbox v-model="isYidongConduct">
         易董办会
@@ -97,6 +98,7 @@ export default {
       isYidongConduct: false, // 易懂办会
       isCanOutboundCall: false, // 可提供外呼
       isExternalLabel: false, //外部资源
+      isZoom:false, //是否是Zoom模版
       institutionName: "", //机构名称
       isDeduct: false, // 研选扣点
       isBClass: false, // B类非公开

+ 85 - 67
src/views/rai_manage/components/addChoiceness.vue

@@ -61,8 +61,8 @@
             <div v-show="industryIndex == index">
               <RichText v-model="item.BodyChartSummary" :ref="'logic' + index" :spareId="'logictest' + index" :isText="contentTextLogic" />
               <draggable :list="item.List" animation="300" class="classification" filter=".addIndustrial" :move="onMove" @update="ificationSortChange">
-                <div v-for="(val, num) in item.List" :key="val.IndustrialSubjectId" class="industrial" @click="ificationIndustrialBtn(val, num)" :class="num == ificationIndustrial ? 'pitch' : ''">
-                  <span style="margin-right: 19px">{{ val.IndustrialSubjectName }}</span>
+                <div v-for="(val, num) in item.List" :key="val.ShowName" class="industrial" @click="ificationIndustrialBtn(val, num)" :class="num == ificationIndustrial ? 'pitch' : ''">
+                  <span style="margin-right: 19px">{{ val.ShowName }}</span>
                   <span v-if="num == ificationIndustrial">
                     <img src="~@/assets/img/icons/edit1.png" style="width: 12px; height: 12px; marginright: 10px" @click="editText(val, num)" />
                     <i class="el-icon-close" @click="deleteClassify(val, num)"></i>
@@ -70,7 +70,7 @@
                 </div>
                 <div class="addIndustrial" @click="addMulti" v-if="industryIndex == index">
                   <i class="el-icon-plus"></i>
-                  <span>添加标的</span>
+                  <span>添加标的/赛道</span>
                 </div>
               </draggable>
               <template v-for="(val, num) in item.List">
@@ -123,7 +123,7 @@
         <span style="font-size: 16px">{{ dialogText }}</span>
       </div>
       <div class="dlg-content">
-        <el-autocomplete class="inline-input" v-model="stateValue" :trigger-on-focus="false" :fetch-suggestions="handleSearchResult" placeholder="请输入标的名称" clearable></el-autocomplete>
+        <el-autocomplete class="inline-input" v-model="stateValue" :trigger-on-focus="false" :fetch-suggestions="handleSearchResult" placeholder="请输入标的或赛道名称" clearable></el-autocomplete>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button v-if="dialogText == '编辑'" type="primary" @click="editconfirmPerson">确定</el-button>
@@ -323,7 +323,7 @@ export default {
     editText(item, index) {
       this.dialogText = "编辑";
       this.chartPermissionId = item.ChartPermissionId;
-      this.stateValue = item.IndustrialSubjectName;
+      this.stateValue = item.IndustrialSubjectName || item.ShowName;
       this.addDialogVisible = true;
       this.editNum = index;
     },
@@ -337,6 +337,13 @@ export default {
         .then(() => {
           this.industryList[this.industryIndex].List.splice(index, 1);
           this.ificationIndustrial = 0;
+          let itemList = this.industryList[0].List[0];
+          this.industrialSubjectName = itemList.IndustrialManagementName || "";
+          this.overviewList = {
+            ArticleId: itemList.OverviewArticleId,
+            Title: itemList.OverviewArticleTitle,
+            IsShowOverviewArticle: itemList.IsShowOverviewArticle,
+          };
           this.$message({
             type: "success",
             message: "删除成功!",
@@ -351,7 +358,7 @@ export default {
     },
     //添加产业
     addMulti() {
-      this.dialogText = "添加标的";
+      this.dialogText = "添加标的/赛道";
       this.addDialogVisible = true;
     },
     //弹框的取消事件
@@ -362,78 +369,88 @@ export default {
     //弹框的确认事件
     async confirmPerson() {
       if (this.stateValue) {
-        const arr = this.subjectList.find((item) => item.SubjectName === this.stateValue);
-        if (!arr) {
-          this.$message.error("输入正确的标的");
-          return;
-        }
+        const arr = this.subjectList.find((item) => item.ShowName === this.stateValue);
         let overviewList = {};
-        const res = await raiInterface.getReportSelectionArticle({
-          IndustrialSubjectId: arr.IndustrialSubjectId,
-        });
+        const res = !arr
+          ? await raiInterface.getReportSelectionThird_name({
+              ThirdName: this.stateValue,
+              ChartPermissionId: this.chartPermissionId,
+            })
+          : await raiInterface.getReportSelectionArticle({
+              IndustrialSubjectId: arr.IndustrialSubjectId,
+            });
         if (res.Ret === 200) {
           overviewList = res.Data;
-        }
-        this.industryList.forEach((item) => {
-          if (item.ChartPermissionId == this.chartPermissionId) {
-            if (item.List.length > 0) {
-              var isNext = item.List.some((item) => item.IndustrialSubjectName == arr.SubjectName);
+          this.industryList.forEach((item) => {
+            if (item.ChartPermissionId == this.chartPermissionId) {
+              if (item.List.length > 0) {
+                var isNext = item.List.some((item) => item.ShowName == (arr ? arr.ShowName : res.Data.ThirdName));
+              }
+              if (isNext) return this.$message.error("标的重复!");
+              item.List.push({
+                Body: "",
+                ChartPermissionId: this.chartPermissionId,
+                IndustrialManagementId: arr ? arr.IndustrialManagementId + "" : "",
+                IndustrialManagementName: arr ? arr.IndustryName : "",
+                IndustrialSubjectId: arr ? arr.IndustrialSubjectId + "" : "",
+                IndustrialSubjectName: arr ? arr.SubjectName : "",
+                ShowName: arr ? arr.ShowName || arr.IndustryName : res.Data.ThirdName,
+                ThirdId: res.Data.ThirdId || "",
+                ThirdName: res.Data.ThirdName || "",
+                CompanyLabel: [{ name: "", value: item.List.length + 1 }],
+                OverviewArticleId: overviewList.ArticleId || 0,
+                OverviewArticleTitle: overviewList.Title || "",
+                IsShowOverviewArticle: overviewList.IsShowOverviewArticle || 0,
+              });
             }
-            if (isNext) return this.$message.error("标的重复!");
-            item.List.push({
-              Body: "",
-              ChartPermissionId: this.chartPermissionId,
-              IndustrialManagementId: arr.IndustrialManagementId + "",
-              IndustrialManagementName: arr.IndustryName,
-              IndustrialSubjectId: arr.IndustrialSubjectId + "",
-              IndustrialSubjectName: arr.SubjectName,
-              CompanyLabel: [{ name: "", value: item.List.length + 1 }],
-              OverviewArticleId: overviewList.ArticleId,
-              OverviewArticleTitle: overviewList.Title,
-              IsShowOverviewArticle: overviewList.IsShowOverviewArticle,
-            });
-          }
-        });
+          });
+        }
       }
       this.stateValue = "";
       this.addDialogVisible = false;
     },
     async editconfirmPerson() {
       if (this.stateValue) {
-        const arr = this.subjectList.find((item) => item.SubjectName === this.stateValue);
-        if (!arr) {
-          this.$message.error("输入正确的标的");
-          return;
-        }
+        const arr = this.subjectList.find((item) => item.ShowName === this.stateValue);
         let overviewList = {};
-        const res = await raiInterface.getReportSelectionArticle({
-          IndustrialSubjectId: arr.IndustrialSubjectId,
-        });
+        const res = !arr
+          ? await raiInterface.getReportSelectionThird_name({
+              ThirdName: this.stateValue,
+              ChartPermissionId: this.chartPermissionId,
+            })
+          : await raiInterface.getReportSelectionArticle({
+              IndustrialSubjectId: arr.IndustrialSubjectId,
+            });
         if (res.Ret === 200) {
           overviewList = res.Data;
-        }
-        this.industryList.forEach((item) => {
-          if (item.ChartPermissionId == this.chartPermissionId) {
-            if (item.List.length > 0) {
-              var isNext = item.List.some((item) => item.IndustrialSubjectName == arr.SubjectName);
+          this.overviewList = overviewList;
+          this.industryList.forEach((item) => {
+            if (item.ChartPermissionId == this.chartPermissionId) {
+              if (item.List.length > 0) {
+                var isNext = item.List.some((item) => item.ShowName == (arr ? arr.ShowName : res.Data.ThirdName));
+              }
+              if (isNext) return this.$message.error("标的重复!");
+              const obj = {
+                Body: (this.$refs.twoRich && this.$refs.twoRich.value) || "",
+                ChartPermissionId: this.chartPermissionId,
+                IndustrialManagementId: arr ? arr.IndustrialManagementId + "" : "",
+                IndustrialManagementName: arr ? arr.IndustryName : "",
+                IndustrialSubjectId: arr ? arr.IndustrialSubjectId + "" : "",
+                IndustrialSubjectName: arr ? arr.SubjectName : "",
+                ShowName: arr ? arr.ShowName || arr.IndustryName : res.Data.ThirdName,
+                ThirdId: res.Data.ThirdId || "",
+                ThirdName: res.Data.ThirdName || "",
+                CompanyLabel:
+                  item.List[this.editNum].CompanyLabel && item.List[this.editNum].CompanyLabel.length > 0 ? item.List[this.editNum].CompanyLabel : [{ name: "", value: item.List.length + 1 }],
+                OverviewArticleId: overviewList.ArticleId || 0,
+                OverviewArticleTitle: overviewList.Title || "",
+                IsShowOverviewArticle: overviewList.IsShowOverviewArticle || 0,
+              };
+              item.List.splice(this.editNum, 1, obj);
+              this.industrialSubjectName = arr ? arr.IndustryName : res.Data.ThirdName || "";
             }
-            if (isNext) return this.$message.error("标的重复!");
-            const obj = {
-              Body: this.$refs.twoRich.value || "",
-              ChartPermissionId: this.chartPermissionId,
-              IndustrialManagementId: arr.IndustrialManagementId + "",
-              IndustrialManagementName: arr.IndustryName,
-              IndustrialSubjectId: arr.IndustrialSubjectId + "",
-              IndustrialSubjectName: arr.SubjectName,
-              CompanyLabel:
-                item.List[this.editNum].CompanyLabel && item.List[this.editNum].CompanyLabel.length > 0 ? item.List[this.editNum].CompanyLabel : [{ name: "", value: item.List.length + 1 }],
-              OverviewArticleId: overviewList.ArticleId,
-              OverviewArticleTitle: overviewList.Title,
-              IsShowOverviewArticle: overviewList.IsShowOverviewArticle,
-            };
-            item.List.splice(this.editNum, 1, obj);
-          }
-        });
+          });
+        }
       }
       this.stateValue = "";
       this.addDialogVisible = false;
@@ -442,11 +459,11 @@ export default {
     async handleSearchResult(data, cb) {
       if (data) {
         cb([]);
-        let res = await raiInterface.industrialSubjectSearch({ KeyWord: data, ChartPermissionId: this.chartPermissionId });
+        let res = await raiInterface.industrialAndSubjectSearch({ KeyWord: data, ChartPermissionId: this.chartPermissionId });
         if (res.Ret === 200) {
           if (res.Data.List && res.Data.List.length > 0) {
             let arr = res.Data.List.map((item) => {
-              return { value: item.SubjectName, ...item };
+              return { value: item.ShowName, ...item };
             });
             this.subjectList = arr;
             cb(arr);
@@ -464,6 +481,7 @@ export default {
               key.CompanyLabel && key.CompanyLabel.length > 0 && isText.push(key.CompanyLabel.some((val) => val.name));
             });
           });
+
           if (isText && isText.includes(false)) {
             return this.$message.error("请输入公司标签");
           }
@@ -479,7 +497,7 @@ export default {
               sessionStorage.removeItem("addChoicenessQY");
               this.$message.success("操作成功!");
               this.init();
-              this.$router.back();
+              type != "保存" && this.$router.back();
             }
           }
         }

+ 29 - 14
src/views/rai_manage/components/editMobile.vue

@@ -11,6 +11,13 @@
         </el-select>
         <el-input style="width: 368px" v-model="modelKey" placeholder="请输入手机号或座机号" />
         <p style="margin-top: 15px">座机号请填写区号,分机号用"-"分隔,例:02150509999-8888</p>
+        <p style="margin-top: 15px; color: #ec808d">
+          {{
+            isType == "客户"
+              ? "新活动将以修改后的号码外呼。已预约外呼的活动,仍保持原号码外呼,若要修改,请前往报名管理列表修改"
+              : "此处修改的外呼号码,仅对此活动有效。若要长期以新号码外呼,请前往联系人列表修改"
+          }}
+        </p>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="handleClose">取 消</el-button>
@@ -21,7 +28,7 @@
 </template>
 
 <script>
-import { raiInterface,raiSpecial } from "@/api/api.js";
+import { raiInterface, raiSpecial, customInterence } from "@/api/api.js";
 export default {
   name: "",
   components: {},
@@ -60,7 +67,7 @@ export default {
   computed: {},
   watch: {
     editMobileDialogVisible(newval) {
-      if (newval) {
+      if (newval && this.isType != "客户") {
         this.activitySignupSignupDetail();
       }
     },
@@ -82,17 +89,24 @@ export default {
       this.$emit("update:editMobileDialogVisible", false);
     },
     async btnOk() {
-      const res = this.isType
-        ? await raiSpecial.outboundMobileEdit({
-            CountryCode: this.selectValue,
-            OutboundMobile: this.modelKey,
-            Id: this.editMobileId,
-          })
-        : await raiInterface.outboundMobileEdit({
-            CountryCode: this.selectValue,
-            OutboundMobile: this.modelKey,
-            Id: this.editMobileId,
-          });
+      const res =
+        this.isType == "客户"
+          ? await customInterence.editOutboundMobile({
+              OutboundCountryCode: this.selectValue,
+              OutboundMobile: this.modelKey,
+              UserId: this.editMobileId,
+            })
+          : this.isType == "专项"
+          ? await raiSpecial.outboundMobileEdit({
+              CountryCode: this.selectValue,
+              OutboundMobile: this.modelKey,
+              Id: this.editMobileId,
+            })
+          : await raiInterface.outboundMobileEdit({
+              CountryCode: this.selectValue,
+              OutboundMobile: this.modelKey,
+              Id: this.editMobileId,
+            });
 
       if (res.Ret !== 200) return;
       this.$message.success("操作成功");
@@ -100,7 +114,8 @@ export default {
       this.modelKey = "";
       this.$emit("update:editMobileDialogVisible", false);
       this.$parent.outboundMobile = "";
-      this.$parent.getsDataList();
+
+      this.isType == "客户" ? this.$parent.getuserTable() : this.$parent.getsDataList();
     },
   },
 };

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

@@ -55,7 +55,7 @@ export default {
     async remoteMethod(query) {
       if (query !== "") {
         this.dataQueryList = [];
-        const res = await raiInterface.activityMeetMatchingList({ KeyWord: query });
+        const res = await raiInterface.activityMeetMatchingList({ KeyWord: query, ActivityId: this.matchingId, });
         if (res.Ret === 200) {
           let obj = {};
           res.Data.List &&

+ 6 - 6
src/views/rai_manage/components/report_preview/choicenessPre.vue

@@ -27,8 +27,8 @@
         <div class="industry-li" v-for="(item, index) in dataListSubject" :key="index">
           <div class="industry-name">{{ item.ChartPermissionName }}</div>
           <div class="industry-subject">
-            <div class="subject-item" @click="positionSubject(key)" v-for="key in item.ListSubject" :key="key.IndustrialSubjectId">
-              <a :href="`#miao${key.IndustrialSubjectId}`">{{ key.SubjectName }}</a>
+            <div class="subject-item" v-for="key in item.ListSubject" :key="key.IndustrialSubjectId">
+              <a :href="`#miao${key.IndustrialSubjectId}${key.SubjectName}`">{{ key.ShowName }}</a>
               <img v-if="key.IsNew" class="icon_subject" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_subject.png" />
             </div>
           </div>
@@ -42,16 +42,16 @@
             {{ item.ChartPermissionText }}
           </div>
           <div class="report-content-report" v-for="it in item.contetList" :key="it.IndustrialSubjectId">
-            <div class="content-report-title">
-              {{ it.IndustrialSubjectName }}
+            <div class="content-report-title" :id="`miao${it.IndustrialSubjectId}${it.SubjectName}`">
+              {{ it.IndustrialSubjectName || it.ThirdName || it.ShowName }}
             </div>
             <div v-html="it.Body" class="content-report-body"></div>
             <div class="content-report-detail" v-if="it.OverviewArticleId > 0">
               公司综述报告请
               <span @click="goArticle(it.OverviewArticleId)"> 点击查看 </span>
             </div>
-            <div class="company-label" :id="`miao${it.IndustrialSubjectId}`">
-              <span class="item">{{ it.SubjectName }}</span>
+            <div class="company-label">
+              <span class="item">{{ it.ShowName }}</span>
               <img v-if="it.IsNew" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png" />
               <span class="item item-subject-name" v-for="val in it.CompanyLabel" :key="val"># {{ val }}</span>
             </div>

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

@@ -1,6 +1,6 @@
 <template>
   <div class="container lable-add-content">
-    <el-dialog :title="visibleTitle" :visible.sync="showRegularDlg" width="600px" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center @close="handleClose">
+    <el-dialog :title="visibleTitle" :visible.sync="showRegularDlg" width="700px" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center @close="handleClose">
       <div v-if="dataRegular.TagType == 1">
         <div v-for="(item, index) in addDataList" :key="index" class="add-name-item">
           <el-autocomplete style="width: 90%" v-model="item.name" clearable :fetch-suggestions="querySearchAsync" @select="tableSelectHandel(item)" placeholder="请输入内容"></el-autocomplete>
@@ -58,7 +58,7 @@ export default {
           : this.dataRegular.TagType == 4
           ? "所有问答系列音频"
           : this.dataRegular.TagType == 5
-          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研"
+          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研,策略-每日复盘,固收-债市复盘"
           : "";
       return str;
     },
@@ -164,7 +164,7 @@ export default {
 <style scoped lang="scss">
 .lable-add-content {
   .text-content {
-    width: 487px;
+    width: 620px;
     height: 40px;
     line-height: 40px;
     border-radius: 4px;

+ 3 - 0
src/views/roadshow_manage/compononts/addActivityCellDia.vue

@@ -167,6 +167,9 @@
             hide-area
           ></v-distpicker> -->
           <search-dist-picker 
+            :provinceInfo="formData.roadshowCity[0]"
+            :cityInfo="formData.roadshowCity[1]"
+            :areaInfo="formData.District||''"
             :showArea="isRaiRole"
             @selected="onChangeCity($event,'roadshow')"/>
         </el-form-item>

+ 2 - 2
src/views/roadshow_manage/compononts/addMatterDia.vue

@@ -70,9 +70,9 @@
         <el-form-item label="事项内容" prop="matterContent">
           <el-input v-model.trim="formData.matterContent" clearable placeholder="请输入事项内容"></el-input>
         </el-form-item>
-        <el-form-item label="修改原因" prop="EditReason" v-if="edit_matter_id">
+        <!-- <el-form-item label="修改原因" prop="EditReason" v-if="edit_matter_id">
           <el-input v-model.trim="formData.EditReason" clearable placeholder="请输入修改原因"></el-input>
-        </el-form-item>
+        </el-form-item> -->
       </el-form>
       <div class="btn-group">
         <el-button @click="cancel">取消</el-button>

+ 8 - 14
src/views/roadshow_manage/myCalendar.vue

@@ -141,7 +141,7 @@
             </template>
             <!-- 事项的操作栏由后端控制 -->
             <template v-if="default_tab===5">
-                <span class="editsty" v-if="row.EditReason" @click="showReason(row)">最近修改记录</span>
+                <!-- <span class="editsty" v-if="row.EditReason" @click="showReason(row)">最近修改记录</span> -->
                 <span
                   class="editsty"
                   v-if="!row.ButtonAuth.EditDisabled"
@@ -581,18 +581,10 @@ export default {
     /* 编辑活动 或事项 */
     editActivityHandle(row) {
       this.isRaiEditType ='RaiEdit'
-      this.raiEditMatterHandle(row)
-      return
-      const { RsCalendarId,RsCalendarResearcherId,RsMattersId,MatterContent,StartDate,StartTime,EndTime,EndDate } = row;
-      //编辑活动
-      if(!RsMattersId) {
-        this.resubmitData = this.editInfoBack(row,2);
-        this.edit_id = RsCalendarId;
-        this.edit_rs_id = RsCalendarResearcherId;
-        this.isActivityBtnDiaShow = true;
-      } else {
-        //编辑事项
-        this.editMatterHandle({ RsMattersId,StartDate,StartTime,EndDate,EndTime,MatterContent });
+      if(this.default_tab==5){
+        this.editMatterHandle(row);
+      }else{
+        this.raiEditMatterHandle(row)
       }
     },
 
@@ -691,7 +683,7 @@ export default {
       }
     },
 
-    raiEditMatterHandle({ ActivityType,RoadshowType,RoadshowPlatform,City,Province,CompanyId,CompanyName,ResearcherId,RsCalendarResearcherId,Theme,CooperationName,ActivityCategory,StartDate,EndDate,RsCalendarId,RsMattersId,StartTime,EndTime,MatterContent,EnglishCompany}){
+    raiEditMatterHandle({ ActivityType,RoadshowType,RoadshowPlatform,City,Province,CompanyId,CompanyName,ResearcherId,RsCalendarResearcherId,Theme,CooperationName,ActivityCategory,StartDate,EndDate,RsCalendarId,RsMattersId,StartTime,EndTime,MatterContent,EnglishCompany,District=''}){
         this.sonData = {
                   activityType: ActivityType, // 活动类型
                   roadshowType: RoadshowType, // 路演形式
@@ -706,6 +698,8 @@ export default {
                   meetingTheme: Theme, // 会议主题
                   partnersName: CooperationName, // 合作方名称
                   activityClass: ActivityCategory, // 活动类别
+                  District: District || '',
+
                   selectResearchers: [
                     // 选择的研究员
                     {

+ 80 - 14
src/views/seal_manage/approvalList.vue

@@ -2,6 +2,14 @@
 <div class="seal-approval-wrap">
   <div class="content">
       <div class="select-wrap" style="margin-bottom:30px">
+        <el-select v-model="belongCompany" placeholder="请选择归属公司" @change="handleSelectChange" clearable style="margin-right:20px">
+          <el-option
+            v-for="item in belongCompanyOption"
+            :key="item"
+            :label="item"
+            :value="item">
+          </el-option>
+        </el-select>
         <el-select v-model="contractTypeVal" placeholder="合同类型" @change="handleSelectChange" clearable style="margin-right:20px">
           <el-option
             v-for="item in contractTypeList"
@@ -49,15 +57,25 @@
           clearable
           @input="handleSearch">
         </el-input>
-        <el-button 
-          type="primary" 
-          style="float:right" 
-          @click="$router.push('/addSeal')" 
-          v-if="['ficc_seller','rai_seller','compliance'].includes(RoleType)"
-        >添加用印</el-button>
+
+        <div style="float:right" >
+          <el-button 
+            type="primary" 
+            @click="$router.push('/addSeal')" 
+            v-if="['ficc_seller','rai_seller','compliance'].includes(RoleType)"
+          >添加用印</el-button>
+          <a :href="exportUrl" download v-if="['admin','ficc_admin','compliance'].includes(RoleType)">
+            <el-button type="primary">导出</el-button>
+          </a>
+        </div>
       </div>
       <div class="list-wrap">
         <el-table :data="tableList" border>
+          <el-table-column align="center"  prop="CompanyName" label="归属公司">
+            <template slot-scope="scope"> 
+              <span>{{scope.row.AffiliatedCompany}}</span>
+            </template>
+          </el-table-column>
           <el-table-column align="center"  prop="CompanyName" label="客户名称">
             <template slot-scope="scope"> 
               <span>{{scope.row.CompanyName}}</span>
@@ -118,6 +136,20 @@
             <table class="table-wrap" >
               <tbody>
                 <tr>
+                  <td class="table-item width-50">
+                    <p v-if="detail.OpButton.CheckEdit">
+                      <span>所属公司:</span>
+                      <el-select v-model="approvalEditData.AffiliatedCompany" placeholder="请选择">
+                        <el-option
+                          v-for="item in belongCompanyOption"
+                          :key="item"
+                          :label="item"
+                          :value="item">
+                        </el-option>
+                      </el-select>
+                    </p>
+                    <p v-else>所属公司:{{detail.SealDetail.AffiliatedCompany}}</p>
+                  </td>
                   <td class="table-item width-50">
                     <p v-if="detail.OpButton.CheckEdit">
                       <span>用印用途:</span>
@@ -133,14 +165,16 @@
                     </p>
                     <p v-else>用印用途:{{detail.SealDetail.Use}}</p>
                   </td>
-                  <td class="table-item width-50">所属销售:{{detail.SealDetail.UserName}}</td>
                 </tr>
                 <tr>
+                  <td class="table-item width-50">所属销售:{{detail.SealDetail.UserName}}</td>
                   <td class="table-item width-50">客户名称:{{detail.SealDetail.CompanyName}}</td>
+                </tr>
+                <tr>
                   <td class="table-item width-50">社会信用码:{{detail.SealDetail.CreditCode}}</td>
+                  <td class="table-item width-50">合同类型:{{detail.SealDetail.ServiceType}}</td>  
                 </tr>
                 <tr>
-                  <td class="table-item width-50">合同类型:{{detail.SealDetail.ServiceType}}</td>
                   <td class="table-item width-50">
                     <p v-if="detail.OpButton.CheckEdit">
                       <span>文件份数:</span>
@@ -149,8 +183,6 @@
                     </p>
                     <p v-else>文件份数:{{detail.SealDetail.FileNum}}</p>
                   </td>
-                </tr>
-                <tr>
                   <td class="table-item">
                     <p v-if="detail.OpButton.CheckEdit">
                       <span>加盖印章:</span>
@@ -158,12 +190,15 @@
                         <el-option label="合同章" value="合同章"></el-option>
                         <el-option label="公章" value="公章"></el-option>
                         <el-option label="法人章" value="法人章"></el-option>
+                        <el-option label="电子合同章" value="电子合同章"></el-option>
                       </el-select>
                     </p>
                     <p v-else>加盖印章:{{detail.SealDetail.SealType}}</p>
                   </td>
-                  <td class="table-item">实际使用方:{{detail.SealDetail.UseCompanyName||detail.SealDetail.CompanyName}}</td>
                 </tr>
+                <tr>
+                  <td class="table-item" colspan="2">实际使用方:{{detail.SealDetail.UseCompanyName||detail.SealDetail.CompanyName}}</td>
+                </tr>  
                 <tr>
                   <td class="table-item" colspan="2" style="text-align: left">
                     <p v-if="detail.OpButton.CheckEdit" style="display:flex">
@@ -290,6 +325,7 @@ export default {
         this.optList=[]
         this.stepArr=[]
         this.approvalEditData={
+          AffiliatedCompany:'',//所属公司
           Use:'',//用印用途
           Type:'',//加盖印章 类型
           FileNum:'',//文件份数
@@ -315,6 +351,21 @@ export default {
       
     }
   },
+  computed: {
+    exportUrl() {
+      let auth = localStorage.getItem("auth") || "";
+      let salesArr=[]
+			if(this.seller.length){
+				salesArr=this.seller.map(item=>{
+					return item[item.length-1]
+				})
+			}
+
+      return `${process.env.API_ROOT}/seal/getApprovalPageList?IsExport=true&${auth}&PageSize=${this.pageSize}&CurrentIndex=${this.page}&ContractType=${this.contractTypeVal}&Status=${this.sealStatusVal}&SellerId=${salesArr.join(',')}&StartTime=${this.time&&this.time[0]||''}&EndTime=${this.time&&this.time[1]||''}&Keyword=${this.searchVal}&AffiliatedCompany=${this.belongCompany}`
+        
+      
+    }
+  },
   data () {
     return {
       RoleType:localStorage.getItem('Role')||'',
@@ -344,6 +395,7 @@ export default {
       optList:[],
       stepArr:[],//审批流程数据
       approvalEditData:{
+        AffiliatedCompany:'',//所属公司
         Use:'',//用印用途
         Type:'',//加盖印章 类型
         FileNum:'',//文件份数
@@ -369,11 +421,15 @@ export default {
       },//上传/更新附件文件数据
       showAttachment:false,// 是否显示预览附件弹窗
       attachmentUrls:[],// 附件列表
+
+      belongCompany: '',//归属公司
+      belongCompanyOption: []
     }
   },
   created () {
     this.getSellerList();
     this.getSealApprovalList()
+    this.getBelongCompanyOptions()
     if(['ficc_seller','rai_seller'].includes(this.RoleType)){
       this.sealStatusList=['待审批','已撤回','处理中','已审批','已驳回','已签回','已作废']
     }else{
@@ -381,6 +437,12 @@ export default {
     }
   },
   methods: {
+    async getBelongCompanyOptions() {
+      const res = await sealInterence.getBelongCompany()
+      if(res.Ret !==200 ) return
+      this.belongCompanyOption = res.Data || []
+    },
+
     //获取所属销售列表
     getSellerList() {
       contractInterface.getSellerList().then((res) => {
@@ -405,7 +467,8 @@ export default {
         SellerId:salesArr.join(','),
         StartTime:this.time&&this.time[0]||'',
         EndTime:this.time&&this.time[1]||'',
-        Keyword:this.searchVal
+        Keyword:this.searchVal,
+        AffiliatedCompany: this.belongCompany
       })
       if(res.Ret===200){
         this.tableList=res.Data.List
@@ -435,8 +498,10 @@ export default {
       this.getSealOprationList(e.SealId)
       const res=await sealInterence.getSealDetail({SealId:e.SealId})
       if(res.Ret==200){
+        console.log(res.Data)
         this.showDetail=true
         this.detail=res.Data
+        this.approvalEditData.AffiliatedCompany=res.Data.SealDetail.AffiliatedCompany
         this.approvalEditData.Use=res.Data.SealDetail.Use
         this.approvalEditData.Type=res.Data.SealDetail.SealType.split(',')
         this.approvalEditData.FileNum=res.Data.SealDetail.FileNum
@@ -581,7 +646,8 @@ export default {
             const flag2=Number(this.approvalEditData.FileNum)===Number(this.detail.SealDetail.FileNum)
             const flag3=this.approvalEditData.Type.join(',')===this.detail.SealDetail.SealType
             const flag4=this.approvalEditData.Remark===this.detail.SealDetail.Remark
-            if(flag1&&flag2&&flag3&&flag4){
+            const flag5=this.approvalEditData.AffiliatedCompany===this.detail.SealDetail.AffiliatedCompany
+            if(flag1&&flag2&&flag3&&flag4&&flag5){
               this.handleApprovalPass()
             }else{
               this.handleApprovePassModify()
@@ -625,6 +691,7 @@ export default {
         Remark:this.approvalEditData.Remark,
         SealType:this.approvalEditData.Type.join(','),
         Use:this.approvalEditData.Use,
+        AffiliatedCompany:this.approvalEditData.AffiliatedCompany,
       })
       if(res.Ret==200){
         this.$message.success('审批成功')
@@ -883,7 +950,6 @@ export default {
       font-weight: bold;
       color: #333;
       float: left;
-      margin-top: 4px;
     }
     .user-box{
       padding-left: 100px;

+ 31 - 0
src/views/seal_manage/updateSeal.vue

@@ -8,6 +8,19 @@
     >
       <div class="one-part">
         <div class="box">
+          <el-form-item label="归属公司:" prop="AffiliatedCompany">
+            <el-select v-model.trim="sealForm.AffiliatedCompany" clearable>
+              <el-option
+                v-for="item in belongCompanyOption"
+                :key="item"
+                :label="item"
+                :value="item"
+              ></el-option>
+            </el-select>
+            <el-tooltip class="item" effect="dark" content="归属公司:申请用章公司" placement="top">
+              <i class="el-icon-warning"></i>
+            </el-tooltip>
+          </el-form-item>
           <el-form-item label="用印用途:" prop="Use">
             <el-select v-model.trim="sealForm.Use" clearable>
               <el-option
@@ -176,9 +189,11 @@ export default {
         Remark: "", //审批备注
         fileList: [], //合同附件
         ContractId: 0, //合同id(默认为0)
+        AffiliatedCompany:''
       },
       sealRules: {
         //表单校验规则
+        AffiliatedCompany: [{ required: true, message: "请选择归属公司", trigger: "blur" }],
         Use: [{ required: true, message: "请选择用印用途", trigger: "blur" }],
         CompanyName: [
           { required: true, message: "请选择客户名称", trigger: "blur" },
@@ -221,8 +236,11 @@ export default {
         { label: "合同章", value: 1 },
         { label: "公章", value: 2 },
         { label: "法人章", value: 3 },
+        { label: "电子合同章", value: 4 },
       ],
       isWatch: true, // 控制watch是否触发
+
+      belongCompanyOption:[]
     };
   },
   created() {
@@ -230,6 +248,7 @@ export default {
     if (this.sealId) {
       this.getsealApprovalDetail();
     }
+    this.getBelongCompanyOptions()
   },
   computed: {
     // 用印id,有则表示编辑,无表示新增
@@ -245,6 +264,15 @@ export default {
     },
   },
   methods: {
+    async getBelongCompanyOptions() {
+      const res = await sealInterence.getBelongCompany()
+      if(res.Ret !==200 ) return
+      this.belongCompanyOption = res.Data || []
+      if (!this.sealId) {
+        this.sealForm.AffiliatedCompany=this.belongCompanyOption.length?this.belongCompanyOption[0]:''
+      }
+    },
+
     // 获取用印详情
     async getsealApprovalDetail() {
       try {
@@ -269,6 +297,7 @@ export default {
           this.sealForm.SealType = SealDetail.SealType.split(",");
           this.sealForm.ServiceType = SealDetail.ServiceType;
           this.sealForm.UseCompanyName = SealDetail.UseCompanyName;
+          this.sealForm.AffiliatedCompany = SealDetail.AffiliatedCompany;
           this.sealForm.source =
             SealDetail.ContractId > 0 ? "系统合同" : "上传附件";
           // 打开监听
@@ -385,6 +414,7 @@ export default {
           ServiceType: this.sealForm.ServiceType,
           Use: this.sealForm.Use,
           UseCompanyName: this.sealForm.UseCompanyName,
+          AffiliatedCompany: this.sealForm.AffiliatedCompany,
         };
         let res = {};
         if (this.sealId) {
@@ -439,6 +469,7 @@ export default {
         Remark: "", //审批备注
         fileList: [], //合同附件
         ContractId: 0, //合同id(默认为0)
+        AffiliatedCompany:''
       };
       // 清除校验提示
       this.$nextTick(() => {

+ 1 - 1
src/views/system_manage/approvalManage.vue

@@ -99,7 +99,7 @@ import {departInterence} from '@/api/api.js'
 const config={
   '客户审批':[{id:1,name:'FICC部门'},{id:2,name:'权益部门'}],
   '合同审批':[{id:3,name:'FICC部门'},{id:4,name:'权益部门'}],
-  '用印审批':[{id:5,name:'合同章'},{id:6,name:'公章/法人章'}]
+  '用印审批':[{id:5,name:'合同章/电子合同章'},{id:6,name:'公章/法人章'}]
 }
 export default {
   data () {