42 Commits

Author SHA1 Message Date
beb97a0762 kpi总览界面,隐藏两个平安的指标 2025-09-17 15:33:11 +08:00
425c4c2043 实名认证接口加参数ump:1 2025-09-15 13:18:53 +08:00
2e9f2a6fa1 VConsole调试删除 2025-09-15 09:23:33 +08:00
93aaaacd06 实名认证链接decode测试 2025-09-15 09:23:32 +08:00
4fd27cfa0e 实名认证调整 2025-09-15 09:23:03 +08:00
f4a2c6d6fa 认证页的返回都调转列表页 2025-09-15 09:22:09 +08:00
5592ad773e 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-15 09:14:20 +08:00
ff53323c3f 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-15 09:14:18 +08:00
1df54434c9 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-15 09:14:16 +08:00
210eb41ca6 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-15 09:14:13 +08:00
436a35ddb5 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-15 09:14:11 +08:00
b33522708e 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-15 09:14:09 +08:00
a9938d03fa 实名认证页,认证结果esignFlag做缓存 2025-09-15 09:14:06 +08:00
e7ce0721ca 实名认证页返回都到列表页 2025-09-15 09:14:03 +08:00
3cab49c0d4 实名认证页代码优化 2025-09-15 09:14:01 +08:00
0d14a9add6 实名认证页代码优化 2025-09-15 09:13:58 +08:00
6bc78f76ad 认证页增加双击不放大功能,滚动条丝滑滚动优化 2025-09-15 09:13:55 +08:00
fe5e85b8d5 认证页下一步添加接口 2025-09-15 09:13:49 +08:00
d799cf7b93 实名认证esignFlag缓存添加 2025-09-15 09:13:46 +08:00
64240414b5 实名认证操作成功后返回到认证列表页 2025-09-15 09:13:43 +08:00
0aac318448 实名认证界面加缓存数据 2025-09-15 09:13:40 +08:00
121435ff3e 实名认证界面加缓存数据 2025-09-15 09:13:36 +08:00
2dbf353113 实名认证接口加token参数 2025-09-15 09:13:33 +08:00
728063ca86 实名认证加token参数 2025-09-15 09:13:29 +08:00
ad548db437 实名认证加token参数 2025-09-15 09:13:26 +08:00
ad5f16acc9 story#7189,跳转加token参数 2025-09-15 09:13:24 +08:00
39921aa2bb story#7189,高度调整 2025-09-15 09:13:21 +08:00
3d56f91575 story#7189,type默认'full' 2025-09-15 09:13:19 +08:00
fda0139a06 story#7189,认证页radio回显处理 2025-09-15 09:13:17 +08:00
620e6b5ad4 story#7189,回程车小程序司机端-迁移认证,跳转新的url 2025-09-15 09:13:14 +08:00
4c0ad71e89 story#7189,回程车小程序司机端-迁移认证,添加调试 2025-09-15 09:13:11 +08:00
7f8c482df1 story#7189,回程车小程序司机端-迁移认证 2025-09-15 09:13:08 +08:00
ceff5e008c story#7189,回程车小程序司机端-迁移认证页面 2025-09-15 09:13:03 +08:00
16924fb22e story#7189,回程车小程序司机端-迁移认证页面 2025-09-15 09:13:02 +08:00
6a8b6b7730 司机端培训资料,关键字接受字段更换,切换优化加loading 2025-09-09 13:34:39 +08:00
bdc78351e4 司机端培训资料,关键字接受字段更换,切换优化加loading 2025-09-09 13:34:38 +08:00
25cc195f1e 三分钟联系客户率 2025-09-09 10:55:23 +08:00
97ba1500ff 好评率好评量删除 2025-09-09 10:55:23 +08:00
93f0e9317c kpi率乘以一百 2025-09-08 10:18:33 +08:00
2c83b1ea60 kpi字段替换 2025-09-08 09:41:42 +08:00
872021eca5 平安聚合时效 2025-09-05 11:44:00 +08:00
6beda9f6f1 服务商KPI 2025-09-04 10:01:16 +08:00
10 changed files with 424 additions and 778 deletions

View File

