56 Commits

Author SHA1 Message Date
8501416382 kpi总览界面,拒单明细type值遗漏补充 2025-09-19 15:25:31 +08:00
ce81490703 kpi总览界面,数据NAN解决 2025-09-18 15:11:46 +08:00
e54e36a4bc kpi总览界面,隐藏两个平安的指标 2025-09-17 21:59:16 +08:00
2e0f372a9b task#9508 大力神更名为随车吊平板车的相关问题 2025-09-17 10:23:30 +08:00
740ad98a99 实名认证接口加参数ump:1 2025-09-15 13:17:41 +08:00
ecc6e23663 VConsole调试删除 2025-09-15 08:58:50 +08:00
6dcc59ea2d 实名认证链接decode测试 2025-09-12 11:43:57 +08:00
f897506e86 实名认证调整 2025-09-12 11:14:41 +08:00
06d530fada 认证页的返回都调转列表页 2025-09-12 11:10:43 +08:00
3f64c42fbf 实名认证返回参数丢失测试解决 2025-09-12 11:01:33 +08:00
1b62e6eebf kpi界面,月日师傅二级tab设为一样 2025-09-12 10:59:19 +08:00
074575b703 kpi界面,月日师傅二级tab设为一样 2025-09-12 10:58:15 +08:00
6d5a91279a 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:38:35 +08:00
e9c3befe50 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:35:40 +08:00
91f14b9389 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:33:01 +08:00
a6dcd9ef03 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:27:17 +08:00
77d8bbf27c 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:21:55 +08:00
4c90532462 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:18:55 +08:00
204d6b354f 实名认证页,认证结果esignFlag做缓存 2025-09-12 10:16:17 +08:00
91aa8f3f05 实名认证页返回都到列表页 2025-09-12 09:22:29 +08:00
9f2b343662 实名认证页代码优化 2025-09-11 23:07:46 +08:00
e02456e807 实名认证页代码优化 2025-09-11 22:35:20 +08:00
ad0094fda2 认证页增加双击不放大功能,滚动条丝滑滚动优化 2025-09-11 17:30:47 +08:00
87263991ff 认证页下一步添加接口 2025-09-11 16:59:10 +08:00
415a0be018 CRM_25-09-25#story#7216,车辆信息梳理的需求-“公车”的服务内容调整 2025-09-11 16:05:08 +08:00
7aefcd8141 kpi催促明细,添加催促次数 2025-09-11 15:58:50 +08:00
6eb407d956 实名认证esignFlag缓存添加 2025-09-11 14:58:07 +08:00
7cfa03bf74 实名认证操作成功后返回到认证列表页 2025-09-11 14:48:37 +08:00
b7ee2bb3d7 实名认证界面加缓存数据 2025-09-11 14:42:49 +08:00
066abdeeb0 救援职业责任险 2025-09-11 14:36:38 +08:00
3b8837ce68 实名认证界面加缓存数据 2025-09-11 14:25:16 +08:00
8f730c7d04 实名认证接口加token参数 2025-09-11 13:05:01 +08:00
56046dc878 实名认证加token参数 2025-09-11 11:52:03 +08:00
da9cc2f588 实名认证加token参数 2025-09-11 11:50:09 +08:00
ab7593ae2d 车辆服务刷新问题 2025-09-11 09:49:06 +08:00
3a7c06ff2f story#7189,跳转加token参数 2025-09-10 16:42:14 +08:00
ab82fa04a6 story#7189,高度调整 2025-09-10 16:09:08 +08:00
695ce00a66 story#7131:调度APP车辆管理功能调整的需求-新增搜索和筛选功能 2025-09-10 15:12:52 +08:00
c6c6f9e6a9 story#7189,type默认'full' 2025-09-10 13:38:52 +08:00
65e5bd2814 kpi率乘以一百 2025-09-10 10:17:11 +08:00
f008ef0d09 kpi字段替换 2025-09-10 10:17:11 +08:00
5ffa3f3d9e 平安聚合时效 2025-09-10 10:17:11 +08:00
1a15772f08 story#7189,认证页radio回显处理 2025-09-10 09:20:41 +08:00
8f066a7bbf kpi首页添加综合打分项 2025-09-10 09:19:38 +08:00
d3e91f584f story#7189,回程车小程序司机端-迁移认证,跳转新的url 2025-09-09 16:59:56 +08:00
d04ed28ec2 story#7189,回程车小程序司机端-迁移认证,添加调试 2025-09-09 16:52:42 +08:00
36db96808a story#7189,回程车小程序司机端-迁移认证 2025-09-09 16:39:28 +08:00
781ef75913 story#7189,回程车小程序司机端-迁移认证页面 2025-09-09 13:33:44 +08:00
e7b0cfb006 司机端培训资料,关键字接受字段更换,切换优化加loading 2025-09-09 13:33:32 +08:00
57b4bc2e59 司机端培训资料,关键字接受字段更换,切换优化加loading 2025-09-09 13:32:12 +08:00
990db65d25 story#7189,回程车小程序司机端-迁移认证页面 2025-09-09 11:01:04 +08:00
cebb173ec4 三分钟联系客户率 2025-09-09 10:37:47 +08:00
8968f4caa9 好评率好评量删除 2025-09-09 10:35:52 +08:00
40ab15266a 车辆信息,修改并且自测 2025-09-08 13:09:10 +08:00
6bc55d7b89 story#7149,服务商KPI模块界面调整 2025-09-05 11:14:12 +08:00
06191163a2 服务商KPI 2025-09-04 09:52:08 +08:00
5 changed files with 820 additions and 213 deletions

View File

@ -32,6 +32,10 @@
</script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=2560bbf04daef66c810c5e6a97e8c508&plugin=AMap.AutoComplete,AMap.PlaceSearch,AMap.Geolocation,AMap.Geocoder,AMap.Marker,AMap.Driving"></script>
<!-- <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>-->
<script>
window.selfLink = window.location.href;
window.selfSearch = window.location.search;
</script>
<script>
// VConsole 默认会挂载到 `window.VConsole` 上
// let vConsole = new window.VConsole();

View File

