Browse Source

续约异常统计

jwyu 1 year ago
parent
commit
eae6185c7c

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

@@ -233,6 +233,11 @@ const dataMainInterface = {
 		return http.get('/statistic_report/report/renew_company',params)
 	},
 
+	// 续约异常客户统计
+	unusualRenewalCustomStatistic: params => {
+		return http.get('/statistic_report/report/unusual_renew_company',params)
+	},
+
 	/**
 	 * 新增客户列表
 	 * @param {} params PageSize CurrentIndex SortParam SortType 	CompanyIds

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

@@ -127,6 +127,22 @@ export default [
 				component: () => import('@/views/custom_manage/saleAuthManage.vue'),
 				hidden: false,
 			},
+			{
+				path:"abnormalRenewal",
+				name: '续约异常统计',
+				component: () => import('@/views/dataReport_manage/statistic/abnormalRenewal.vue'),
+				hidden: false,
+			},
+			{
+				path: 'abnormalRenewalCustomlist',
+				component: () => import('@/views/dataReport_manage/statistic/newCustomlist.vue'),
+				name: '续约异常客户列表',
+				meta: {
+					pathFrom: 'abnormalRenewal',
+					pathName: '续约异常统计' 
+				},
+				hidden: true
+			},
 		]
 	},
 ]

+ 57 - 4
src/views/custom_manage/customList/customShareList.vue

@@ -5,8 +5,20 @@
       <div class="customList_bot_search">
         <div style="margin-bottom: 8px;" v-if="Role=='thisAdmin'">
           <el-select v-model="status" placeholder="请选择状态" @change="getTableData" style="width: 214px; margin-right: 20px;">
-            <el-option :label="item" :value="index" v-for="(item,index) in statusList" :key="index" ></el-option>
+            <el-option :label="item.label" :value="item.value" v-for="(item,index) in statusList" :key="index" ></el-option>
           </el-select>
+		  <el-cascader
+			v-model="originalSales"
+			placeholder="请选择原销售"
+			style="width:240px;marginRight:10px;marginBottom:8px;"
+			:options="originalSalesArr"
+			:props="defaultSalesProps"
+			:show-all-levels="false"
+			collapse-tags
+			clearable
+			filterable
+			@change="getTableData"
+		  />
           <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>
@@ -14,7 +26,19 @@
         </div>
         <div v-else>
             <el-button type="primary" @click="$router.push('/customCityList')">查看同城客户</el-button>
-        </div>
+			<el-cascader
+				v-model="originalSales"
+				placeholder="请选择原销售"
+				style="width:200px;marginRight:10px;marginBottom:8px;"
+				:options="originalSalesArr"
+				:props="defaultSalesProps"
+				:show-all-levels="false"
+				collapse-tags
+				clearable
+				filterable
+				@change="getTableData"
+			/>
+        </div> 
         <el-input 
           placeholder="客户名称/社会信用码/手机号码/邮箱"
           v-model="search_txt"
@@ -468,7 +492,7 @@ export default {
 	},
 	data () {
 
-		this.statusList = ['全部','已分配','待分配']
+		this.statusList = [{label:'未共享',value:3},{label:'已分配',value:1},{label:'待分配',value:2}]
 		return {
 			adminId:localStorage.getItem('AdminId'),
 			sales:[],
@@ -523,12 +547,29 @@ export default {
 			completeForm:{},
 			isAddTrial:false,
 			authList:[],
+
+			originalSales:'',
+			originalSalesArr:[],
+			defaultSalesProps:{
+				multiple: true,
+				label:'RealName',
+				children:'ChildrenList',
+				value:'AdminId'
+			},//销售级联配置
 		};
 	},
 	methods: {
 		/* 获取表格 */
 		getTableData() {
 			this.isShowloadding = true;
+			// 处理销售筛选
+			let salesArr=[]
+			if(this.sales.length){
+				salesArr=this.sales.map(item=>{
+					return item[item.length-1]
+				})
+			}
+
 			let params = {
 				SortParam:this.sort_param,//自定义排序字段
 				SortType:this.sort_type,//排序方式
@@ -536,7 +577,8 @@ export default {
 				CurrentIndex:this.page_no,
 				Keyword:this.search_txt,
 				ListParam:this.Role=='thisSeller'?1:this.status, // 销售只能看分配给自己的共享客户,即状态需要是已分配
-				SellerId:this.sales.join(',')
+				SellerId:this.sales.join(','),
+				OriginalSellerId:salesArr.join(','),
 			}
 			customInterence.getShareCustomList(params).then(res => {
 				if(res.Ret === 200) {
@@ -944,9 +986,20 @@ export default {
 			this.addTryId = item.CompanyId;
 			this.isAddTrial = true;
 		},
+
+		/* 获取销售 */
+		getoriginalSale() {
+			let status=0;
+			customInterence.getSale({"Status":status}).then(res => {
+				if(res.Ret === 200) {
+					this.originalSalesArr = res.Data.List||[];
+				}
+			})
+		},
 	},
 	created() {
 		this.getSale()
+		this.getoriginalSale()
 		this.getTableData()
 	}
 }

+ 158 - 0
src/views/dataReport_manage/statistic/abnormalRenewal.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="statistic-container" ref="reference">
+        <div class="frequency-cont">
+			<ul class="frequency-ul">
+				<li v-for="tab in staticTabs" :key="tab" :class="{act: tab=== default_tab}" @click="changeTabHandle(tab)">{{ tab }}</li>
+			</ul>
+			<date-picker
+                v-model="select_date"
+                type="date" 
+                range
+                value-type="format"
+                :clearable="false"
+                @change="dateChange"
+                placeholder="请选择统计时间"
+            />
+            <span style="color:#A3A3A3;display:inline-block;margin-left:20px">续约异常:合同到期后两个月内未签约</span>
+        </div>
+        <div class="table-cont" v-show="dataLoading">
+            <div class="table-body-wrapper">
+                <table>
+                    <thead>
+						<tr>
+							<td class="thead-rs">销售</td>
+                            <td 
+                                v-for="item in tableThead"
+								:key="item" 
+								class="head-column"
+                            >{{item}}</td>
+						</tr>
+					</thead>
+                    <tbody>
+                        <tr v-for="rs in sellerList" :key="rs.SellerId">
+                            <td class="thead-rs">{{rs.SellerName}}</td>
+                            <td 
+								:class="['data-cell',{link: data.UnusualRenewNum}]" 
+								v-for="data,index in rs.CompanyRenewRecordNumList" 
+								:key="data.UnusualRenewIds"
+							>		
+								<span 
+									@click="goList(data,index,rs)"
+								>
+									{{ data.UnusualRenewNum !== 0 ? data.UnusualRenewNum : '' }}
+								</span>
+							</td>
+                        </tr>
+                    </tbody>
+                    <tfoot>
+                        <tr>
+                            <td>合计</td>
+                            <td 
+                                :class="['data-cell',{link: item.UnusualRenewNum}]" 
+                                v-for="item,index in summaryList" 
+                                :key="item.UnusualRenewIds"
+                            >
+                                <span
+                                    @click="goList(item,index,{SellerName:'合计'})"
+                                >
+                                    {{item.UnusualRenewNum||''}}
+                                </span>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <span>异常率</span>
+                                <el-tooltip 
+									effect="dark" 
+									placement="top-start" 
+									content="异常率=当期续约异常客户总数/截止当期系统中存量客户总数"
+								>
+									<i class="el-icon-info"/>
+								</el-tooltip>
+                            </td>
+                            <td v-for="item in summaryList" :key="item.UnusualRenewIds">{{item.UnusualRate||''}}</td>
+                        </tr>
+                    </tfoot>
+                </table>
+            </div>
+        </div>
+
+    </div>
+</template>
+
+<script>
+import { dataMainInterface } from '@/api/api.js';
+import mixin from './mixin';
+export default {
+    name:'abnormalRenewal',
+    mixins: [ mixin ],
+    computed:{
+        tableThead:function(){
+            if(['周度统计表','月度统计表'].includes(this.default_tab)){
+                return this.tableTheadColumns
+            }
+            return ['续约异常']
+        }
+    },
+
+    data() {
+        return {
+            sellerList:[],
+            summaryList:[]
+        }
+    },
+    created() {
+        this.getTableData()
+    },
+    methods:{
+
+        getTableData(){
+            this.dataLoading=true
+            dataMainInterface.unusualRenewalCustomStatistic({
+                DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month' : 'time_interval',
+				StartDate: this.select_date ? this.select_date[0] : '',
+				EndDate: this.select_date ? this.select_date[1] : '',
+            }).then(res=>{
+                const { Data,Ret } = res;
+				if(Ret !== 200) return
+                this.sellerList=Data.List||[]
+                this.summaryList=Data.SummaryList||[]
+            })
+        },
+
+        /* 进入列表 */
+        goList({UnusualRenewNum,UnusualRenewIds},index,parent) {
+            // if(!value) return
+            let column_title = this.getColumnTitle(index);
+            let title=encodeURIComponent(`${column_title}/${parent.SellerName}`);
+                    
+            sessionStorage.setItem('renewalTab',this.activeTab.tabName)
+            const{href}=this.$router.resolve({
+                path: '/abnormalRenewalCustomlist',
+                query: {
+                    ids: encodeURIComponent(UnusualRenewIds),
+                    title
+                }
+            })
+            window.open(href,'_blank')
+        },
+
+        /* 获取数据对应表头 */
+        getColumnTitle(index) {
+			let title = '';
+
+			if(['周度统计表','月度统计表'].includes(this.default_tab)) {
+				title=this.tableTheadColumns[index] 
+			} else {
+				title = this.default_tab || `${this.select_date[0]}~${this.select_date[1]}`;
+			}
+			
+			return title
+		}
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

+ 100 - 22
src/views/dataReport_manage/statistic/contractCustom.vue

@@ -99,34 +99,40 @@
 							<td rowspan="2" class="thead-rs">组别</td>
 							<td rowspan="2" class="thead-rs">销售</td>
 							<td rowspan="2" class="thead-rs-typeTwo">
-				未续约
-				<el-tooltip 
+								未续约
+								<el-tooltip 
 									effect="dark" 
 									placement="top-start" 
 									:content="tipMap.get('未续约')"
-					v-if="['周度统计表'].includes(default_tab)"
 								>
-					<i class="el-icon-info"/>
+									<i class="el-icon-info"/>
 								</el-tooltip>
-				</td>
+							</td>
 							<td rowspan="2" class="thead-rs-typeTwo">
-				续约跟进
-				<el-tooltip 
+								续约跟进
+								<el-tooltip 
 									effect="dark" 
 									placement="top-start" 
 									:content="tipMap.get('续约跟进')"
-					v-if="['周度统计表'].includes(default_tab)"
 								>
-					<i class="el-icon-info"/>
+									<i class="el-icon-info"/>
 								</el-tooltip>
-				</td>
+							</td>
 							<td
-								:colspan="['周度统计表','月度统计表'].includes(default_tab) ? 2 : 1"
+								:colspan="['周度统计表','月度统计表'].includes(default_tab) ? activeTab.tabName !== 'QY'? 3:2 : 1"
 								v-for="item in contractTableThead"
 								:key="item" 
 								class="head-column"
 							>
 								{{item}}
+								<el-tooltip 
+									effect="dark" 
+									placement="top-start"
+									v-if="!['周度统计表','月度统计表'].includes(default_tab)"
+									:content="tipMap.get(item)"
+								>
+									<i class="el-icon-info"/>
+								</el-tooltip>
 							</td>	
 						</tr>
 						<tr v-if="['周度统计表'].includes(default_tab)">
@@ -153,12 +159,54 @@
 										<i class="el-icon-info"/>
 									</el-tooltip>
 								</td>
+								<td :key="index+'_2'" v-if="activeTab.tabName !== 'QY'">
+									续约异常
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('续约异常')"
+									>
+										<i class="el-icon-info"/>
+									</el-tooltip>
+								</td>
 							</template>
 						</tr>
 						<tr v-else-if="['月度统计表'].includes(default_tab)">
 							<template v-for="(item,index) in new Array(6).fill('')">
-								<td :key="index+'_0'">到期</td>
-								<td :key="index+'_1'">续约</td>
+								<td :key="index+'_0'">
+									到期
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('到期')"
+									>
+										<i class="el-icon-info"/>
+									</el-tooltip>
+								</td>
+								<td :key="index+'_1'">
+									续约
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('续约')"
+									>
+										<i class="el-icon-info"/>
+									</el-tooltip>
+								</td>
+								<td :key="index+'_2'" v-if="activeTab.tabName !== 'QY'">
+									续约异常
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('续约异常')"
+									>
+										<i class="el-icon-info"/>
+									</el-tooltip>
+								</td>
 							</template>
 						</tr>
 					</thead>
@@ -222,6 +270,30 @@
 								</span>
 							</td>
 						</tr>
+						<tr v-if="activeTab.tabName !== 'QY'">
+							<td colspan="2">
+								<span>异常率</span>
+								<el-tooltip 
+									effect="dark" 
+									placement="top-start" 
+									:content="tipMap.get('异常率')"
+								>
+									<i class="el-icon-info"/>
+								</el-tooltip>
+							</td>
+							<td>
+								<span></span>
+							</td>
+							<td>
+								<span></span>
+							</td>
+							<template v-if="['周度统计表','月度统计表'].includes(default_tab)">
+								<td v-for="(item,index) in UnusualRateArr" :key="index" colspan="3">{{item.UnusualRate}}</td>
+							</template>
+							<template v-else>
+								<td colspan="3">{{UnusualRateArr[0].UnusualRate}}</td>
+							</template>
+						</tr>
 					</tfoot>
 				</table>
 			</div>	
@@ -238,14 +310,18 @@ export default {
   mixins: [ mixin ],
   data() {
     return {
-      tipMap:new Map([
-        ['未续约','之前是正式客户,现在是冻结或流失状态的客户'],
-        ['续约跟进','之前是正式客户,现在是试用状态且未经历过冻结或流失状态的客户'],
-        ['到期','合同到期时间在统计时间段内的客户'],
-        ['续约','续约申请审批通过时间在所选时间段内的客户']
-      ]),
-			notRenewNumAll:0, // 未续约总合计
-			renewFollowNumAll:0, // 续约跟进总合计
+      	tipMap:new Map([
+			['未续约','之前是正式客户,现在是冻结或流失状态的客户'],
+			['续约跟进','之前是正式客户,现在是试用状态且未经历过冻结或流失状态的客户'],
+			['到期','合同到期时间在统计时间段内的客户'],
+			['续约','续约申请审批通过时间在所选时间段内的客户'],
+			['续约异常','合同到期后两个月内未签约 '],
+			['异常率','异常率=当期续约异常客户总数/截止当期系统中存量客户总数']
+
+		]),
+		notRenewNumAll:0, // 未续约总合计
+		renewFollowNumAll:0, // 续约跟进总合计
+		UnusualRateArr:[],
     }
   },
   computed:{
@@ -253,7 +329,7 @@ export default {
       if(['周度统计表','月度统计表'].includes(this.default_tab)){
         return this.tableTheadColumns
       }
-      return  ['到期','续约']
+      return this.activeTab.tabName !== 'QY'?['到期','续约','续约异常']:['到期','续约']
     }
   },
   created(){
@@ -281,6 +357,8 @@ export default {
 				this.totalGroupArr = this.filterTableData(Data.CompanyRenewRecordNumList,{},'renew');
 				this.notRenewNumAll = Data.CompanyRenewRecordNumList[0].NotRenewNum
 				this.renewFollowNumAll = Data.CompanyRenewRecordNumList[0].RenewFollowNum
+				// 异常率处理
+				this.UnusualRateArr= Data.CompanyRenewRecordNumList||[]
 				//处理数据结构
 				let data = []
 				if(this.activeTab.productionId ==1){

+ 52 - 13
src/views/dataReport_manage/statistic/mixin.js

@@ -133,20 +133,59 @@ export default {
 					}
 				]))
 			}else if(type == 'renew'){
-				list = data.map(item => ([
-					{
-						key: '到期',
-						value: item.ExpireNum,
-						ids: item.ExpireIds,
-						...other_param
-					},
-					{
-						key: '续约',
-						value:item.RenewNum,
-						ids: item.RenewIds,
-						...other_param
+				list=data.map(item=>{
+					if(this.activeTab.tabName !== 'QY'){
+						return [
+							{
+								key: '到期',
+								value: item.ExpireNum,
+								ids: item.ExpireIds,
+								...other_param
+							},
+							{
+								key: '续约',
+								value:item.RenewNum,
+								ids: item.RenewIds,
+								...other_param
+							},
+							{
+								key: '续约异常',
+								value:item.UnusualRenewNum,
+								ids: item.UnusualRenewIds,
+								...other_param
+							}
+						]
+					}else{
+						return [
+							{
+								key: '到期',
+								value: item.ExpireNum,
+								ids: item.ExpireIds,
+								...other_param
+							},
+							{
+								key: '续约',
+								value:item.RenewNum,
+								ids: item.RenewIds,
+								...other_param
+							},
+						]
 					}
-				]))
+				})
+				// list = data.map(item => ([
+				// 	{
+				// 		key: '到期',
+				// 		value: item.ExpireNum,
+				// 		ids: item.ExpireIds,
+				// 		...other_param
+				// 	},
+				// 	{
+				// 		key: '续约',
+				// 		value:item.RenewNum,
+				// 		ids: item.RenewIds,
+				// 		...other_param
+				// 	}
+				// ]))
 			}else if(type==='ficcproduct'){
 				list = data.map(item => ([
 					{

+ 42 - 3
src/views/dataReport_manage/statistic/newCustom.vue

@@ -96,13 +96,52 @@
 								class="head-column"
 							>
 								{{item}}
+								<el-tooltip 
+									effect="dark" 
+									placement="top-start"
+									v-if="!['周度统计表','月度统计表'].includes(default_tab)"
+								>
+									<i class="el-icon-info"/>
+									<div slot="content" v-html="tipMap.get(item==='试用'?item:`${item}${activeTab.productionId}`)"></div>
+								</el-tooltip>
 							</td>	
 						</tr>
 						<tr v-if="['月度统计表'].includes(default_tab)">
 							<template v-for="(item,index) in new Array(6).fill('')">
-								<td :key="index+'_0'">试用</td>
-								<td :key="index+'_1'">活跃</td>
-								<td :key="index+'_2'">正式</td>
+								<td :key="index+'_0'">
+									试用
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('试用')"
+									>
+										<i class="el-icon-info"/>
+									</el-tooltip>
+								</td>
+								<td :key="index+'_1'">
+									活跃
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('活跃'+activeTab.productionId)"
+									>
+										<i class="el-icon-info"/>
+										<div slot="content" v-html="tipMap.get('活跃'+activeTab.productionId)"></div>
+									</el-tooltip>
+								</td>
+								<td :key="index+'_2'">
+									正式
+									<el-tooltip 
+										effect="dark" 
+										placement="top-start" 
+										v-if="index === 0"
+										:content="tipMap.get('正式'+activeTab.productionId)"
+									>
+										<i class="el-icon-info"/>
+									</el-tooltip>
+								</td>
 							</template>
 						</tr>
 						<tr v-else-if="['周度统计表'].includes(default_tab)">

+ 0 - 3
src/views/dataReport_manage/statistic/todoTask.vue

@@ -106,7 +106,6 @@
 										effect="dark" 
 										placement="top-start"
 										content="截止日期小于等于今天的未完成To Do任务统计"
-										v-if="['周度统计表'].includes(default_tab)"
 									>
 										<i class="el-icon-info"/>
 									</el-tooltip>
@@ -119,7 +118,6 @@
 										effect="dark" 
 										placement="top-start"
 										content="进行中且未到截止日期的To Do任务统计"
-										v-if="['周度统计表'].includes(default_tab)"
 									>
 										<i class="el-icon-info"/>
 									</el-tooltip>
@@ -132,7 +130,6 @@
 										effect="dark" 
 										placement="top-start"
 										content="该销售累计完成To Do任务数量"
-										v-if="['周度统计表'].includes(default_tab)"
 									>
 										<i class="el-icon-info"/>
 									</el-tooltip>