浏览代码

15.7 merge master

bding 11 月之前
父节点
当前提交
8c3253e68e
共有 40 个文件被更改,包括 2704 次插入809 次删除
  1. 2 1
      config/dev.env.js
  2. 2 1
      config/prod.env.js
  3. 2 1
      config/prod.test.env.js
  4. 3 2
      src/api/api.js
  5. 43 1
      src/api/modules/crmApi.js
  6. 19 1
      src/api/modules/overseasCustom.js
  7. 8 1
      src/api/modules/roadshowApi.js
  8. 5 0
      src/api/modules/setApi.js
  9. 30 4
      src/routes/modules/customRoutes.js
  10. 12 2
      src/views/Home.vue
  11. 3 2
      src/views/Login.vue
  12. 19 5
      src/views/business_ETA_manage/addBusiness.vue
  13. 14 1
      src/views/business_ETA_manage/businessDetail.vue
  14. 17 3
      src/views/business_ETA_manage/businessEdit.vue
  15. 16 1
      src/views/business_ETA_manage/businessList.vue
  16. 45 33
      src/views/contract_manage/components/allocationNumber.vue
  17. 9 1
      src/views/custom_manage/approvalTurn.vue
  18. 1 1
      src/views/custom_manage/approvalUpdate.vue
  19. 74 189
      src/views/custom_manage/compontents/CauthList.vue
  20. 27 6
      src/views/custom_manage/compontents/CpessionTable.vue
  21. 32 4
      src/views/custom_manage/compontents/CpessionTableEquity.vue
  22. 42 13
      src/views/custom_manage/customList/applyTurn.vue
  23. 1 2
      src/views/custom_manage/customList/components/raiPermissionbox.vue
  24. 17 2
      src/views/custom_manage/customList/customAllList.vue
  25. 93 139
      src/views/custom_manage/customList/customList.vue
  26. 167 151
      src/views/custom_manage/customList/customShareList.vue
  27. 98 0
      src/views/custom_manage/customList/mixins/quartersMixin.js
  28. 95 142
      src/views/custom_manage/customSearch.vue
  29. 462 49
      src/views/custom_manage/overseasList/overseasCustomRoadshow.vue
  30. 437 0
      src/views/custom_manage/points/AddNewEntries.vue
  31. 231 0
      src/views/custom_manage/points/EntryRecords.vue
  32. 211 0
      src/views/custom_manage/points/RankingOverview.vue
  33. 258 0
      src/views/custom_manage/points/RatingOverview.vue
  34. 85 0
      src/views/custom_manage/points/XClassCustom.vue
  35. 38 3
      src/views/dataReport_manage/statistic/newCustomlist.vue
  36. 2 1
      src/views/login_manage/ForgetPassModel.vue
  37. 11 8
      src/views/rai_manage/activityManage/activityManage.vue
  38. 16 20
      src/views/rai_manage/activityManage/applyManage.vue
  39. 2 0
      src/views/rai_manage/cygxManage/components/lableDlg.vue
  40. 55 19
      src/views/roadshow_manage/compononts/activityDetailDia.vue

+ 2 - 1
config/dev.env.js

@@ -11,5 +11,6 @@ module.exports = merge(prodEnv, {
   HR_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8391/login"',
   FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"',
   ETA_SYSTEM:'"http://8.136.199.33:7778/temppage"',
-  CYGX_WEB:'"https://clpttest.hzinsights.com"' // 查研观向网页版首页地址
+  CYGX_WEB:'"https://clpttest.hzinsights.com"', // 查研观向网页版首页地址
+  ETA_Forum:'"http://8.136.199.33:8900/autoLogin"',//ETA社区
 });

+ 2 - 1
config/prod.env.js

@@ -7,5 +7,6 @@ module.exports = {
 	HR_MANAGEMENT_SYSTEM:'"https://hr.hzinsights.com/login"',
 	FINANCIAL_MANAGEMENT_SYSTEM:'"https://fms.hzinsights.com/login"',
 	ETA_SYSTEM:'"https://eta.hzinsights.com/temppage"',
-	CYGX_WEB:'"https://web.hzinsights.com"' // 查研观向网页版首页地址
+	CYGX_WEB:'"https://web.hzinsights.com"', // 查研观向网页版首页地址
+	ETA_Forum:'"https://forumadmin.hzinsights.com/autoLogin"',//ETA社区
 }

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

@@ -9,5 +9,6 @@ module.exports = {
 	HR_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8391/login"',
   FINANCIAL_MANAGEMENT_SYSTEM:'"http://8.136.199.33:8618/login"',
   ETA_SYSTEM:'"http://8.136.199.33:7778/temppage"',
-	CYGX_WEB:'"https://clpttest.hzinsights.com"' // 查研观向网页版首页地址
+	CYGX_WEB:'"https://clpttest.hzinsights.com"', // 查研观向网页版首页地址
+	ETA_Forum:'"http://8.136.199.33:8900/autoLogin"',//ETA社区
 }

+ 3 - 2
src/api/api.js

@@ -22,7 +22,7 @@ import { departInterence, videoInterence ,InteractionInterence,enAuthInterence}
 import { dataMainInterface } from './modules/statisticApi';
 
 //crm
-import { customInterence ,equityContacts} from './modules/crmApi';
+import { customInterence ,equityContacts ,xClassCustomApi} from './modules/crmApi';
 
 //合同
 import { contractInterface } from './modules/contractApi';
@@ -114,7 +114,8 @@ export {
   businessTripInterence,
   reportVarietyENInterence,
   businessCustomInterence,
-  assistanceDocInterence
+  assistanceDocInterence,
+  xClassCustomApi
 };
 
 //老接口 研报 ppt等

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

@@ -129,6 +129,10 @@ const customInterence = {
     // return http.get('/custom/seller/check/list',params)
     return http.get("/custom/seller/check/listV2", params);
   },
+  /* 获取正式客户共享-原销售列表 */
+  getShareSale:(params)=>{
+    return http.get("/custom/seller/check/Sharelist2",params)
+  },
   /* 客户详情
 		CompanyId 
 	*/
@@ -481,6 +485,12 @@ const customInterence = {
   salesShareList: (params) => {
     return http.get("/custom/seller/share/list", params);
   },
+  /**
+   * 获取分配销售列表,根据用户角色返回 共享客户组 or 权益销售组
+   */
+  getShareSaleList:(params)=>{
+    return http.get("/custom/seller/share/list", params);
+  },
   /**
    * 获取 共享客户列表
    * SortParam 排序字段
@@ -1265,4 +1275,36 @@ const customAllInterence = {
     },
 }
 
-export { customInterence,customAllInterence, equityContacts,etaTrialInterence};
+/* X类客户评分 */
+const xClassCustomApi = {
+  //模板 列表
+  enterScoreDetail:(params)=>{
+      return http.get("/cygx/enterScore/detail",params)
+  },
+   //添加/ 更新录分
+   enterScoreUpdate:(params)=>{
+    return http.post("/cygx/enterScore/update",params)
+  },  
+  // X试用类客户检索
+  enterScoreSearchlist:(params)=>{
+      return http.get("/cygx/enterScore/company/searchlist",params)
+  },
+  // 录分列表接口
+  enterScoreList:(params)=>{
+    return http.get("/cygx/enterScore/list",params)
+  },
+  // 录分列表接口
+  enterScoreDelete:(params)=>{
+    return http.post("/cygx/enterScore/delete",params)
+  },  
+  // 评分总览接口
+  enterScoreScoreOverview:(params)=>{
+    return http.get("/cygx/enterScore/scoreOverview",params)
+  }, 
+  // 排名总览接口
+  enterScoreRankingOverview:(params)=>{
+    return http.get("/cygx/enterScore/rankingOverview",params)
+  }, 
+}
+
+export { customInterence,customAllInterence, equityContacts,etaTrialInterence,xClassCustomApi};

+ 19 - 1
src/api/modules/overseasCustom.js

@@ -106,13 +106,31 @@ export const overseasCustomInterence = {
     },
 
     /**
-     * 海外客户路演列表
+     * 海外客户路演列表 - 客户维度
      * @param {*} params 
      * ResearcherId SellerId  StartDate EndDate  CompanyStatus
      * @returns 
      */
     getOverseasRoadShowList: params => {
         return http.get('/roadshow/overseas_custom/calendar/list',params)
+    },
+    /**
+     * 海外客户路演列表 - 销售维度
+     * @param {*} params 
+     * DataType StartDate EndDate
+     * @returns 
+    */
+    getOverseasSellerRoadShowList: params => {
+        return http.get('/roadshow/overseas_custom/seller/list',params)
+    },
+    /**
+     * 海外客户路演列表 - 研究员维度
+     * @param {*} params 
+     * DataType StartDate EndDate
+     * @returns 
+    */
+    getOverseasResearcherRoadShowList: params => {
+        return http.get('/roadshow/overseas_custom/researcher/list',params)
     }
 
 }

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