@ -72,7 +72,7 @@
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>车辆类</span>
<span>车辆类</span>
</div>
<!--
<select
@ -111,6 +111,29 @@
</el-select>
</div>
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>车辆属性</span>
</div>
<el-select
v-model="virtualVehicle"
value-key="name"
class="elSelect"
collapse-tags="collapse-tags"
placeholder="请选择" style="width: 55%"
>
<el-option
v-for="item in virtualVehicleOptions"
:key="item.name"
:label="item.name"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="lineBot"></div>
<div class="itemContent">
<div class="titleType">
<span>牌照</span>
@ -134,7 +157,7 @@
</div>
<div class="lineBot"></div>
<div class="itemContent">
<!--<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>是否参与聚合</span>
@ -160,7 +183,115 @@
</van-radio-group>
</div>
</div>
<div class="lineBot"></div>-->
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>车辆状态</span>
</div>
<div class="isJoin">
<van-radio-group v-model="vehicleStatus" @change="isVehicleChange" class="joinWrap">
<van-radio :name="1" style="margin-right: 26px">
启用
<img
slot="icon"
slot-scope="props"
:src="props.checked ? activeIcon : inactiveIcon"
>
</van-radio>
<van-radio :name="2">
停用
<img
slot="icon"
slot-scope="props"
:src="props.checked ? activeIcon : inactiveIcon"
>
</van-radio>
</van-radio-group>
</div>
</div>
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>救援职业责任险</span>
</div>
<div class="isJoin">
<van-radio-group v-model="hasLiabilityInsurance" @change="isChange" class="joinWrap">
<van-radio :name="1" style="margin-right: 26px">
<img
slot="icon"
slot-scope="props"
:src="props.checked ? activeIcon : inactiveIcon"
>
</van-radio>
<van-radio :name="0">
<img
slot="icon"
slot-scope="props"
:src="props.checked ? activeIcon : inactiveIcon"
>
</van-radio>
</van-radio-group>
</div>
</div>
<div class="lineBot"></div>
<template v-if="hasLiabilityInsurance == 1">
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>保单</span>
</div>
<van-uploader
v-model="insurancePictureFiles"
:after-read="insurancePictureFilesHandler"
max-count="1"
:preview-size="54"
accept="image "
/>
</div>
<div class="lineBot"></div>
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>承保保司</span>
</div>
<el-select
v-model="insuranceCorp"
value-key="name"
class="elSelect"
collapse-tags="collapse-tags"
placeholder="请选择" style="width: 55%"
>
<el-option
v-for="item in insuranceOptions"
:key="item.name"
:label="item.name"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="lineBot"></div>
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>保险有效期</span>
</div>
<el-input style="width: 55%" readonly @focus="showDatePicker = true" v-model="dateVal" placeholder="请选择发布日期" :class="{'customSel':true,'customInput':true , 'has-value': dateVal }" >
<template #suffix>
<i
v-if="dateVal"
class="el-icon-circle-close el-input__icon"
@click="dateVal = ''"
></i>
</template>
</el-input>
</div>
</template>
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
@ -168,8 +299,16 @@
</div>
</div>
<div class="serviceType">
<div class="trailerService" v-for="(item,index) in supplierServiceList" :key="index">
<el-tree
show-checkbox
node-key="id"
ref="tree"
:highlight-current="true"
:expand-on-click-node="false"
:data="supplierServiceList"
:props="defaultProps">
</el-tree>
<!--<div class="trailerService" v-for="(item,index) in supplierServiceList" :key="index">
<div class="serviceline" @click="loadAll(index)">
<img :ref="'serviceline' + index" :src="imageUrl" style="width: 20px;height: 15px" >
<span class="service">{{ item.name }}:</span>
@ -180,16 +319,19 @@
<van-checkbox class="item" :name="item2.id">{{item2.name }}</van-checkbox>
</van-checkbox-group>
</div>
</div>
</div>-->
</div>
<two-common-btn class="btn" @cancelClick="h5GoBack" @submitClick="submitBtn" />
<van-calendar v-model="showDatePicker" :min-date="minDate"
:max-date="maxDate" type="range" @confirm="onConfirm" />
</div>
</div>
</template>
<script>
// uploadImage
import {Dialog} from "vant";
import {formatDate1} from "@/utils/common"
import {myMixins} from "@/utils/myMixins"
import {vehicleTypeList,saveVehicle,getInfoById,supplierServiceTree, uploadImage, ocrHandler} from "@/api/mine"
import TwoCommonBtn from "@/components/twoBtnCommon.vue"
@ -199,8 +341,20 @@ export default {
mixins:[myMixins],
data(){
return{
defaultProps: {
children: 'children',
label: 'name'
},
minDate: new Date(1970, 0, 1), // 设置最小可选日期1970年1月1日
maxDate: new Date(2099, 11, 31), // 设置最大可选日期2099年12月31日
checkList: [],
virtualVehicle: '',
vehicleStatus: '',
showDatePicker: false,
dateVal: '',
trailerService: '',//拖车服务
isJoin:'',//是否参与
hasLiabilityInsurance: '', // 有无责任险
activeIcon: require('@/assets/check.png'),
inactiveIcon: require('@/assets/uncheck.png'),
// result: [],
@ -218,15 +372,18 @@ export default {
vehicleLicenseBackList: [],
vehicleLicenseCarPhotoList: [],
vehicleFrontPhotoList: [],
insurancePictureFiles: [],
vehicleLicenseFront: '', // 行驶证首页
vehicleLicenseBack: '', // 行驶证副页
vehicleLicenseCarPhoto: '', // 行驶证车辆照片
vehicleFrontPhoto: '', // 车头照
insurancePicturePhoto: '', // 保单照片
vehicleLicenseInfo: {},
vehicleLicenseBackOcrFlag: false, // 行驶证副页 修改时默认不需要 ocr识别
isMultiple: false, // 是否支持多选
vehicleLicense:'',//牌照
vehicleFrontLicensePlate:'',//车头照车牌号码
insuranceCorp: '',
vehicleTypes:[{
name: '小修车',
value: 1
@ -244,7 +401,7 @@ export default {
name:'牵引车',
value: 5 },
{
name:'大力神',
name:'随车吊平板车',
value:6},
{
name:'充电车',
@ -275,6 +432,62 @@ export default {
}, {
name: '其他',
value: 5
}],
virtualVehicleOptions: [{
name: '自有车辆',
value: 1
}, {
name: '挂靠车辆',
value: 2
}, {
name: '虚拟车辆',
value: 3
}, {
name: '借入车辆',
value: 4
}],
insuranceOptions: [{
name: '太平洋',
value: 1
}, {
name: '人保',
value: 2
}, {
name: '平安',
value: 3
}, {
name: '中华联合',
value: 4
}, {
name: '大地',
value: 5
}, {
name: '阳光',
value: 6
}, {
name: '太平',
value: 7
}, {
name: '人寿',
value: 8
}, {
name: '永安',
value: 9
}, {
name: '华安',
value: 10
}, {
name: '申能',
value: 11
}, {
name: '大家',
value: 12
}, {
name: '富德',
value: 13
}, {
name: '其他',
value: 14
}]
}
},
@ -297,7 +510,7 @@ export default {
this.vehicleTypes[8].disabled=false
this.vehicleTypes[9].disabled=false
}
if (newVal == 1 || newVal == 7){
if (newVal == 1 || newVal == 7 || newVal == 9){
let arr = []
this.supplierServiceList.forEach((item)=>{
if(!(item.name == '拖车服务' || item.name == '大型车救援')){
@ -321,6 +534,25 @@ export default {
}
},
methods:{
formatDate(date) {
return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
},
onConfirm(date) {
const [start, end] = date;
this.showDatePicker = false;
this.dateVal = `${this.formatDate(start)} - ${this.formatDate(end)}`;
},
formatDateTimeRange(str) {
const [startStr, endStr] = str.split(' - ').map(s => s.trim());
const startDate = new Date(startStr);
const startTime = `${startDate.getFullYear()}-${(startDate.getMonth() + 1).toString().padStart(2, '0')}-${startDate.getDate().toString().padStart(2, '0')} 00:00:00`;
const endDate = new Date(endStr);
const endTime = `${endDate.getFullYear()}-${(endDate.getMonth() + 1).toString().padStart(2, '0')}-${endDate.getDate().toString().padStart(2, '0')} 23:59:59`;
return {
startTime,
endTime
};
},
setDefault() {
if( this.vehicleLicenseInfo?.vehicleType?.includes('小型') || this.vehicleLicenseInfo?.vehicleType?.includes('微型') || this.vehicleLicenseInfo?.vehicleType?.includes('普通') || this.vehicleLicenseInfo?.vehicleType?.includes('摩托') ) {
this.vehicleTypes.map(item => {
@ -379,6 +611,12 @@ export default {
this.vehicleFrontPhoto = res.data;
await this.ocrCarFrontHandler()
},
async insurancePictureFilesHandler(file) {
const formData = new FormData();
formData.append("file" , file.file);
let res = await uploadImage(formData);
this.insurancePicturePhoto = res.data;
},
async ocrCarFrontHandler() { // 车辆正面 orc 识别
let res = await ocrHandler({
ocrType: 10,
@ -493,14 +731,22 @@ export default {
this.selectedOption=result.vehicleType?.split(',').map((item)=>{
return Number(item);
});
this.serviceIds=result.serviceIds
this.virtualVehicle = result.virtualVehicle;
this.$refs.tree.setCheckedKeys(result.serviceIds)
this.vehicleStatus = result.vehicleStatus
this.vehicleLicenseFront = result.vehicleLicenseFront;
this.vehicleLicenseBack = result.vehicleLicenseBack;
this.vehicleFrontPhoto = result.vehicleFrontPhoto;
this.insurancePicturePhoto = result.insurancePicturePhoto;
this.vehicleLicenseInfo = result.vehicleLicenseInfo;
this.vehicleLicenseCarPhoto = result.vehicleLicenseCarPhoto;
this.vehicleLicense = result.vehicleLicense;
this.vehicleFrontLicensePlate = result.vehicleFrontLicensePlate;
this.hasLiabilityInsurance = result.hasLiabilityInsurance
this.insuranceCorp = result.insuranceCorp;
if(this.insurancePicturePhoto) {
this.insurancePictureFiles = [{url: this.insurancePicturePhoto}]
}
if( this.vehicleLicenseFront ) {
this.vehicleLicenseFrontList = [{ url : this.vehicleLicenseFront }];
}
@ -513,9 +759,28 @@ export default {
if(this.vehicleLicenseCarPhoto) {
this.vehicleLicenseCarPhotoList = [{ url : this.vehicleLicenseCarPhoto }];
}
if(this.vehicleLicenseCarPhoto) {
this.vehicleLicenseCarPhotoList = [{ url : this.vehicleLicenseCarPhoto }];
}
if( result.liabilityInsuranceEndTime && result.liabilityInsuranceStartTime ) {
this.dateVal = formatDate1(result.liabilityInsuranceStartTime) + ' - ' + formatDate1(result.liabilityInsuranceEndTime)
}
},
isChange(e){
this.isJoin=e
this.hasLiabilityInsurance=e
if (e === 0) {
Dialog.confirm({
title: '提醒',
message: '有救援职业责任险车辆会提升案件聚合能力和接单能力。',
confirmButtonText: '我已知晓', // 确认按钮文字,默认为“确认”
showCancelButton: false // 是否显示取消按钮,默认为 true。如果不需要取消按钮可以设置为 false。
})
.then(() => { /* 确认后的操作 */ })
.catch(() => { /* 取消后的操作 */ });
}
},
isVehicleChange(e) {
this.vehicleStatus=e
},
async submitBtn(){
if( !this.vehicleLicenseFront ) {
@ -543,18 +808,47 @@ export default {
return
}
if(!(this.selectedOption.length > 0)){
this.$toast('车辆类不能为空')
this.$toast('车辆类不能为空')
return
}
if( !this.virtualVehicle ) {
this.$toast('车辆属性不能为空')
return
}
if( !this.vehicleStatus ) {
this.$toast('车辆状态不能为空')
return
}
if(this.hasLiabilityInsurance === null || this.hasLiabilityInsurance === undefined || this.hasLiabilityInsurance === '') { // 有职业责任险,就需要有保单照片
this.$toast('救援职业责任险不能为空')
return
}
if(!this.insurancePicturePhoto && this.hasLiabilityInsurance == 1) { // 有职业责任险,就需要有保单照片
this.$toast('保单照片不能为空')
return
}
if(this.selectedOption?.length==1 && this.selectedOption.includes(1)){//选择小修车时需清除原本的拖车服务类型
let data=this.oldSupplierServiceList.filter(item => item.name ==='拖车服务')
this.serviceIds = this.serviceIds.filter(item => !data[0].children.some(obj => obj.id === item));
}
if(!this.insuranceCorp && this.hasLiabilityInsurance == 1) { // 有职业责任险,就需要有保单照片
this.$toast('承保保司不能为空')
return
}
if(!this.dateVal && this.hasLiabilityInsurance == 1) { // 有职业责任险,就需要有保单照片
this.$toast('保单有效期不能为空')
return
}
let timeObj;
if(this.dateVal) {
timeObj = this.formatDateTimeRange(this.dateVal)
}
this.serviceIds = this.$refs.tree.getCheckedKeys(true)
await saveVehicle({
vehicleId:this.id ? this.id : '',
plateNumber:this.carNum ? this.carNum :'',
vehicleType:this.selectedOption?.length>0 ? this.selectedOption.join(',') : '',
hasPolymerization:this.isJoin,
// hasPolymerization:this.isJoin,
serviceIds:this.serviceIds ? this.serviceIds : [],
vehicleLicenseFront: this.vehicleLicenseFront,
vehicleLicenseBack: this.vehicleLicenseBack,
@ -563,6 +857,12 @@ export default {
vehicleLicenseCarPhoto: this.vehicleLicenseCarPhoto,
vehicleLicense: this.vehicleLicense,
vehicleFrontLicensePlate:this.vehicleFrontLicensePlate,
hasLiabilityInsurance: this.hasLiabilityInsurance,
insurancePicturePhoto: this.hasLiabilityInsurance == 1 ? this.insurancePicturePhoto : '',
insuranceCorp: this.hasLiabilityInsurance == 1 ? this.insuranceCorp : '',
liabilityInsuranceStartTime: this.hasLiabilityInsurance == 1 ? (timeObj?.startTime || '' ) : '',
liabilityInsuranceEndTime: this.hasLiabilityInsurance == 1 ? (timeObj?.endTime || '') : '',
virtualVehicle: this.virtualVehicle,
})
if(this.id){
this.$toast('修改成功')

View File

@ -18,6 +18,57 @@
</template>
</van-nav-bar>
</div>
<van-search
v-model="searchVal"
show-action
placeholder="车辆名称/车牌号/车架号"
@search="resetHandler"
>
<template #action>
<div @click="resetHandler">搜索</div>
</template>
</van-search>
<div class="filterWrap">
<!-- <div >-->
<!--<el-input v-model="searchVal" @blur="resetHandler" placeholder="车辆名称/车牌号/车架号" :class="{'customSel':true,'customInput':true , 'has-value': searchVal }" >
<template #suffix>
<i
v-if="searchVal"
class="el-icon-circle-close el-input__icon"
@click="searchVal = ''"
></i>
</template>
</el-input>-->
<el-select @change="resetHandler" multiple :collapse-tags="true" v-model="inputStatusList" placeholder="录入状态" :class="{'customSel':true , 'has-value': inputStatusList }" clearable>
<el-option
v-for="item in inputStatusListOptions"
:key="item.value"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
<!-- </div>-->
<!-- <div>-->
<el-select @change="resetHandler" multiple :collapse-tags="true" v-model="authStates" placeholder="认证状态" :class="{'customSel':true , 'has-value': authStates }" clearable>
<el-option
v-for="item in authStatesOptions"
:key="item.value"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
<el-select @change="resetHandler" multiple :collapse-tags="true" v-model="liabilityInsuranceAuditList" placeholder="职业责任险" :class="{'customSel':true , 'has-value': liabilityInsuranceAuditList }" clearable>
<el-option
v-for="item in insuresOptions"
:key="item.value"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
<!-- </div>-->
</div>
<div class="wrap_cls">
<van-pull-refresh v-model="isLoading" @refresh="onRefresh">
<van-list
v-model="loading"
@ -25,29 +76,43 @@
finished-text="没有更多了"
@load="onLoad"
>
<div class="carItem" v-for="(item,index) in vehicleList" :key="index">
<div class="carItem" v-for="(item,index) in vehicleList" :key="index" @click="updateVehicle(item)">
<div class="carCode">
<div class="codeLeft">{{item.plateNumber}} / {{item.vehicleTypeString}}</div>
<div class="twoBtn">
<button v-if="permissonList.includes('vehicleAddBtn')" class="del" @click="deleteItem(item.vehicleId)">删除</button>
<button v-if="permissonList.includes('vehicleModifyBtn')" class="revise" @click="updateVehicle(item)">修改</button>
<div class="codeLeft">{{item.plateNumber}} / {{item.vehicleTypeString}}
<span class="ml10" v-if="item.vehicleStatus" :class="{'insuranceSuccess': item.vehicleStatus == 1, 'insuranceDanger': item.vehicleStatus != 1}">{{ item.vehicleStatus == 1 ? '启用' : '停用' }} </span>
</div>
</div>
<div class="carType">{{ item.serviceName }}</div>
<div class="juhe">
<span class="zdJuhe">是否参与中道聚合: </span>
<span :class="item.hasPolymerization.code == 0 ? 'isYes' :'isNo'">{{item.hasPolymerization.label}}</span>
<div class="juhe flex-between">
<span class="zdJuhe">核验认证</span>
<span class="flex-right">
<span class="common_cls" v-if="item.inputStatusString" :class="getClass(item.inputStatusString)?.className">{{item.inputStatusString}}</span>
<span class="common_cls" v-if="item.authStateString" :class="getClass(item.authStateString)?.className">{{item.authStateString}}</span>
</span>
</div>
<div class="juhe flex-between">
<span class="zdJuhe">救援责任险</span>
<span class="flex-right" v-if="item.rescueInsurance">
<span class="common_cls" @click.stop="showTip(item.liabilityInsuranceAuditMsg)" :class="getClass(item.rescueInsurance)?.className">{{item.rescueInsurance}}</span>
</span>
</div>
<div class="juhe flex-between">
<span class="zdJuhe">最近登录时间</span>
<span class="flex-right">{{item.lastLoginTime}}</span>
</div>
<van-icon class="arrow_position" v-if="permissonList.includes('vehicleModifyBtn')" name="arrow" />
</div>
</van-list>
</van-pull-refresh>
</div>
<van-dialog v-model="show" title="确定删除吗" show-cancel-button @confirm="handleConfirm"></van-dialog>
</div>
</template>
<script>
import {Dialog} from "vant";
import { myMixins} from "@/utils/myMixins";
import {supplierVehicleList,deleteVehicle,userOperationPermissions} from "@/api/mine"
export default {
@ -64,14 +129,106 @@ export default {
isLoading: false,
loading: false,
finished: false,
showPopover: false,
permissonList:[],
inputStatusList: [],
searchVal: '',
authStates: [],
liabilityInsuranceAuditList: [],
inputStatusListOptions: [{
name: '行驶证未录入',
value: 0
},{
name: '行驶证核验通过',
value: 1
},{
name: '行驶证核验不通过',
value: 2
}],
authStatesOptions: [{
name: '车头照片未录入',
value: 1
},{
name: '车头照片认证通过',
value: 2
},{
name: '车头照片认证不通过',
value: 3
}],
insuresOptions: [{
name: '待审核',
value: 1
},{
name: '有责任险',
value: 2
},{
name: '有货物险',
value: 3
},{
name: '未通过',
value: 4
},{
name: '无',
value: 5
},{
name: '空',
value: 6
}],
}
},
mounted() {
// this.getVehicleList();
this.getPermissions();
},
methods:{
showTip(msg) {
Dialog.alert({
title: '未通过原因',
message: msg,
}).then(() => {
});
},
getClass(id) {
const ids = String(id)
const steps = {
'待审核': {
className: 'main_cls'
},
'有责任险': {
className: 'success_cls'
},
'有货物险': {
className: 'info_cls'
},
'未通过': {
className: 'danger_cls'
},
'无': {
className: 'default_cls'
},
'空': {
className: 'default_cls'
},
'行驶证未录入': {
className: 'default_cls'
},
'行驶证验证通过': {
className: 'success_cls'
},
'行驶证核验不通过': {
className: 'danger_cls'
},
'车头照未录入': {
className: 'default_cls'
},
'车头照认证通过': {
className: 'success_cls'
},
'车头照认证不通过': {
className: 'danger_cls'
}
}
return steps[ids] || { className: 'default_cls' }
},
async onLoad(){
await this.getVehicleList()
this.pageNum++;
@ -80,11 +237,12 @@ export default {
// 数据全部加载完成
if (this.vehicleList.length >= this.total) {
this.finished = true;
} else {
this.finished = false;
}
},
onRefresh() {
this.pageNum=1
// this.getVehicleList()
async onRefresh() {
await this.resetHandler()
setTimeout(() => {
this.$toast('刷新成功');
this.isLoading = false;
@ -93,7 +251,11 @@ export default {
async getVehicleList(){
let result = await supplierVehicleList({
pageNum:this.pageNum,
pageSize:this.pageSize
pageSize:this.pageSize,
searchVal: this.searchVal,
inputStatusList: this.inputStatusList,
authStates: this.authStates,
liabilityInsuranceAuditList: this.liabilityInsuranceAuditList,
})
this.total=result.total
if(this.pageNum == 1){// 第一页直接赋值
@ -121,13 +283,22 @@ export default {
this.pageNum=1
await this.getVehicleList();
},
async resetHandler() {
this.pageNum=1
this.finished = false;
this.total = 0;
// this.vehicleList = [];
await this.getVehicleList();
},
updateVehicle(item){//修改
if( this.permissonList.includes('vehicleModifyBtn') ) {
this.$router.push({
name:'vehicleAdd',
params:{
id:item.vehicleId
}
})
}
},
}
@ -137,12 +308,41 @@ export default {
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.ml10 {
margin-left: 10px;
}
.wrap{
background: #F4F5F7;
@include sizingPadding(13px,13px);
@include wh(100%, 100%);
overflow-y: auto;
}
.wrap_cls {
width: 100%;
padding-left: 13px;
padding-right: 13px;
box-sizing: border-box;
}
.common_cls {
color: #fff;
padding: 4px 8px;
border-radius: 3px;
margin-right: 6px;
}
.default_cls {
background-color: #B0BEC5;
}
.danger_cls {
background-color: red;
}
.success_cls {
background-color: #4CAF50;
}
.info_cls {
background-color: #FF9800;
}
.main_cls {
background-color: #6C9BFF;
}
.navBar{
margin-bottom: 46px;
.rightWrap{
@ -161,13 +361,14 @@ export default {
}
}
.carItem{
@include wh(100%,86px);
@include wh(100%,120px);
background: #FFFFFF;
box-shadow: 0px 2px 10px 0px rgba(216,216,216,0.5);
@include radiusSizing(6px);
padding: 11px 13px 11px 15px;
margin-bottom: 10px;
@include flexBetween;
position: relative;
.carCode{
@include flexColBet;
.codeLeft{
@ -175,6 +376,7 @@ export default {
}
.twoBtn{
display: flex;
align-items: center;
button{
border: none;
padding: 4px 8px;
@ -202,6 +404,11 @@ export default {
opacity: .7;
@include fontWeightSize(400,12px)
}
.zdJuhe {
width: 80px;
text-align: right;
margin-left: -10px;
}
.isYes{
color: #09B820;
@include fontWeightSize(400,12px);
@ -211,4 +418,122 @@ export default {
@include fontWeightSize(400,12px);
}
}
.arrow_position {
position: absolute;
right: 5px;
top: 50px;
font-size: 20px;
opacity: 0.6;
}
.mr10 {
margin-right: 10px;
}
.insuranceMain {
color: #354D93;
}
.insuranceSuccess {
color: green;
}
.insuranceTip {
color: orange;
}
.insuranceDanger {
color: red;
}
.flex-between {
display: flex;
justify-content: space-between;
align-items: center;
}
.filterWrap {
width: 100%;
padding-right: 13px;
padding-left: 13px;
display: flex;
overflow-x: auto; /* 允许横向滚动 */
white-space: nowrap; /* 防止子元素换行 */
padding-bottom: 10px;
-webkit-overflow-scrolling: touch; /* 在iOS上平滑滚动 */
scrollbar-width: none; /* Firefox */
padding-bottom: 10px;
/*padding: 10px;*/
margin-bottom: 10px;
background-color: #fff;
box-sizing: border-box;
&::-webkit-scrollbar {
display: none; /* Chrome/Safari */
}
.customSel {
flex: 0 0 auto; /* 防止子元素被压缩 */
width: calc(33% - 5px);
/*width: 100%;*/
height: 25px;
background: #F5F5F5;
border-radius: 4px;
font-size: 10px;
color: #323233;
margin-right: 5px;
::v-deep .el-input__inner{
padding: 0 2px;
height: 25px;
font-size: 10px;
background: #F5F5F5;
border-radius: 4px;
border: none;
}
::v-deep .el-input__icon{
line-height: 25px;
font-size: 10px;
width: 18px;
color: #2A5094;
}
::v-deep .el-input__suffix{
right: 2px;
}
}
.customInput{
/*width: 49%;*/
width: 130px;
}
.has-value ::v-deep .el-input__inner{
background: #F1F6FF ;
color: #007BE9;
font-weight: bold;
padding-left: 8px;
}
.has-value ::v-deep .el-input__icon{
color: #007BE9;
}
.priceSel{
display: flex;
justify-content: space-around;
align-items: center;
color: #C0C4CC;
.iconSpan{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 8px;
}
}
.has-price{
color: #007BE9 !important;
}
}
::v-deep .el-select .el-select__tags>span {
display: flex;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.flex-right {
display: flex;
flex: 1;
justify-content: flex-start;
margin-left: 10px;
}
</style>

View File

@ -112,38 +112,28 @@
<circle-char v-show="showScoreChart" ref="Doughnut7" :data="indexData && indexData.score" :bg-color="Number(indexData?.score || 0) >= 60 ? 'green' : 'red'" :is-store="true"></circle-char>
<div v-show="!showScoreChart" class="detailScore">
<div class="left">
<div>
<span class="defen">接单得分:</span>
</div>
<div>
<span class="defen">接单时效得分:</span>
</div>
<div>
<span class="defen">接单时效得分:</span>
</div>
<div><span class="defen">聚合成功率得分:</span>
</div>
<div><span class="defen">APP使用率得分:</span>
</div>
<div><span class="defen">催促率得分:</span>
</div>
<div><span class="defen">投诉率得分:</span>
</div>
<!-- <div><span class="defen">接单得分:</span></div>-->
<div><span class="defen">接单时效得分:</span></div>
<div><span class="defen">到达时效得分:</span></div>
<div><span class="defen">聚合成功率得分:</span></div>
<div><span class="defen">APP使用率得分:</span></div>
<div><span class="defen">催促率得分:</span></div>
<div><span class="defen">投诉率得分:</span></div>
<div><span class="defen">超时率得分:</span></div>
<div><span class="defen">拒单率得分:</span></div>
<div><span class="defen">3'联系率得分:</span></div>
</div>
<div class="right">
<div>
<span>{{ indexData.orderScore }}</span>
</div>
<div>
<span>{{ indexData.orderAgeingScore }}</span>
</div>
<div>
<span>{{ indexData.arriveAgeingScore }}</span>
</div>
<!-- <div><span>{{ indexData.orderScore }}</span></div>-->
<div><span>{{ indexData.orderAgeingScore }}</span></div>
<div><span>{{ indexData.arriveAgeingScore }}</span></div>
<div> <span>{{ indexData.polymerizationSuccessScore }}</span></div>
<div> <span>{{ indexData.appUseScore }}</span></div>
<div> <span>{{ indexData.urgeScore }}</span></div>
<div><span>{{ indexData.urgeScore }}</span></div>
<div> <span>{{ indexData.timeOutScore }}</span></div>
<div> <span>{{ indexData.refuseOrderScore }}</span></div>
<div><span>{{ indexData.threeMinutesContactSocre }}</span></div>
</div>
</div>
</div>
@ -200,8 +190,8 @@
<noFit-table v-else :active='active' :is-mobile='isMobile' :table-data="detailList" :label-list="labelList"></noFit-table>
</div>
</div>
<div v-loading="loadingData" class="contentWrap monthTotal" v-if="[2,4,5].includes(active)">
<div class="searchDriverName" v-if="[5,4].includes(active)">
<div v-loading="loadingData" class="contentWrap monthTotal" v-if="[2,3,4].includes(active)">
<div class="searchDriverName" v-if="[3,4].includes(active)">
<el-select
v-model="driverName"
filterable
@ -223,12 +213,12 @@
</el-select>
</div>
<div :class="{'tabWrap':true,'webTabWrap':!isMobile,'mobileTab':isMobile}">
<div v-for="(item,index) in (active===4 ? driverList : list)" :class="activeIndex===index ? 'active' : ''"
<div v-for="(item,index) in (active===3 ? driverList : list)" :class="activeIndex===index ? 'active' : ''"
:key="index"
@click="changeTab(index)">{{ item.name }}
</div>
</div>
<div :class="{'comTab':active !== 4,'comTabActive3':active === 4}">
<div :class="{'comTab':active !== 3,'comTabActive3':active === 3}">
<noFit-table :active='active' :is-mobile='isMobile' :table-data="detailList" :label-list="labelList"></noFit-table>
</div>
<el-pagination
@ -243,7 +233,7 @@
:total="total">
</el-pagination>
</div>
<div v-loading="loadingData" class="contentWrap monthTotal" v-if="[3,6,7,8,9,10, 11].includes(active)">
<div v-loading="loadingData" class="contentWrap monthTotal" v-if="[5,6,7,8,9,10, 11].includes(active)">
<div :class="{'comTab':true,'detailTable':isMobile}">
<noFit-table :active='active' :is-mobile='isMobile' :table-data="detailList" :label-list="labelList"
></noFit-table>
@ -272,8 +262,9 @@ import {
getStatisticsKpi,
getSupplierId,
getDriverName,getDriverStatisticsKpi,
getRecentSupplierKpi, querySupplierDriverStatisticsScore
getRecentSupplierKpi,
} from "@/api/kpi.js"
// querySupplierDriverStatisticsScore
import {myMixins} from "@/utils/myMixins"
import CircleChar from "@/views/kpi/components/circleChar.vue";
import NoFitTable from "@/views/kpi/components/noFit-table.vue";
@ -289,11 +280,13 @@ export default {
activeIndex: 0,
//
tabArr: [
{name: '总览'}, {name: '月/总'}, {name: '日/总'},{name: '师傅满意度'},{name: '月/师傅'}, {name: '日/师傅'}, {name: '拒单明细'},
{name: '超时明细'}, {name: '投诉明细'}, {name: '不使用APP案件明细'}, {name: '车辆在线情况'} , {name: '聚合失败案件明细'}
{name: '总览',value:0}, {name: '月/总'}, {name: '日/总'},{name: '月/师傅'}, {name: '日/师傅'}, {name: '拒单明细'},
{name: '超时明细'}, {name: '催促明细'},{name: '投诉明细'}, {name: '不使用APP案件明细'}, {name: '车辆在线情况'} , {name: '聚合失败案件明细'}
],
list: [{name: '接单指标'}, {name: '客户评价'}, {name: 'APP使用'}, {name: ' 时效 '}],
driverList: [{name: '得分总览'},{name: '接单情况'}, {name: '服务评价'}, {name: 'APP使用情况'}, {name: '时效 '}],
list: [{name: '接单指标'}, {name: '服务评价'}, {name: 'APP使用情况'}, {name: ' 时效 '}],
// driverList: [{name: '得分总览'},{name: '接单情况'}, {name: '服务评价'}, {name: 'APP使用情况'}, {name: '时效 '}],
driverList: [{name: '接单情况'}, {name: '服务评价'}, {name: 'APP使用情况'}, {name: '时效 '}],//story#7149,要求暂时隐藏得分总览
startMonthTime: '',
startTime: '',
endTime: '',
@ -316,7 +309,6 @@ export default {
isMobile: false,
isZd: '',
current:'2024-10',
// current: dayjs(new Date()).format('M'),
supplierName:'',
value: '1',
options: [
@ -370,21 +362,13 @@ export default {
}
},
monthChangeHandle(value){
console.log('valuevaluevalue', dayjs(new Date(value)).format('YYYY-MM-DD'))
if (value) {
this.current = dayjs(new Date(value)).format('YYYY-MM')
const _tempDate = dayjs(new Date(value)).format('YYYY-MM-DD')
const lastDay = dayjs(_tempDate).endOf('month');
/*const year = value.getFullYear();
const month = value.getMonth() + 1; // 月份从 0 开始,需要加 1
const yearAndMonth = year + '-' + (month > 9 ? month : '0' + month);
this.current = dayjs(new Date(yearAndMonth)).format('YYYY-MM')*/
this.startTime = `${this.current}-01 00:00:00`;
// const lastDay = new Date(year, month, 0).getDate(); // 获取该月的最后一天
this.endTime = `${this.current}-${this.padZero(lastDay.date())} 23:59:59`;
this.startMonthTime=this.getStartTimeFromEndTime(this.endTime)
console.log(" this.startMonthTime", this.startMonthTime)
this.selectSupplierNameHandle();
if(this.active===1){
this.tabClickHandle()
@ -400,7 +384,7 @@ export default {
return
}
this.$refs.Doughnut1.initCircle()
this.$refs.Doughnut2.initCircle()
// this.$refs.Doughnut2.initCircle()
this.$refs.Doughnut3.initCircle()
this.$refs.Doughnut4.initCircle()
this.$refs.Doughnut5.initCircle()
@ -985,7 +969,7 @@ export default {
async getKpiData() {
try {
this.loading = true
if (this.active === 0) {
if (this.active === 0) {//总览
await this.allDataChart()
let res = await getStatisticsKpiByMonth({
startTime: this.startTime,
@ -1016,7 +1000,7 @@ export default {
this.indexData[key] = this.processPercentage(this.indexData[key]);
}
}
} else if ([1, 2].includes(this.active)) {
} else if ([1, 2].includes(this.active)) {//月总 日总
let res = await getStatisticsKpi({
startTime: this.active === 1 ? this.startMonthTime : this.startTime,
endTime: this.endTime,
@ -1047,8 +1031,6 @@ export default {
item.minorFortyMinutesArrivalRate=this.formatPercentage(item.minorFortyMinutesArrivalRate) ;
let formatVal = dayjs(item.statisticsDate).format('DD');
let formatVal1 = dayjs(item.statisticsDate).format('M');
// console.log("formatVal1",formatVal1)
// return {...item, date: formatVal, month: (formatVal1 == this.current) ? '本月' : (formatVal1 + '月')};
return {...item, date: formatVal, month: formatVal1 + '月'};
});
this.loading = false
@ -1056,33 +1038,8 @@ export default {
this.xAxisArr.push(item.month)
this.xAxisArr = [...new Set(this.xAxisArr)]; // 去重
})
console.log(" this.xAxisArr", this.xAxisArr)
// this.xAxisArr[this.xAxisArr.length - 1] = '本月'
await this.twoTabHanldeData()
}else if (this.active === 3) {
let res = await querySupplierDriverStatisticsScore({
startTime: this.startTime ,
endTime: this.endTime,
statisticsType: 1,
supplierId: this.supplierId,
driverId: this.driverId,
driverName:this.driverName,
pageNum: this.pageNum,
pageSize: this.pageSize
})
this.total = res.total
this.detailList = res.data?.map(item => {
let formatVal = dayjs(item.statisticsDate).format('DD');
return {...item, date: formatVal};
});
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
{label: '案件总量', prop: 'orderCount'},
{label: '满意度得分 ', prop: 'driverSatisfaction'},
]
this.loading = false;
}
else if ([4,5].includes(this.active)) {
} else if ([3,4].includes(this.active)) {//月师傅 日师傅
let res = await getDriverStatisticsKpi({
startTime: this.startTime ,
endTime: this.endTime,
@ -1113,13 +1070,32 @@ export default {
return {...item, date: formatVal};
});
this.loading = false;
if(this.active===5 && !this.driverName){
/* if(this.active===5 && !this.driverName){
this.detailList=[]
this.total=0
}
}*/
await this.twoTabHanldeData();
}
else if ([ 6, 7, 8,9,10, 11].includes(this.active)) {
/* else if (this.active ===7) {
let res = await querySupplierDriverStatisticsScore({
startTime: this.startTime ,
endTime: this.endTime,
statisticsType: 1,
supplierId: this.supplierId,
driverId: this.driverId,
driverName:this.driverName,
pageNum: this.pageNum,
pageSize: this.pageSize
})
this.total = res.total
this.detailList = res.data?.map(item => {
let formatVal = dayjs(item.statisticsDate).format('DD');
return {...item, date: formatVal};
});
this.loading = false;
} */
else if ([ 5,6,7, 8,9,10,11].includes(this.active)) {
this.detailList = []
this.labelList = []
let result = await getKpiDetailsData({
@ -1136,7 +1112,7 @@ export default {
return {...item, date: formatVal};
});
this.loading = false
if (this.active === 6) {//拒单明细
if (this.active === 5) {//拒单明细
this.labelList = [
{label: '案件编号', prop: 'orderCode'},
{label: '服务内容', prop: 'serviceName'},
@ -1146,7 +1122,7 @@ export default {
{label: '拒绝时间', prop: 'time'},
{label: '拒单原因', prop: 'reason'},
]
} else if (this.active === 7) {//超时明细
} else if (this.active === 6) {//超时明细
this.labelList = [
{label: '案件编号', prop: 'orderCode'},
{label: '服务内容', prop: 'serviceName'},
@ -1156,6 +1132,23 @@ export default {
{label: '超时时间', prop: 'time'},
{label: '超时原因', prop: 'reason'},
]
} else if (this.active === 7) {//催促明细
this.labelList = [
{label: '案件编号', prop: 'orderCode'},
{label: '二级合同名称', prop: 'contractName'},
{label: '案件创建时间', prop: 'orderCreateTime'},
{label: '催促创建时间 ', prop: 'urgeTime'},
{label: '服务商接单时间 ', prop: 'taskAcceptTime'},
{label: '备注内容(催促内容) ', prop: 'urgeRemark'},
{label: '催促次数', prop: 'urgeCount'},//无催促次数,催促一次生成一条新的
{label: '服务商名称', prop: 'supplierName'},
{label: '服务车辆', prop: 'vehicleName'},
{label: '服务完成状况', prop: 'orderStatusString'},
{label: '案件完成时间', prop: 'finishTime'},
{label: '省(B)', prop: 'bProvince'},
{label: '市(B)', prop: 'bCity'},
{label: '区(B)', prop: 'area'},
]
} else if (this.active === 8) {//投诉明细
this.labelList = [
{label: '案件编号', prop: 'orderCode'},
@ -1176,15 +1169,14 @@ export default {
]
} else if (this.active === 10) {//车辆在线情况
this.labelList = [
{label: '日期', prop: 'date'},
{label: '0点在线车辆数', prop: 'zeroClockVehicleCount'},
{label: '8点在线车辆数量', prop: 'eightClockVehicleCount'},
{label: '12点在线车辆数量', prop: 'twelveClockVehicleCount'},
{label: '16点在线车辆数', prop: 'sixteenClockVehicleCount'},
{label: '20点在线车辆数量', prop: 'twentyClockVehicleCount'},
{label: '22点在线车辆数量', prop: 'twentyTwoClockVehicleCount'},
// {label: '总车辆数', prop: 'totalCount'},
{label: '在线车辆数(取每日的12点)', prop: 'twelveClockVehicleCount'},
{label: '在线拖车数(12点)', prop: 'trailCount'},
{label: '在线小修车数(12点)', prop: 'minorCount'},
{label: '在线率(在线车辆数/总车辆数)', prop: 'onlineRate'},
// {label: '车辆平均在线时长', prop: ''},
]
} else if (this.active === 11) {//车辆在线情况
} else if (this.active === 11) {//聚合失败案件明细
this.labelList = [
{label: '案件编号', prop: 'orderCode'},
{label: '服务内容', prop: 'serviceName'},
@ -1208,22 +1200,6 @@ export default {
},
// 初始化获取当月日期
initDate() {
/*let year=''
let month=''
if( this.current ) {
year = new Date(this.current).getFullYear();
month = new Date(this.current).getMonth() + 1;
} else {
year = new Date().getFullYear();
month = new Date().getMonth() + 1;
}
let yearAndMonth = year + '-' + (month > 9 ? month : '0' + month);
this.current = dayjs(new Date(yearAndMonth)).format('YYYY-MM')
this.startTime = dayjs(new Date()).format('YYYY-MM') + '-01 00:00:00'
this.endTime = dayjs(new Date()).format('YYYY-MM') + '-' + this.getDayLen()+' 23:59:59'*/
// test
// let _testDate = new Date('2024-11-01 00:00:01')
const today = dayjs(); // 获取当前日期
const currentDay = today.date(); // 获取今天是几号1-31
let targetMonth = today; // 默认目标月份是当前月
@ -1240,7 +1216,6 @@ export default {
}
this.endTime = endTime.format('YYYY-MM-DD HH:mm:ss');
this.startMonthTime=this.getStartTimeFromEndTime(this.endTime)
console.log(" this.startMonthTime", this.startMonthTime,this.startTime)
},
// 获取当月天数
getDayLen() {
@ -1295,7 +1270,7 @@ export default {
twoTabHanldeData() {
this.etlDetailList=[]
this.etlLabelList=[]
if (this.active === 1) {
if (this.active === 1) {//月总
const columnObj = {} //创建标题数组中第一个对象
columnObj.label = 'KPI' //第一个标题名称
columnObj.prop = 'month' //第一个标题名称对应的字段
@ -1338,7 +1313,6 @@ export default {
]
} else if (this.activeIndex === 1) {
this.etlDetailList=[{ 'month': '投诉量' },{ 'month': '投诉率(%)' },{ 'month': '平安好评量' }, { 'month': '平安好评率' }]
console.log('detailList', this.detailList)
let props = 'prop' //自定义字段名称
this.detailList?.map((item,index) => {
this.v1.push(item.complainOrderCount)
@ -1447,7 +1421,7 @@ export default {
{label: '平安聚合成功到达时效', prop: 'pinganJuheSuccessArriving'},
]
}
} else if (this.active === 2) {
} else if (this.active === 2) {//日总
if (this.activeIndex === 0) {//接单指标
this.labelList = [
{label: '日', prop: 'date'},
@ -1491,12 +1465,8 @@ export default {
{label: '平安聚合成功到达时效(分)', prop: 'pinganJuheSuccessArriving'},
]
}
}
/* else if(this.active === 3){
} */
else if (this.active === 4) {
if (this.activeIndex === 0) {
} else if (this.active === 3) {//月师傅
/* if (this.activeIndex === 0) {
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
{label: '总分', prop: 'score'},
@ -1524,60 +1494,65 @@ export default {
{label: '新手入列得分', prop: 'listedScore'},
{label: '星级评分', prop: 'starRank'},
]
}if (this.activeIndex === 1) {
}else*/
if (this.activeIndex === 0) {
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
{label: '承接案件量', prop: 'receiveOrderCount'},
{label: '派单量', prop: 'dispatchOrderCount'},
{label: '接单量', prop: 'receiveOrderCount'},
{label: '拒单量', prop: 'refuseOrderCount'},
{label: '拒单率(%)', prop: 'refuseOrderRate'},
{label: '超时接单量', prop: 'timeoutOrderCount'},
{label: '超时量', prop: 'timeoutOrderCount'},
{label: '超时率(%)', prop: 'timeoutOrderRate'},
]
} else if (this.activeIndex === 1) {
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
// {label: '承接案件量', prop: 'receiveOrderCount'},
{label: '投诉量', prop: 'complainOrderCount'},
{label: '投诉率(%)', prop: 'complainOrderRate'},
{label: '平安评价量', prop: 'pinganEvaluateCount'},
{label: '平安评价率(%)', prop: 'pinganEvaluateRate'},
{label: '平安好评量', prop: 'pinganFavorableCount'},
{label: '平安好评率(%)', prop: 'pinganFavorableRate'},
// {label: '催促率(%)', prop: 'urgeRate'},
]
} else if (this.activeIndex === 2) {
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
{label: '承接案件量', prop: 'receiveOrderCount'},
{label: '投诉量', prop: 'complainOrderCount'},
{label: '投诉率(%)', prop: 'complainOrderRate'},
{label: '客户满意度(%)', prop: 'customerSatisfaction'},
{label: '客户评价率(%)', prop: 'customerEvaluateRate'},
{label: '催促率(%)', prop: 'urgeRate'},
{label: 'App使用量', prop: 'appUseCount'},
{label: 'App使用率(%)', prop: 'appRate'},
// {label: '3联系客户率(%)', prop: 'threeMinutesContactRate'},
{label: '平安聚合成功量', prop: 'pinganPolymerizationSuccessCount'},
{label: '平安聚合成功率(%)', prop: 'pinganPolymerizationSuccessRate'},
{label: '中华联合聚合成功量', prop: 'zhonghuaPolymerizationSuccessCount'},
{label: '中华联合聚合成功率(%)', prop: 'zhonghuaPolymerizationSuccessRate'},
// {label: '中道聚合成功率(%)', prop: 'zdPolymerizationSuccessRate'},
{label: '整体聚合成功量', prop: 'wholeJuheSuccessCount'},
{label: '整体聚合成功率(%)', prop: 'wholeJuheSuccessRate'},
// {label: '日均在线时长(h)', prop: 'onlineDuration'},
]
} else if (this.activeIndex === 3) {
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
{label: '承接案件量', prop: 'receiveOrderCount'},
{label: 'App使用率(%)', prop: 'appRate'},
{label: '3联系客户率(%)', prop: 'threeMinutesContactRate'},
{label: '平安聚合成功率(%)', prop: 'pinganPolymerizationSuccessRate'},
{label: '中华聚合成功率(%)', prop: 'zhonghuaPolymerizationSuccessRate'},
{label: '中道聚合成功率(%)', prop: 'zdPolymerizationSuccessRate'},
{label: '总聚合成功率(%)', prop: 'polymerizationSuccessRate'},
{label: '日均在线时长(h)', prop: 'onlineDuration'},
]
} else if (this.activeIndex === 4) {
this.labelList = [
{label: '师傅姓名', prop: 'driverName'},
{label: '接单时效(分)', prop: 'receiving'},
{label: '3接单率(%)', prop: 'threeMinutesReceivingRate'},
{label: '3联系客户率(%)', prop: 'threeMinutesReceivingRate'},
{label: '到达时效(分)', prop: 'arriving'},
{label: '40到达率(%)', prop: 'fortyMinutesArrivalRate'},
{label: '聚合成功到达时效(分)', prop: 'polymerizationSuccessArriving'},
// {label: '40到达率(%)', prop: 'fortyMinutesArrivalRate'},
{label: '平安聚合成功到达时效(分)', prop: 'pinganJuheSuccessArriving'},
]
}
} else if (this.active === 5) {
} else if (this.active === 4) {//日师傅
if (this.activeIndex === 0) {//接单指标
this.labelList = [
{label: '日', prop: 'date'},
{label: '师傅姓名', prop: 'driverName'},
{label: '派遣案件量', prop: 'dispatchOrderCount'},
{label: '承接案件量', prop: 'receiveOrderCount'},
{label: '完成量', prop: 'finishOrderCount'},
{label: '派量', prop: 'dispatchOrderCount'},
{label: '接单量', prop: 'receiveOrderCount'},
{label: '拒单量', prop: 'refuseOrderCount'},
{label: '拒单率(%)', prop: 'refuseOrderRate'},
{label: '超时接单量', prop: 'timeoutOrderCount'},
{label: '超时量', prop: 'timeoutOrderCount'},
{label: '超时率(%)', prop: 'timeoutOrderRate'},
{label: '客户取消率(%)', prop: 'cancelRate'},
]
} else if (this.activeIndex === 1) {
this.labelList = [
@ -1585,31 +1560,32 @@ export default {
{label: '师傅姓名', prop: 'driverName'},
{label: '投诉量', prop: 'complainOrderCount'},
{label: '投诉率(%)', prop: 'complainOrderRate'},
{label: '客户满意度(%)', prop: 'customerSatisfaction'},
{label: '客户评价率(%)', prop: 'customerEvaluateRate'},
{label: '催促率(%)', prop: 'urgeRate'},
{label: '平安评价量', prop: 'pinganEvaluateCount'},
{label: '平安评价率(%)', prop: 'pinganEvaluateRate'},
{label: '平安好评量', prop: 'pinganFavorableCount'},
{label: '平安好评率(%)', prop: 'pinganFavorableRate'},
]
} else if (this.activeIndex === 2) {
this.labelList = [
{label: '日', prop: 'date'},
{label: '师傅姓名', prop: 'driverName'},
{label: '使用率(%)', prop: 'appRate'},
{label: '3联系客户率(%)', prop: 'threeMinutesContactRate'},
{label: 'App使用量', prop: 'appUseCount'},
{label: 'App使用率(%)', prop: 'appRate'},
{label: '平安聚合成功量', prop: 'pinganPolymerizationSuccessCount'},
{label: '平安聚合成功率(%)', prop: 'pinganPolymerizationSuccessRate'},
{label: '中华聚合成功率(%)', prop: 'zhonghuaPolymerizationSuccessRate'},
{label: '中聚合成功率(%)', prop: 'zdPolymerizationSuccessRate'},
{label: '聚合成功率(%)', prop: 'polymerizationSuccessRate'},
{label: '日均在线时长(h)', prop: 'onlineDuration'},
{label: '中华联合聚合成功', prop: 'zhonghuaPolymerizationSuccessCount'},
{label: '中华联合聚合成功率(%)', prop: 'zhonghuaPolymerizationSuccessRate'},
{label: '整体聚合成功', prop: 'wholeJuheSuccessCount'},
{label: '整体聚合成功率(%)', prop: 'wholeJuheSuccessRate'},
]
} else if (this.activeIndex === 3) {
this.labelList = [
{label: '日', prop: 'date'},
{label: '师傅姓名', prop: 'driverName'},
{label: '接单时效(分)', prop: 'receiving'},
{label: '3接单率(%)', prop: 'threeMinutesReceivingRate'},
{label: '3联系客户率(%)', prop: 'threeMinutesReceivingRate'},
{label: '到达时效(分)', prop: 'arriving'},
{label: '40到达率(%)', prop: 'fortyMinutesArrivalRate'},
{label: '聚合成功到达时效(分)', prop: 'polymerizationSuccessArriving'},
{label: '平安聚合成功到达时效(分)', prop: 'pinganJuheSuccessArriving'},
]
}
}
@ -1621,10 +1597,12 @@ export default {
},
setType(type) {
switch (type) {
case 6:
case 5:
return 1;
case 7:
case 6:
return 2;
case 7:
return 7;
case 8:
return 3;
case 9:

View File

@ -109,7 +109,7 @@
const urlParams = new URLSearchParams(window.location.search);
console.log('window.location',window.location)
// console.log("urlParams",urlParams)
// console.log("decodeURIComponent( window.location.href)",decodeURIComponent( window.location.href))
console.log("decodeURIComponent( window.location.href)",decodeURIComponent( window.location.href))
this.esignFlag = urlParams.get('esignFlag') || localStorage.getItem("esignFlag")
if(window.location.search){
console.log('有参数')