@ -31,10 +31,10 @@
} }
</script> </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 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 src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>-->
<script> <script>
// VConsole 默认会挂载到 `window.VConsole` 上 // VConsole 默认会挂载到 `window.VConsole` 上
let vConsole = new window.VConsole(); // let vConsole = new window.VConsole();
(function (doc, win) { (function (doc, win) {
// console.log("==window.location.pathname===",window.location.pathname) // console.log("==window.location.pathname===",window.location.pathname)
let docEl = doc.documentElement let docEl = doc.documentElement

View File

@ -72,7 +72,7 @@
<div class="itemContent"> <div class="itemContent">
<div class="titleType"> <div class="titleType">
<img class="startImg" src="@/assets/start.png" /> <img class="startImg" src="@/assets/start.png" />
<span>车辆类</span> <span>车辆类</span>
</div> </div>
<!-- <!--
<select <select
@ -111,29 +111,6 @@
</el-select> </el-select>
</div> </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="itemContent">
<div class="titleType"> <div class="titleType">
<span>牌照</span> <span>牌照</span>
@ -157,7 +134,7 @@
</div> </div>
<div class="lineBot"></div> <div class="lineBot"></div>
<!--<div class="itemContent"> <div class="itemContent">
<div class="titleType"> <div class="titleType">
<img class="startImg" src="@/assets/start.png" /> <img class="startImg" src="@/assets/start.png" />
<span>是否参与聚合</span> <span>是否参与聚合</span>
@ -183,115 +160,7 @@
</van-radio-group> </van-radio-group>
</div> </div>
</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> <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="itemContent">
<div class="titleType"> <div class="titleType">
<img class="startImg" src="@/assets/start.png" /> <img class="startImg" src="@/assets/start.png" />
@ -299,39 +168,28 @@
</div> </div>
</div> </div>
<div class="serviceType"> <div class="serviceType">
<el-tree
show-checkbox <div class="trailerService" v-for="(item,index) in supplierServiceList" :key="index">
node-key="id" <div class="serviceline" @click="loadAll(index)">
ref="tree" <img :ref="'serviceline' + index" :src="imageUrl" style="width: 20px;height: 15px" >
:highlight-current="true" <span class="service">{{ item.name }}:</span>
:expand-on-click-node="false" <span class="line"></span>
:data="supplierServiceList" </div>
:props="defaultProps"> <div :ref="'checkboxGroup' + index" class="checkbox-group">
</el-tree> <van-checkbox-group v-model="serviceIds" v-for="(item2,index2) in item.children" :key="index2" class="radioWrap">
<!--<div class="trailerService" v-for="(item,index) in supplierServiceList" :key="index"> <van-checkbox class="item" :name="item2.id">{{item2.name }}</van-checkbox>
<div class="serviceline" @click="loadAll(index)"> </van-checkbox-group>
<img :ref="'serviceline' + index" :src="imageUrl" style="width: 20px;height: 15px" > </div>
<span class="service">{{ item.name }}:</span>
<span class="line"></span> </div>
</div>
<div :ref="'checkboxGroup' + index" class="checkbox-group">
<van-checkbox-group v-model="serviceIds" v-for="(item2,index2) in item.children" :key="index2" class="radioWrap">
<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" /> <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>
</div> </div>
</template> </template>
<script> <script>
// uploadImage // uploadImage
import {Dialog} from "vant";
import {formatDate1} from "@/utils/common"
import {myMixins} from "@/utils/myMixins" import {myMixins} from "@/utils/myMixins"
import {vehicleTypeList,saveVehicle,getInfoById,supplierServiceTree, uploadImage, ocrHandler} from "@/api/mine" import {vehicleTypeList,saveVehicle,getInfoById,supplierServiceTree, uploadImage, ocrHandler} from "@/api/mine"
import TwoCommonBtn from "@/components/twoBtnCommon.vue" import TwoCommonBtn from "@/components/twoBtnCommon.vue"
@ -341,20 +199,8 @@ export default {
mixins:[myMixins], mixins:[myMixins],
data(){ data(){
return{ 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: '',//拖车服务 trailerService: '',//拖车服务
isJoin:'',//是否参与 isJoin:'',//是否参与
hasLiabilityInsurance: '', // 有无责任险
activeIcon: require('@/assets/check.png'), activeIcon: require('@/assets/check.png'),
inactiveIcon: require('@/assets/uncheck.png'), inactiveIcon: require('@/assets/uncheck.png'),
// result: [], // result: [],
@ -372,18 +218,15 @@ export default {
vehicleLicenseBackList: [], vehicleLicenseBackList: [],
vehicleLicenseCarPhotoList: [], vehicleLicenseCarPhotoList: [],
vehicleFrontPhotoList: [], vehicleFrontPhotoList: [],
insurancePictureFiles: [],
vehicleLicenseFront: '', // 行驶证首页 vehicleLicenseFront: '', // 行驶证首页
vehicleLicenseBack: '', // 行驶证副页 vehicleLicenseBack: '', // 行驶证副页
vehicleLicenseCarPhoto: '', // 行驶证车辆照片 vehicleLicenseCarPhoto: '', // 行驶证车辆照片
vehicleFrontPhoto: '', // 车头照 vehicleFrontPhoto: '', // 车头照
insurancePicturePhoto: '', // 保单照片
vehicleLicenseInfo: {}, vehicleLicenseInfo: {},
vehicleLicenseBackOcrFlag: false, // 行驶证副页 修改时默认不需要 ocr识别 vehicleLicenseBackOcrFlag: false, // 行驶证副页 修改时默认不需要 ocr识别
isMultiple: false, // 是否支持多选 isMultiple: false, // 是否支持多选
vehicleLicense:'',//牌照 vehicleLicense:'',//牌照
vehicleFrontLicensePlate:'',//车头照车牌号码 vehicleFrontLicensePlate:'',//车头照车牌号码
insuranceCorp: '',
vehicleTypes:[{ vehicleTypes:[{
name: '小修车', name: '小修车',
value: 1 value: 1
@ -432,62 +275,6 @@ export default {
}, { }, {
name: '其他', name: '其他',
value: 5 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
}] }]
} }
}, },
@ -534,25 +321,6 @@ export default {
} }
}, },
methods:{ 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() { setDefault() {
if( this.vehicleLicenseInfo?.vehicleType?.includes('小型') || this.vehicleLicenseInfo?.vehicleType?.includes('微型') || this.vehicleLicenseInfo?.vehicleType?.includes('普通') || this.vehicleLicenseInfo?.vehicleType?.includes('摩托') ) { if( this.vehicleLicenseInfo?.vehicleType?.includes('小型') || this.vehicleLicenseInfo?.vehicleType?.includes('微型') || this.vehicleLicenseInfo?.vehicleType?.includes('普通') || this.vehicleLicenseInfo?.vehicleType?.includes('摩托') ) {
this.vehicleTypes.map(item => { this.vehicleTypes.map(item => {
@ -611,12 +379,6 @@ export default {
this.vehicleFrontPhoto = res.data; this.vehicleFrontPhoto = res.data;
await this.ocrCarFrontHandler() 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 识别 async ocrCarFrontHandler() { // 车辆正面 orc 识别
let res = await ocrHandler({ let res = await ocrHandler({
ocrType: 10, ocrType: 10,
@ -731,22 +493,14 @@ export default {
this.selectedOption=result.vehicleType?.split(',').map((item)=>{ this.selectedOption=result.vehicleType?.split(',').map((item)=>{
return Number(item); return Number(item);
}); });
this.virtualVehicle = result.virtualVehicle; this.serviceIds=result.serviceIds
this.$refs.tree.setCheckedKeys(result.serviceIds)
this.vehicleStatus = result.vehicleStatus
this.vehicleLicenseFront = result.vehicleLicenseFront; this.vehicleLicenseFront = result.vehicleLicenseFront;
this.vehicleLicenseBack = result.vehicleLicenseBack; this.vehicleLicenseBack = result.vehicleLicenseBack;
this.vehicleFrontPhoto = result.vehicleFrontPhoto; this.vehicleFrontPhoto = result.vehicleFrontPhoto;
this.insurancePicturePhoto = result.insurancePicturePhoto;
this.vehicleLicenseInfo = result.vehicleLicenseInfo; this.vehicleLicenseInfo = result.vehicleLicenseInfo;
this.vehicleLicenseCarPhoto = result.vehicleLicenseCarPhoto; this.vehicleLicenseCarPhoto = result.vehicleLicenseCarPhoto;
this.vehicleLicense = result.vehicleLicense; this.vehicleLicense = result.vehicleLicense;
this.vehicleFrontLicensePlate = result.vehicleFrontLicensePlate; this.vehicleFrontLicensePlate = result.vehicleFrontLicensePlate;
this.hasLiabilityInsurance = result.hasLiabilityInsurance
this.vehicleStatus = result.vehicleStatus
if(this.insurancePicturePhoto) {
this.insurancePictureFiles = [{url: this.insurancePicturePhoto}]
}
if( this.vehicleLicenseFront ) { if( this.vehicleLicenseFront ) {
this.vehicleLicenseFrontList = [{ url : this.vehicleLicenseFront }]; this.vehicleLicenseFrontList = [{ url : this.vehicleLicenseFront }];
} }
@ -759,28 +513,9 @@ export default {
if(this.vehicleLicenseCarPhoto) { if(this.vehicleLicenseCarPhoto) {
this.vehicleLicenseCarPhotoList = [{ url : 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){ isChange(e){
this.hasLiabilityInsurance=e this.isJoin=e
if (e === 0) {
Dialog.confirm({
title: '提醒',
message: '有救援职业责任险车辆会提升案件聚合能力和接单能力。',
confirmButtonText: '我已知晓', // 确认按钮文字,默认为“确认”
showCancelButton: false // 是否显示取消按钮,默认为 true。如果不需要取消按钮可以设置为 false。
})
.then(() => { /* 确认后的操作 */ })
.catch(() => { /* 取消后的操作 */ });
}
},
isVehicleChange(e) {
this.vehicleStatus=e
}, },
async submitBtn(){ async submitBtn(){
if( !this.vehicleLicenseFront ) { if( !this.vehicleLicenseFront ) {
@ -808,42 +543,13 @@ export default {
return return
} }
if(!(this.selectedOption.length > 0)){ 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.$toast('救援职业责任险不能为空')
return
}
if(!this.insurancePicturePhoto && this.hasLiabilityInsurance == 1) { // 有职业责任险,就需要有保单照片
this.$toast('保单照片不能为空')
return return
} }
if(this.selectedOption?.length==1 && this.selectedOption.includes(1)){//选择小修车时需清除原本的拖车服务类型 if(this.selectedOption?.length==1 && this.selectedOption.includes(1)){//选择小修车时需清除原本的拖车服务类型
let data=this.oldSupplierServiceList.filter(item => item.name ==='拖车服务') let data=this.oldSupplierServiceList.filter(item => item.name ==='拖车服务')
this.serviceIds = this.serviceIds.filter(item => !data[0].children.some(obj => obj.id === item)); 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({ await saveVehicle({
vehicleId:this.id ? this.id : '', vehicleId:this.id ? this.id : '',
plateNumber:this.carNum ? this.carNum :'', plateNumber:this.carNum ? this.carNum :'',
@ -857,12 +563,6 @@ export default {
vehicleLicenseCarPhoto: this.vehicleLicenseCarPhoto, vehicleLicenseCarPhoto: this.vehicleLicenseCarPhoto,
vehicleLicense: this.vehicleLicense, vehicleLicense: this.vehicleLicense,
vehicleFrontLicensePlate:this.vehicleFrontLicensePlate, 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){ if(this.id){
this.$toast('修改成功') this.$toast('修改成功')

View File

@ -18,46 +18,6 @@
</template> </template>
</van-nav-bar> </van-nav-bar>
</div> </div>
<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="liabilityInsuranceAudit" placeholder="职业责任险" :class="{'customSel':true , 'has-value': liabilityInsuranceAudit }" clearable>
<el-option
v-for="item in insuresOptions"
:key="item.value"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
<!-- </div>-->
</div>
<van-pull-refresh v-model="isLoading" @refresh="onRefresh"> <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
<van-list <van-list
v-model="loading" v-model="loading"
@ -69,26 +29,15 @@
<div class="carCode"> <div class="carCode">
<div class="codeLeft">{{item.plateNumber}} / {{item.vehicleTypeString}}</div> <div class="codeLeft">{{item.plateNumber}} / {{item.vehicleTypeString}}</div>
<div class="twoBtn"> <div class="twoBtn">
<span> {{ item.vehicleStatus == 1 ? '正常' : '停用' }} </span> <button v-if="permissonList.includes('vehicleAddBtn')" class="del" @click="deleteItem(item.vehicleId)">删除</button>
<!-- <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> <button v-if="permissonList.includes('vehicleModifyBtn')" class="revise" @click="updateVehicle(item)">修改</button>
</div> </div>
</div> </div>
<div class="juhe flex-between"> <div class="carType">{{ item.serviceName }}</div>
<span class="zdJuhe mr10">核验<span :class="item.inputStatus == 1 ? 'isYes' :'isNo'">{{item.inputStatus == 1 ? '已核验' :'未核验'}}</span></span>
<span class="zdJuhe">认证<span :class="item.authStatus == 1 ? 'isYes' :'isNo'">{{item.authStatus == 1 ? '已认证' :'未认证'}}</span></span>
</div>
<div class="juhe">
<span class="zdJuhe mr10">最近登录时间{{item.lastLoginTime}}</span>
</div>
<div class="juhe">
<span class="zdJuhe mr10">救援职业责任险情况<span :class="getClass(item.liabilityInsuranceAudit)?.className">{{getClass(item.liabilityInsuranceAudit)?.title}}</span></span>
</div>
<!--<div class="carType">{{ item.serviceName }}</div>
<div class="juhe"> <div class="juhe">
<span class="zdJuhe">是否参与中道聚合: </span> <span class="zdJuhe">是否参与中道聚合: </span>
<span :class="item.hasPolymerization.code == 0 ? 'isYes' :'isNo'">{{item.hasPolymerization.label}}</span> <span :class="item.hasPolymerization.code == 0 ? 'isYes' :'isNo'">{{item.hasPolymerization.label}}</span>
</div>--> </div>
</div> </div>
</van-list> </van-list>
@ -116,49 +65,6 @@ export default {
loading: false, loading: false,
finished: false, finished: false,
permissonList:[], permissonList:[],
inputStatusList: [],
searchVal: '',
authStates: [],
liabilityInsuranceAudit: [],
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() { mounted() {
@ -166,37 +72,6 @@ export default {
this.getPermissions(); this.getPermissions();
}, },
methods:{ methods:{
getClass(id) {
const ids = String(id)
const steps = {
'1': {
title: '待审核',
className: 'insuranceMain'
},
'2': {
title: '有责任险',
className: 'insuranceSuccess'
},
'3': {
title: '有货物险',
className: 'insuranceTip'
},
'4': {
title: '未通过(点击显示原因)',
className: 'insuranceDanger'
},
'5': {
title: '无',
className: ''
},
'6': {
title: '空',
className: ''
}
}
return steps[ids] || { title: '', className: '' }
},
async onLoad(){ async onLoad(){
await this.getVehicleList() await this.getVehicleList()
this.pageNum++; this.pageNum++;
@ -246,12 +121,6 @@ export default {
this.pageNum=1 this.pageNum=1
await this.getVehicleList(); await this.getVehicleList();
}, },
async resetHandler() {
// debounce(async () => {
this.pageNum=1
await this.getVehicleList();
// }, 1000)
},
updateVehicle(item){//修改 updateVehicle(item){//修改
this.$router.push({ this.$router.push({
name:'vehicleAdd', name:'vehicleAdd',
@ -292,7 +161,7 @@ export default {
} }
} }
.carItem{ .carItem{
@include wh(100%,110px); @include wh(100%,86px);
background: #FFFFFF; background: #FFFFFF;
box-shadow: 0px 2px 10px 0px rgba(216,216,216,0.5); box-shadow: 0px 2px 10px 0px rgba(216,216,216,0.5);
@include radiusSizing(6px); @include radiusSizing(6px);
@ -306,7 +175,6 @@ export default {
} }
.twoBtn{ .twoBtn{
display: flex; display: flex;
align-items: center;
button{ button{
border: none; border: none;
padding: 4px 8px; padding: 4px 8px;
@ -343,107 +211,4 @@ export default {
@include fontWeightSize(400,12px); @include fontWeightSize(400,12px);
} }
} }
.mr10 { </style>
margin-right: 10px;
}
.insuranceMain {
color: #354D93;
}
.insuranceSuccess {
color: green;
}
.insuranceTip {
color: orange;
}
.insuranceDanger {
color: red;
}
.flex-between {
display: flex;
justify-content: space-between;
}
.filterWrap {
width: calc(100% - 5px);
padding-right: 5px;
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: 100px;
/*width: 100%;*/
height: 25px;
background: #F5F5F5;
border-radius: 4px;
font-size: 10px;
color: #323233;
margin-left: 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;
}
</style>

View File

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

View File

@ -56,7 +56,7 @@
auditTip: '', auditTip: '',
statusStr: '', statusStr: '',
verifyStatus: '', verifyStatus: '',
type: localStorage.getItem('type') type: 'full',
} }
}, },
mixins: [ myMixins ], mixins: [ myMixins ],
@ -74,6 +74,16 @@
// }, // },
async mounted() { async mounted() {
// await this.$onLaunched; // await this.$onLaunched;
// 禁止双击放大
let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault(); // 阻止双击放大
}
lastTouchEnd = now;
}, { passive: false });
await this.refresh() await this.refresh()
}, },
methods: { methods: {
@ -105,7 +115,9 @@
return this.currentStep > status return this.currentStep > status
}, },
showDetail(path) { showDetail(path) {
this.goPage(path) this.goPage(path,{
token:localStorage.getItem('token')
})
}, },
getVerifyStatus() { getVerifyStatus() {
if( this.type == 'simple' ) { if( this.type == 'simple' ) {
@ -128,6 +140,8 @@
padding-bottom: 80px; padding-bottom: 80px;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
} }
.audit_list { .audit_list {
padding: 20px 30px; padding: 20px 30px;

View File

@ -8,7 +8,7 @@
:border="false" :border="false"
:fixed="true" :fixed="true"
:safe-area-inset-top="true" :safe-area-inset-top="true"
@click-left="h5GoBack" @click-left="goListPage"
/> />
</div> </div>
<tip-bar :title="'温馨提示:服务完成后,平台代收的运费需要提现到您的银行卡账户中,请确保您上传的银行卡信息真实可用。'"></tip-bar> <tip-bar :title="'温馨提示:服务完成后,平台代收的运费需要提现到您的银行卡账户中,请确保您上传的银行卡信息真实可用。'"></tip-bar>
@ -41,7 +41,7 @@
import fixedButton from "./component/fixedButton"; import fixedButton from "./component/fixedButton";
import photoItem from "./component/photoItem"; import photoItem from "./component/photoItem";
import tipBar from "./component/tipBar"; import tipBar from "./component/tipBar";
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail } from '@/api/authentication.js' import {ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, infoVerifyProgress} from '@/api/authentication.js'
import { leftCopy } from '@/utils/common.js' import { leftCopy } from '@/utils/common.js'
import { myMixins } from '@/utils/myMixins.js' import { myMixins } from '@/utils/myMixins.js'
export default { export default {
@ -67,15 +67,22 @@
} }
}, },
async mounted() { async mounted() {
// 禁止双击放大
let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault(); // 阻止双击放大
}
lastTouchEnd = now;
}, { passive: false });
// if(options?.show) { // if(options?.show) {
this.show = true this.show = true
// } // }
if( this.show ) { if( this.show ) {
await this.getDetail() await this.getDetail()
} }
},
async onShow() {
}, },
methods: { methods: {
async clickHandler() { async clickHandler() {
@ -94,13 +101,25 @@
verifyType: 4 verifyType: 4
}) })
setTimeout(() => { setTimeout(() => {
this.h5GoBack() this.goListPage()
}, 100) }, 100)
console.log('注册', res) console.log('注册', res)
} else { } else {
this.$toast('银行卡信息识别错误') this.$toast('银行卡信息识别错误')
} }
}, },
async getRegisterInfo(data) {
let res = await infoVerifyProgress( data)
localStorage.setItem('infoVerify', res?.data?.infoVerify?.code)
localStorage.setItem('failReason', res?.data?.verifyRemark)
localStorage.setItem('authIsSuccess', res?.data?.authIsSuccess)
localStorage.setItem('name', res?.data?.name)
},
goListPage(){
this.goPage('auditList',{
token:localStorage.getItem('token')
})
},
async bankHandler(data) { async bankHandler(data) {
this.form.bankName = '' this.form.bankName = ''
this.form.cardNumber = '' this.form.cardNumber = ''
@ -136,6 +155,8 @@
.content{ .content{
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
} }
.navBar{ .navBar{
margin-bottom: 46px; margin-bottom: 46px;

View File

@ -8,7 +8,7 @@
:border="false" :border="false"
:fixed="true" :fixed="true"
:safe-area-inset-top="true" :safe-area-inset-top="true"
@click-left="h5GoBack" @click-left="goListPage"
/> />
</div> </div>
<tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar> <tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar>
@ -70,7 +70,7 @@
import fixedButton from "./component/fixedButton"; import fixedButton from "./component/fixedButton";
import photoItem from "./component/photoItem"; import photoItem from "./component/photoItem";
import tipBar from "./component/tipBar"; import tipBar from "./component/tipBar";
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail } from '@/api/authentication.js' import {ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, infoVerifyProgress} from '@/api/authentication.js'
import { leftCopy } from '@/utils/common.js' import { leftCopy } from '@/utils/common.js'
import { myMixins } from '@/utils/myMixins.js' import { myMixins } from '@/utils/myMixins.js'
export default { export default {
@ -97,10 +97,20 @@
recordNumber: '', // 档案编号 recordNumber: '', // 档案编号
}, },
show: undefined, show: undefined,
type: localStorage.getItem('type'), type: 'full',
} }
}, },
async mounted() { async mounted() {
// 禁止双击放大
let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault(); // 阻止双击放大
}
lastTouchEnd = now;
}, { passive: false });
// if(options?.show) { // if(options?.show) {
this.show = true this.show = true
// } // }
@ -108,8 +118,6 @@
await this.getDetail() await this.getDetail()
} }
}, },
async onShow() {
},
methods: { methods: {
backInit() { backInit() {
this.form.recordNumber = '' this.form.recordNumber = ''
@ -179,9 +187,20 @@
verifyType: 2 verifyType: 2
}) })
setTimeout(() => { setTimeout(() => {
this.h5GoBack() this.goListPage()
}, 100) }, 100)
} }, async getRegisterInfo(data) {
let res = await infoVerifyProgress( data)
localStorage.setItem('infoVerify', res?.data?.infoVerify?.code)
localStorage.setItem('failReason', res?.data?.verifyRemark)
localStorage.setItem('authIsSuccess', res?.data?.authIsSuccess)
localStorage.setItem('name', res?.data?.name)
},
goListPage(){
this.goPage('auditList',{
token:localStorage.getItem('token')
})
},
} }
} }
</script> </script>
@ -193,8 +212,11 @@
background: #F4F5F7; background: #F4F5F7;
} }
.content{ .content{
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
} }
.navBar{ .navBar{
margin-bottom: 46px; margin-bottom: 46px;

View File

@ -8,7 +8,7 @@
:border="false" :border="false"
:fixed="true" :fixed="true"
:safe-area-inset-top="true" :safe-area-inset-top="true"
@click-left="h5GoBack" @click-left="goListPage"
/> />
</div> </div>
<tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar> <tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar>
@ -141,7 +141,7 @@
import fixedButton from "./component/fixedButton"; import fixedButton from "./component/fixedButton";
import photoItem from "./component/photoItem"; import photoItem from "./component/photoItem";
import tipBar from "./component/tipBar"; import tipBar from "./component/tipBar";
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail } from '@/api/authentication.js' import {ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, infoVerifyProgress} from '@/api/authentication.js'
import { leftCopy } from '@/utils/common.js' import { leftCopy } from '@/utils/common.js'
import { myMixins } from '@/utils/myMixins.js' import { myMixins } from '@/utils/myMixins.js'
import {areaList} from "@vant/area-data"; import {areaList} from "@vant/area-data";
@ -190,20 +190,27 @@
region:[], region:[],
}, },
show: undefined, show: undefined,
type: localStorage.getItem('type'), type: 'full',
tyreOptions:[{value:0,name:'0'},{value:2,name:'2'},{value:4,name:'4'}] tyreOptions:[{value:0,name:'0'},{value:2,name:'2'},{value:4,name:'4'}]
} }
}, },
async mounted() { async mounted() {
// 禁止双击放大
let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault(); // 阻止双击放大
}
lastTouchEnd = now;
}, { passive: false });
// if(options?.show) { // if(options?.show) {
this.show = true this.show = true
// } // }
if(this.show) { if(this.show) {
await this.getDetail() await this.getDetail()
} }
},
async onShow() {
}, },
methods: { methods: {
confirmHandle(val){ confirmHandle(val){
@ -294,9 +301,16 @@
verifyType: 3 verifyType: 3
}) })
setTimeout(() => { setTimeout(() => {
this.h5GoBack() this.goListPage()
}, 100) }, 100)
}, },
async getRegisterInfo(data) {
let res = await infoVerifyProgress( data)
localStorage.setItem('infoVerify', res?.data?.infoVerify?.code)
localStorage.setItem('failReason', res?.data?.verifyRemark)
localStorage.setItem('authIsSuccess', res?.data?.authIsSuccess)
localStorage.setItem('name', res?.data?.name)
},
carrierHandler(data) { // 承运人责任险照片 carrierHandler(data) { // 承运人责任险照片
console.log("data",data) console.log("data",data)
this.form.carrierLiabilityInsurancePhoto = data this.form.carrierLiabilityInsurancePhoto = data
@ -361,6 +375,11 @@
}); });
return res; return res;
}, },
goListPage(){
this.goPage('auditList',{
token:localStorage.getItem('token')
})
},
}, },
computed: { computed: {
regionText() { regionText() {
@ -380,9 +399,11 @@
margin-bottom: 46px; margin-bottom: 46px;
} }
.content { .content {
/*padding-bottom: 86px;*/ padding-bottom: 86px;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
} }
.carInfo .title { .carInfo .title {
width: 100% !important; width: 100% !important;

View File

@ -9,13 +9,15 @@
</van-radio-group> </van-radio-group>
</div> </div>
<div class="photoWrap" v-if="inSure == 1"> <div class="photoWrap" v-if="inSure == 1">
<van-uploader :after-read="(file) => afterRead(file,'urlList')" class="customUploadMul" :max-count="3" :disabled="!showFun()"> <van-uploader :after-read="(file) => afterRead(file,'urlList')" class="customUploadMul" @click-upload="(event)=>clickUpload(event,'urlList')">
<!-- -->
<!-- :max-count="3" v-model="fileList" multiple :deletable="true" -->
<template v-if="urlList.length > 0"> <template v-if="urlList.length > 0">
<div v-for="(item, index) in urlList" :key="'uploaded-' + index" class="uploaded-item"> <div v-for="(item, index) in urlList" :key="index" class="uploaded-item">
<img class="photo_item" mode="widthFix" :src="item.replace(/http:\/\//g, 'https://')" /> <img class="photo_item" mode="widthFix" :src="item.replace(/http:\/\//g, 'https://')" />
</div> </div>
</template> </template>
<template v-if="urlList.length < 3"> <template v-if="urlList.length < 3 && showFun()">
<div class="tipWrap"> <div class="tipWrap">
<img class="photo_item" mode="widthFix" src="@/assets/authentication/carInfo_icon5.png"/> <img class="photo_item" mode="widthFix" src="@/assets/authentication/carInfo_icon5.png"/>
<img class="camera" v-if="showFun()" src="@/assets/authentication/camera.png" /> <img class="camera" v-if="showFun()" src="@/assets/authentication/camera.png" />
@ -31,16 +33,16 @@
<span>{{title}}</span> <span>{{title}}</span>
</div> </div>
<div class="photo_img flex flex_between"> <div class="photo_img flex flex_between">
<van-uploader v-if="leftUrl" :after-read="(file) => afterRead(file,'leftImg')" class="customUpload" :disabled="!showFun()"> <van-uploader v-if="leftUrl" :after-read="(file) => afterRead(file,'leftImg')" class="customUpload" @click-upload="(event)=>clickUpload(event,'leftImg')">
<template v-if="form.leftImg"> <template v-if="form.leftImg">
<img class="photo_item" mode="widthFix" :src="form.leftImg.replace(/http:\/\//g, 'https://')" /> <img class="photo_item" mode="widthFix" :src="form.leftImg.replace(/http:\/\//g, 'https://')" />
</template> </template>
<template v-else> <template v-else>
<img class="photo_item" mode="widthFix" :src="leftUrl" /> <img class="photo_item" mode="widthFix" :src="leftUrl" />
<img class="camera" v-if="showFun()" src="@/assets/authentication/camera.png" /> <img class="camera" v-if="showFun()" src="@/assets/authentication/camera.png" />
</template> </template>
</van-uploader> </van-uploader>
<van-uploader v-if="rightUrl" :after-read="(file) => afterRead(file,'rightImg')" class="customUpload" :disabled="!showFun()"> <van-uploader v-if="rightUrl" :after-read="(file) => afterRead(file,'rightImg')" class="customUpload" @click-upload="(event)=>clickUpload(event,'rightImg')">
<template v-if="form.rightImg"> <template v-if="form.rightImg">
<img class="photo_item" mode="widthFix" :src="form.rightImg.replace(/http:\/\//g, 'https://')" /> <img class="photo_item" mode="widthFix" :src="form.rightImg.replace(/http:\/\//g, 'https://')" />
</template> </template>
@ -56,6 +58,8 @@
<script> <script>
import {uploadImage} from "@/api/mine"; import {uploadImage} from "@/api/mine";
import { ImagePreview } from 'vant';
/*let baseUrl='' /*let baseUrl=''
if (window.location.href.includes('www.sinoassist.com')) { if (window.location.href.includes('www.sinoassist.com')) {
baseUrl = 'https://www.sinoassist.com' baseUrl = 'https://www.sinoassist.com'
@ -95,37 +99,61 @@ export default {
isInsure:'', isInsure:'',
}, },
options:[{value:0,name:'否'},{value:1,name:'是'}], options:[{value:0,name:'否'},{value:1,name:'是'}],
localUrlList: [...this.urlList] // 使用本地副本操作
} }
}, },
watch:{
// 监听父组件传入的urlList变化
urlList(newVal) {
this.localUrlList = [...newVal];
},
// 监听inSure变化
inSure(newVal) {
this.form.isInsure = newVal;
}
},
mounted() { mounted() {
setTimeout(()=>{ setTimeout(()=>{
this.form.isInsure=this.inSure this.form.isInsure=this.inSure
// this.form.isInsure=1
},1500) },1500)
}, },
methods: { methods: {
async afterRead(file,type,index){ // 支持多文件上传 clickUpload(event,type){
if (!this.showFun()) {
let url=[]
if (type=='leftImg'){
url=[this.leftUrl?.replace(/http:\/\//g, 'https://')]
}else if(type=='rightImg'){
url= [this.rightUrl?.replace(/http:\/\//g, 'https://')]
}else{
url=this.urlList?.map(item => item?.replace(/http:\/\//g, 'https://'))
}
ImagePreview({
images: url,
closeable: true,
showIndex:false
});
console.log(url)
event.stopPropagation(); // 阻止事件冒泡
event.preventDefault(); // 阻止默认上传行为(如果支持)
return false; // 阻止后续逻辑
}
// 默认行为(允许上传)
},
async afterRead(file,type){ // 支持多文件上传
const formData = new FormData(); const formData = new FormData();
formData.append("file" , file.file); formData.append("file" , file.file);
let res = await uploadImage(formData) let res = await uploadImage(formData)
if (type=='urlList' && (index==0 || index)){ if (type=='urlList'){
this.$set( this.form.urlList,index,res.data) console.log("this.urlList",this.urlList?.length)
}else if(type=='urlList'){ if(this.urlList?.length==3){
this.form[type].push(...this.urlList,res.data) const updatedList = [...this.urlList];
updatedList[2] = res?.data?.replace(/http:\/\//g, 'https://');
this.form.urlList = updatedList;
}else{
this.form.urlList=[res?.data?.replace(/http:\/\//g, 'https://'),...this.urlList]
}
const uniqueUrls = this.form.urlList?.reduce((acc, url) => {
if (!acc.includes(url)) {
acc.push(url);
}
return acc;
}, []);
this.$emit(type, uniqueUrls)
}else{ }else{
this.form[type] = res.data this.form[type] = res.data
this.$emit(type, this.form[type])
} }
this.$emit(type, this.form[type])
}, },
radioChange(val){ radioChange(val){
this.$emit('insureHandle',val) this.$emit('insureHandle',val)
@ -158,10 +186,23 @@ export default {
width: 100% !important; width: 100% !important;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
/* ::v-deep .van-uploader__preview{
width: 100% !important;
}*/
} }
.uploaded-item,.tipWrap{ .uploaded-item,.tipWrap{
width: calc(50% - 3px); width: calc(50% - 3px);
} }
::v-deep .van-uploader__preview{
width: calc(50% - 3px);
margin: 0 0 8px 0;
.van-uploader__preview-image{
width: 100% !important;
}
}
::v-deep .van-uploader__preview:nth-child(odd){
margin-right: 5px !important;
}
} }
.photo_wrap { .photo_wrap {
padding: 20px 12px 22px 17px; padding: 20px 12px 22px 17px;
@ -253,3 +294,8 @@ export default {
} }
} }
</style> </style>
<style>
.van-image-preview{
z-index: 9999999999 !important;
}
</style>