@@ -222,7 +222,14 @@ const roadshowInterence={
 	statisticDetailList: params => {
 		return http.get('/roadshow/report/calendar/list',params)
 	},
-
+	/**
+	 * 统计详情列表-海外路演
+	 * @param {} params DataType StartDate EndDate AdminIds AdminType
+	 * @returns 
+	 */
+	overseaStatisticDetailList: params => {
+		return http.get('/roadshow/overseas/calendar/list',params)
+	},
 	/**
 	 * 选择的研究员接口
 	 * @param {AdminIds} params DataType StartDate EndDate AdminId AdminType

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

@@ -354,6 +354,11 @@ const departInterence = {
 	getResearchStatisticsAmount:params=>{
 		return http.get('/banner/research_statistics/amount',params)
 	},
+
+	//获取跳转到ETA社区的code
+	getToETAForumCode:()=>{
+		return http.get('/sysuser/forum_admin/auth_code',{})
+	},
 }
 
 /* 视频管理 */

+ 30 - 4
src/routes/modules/customRoutes.js

@@ -52,7 +52,7 @@ export default [
       {
         path: "customListEn",
         component: () => import("@/views/custom_manage/customList/customListEn.vue"),
-        name: "英文客户列表",
+        name: "英文报告权限",
         hidden: false,
       },
       {
@@ -111,7 +111,7 @@ export default [
         hidden: true,
         meta: {
           pathFrom: "customListEn",
-          pathName: "英文客户列表",
+          pathName: "英文报告权限",
         },
       },
       {
@@ -121,7 +121,7 @@ export default [
         hidden: true,
         meta: {
           pathFrom: "customListEn",
-          pathName: "英文客户列表",
+          pathName: "英文报告权限",
         },
       },
       {
@@ -142,7 +142,7 @@ export default [
         hidden: true,
         meta: {
           pathFrom: "customListEn",
-          pathName: "英文客户列表",
+          pathName: "英文报告权限",
         },
       },
       {
@@ -437,6 +437,32 @@ export default [
         name:"海外客户路演",
         component: () => import('@/views/custom_manage/overseasList/overseasCustomRoadshow.vue'),
         hidden: false
+      },
+      {
+        path:'XClassCustomPoints',
+        name:"X类客户派点",
+        component: () => import('@/views/custom_manage/points/XClassCustom.vue'),
+        hidden: false
+      },
+      {
+        path:'AddNewEntries',
+        name:"新增录分",
+        component: () => import('@/views/custom_manage/points/AddNewEntries.vue'),
+        hidden: false,
+        meta:{
+          pathFrom: "XClassCustomPoints",
+          pathName: "X类客户派点",
+        }
+      },
+      {
+        path:'EditNewEntries',
+        name:"查看明细",
+        component: () => import('@/views/custom_manage/points/AddNewEntries.vue'),
+        hidden: false,
+        meta:{
+          pathFrom: "XClassCustomPoints",
+          pathName: "X类客户派点",
+        }
       }
     ],
   },

+ 12 - 2
src/views/Home.vue

@@ -62,12 +62,13 @@
                   </template>
                   <el-menu-item
                     v-for="child in item.children"
-                    :index="child.path"
+                    :index="child.path=='etaForum'?null:child.path"
                     :path="child.path"
                     :key="child.path"
                     v-show="!child.hidden"
                   >
-                    <a :href="`/${child.path}`" :style="`display: block;color:${child.path===activePath ? '#FDB863 ' : '#fff'}`" @click="(e) => e.preventDefault() ">
+                    <span v-if="child.path==='etaForum'" :style="`display: block;color:${child.path===activePath ? '#FDB863 ' : '#fff'}`" @click.prevent="linkToOtherMS('ETA_Forum')">{{child.name}}</span>
+                    <a v-else :href="`/${child.path}`" :style="`display: block;color:${child.path===activePath ? '#FDB863 ' : '#fff'}`" @click="(e) => e.preventDefault() ">
                       {{child.name}}
                     </a>
                   </el-menu-item>
@@ -733,6 +734,15 @@ export default {
           href=`${href}?code=${res.Data}`
         }
       }
+      if(key==='ETA_Forum'){
+        const res=await departInterence.getToETAForumCode()
+        if(res.Ret===200){
+          href=`${href}?code=${res.Data}`
+        }else{
+          this.$message.warning(res.Msg)
+          return
+        }
+      }
       window.open(href,'_blank');
     },
     // 切换通知消息类型

+ 3 - 2
src/views/Login.vue

@@ -541,7 +541,8 @@ export default {
 			departInterence.userLogin({
 				LoginType:2,
 				Mobile:mobile,
-				VerifyCode:checkCode
+				VerifyCode:checkCode,
+				TelAreaCode:this.$refs[model].areaCodeSelect,
 			}).then(res=>{
 				if(res.Ret!==200){
 					//刷新图形验证码
@@ -560,7 +561,7 @@ export default {
 			departInterence.userLogin({
 				LoginType:3,
 				Email:email,
-				VerifyCode:checkCode
+				VerifyCode:checkCode,
 			}).then(res=>{
 				if(res.Ret!==200){
 					//刷新图形验证码

+ 19 - 5
src/views/business_ETA_manage/addBusiness.vue

@@ -54,7 +54,7 @@
                     <el-form-item label="社会信用码" prop="creditCode">
                         <el-input disabled placeholder="请输入社会信用码" v-model="firstFormData.creditCode"/>
                     </el-form-item>
-                    <el-form-item label="商家地址" prop="address">
+                    <el-form-item label="商家地址" prop="address" v-if="firstFormData.areaType=='国内'">
                         <el-cascader 
                             v-model="firstFormData.address"
                             :props="locationProps"
@@ -64,6 +64,16 @@
                             placeholder="请选择客户地址" 
                         />
                     </el-form-item>
+                    <el-form-item label="所属国家" prop="nation" v-else>
+                        <el-select v-model="firstFormData.nation" placeholder="请选择所属国家" filterable style="width: 360px;">
+                            <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                            <div style="display: flex;justify-content: space-between;">
+                                <span>{{ item.cnName }}</span>
+                                <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                            </div>
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
                 </div>
                 <div class="form-line">
                     <el-form-item label="决策人" prop="decisionMaker">
@@ -174,9 +184,11 @@ import { customInterence,roadshowInterence,businessCustomInterence } from '@/api
 import autocomplete from "@/components/autocomplete.vue";
 import Steps from "./components/Steps.vue";
 import {locationOptions} from "@/views/custom_manage/customList/location"
+import country from "@/utils/countryData"
 export default {
     components: {autocomplete,Steps},
     data() {
+        this.countryData = country
         return {
             /* 城市地址数据 */
             locationOptions,
@@ -221,6 +233,7 @@ export default {
                 name:[{ required: true, message: '请输入商家名称', trigger: 'blur' },],
                 creditCode:[{ required: true, message: '请输入社会信用码', trigger: 'blur' },],
                 address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
+                nation:[{ required: true, message: '请选择所属国家', trigger: 'change' },],
                 decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
                 teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
                 industry:[{required: true, message: '请选择所属行业', trigger: 'change' },],
@@ -236,6 +249,7 @@ export default {
                 name:'',
                 creditCode:'',
                 address:'',
+                nation:'',
                 decisionMaker:'',
                 teamSize:'',
                 fundsize:'',
@@ -255,11 +269,11 @@ export default {
                 console.log('watch?',newVal)
                 if(newVal==='海外'){
                     this.firstFormData.creditCode = 'HZ' + new Date().getTime()
-                    this.firstFormData.address = ['海外','其他市']
-                    this.selectRegion(['海外','其他市'])
+                    // this.firstFormData.address = ['海外','其他市']
+                    // this.selectRegion(['海外','其他市'])
                 }else{
                     this.firstFormData.creditCode = ''
-                    this.firstFormData.address = []
+                    // this.firstFormData.address = []
                 }
             }
         }
@@ -278,6 +292,7 @@ export default {
                 RegionType:params.areaType,
                 Province:params.province,
                 City:params.city,
+                Nation:params.nation,
                 SellerId:Number(cascaderNodes[0]?cascaderNodes[0].value:0),
                 SellerName:cascaderNodes[0]?cascaderNodes[0].label:'',
                 Leader:params.decisionMaker,
@@ -302,7 +317,6 @@ export default {
                         if(res.Ret!==200) return 
                         this.step++
                     })
-                    
                 }
             })
         },

+ 14 - 1
src/views/business_ETA_manage/businessDetail.vue

@@ -31,7 +31,7 @@
                                 <el-radio label="海外" border>海外</el-radio>
                             </el-radio-group>
                         </el-form-item>
-                        <el-form-item label="商家地址" prop="address">
+                        <el-form-item label="商家地址" prop="address" v-if="firstFormData.RegionType=='国内'">
                             <el-cascader 
                                 v-model="firstFormData.address"
                                 :props="locationProps"
@@ -41,6 +41,16 @@
                                 placeholder="请选择客户地址" 
                             />
                         </el-form-item>
+                        <el-form-item label="所属国家" prop="Nation" v-else>
+                            <el-select v-model="firstFormData.Nation" placeholder="请选择所属国家" filterable style="width: 360px;">
+                                <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                                <div style="display: flex;justify-content: space-between;">
+                                    <span>{{ item.cnName }}</span>
+                                    <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                                </div>
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
                     </div>
                     <div class="form-line">
                         <el-form-item label="社会信用码" prop="CreditCode">
@@ -157,9 +167,11 @@ import { customInterence , businessCustomInterence} from '@/api/api.js'
 import Steps from "./components/Steps.vue";
 import AddRenewal from "./components/AddRenewal";
 import {locationOptions} from "@/views/custom_manage/customList/location"
+import country from "@/utils/countryData"
 export default {
     components: {Steps,AddRenewal},
     data() {
+        this.countryData = country
         return {
             locationOptions,
             locationProps:{
@@ -189,6 +201,7 @@ export default {
                 BusinessName:'',
                 CreditCode:'',
                 Address:'',
+                Nation:'',
                 Leader:'',
                 ResearchTeamSize:'',
                 CapitalScale:'',

+ 17 - 3
src/views/business_ETA_manage/businessEdit.vue

@@ -30,7 +30,7 @@
                                 <el-radio label="海外" border>海外</el-radio>
                             </el-radio-group>
                         </el-form-item>
-                        <el-form-item label="商家地址" prop="address">
+                        <el-form-item label="商家地址" prop="address" v-if="firstFormData.RegionType=='国内'">
                             <el-cascader 
                                 v-model="firstFormData.address"
                                 :props="locationProps"
@@ -40,6 +40,16 @@
                                 placeholder="请选择客户地址" 
                             />
                         </el-form-item>
+                        <el-form-item label="所属国家" prop="Nation" v-else>
+                            <el-select v-model="firstFormData.Nation" placeholder="请选择所属国家" filterable style="width: 360px;">
+                                <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                                <div style="display: flex;justify-content: space-between;">
+                                    <span>{{ item.cnName }}</span>
+                                    <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                                </div>
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
                     </div>
                     <div class="form-line">
                         <el-form-item label="社会信用码" prop="CreditCode">
@@ -152,9 +162,11 @@ import { customInterence , businessCustomInterence} from '@/api/api.js'
 import Steps from "./components/Steps.vue";
 import AddRenewal from "./components/AddRenewal";
 import {locationOptions} from "@/views/custom_manage/customList/location"
+import country from "@/utils/countryData"
 export default {
     components: {Steps,AddRenewal},
     data() {
+        this.countryData = country
         return {
             locationOptions,
             locationProps:{
@@ -184,6 +196,7 @@ export default {
                 BusinessName:'',
                 CreditCode:'',
                 Address:'',
+                Nation:'',
                 Leader:'',
                 ResearchTeamSize:'',
                 CapitalScale:'',
@@ -194,6 +207,7 @@ export default {
                 City:''
             },
             rules:{
+                Nation:[{ required: true, message: '请选择所属国家', trigger: 'change' },],
                 address:[{ required: true, message: '请选择商家地址', trigger: 'change' },],
                 decisionMaker:[{required: true, message: '请输入决策人', trigger: 'blur' },],
                 teamSize:[{required: true, message: '请选择研究团队规模', trigger: 'change' },],
@@ -277,13 +291,13 @@ export default {
         // 保存商家
         handleSaveDetail(){
             const {EtaBusinessId,CapitalScale,
-                   address,Leader,IndustryId,
+                   address,Leader,IndustryId,Nation,
                    ResearchTeamSize,UserMax} = this.firstFormData
             const IndustryName = this.tradeArr.find(item=>item.IndustryId===IndustryId).IndustryName
             businessCustomInterence.editBusiness({
                 EtaBusinessId,Leader,
                 IndustryName,CapitalScale,
-                ResearchTeamSize,
+                ResearchTeamSize,Nation,
                 IndustryId:Number(IndustryId),
                 UserMax:Number(UserMax),
                 Province:address[0],

+ 16 - 1
src/views/business_ETA_manage/businessList.vue

@@ -57,6 +57,14 @@
                     @change="changeSelectOptions('location')" 
                     placeholder="请选择客户地址" 
                 />
+                <el-select v-model="nation" placeholder="请选择所属国家" filterable clearable @change="changeSelectOptions('nation')">
+                    <el-option :label="item.cnName" :value="item.cnName" v-for="item in countryData" :key="item.code" >
+                        <div style="display: flex;justify-content: space-between;">
+                            <span>{{ item.cnName }}</span>
+                            <span style="color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                        </div>
+                    </el-option>
+                </el-select>
                 <el-select 
                     v-model="signStatus" 
                     placeholder="请选择签约状态" 
@@ -94,6 +102,9 @@
                             <span v-else-if="item.key==='BusinessName'" class="link" @click="handleShowDetail(scope.row)">
                                 {{ scope.row.BusinessName }}
                             </span>
+                            <span v-else-if="item.key==='Address'">
+                                {{ scope.row.RegionType=='海外'?scope.row.Nation || scope.row.Address:scope.row.Address }}
+                            </span>  
                             <span v-else>{{scope.row[item.key]}}</span>
                         </template>
                     </el-table-column>
@@ -175,9 +186,11 @@ import { customInterence ,businessCustomInterence , roadshowInterence} from '@/a
 import {locationOptions} from "@/views/custom_manage/customList/location"
 import AddRenewal from './components/AddRenewal.vue'
 import ModifySaller from './components/ModifySaller.vue'
+import country from "@/utils/countryData"
 export default {
     components:{AddRenewal,ModifySaller},
     data() {
+        this.countryData = country
         return {
             /* dialog */
             showRenewal:false,//显示添加续约
@@ -194,6 +207,7 @@ export default {
             valueLocation:[],
             provinceValue:'',
             cityValue:'',
+            nation:'',
             locationProps:{
                 multiple: true,
                 value:'name',
@@ -234,7 +248,7 @@ export default {
                     key:'BusinessCode'
                 },
                 {
-                    label:'商家地址',
+                    label:'商家地址/所属国家',
                     key:'Address'
                 },
                 {
@@ -321,6 +335,7 @@ export default {
                 Province:this.provinceValue,
                 City:this.cityValue,
                 IndustryId:Number(this.trade),
+                Nation:this.nation,
                 PageSize:this.pageSize,
                 CurrentIndex:this.page,
                 SortParam:this.sortParam,

+ 45 - 33
src/views/contract_manage/components/allocationNumber.vue

@@ -7,37 +7,31 @@
           <el-button style="margin-top: 20px" type="primary" size="mini" @click="averageaAllocation">平均分配</el-button>
         </div>
 
-        <p>
-          1)单行业套餐只能在对应行业内部分配研究员贡献百分比<br />
-          2)多行业套餐先在行业间分配百分比(最低不低于平均值的一半),再分配到个人<br />
-          3)允许总额20%以内的负分<br />
-          4)转正后一个季度内可以提交和修改
-          <br />
-        </p>
+        <div>
+          <p v-for="(item, index) in textualList" :key="item.text">{{ index + 1 }}{{ item.text }}</p>
+        </div>
       </div>
       <div class="content-box">
         <div v-for="item in listArr" :key="item.ChartPermissionName">
-          <div class="industry-ul">
-            <span :class="['industry-name', item.ChartPermissionId == '31' && 'name-yanxuan', item.ChartPermissionId == '52' && 'points-name']">{{ item.ChartPermissionName }}</span>
-            <template v-if="item.ChartPermissionId != '31' && item.ChartPermissionId != '52'">
-              <el-input :min="-100" :max="100" type="number" v-model="item.Proportion" size="small" @input="restrictInput(item)" style="width: 76px; margin: 0 5px 0 8px">
+          <div :class="['industry-ul', item.ChartPermissionName.includes('研选') && 'ul-yanxuan']">
+            <span :class="['industry-name', item.ChartPermissionName.includes('研选') && 'name-yanxuan']">{{ item.ChartPermissionName }}</span>
+            <template>
+              <el-input :min="-100" :max="100" type="number" v-model="item.Proportion" size="small" @input="restrictInput(item)" style="width: 80px; margin: 0 5px 0 8px">
                 <div class="per_cent_" slot="suffix">%</div>
               </el-input>
               <p style="width: 38px">{{ roundedResult(item) }}</p>
             </template>
-            <p style="width: 38px; height: 32px; line-height: 32px; text-align: center" v-else>{{ item.Money }}</p>
           </div>
-          <div v-for="study in item.List" :key="study.RealName" class="industry-ul">
-            <span :class="['study-name', item.ChartPermissionId == '31' && 'name-yanxuan', item.ChartPermissionId == '52' && 'points-name']">{{ study.RealName }}</span>
-            <template v-if="!study.RealName.includes('研选')">
+          <div v-for="study in item.List" :key="study.RealName" :class="['industry-ul', item.ChartPermissionName.includes('研选') && 'ul-yanxuan']">
+            <span :class="['study-name', item.ChartPermissionName.includes('研选') && 'name-yanxuan']">{{ study.RealName }}</span>
+            <template>
               <el-input :min="-100" :max="100" type="number" v-model="study.Proportion" size="small" style="width: 76px; margin: 0 5px 0 8px">
                 <div class="per_cent_" slot="suffix">%</div>
               </el-input>
               <p style="width: 38px">{{ roundedResult(study) }}</p>
             </template>
-            <p style="width: 38px; height: 32px; line-height: 32px; text-align: center" v-else>{{ study.Money }}</p>
           </div>
-          <div class="all-item" v-if="item.ChartPermissionId != '31' && item.ChartPermissionId != '52'">
+          <div class="all-item">
             <span> {{ allPerCentHandler(item) == 0 ? "" : `总占比:` }}</span>
             <span> {{ allPerCentHandler(item) == 0 ? "" : `${allPerCentHandler(item)}` }}</span>
           </div>
@@ -72,9 +66,32 @@ export default {
       listArr: [],
       allNum: 0,
       TotalPointsContent: "",
+      isXClass: false,
     };
   },
-  computed: {},
+  computed: {
+    textualList() {
+      let items = [
+        {
+          text: ")单行业套餐只能在对应行业内部分配研究员贡献百分比",
+        },
+        {
+          text: ")多行业套餐先在行业间分配百分比(最低不低于平均值的一半),再分配到个人",
+        },
+        {
+          text: ")允许总额20%以内的负分",
+        },
+        {
+          text: ")转正后一个季度内可以提交和修改",
+        },
+      ];
+      if (this.isXClass) {
+        return items.filter((item, index) => index == 0 || index == 3);
+      } else {
+        return items;
+      }
+    },
+  },
   watch: {
     allocationVisible: {
       handler(newVal) {
@@ -138,27 +155,19 @@ export default {
       if (res.Ret === 200) {
         this.allNum = res.Data.Money;
         this.listArr = res.Data.List;
+        this.isXClass = res.Data.IsXClass;
         this.TotalPointsContent = res.Data.TotalPointsContent;
       }
     },
     // 平均分配
     averageaAllocation() {
-      let isName = [];
-      this.listArr.forEach((item) => {
-        if (!item.ChartPermissionName.includes("研选")) {
-          isName.push(true);
-        }
-      });
-      let num = 100 / isName.length;
+      let num = (100 / this.listArr.length).toFixed(2);
+      console.log(num);
       this.listArr.forEach((item) => {
-        if (item.ChartPermissionName != "研选订阅" && item.ChartPermissionName != "研选扣点包") {
-          item.Proportion = num;
-        }
-        let childrenNum = num / item.List.length;
+        item.Proportion = num;
+        let childrenNum = (num / item.List.length).toFixed(2);
         item.List.forEach((key) => {
-          if (key.RealName != "研选订阅" && key.RealName != "研选扣点包") {
-            key.Proportion = childrenNum;
-          }
+          key.Proportion = childrenNum;
         });
       });
     },
@@ -181,7 +190,7 @@ export default {
       display: flex;
       align-items: center;
       margin: 30px 0;
-      width: 180px;
+      width: 188px;
       color: #333;
       margin-right: 25px;
       .per_cent_ {
@@ -224,6 +233,9 @@ export default {
   .points-name {
     width: 80px !important;
   }
+  .ul-yanxuan {
+    width: 220px !important;
+  }
   /* 取消[type='number']的input的上下箭头 */
   input::-webkit-inner-spin-button {
     -webkit-appearance: none !important;

+ 9 - 1
src/views/custom_manage/approvalTurn.vue

@@ -14,7 +14,7 @@
 							<span>合同类型: {{contractInfo.ContractType}}</span>
 						</li>
 						<li>
-							<span style="min-width:450px;marginRight:260px;display:inline-block;">合同期限:{{contractInfo.StartDate}}-{{contractInfo.EndDate}}({{contractInfo.StartDate|formateYear(contractInfo.EndDate)}})</span>
+							<span style="min-width:450px;marginRight:260px;display:inline-block;">合同期限:{{ContractTermTxt}}</span>
 							<span>合同金额:{{contractInfo.Money}}元</span>
 						</li>
 						<li>
@@ -267,6 +267,14 @@ export default {
 		}
 		this.getCompanyInfo()
 	},
+	computed:{
+		ContractTermTxt(){
+			let date = `${this.contractInfo.StartDate}-${this.contractInfo.EndDate}`;
+			let calculation = CalculationDate(this.contractInfo.StartDate,this.contractInfo.EndDate);
+			let str = this.contractInfo.Quarter ? this.contractInfo.Quarter + `(${date})` : date + `(${calculation})`;
+			return str
+		}
+	},
 }
 </script>
 <style lang='scss'>

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

@@ -12,7 +12,7 @@
 						<span>合同类型:{{contractInfo.ContractType}}</span><span class="contract_type_hint">{{contractInfo.SourceTag}}</span>
 					</li>
 					<li>
-						<span style="min-width:320px;marginRight:260px;display:inline-block;">合同期限:{{contractInfo.StartDate}}-{{contractInfo.EndDate}}({{diff_time}}年期)</span>
+						<span style="min-width:320px;marginRight:260px;display:inline-block;">合同期限:{{contractInfo.Quarter}}{{contractInfo.StartDate}}-{{contractInfo.EndDate}}({{diff_time}}年期)</span>
 						<span>合同金额:{{contractInfo.Money}}元</span>
 					</li>
 					<li>

+ 74 - 189
src/views/custom_manage/compontents/CauthList.vue

@@ -14,109 +14,23 @@
 		<!-- 权益拆分 -->
 		<div v-if="autharr[0] && autharr[0].RaiMerge == 2" class="qy_menuList">
 			<el-table :data="autharr[0].dataList" :show-header="false" border :span-method="spanMethod">
-				<el-table-column align="center">
+				<el-table-column align="center" :width="autharr[0].dataList[0][key].width?autharr[0].dataList[0][key].width:''" 
+				v-for="key in Object.keys(autharr[0].dataList[0])" :key="key">
 					<template slot-scope="scope">
-						<span v-if="!scope.row.PermissionTypeName">
-							{{scope.row.PermissionTypeName}}
-						</span>
-						<el-checkbox :label="scope.row.PermissionTypeName.value" v-else @change="handleCheckQY(scope.row.PermissionTypeName)"
-						v-model="scope.row.PermissionTypeName.isCheckAll" :disabled="scope.row.PermissionTypeName.isDisabled"
-						:indeterminate="scope.row.PermissionTypeName.isIndeterminate"></el-checkbox>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<el-checkbox v-if="scope.row.medicine.value === '医药'" :label="scope.row.medicine.value" :indeterminate="scope.row.medicine.isIndeterminate"
-						@change="handleCheckQY(scope.row.medicine)" v-model="scope.row.medicine.isCheckAll" :disabled="scope.row.medicine.isDisabled"></el-checkbox>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.medicine.value" class="checkbox-flex"
-							:disabled="scope.row.medicine.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<el-checkbox v-if="scope.row.consumption.value === '消费'" :label="scope.row.consumption.value" :indeterminate="scope.row.consumption.isIndeterminate"
-						@change="handleCheckQY(scope.row.consumption)" v-model="scope.row.consumption.isCheckAll" :disabled="scope.row.consumption.isDisabled"></el-checkbox>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.consumption.value" class="checkbox-flex"
-							:disabled="scope.row.consumption.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<el-checkbox v-if="scope.row.technology.value === '科技'" :label="scope.row.technology.value" :indeterminate="scope.row.technology.isIndeterminate"
-						@change="handleCheckQY(scope.row.technology)" v-model="scope.row.technology.isCheckAll" :disabled="scope.row.technology.isDisabled"></el-checkbox>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.technology.value" class="checkbox-flex"
-							:disabled="scope.row.technology.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<el-checkbox v-if="scope.row.smart.value === '智造'" :label="scope.row.smart.value" :indeterminate="scope.row.smart.isIndeterminate"
-						@change="handleCheckQY(scope.row.smart)" v-model="scope.row.smart.isCheckAll" :disabled="scope.row.smart.isDisabled"></el-checkbox>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.smart.value" class="checkbox-flex"
-							:disabled="scope.row.smart.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<span v-if="scope.row.strategy.value === '策略'">
-							{{scope.row.strategy.value}}
-						</span>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.strategy.value" class="checkbox-flex"
-							:disabled="scope.row.strategy.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<span v-if="scope.row.experts.value === '专家'">
-							{{scope.row.experts.value}}
-						</span>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.experts.value" class="checkbox-flex"
-							:disabled="scope.row.experts.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<span v-if="scope.row.roadshow.value === '路演服务'">
-							{{scope.row.roadshow.value}}
-						</span>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.roadshow.value" class="checkbox-flex"
-							:disabled="scope.row.roadshow.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center">
-					<template slot-scope="scope">
-						<span v-if="scope.row.choose.value === '研选订阅'">
-							{{scope.row.choose.value}}
-						</span>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.choose.value" class="checkbox-flex"
-							:disabled="scope.row.choose.isDisabled">{{''}}</el-checkbox>
-						</el-checkbox-group>
-					</template>
-				</el-table-column>
-				<el-table-column align="center" width="100px">
-					<template slot-scope="scope">
-						<span v-if="scope.row.points.value === '研选扣点包'">
-							{{scope.row.points.value}}
-						</span>
-						<el-checkbox-group v-model="qyCheckList" v-else >
-							<el-checkbox :label="scope.row.points.value" class="checkbox-flex"
-							:disabled="scope.row.points.isDisabled">{{''}}</el-checkbox>
+						<!-- 主客观 区分的品种+复选框-->
+						<el-checkbox :label="scope.row[key].value" @change="handleCheckQY(scope.row[key])"
+						v-model="scope.row[key].isCheckAll" :disabled="scope.row[key].isDisabled"
+						:indeterminate="scope.row[key].isIndeterminate"
+						v-if="(scope.row[key].ids && scope.row[key].ids.length) || (scope.row[key].bothIds&& scope.row[key].bothIds.length)"></el-checkbox>
+						<!-- 不区分 只有复选框-->
+						<el-checkbox-group v-model="qyCheckList" v-else-if="typeof(scope.row[key].value)=='number'">
+							<el-checkbox :label="scope.row[key].value" class="checkbox-flex"
+							:disabled="scope.row[key].isDisabled">{{''}}</el-checkbox>
 						</el-checkbox-group>
+						<!-- 只有品种名称 -->
+						<template v-else>
+							{{scope.row[key].value}}
+						</template>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -130,6 +44,20 @@
 </template>
 
 <script>
+// 权益的ID:
+/**
+ * 科技-主观(20)-客观(37)
+ * 消费-主观(21)-客观(38)
+ * 医药-主观(22)-客观(39)
+ * 智造-主观(19)-客观(36)
+ * 策略(23)
+ * 专家(29)
+ * 固收(53)
+ * 调研(54)
+ * 路演服务(30)
+ * 研选订阅(31)
+ * 研选扣点包(52)
+ */
 import { customInterence } from '@/api/api.js'
 export default {
 	name:'',
@@ -144,43 +72,36 @@ export default {
 	},
 	watch: {
 		autharr(value){
+			// console.log(value,'valuevaluevaluevalue');
 			if(value[0] && value[0].customType=='权益') this.qyCheckList = value[0].CheckList
 		},
 		qyCheckList(value){
+			let checkedIds=value||[]
 			// 根据复选框选择的情况 改变医药、消费、科技、智造、主客观复选框的状态
-			let arr = ['medicine','consumption','technology','smart']
-			for (let i = 0; i < arr.length; i++) {
-				let element = arr[i];
-				let arrLength = value.filter(item => {
-					return item == this.autharr[0].dataList[1][element].value || item == this.autharr[0].dataList[2][element].value
-				}).length
-				if(arrLength == 2){
-					this.autharr[0].dataList[0][element].isCheckAll=true
-					this.autharr[0].dataList[0][element].isIndeterminate=false
-				}else if(arrLength == 1){
-					this.autharr[0].dataList[0][element].isCheckAll=false
-					this.autharr[0].dataList[0][element].isIndeterminate=true
-				}else{
-					this.autharr[0].dataList[0][element].isCheckAll=false
-					this.autharr[0].dataList[0][element].isIndeterminate=false
-				}
-			}
-			for (let i = 0; i < 2; i++) {
-				let arrLength = value.filter(item => {
-					return item == this.autharr[0].dataList[i+1].medicine.value || item == this.autharr[0].dataList[i+1].consumption.value ||
-						item == this.autharr[0].dataList[i+1].technology.value || item == this.autharr[0].dataList[i+1].smart.value
-				}).length
-				if(arrLength == 4){
-					this.autharr[0].dataList[i+1].PermissionTypeName.isCheckAll=true
-					this.autharr[0].dataList[i+1].PermissionTypeName.isIndeterminate=false
-				}else if(arrLength == 0){
-					this.autharr[0].dataList[i+1].PermissionTypeName.isCheckAll=false
-					this.autharr[0].dataList[i+1].PermissionTypeName.isIndeterminate=false
+			this.autharr[0].dataList.map(it =>{
+				if(it.PermissionTypeName&&it.PermissionTypeName.value){
+					let idArr = [...checkedIds,...it.PermissionTypeName.ids]
+					let idArrLen = idArr.length
+					// 去重后的
+					let idRemovalArrLen = [...new Set(idArr)].length
+					it.PermissionTypeName.isCheckAll = idArrLen-idRemovalArrLen == it.PermissionTypeName.ids.length
+					it.PermissionTypeName.isIndeterminate = idArrLen-idRemovalArrLen < it.PermissionTypeName.ids.length && 
+																									idArrLen-idRemovalArrLen > 0					
 				}else{
-					this.autharr[0].dataList[i+1].PermissionTypeName.isCheckAll=false
-					this.autharr[0].dataList[i+1].PermissionTypeName.isIndeterminate=true
+					Object.values(it).forEach(permission =>{
+						if(permission.bothIds && permission.bothIds.length>1){
+							// 有主客观的
+							let idArr = [...checkedIds,...permission.bothIds]
+							let idArrLen = idArr.length
+							// 去重后的
+							let idRemovalArrLen = [...new Set(idArr)].length
+							permission.isCheckAll = idArrLen-idRemovalArrLen == permission.bothIds.length
+							permission.isIndeterminate = idArrLen-idRemovalArrLen < permission.bothIds.length && 
+																											idArrLen-idRemovalArrLen > 0
+						}
+					})
 				}
-			}
+			})
 		}
 	},
 	data () {
@@ -203,7 +124,6 @@ export default {
 				// 权益拆分
 				checkArr = this.qyCheckList
 			}
-
 			customInterence.addTryout({
 				CompanyId:this.id,
 				ChartPermissionId:checkArr.join()
@@ -230,23 +150,27 @@ export default {
 				item.Items.map((it,i)=>{
 					if(item.CheckList.includes(it.ChartPermissionId) && it.PermissionType==1){
 						// 主观被选上,将客观的ID也push上
-						item.CheckList.push(item.Items[i+1].ChartPermissionId)
+						let ob=item.Items.find(pe => pe.PermissionName == it.PermissionName && pe.PermissionType==2)
+						item.CheckList.push(ob?ob.ChartPermissionId:0)
 					}else if(!item.CheckList.includes(it.ChartPermissionId) && it.PermissionType==1){
-						if(item.CheckList.indexOf(item.Items[i+1].ChartPermissionId)!=-1){
-							item.CheckList.splice(item.CheckList.indexOf(item.Items[i+1].ChartPermissionId),1)
+						// 主观被去除,将客观的ID也去除
+						let ob=item.Items.find(pe => pe.PermissionName == it.PermissionName && pe.PermissionType==2)
+						let obIndex = item.CheckList.indexOf(ob?ob.ChartPermissionId:0)
+						if(obIndex!=-1){
+							item.CheckList.splice(obIndex,1)
 						}
 					}
 				})
 			}
 			item.CheckList = [...new Set(item.CheckList)]
-			let len = item.CheckList.length;
+			let len = item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId)).length
 			item.checkAll = len === item.Items.length;
 			item.isIndeterminate = len > 0 && len < item.Items.length;
 		},
 		// 权益选择套餐方法
 		// 合并单元格
 		spanMethod({ row, rowIndex, column,columnIndex  }){
-			if([5,6,7,8,9].includes(columnIndex)){
+			if(Object.values(row)[columnIndex].merge){
 				if(rowIndex == 1){
 					return [2,1]
 				}else if(rowIndex == 2){
@@ -255,65 +179,26 @@ export default {
 			}
 		},
 		handleCheckQY(item){
-			let arr = ['medicine','consumption','technology','smart']
-			let arrCh = ['医药','消费','科技','智造']
 			// 全选
 			if(item.isCheckAll){
-				if(item.value == '主观'){
-					for (let i = 0; i < arr.length; i++) {
-						const element = arr[i];
-						this.qyCheckList.push(this.autharr[0].dataList[1][element].value)
-						this.qyCheckList = [...new Set(this.qyCheckList)]
-					}
-				}else if(item.value == '客观'){
-					for (let i = 0; i < arr.length; i++) {
-						const element = arr[i];
-						this.qyCheckList.push(this.autharr[0].dataList[2][element].value)
-						this.qyCheckList = [...new Set(this.qyCheckList)]
-					}
+				if(["客观","主观"].includes(item.value)){
+					this.qyCheckList = [...new Set([...this.qyCheckList,...item.ids])]
 				}else{
-					for (let i = 0; i < arr.length; i++) {
-						const element = arr[i];
-						const elementCh = arrCh[i];
-						if(item.value == elementCh){
-							this.qyCheckList.push(this.autharr[0].dataList[1][element].value,this.autharr[0].dataList[2][element].value)
-							this.qyCheckList = [...new Set(this.qyCheckList)]
-							break
-						}
-					}
+					this.qyCheckList = [...new Set([...this.qyCheckList,...item.bothIds])]
 				}
 			}else{ //全部不选
-				if(item.value == '主观'){
-					for (let i = 0; i < arr.length; i++) {
-						const element = arr[i];
+				if(["客观","主观"].includes(item.value)){
+					item.ids.map(pId =>{
 						// 需要删除的索引
-						let deleteIndex = this.qyCheckList.findIndex(id=> {
-							return id == this.autharr[0].dataList[1][element].value && (!this.autharr[0].dataList[2][element].isDisabled)
-						});
+						let deleteIndex = this.qyCheckList.findIndex(id=> id==pId && !(this.autharr[0].defaultAuth.includes(id)));
 						if(deleteIndex!=-1) this.qyCheckList.splice(deleteIndex,1)
-					}
-				}else if(item.value == '客观'){
-					for (let i = 0; i < arr.length; i++) {
-						const element = arr[i];
-						let deleteIndex = this.qyCheckList.findIndex(id=> {
-							return id == this.autharr[0].dataList[2][element].value && (!this.autharr[0].dataList[2][element].isDisabled)
-						});
-						if(deleteIndex!=-1) this.qyCheckList.splice(deleteIndex,1)
-					}
+					})
 				}else{
-					for (let i = 0; i < arr.length; i++) {
-						const element = arr[i];
-						const elementCh = arrCh[i];
-						if(item.value == elementCh){
-							for (let i = 0; i < 2; i++) {
-								let deleteIndex = this.qyCheckList.findIndex(id=> {
-									return id == this.autharr[0].dataList[i+1][element].value && (!this.autharr[0].dataList[i+1][element].isDisabled)
-								});
-								if(deleteIndex!=-1) this.qyCheckList.splice(deleteIndex,1)
-							}
-							break
-						}
-					}
+					item.bothIds.map(pId =>{
+						// 需要删除的索引
+						let deleteIndex = this.qyCheckList.findIndex(id=> id==pId && !(this.autharr[0].defaultAuth.includes(id)));
+						if(deleteIndex!=-1) this.qyCheckList.splice(deleteIndex,1)
+					})
 				}
 			}
 		}

+ 27 - 6
src/views/custom_manage/compontents/CpessionTable.vue

@@ -139,14 +139,35 @@ export default {
 	mounted() {
 		this.isRaiMerge = this.authList[0].RaiMerge
 		/* 处理表格数据格式 */
-		this.filterAuth = this.authList.map((item) => {
+		let tempArr=this.authList.map((item) => {
 			return item.Items;
 		});
-		this.filterAuth = this.filterAuth.flat(Infinity);
-		if(this.isRaiMerge==1){
+		tempArr = tempArr.flat(Infinity);
+		console.log(tempArr);
+		if(!this.isRaiMerge){
+			this.filterAuth = tempArr
+		}else if(this.isRaiMerge==1){
 			// 主客观合并 只取主观的
-			this.filterAuth = this.filterAuth.filter(it => {
-				return (['医药','消费','科技','智造'].includes(it.PermissionName) && it.PermissionType==1) || (!['医药','消费','科技','智造'].includes(it.PermissionName))
+			this.filterAuth = tempArr.filter(it => {
+				return it.PermissionType==1 || it.PermissionType==0
+			})
+		}else if(this.isRaiMerge==2){
+			// 主客观拆分 只取主观的
+			tempArr.map(item =>{
+				// 排下序 
+				if(item.PermissionType==1){
+					//主观 找客观
+					this.filterAuth.push(item)
+					let ob = tempArr.find(it => it.PermissionName == item.PermissionName && it.PermissionType!=1)
+					ob && this.filterAuth.push(ob)
+				}else if(item.PermissionType==0){
+					this.filterAuth.push(item)
+				}else{
+					// 客观
+					if(!this.filterAuth.find(t => t.ChartPermissionId == item.ChartPermissionId)){
+						this.filterAuth.push(item)
+					}
+				}
 			})
 		}
 		/* 选中的id数组 */
@@ -161,7 +182,7 @@ export default {
 		let check_Auth = this.filterAuth.filter((item) => {
 			return select.includes(item.ChartPermissionId);
 		});
-
+		console.log(check_Auth,'check_Auth');
 		if (this.fromType === 'edit') {
 			/* 展示表格选中的key */
 			let _this = this; 

+ 32 - 4
src/views/custom_manage/compontents/CpessionTableEquity.vue

@@ -36,6 +36,19 @@
 </template>
 
 <script>
+/**权益权限ID
+ * 科技-主观(20)-客观(37)
+ * 消费-主观(21)-客观(38)
+ * 医药-主观(22)-客观(39)
+ * 智造-主观(19)-客观(36)
+ * 策略(23)
+ * 专家(29)
+ * 固收(53)
+ * 调研(54)
+ * 路演服务(30)
+ * 研选订阅(31)
+ * 研选扣点包(52)
+ */
 export default {
 	props: {
 		authList: {
@@ -61,7 +74,7 @@ export default {
 	methods: {
 		/* 处理合并数组 */
 		getRowSpan() {
-            this.filterAuth.map((v, i, s) => {
+			this.filterAuth.map((v, i, s) => {
 				if (!v.PermissionTypeName) {
 				this.indexArrEquity.push(i);
 				}
@@ -200,9 +213,24 @@ export default {
 		}else {
 			/* 显示只有权限的数组 */
 			this.filterAuth = [];
-			this.filterAuth = check_Auth.filter((item) => {
-				return item.Status === '正式' || item.Status === '试用' || item.Status === '永续'||item.Status=='关闭'
-			});
+			check_Auth.map(item =>{
+				// 排序 以防合并问题
+				if(item.Status === '正式' || item.Status === '试用' || item.Status === '永续'||item.Status=='关闭'){
+					if(item.PermissionType==1){
+						//主观 找客观
+						this.filterAuth.push(item)
+						let ob = check_Auth.find(it => it.PermissionName == item.PermissionName && it.PermissionType!=1)
+						ob && this.filterAuth.push(ob)
+					}else if(item.PermissionType==0){
+						this.filterAuth.push(item)
+					}else{
+						// 客观
+						if(!this.filterAuth.find(t => t.ChartPermissionId == item.ChartPermissionId)){
+							this.filterAuth.push(item)
+						}
+					}
+				}
+			})
 			this.isMerge = this.filterAuth.some((item) => !item.IsMerge)
 		}
 		

+ 42 - 13
src/views/custom_manage/customList/applyTurn.vue

@@ -66,7 +66,7 @@
 									<i class="el-icon-info"></i>
 							</el-tooltip>
 						</el-form-item>
-						<el-form-item label="合同期限" prop="term" style="marginRight:60px;">
+						<el-form-item label="合同期限" prop="term" style="marginRight:60px;" :rules="{ required: true, message: '合同期限不能为空', trigger: 'blur' }" v-if="!isXClassCustom">
 							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 							<el-date-picker
 							v-model="formData.term"
@@ -79,6 +79,19 @@
 							style="width:400px;">
 							</el-date-picker>
 						</el-form-item>
+						<el-form-item label="合同期限" prop="term" :rules="{ required: true, message: '合同期限不能为空', trigger: 'change' }" style="marginRight:60px;" v-if="isXClassCustom">
+							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
+							<div class="quarters-content">
+								<el-checkbox-group v-model="selectedQuarters" @input="checkboxInputHandler">
+									<el-checkbox v-for="quarter in quarters" :key="quarter.value" :label="quarter.label" :disabled="isDisabled(quarter)" >
+										{{ quarter.label }}
+									</el-checkbox>
+								</el-checkbox-group>
+								<div v-if="selectedQuarters.length > 0" class="quarters-text">
+										{{ selectedDateRange }}
+								</div>
+							</div>
+						</el-form-item>
 						<el-form-item label="合同金额" prop="amount" style="marginRight:60px;">
 							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 							<el-input 
@@ -119,13 +132,13 @@
 								<i style="color:#f00;fontSize:20px;position:absolute;left:-15px;top:10%;">*</i>
 								权限设置
 							</label>
-							<template  v-if="companyInfo.CompanyType=='权益' ||isRoleType== '权益'">
+							<template  v-if="(companyInfo.CompanyType=='权益' || isRoleType== '权益') && !isXClassCustom" >
 								<raiPermissionbox ref="raiPermissionboxRef" v-for="item in authList" :key="item.ClassifyName" :data="item" :formData="formData"
 								:hasNoChild="hasNoChild"></raiPermissionbox>
 							</template>
 							<ul class="menu_lists" style="width:100%" v-else>
 								<li v-for="item in authList" :key="item.ClassifyName" class="menu_item">
-									<el-checkbox v-if="item.ClassifyName !== '权益'" :indeterminate="item.isIndeterminate" v-model="item.checkAll" :disabled="setSelectVarietyDisabled(item)" @change="handleCheckAll(item)" style="marginRight:30px;fontWeight:bold;minWidth:90px;">{{item.ClassifyName+':'}}</el-checkbox>
+									<el-checkbox  :indeterminate="item.isIndeterminate" v-model="item.checkAll" :disabled="setSelectVarietyDisabled(item)" @change="handleCheckAll(item)" style="marginRight:30px;fontWeight:bold;minWidth:90px;">{{item.ClassifyName+':'}}</el-checkbox>
 									<el-checkbox-group v-model="item.CheckList" @change="handleChecked(item)">
 										<el-checkbox v-for="list in item.Items" :label="list.ChartPermissionId" :key="list.ChartPermissionId" class="list_item" :disabled="list.IsPublic==1  || list.disabled">{{list.PermissionName}}</el-checkbox>
 									</el-checkbox-group>
@@ -179,10 +192,16 @@ import pdf from 'vue-pdf'
 import {CalculationDate} from '@/utils/CalculationDate'
 import JurisdictionCheck from '../compontents/jurisdictionCheck.vue';
 import raiPermissionbox from './components/raiPermissionbox'
-
+import quartersMixin from './mixins/quartersMixin'
 export default {
 	name:'',
+	mixins:[quartersMixin],
 	components: {imgPreview,pdf ,JurisdictionCheck,raiPermissionbox},
+	computed:{
+		isXClassCustom(){
+			return	this.companyInfo.Status.includes('永续') || this.companyInfo.Status.includes('X类试用')
+		}
+	},
 	data () {
 		return {
 			companyInfo:JSON.parse(sessionStorage.getItem('companyInfo')) || {},//客户基本信息
@@ -200,9 +219,6 @@ export default {
 			hasNoChild:false, // 医药、消费、科技、智造是否没有主客观
 			authList:[],//权限列表
 			formRule:{
-				term:[
-					{ required: true, message: '合同期限不能为空', trigger: 'blur' },
-				],
 				amount:[
 					{ required: true, message: '合同金额不能为空', trigger: 'blur' },
 					{ type: 'number', message: '合同金额必须为数字'}
@@ -254,9 +270,10 @@ export default {
 						setmeal:res.Data.Item.PackageType,
 						qyBigServeCheck:res.Data.Item.RaiPackageType
 					}
+					this.selectedQuarters = res.Data.Item.Quarter.split(',')
 					let newArr = [];
 					/* 处理权限列表 */
-					if(this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益') {
+					if((this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益') && !this.isXClassCustom ) {
 						res.Data.Item.PermissionList[0].Items.map(item => {
 							item.disabled=item.isIndeterminate=false								
 							if(item.ChartPermissionId==22 && (!item.Child)) this.hasNoChild=true
@@ -295,11 +312,12 @@ export default {
 		/* 获取基本权限信息 */
 		getAuthBasic() {
 			customInterence.authList({
-				IsShowYanXuanKouDian:true
+				IsShowYanXuanKouDian:true,
+				CompanyStatus:this.companyInfo.Status 
 			}).then(res => {
 				let newArr = [];
 				if(res.Ret === 200) {
-					if(this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益') {
+					if((this.companyInfo.CompanyType == '权益' || this.isRoleType== '权益') && !this.isXClassCustom) {
 						res.Data.List[0].Items.map(item => {
 							item.disabled=item.isIndeterminate=false								
 							if(item.ChartPermissionId==22 && (!item.Child)) this.hasNoChild=true
@@ -355,7 +373,7 @@ export default {
 					let checkArr = [];
 					let checkArrName = [];
 					let hasMinusSignVal = 0
-					if(this.companyInfo.CompanyType==='权益' || this.isRoleType== '权益'){
+					if((this.companyInfo.CompanyType==='权益' || this.isRoleType== '权益') && !this.isXClassCustom){
 					 	hasMinusSignVal = this.$refs.raiPermissionboxRef[0].minus_sign_val;		
 						this.authList.forEach(item => {
 								if(item.CheckList.length) {
@@ -578,7 +596,10 @@ export default {
 				})
 				this.$message.warning('请勾选品种')
 			}
-		}
+		},
+	checkboxInputHandler(){
+		this.formData.term = this.selectedQuarters ? [this.selectedDateRange.split(" ~ ")[0],this.selectedDateRange.split(" ~ ")[1]]:[]
+	}
 	
 	},
 	created() {},
@@ -673,6 +694,14 @@ export default {
 			}
 		}
 	}
-
+	.quarters-content {
+		position: relative;
+		.quarters-text {
+			position: absolute;
+			left: 0;
+			top: 20px;
+			color: #f00;
+		}
+	}
 }
 </style>

+ 1 - 2
src/views/custom_manage/customList/components/raiPermissionbox.vue

@@ -51,7 +51,7 @@
             </el-checkbox>
           </div>
         </el-checkbox-group>
-        <div class="rai-checkbox-notice-box">
+        <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>
           <p class="rai-checkbox-notice" v-if="equityGroupDisabled(data.CheckList)">同时包含升级行业各5次专项调研</p>
@@ -85,7 +85,6 @@
       }
     },
     created(){
-      console.log(this.data);
       // 回显
       if(this.data.CheckList && this.data.CheckList.length>0){
         this.data.Items.map(item =>{

+ 17 - 2
src/views/custom_manage/customList/customAllList.vue

@@ -793,8 +793,23 @@
                         let authEquity = [] //权益
                         res.Data.ListRai ? res.Data.ListRai.forEach(item => { //权益
                             // 过滤没有权限的套餐
-                            authEquity.push(item.Items.filter(it => item.CheckList.includes(it
-                                .ChartPermissionId)))
+                            let check_Auth = item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId))
+                            check_Auth.map(item =>{
+                                // 排序 以防合并问题
+                                if(item.PermissionType==1){
+                                    //主观 找客观
+                                    authEquity.push(item)
+                                    let ob = check_Auth.find(it => it.PermissionName == item.PermissionName && it.PermissionType!=1)
+                                    ob && authEquity.push(ob)
+                                }else if(item.PermissionType==0){
+                                    authEquity.push(item)
+                                }else{
+                                    // 客观
+                                    if(!authEquity.find(t => t.ChartPermissionId == item.ChartPermissionId)){
+                                        authEquity.push(item)
+                                    }
+                                }
+                            })
                         }) : ''
                         this.lookAuthListEquity = authEquity.flat(Infinity) //权益
                     }

+ 93 - 139
src/views/custom_manage/customList/customList.vue

@@ -1736,8 +1736,25 @@ ShareListDialog},
 					let authEquity =[] //权益
 					res.Data.ListRai ?	res.Data.ListRai.forEach(item=> {//权益
 						// 过滤没有权限的套餐
-						authEquity.push(item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId)))
+						let check_Auth = item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId))
+						check_Auth.map(item =>{
+						// 排序 以防合并问题
+							if(item.PermissionType==1){
+								//主观 找客观
+								authEquity.push(item)
+								let ob = check_Auth.find(it => it.PermissionName == item.PermissionName && it.PermissionType!=1)
+								ob && authEquity.push(ob)
+							}else if(item.PermissionType==0){
+								authEquity.push(item)
+							}else{
+								// 客观
+								if(!authEquity.find(t => t.ChartPermissionId == item.ChartPermissionId)){
+									authEquity.push(item)
+								}
+							}
+						})
 					}):''
+
 					this.lookAuthListEquity = authEquity.flat(Infinity) //权益
 				}
 			})
@@ -1880,10 +1897,24 @@ ShareListDialog},
 						auth.push(obj)
 					}):
 					// 权益 RaiMerge 0不管 1合并 2拆分 所传入的数据结构不一样
+					/**权益权限ID
+					 * 科技-主观(20)-客观(37)
+					 * 消费-主观(21)-客观(38)
+					 * 医药-主观(22)-客观(39)
+					 * 智造-主观(19)-客观(36)
+					 * 策略(23)
+					 * 专家(29)
+					 * 固收(53)
+					 * 调研(54)
+					 * 路演服务(30)
+					 * 研选订阅(31)
+					 * 研选扣点包(52)
+					 */
 					res.Data.ListRai[0].RaiMerge==1?res.Data.ListRai.forEach(item=> { // 合并
+						let checkedLen = item.Items.filter(it => item.CheckList && item.CheckList.includes(it.ChartPermissionId)).length
 						let obj = {
-							checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
-							isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+							checkAll:checkedLen === item.Items.length,
+							isIndeterminate:checkedLen > 0 && checkedLen < item.Items.length,
 							defaultAuth:item.CheckList,
 							...item,
 						}
@@ -1895,145 +1926,68 @@ ShareListDialog},
 							...item,
 						}	
 						// 组合所需的数据格式
-						obj.dataList=[
-							{
-								PermissionTypeName:'',
-								medicine:{
-									value:'医药',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==2
-								},
-								consumption:{
-									value:'消费',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==2
-								},
-								technology:{
-									value:'科技',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==2
-								},
-								smart:{
-									value:'智造',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==2
-								},
-								strategy:{
-									value:'策略'
-								},
-								experts:{
-									value:'专家'
-								},
-								roadshow:{
-									value:'路演服务'
-								},
-								choose:{
-									value:'研选订阅'
-								},
-								points:{
-									value:'研选扣点包'
-								},
-							},
-							{
-								PermissionTypeName:{
-									value:'主观',
-									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length),
-									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length == 4,
-									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length ==4
-								},
-								medicine:{
-									value:obj.Items[0].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[0].ChartPermissionId)
-								},
-								consumption:{
-									value:obj.Items[2].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[2].ChartPermissionId)
-								},
-								technology:{
-									value:obj.Items[4].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[4].ChartPermissionId)
-								},
-								smart:{
-									value:obj.Items[6].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[6].ChartPermissionId)
-								},
-								strategy:{
-									value:obj.Items[8].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
-								},
-								experts:{
-									value:obj.Items[9].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
-								},
-								roadshow:{
-									value:obj.Items[10].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
-								},
-								choose:{
-									value:obj.Items[11].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
-								},
-								points:{
-									value:obj.Items[12].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[12].ChartPermissionId)
+						let subjectivityIds=item.Items.filter(it => it.PermissionType==1).map(it => it.ChartPermissionId)//主观的ids
+						let subjectivityLength=subjectivityIds.length//有几个主观的id
+						let subjectivityCheckedLen = item.CheckList.filter(id => subjectivityIds.includes(id)).length//选中的有几个主观的id
+						let objectivityIds=item.Items.filter(it => it.PermissionType==2).map(it => it.ChartPermissionId)//客观的ids
+						let objectivityCheckedLen = item.CheckList.filter(id => objectivityIds.includes(id)).length//有几个客观的id
+						let objectivityLength=objectivityIds.length//选中的有几个客观的id
+						let arr = [{PermissionTypeName:''},
+											{PermissionTypeName:{
+												value:'主观',
+												isIndeterminate:subjectivityCheckedLen>0 && subjectivityCheckedLen<subjectivityLength,
+												isCheckAll:subjectivityCheckedLen == subjectivityLength,
+												isDisabled:subjectivityCheckedLen == subjectivityLength,
+												ids:subjectivityIds
+											}},
+											{PermissionTypeName:{
+												value:'客观',
+												isIndeterminate:objectivityCheckedLen > 0 && objectivityCheckedLen < objectivityLength,
+												isCheckAll:objectivityCheckedLen == objectivityLength,
+												isDisabled:objectivityCheckedLen == objectivityLength,
+												ids:objectivityIds
+											}}]
+						item.Items.map(cp =>{
+							if(cp.PermissionType==0){
+								// 没有主客观的权限
+								arr[0][cp.PermissionName]={
+									value:cp.PermissionName,
+									width:cp.PermissionName=='研选扣点包'?'100px':'',
+									merge:true
 								}
-							},
-							{
-								PermissionTypeName:{
-									value:'客观',
-									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length),
-									isCheckAll:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 4,
-									isDisabled:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==4
-								},
-								medicine:{
-									value:obj.Items[1].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[1].ChartPermissionId)
-								},
-								consumption:{
-									value:obj.Items[3].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[3].ChartPermissionId)
-								},
-								technology:{
-									value:obj.Items[5].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[5].ChartPermissionId)
-								},
-								smart:{
-									value:obj.Items[7].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[7].ChartPermissionId)
-								},
-								strategy:{
-									value:obj.Items[8].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
-								},
-								experts:{
-									value:obj.Items[9].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
-								},
-								roadshow:{
-									value:obj.Items[10].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
-								},
-								choose:{
-									value:obj.Items[11].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
-								},
-								points:{
-									value:obj.Items[12].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[12].ChartPermissionId)
+								arr[1][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId),
+									merge:true
+								}
+								arr[2][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId),
+									merge:true
+								}
+							}else if(cp.PermissionType==1){
+								// 找出对应的客观Id
+								let objectivity = item.Items.find(it => it.PermissionName == cp.PermissionName && it.PermissionType==2)
+								arr[0][cp.PermissionName]={
+									value:cp.PermissionName,
+									isIndeterminate:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length ==2,
+									bothIds:[cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0]
+								}
+								arr[1][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId)
+								}
+							}else{
+								// 分主客观的客观
+								arr[2][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId)
 								}
 							}
-						]
-
+						})
+						obj.dataList=arr
 						auth.push(obj)
 					})
 					this.authList = auth;

+ 167 - 151
src/views/custom_manage/customList/customShareList.vue

@@ -20,10 +20,24 @@
 			@change="getTableData"
 			v-if="roleType!=='ficc_seller'"
 		  />
-          <el-select v-model="sales" placeholder="请选择分配销售" style="width: 214px; margin-right: 20px;" 
+          <!-- <el-select v-model="sales" placeholder="请选择分配销售" style="width: 214px; margin-right: 20px;" 
           clearable filterable multiple collapse-tags @change="getTableData">
             <el-option :label="item.RealName" :value="item.AdminId" v-for="item in salesArr" :key="item.AdminId" ></el-option>
-          </el-select>
+          </el-select> -->
+          <el-cascader
+            v-model="sales"
+            :options="salesArr"
+            :show-all-levels="false"
+            placeholder="请选择分配销售"
+            :props="{
+                multiple:true,
+                emitPath:false,
+                value:'AdminId',
+                label:'RealName',
+                children:'ChildrenList'
+            }"
+            @change="getTableData">
+          </el-cascader>
         </div>
         <div v-else>
             <el-button type="primary" @click="$router.push('/customCityList')">查看同城客户</el-button>
@@ -44,7 +58,7 @@
           placeholder="客户名称/社会信用码/手机号码/邮箱"
           v-model="search_txt"
           style="max-width:531px;margin-bottom: 8px;"
-          @input="getTableData"
+          @input="handleCurrentChange(1)"
           clearable>
             <i slot="prefix" class="el-input__icon el-icon-search"></i>
           </el-input>
@@ -316,7 +330,8 @@
 								</span> -->
 								<div class="font-tool" style="display:flex;flex-direction:column;">
 									<span class="editsty" v-for="item in getToolBtnList(scope.row).slice(0,3)" :key="item.type" @click="itemclickHandle({type:item.type,data:scope.row})">
-										{{item.type==='分配销售'?scope.row.ShareSellerId?'修改销售':'分配销售':item.type}}
+										<!-- {{item.type==='分配销售'?scope.row.ShareSellerId?'修改销售':'分配销售':item.type}} -->
+										{{btnName(item,scope.row)}}
 									</span>
 								</div>
 								<el-dropdown size="medium" placement="bottom-start" @command="itemclickHandle" style="height: 16px;margin-left: 5px;" v-if="getToolBtnList(scope.row).length>3">
@@ -325,7 +340,7 @@
 										<el-dropdown-menu slot="dropdown">
 											<el-dropdown-item :command="{type:item.type,data:scope.row}" 
 											v-for="item in getToolBtnList(scope.row).slice(3)" :key="item.type">
-												<span>{{item.type=='设置共享'&&scope.row.IsShare==1?'取消共享':item.type}}</span>
+												<span>{{btnName(item,scope.row)}}</span>
 											</el-dropdown-item>
 										</el-dropdown-menu>
 									</span>
@@ -360,6 +375,7 @@
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
 		:title="assignedSellerTitle"
+		class="changeSaleDia"
 		@close="cancelAssign"
 		center
 		width="444px">
@@ -368,13 +384,27 @@
 					<span style="fontSize:16px;">{{assignform.CompanyName}}</span>
 				</el-form-item>
 				<el-form-item label="分配销售" prop="SellsId">
-					<el-select
+					<!-- <el-select
 						v-model="assignform.SellsId"
 						placeholder="请选择修改的销售"
 						style="width: 240px"
 						filterable>
 						<el-option :label="item.RealName" :value="item.AdminId" v-for="item in salesArr" :key="item.AdminId"></el-option>
-					</el-select>
+					</el-select> -->
+					<el-cascader
+						v-model="assignform.SellsId"
+						:options="salesArr"
+						:show-all-levels="false"
+						placeholder="请选择分配销售"
+						style="width: 240px"
+						:props="{
+							multiple:false,
+							emitPath:false,
+							value:'AdminId',
+							label:'RealName',
+							children:'ChildrenList'
+						}">
+					</el-cascader>
 				</el-form-item>
 			</el-form>	
 			<div style="display:flex;justify-content:center;margin:60px 0 35px;">
@@ -566,6 +596,12 @@ export default {
 		};
 	},
 	methods: {
+		// 用于返回按钮名称
+		btnName(btnItem,row){
+			if(btnItem.code=='BtnShare') return row.IsShare===1?'取消共享':'设置共享'
+			if(btnItem.code=='BtnModifySeller') return row.ShareSellerId?'修改销售':'分配销售'
+			return btnItem.type
+		},
 		/* 获取表格 */
 		getTableData() {
 			this.isShowloadding = true;
@@ -597,12 +633,22 @@ export default {
 				}
 			})
 		},
-		/* 获取销售 */
+		/* 获取可分配销售 */
 		getSale() {
-			customInterence.salesShareList().then(res => {
-				console.log(res);
+			customInterence.getShareSaleList().then(res => {
 				if(res.Ret === 200) {
 					this.salesArr = res.Data|| []
+					//无子级的组无法选择
+					const filterNodes = (arr)=>{
+						arr.length &&arr.forEach((item) => {
+							item.ChildrenList && filterNodes(item.ChildrenList);
+							if (!Number(item.AdminId)&&!item.ChildrenList) {
+								item.disabled = true
+							}
+						})
+					}
+					filterNodes(this.salesArr)
+					console.log('salesArr',this.salesArr)
 				}
 			})
 		},
@@ -620,7 +666,7 @@ export default {
 			const {BtnItem} = data
 			for(const i in this.btnCommandList){
 				if(BtnItem[i]){
-					toolList.push({type:this.btnCommandList[i]})
+					toolList.push({type:this.btnCommandList[i],code:i+''})
 				}
 			}
 			return toolList
@@ -670,7 +716,23 @@ export default {
 					let authEquity =[] //权益
 					res.Data.ListRai ?	res.Data.ListRai.forEach(item=> {//权益
 						// 过滤没有权限的套餐
-						authEquity.push(item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId)))
+						let check_Auth = item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId))
+						check_Auth.map(item =>{
+						// 排序 以防合并问题
+							if(item.PermissionType==1){
+								//主观 找客观
+								authEquity.push(item)
+								let ob = check_Auth.find(it => it.PermissionName == item.PermissionName && it.PermissionType!=1)
+								ob && authEquity.push(ob)
+							}else if(item.PermissionType==0){
+								authEquity.push(item)
+							}else{
+								// 客观
+								if(!authEquity.find(t => t.ChartPermissionId == item.ChartPermissionId)){
+									authEquity.push(item)
+								}
+							}
+						})
 					}):''
 					this.lookAuthListEquity = authEquity.flat(Infinity) //权益
 				}
@@ -682,6 +744,9 @@ export default {
 				CompanyId:row.CompanyId,
 				SellsId:row.ShareSellerId==0?'':row.ShareSellerId+'',
 			}
+			//根据当前角色 获取salesArr
+			//若是ficc角色 取咨询组销售(一级)
+			//若是rai角色 去权益销售组(多级)
 			this.assignedSellerShow = true;
 		},
 		/* 页码改变 */
@@ -700,6 +765,10 @@ export default {
 		saveAssign() {
 			this.$refs.assignform.validate((valid) => {
 				if (valid) {
+					if(!Number(this.assignform.SellsId)){
+						this.$message.warning("请选择销售而不是分组!")
+						return
+					}
 					let param={
 						CompanyId:this.assignform.CompanyId,
 						SellsId:+this.assignform.SellsId
@@ -855,10 +924,24 @@ export default {
 						auth.push(obj)
 					}):
 					// 权益 RaiMerge 0不管 1合并 2拆分 所传入的数据结构不一样
+					/**权益权限ID
+					 * 科技-主观(20)-客观(37)
+					 * 消费-主观(21)-客观(38)
+					 * 医药-主观(22)-客观(39)
+					 * 智造-主观(19)-客观(36)
+					 * 策略(23)
+					 * 专家(29)
+					 * 固收(53)
+					 * 调研(54)
+					 * 路演服务(30)
+					 * 研选订阅(31)
+					 * 研选扣点包(52)
+					 */
 					res.Data.ListRai[0].RaiMerge==1?res.Data.ListRai.forEach(item=> { // 合并
+						let checkedLen = item.Items.filter(it => item.CheckList && item.CheckList.includes(it.ChartPermissionId)).length
 						let obj = {
-							checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
-							isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+							checkAll:checkedLen === item.Items.length,
+							isIndeterminate:checkedLen > 0 && checkedLen < item.Items.length,
 							defaultAuth:item.CheckList,
 							...item,
 						}
@@ -870,145 +953,68 @@ export default {
 							...item,
 						}	
 						// 组合所需的数据格式
-						obj.dataList=[
-							{
-								PermissionTypeName:'',
-								medicine:{
-									value:'医药',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==2
-								},
-								consumption:{
-									value:'消费',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==2
-								},
-								technology:{
-									value:'科技',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==2
-								},
-								smart:{
-									value:'智造',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==2
-								},
-								strategy:{
-									value:'策略'
-								},
-								experts:{
-									value:'专家'
-								},
-								roadshow:{
-									value:'路演服务'
-								},
-								choose:{
-									value:'研选订阅'
-								},
-								points:{
-									value:'研选扣点包'
-								},
-							},
-							{
-								PermissionTypeName:{
-									value:'主观',
-									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length),
-									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length == 4,
-									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length ==4
-								},
-								medicine:{
-									value:obj.Items[0].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[0].ChartPermissionId)
-								},
-								consumption:{
-									value:obj.Items[2].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[2].ChartPermissionId)
-								},
-								technology:{
-									value:obj.Items[4].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[4].ChartPermissionId)
-								},
-								smart:{
-									value:obj.Items[6].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[6].ChartPermissionId)
-								},
-								strategy:{
-									value:obj.Items[8].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
-								},
-								experts:{
-									value:obj.Items[9].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
-								},
-								roadshow:{
-									value:obj.Items[10].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
-								},
-								choose:{
-									value:obj.Items[11].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
-								},
-								points:{
-									value:obj.Items[12].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[12].ChartPermissionId)
+						let subjectivityIds=item.Items.filter(it => it.PermissionType==1).map(it => it.ChartPermissionId)//主观的ids
+						let subjectivityLength=subjectivityIds.length//有几个主观的id
+						let subjectivityCheckedLen = item.CheckList.filter(id => subjectivityIds.includes(id)).length//选中的有几个主观的id
+						let objectivityIds=item.Items.filter(it => it.PermissionType==2).map(it => it.ChartPermissionId)//客观的ids
+						let objectivityCheckedLen = item.CheckList.filter(id => objectivityIds.includes(id)).length//有几个客观的id
+						let objectivityLength=objectivityIds.length//选中的有几个客观的id
+						let arr = [{PermissionTypeName:''},
+											{PermissionTypeName:{
+												value:'主观',
+												isIndeterminate:subjectivityCheckedLen>0 && subjectivityCheckedLen<subjectivityLength,
+												isCheckAll:subjectivityCheckedLen == subjectivityLength,
+												isDisabled:subjectivityCheckedLen == subjectivityLength,
+												ids:subjectivityIds
+											}},
+											{PermissionTypeName:{
+												value:'客观',
+												isIndeterminate:objectivityCheckedLen > 0 && objectivityCheckedLen < objectivityLength,
+												isCheckAll:objectivityCheckedLen == objectivityLength,
+												isDisabled:objectivityCheckedLen == objectivityLength,
+												ids:objectivityIds
+											}}]
+						item.Items.map(cp =>{
+							if(cp.PermissionType==0){
+								// 没有主客观的权限
+								arr[0][cp.PermissionName]={
+									value:cp.PermissionName,
+									width:cp.PermissionName=='研选扣点包'?'100px':'',
+									merge:true
+								}
+								arr[1][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId),
+									merge:true
+								}
+								arr[2][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId),
+									merge:true
+								}
+							}else if(cp.PermissionType==1){
+								// 找出对应的客观Id
+								let objectivity = item.Items.find(it => it.PermissionName == cp.PermissionName && it.PermissionType==2)
+								arr[0][cp.PermissionName]={
+									value:cp.PermissionName,
+									isIndeterminate:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length ==2,
+									bothIds:[cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0]
 								}
-							},
-							{
-								PermissionTypeName:{
-									value:'客观',
-									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length),
-									isCheckAll:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 4,
-									isDisabled:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==4
-								},
-								medicine:{
-									value:obj.Items[1].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[1].ChartPermissionId)
-								},
-								consumption:{
-									value:obj.Items[3].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[3].ChartPermissionId)
-								},
-								technology:{
-									value:obj.Items[5].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[5].ChartPermissionId)
-								},
-								smart:{
-									value:obj.Items[7].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[7].ChartPermissionId)
-								},
-								strategy:{
-									value:obj.Items[8].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
-								},
-								experts:{
-									value:obj.Items[9].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
-								},
-								roadshow:{
-									value:obj.Items[10].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
-								},
-								choose:{
-									value:obj.Items[11].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
-								},
-								points:{
-									value:obj.Items[12].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[12].ChartPermissionId)
+								arr[1][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId)
+								}
+							}else{
+								// 分主客观的客观
+								arr[2][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId)
 								}
 							}
-						]
-
+						})
+						obj.dataList=arr
 						auth.push(obj)
 					})
 					this.authList = auth;
@@ -1020,11 +1026,16 @@ export default {
 
 		/* 获取销售 */
 		getoriginalSale() {
-			let status=0;
+			/* let status=0;
 			customInterence.getSale({"Status":status}).then(res => {
 				if(res.Ret === 200) {
 					this.originalSalesArr = res.Data.List||[];
 				}
+			}) */
+			customInterence.getShareSale().then(res=>{
+				if(res.Ret === 200){
+					this.originalSalesArr = res.Data.List||[]
+				}
 			})
 		},
 	},
@@ -1045,6 +1056,11 @@ export default {
 			}
 		}
 	}
+	.changeSaleDia{
+		.el-cascader .el-input{
+			width: 100%;
+		}
+	}
 </style>
 <style lang='scss' scoped>
 	.ficc-package {

+ 98 - 0
src/views/custom_manage/customList/mixins/quartersMixin.js

@@ -0,0 +1,98 @@
+export default {
+  data() {
+    return {
+      selectedQuarters: [],
+      quarters: this.generateQuarters(),
+      showAlert: true,
+    };
+  },
+  computed: {
+    selectedDateRange() {
+      if (this.selectedQuarters.length) {
+        const sortedQuarters = [...this.selectedQuarters].sort();
+        const startDate = this.quarterToDateRange(sortedQuarters[0]).split(" ~ ")[0];
+        const endDate = this.quarterToDateRange(sortedQuarters[this.selectedQuarters.length - 1]).split(" ~ ")[1];
+        return `${startDate} ~ ${endDate}`;
+      }
+      return "";
+    },
+  },
+  methods: {
+    generateQuarters() {
+      const currentDate = new Date();
+      const currentYear = currentDate.getFullYear();
+      let currentQuarter = Math.floor(currentDate.getMonth() / 3) + 1;
+
+      let quarters = [];
+
+      for (let i = 3; i >= 0; i--) {
+        // 包括当前季度和前三个季度
+        let year = currentYear;
+        let quarter = currentQuarter - i;
+
+        while (quarter <= 0) {
+          year--; // 上一年
+          quarter += 4; // 季度数增加
+        }
+
+        quarters.push({
+          label: `${year}Q${quarter}`,
+          value: `${year}Q${quarter}`,
+        });
+      }
+
+      return quarters;
+    },
+
+    isDisabled(quarter) {
+      if (this.selectedQuarters.length === 0) return false;
+      const sortedSelected = [...this.selectedQuarters].sort();
+      const firstIndex = this.quarters.findIndex((q) => q.value === sortedSelected[0]);
+      const lastIndex = this.quarters.findIndex((q) => q.value === sortedSelected[sortedSelected.length - 1]);
+
+      const currentIndex = this.quarters.findIndex((q) => q.value === quarter.value);
+
+      return currentIndex < firstIndex - 1 || currentIndex > lastIndex + 1;
+    },
+
+    quarterToDateRange(quarterLabel) {
+      const [year, q] = quarterLabel.split("Q");
+
+      switch (parseInt(q)) {
+        case 1:
+          return `${year}-01-01 ~ ${year}-03-31`;
+        case 2:
+          return `${year}-04-01 ~ ${year}-06-30`;
+        case 3:
+          return `${year}-07-01 ~ ${year}-09-30`;
+        case 4:
+          return `${year}-10-01 ~ ${year}-12-31`;
+      }
+    },
+    isConsecutiveSelection() {
+      const sortedSelectedIndexes = this.selectedQuarters.map((sq) => this.quarters.findIndex((aq) => aq.value === sq)).sort((a, b) => a - b);
+      for (let i = 0; i < sortedSelectedIndexes.length - 1; i++) {
+        if (sortedSelectedIndexes[i + 1] - sortedSelectedIndexes[i] !== 1) {
+          return false;
+        }
+      }
+
+      return true;
+    },
+  },
+
+  watch: {
+    selectedQuarters(newValue, oldValue) {
+      if (!newValue.length) return;
+      if (!this.isConsecutiveSelection() && this.showAlert) {
+        this.showAlert = false;
+        this.selectedQuarters.pop();
+        this.$message.error("只能选择相邻的季度");
+        this.$nextTick(() => {
+          this.selectedQuarters.pop();
+          this.showAlert = true;
+        });
+      }
+    },
+  },
+};

+ 95 - 142
src/views/custom_manage/customSearch.vue

@@ -861,7 +861,23 @@ export default {
 					let authEquity =[] //权益
 					res.Data.ListRai ?	res.Data.ListRai.forEach(item=> {//权益
 						// 过滤没有权限的套餐
-						authEquity.push(item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId)))
+						let check_Auth = item.Items.filter(it => item.CheckList.includes(it.ChartPermissionId))
+						check_Auth.map(item =>{
+						// 排序 以防合并问题
+							if(item.PermissionType==1){
+								//主观 找客观
+								authEquity.push(item)
+								let ob = check_Auth.find(it => it.PermissionName == item.PermissionName && it.PermissionType!=1)
+								ob && authEquity.push(ob)
+							}else if(item.PermissionType==0){
+								authEquity.push(item)
+							}else{
+								// 客观
+								if(!authEquity.find(t => t.ChartPermissionId == item.ChartPermissionId)){
+									authEquity.push(item)
+								}
+							}
+						})
 					}):''
 					this.lookAuthListEquity = authEquity.flat(Infinity) //权益
 					this.isPermissionTypeShow = this.lookAuthListEquity.some(item => !item.IsMerge)
@@ -1341,10 +1357,24 @@ export default {
 						auth.push(obj)
 					}):
 					// 权益 RaiMerge 0不管 1合并 2拆分 所传入的数据结构不一样
-					res.Data.ListRai[0].RaiMerge==1?res.Data.ListRai.forEach(item=> { // 合并
+						/**权益权限ID
+						 * 科技-主观(20)-客观(37)
+						 * 消费-主观(21)-客观(38)
+						 * 医药-主观(22)-客观(39)
+						 * 智造-主观(19)-客观(36)
+						 * 策略(23)
+						 * 专家(29)
+						 * 固收(53)
+						 * 调研(54)
+						 * 路演服务(30)
+						 * 研选订阅(31)
+						 * 研选扣点包(52)
+						*/
+					 	res.Data.ListRai[0].RaiMerge==1?res.Data.ListRai.forEach(item=> { // 合并
+						let checkedLen = item.Items.filter(it => item.CheckList && item.CheckList.includes(it.ChartPermissionId)).length
 						let obj = {
-							checkAll:item.CheckList&&item.CheckList.length===item.Items.length?true:false,
-							isIndeterminate:item.CheckList&&item.CheckList.length>0 && item.CheckList.length<item.Items.length,
+							checkAll:checkedLen === item.Items.length,
+							isIndeterminate:checkedLen > 0 && checkedLen < item.Items.length,
 							defaultAuth:item.CheckList,
 							...item,
 						}
@@ -1352,149 +1382,72 @@ export default {
 					}): res.Data.ListRai.forEach(item=> { // 拆分
 						let obj = {
 							defaultAuth:item.CheckList,
-							customType:'权益',
+							customType:item.ClassifyName,
 							...item,
 						}	
 						// 组合所需的数据格式
-						obj.dataList=[
-							{
-								PermissionTypeName:'',
-								medicine:{
-									value:'医药',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[1].ChartPermissionId].includes(id)).length ==2
-								},
-								consumption:{
-									value:'消费',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[2].ChartPermissionId,obj.Items[3].ChartPermissionId].includes(id)).length ==2
-								},
-								technology:{
-									value:'科技',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[4].ChartPermissionId,obj.Items[5].ChartPermissionId].includes(id)).length ==2
-								},
-								smart:{
-									value:'智造',
-									isIndeterminate:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==1,
-									isCheckAll:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 2,
-									isDisabled:item.CheckList.filter(id => [obj.Items[6].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==2
-								},
-								strategy:{
-									value:'策略'
-								},
-								experts:{
-									value:'专家'
-								},
-								roadshow:{
-									value:'路演服务'
-								},
-								choose:{
-									value:'研选订阅'
-								},
-								points:{
-									value:'研选扣点包'
-								},
-							},
-							{
-								PermissionTypeName:{
-									value:'主观',
-									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length),
-									isCheckAll:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length == 4,
-									isDisabled:item.CheckList.filter(id => [obj.Items[0].ChartPermissionId,obj.Items[2].ChartPermissionId,
-										obj.Items[4].ChartPermissionId,obj.Items[6].ChartPermissionId].includes(id)).length ==4
-								},
-								medicine:{
-									value:obj.Items[0].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[0].ChartPermissionId)
-								},
-								consumption:{
-									value:obj.Items[2].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[2].ChartPermissionId)
-								},
-								technology:{
-									value:obj.Items[4].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[4].ChartPermissionId)
-								},
-								smart:{
-									value:obj.Items[6].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[6].ChartPermissionId)
-								},
-								strategy:{
-									value:obj.Items[8].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
-								},
-								experts:{
-									value:obj.Items[9].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
-								},
-								roadshow:{
-									value:obj.Items[10].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
-								},
-								choose:{
-									value:obj.Items[11].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
-								},
-								points:{
-									value:obj.Items[12].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[12].ChartPermissionId)
+						let subjectivityIds=item.Items.filter(it => it.PermissionType==1).map(it => it.ChartPermissionId)//主观的ids
+						let subjectivityLength=subjectivityIds.length//有几个主观的id
+						let subjectivityCheckedLen = item.CheckList.filter(id => subjectivityIds.includes(id)).length//选中的有几个主观的id
+						let objectivityIds=item.Items.filter(it => it.PermissionType==2).map(it => it.ChartPermissionId)//客观的ids
+						let objectivityCheckedLen = item.CheckList.filter(id => objectivityIds.includes(id)).length//有几个客观的id
+						let objectivityLength=objectivityIds.length//选中的有几个客观的id
+						let arr = [{PermissionTypeName:''},
+											{PermissionTypeName:{
+												value:'主观',
+												isIndeterminate:subjectivityCheckedLen>0 && subjectivityCheckedLen<subjectivityLength,
+												isCheckAll:subjectivityCheckedLen == subjectivityLength,
+												isDisabled:subjectivityCheckedLen == subjectivityLength,
+												ids:subjectivityIds
+											}},
+											{PermissionTypeName:{
+												value:'客观',
+												isIndeterminate:objectivityCheckedLen > 0 && objectivityCheckedLen < objectivityLength,
+												isCheckAll:objectivityCheckedLen == objectivityLength,
+												isDisabled:objectivityCheckedLen == objectivityLength,
+												ids:objectivityIds
+											}}]
+						item.Items.map(cp =>{
+							if(cp.PermissionType==0){
+								// 没有主客观的权限
+								arr[0][cp.PermissionName]={
+									value:cp.PermissionName,
+									width:cp.PermissionName=='研选扣点包'?'100px':'',
+									merge:true
+								}
+								arr[1][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId),
+									merge:true
 								}
-							},
-							{
-								PermissionTypeName:{
-									value:'客观',
-									isIndeterminate:[1,2,3].includes(item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length),
-									isCheckAll:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length == 4,
-									isDisabled:item.CheckList.filter(id => [obj.Items[1].ChartPermissionId,obj.Items[3].ChartPermissionId,
-										obj.Items[5].ChartPermissionId,obj.Items[7].ChartPermissionId].includes(id)).length ==4
-								},
-								medicine:{
-									value:obj.Items[1].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[1].ChartPermissionId)
-								},
-								consumption:{
-									value:obj.Items[3].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[3].ChartPermissionId)
-								},
-								technology:{
-									value:obj.Items[5].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[5].ChartPermissionId)
-								},
-								smart:{
-									value:obj.Items[7].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[7].ChartPermissionId)
-								},
-								strategy:{
-									value:obj.Items[8].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[8].ChartPermissionId)
-								},
-								experts:{
-									value:obj.Items[9].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[9].ChartPermissionId)
-								},
-								roadshow:{
-									value:obj.Items[10].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[10].ChartPermissionId)
-								},
-								choose:{
-									value:obj.Items[11].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[11].ChartPermissionId)
-								},
-								points:{
-									value:obj.Items[12].ChartPermissionId,
-									isDisabled:item.CheckList.includes(obj.Items[12].ChartPermissionId)
+								arr[2][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId),
+									merge:true
+								}
+							}else if(cp.PermissionType==1){
+								// 找出对应的客观Id
+								let objectivity = item.Items.find(it => it.PermissionName == cp.PermissionName && it.PermissionType==2)
+								arr[0][cp.PermissionName]={
+									value:cp.PermissionName,
+									isIndeterminate:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length ==1,
+									isCheckAll:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length == 2,
+									isDisabled:item.CheckList.filter(id => [cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0].includes(id)).length ==2,
+									bothIds:[cp.ChartPermissionId,objectivity?objectivity.ChartPermissionId:0]
+								}
+								arr[1][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId)
+								}
+							}else{
+								// 分主客观的客观
+								arr[2][cp.PermissionName]={
+									value:cp.ChartPermissionId,
+									isDisabled:item.CheckList.includes(cp.ChartPermissionId)
 								}
 							}
-						]
-
+						})
+						obj.dataList=arr
 						auth.push(obj)
 					})
 					this.authList = auth;
@@ -1564,7 +1517,7 @@ export default {
 		btnList(btnItem,part){
 			const allBtnList=[]
 			for (const key in btnItem) {
-				btnItem[key]&&key!=='BtnClose' && allBtnList.push(key)
+				btnItem[key]&&key!=='BtnClose'&&key!=='BtnShare' && allBtnList.push(key)
 			}
 			if(part==='front'){
 				// 返回前三个按钮

+ 462 - 49
src/views/custom_manage/overseasList/overseasCustomRoadshow.vue

@@ -1,7 +1,13 @@
 <template>
   <div class="overseas-custom-roadshow-box">
-    <div class="top-wrapper">
-      <div class="left-select">
+    <div class="tab-box">
+      <el-button type="primary" :plain="roadshowTab==1?false:true" class="tab-item" @click="tabChange(1)">客户维度</el-button>
+      <el-button type="primary" :plain="roadshowTab==2?false:true" class="tab-item" @click="tabChange(2)">销售维度</el-button>
+      <el-button type="primary" :plain="roadshowTab==3?false:true" class="tab-item" @click="tabChange(3)">研究员维度</el-button>
+    </div>
+    <template v-if="roadshowTab==1">
+      <div class="top-wrapper">
+        <div class="left-select">
         <el-cascader
             v-model="sales"
             :options="salesOptions"
@@ -65,56 +71,185 @@
 						style="width:200px;margin-right:10px;margin-bottom:8px;"
         />
 
+        </div>
+        <el-input 
+            prefix-icon="el-icon-search" 
+            placeholder="客户名称" 
+            style="width:317px;" clearable
+            v-model="searchWord"
+            @input="pageChange(1)"
+        />
       </div>
-      <el-input 
-          prefix-icon="el-icon-search" 
-          placeholder="客户名称" 
-          style="width:317px;" clearable
-          v-model="searchWord"
-          @input="pageChange(1)"
-      />
-    </div>
-
-    <div class="cont-wrapper">
-      <el-table
-        ref="tableRef"
-        :data="tableData"
-        :loading="tabeLoading"
-        border
-        @sort-change="handleSortChange"
-      >
-        <el-table-column 
-            align="center"
-            v-for="item in columns" :key="item.key"
-            :prop="item.key" :label="item.label"
-            :min-width="item.minWidth"
-            :sortable="item.sortable?'custom':false"
+      <div class="cont-wrapper">
+        <el-table
+          ref="tableRef"
+          :data="tableData"
+          :loading="tabeLoading"
+          border
+          @sort-change="handleSortChange"
         >
-          <template slot-scope="{row}">
-              <!-- 客户名称 -->
-              <div v-if="item.key==='CompanyName'" class="editor" @click="toCustomDetail(row)">{{row[item.key]}}</div>
+          <el-table-column 
+              align="center"
+              v-for="item in columns" :key="item.key"
+              :prop="item.key" :label="item.label"
+              :min-width="item.minWidth"
+              :sortable="item.sortable?'custom':false"
+          >
+            <template slot-scope="{row}">
+                <!-- 客户名称 -->
+                <div v-if="item.key==='CompanyName'" class="editor" @click="toCustomDetail(row)">{{row[item.key]}}</div>
 
-              <span v-else>{{row[item.key]}}</span>
-          </template>
-        </el-table-column>
-      </el-table>
+                <span v-else>{{row[item.key]}}</span>
+            </template>
+          </el-table-column>
+        </el-table>
 
-       <!-- 页数选择器 -->
-      <m-page
-        :page_no="currentIndex"
-        :pageSize="pageSize"
-        :total="total"
-        style="position: absolute;right: 50px;bottom: 50px;"
-        @handleCurrentChange="pageChange"
-      />
-    </div>
+        <!-- 页数选择器 -->
+        <m-page
+          :page_no="currentIndex"
+          :pageSize="pageSize"
+          :total="total"
+          style="position: absolute;right: 50px;bottom: 50px;"
+          @handleCurrentChange="pageChange"
+        />
+      </div>
+    </template>
+    <template v-else-if="roadshowTab==2">
+      <ul class="date-tab-box">
+				<li :class="['date-tab-item',{'act':tab === salesDimension.dateTab}]" v-for="tab in staticTabs" :key="tab" @click="changeTabHandle(tab)">
+					{{tab}}
+				</li>
+        <date-picker
+          v-model="salesDimension.selectDate"
+          type="date" 
+          range
+          value-type="format"
+          :clearable="false"
+          @change="dateChange"
+          placeholder="请选择统计时间"/>
+			</ul>
+      <div class="table-body-wrapper" v-show="dataLoading">
+				<table>
+					<thead>
+						<tr>
+							<td rowspan="2" class="thead-rs" style="width: 100px;">销售</td>
+							<td
+								:colspan="['周度统计表','月度统计表'].includes(salesDimension.dateTab) ? 3 : 1"
+								v-for="item in salesDimension.tableTheadColumns" 
+								:key="item" 
+								class="head-column"
+							>
+								{{item}}
+							</td>	
+						</tr>
+						<tr v-if="['月度统计表','周度统计表'].includes(salesDimension.dateTab)">
+							<template v-for="(item,index) in new Array(6)">
+								<td :key="index+'_0'">试用</td>
+								<td :key="index+'_1'">正式</td>
+								<td :key="index+'_2'">关闭</td>
+							</template>
+						</tr>
+					</thead>
+					<tbody>
+            <tr v-for="item in salesDimension.datalist" :key="item.AdminId">
+              <td class="thead-rs">{{item.Name}}</td>
+              <td class="data-cell" v-for="(data,data_key) in item.dataArr" :key="data_key" @click="openDiaHandle(data)">
+                {{ data.value !== 0 ? data.value : '' }}
+              </td>
+            </tr>
+					</tbody>
+					<tfoot>
+						<tr>
+							<td>合计</td>
+							<td v-for="(total_data,total_data_key) in salesDimension.totalGroupArr" :key="total_data_key" 
+              class="data-cell" @click="openDiaHandle(total_data)">
+								{{ total_data.value !== 0 ? total_data.value : '' }}
+							</td>
+						</tr>
+					</tfoot>
+				</table>
+			</div>	
+    </template>
+    <template v-if="roadshowTab==3">
+      <ul class="date-tab-box">
+				<li :class="['date-tab-item',{'act':tab === researchersDimension.dateTab}]" v-for="tab in staticTabs" :key="tab" @click="changeTabHandle(tab)">
+					{{tab}}
+				</li>
+        <date-picker
+          v-model="researchersDimension.selectDate"
+          type="date" 
+          range
+          value-type="format"
+          :clearable="false"
+          @change="dateChange"
+          placeholder="请选择统计时间"/>
+			</ul>
+      <div class="table-body-wrapper" v-show="dataLoading">
+				<table>
+					<thead>
+						<tr>
+							<td rowspan="2" class="thead-rs" style="width: 100px;">研究员</td>
+							<td
+								:colspan="['周度统计表','月度统计表'].includes(researchersDimension.dateTab) ? 3 : 1"
+								v-for="item in researchersDimension.tableTheadColumns" 
+								:key="item" 
+								class="head-column"
+							>
+								{{item}}
+							</td>	
+						</tr>
+            <tr v-if="['月度统计表'].includes(researchersDimension.dateTab)">
+              <template v-for="(item,index) in new Array(4)">
+								<td :key="index+'_0'">试用</td>
+								<td :key="index+'_1'">正式</td>
+								<td :key="index+'_2'">关闭</td>
+              </template>
+            </tr>
+            <tr v-if="['周度统计表'].includes(researchersDimension.dateTab)">
+              <template v-for="(item,index) in new Array(3)">
+								<td :key="index+'_0'">试用</td>
+								<td :key="index+'_1'">正式</td>
+								<td :key="index+'_2'">关闭</td>
+              </template>
+            </tr>
+					</thead>
+					<tbody>
+            <tr v-for="item in researchersDimension.datalist" :key="item.AdminId">
+              <td class="thead-rs">{{item.Name}}</td>
+              <td class="data-cell" v-for="(data,data_key) in item.dataArr" :key="data_key" @click="openDiaHandle(data)">
+                {{ data.value !== 0 ? data.value : '' }}
+              </td>
+            </tr>
+					</tbody>
+					<tfoot>
+						<tr>
+							<td>合计</td>
+							<td v-for="(total_data,total_data_key) in researchersDimension.totalGroupArr" :key="total_data_key" 
+              class="data-cell" @click="openDiaHandle(total_data)">
+								{{ total_data.value !== 0 ? total_data.value : '' }}
+							</td>
+						</tr>
+					</tfoot>
+				</table>
+			</div>	
+    </template>
+
+    <!-- 详情弹窗 -->
+		<actiyityDetailDia
+			:isShow.sync="isShowDia"
+			:title="diaTitle"
+			:form="dialogForm"
+			:fromType="roadshowTab==2?'seller':'researcher'"
+      region="oversea"
+		/>
   </div>
 </template>
 <script>
 import { overseasCustomInterence } from '@/api/modules/overseasCustom.js'
 import mPage from '@/components/mPage.vue'
+import actiyityDetailDia from '@/views/roadshow_manage/compononts/activityDetailDia';
 export default {
-  components: { mPage },
+  components: { mPage,actiyityDetailDia },
   data() {
     return {
       tabeLoading: false,
@@ -148,8 +283,30 @@ export default {
         { label: '正式', val: '正式' },
         { label: '试用', val: '试用' },
         { label: '关闭', val: '关闭' },
-      ]
-
+      ],
+      roadshowTab:1,
+      staticTabs: [ '周度统计表','月度统计表','近1个月','近3个月','近6个月' ],
+      dataLoading:false,
+      // 销售维度
+      salesDimension:{
+        dateTab:"周度统计表",
+        selectDate:"",
+        tableTheadColumns:[],
+        datalist:[],//表格数据
+        totalGroupArr:[] //合计数据
+      },
+      // 研究员维度
+      researchersDimension:{
+        dateTab:"周度统计表",
+        selectDate:"",
+        tableTheadColumns:[],
+        datalist:[],//表格数据
+        totalGroupArr:[] //合计数据
+      },
+      // 详情弹窗
+      isShowDia:false,
+      diaTitle:'路演详情',
+      dialogForm:{}
     }
   },
   mounted(){
@@ -228,24 +385,203 @@ export default {
       const href = this.$router.resolve({path,query}).href
       window.open(href,"_blank")
     },
-
     /* 切换筛选 */
     changeSelectOpts() {
       
+    },
+    tabChange(tab){
+      if(this.roadshowTab==tab) return 
+      this.roadshowTab=tab
+      this.changeTabHandle('周度统计表')
+    },
+    /* 	获取几周前 周一周日日期 或前几月月份*/
+		getWeekOrMonthDate(weeknum,type='week') {
+			if(type === 'week') {
+				const weekStart = this.$moment().subtract(weeknum, 'week').startOf('isoWeek').format('YYYY.MM.DD'); //周一
+				const weekEnd = this.$moment().subtract(weeknum, 'week').endOf('isoWeek').format('YYYY.MM.DD'); //周日
+	
+				// console.log(weekStart,weekEnd)
+				return `${weekStart}~${weekEnd}`;
+			} else {
+				const month = this.$moment().subtract(weeknum,'M').format('YYYY.MM');
+				return month;
+			}
+		},
+    changeTabHandle(tab){
+      if(this.roadshowTab == 1){
+        return
+      }else if(this.roadshowTab == 2){
+        this.salesDimension.dateTab = tab;
+        switch(tab) {
+          case '周度统计表':
+            this.salesDimension.tableTheadColumns = [
+                `本周(${this.getWeekOrMonthDate(0)})`,
+                `上一周(${this.getWeekOrMonthDate(1)})`,
+                `上两周(${this.getWeekOrMonthDate(2)})`,
+                `上三周(${this.getWeekOrMonthDate(3)})`,
+                `上四周(${this.getWeekOrMonthDate(4)})`,
+                `上五周(${this.getWeekOrMonthDate(5)})`]
+            break;
+          case '月度统计表':
+            this.salesDimension.tableTheadColumns = [
+                this.getWeekOrMonthDate(0,'month'),
+                this.getWeekOrMonthDate(1,'month'),
+                this.getWeekOrMonthDate(2,'month'),
+                this.getWeekOrMonthDate(3,'month'),
+                this.getWeekOrMonthDate(4,'month'),
+                this.getWeekOrMonthDate(5,'month')]
+            break;
+          default:
+          this.salesDimension.tableTheadColumns = ['试用','正式','关闭']
+
+          break;
+        }
+      }else{
+        this.researchersDimension.dateTab = tab;
+        switch(tab) {
+          case '周度统计表':
+            this.researchersDimension.tableTheadColumns =  ['上一周','本周','下一周']
+            break;
+          case '月度统计表':
+            this.researchersDimension.tableTheadColumns = [
+              this.getWeekOrMonthDate(0,'month'),
+              this.getWeekOrMonthDate(1,'month'),
+              this.getWeekOrMonthDate(2,'month'),
+              this.getWeekOrMonthDate(3,'month'),
+            ]
+            break;
+          default:
+          this.researchersDimension.tableTheadColumns = ['试用','正式','关闭']
+          break;
+        }
+      }
+      this.$nextTick(()=>{
+        $('.table-body-wrapper')[0].scrollTop = 0;
+      })
+      let typeObj = {
+        '近1个月': 1,
+        '近3个月': 3,
+        '近6个月': 6,
+      };
+      typeObj[tab] ? this.filterDate(typeObj[tab]) : this.filterDate(0);
+
+      this.getData();
+    },
+    dateChange(){
+      if(this.roadshowTab==2){
+        this.salesDimension.dateTab = '';
+        this.salesDimension.tableTheadColumns = ['试用','正式','关闭'];
+      }else{
+        this.researchersDimension.dateTab = '';
+			  this.researchersDimension.tableTheadColumns = ['试用','正式','关闭'];
+      }
+
+			this.getData();
+    },
+    filterDate(month){
+      if(month) {
+				let date_before = this.$moment().subtract(month,'M').format("YYYY-MM-DD");
+				let date_now = this.$moment().format("YYYY-MM-DD");
+				let date = [date_before,date_now]
+				this.roadshowTab==2?(this.salesDimension.selectDate = date):(this.researchersDimension.selectDate = date);
+			}else {
+        this.roadshowTab==2?(this.salesDimension.selectDate = ''):(this.researchersDimension.selectDate = '');
+			}
+    },
+    // 销售维度、研究员维度
+    getData(){
+      let apiName=this.roadshowTab==2?"getOverseasSellerRoadShowList":"getOverseasResearcherRoadShowList"
+      let params=this.roadshowTab==2?{
+        DataType: this.salesDimension.dateTab === '周度统计表' ? 'week' : this.salesDimension.dateTab === '月度统计表' ? 'month' : 'time_interval',
+        StartDate: this.salesDimension.selectDate ? this.salesDimension.selectDate[0] : '',
+        EndDate: this.salesDimension.selectDate ? this.salesDimension.selectDate[1] : '',
+      }:{
+        DataType: this.researchersDimension.dateTab === '周度统计表' ? 'week' : this.researchersDimension.dateTab === '月度统计表' ? 'month' : 'time_interval',
+        StartDate: this.researchersDimension.selectDate ? this.researchersDimension.selectDate[0] : '',
+        EndDate: this.researchersDimension.selectDate ? this.researchersDimension.selectDate[1] : '',
+      }
+      this.dataLoading=false
+      overseasCustomInterence[apiName](params).then(res=>{
+        if(res.Ret == 200){
+          // console.log(res,'res');
+          const dataList=res.Data.List||[]
+          const totalGroupArr=res.Data.RsReportRecordNumList || []
+          dataList.forEach((da)=>{
+            da.dataArr = this.filterTableData(da.RsReportRecordNumList,[da.AdminId])
+          })
+          if(this.roadshowTab==2){
+            this.salesDimension.datalist=dataList
+            this.salesDimension.totalGroupArr=this.filterTableData(totalGroupArr,dataList.map(it => it.AdminId))
+          }else{
+            this.researchersDimension.datalist=dataList
+            this.researchersDimension.totalGroupArr=this.filterTableData(totalGroupArr,dataList.map(it => it.AdminId))
+          }
+          this.dataLoading=true
+        }
+      })
+
+    },
+    /* 处理数据结构 便于页面渲染 userid 时间用于弹窗获取列表*/
+		filterTableData(data,userid=[]) {
+			let list = data.map(item => ([
+        {
+					key: '试用',
+					value: item.TryOutNum,
+					startDate: item.StartDate,
+					endDate: item.EndDate,
+					userid
+				},
+        {
+					key: '正式',
+					value: item.FormalNum,
+					startDate: item.StartDate,
+					endDate: item.EndDate,
+					userid
+				},
+				{
+					key: '关闭',
+					value: item.CloseNum,
+					startDate: item.StartDate,
+					endDate: item.EndDate,
+					userid
+				}
+			]))
+			
+			return list.flat(Infinity);
+		},
+    openDiaHandle({ startDate,endDate,userid,value,key }){
+      if(value === 0) return;
+
+      this.dialogForm = {
+        startDate,
+        endDate,
+        userid,
+        key
+      }
+      this.isShowDia = true;
     }
   },
 }
 </script>
 <style scoped lang="scss">
 .overseas-custom-roadshow-box {
-    height: calc(100vh - 110px);
+    min-height: calc(100vh - 110px);
     background-color: white;
     border: 1px solid #ECECEC;
     border-radius: 2px;
     box-sizing: border-box;
     padding: 20px 30px 30px 30px;
     box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
-
+    .tab-box{
+      margin-bottom: 20px;
+      display: flex;
+      align-items: center;
+      gap: 15px;
+      .tab-item{
+        min-width: 120px;
+        margin: 0;
+      }
+    }
     .top-wrapper {
       display: flex;
       flex-wrap: wrap;
@@ -253,6 +589,7 @@ export default {
     }
     .cont-wrapper {
       margin-top: 10px;
+      padding-bottom: 40px;
     }
     .editor{
         color:#409EFF;
@@ -261,7 +598,83 @@ export default {
             text-decoration: underline;
         }
     }
+    .date-tab-box{
+      display: flex;
+			align-items: center;
+			color: #333;
+			margin-bottom: 30px;
+      gap: 20px;
+      .date-tab-item{
+        cursor: pointer;
+        &:hover {
+					color: #409EFF;
+				}
+				&.act {
+					color: #409EFF;
+					position: relative;
+					&::after {
+						content: "";
+						width: 100%;
+						height: 2px;
+						position: absolute;
+						bottom: -10px;
+						left: 50%;
+						transform: translateX(-50%);
+						background: #409EFF;
+					}
+				}
+      }
+    }
+    .table-body-wrapper {
+			max-height: calc(100vh - 300px);
+			margin-right: -6px;
+			overflow-y: scroll;
+			overflow-x: auto;
+			border-bottom: 1px solid #dcdfe6;
+			border-top: 1px solid #dcdfe6;
+		}
+
+		table {
+			width: 100%;
+			font-size: 14px;
+			color: #666;
+			thead{
+				position: sticky;
+				top: 0;
+				left: 0;
+				border-left: 1px solid #dcdfe6;
+				border-right: 1px solid #dcdfe6;
+				td{
+					border: none;
+					outline-color: #dcdfe6;
+					outline-style: solid;
+					outline-width: 0.5px;
+				}
+			}
+			td,
+			th {
+				min-width: 35px;
+				// word-break: break-all;
+				border: 1px solid #dcdfe6;
+				height: 45px;
+				text-align: center;
+				background-color: #fff;
+			}
+	
+			.head-column {
+				background-color: #F0F2F5;
+			}
+	
+			.data-cell{
+				color: #409EFF;
+				cursor: pointer;
+			}
+
+			.thead-sticky {
+				position: sticky;
+				top: 0;
+			}
+		}
 }
-</style>import { join } from 'lodash'
-import { join } from 'lodash'
+</style>
 

+ 437 - 0
src/views/custom_manage/points/AddNewEntries.vue

@@ -0,0 +1,437 @@
+<template>
+  <div class="container add-new-entries">
+    <div class="container-top">
+      <span>客户名称</span>
+      <el-autocomplete v-model="companyName" :fetch-suggestions="querySearchAsync" style="width: 220px; margin: 0 20px" @select="selectCompanyChange" placeholder="请输入客户名称"></el-autocomplete>
+
+      <div class="quarters-content">
+        <el-checkbox-group v-model="selectedQuarters">
+          <el-checkbox v-for="quarter in quarters" :key="quarter.value" :label="quarter.label" :disabled="isDisabled(quarter)">
+            {{ quarter.label }}
+          </el-checkbox>
+        </el-checkbox-group>
+      </div>
+    </div>
+    <div v-if="Object.keys(EnterScoreObj).length > 0">
+      <div class="tabs-box">
+        <span v-for="item in listTitle" :key="item.value" @click="tabsBoxBtn(item)" :class="item.value == tabsPitchon ? 'pitch' : ''">{{ item.lable }}</span>
+      </div>
+      <template>
+        <p class="class-text">
+          权益研究员 <span style="font-weight: 600">{{ allPerCentNumble(raiDataHandler(), "rai") }}</span>
+          <span v-if="tabsPitchon == 2 && allPerCentNumble(raiDataHandler(), 'rai')">%</span>
+        </p>
+        <div class="content-box">
+          <div v-for="item in raiDataHandler()" :key="item.EnterScoreId">
+            <div :class="['industry-ul']">
+              <span :class="['industry-name']">{{ item.ChartPermissionName }}</span>
+              <span style="margin: 0 5px 0 8px; font-weight: 600">{{ allPerCentHandlerRai(item) }}</span>
+              <span v-if="tabsPitchon == 2 && item.Proportion">%</span>
+            </div>
+            <div v-for="study in item.List" :key="study.RealName" :class="['industry-ul']">
+              <span :class="['study-name']">{{ study.RealName }}</span>
+              <template>
+                <el-input :min="-100" :max="100" type="number" v-model="study.Proportion" size="small" @input="formatDecimal(study)" style="width: 76px; margin: 0 5px 0 8px"> </el-input>
+              </template>
+              <span v-if="tabsPitchon == 2">%</span>
+            </div>
+          </div>
+        </div>
+      </template>
+      <template>
+        <p class="class-text">
+          FICC研究员 <span style="font-weight: 600">{{ allPerCentNumble(FICCDataHandler(), "ficc") }}</span>
+          <span v-if="tabsPitchon == 2 && allPerCentNumble(FICCDataHandler(), 'ficc')">%</span>
+        </p>
+        <div class="content-box">
+          <div v-for="item in FICCDataHandler()" :key="item.EnterScoreId">
+            <div :class="['industry-ul']">
+              <span :class="['industry-name']">{{ item.ChartPermissionName }}</span>
+              <span style="margin: 0 5px 0 8px; font-weight: 600">{{ allPerCentHandlerFICC(item) }}</span>
+              <span v-if="tabsPitchon == 2 && item.Proportion">%</span>
+            </div>
+            <div v-for="study in item.List" :key="study.RealName" :class="['industry-ul']">
+              <span :class="['study-name']">{{ study.RealName }}</span>
+              <template>
+                <el-input :min="-100" :max="100" type="number" v-model="study.Proportion" size="small" @input="formatDecimal(study)" style="width: 76px; margin: 0 5px 0 8px"> </el-input>
+              </template>
+              <span v-if="tabsPitchon == 2">%</span>
+            </div>
+          </div>
+        </div>
+      </template>
+      <div class="division-line"></div>
+      <div class="content-box">
+        <div v-for="item in ProuDataHandler()" :key="item.GroupName">
+          <div :class="['industry-ul']">
+            <span :class="['industry-name']">{{ item.GroupName }}</span>
+            <el-input :min="-100" :max="100" type="number" v-model="item.Proportion" @input="formatDecimal(item)" size="small" style="width: 76px; margin: 0 5px 0 8px"> </el-input>
+            <span v-if="tabsPitchon == 2">%</span>
+          </div>
+        </div>
+      </div>
+      <div class="division-line"></div>
+      <div class="bottom-box">
+        排名
+        <el-input type="text" v-model="rankingValue" style="width: 110px; margin: 0 50px 0 8px" placeholder="请输入排名"> </el-input>
+        合并打分
+        <el-radio-group v-model="radioScoring" style="margin: 0 60px 0 8px">
+          <el-radio :label="0">否</el-radio>
+          <el-radio :label="1">是</el-radio>
+        </el-radio-group>
+        <template v-if="radioScoring == 1">
+          券商名称
+          <el-input type="text" v-model="brokerName" placeholder="请输入合并打分的券商名称" style="width: 230px; margin: 0 50px 0 8px"> </el-input>
+          合并占比
+          <el-input type="text" v-model="mergeProportion" placeholder="占比值" style="width: 76px; margin: 0 5px 0 8px"> </el-input>%
+        </template>
+      </div>
+      <p class="total-num" v-if="Object.keys(EnterScoreObj).length > 0">
+        当前合计总分:{{ TotalScoreHandler(ProuDataHandler()) }}
+        <span v-if="tabsPitchon == 2">%</span>
+      </p>
+      <div style="display: flex; justify-content: center">
+        <el-button type="primary" style="margin-right: 20px" @click="preserveHandler">{{ $route.query.id ? "修改并保存" : "保存" }}</el-button>
+        <el-button type="primary" plain @click="goBackHandler">取消</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import quartersMixin from "../customList/mixins/quartersMixin";
+import { xClassCustomApi, raiInterface } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  mixins: [quartersMixin],
+  props: {},
+  data() {
+    return {
+      listTitle: [
+        {
+          lable: "按评分录入",
+          value: 1,
+        },
+        {
+          lable: "按比例录入",
+          value: 2,
+        },
+      ],
+      tabsPitchon: 1, //tabs 默认选中
+      tmeplateObj: {},
+      EnterScoreObj: {},
+      PercentageObj: {},
+      rankingValue: "", // 排名
+      radioScoring: 0, // 合并打分
+      brokerName: "", //券商名称
+      mergeProportion: "",
+      querySearchList: [],
+      companyName: "",
+      companyId: 0,
+      totalScoreNumber: 0,
+    };
+  },
+  computed: {},
+  watch: {
+    companyName: {
+      handler(newVal) {
+        if (!this.companyName) {
+          this.companyId = 0;
+        }
+      },
+    },
+  },
+  created() {},
+  mounted() {
+    this.$route.query.id ? this.getCompanyDetail() : this.getDataTemplate();
+  },
+  methods: {
+    // 头部的点击事件
+    tabsBoxBtn(item) {
+      if (this.tabsPitchon == item.value) return;
+      this.tabsPitchon = item.value;
+      this.raiDataHandler();
+      this.FICCDataHandler();
+      this.ProuDataHandler();
+    },
+
+    /** */
+    /** */
+    allPerCentHandlerRai(item) {
+      return this.allPerCentHandler(item);
+    },
+    allPerCentHandlerFICC(item) {
+      return this.allPerCentHandler(item);
+    },
+    //数量的总和
+    allPerCentHandler(item) {
+      let num = 0;
+      item && item.List.forEach((key) => (num = num + +key.Proportion));
+      item.Proportion = Number(num.toFixed(2));
+      return num == 0 ? "" : num.toFixed(2);
+    },
+    /** */
+    /** */
+
+    // 处理小数点
+    formatDecimal(key) {
+      let value = key.Proportion;
+      if (value === "") return; // 如果为空则不处理
+      // 先清除非数字和多余的小数点
+      value = value
+        .replace(/[^\d.]/g, "")
+        .replace(/\.{2,}/g, ".")
+        .replace(".", "$#$")
+        .replace(/\./g, "")
+        .replace("$#$", ".");
+
+      // 限制只能输入两位小数
+      const decimalRegex = /^(\d+\.?\d{0,2})/;
+      const match = value.match(decimalRegex);
+
+      if (match) {
+        key.Proportion = match[1];
+        this.restrictInput(key);
+      } else {
+        key.Proportion = 0; // 如果不匹配正则,则清空输入框
+      }
+    },
+    // 输入框的限制
+    restrictInput(item) {
+      if (item.Proportion) if (item.Proportion > 100) return (item.Proportion = 100);
+      if (item.Proportion < -100) return (item.Proportion = -100);
+    },
+    // 切换了录入 权益
+    raiDataHandler() {
+      return this.tabsPitchon == 1 ? this.EnterScoreObj.ListRai : this.PercentageObj.ListRai;
+    },
+    // 切换了录入 FICC
+    FICCDataHandler() {
+      return this.tabsPitchon == 1 ? this.EnterScoreObj.ListFicc : this.PercentageObj.ListFicc;
+    },
+    // 切换了录入 分组
+    ProuDataHandler() {
+      return this.tabsPitchon == 1 ? this.EnterScoreObj.ListGroup : this.PercentageObj.ListGroup;
+    },
+
+    /** */
+    /** */
+    // 总和
+    allPerCentNumble(item, type) {
+      let num = 0;
+      item.forEach((item) => (num += item.Proportion));
+      type === "rai" ? (this.tmeplateObj.RaiProportionTotal = Number(num.toFixed(2))) : (this.tmeplateObj.FiccProportionTotal = Number(num.toFixed(2)));
+      return num == 0 ? "" : num.toFixed(2);
+    },
+    TotalScoreHandler(item) {
+      let num = 0;
+      item && item.forEach((item) => (num += Number(item.Proportion)));
+      this.totalScoreNumber = Number((num + this.tmeplateObj.RaiProportionTotal + this.tmeplateObj.FiccProportionTotal).toFixed(2));
+      return this.totalScoreNumber;
+    },
+    /** */
+    /** */
+
+    // 获取模板
+    async getDataTemplate() {
+      const res = await xClassCustomApi.enterScoreDetail();
+      if (res.Ret === 200) {
+        this.tmeplateObj = res.Data;
+        this.EnterScoreObj = res.Data.EnterScoreObj;
+        this.PercentageObj = res.Data.PercentageObj;
+      }
+    },
+
+    // 保存
+    async preserveHandler() {
+      let StartDate = this.selectedDateRange ? this.selectedDateRange.split(" ~ ")[0] : "";
+      let EndDate = this.selectedDateRange ? this.selectedDateRange.split(" ~ ")[1] : "";
+      let ListGroup = this.ProuDataHandler().map((item) => {
+        return {
+          ...item,
+          Proportion: Number(item.Proportion),
+        };
+      });
+      let ListRai = this.raiDataHandler().map((item) => ({
+        ...item,
+        List: item.List.map((subItem) => ({
+          ...subItem,
+          Proportion: Number(subItem.Proportion),
+        })),
+      }));
+      let ListFicc = this.FICCDataHandler().map((item) => ({
+        ...item,
+        List: item.List.map((subItem) => ({
+          ...subItem,
+          Proportion: Number(subItem.Proportion),
+        })),
+      }));
+      let params = {
+        EnterScoreId: this.$route.query.id ? +this.$route.query.id : 0, //录分ID,等于0新增,大于0 修改
+        CompanyId: this.companyId,
+        CompanyName: this.companyName,
+        Quarter: this.selectedQuarters,
+        StartDate,
+        EndDate,
+        EnterScoreType: this.tabsPitchon,
+        RaiProportionTotal: this.tmeplateObj.RaiProportionTotal,
+        FiccProportionTotal: this.tmeplateObj.FiccProportionTotal,
+        ListRai,
+        ListFicc,
+        ListGroup,
+        Ranking: this.rankingValue,
+        IsMergeScoring: this.radioScoring,
+        SecuritiesFirmsName: this.brokerName,
+        MergeProportion: this.mergeProportion ? +this.mergeProportion : 0,
+        ProportionTotal: this.totalScoreNumber,
+      };
+      if (!params.CompanyName || !params.CompanyId) return this.$message.error("请输入客户名称");
+      if (!params.Quarter.length) return this.$message.error("请选择季度");
+      const res = await xClassCustomApi.enterScoreUpdate(params);
+      if (res.Ret === 200) {
+        this.$message.success(res.Msg);
+        this.$router.back();
+      }
+    },
+    //  获取详情
+    async getCompanyDetail() {
+      const res = await xClassCustomApi.enterScoreDetail({
+        EnterScoreId: +this.$route.query.id,
+      });
+      if (res.Ret === 200) {
+        this.tmeplateObj = res.Data;
+        this.EnterScoreObj = res.Data.EnterScoreObj;
+        this.PercentageObj = res.Data.PercentageObj;
+        this.rankingValue = res.Data.Ranking;
+        this.radioScoring = res.Data.IsMergeScoring;
+        this.brokerName = res.Data.SecuritiesFirmsName;
+        this.mergeProportion = res.Data.MergeProportion;
+        this.selectedQuarters = res.Data.Quarter;
+        this.companyId = res.Data.CompanyId;
+        this.companyName = res.Data.CompanyName;
+        this.tabsPitchon = res.Data.EnterScoreType;
+      }
+    },
+    //
+    async querySearchAsync(query, cb) {
+      cb([]);
+      if (query) {
+        const res = await xClassCustomApi.enterScoreSearchlist({ KeyWord: query });
+        if (res.Ret === 200) {
+          this.querySearchList = res.Data.List.map((_) => {
+            return {
+              ..._,
+              value: _.CompanyName,
+            };
+          });
+          cb(this.querySearchList);
+        }
+      }
+    },
+    // 选择后客户名称的id
+    selectCompanyChange(value) {
+      this.companyId = value.CompanyId;
+    },
+    // 返回事件
+    goBackHandler() {
+      this.$router.back();
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.add-new-entries {
+  .container-top {
+    display: flex;
+    align-items: center;
+  }
+  .class-text {
+    margin-top: 20px;
+    width: 100%;
+    height: 38px;
+    line-height: 32px;
+    padding-left: 20px;
+    background-color: #ebeef5;
+  }
+  .tabs-box {
+    margin-top: 20px;
+    span {
+      display: inline-block;
+      padding: 9px 24px;
+      background-color: #e9f4ff;
+      border: 1px solid #b3d8ff;
+      border-radius: 4px;
+      margin-right: 30px;
+      color: #409eff;
+      cursor: pointer;
+    }
+    .pitch {
+      background-color: #409eff;
+      border: none;
+      color: #fff;
+    }
+  }
+  .content-box {
+    width: 100%;
+    overflow: hidden;
+    overflow-x: auto;
+    display: flex;
+    .industry-ul {
+      display: flex;
+      align-items: center;
+      margin: 10px 0;
+      width: 188px;
+      color: #333;
+      margin-right: 25px;
+      .per_cent_ {
+        line-height: 32px;
+      }
+      .industry-name {
+        flex-shrink: 0;
+        font-weight: 800;
+        font-size: 16px;
+        line-height: 22px;
+      }
+      .study-name {
+        width: 58px;
+        flex-shrink: 0;
+        font-size: 14px;
+        line-height: 22px;
+      }
+      p {
+        color: #9999;
+        font-size: 14px;
+      }
+    }
+  }
+  .division-line {
+    width: 100%;
+    border: 1px dashed #dcdfe6;
+    margin: 30px 0 20px;
+  }
+  .bottom-box {
+    display: flex;
+    align-items: center;
+  }
+
+  .total-num {
+    margin: 30px 0 20px 0;
+    padding-left: 460px;
+  }
+}
+</style>
+<style>
+/* 针对于 Chrome、Safari 等 Webkit 内核浏览器 */
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
+}
+
+/* 针对 Firefox 浏览器 */
+input[type="number"] {
+  -moz-appearance: textfield;
+}
+</style>

+ 231 - 0
src/views/custom_manage/points/EntryRecords.vue

@@ -0,0 +1,231 @@
+<template>
+  <div class="container entry-records-points">
+    <div>
+      <el-autocomplete
+        v-model="companyName"
+        :fetch-suggestions="querySearchAsync"
+        style="width: 220px; margin-right: 20px"
+        @select="selectCompanyChange"
+        clearable
+        placeholder="请输入公司名称"
+        @clear="clearCompanyHandleSearch"
+      >
+        <i slot="prefix" class="el-input__icon el-icon-search"></i>
+      </el-autocomplete>
+      <el-cascader
+        v-model="sales"
+        placeholder="请选择销售"
+        style="width: 200px; margin-right: 20px"
+        :options="salesArr"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        @change="companyHandleSearch"
+      >
+      </el-cascader>
+      <el-button type="primary" @click="$router.push('AddNewEntries')"> 新增</el-button>
+      <a :href="exportUser" download>
+        <el-button type="primary" style="width: 80px;margin-left:15px">导出</el-button>
+      </a>
+    </div>
+
+    <div style="margin-top: 20px">
+      <el-table :data="tableData" style="width: 100%" border>
+        <el-table-column align="center" prop="CompanyName" label="客户名称"> </el-table-column>
+        <el-table-column align="center" prop="SellerName" label="销售" width="100"> </el-table-column>
+        <el-table-column align="center" prop="Quarter" label="季度" width="180">
+          <template slot-scope="{ row }">
+            <span>{{ row.Quarter.join(",") }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="ProportionTotal" label="总分" width="100">
+          <template slot-scope="{ row }">
+            <span>{{ row.ProportionTotal }}{{ row.EnterScoreType == 2 ? "%" : "" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="Ranking" label="排名" width="100"> </el-table-column>
+        <el-table-column align="center" prop="IsMergeScoring" label="合并打分" width="80">
+          <template slot-scope="{ row }">
+            <span>{{ row.IsMergeScoring == 1 ? "是" : "否" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="SecuritiesFirmsName" label="券商名称"> </el-table-column>
+        <el-table-column align="center" prop="CreateTime" label="首次录入时间" width="180"> </el-table-column>
+        <el-table-column align="center" prop="ModifyTime" label="最近更新时间" width="180"> </el-table-column>
+        <el-table-column align="center" prop="name" label="操作" width="180">
+          <template slot-scope="{ row }">
+            <span class="editsty" @click="lookHandler(row)">查看明细</span>
+            <span class="deletesty" @click="deleteHandle(row)">删除</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import { customInterence, xClassCustomApi } from "@/api/api.js";
+export default {
+  name: "EntryRecords",
+  props: {
+    searchVal: {
+      type: String,
+      default: "",
+    },
+  },
+  computed: {
+    exportUser() {
+      let baseUrl = process.env.API_ROOT + "/cygx/enterScore/list";
+      let token = localStorage.getItem("auth") || "";
+      let salesArr = [];
+      if (this.sales.length) {
+        salesArr = this.sales.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let paramStr = "";
+      let params = {
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        KeyWord: this.companyName,
+        AdminId: salesArr.join(","),
+        IsExport: true,
+      };
+      for (let key in params) {
+        paramStr = `${paramStr}&${key}=${params[key]}`;
+      }
+      return `${baseUrl}?${token}${paramStr}`;
+    },
+  },
+  data() {
+    return {
+      page_no: 1,
+      pageSize: 10,
+      total: 1,
+      tableData: [],
+      companyName: "",
+      sales: "",
+      salesArr: [], //销售
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+    };
+  },
+  watch: {
+    searchVal() {
+      this.getDataList();
+    },
+  },
+  mounted() {
+    this.getSale();
+    this.getDataList();
+  },
+  methods: {
+    // 公司名称
+    companyHandleSearch(value) {
+      this.page_no = 1;
+      this.getDataList();
+    },
+    /* 获取销售 */
+    getSale() {
+      let status = 0;
+      if (this.act_status == "流失") {
+        status = 1;
+      }
+      customInterence.getSale({ Status: status }).then((res) => {
+        if (res.Ret === 200) {
+          this.salesArr = res.Data.List;
+        }
+      });
+    },
+    // 获取列表信息
+    async getDataList() {
+      let salesArr = [];
+      if (this.sales.length) {
+        salesArr = this.sales.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      const res = await xClassCustomApi.enterScoreList({
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        KeyWord: this.companyName,
+        AdminId: salesArr.join(","),
+      });
+      if (res.Ret === 200) {
+        this.total = res.Data.Paging.Totals;
+        this.tableData = res.Data.List;
+      }
+    },
+    // 删除
+    deleteHandle(item) {
+      this.$confirm("是否删除?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(async () => {
+          const res = await xClassCustomApi.enterScoreDelete({
+            EnterScoreId: item.EnterScoreId,
+          });
+          if (res.Ret === 200) {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+            this.getDataList();
+          }
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    // 查看
+    lookHandler(item) {
+      this.$router.push({
+        path: "/EditNewEntries",
+        query: { id: item.EnterScoreId },
+      });
+    },
+    //
+    async querySearchAsync(query, cb) {
+      cb([]);
+      if (query) {
+        const res = await xClassCustomApi.enterScoreSearchlist({ KeyWord: query });
+        if (res.Ret === 200) {
+          this.querySearchList = res.Data.List.map((_) => {
+            return {
+              ..._,
+              value: _.CompanyName,
+            };
+          });
+          cb(this.querySearchList);
+        }
+      }
+    },
+    // 选择后客户名称的id
+    selectCompanyChange(value) {
+      this.companyId = value.CompanyId;
+      this.page_no = 1;
+      this.getDataList();
+    },
+    clearCompanyHandleSearch() {
+      this.companyId = "";
+      this.page_no = 1;
+      this.getDataList();
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+// .entry-records-points {
+// }
+</style>

+ 211 - 0
src/views/custom_manage/points/RankingOverview.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="container ranking-overview-content">
+    <div class="select-box">
+      <el-cascader
+        v-model="sales"
+        placeholder="请选择销售"
+        style="width: 220px"
+        :options="salesArr"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        @change="changeHandle"
+      >
+      </el-cascader>
+      <el-select style="width: 220px; margin: 0 20px" v-model="valueLocation" multiple placeholder="请选择城市" @change="changeHandle">
+        <el-option v-for="item in locationOptions" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+      </el-select>
+      <a :href="exportUser" download>
+        <el-button type="primary" style="width: 80px">导出</el-button>
+      </a>
+    </div>
+    <div class="table-cont">
+      <template v-if="tableTheadColumns.length">
+        <table class="thead-sticky thead-box">
+          <thead>
+            <tr>
+              <td class="'head-column'"></td>
+              <td v-for="item in tableTheadColumns" :key="item" :class="['head-column']">
+                {{ item.CompanyName }}
+              </td>
+            </tr>
+          </thead>
+          <tbody v-for="(item, index) in datalist" :key="index">
+            <tr>
+              <td class="thead-rs">{{ item.Quarter }}</td>
+              <td v-for="key in item.ProportionListText" :key="key">{{ key }}</td>
+            </tr>
+          </tbody>
+        </table>
+        <template v-if="!datalist.length"> <div class="not-text">暂无数据</div> </template>
+      </template>
+      <template v-else> <div class="not-text">暂无数据</div> </template>
+    </div>
+  </div>
+</template>
+
+<script>
+import { customInterence, xClassCustomApi } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {
+      sales: "",
+      salesArr: [], //销售
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+      valueLocation: [], //地址
+      tableTheadColumns: [],
+      datalist: [],
+      listGroup: [],
+      locationOptions: [{ name: "北京市" }, { name: "上海市" }, { name: "深圳市" }],
+    };
+  },
+  computed: {
+    exportUser() {
+      let baseUrl = process.env.API_ROOT + "/cygx/enterScore/rankingOverview";
+      let token = localStorage.getItem("auth") || "";
+      let paramStr = "";
+      let params = this.paramsHandler();
+      params.IsExport = true;
+      for (let key in params) {
+        paramStr = `${paramStr}&${key}=${params[key]}`;
+      }
+      return `${baseUrl}?${token}${paramStr}`;
+    },
+  },
+  watch: {},
+  created() {},
+  mounted() {
+    this.getSale();
+    this.getDataList();
+  },
+  methods: {
+    /* 获取销售 */
+    getSale() {
+      let status = 0;
+      if (this.act_status == "流失") {
+        status = 1;
+      }
+      customInterence.getSale({ Status: status }).then((res) => {
+        if (res.Ret === 200) {
+          this.salesArr = res.Data.List;
+        }
+      });
+    },
+    async getDataList() {
+      let params = this.paramsHandler();
+      const res = await xClassCustomApi.enterScoreRankingOverview(params);
+      if (res.Ret === 200) {
+        this.tableTheadColumns = res.Data.ListCompany || [];
+        this.datalist = res.Data.ListQuarterDate || [];
+      }
+    },
+    // 处理数据, 获取数据
+    paramsHandler() {
+      let salesArr = [];
+      if (this.sales.length) {
+        salesArr = this.sales.map((item) => {
+          return item[item.length - 1];
+        });
+      }
+      let params = {
+        City: this.valueLocation.join(","),
+        AdminId: salesArr.join(","),
+      };
+      return params;
+    },
+    changeHandle() {
+      this.getDataList();
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.ranking-overview-content {
+  .select-box {
+    display: flex;
+  }
+
+  .top-select {
+    display: flex;
+    justify-content: space-between;
+  }
+  .select-box {
+    display: flex;
+    margin-bottom: 30px;
+  }
+  .table-cont {
+    overflow: auto;
+    max-height: calc(100vh - 400px);
+    table {
+      font-size: 14px;
+      color: #666;
+      thead {
+        position: sticky;
+        top: 0;
+        left: 0;
+        border-left: 1px solid #dcdfe6;
+        border-right: 1px solid #dcdfe6;
+        td,
+        th {
+          min-width: 100px;
+          word-break: break-all;
+          border: 1px solid #dcdfe6;
+          outline-color: #dcdfe6;
+          outline-style: solid;
+          outline-width: 0.5px;
+        }
+      }
+      td,
+      th {
+        min-width: 100px;
+        word-break: break-all;
+        border: 1px solid #dcdfe6;
+        height: 45px;
+        text-align: center;
+        background-color: #fff;
+      }
+
+      .head-column {
+        background-color: #f0f2f5;
+      }
+
+      .data-cell {
+        color: #409eff;
+        cursor: pointer;
+      }
+
+      .thead-sticky {
+        position: sticky;
+        top: 0;
+      }
+    }
+    .content-ul {
+      .association {
+        color: #409eff;
+        cursor: pointer;
+      }
+    }
+  }
+  .not-text {
+    height: 300px;
+    line-height: 300px;
+    text-align: center;
+  }
+  .thead-box {
+    position: sticky;
+    top: 0;
+    z-index: 9;
+  }
+}
+</style>

+ 258 - 0
src/views/custom_manage/points/RatingOverview.vue

@@ -0,0 +1,258 @@
+<template>
+  <div class="container rating-overview-content">
+    <div class="top-select">
+      <div class="select-box">
+        <el-date-picker style="width: 220px" v-model="yearValue" value-format="yyyy" type="year" placeholder="请选择年份" :clearable="false" @change="changeHandle"> </el-date-picker>
+        <el-select style="width: 220px; margin: 0 20px" v-model="selectedQuarter" placeholder="请选择季度" @change="changeHandle">
+          <el-option v-for="item in quarterOptions" :key="item.label" :label="item.label" :value="item.value"> </el-option>
+        </el-select>
+        <el-input style="width: 220px" placeholder="请输入券商名称" prefix-icon="el-icon-search" v-model="brokerName" @input="inputHandle"> </el-input>
+        <el-select style="width: 220px; margin: 0 20px" v-model="valueLocation" multiple placeholder="请选择城市" @change="changeHandle">
+          <el-option v-for="item in locationOptions" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+        </el-select>
+        <a :href="exportUser" download>
+          <el-button type="primary" style="width: 80px">导出</el-button>
+        </a>
+      </div>
+      <div>
+        <el-button @click="enterScoreType = !enterScoreType" type="primary">{{ enterScoreType ? "原始值显示" : "百分比显示" }} </el-button>
+      </div>
+    </div>
+
+    <div class="table-cont">
+      <template v-if="tableTheadColumns.length">
+        <table class="thead-sticky thead-box">
+          <thead>
+            <tr>
+              <td class="'head-column'"></td>
+              <td v-for="item in tableTheadColumns" :key="item" :class="['head-column']">
+                {{ item.CompanyName }}
+              </td>
+            </tr>
+          </thead>
+          <tbody v-for="(item, index) in datalist" :key="index">
+            <tr>
+              <td class="thead-rs">{{ item.ChartPermissionName }}</td>
+              <td v-for="key in item.ProportionListText" :key="key">{{ key }}</td>
+            </tr>
+            <tr v-for="rs in item.List" :key="rs.RealName" class="content-ul">
+              <td>{{ rs.RealName }}</td>
+              <td v-for="pr in rs.ProportionListText" :key="pr">{{ pr }}</td>
+            </tr>
+          </tbody>
+          <tbody v-for="(item, index) in listGroup" :key="index">
+            <tr>
+              <td class="thead-rs">{{ item.GroupName }}</td>
+              <td v-for="key in item.ProportionListText" :key="key">{{ key }}</td>
+            </tr>
+          </tbody>
+        </table>
+        <template v-if="!datalist.length && !listGroup.length"> <div class="not-text">暂无数据</div> </template>
+      </template>
+      <template v-else> <div class="not-text">暂无数据</div> </template>
+    </div>
+  </div>
+</template>
+
+<script>
+import { customInterence, xClassCustomApi } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {
+      yearValue: new Date().getFullYear().toString(), // 年份
+      selectedQuarter: [], // 季度
+      quarterOptions: [
+        {
+          label: "Q1",
+          value: ["01-01", "03-31"],
+        },
+        {
+          label: "Q2",
+          value: ["04-01", "06-30"],
+        },
+        {
+          label: "Q3",
+          value: ["07-01", "09-30"],
+        },
+        {
+          label: "Q4",
+          value: ["10-01", "12-31"],
+        },
+      ],
+      brokerName: "", // 券商名
+      valueLocation: [], //地址
+      tableTheadColumns: [],
+      datalist: [],
+      listGroup: [],
+      enterScoreType: false,
+      locationOptions: [{ name: "北京市" }, { name: "上海市" }, { name: "深圳市" }],
+    };
+  },
+  computed: {
+    exportUser() {
+      let baseUrl = process.env.API_ROOT + "/cygx/enterScore/scoreOverview";
+      let token = localStorage.getItem("auth") || "";
+      const cityArr = [];
+      let paramStr = "";
+      let params = this.paramsHandler();
+      params.IsExport = true;
+      for (let key in params) {
+        paramStr = `${paramStr}&${key}=${params[key]}`;
+      }
+      return `${baseUrl}?${token}${paramStr}`;
+    },
+  },
+  watch: {
+    enterScoreType: {
+      handler() {
+        this.getDataList();
+      },
+    },
+  },
+  mounted() {
+    this.setDefaultQuarter();
+
+    this.getDataList();
+  },
+  methods: {
+    setDefaultQuarter() {
+      const currentDate = new Date();
+      const month = currentDate.getMonth() + 1; // 获取当前月份(0-11,所以加1)
+
+      let currentQuarterIndex;
+      if (month >= 1 && month <= 3) {
+        // Q1
+        currentQuarterIndex = 0;
+      } else if (month >= 4 && month <= 6) {
+        // Q2
+        currentQuarterIndex = 1;
+      } else if (month >= 7 && month <= 9) {
+        // Q3
+        currentQuarterIndex = 2;
+      } else if (month >= 10 && month <= 12) {
+        // Q4
+        currentQuarterIndex = 3;
+      }
+
+      // 获取上一个季度索引
+      const previousQuarterIndex = currentQuarterIndex === 0 ? this.quarterOptions.length - 1 : currentQuarterIndex - 1;
+
+      // 设置v-model绑定的值为上一个季度的value数组
+      this.selectedQuarter = this.quarterOptions[previousQuarterIndex].value;
+    },
+
+    getPreviousYear(currentYear, currentQuarter) {
+      // 如果当前季度是第一个季度,则上个季度应该是去年的最后一个季度
+      return currentQuarter === "Q1" ? currentYear - 1 : currentYear;
+    },
+    changeHandle() {
+      this.getDataList();
+    },
+    inputHandle: _.debounce(async function () {
+      this.getDataList();
+    }, 500),
+    async getDataList() {
+      this.tableTheadColumns = [];
+      this.datalist = [];
+      this.listGroup = [];
+      let params = this.paramsHandler();
+      const res = await xClassCustomApi.enterScoreScoreOverview(params);
+      if (res.Ret === 200) {
+        this.tableTheadColumns = res.Data.ListCompany || [];
+        this.datalist = res.Data.ListPermission || [];
+        this.listGroup = res.Data.ListGroup || [];
+      }
+    },
+    // 处理数据, 获取数据
+    paramsHandler() {
+      let params = {
+        StartDate: this.yearValue + "-" + this.selectedQuarter[0],
+        EndDate: this.yearValue + "-" + this.selectedQuarter[1],
+        KeyWord: this.brokerName,
+        City: this.valueLocation.join(","),
+        EnterScoreType: this.enterScoreType ? 2 : 1,
+      };
+      return params;
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.rating-overview-content {
+  .top-select {
+    display: flex;
+    justify-content: space-between;
+  }
+  .select-box {
+    display: flex;
+    margin-bottom: 30px;
+  }
+  .table-cont {
+    max-height: calc(100vh - 400px);
+    overflow: auto;
+    table {
+      font-size: 14px;
+      color: #666;
+      thead {
+        position: sticky;
+        top: 0;
+        left: 0;
+        border-left: 1px solid #dcdfe6;
+        border-right: 1px solid #dcdfe6;
+        td,
+        th {
+          min-width: 100px;
+          word-break: break-all;
+          border: 1px solid #dcdfe6;
+          outline-color: #dcdfe6;
+          outline-style: solid;
+          outline-width: 0.5px;
+        }
+      }
+      td,
+      th {
+        min-width: 100px;
+        word-break: break-all;
+        border: 1px solid #dcdfe6;
+        height: 45px;
+        text-align: center;
+        background-color: #fff;
+      }
+
+      .head-column {
+        background-color: #f0f2f5;
+      }
+
+      .data-cell {
+        color: #409eff;
+        cursor: pointer;
+      }
+
+      .thead-sticky {
+        position: sticky;
+        top: 0;
+      }
+    }
+    .content-ul {
+      .association {
+        color: #409eff;
+        cursor: pointer;
+      }
+    }
+  }
+  .not-text {
+    height: 300px;
+    line-height: 300px;
+    text-align: center;
+  }
+  .thead-box {
+    position: sticky;
+    top: 0;
+    z-index: 9;
+  }
+}
+</style>

+ 85 - 0
src/views/custom_manage/points/XClassCustom.vue

@@ -0,0 +1,85 @@
+<template>
+  <div class="container x-class-custom-content">
+    <el-card>
+      <div class="top-card-box">
+        <div class="tabs-box">
+          <span v-for="item in listTitle" :key="item.value" @click="tabsBoxBtn(item)" :class="item.value == tabsPitchon ? 'pitch' : ''">{{ item.lable }}</span>
+        </div>
+      </div>
+    </el-card>
+    <el-card style="margin-top: 20px">
+      <EntryRecords v-if="tabsPitchon == 1" />
+      <RatingOverview v-if="tabsPitchon == 2" />
+      <RankingOverview v-if="tabsPitchon == 3" />
+    </el-card>
+  </div>
+</template>
+
+<script>
+import EntryRecords from "./EntryRecords.vue"; // 录分
+import RatingOverview from "./RatingOverview.vue"; // 评分
+import RankingOverview from "./RankingOverview.vue"; // 排名
+export default {
+  name: "",
+  components: { EntryRecords, RatingOverview, RankingOverview },
+  props: {},
+  data() {
+    return {
+      listTitle: [
+        {
+          lable: "录分记录",
+          value: "1",
+        },
+        {
+          lable: "评分总览",
+          value: "2",
+        },
+        {
+          lable: "排名总览",
+          value: "3",
+        },
+      ],
+      tabsPitchon: 1, //tabs 默认选中
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {},
+  methods: {
+    // 头部的点击事件
+    tabsBoxBtn(item) {
+      this.tabsPitchon = item.value;
+    },
+    // 输入框搜索事件
+    handleSearch() {
+      // this.$refs.recordRefs
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.x-class-custom-content {
+  .top-card-box {
+    display: flex;
+    justify-content: space-between;
+    .tabs-box {
+      span {
+        display: inline-block;
+        padding: 9px 24px;
+        background-color: #e9f4ff;
+        border: 1px solid #b3d8ff;
+        border-radius: 4px;
+        margin-right: 30px;
+        color: #409eff;
+        cursor: pointer;
+      }
+      .pitch {
+        background-color: #409eff;
+        border: none;
+        color: #fff;
+      }
+    }
+  }
+}
+</style>

+ 38 - 3
src/views/dataReport_manage/statistic/newCustomlist.vue

@@ -15,7 +15,7 @@
 				:min-width="item.minwidthsty"
 				:prop="item.key"
 				align="center"
-				:sortable="['viewTotal','RoadShowTotal','LastViewTime','ExpireDay','createTime'].includes(item.key) ? 'custom' : false"
+				:sortable="sortableCheck(item.key)"
 			>
 				<template slot-scope="{row}">
 
@@ -80,6 +80,7 @@
 				sortable="custom"
 				align="center" 
 				min-width="120"
+				v-if="!isRenewalException"
 			>
 				<template slot-scope="scope">
 					<span>
@@ -92,9 +93,29 @@
 					</span> 
 				</template>
 			</el-table-column>
-			<el-table-column label="操作" align="center">
+			<el-table-column
+				prop="ServiceYears"
+				sortable="custom"
+				align="center" 
+				min-width="120"
+				v-else
+			>
+				<template slot="header" slot-scope="scope">
+					<el-tooltip content="客户年限=(当前年月日-首签合同开始年月日)/365,结果进行四舍五入,保存一位小数" placement="top">
+						<div style="display: inline-flex;align-items: center;">
+							<span style="margin-right: 4px;">客户年限</span>
+							<i class="el-icon-info" style="color: #333333;"/>
+						</div>
+					</el-tooltip>
+				</template>
+				<template slot-scope="scope">
+					<span>{{scope.row.ServiceYears}}</span> 
+				</template>
+			</el-table-column>
+			<el-table-column label="操作" align="center" prop="LatestServiceRecord" :sortable="isRenewalException?'custom':false">
 				<span slot-scope="scope">
 					<el-button type="text" @click="handleShowShareRecode(scope.row,'list')">沟通记录</el-button>
+					<span style="white-space: nowrap;" v-if="isRenewalException">{{ scope.row.LatestServiceRecord }}</span>
 				</span>
 			</el-table-column>
 			<div slot="empty" style="lineHeight:44px;margin:60px 0;color:#999;">
@@ -106,6 +127,7 @@
 			<m-page
 				:total="total"
 				:page_no="page_no"
+				:pageSize="pageSize"
 				@handleCurrentChange="handleCurrentChange"
 			/>
 		</div>
@@ -205,6 +227,10 @@ export default {
 		Role() {
 			return localStorage.getItem('Role');
 		},
+		// 是否是续约异常
+		isRenewalException(){
+			return this.$route.path=="/abnormalRenewalCustomlist"
+		},
 		tableColumnsComputed(){
 			// 分配销售 续约统计和续约异常统计需要显示
 			let hasDistributionSales = this.Role.indexOf('rai')==-1 && 
@@ -244,6 +270,10 @@ export default {
 			this.getTableData();
 		},
 
+		sortableCheck(key){
+			return ( ['viewTotal','RoadShowTotal','LastViewTime','ExpireDay','createTime'].includes(key) ||
+							(['ShareSeller','SellerName','Status'].includes(key) && this.isRenewalException) ) ? 'custom' : false
+		},
 		/* 排序变化时 */
 		sortChangeHandle({ prop,order }) {
 			console.log(prop,order)
@@ -253,6 +283,11 @@ export default {
 				'RoadShowTotal': 'roadShowTotal',
 				'LastViewTime': 'viewTime',
 				'ExpireDay': 'expireDay',
+				'ShareSeller':'shareSellerName',
+				'SellerName':'sellerName',
+				'Status':'status',
+				'ServiceYears':'serviceYears',
+				'LatestServiceRecord':'latestServiceRecord'
 			}
 
 			this.sort_obj = {
@@ -322,7 +357,7 @@ export default {
       		this.title = title;
 			this.sort_obj = sort_obj
     	}
-
+		this.pageSize=this.isRenewalException?50:10
 		this.ids && this.getTableData();
 	},
 }

+ 2 - 1
src/views/login_manage/ForgetPassModel.vue

@@ -283,7 +283,8 @@ export default {
                 VerifyCode:code,
                 UserName:this.form.account,
                 Mobile:this.checkWay==='mobile'?this.userMobile:'',
-                Email:this.checkWay==='email'?this.userEmail:''
+                Email:this.checkWay==='email'?this.userEmail:'',
+                TelAreaCode:this.checkWay==='mobile'?this.TelAreaCode:''
             }).then(res=>{
                 if(res.Ret!==200) return
                 this.goSteps()

+ 11 - 8
src/views/rai_manage/activityManage/activityManage.vue

@@ -7,11 +7,11 @@
         <div class="tabs-box">
           <span v-for="(item, index) in listTitle" :key="item.ChartPermissionId" @click="tabsBoxBtn(item, index)" :class="index == tabsPitchon ? 'pitch' : ''">{{ item.PermissionName }}</span>
         </div>
-        <div style="display: flex;align-items: center">
-          <el-upload style="height:40px" ref="imgUpload" action="#" :http-request="handleUploadImg" :show-file-list="false" accept="image/*">
-            <el-button style="height:40px" type="primary">识图建会</el-button>
+        <div style="display: flex; align-items: center">
+          <el-upload style="height: 40px" ref="imgUpload" action="#" :http-request="handleUploadImg" :show-file-list="false" accept="image/*">
+            <el-button style="height: 40px" type="primary">识图建会</el-button>
           </el-upload>
-          <el-button style="margin-left: 20px;height:40px" type="primary" @click="$router.push(!isResearch ? '/addActivity' : '/addPurchaserActivity')">添加活动</el-button>
+          <el-button style="margin-left: 20px; height: 40px" type="primary" @click="$router.push(!isResearch ? '/addActivity' : '/addPurchaserActivity')">添加活动</el-button>
         </div>
       </div>
     </el-card>
@@ -45,7 +45,7 @@
       <el-table :data="dataList" style="width: 100%" border>
         <el-table-column align="center" label="活动名称" min-width="285">
           <template slot-scope="{ row }">
-            <span class="editsty" @click="titleBtnClick(row.ActivityId)">{{ row.ActivityName }}</span>
+            <span :class="row.PublishStatus == 3 ? 'grey-color' : 'editsty'" @click="titleBtnClick(row.ActivityId)">{{ row.ActivityName }}</span>
           </template>
         </el-table-column>
         <el-table-column prop="ChartPermissionName" align="center" label="行业" min-width="90"></el-table-column>
@@ -65,10 +65,10 @@
           <template slot-scope="{ row }">
             <div class="operate-box">
               <p v-if="row.PublishStatus == 0 && tabsPitchon == 0" class="editsty" @click="operationBtn(row.ActivityId, '发布')">发布</p>
-              <p v-if="row.PublishStatus == 3" class="editsty" @click="operationBtn(row.ActivityId, '重新发布')">重新发布</p>
+              <p v-if="row.PublishStatus == 3" class="grey-color" @click="operationBtn(row.ActivityId, '重新发布')">重新发布</p>
               <p v-if="row.PublishStatus == 1" class="editsty" @click="operationBtn(row.ActivityId, '取消发布')">取消发布</p>
               &nbsp;&nbsp;
-              <p class="editsty" @click="editBtn(row.ActivityId, row.PublishStatus)">编辑</p>
+              <p :class="row.PublishStatus == 3 ? 'grey-color' : 'editsty'" @click="editBtn(row.ActivityId, row.PublishStatus)">编辑</p>
               &nbsp;&nbsp;
               <p class="deletesty" v-if="row.PublishStatus == 0 && tabsPitchon == 0" @click="operationBtn(row.ActivityId, '删除')">删除</p>
               <p class="editsty" v-if="row.IsShowSigninButton" @click="handleDownLoadImg(row)">下载签到码</p>
@@ -439,9 +439,12 @@ export default {
       flex-shrink: 0;
     }
   }
-  .el-upload  {
+  .el-upload {
     height: 40px !important;
     min-height: 40px !important;
   }
+  .grey-color {
+    cursor: pointer;
+  }
 }
 </style>

+ 16 - 20
src/views/rai_manage/activityManage/applyManage.vue

@@ -37,14 +37,8 @@
           <el-button type="primary" @click="sendMessage">发送模板消息</el-button>
         </div>
         <div>
-          <el-select placeholder="行业" clearable v-model="industry" @change="conditionChange" style="margin-bottom: 20px"
-          v-if="!isResearch">
-            <el-option
-              v-for="item in chartPermissionList"
-              :label="item.PermissionName"
-              :key="item.ChartPermissionId"
-              :value="item.ChartPermissionId"
-            ></el-option>
+          <el-select placeholder="行业" clearable v-model="industry" @change="conditionChange" style="margin-bottom: 20px" v-if="!isResearch">
+            <el-option v-for="item in chartPermissionList" :label="item.PermissionName" :key="item.ChartPermissionId" :value="item.ChartPermissionId"></el-option>
           </el-select>
           <el-select placeholder="活动类型" clearable @focus="activityType" v-model="cactivityTypeVal" @change="conditionChange" style="margin-bottom: 20px">
             <el-option v-for="item in cactivityTypeList" :label="item.ActivityTypeName" :key="item.ActivityTypeId" :value="item.ActivityTypeId"></el-option>
@@ -81,7 +75,7 @@
               <span v-if="row.SignupFailPeopleNum == 0">--</span>
               <span v-else class="editsty" @click="particularsBtn('报名失败详情', row.ActivityId)">{{ row.SignupFailPeopleNum }}</span>
             </div>
-            <span v-else @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key)">{{ handleRowContent(row, item.key) }}</span>
+            <span v-else @click="handleRowClick(row, item.key)" :style="handleRowStyle(item.key, row)">{{ handleRowContent(row, item.key) }}</span>
           </template>
         </el-table-column>
       </el-table>
@@ -118,7 +112,7 @@ import ParticularsDialog from "../components/apply/particularsDialog.vue";
 import AtcParticulars from "../components/atcParticulars.vue";
 import GenerationAsk from "../components/generationAsk.vue";
 import SummaryRemind from "../components/apply/summaryRemind.vue";
-import { ListTitle , purchaserListTitle , TableApplyColums, StatusSelect, PublishSelect } from "../components/apply/applyTableColums";
+import { ListTitle, purchaserListTitle, TableApplyColums, StatusSelect, PublishSelect } from "../components/apply/applyTableColums";
 import TemplateMessage from "../components/apply/templateMessage.vue";
 export default {
   name: "",
@@ -166,11 +160,11 @@ export default {
   },
   computed: {
     // 弘则 研选 是否是研选
-    isResearch(){
-      return this.$route.path.indexOf("purchaser")!=-1?true:false
+    isResearch() {
+      return this.$route.path.indexOf("purchaser") != -1 ? true : false;
     },
     listTitle() {
-      return !this.isResearch?ListTitle:purchaserListTitle;
+      return !this.isResearch ? ListTitle : purchaserListTitle;
     },
     statusSelect() {
       return StatusSelect;
@@ -187,7 +181,7 @@ export default {
       this.page_no = 1;
       this.init();
       this.getsDataList();
-    }
+    },
   },
   created() {},
   mounted() {
@@ -225,7 +219,7 @@ export default {
           ActivityTypeId: this.cactivityTypeVal,
           ActiveState: this.cactivityStatus,
           PublishStatus: this.publishStatus ? Number(this.publishStatus) : 2,
-          IsResearch:this.isResearch
+          IsResearch: this.isResearch,
         })
         .then((res) => {
           if (res.Ret !== 200) return;
@@ -315,7 +309,7 @@ export default {
     },
     //获取行业
     chartPermission() {
-      raiInterface.chartPermission({IsHideResearch:!this.isResearch}).then((res) => {
+      raiInterface.chartPermission({ IsHideResearch: !this.isResearch }).then((res) => {
         if (res.Ret === 200) {
           this.chartPermissionList = res.Data.List;
         }
@@ -372,9 +366,11 @@ export default {
       }
     },
     /* 表格行的样式 */
-    handleRowStyle(key) {
-      let isStyle = ["ActivityName", "SignupPeopleNum", "AppointmentPeopleNum", "AskNum"];
-      return isStyle.includes(key) ? "color: #409eff; cursor: pointer" : "";
+    handleRowStyle(key, row) {
+      if (["ActivityName", "SignupPeopleNum", "AppointmentPeopleNum", "AskNum"].includes(key)) {
+        return row.PublishStatus == 3 ? "cursor: pointer" : "color: #409eff; cursor: pointer";
+      }
+      return "";
     },
     /* 表格行的点击事件 */
     handleRowClick(row, key) {
@@ -403,7 +399,7 @@ export default {
         let status = row[key] == 1 ? "未开始" : row[key] == 2 ? "进行中" : "已结束";
         return status;
       } else if (key == "PublishStatus") {
-        let status = row["PublishStatus"] == 1 ? "已发布" : row["PublishStatus"] == 2 ?"未发布":"已取消";
+        let status = row["PublishStatus"] == 1 ? "已发布" : row["PublishStatus"] == 2 ? "未发布" : "已取消";
         return status;
       } else {
         return row[key];

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

@@ -57,6 +57,8 @@ export default {
           ? "所有路演回放音视频"
           : this.dataRegular.TagType == 4
           ? "所有问答系列音频"
+          : this.dataRegular.TagType == 5
+          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研"
           : "";
       return str;
     },

+ 55 - 19
src/views/roadshow_manage/compononts/activityDetailDia.vue

@@ -13,6 +13,7 @@
 			class="table-cont"
 			max-height="300"
 			border
+			ref="tableRef"
 		>
 			<el-table-column
 				v-for="item in tableColumns"
@@ -20,7 +21,9 @@
 				:label="item.label"
 				:width="item.widthsty"
 				:min-width="item.minwidthsty"
+				:prop="item.key"
 				align="center"
+				:sortable="region=='oversea' && (item.key=='time')"
 			>
 				<template slot-scope="{row}">
 
@@ -74,14 +77,18 @@ export default {
 		fromType: {
 			type: String,
 			default: 'researcher'
+		},
+		// oversea 海外
+		region: {
+			type: String,
+			default: 'home'
 		}
 	},
 	watch: {
 		isShow(newval) {
 			if(newval) {
 				this.initState();
-				console.log(this.form)
-				this.getStatisticDetail();
+				this.getStatisticDetail();				
 			}
 		}
 	},
@@ -97,25 +104,49 @@ export default {
 		/* 获取列表 */
 		getStatisticDetail() {
 			const { startDate,endDate,userid,key } = this.form;
-			const typeMapObj = {
-				试用路演: 'try_out',
-				正式路演: 'formal',
-				公开会议: 'meeting',
-			}
-			roadshowInterence.statisticDetailList({
-				DataType: typeMapObj[key] && typeMapObj[key],
-				StartDate: startDate,
-				EndDate: endDate,
-				AdminId: userid,
-				AdminType: this.fromType
-			}).then(res => {
-				const { Ret,Data } = res;
+			if(this.region=='oversea'){
+				// 海外
+				const typeMapObj = {
+					试用: 'try_out',
+					正式: 'formal',
+					关闭: 'close',
+				}
+				roadshowInterence.overseaStatisticDetailList({
+					DataType: typeMapObj[key] && typeMapObj[key],
+					StartDate: startDate,
+					EndDate: endDate,
+					AdminIds: userid?userid.join(','):'',
+					AdminType: this.fromType
+				}).then(res => {
+					const { Ret,Data } = res;
 
-				if(Ret !== 200) return
+					if(Ret !== 200) return
 
-				this.tableData = Data || [];
+					this.tableData = Data || [];
+
+				})
+			}else {
+				const typeMapObj = {
+					试用路演: 'try_out',
+					正式路演: 'formal',
+					公开会议: 'meeting',
+				}
+				roadshowInterence.statisticDetailList({
+					DataType: typeMapObj[key] && typeMapObj[key],
+					StartDate: startDate,
+					EndDate: endDate,
+					AdminId: userid,
+					AdminType: this.fromType
+				}).then(res => {
+					const { Ret,Data } = res;
+
+					if(Ret !== 200) return
+
+					this.tableData = Data || [];
+
+				})
+			}
 
-			})
 		},
 
 		/* 取消 */
@@ -182,6 +213,11 @@ export default {
 						},
 						{ ...dynamic_column }
 				]	
+			this.$refs.tableRef && this.$refs.tableRef.clearSort()
+			this.$nextTick(()=>{
+				// 滚动条高度归零
+				this.$refs.tableRef && (this.$refs.tableRef.$el.querySelector('.el-table__body-wrapper').scrollTop=0)
+			})
 		}
 	},
 	created() {},
@@ -197,4 +233,4 @@ export default {
 .company-tip-poper {
 	max-width: 400px;
 }
-</style>e>
+</style>