bding 1 anno fa
parent
commit
eb9700d0dd

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

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

@@ -1265,4 +1265,28 @@ 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)
+  },  
+}
+
+export { customInterence,customAllInterence, equityContacts,etaTrialInterence,xClassCustomApi};

+ 16 - 0
src/routes/modules/customRoutes.js

@@ -437,6 +437,22 @@ 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类客户派点",
+        }
       }
     ],
   },

+ 25 - 3
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;" v-if="companyInfo.Status !='永续'">
 							<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" style="marginRight:60px;" v-if="companyInfo.Status =='永续'">
+							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
+							<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 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 
@@ -179,9 +192,10 @@ 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},
 	data () {
 		return {
@@ -673,6 +687,14 @@ export default {
 			}
 		}
 	}
-
+	.quarters-content {
+		position: relative;
+		.quarters-text {
+			position: absolute;
+			left: 0;
+			top: 20px;
+			color: #f00;
+		}
+	}
 }
 </style>

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

@@ -0,0 +1,116 @@
+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`;
+      }
+    },
+
+    // handleCheckboxChange(value) {
+    //   value.sort((a, b) => a.localeCompare(b));
+
+    //   for (let i = value.length - 1; i > 0; i--) {
+    //     if (!this.areConsecutive(value[i], value[i - 1])) {
+    //       this.selectedQuarters.splice(i, 1);
+    //       break;
+    //     }
+    //   }
+    // },
+
+    // areConsecutive(a, b) {
+    //   const indexA = this.quarters.findIndex((q) => q.value === a);
+    //   const indexB = this.quarters.findIndex((q) => q.value === b);
+
+    //   return Math.abs(indexA - indexB) === 1;
+    // },
+    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;
+        });
+      }
+    },
+  },
+};

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

@@ -0,0 +1,397 @@
+<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>
+        </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>
+        </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" size="small" style="width: 76px; margin: 0 5px 0 8px"> </el-input>
+          </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">保存</el-button>
+        <el-button type="primary" plain>取消</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,
+    };
+  },
+  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 = num;
+      return num == 0 ? "" : num;
+    },
+    /** */
+    /** */
+
+    // 处理小数点
+    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 = Number(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 = num) : (this.tmeplateObj.FiccProportionTotal = num);
+      return num == 0 ? "" : num;
+    },
+    TotalScoreHandler(item) {
+      let num = 0;
+      item && item.forEach((item) => (num += Number(item.Proportion)));
+      return num + this.tmeplateObj.RaiProportionTotal + this.tmeplateObj.FiccProportionTotal;
+    },
+    /** */
+    /** */
+
+    // 获取模板
+    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 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: this.raiDataHandler(),
+        ListFicc: this.FICCDataHandler(),
+        ListGroup,
+        Ranking: this.rankingValue,
+        IsMergeScoring: this.radioScoring,
+        SecuritiesFirmsName: this.brokerName,
+        MergeProportion: this.mergeProportion ? +this.mergeProportion : 0,
+        ProportionTotal: this.TotalScoreHandler(),
+      };
+      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;
+      }
+    },
+    //
+    async querySearchAsync(query, cb) {
+      cb([]);
+      if (query) {
+        const res = await xClassCustomApi.enterScoreSearchlist({ KeyWord: query });
+        if (res.Ret === 200) {
+          console.log(res);
+          this.querySearchList = res.Data.List.map((_) => {
+            return {
+              ..._,
+              value: _.CompanyName,
+            };
+          });
+          cb(this.querySearchList);
+        }
+      }
+    },
+    // 选择后客户名称的id
+    selectCompanyChange(value) {
+      this.companyId = value.CompanyId;
+    },
+  },
+};
+</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>

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

@@ -0,0 +1,149 @@
+<template>
+  <div class="container entry-records-points">
+    <div>
+      <el-input placeholder="请输入公司名称" v-model="companyName" style="width: 220px" @input="companyHandleSearch" clearable>
+        <i slot="prefix" class="el-input__icon el-icon-search"></i>
+      </el-input>
+      <el-cascader
+        v-model="sales"
+        placeholder="请选择销售"
+        style="width: 200px; marginright: 10px; marginbottom: 8px"
+        :options="salesArr"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        @change="changeSales"
+      >
+      </el-cascader>
+      <el-button type="primary" @click="$router.push('AddNewEntries')"> 新增</el-button>
+    </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 scope="{row}">
+            <span>{{ row.Quarter.join(",") }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="ProportionTotal" label="总分" width="100"> </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 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 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";
+import { async } from "@antv/x6/lib/registry/marker/main";
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {
+      page_no: 1,
+      pageSize: 10,
+      total: 1,
+      tableData: [],
+      companyName: "",
+      sales: "",
+      salesArr: [], //销售
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.getSale();
+    this.getDataList();
+  },
+  methods: {
+    // 公司名称
+    companyHandleSearch() {},
+    /* 获取销售 */
+    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() {
+      const res = await xClassCustomApi.enterScoreList({
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+      });
+      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: "/AddNewEntries",
+        query: { id: item.EnterScoreId },
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.entry-records-points {
+}
+</style>

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

@@ -0,0 +1,76 @@
+<template>
+  <div class="container ranking-overview-content">
+    <div class="select-box">
+      <el-cascader
+        v-model="sales"
+        placeholder="请选择销售"
+        style="width: 200px; margin-right: 10px"
+        :options="salesArr"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        @change="changeSales"
+      >
+      </el-cascader>
+      <el-cascader v-model="valueLocation" collapse-tags :props="{ multiple: true, value: 'name', children: 'city', label: 'name' }" clearable :options="locationOptions" placeholder="请选择城市">
+      </el-cascader>
+    </div>
+  </div>
+</template>
+
+<script>
+import { customInterence } from "@/api/api.js";
+import { locationOptions } from "../customList/location";
+
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {
+      valueLocation: [],
+      sales: "",
+      salesArr: [], //销售
+      defaultSalesProps: {
+        multiple: true,
+        label: "RealName",
+        children: "ChildrenList",
+        value: "AdminId",
+      }, //销售级联配置
+    };
+  },
+  computed: {
+    locationOptions() {
+      return locationOptions;
+    },
+  },
+  watch: {},
+  created() {},
+  mounted() {
+    this.getSale();
+  },
+  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;
+        }
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.ranking-overview-content {
+  .select-box {
+    display: flex;
+  }
+}
+</style>

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

@@ -0,0 +1,487 @@
+<template>
+  <div class="container rating-overview-content">
+    <div class="select-box">
+      <el-select v-model="yearValue" placeholder="请选择年份">
+        <el-option v-for="item in optionsYear" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+      </el-select>
+      <el-select v-model="quarterValue" placeholder="请选择季度">
+        <el-option v-for="item in quarterOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+      </el-select>
+      <el-input placeholder="请输入券商名称" prefix-icon="el-icon-search" v-model="brokerName"> </el-input>
+      <el-cascader v-model="valueLocation" collapse-tags :props="{ multiple: true, value: 'name', children: 'city', label: 'name' }" clearable :options="locationOptions" placeholder="请选择城市">
+      </el-cascader>
+    </div>
+
+    <div class="table-cont">
+      <table>
+        <thead>
+          <tr>
+            <td v-for="(item, index) in tableTheadColumns" :key="item" :class="['head-column', index > 0 && 'head-column-item']">
+              {{ item }}
+            </td>
+          </tr>
+        </thead>
+      </table>
+
+      <div class="table-body-wrapper">
+        <table>
+          <tbody v-for="(item, index) in datalist" :key="index">
+            <tr>
+              <td class="thead-rs">{{ item.ChartPermissionName }}</td>
+              <td v-for="item in 4" :key="item"></td>
+            </tr>
+            <tr v-for="rs in item.List" :key="rs.RealName" class="content-ul">
+              <td>{{ rs.RealName }}</td>
+              <td>{{ rs.TotalRelatedContract }}</td>
+              <td>{{ rs.TotalDispatchPoint }}</td>
+              <td>{{ rs.GroupProportion }}</td>
+              <td>{{ rs.DepartmentProportion }}</td>
+            </tr>
+          </tbody>
+
+          <tfoot></tfoot>
+        </table>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { locationOptions } from "../customList/location";
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {
+      yearValue: "", // 年份
+      optionsYear: [],
+      quarterValue: "", // 季度
+      quarterOptions: [],
+      brokerName: "", // 券商名
+      valueLocation: "", //地址
+      tableTheadColumns: [],
+      datalist: [
+        {
+          ChartPermissionName: "医药",
+          List: [
+            {
+              RealName: "赵璐",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "67.05",
+              GroupProportion: "58.91%",
+              DepartmentProportion: "10.49%",
+            },
+            {
+              RealName: "郭望葳",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "25.15",
+              GroupProportion: "22.10%",
+              DepartmentProportion: "3.93%",
+            },
+            {
+              RealName: "李金泽",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "14.35",
+              GroupProportion: "12.60%",
+              DepartmentProportion: "2.24%",
+            },
+            {
+              RealName: "张天",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "8.75",
+              GroupProportion: "7.68%",
+              DepartmentProportion: "1.36%",
+            },
+            {
+              RealName: "合计",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "113.80/107.5",
+              GroupProportion: "100%",
+              DepartmentProportion: "17.80%",
+            },
+            {
+              RealName: "平均",
+              TotalRelatedContract: 13.25,
+              TotalDispatchPoint: "28.45",
+              GroupProportion: "25%",
+              DepartmentProportion: "4.45%",
+            },
+          ],
+        },
+        {
+          ChartPermissionName: "消费",
+          List: [
+            {
+              RealName: "霍健",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "50.75",
+              GroupProportion: "50.44%",
+              DepartmentProportion: "7.94%",
+            },
+            {
+              RealName: "卢劲",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "16.45",
+              GroupProportion: "16.35%",
+              DepartmentProportion: "2.57%",
+            },
+            {
+              RealName: "周毓",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "11.45",
+              GroupProportion: "11.38%",
+              DepartmentProportion: "1.79%",
+            },
+            {
+              RealName: "周涛",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "10.85",
+              GroupProportion: "10.78%",
+              DepartmentProportion: "1.69%",
+            },
+            {
+              RealName: "丁衡",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "9.85",
+              GroupProportion: "9.79%",
+              DepartmentProportion: "1.54%",
+            },
+            {
+              RealName: "合计",
+              TotalRelatedContract: 11,
+              TotalDispatchPoint: "100.59/107.5",
+              GroupProportion: "100%",
+              DepartmentProportion: "15.74%",
+            },
+            {
+              RealName: "平均",
+              TotalRelatedContract: 12.8,
+              TotalDispatchPoint: "20.11",
+              GroupProportion: "20%",
+              DepartmentProportion: "3.14%",
+            },
+          ],
+        },
+        {
+          ChartPermissionName: "科技",
+          List: [
+            {
+              RealName: "张晶",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "33.48",
+              GroupProportion: "42.72%",
+              DepartmentProportion: "5.23%",
+            },
+            {
+              RealName: "欧阳志宏",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "10.28",
+              GroupProportion: "13.11%",
+              DepartmentProportion: "1.60%",
+            },
+            {
+              RealName: "王修远",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "7.27",
+              GroupProportion: "9.29%",
+              DepartmentProportion: "1.13%",
+            },
+            {
+              RealName: "冯冠儒",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "9.98",
+              GroupProportion: "12.73%",
+              DepartmentProportion: "1.56%",
+            },
+            {
+              RealName: "陈昫锟",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "5.77",
+              GroupProportion: "7.37%",
+              DepartmentProportion: "0.90%",
+            },
+            {
+              RealName: "许晓威",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "5.77",
+              GroupProportion: "7.37%",
+              DepartmentProportion: "0.90%",
+            },
+            {
+              RealName: "李婉月",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "5.77",
+              GroupProportion: "7.37%",
+              DepartmentProportion: "0.90%",
+            },
+            {
+              RealName: "合计",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "78.35/82.5",
+              GroupProportion: "100%",
+              DepartmentProportion: "12.26%",
+            },
+            {
+              RealName: "平均",
+              TotalRelatedContract: 8,
+              TotalDispatchPoint: "11.19",
+              GroupProportion: "14.28%",
+              DepartmentProportion: "1.75%",
+            },
+          ],
+        },
+        {
+          ChartPermissionName: "智造",
+          List: [
+            {
+              RealName: "杨云鹏",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "32.1",
+              GroupProportion: "37.32%",
+              DepartmentProportion: "5.02%",
+            },
+            {
+              RealName: "齐妍",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "20.90",
+              GroupProportion: "24.30%",
+              DepartmentProportion: "3.27%",
+            },
+            {
+              RealName: "钟正宇",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "17.9",
+              GroupProportion: "20.81%",
+              DepartmentProportion: "2.80%",
+            },
+            {
+              RealName: "张振",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "6.8",
+              GroupProportion: "7.90%",
+              DepartmentProportion: "1.06%",
+            },
+            {
+              RealName: "钱程鹏",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "8.3",
+              GroupProportion: "9.65%",
+              DepartmentProportion: "1.29%",
+            },
+            {
+              RealName: "合计",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "86/91.5",
+              GroupProportion: "100%",
+              DepartmentProportion: "13.45%",
+            },
+            {
+              RealName: "平均",
+              TotalRelatedContract: 9,
+              TotalDispatchPoint: "17.2",
+              GroupProportion: "20%",
+              DepartmentProportion: "2.69%",
+            },
+          ],
+        },
+        {
+          ChartPermissionName: "策略",
+          List: [
+            {
+              RealName: "马冬凡",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "20.44",
+              GroupProportion: "49.04%",
+              DepartmentProportion: "3.20%",
+            },
+            {
+              RealName: "马楠",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "4.25",
+              GroupProportion: "10.19%",
+              DepartmentProportion: "0.66%",
+            },
+            {
+              RealName: "王盟",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "4.25",
+              GroupProportion: "10.19%",
+              DepartmentProportion: "0.66%",
+            },
+            {
+              RealName: "王晶晶",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "4.25",
+              GroupProportion: "10.19%",
+              DepartmentProportion: "0.66%",
+            },
+            {
+              RealName: "李方杰",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "4.25",
+              GroupProportion: "10.19%",
+              DepartmentProportion: "0.66%",
+            },
+            {
+              RealName: "王正凯",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "4.25",
+              GroupProportion: "10.19%",
+              DepartmentProportion: "0.66%",
+            },
+            {
+              RealName: "合计",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "41.69/46",
+              GroupProportion: "100%",
+              DepartmentProportion: "6.52%",
+            },
+            {
+              RealName: "平均",
+              TotalRelatedContract: 4,
+              TotalDispatchPoint: "6.94",
+              GroupProportion: "16.66%",
+              DepartmentProportion: "1.08%",
+            },
+          ],
+        },
+        {
+          ChartPermissionName: "买方研选",
+          List: [
+            {
+              RealName: "董衡",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "42.72",
+              GroupProportion: "20.00%",
+              DepartmentProportion: "6.68%",
+            },
+            {
+              RealName: "高亦文",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "42.72",
+              GroupProportion: "20.00%",
+              DepartmentProportion: "6.68%",
+            },
+            {
+              RealName: "吴昂迪",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "42.72",
+              GroupProportion: "20.00%",
+              DepartmentProportion: "6.68%",
+            },
+            {
+              RealName: "冯柯然",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "42.72",
+              GroupProportion: "20.00%",
+              DepartmentProportion: "6.68%",
+            },
+            {
+              RealName: "汪洋",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "42.72",
+              GroupProportion: "20.00%",
+              DepartmentProportion: "6.68%",
+            },
+            {
+              RealName: "合计",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "213.59/199.1",
+              GroupProportion: "100%",
+              DepartmentProportion: "33.42%",
+            },
+            {
+              RealName: "平均",
+              TotalRelatedContract: 41,
+              TotalDispatchPoint: "42.71",
+              GroupProportion: "20%",
+              DepartmentProportion: "6.68%",
+            },
+          ],
+        },
+      ],
+    };
+  },
+  computed: {
+    locationOptions() {
+      return locationOptions;
+    },
+  },
+  watch: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style scoped lang="scss">
+.rating-overview-content {
+  .select-box {
+    display: flex;
+    margin-bottom: 30px;
+  }
+  .table-cont {
+    .table-body-wrapper {
+      max-height: calc(100vh - 340px);
+      margin-right: -6px;
+      overflow-y: scroll;
+      overflow-x: auto;
+      border-bottom: 1px solid #dcdfe6;
+      border-top: 1px solid #dcdfe6;
+    }
+    .head-column-item {
+      width: 15%;
+    }
+    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;
+      }
+    }
+    .content-ul {
+      td {
+        width: 15%;
+      }
+      .association {
+        color: #409eff;
+        cursor: pointer;
+      }
+    }
+  }
+}
+</style>

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

@@ -0,0 +1,91 @@
+<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-input placeholder="合同编号/客户名称/社会信用码" v-model="searchVal" style="width: 520px" @input="handleSearch" clearable>
+            <i slot="prefix" class="el-input__icon el-icon-search"></i>
+          </el-input>
+        </div>
+      </div>
+    </el-card>
+    <el-card style="margin-top: 20px">
+      <EntryRecords ref="recordRefs" :searchVal.sync="searchVal" 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 默认选中
+      searchVal: "",
+    };
+  },
+  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>