View File

@ -8,7 +8,7 @@
:border="false" :border="false"
:fixed="true" :fixed="true"
:safe-area-inset-top="true" :safe-area-inset-top="true"
@click-left="h5GoBack" @click-left="goListPage"
/> />
</div> </div>
<tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar> <tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar>
@ -37,7 +37,7 @@
<input type="text" disabled placeholder="请输入持卡人性别" v-model="form.sex"> <input type="text" disabled placeholder="请输入持卡人性别" v-model="form.sex">
<input type="text" placeholder="请输入持卡人身份证号" v-model="form.identityCardNumber"> <input type="text" placeholder="请输入持卡人身份证号" v-model="form.identityCardNumber">
</div> </div>
</div>= </div>
<fixed-button title="实名认证" @myClick="goRealName" v-if="showFun() && !esignFlag"></fixed-button> <fixed-button title="实名认证" @myClick="goRealName" v-if="showFun() && !esignFlag"></fixed-button>
<fixed-button @myClick="clickHandler" v-if="showFun() && esignFlag"></fixed-button> <fixed-button @myClick="clickHandler" v-if="showFun() && esignFlag"></fixed-button>
<!-- <protocol-dialog></protocol-dialog>--> <!-- <protocol-dialog></protocol-dialog>-->
@ -49,7 +49,13 @@
import fixedButton from "./component/fixedButton"; import fixedButton from "./component/fixedButton";
import photoItem from "./component/photoItem"; import photoItem from "./component/photoItem";
import tipBar from "./component/tipBar"; import tipBar from "./component/tipBar";
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, driverRealName } from '@/api/authentication' import {
ocrRecognize,
driverInfoVerify,
driverInfoVerifyDetail,
driverRealName,
infoVerifyProgress
} from '@/api/authentication'
import { leftCopy } from '@/utils/common.js' import { leftCopy } from '@/utils/common.js'
import { myMixins } from '@/utils/myMixins.js' import { myMixins } from '@/utils/myMixins.js'
// import {version} from "@/utils/baseUrl" // import {version} from "@/utils/baseUrl"
@ -80,23 +86,40 @@
headerUrl: require('@/assets/authentication/person_header.png'), headerUrl: require('@/assets/authentication/person_header.png'),
idFront: require('@/assets/authentication/person_idcard1.png'), idFront: require('@/assets/authentication/person_idcard1.png'),
idBack: require('@/assets/authentication/person_idcard2.png'), idBack: require('@/assets/authentication/person_idcard2.png'),
user:'',
cardId:'',
show: undefined, show: undefined,
type: localStorage.getItem('type'), type: 'full',
esignFlag: false, esignFlag: false,
} }
}, },
async mounted() { async mounted() {
// if(options?.show) { // 禁止双击放大
this.show = true let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault(); // 阻止双击放大
}
lastTouchEnd = now;
}, { passive: false });
this.show = true
if( this.show ) { if( this.show ) {
await this.getDetail() await this.getDetail()
} }
// } const urlParams = new URLSearchParams(window.location.search);
}, console.log('window.location',window.location)
async onShow() { // console.log("urlParams",urlParams)
this.esignFlag = localStorage.getItem('esignFlag'); // console.log("decodeURIComponent( window.location.href)",decodeURIComponent( window.location.href))
this.esignFlag = urlParams.get('esignFlag') || localStorage.getItem("esignFlag")
if(window.location.search){
console.log('有参数')
this.esignFlag = localStorage.getItem("esignFlag") || urlParams.get('esignFlag')
}else {
console.log('无参数,说明认证成功')
this.esignFlag =true
}
localStorage.setItem("esignFlag",this.esignFlag )
console.log("this.esignFlag ",this.esignFlag )
}, },
methods: { methods: {
async getDetail() { async getDetail() {
@ -104,6 +127,12 @@
verifyType: 1 verifyType: 1
}) })
leftCopy(this.form, {...res?.data?.personalInfoData}) leftCopy(this.form, {...res?.data?.personalInfoData})
let personAuditInfo=localStorage.getItem("personAuditInfo") ? JSON.parse(localStorage.getItem("personAuditInfo")) : ''
if(!personAuditInfo){
return
}
console.log('personAuditInfo.form',personAuditInfo.form)
this.form={...personAuditInfo.form}
}, },
async headerHandler(data) { async headerHandler(data) {
this.form.icon = data this.form.icon = data
@ -130,7 +159,6 @@
imageUrl: url imageUrl: url
}); });
let idInfo = res?.data?.data?.back?.data let idInfo = res?.data?.data?.back?.data
// let validPeriod = '2014.07.09-长期'
let validPeriod = idInfo?.validPeriod; // 有效期 let validPeriod = idInfo?.validPeriod; // 有效期
this.form.idCardAuthority = idInfo?.issueAuthority this.form.idCardAuthority = idInfo?.issueAuthority
let dateArr = validPeriod.split('-'); let dateArr = validPeriod.split('-');
@ -167,30 +195,20 @@
this.$toast('身份证正面照片未上传') this.$toast('身份证正面照片未上传')
return return
} }
const urlParams = new URLSearchParams(window.location.search);
let token = urlParams.get('token');
if(this.form.name && this.form.identityCardNumber) { if(this.form.name && this.form.identityCardNumber) {
let res = await driverRealName( { let res = await driverRealName( {
phone: this.form.phone, phone: this.form.phone,
name: this.form.name, name: this.form.name,
idNo: this.form.identityCardNumber, idNo: this.form.identityCardNumber,
token:token,
jump:1
}) })
let info = res?.data let info = res?.data
console.log('info', info) console.log('info', info)
localStorage.setItem("personAuditInfo",JSON.stringify({form:this.form}))
window.location.href=info?.shortLink window.location.href=info?.shortLink
// window.open(info?.shortLink)
/* let env = version=='release' ? 'prod' : 'sml'
wx.navigateToMiniProgram({
appId: 'wx1cf2708c2de46337', // 上链公证签小程序APPID
path: '/pages/index/index', // 上链公证签页面地址
extraData: {
requestObj: { // 必填,入参
flowId: info?.flowId, // 必填认证流程Id
type: 'REALNAME',// 必填,业务类型:实名 REALNAME
env: env // 非必填,对接环境:线上 prod(默认), 模拟 sml(用于对接调试阶段)
},
callbackObj: { // 非必填,回传数据:签署完成后会将此数据完整回传
}
},
})*/
} else { } else {
this.$toast('身份证信息识别错误') this.$toast('身份证信息识别错误')
} }
@ -218,13 +236,26 @@
await this.getRegisterInfo({ await this.getRegisterInfo({
verifyType: 1 verifyType: 1
}) })
localStorage.setItem("personAuditInfo",'')
setTimeout(() => { setTimeout(() => {
this.goListPage()
}, 100) }, 100)
} else { } else {
this.$toast('身份证信息识别错误') this.$toast('身份证信息识别错误')
} }
}, },
goListPage(){
this.goPage('auditList',{
token:localStorage.getItem('token')
})
},
async getRegisterInfo(data) {
let res = await infoVerifyProgress( data)
localStorage.setItem('infoVerify', res?.data?.infoVerify?.code)
localStorage.setItem('failReason', res?.data?.verifyRemark)
localStorage.setItem('authIsSuccess', res?.data?.authIsSuccess)
localStorage.setItem('name', res?.data?.name)
},
} }
} }
</script> </script>
@ -244,7 +275,9 @@
} }
.content { .content {
padding-bottom: 86px; padding-bottom: 86px;
height: 100%; height: 90%;
overflow-y: auto; overflow-y: auto;
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
} }
</style> </style>