Compare commits
14 Commits
prod-25-09
...
1a15772f08
| Author | SHA1 | Date | |
|---|---|---|---|
| 1a15772f08 | |||
| 8f066a7bbf | |||
| d3e91f584f | |||
| d04ed28ec2 | |||
| 36db96808a | |||
| 781ef75913 | |||
| e7b0cfb006 | |||
| 57b4bc2e59 | |||
| 990db65d25 | |||
| cebb173ec4 | |||
| 8968f4caa9 | |||
| 40ab15266a | |||
| 6bc55d7b89 | |||
| 06191163a2 |
@ -31,10 +31,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 src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
|
||||
<script>
|
||||
// VConsole 默认会挂载到 `window.VConsole` 上
|
||||
// let vConsole = new window.VConsole();
|
||||
let vConsole = new window.VConsole();
|
||||
(function (doc, win) {
|
||||
// console.log("==window.location.pathname===",window.location.pathname)
|
||||
let docEl = doc.documentElement
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
}]
|
||||
}
|
||||
},
|
||||
@ -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.vehicleStatus = result.vehicleStatus
|
||||
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,13 +808,42 @@ 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.$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 :'',
|
||||
@ -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('修改成功')
|
||||
|
||||
@ -18,6 +18,46 @@
|
||||
</template>
|
||||
</van-nav-bar>
|
||||
</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-list
|
||||
v-model="loading"
|
||||
@ -29,15 +69,26 @@
|
||||
<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>
|
||||
<span> {{ item.vehicleStatus == 1 ? '正常' : '停用' }} </span>
|
||||
<!-- <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>
|
||||
</div>
|
||||
<div class="carType">{{ item.serviceName }}</div>
|
||||
<div class="juhe flex-between">
|
||||
<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">
|
||||
<span class="zdJuhe">是否参与中道聚合: </span>
|
||||
<span :class="item.hasPolymerization.code == 0 ? 'isYes' :'isNo'">{{item.hasPolymerization.label}}</span>
|
||||
</div>
|
||||
</div>-->
|
||||
</div>
|
||||
|
||||
</van-list>
|
||||
@ -65,6 +116,49 @@ export default {
|
||||
loading: false,
|
||||
finished: false,
|
||||
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() {
|
||||
@ -72,6 +166,37 @@ export default {
|
||||
this.getPermissions();
|
||||
},
|
||||
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(){
|
||||
await this.getVehicleList()
|
||||
this.pageNum++;
|
||||
@ -121,6 +246,12 @@ export default {
|
||||
this.pageNum=1
|
||||
await this.getVehicleList();
|
||||
},
|
||||
async resetHandler() {
|
||||
// debounce(async () => {
|
||||
this.pageNum=1
|
||||
await this.getVehicleList();
|
||||
// }, 1000)
|
||||
},
|
||||
updateVehicle(item){//修改
|
||||
this.$router.push({
|
||||
name:'vehicleAdd',
|
||||
@ -161,7 +292,7 @@ export default {
|
||||
}
|
||||
}
|
||||
.carItem{
|
||||
@include wh(100%,86px);
|
||||
@include wh(100%,110px);
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 2px 10px 0px rgba(216,216,216,0.5);
|
||||
@include radiusSizing(6px);
|
||||
@ -175,6 +306,7 @@ export default {
|
||||
}
|
||||
.twoBtn{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
button{
|
||||
border: none;
|
||||
padding: 4px 8px;
|
||||
@ -211,4 +343,107 @@ export default {
|
||||
@include fontWeightSize(400,12px);
|
||||
}
|
||||
}
|
||||
.mr10 {
|
||||
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>
|
||||
@ -65,8 +65,8 @@
|
||||
<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'"
|
||||
:is-store="false" @clickComplain="clickJumpHandle(7)"></circle-char>
|
||||
<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>
|
||||
<circle-char ref="Doughnut2" :data="indexData && indexData.customerSatisfaction" :title-text="'平安好评率'"
|
||||
:bg-color="Number(indexData?.customerSatisfaction || 0) >= 99.4 ? 'green' : 'red'"></circle-char>
|
||||
<circle-char ref="Doughnut3" :data="indexData && indexData.urgeRate" :title-text="'催促率'"
|
||||
:bg-color="Number(indexData?.urgeRate || 0) >= 3 ? 'red' : 'green'"></circle-char>
|
||||
</div>
|
||||
@ -78,7 +78,7 @@
|
||||
:is-store="false"
|
||||
@clickUse="clickJumpHandle(8)"></circle-char>
|
||||
<circle-char ref="Doughnut5" :data="indexData && indexData.threeMinutesContactRate" :title-text="'3′联系客户率'" :bg-color="Number(indexData?.threeMinutesContactRate || 0) >= 90 ? 'green' : 'red'"></circle-char>
|
||||
<circle-char ref="Doughnut6" :data="indexData && indexData.wholeJuheSuccessRate" :title-text="'总聚合成功率'" :is-store="false" :bg-color="Number(indexData?.wholeJuheSuccessRate || 0) >= 80 ? 'green' : 'red'"></circle-char>
|
||||
<circle-char ref="Doughnut6" :data="indexData && indexData.polymerizationSuccessRate" :title-text="'总聚合成功率'" :bg-color="Number(indexData?.polymerizationSuccessRate || 0) >= 80 ? 'green' : 'red'"></circle-char>
|
||||
</div>
|
||||
</div>
|
||||
<div :class="{'reciceOrder':true,'webCom':!isMobile}">
|
||||
@ -88,9 +88,9 @@
|
||||
<div class="num" :class="{'numRed': Number(indexData?.receiving) > 5, 'numGreen': Number(indexData?.receiving) <= 5 }">{{ indexData && indexData.receiving }}</div>
|
||||
<div class="itemTitle">接单时效(分)</div>
|
||||
</div>
|
||||
<div class="line" v-if="false"></div>
|
||||
<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="line"></div>
|
||||
<div class="center common">
|
||||
<div class="num" :class="{'numRed': Number(indexData?.polymerizationSuccessArriving) > 22, 'numGreen': Number(indexData?.polymerizationSuccessArriving) <= 22 }">{{ indexData && indexData.polymerizationSuccessArriving }}</div>
|
||||
<div class="itemTitle">平安聚合成功到达时效(分)</div>
|
||||
</div>
|
||||
<div class="line"></div>
|
||||
@ -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: '时效 '}],
|
||||
// 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()
|
||||
@ -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,
|
||||
@ -1007,16 +991,14 @@ export default {
|
||||
'threeMinutesContactRate',
|
||||
'urgeRate',
|
||||
'appRate',
|
||||
'polymerizationSuccessRate',
|
||||
'pinganFavorableRate',
|
||||
'wholeJuheSuccessRate',
|
||||
'polymerizationSuccessRate'
|
||||
];
|
||||
for (let key in this.indexData){
|
||||
if (propertiesToProcess.includes(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({
|
||||
startTime: this.active === 1 ? this.startMonthTime : this.startTime,
|
||||
endTime: this.endTime,
|
||||
@ -1047,8 +1029,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 +1036,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 +1068,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 +1110,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 +1120,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 +1130,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: ''},无催促次数,催促一次生成一条新的
|
||||
{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 +1167,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 +1198,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 +1214,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 +1268,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 +1311,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)
|
||||
@ -1401,7 +1373,7 @@ export default {
|
||||
if (this.value == 1) {
|
||||
this.detailList?.map(item => {
|
||||
this.v1.push(item.receiving)
|
||||
this.v2.push(item.threeMinutesContactRate.replace('%', ''))
|
||||
this.v2.push(item.threeMinutesReceivingRate.replace('%', ''))
|
||||
})
|
||||
} else {
|
||||
this.detailList?.map(item => {
|
||||
@ -1415,7 +1387,7 @@ export default {
|
||||
columnObj.label = item.month // 每一列的标题的名称
|
||||
columnObj.prop = props + index //自定义每一列标题字段名称
|
||||
this.etlLabelList.push(columnObj)
|
||||
let mappings = [ 'receiving', 'threeMinutesContactRate', 'arriving','fortyMinutesArrivalRate','polymerizationSuccessArriving'];
|
||||
let mappings = [ 'receiving', 'threeMinutesReceivingRate', 'arriving','fortyMinutesArrivalRate','polymerizationSuccessArriving'];
|
||||
for (let i = 0; i < mappings.length; i++) {
|
||||
this.$set(this.etlDetailList[i], columnObj.prop, item[mappings[i]]);
|
||||
}
|
||||
@ -1423,7 +1395,7 @@ export default {
|
||||
} else {
|
||||
this.detailList?.map(item => {
|
||||
this.v1.push(item.receiving)
|
||||
this.v2.push(item.threeMinutesContactRate.replace('%', ''))
|
||||
this.v2.push(item.threeMinutesReceivingRate.replace('%', ''))
|
||||
})
|
||||
if (this.swithVal) {
|
||||
this.detailList?.map(item => {
|
||||
@ -1442,12 +1414,12 @@ export default {
|
||||
this.labelList = [
|
||||
{label: '月份', prop: 'month'},
|
||||
{label: '接单时效', prop: 'receiving'},
|
||||
{label: '3分钟联系客户率', prop: 'threeMinutesContactRate'},
|
||||
{label: '3分钟联系客户率', prop: 'threeMinutesReceivingRate'},
|
||||
{label: '到达时效', prop: 'arriving'},
|
||||
{label: '平安聚合成功到达时效', prop: 'pinganJuheSuccessArriving'},
|
||||
]
|
||||
}
|
||||
} else if (this.active === 2) {
|
||||
} else if (this.active === 2) {//日总
|
||||
if (this.activeIndex === 0) {//接单指标
|
||||
this.labelList = [
|
||||
{label: '日', prop: 'date'},
|
||||
@ -1491,12 +1463,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 +1492,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 +1558,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'},
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -1624,7 +1598,7 @@ export default {
|
||||
case 6:
|
||||
return 1;
|
||||
case 7:
|
||||
return 2;
|
||||
return 7;
|
||||
case 8:
|
||||
return 3;
|
||||
case 9:
|
||||
|
||||
@ -56,7 +56,7 @@
|
||||
auditTip: '',
|
||||
statusStr: '',
|
||||
verifyStatus: '',
|
||||
type: 'full',
|
||||
type: localStorage.getItem('type')
|
||||
}
|
||||
},
|
||||
mixins: [ myMixins ],
|
||||
@ -74,16 +74,6 @@
|
||||
// },
|
||||
async mounted() {
|
||||
// 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()
|
||||
},
|
||||
methods: {
|
||||
@ -115,9 +105,7 @@
|
||||
return this.currentStep > status
|
||||
},
|
||||
showDetail(path) {
|
||||
this.goPage(path,{
|
||||
token:localStorage.getItem('token')
|
||||
})
|
||||
this.goPage(path)
|
||||
},
|
||||
getVerifyStatus() {
|
||||
if( this.type == 'simple' ) {
|
||||
@ -140,8 +128,6 @@
|
||||
padding-bottom: 80px;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
|
||||
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
|
||||
}
|
||||
.audit_list {
|
||||
padding: 20px 30px;
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
:border="false"
|
||||
:fixed="true"
|
||||
:safe-area-inset-top="true"
|
||||
@click-left="goListPage"
|
||||
@click-left="h5GoBack"
|
||||
/>
|
||||
</div>
|
||||
<tip-bar :title="'温馨提示:服务完成后,平台代收的运费需要提现到您的银行卡账户中,请确保您上传的银行卡信息真实可用。'"></tip-bar>
|
||||
@ -41,7 +41,7 @@
|
||||
import fixedButton from "./component/fixedButton";
|
||||
import photoItem from "./component/photoItem";
|
||||
import tipBar from "./component/tipBar";
|
||||
import {ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, infoVerifyProgress} from '@/api/authentication.js'
|
||||
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail } from '@/api/authentication.js'
|
||||
import { leftCopy } from '@/utils/common.js'
|
||||
import { myMixins } from '@/utils/myMixins.js'
|
||||
export default {
|
||||
@ -67,22 +67,15 @@
|
||||
}
|
||||
},
|
||||
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) {
|
||||
this.show = true
|
||||
// }
|
||||
if( this.show ) {
|
||||
await this.getDetail()
|
||||
}
|
||||
},
|
||||
async onShow() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
async clickHandler() {
|
||||
@ -101,25 +94,13 @@
|
||||
verifyType: 4
|
||||
})
|
||||
setTimeout(() => {
|
||||
this.goListPage()
|
||||
this.h5GoBack()
|
||||
}, 100)
|
||||
console.log('注册', res)
|
||||
} else {
|
||||
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) {
|
||||
this.form.bankName = ''
|
||||
this.form.cardNumber = ''
|
||||
@ -155,8 +136,6 @@
|
||||
.content{
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
|
||||
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
|
||||
}
|
||||
.navBar{
|
||||
margin-bottom: 46px;
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
:border="false"
|
||||
:fixed="true"
|
||||
:safe-area-inset-top="true"
|
||||
@click-left="goListPage"
|
||||
@click-left="h5GoBack"
|
||||
/>
|
||||
</div>
|
||||
<tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar>
|
||||
@ -70,7 +70,7 @@
|
||||
import fixedButton from "./component/fixedButton";
|
||||
import photoItem from "./component/photoItem";
|
||||
import tipBar from "./component/tipBar";
|
||||
import {ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, infoVerifyProgress} from '@/api/authentication.js'
|
||||
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail } from '@/api/authentication.js'
|
||||
import { leftCopy } from '@/utils/common.js'
|
||||
import { myMixins } from '@/utils/myMixins.js'
|
||||
export default {
|
||||
@ -97,20 +97,10 @@
|
||||
recordNumber: '', // 档案编号
|
||||
},
|
||||
show: undefined,
|
||||
type: 'full',
|
||||
type: localStorage.getItem('type'),
|
||||
}
|
||||
},
|
||||
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) {
|
||||
this.show = true
|
||||
// }
|
||||
@ -118,6 +108,8 @@
|
||||
await this.getDetail()
|
||||
}
|
||||
},
|
||||
async onShow() {
|
||||
},
|
||||
methods: {
|
||||
backInit() {
|
||||
this.form.recordNumber = ''
|
||||
@ -187,20 +179,9 @@
|
||||
verifyType: 2
|
||||
})
|
||||
setTimeout(() => {
|
||||
this.goListPage()
|
||||
this.h5GoBack()
|
||||
}, 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>
|
||||
@ -212,11 +193,8 @@
|
||||
background: #F4F5F7;
|
||||
}
|
||||
.content{
|
||||
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
|
||||
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
|
||||
}
|
||||
.navBar{
|
||||
margin-bottom: 46px;
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
:border="false"
|
||||
:fixed="true"
|
||||
:safe-area-inset-top="true"
|
||||
@click-left="goListPage"
|
||||
@click-left="h5GoBack"
|
||||
/>
|
||||
</div>
|
||||
<tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar>
|
||||
@ -141,7 +141,7 @@
|
||||
import fixedButton from "./component/fixedButton";
|
||||
import photoItem from "./component/photoItem";
|
||||
import tipBar from "./component/tipBar";
|
||||
import {ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, infoVerifyProgress} from '@/api/authentication.js'
|
||||
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail } from '@/api/authentication.js'
|
||||
import { leftCopy } from '@/utils/common.js'
|
||||
import { myMixins } from '@/utils/myMixins.js'
|
||||
import {areaList} from "@vant/area-data";
|
||||
@ -190,27 +190,20 @@
|
||||
region:[],
|
||||
},
|
||||
show: undefined,
|
||||
type: 'full',
|
||||
type: localStorage.getItem('type'),
|
||||
tyreOptions:[{value:0,name:'0'},{value:2,name:'2'},{value:4,name:'4'}]
|
||||
}
|
||||
},
|
||||
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) {
|
||||
this.show = true
|
||||
// }
|
||||
if(this.show) {
|
||||
await this.getDetail()
|
||||
}
|
||||
},
|
||||
async onShow() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
confirmHandle(val){
|
||||
@ -301,16 +294,9 @@
|
||||
verifyType: 3
|
||||
})
|
||||
setTimeout(() => {
|
||||
this.goListPage()
|
||||
this.h5GoBack()
|
||||
}, 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) { // 承运人责任险照片
|
||||
console.log("data",data)
|
||||
this.form.carrierLiabilityInsurancePhoto = data
|
||||
@ -375,11 +361,6 @@
|
||||
});
|
||||
return res;
|
||||
},
|
||||
goListPage(){
|
||||
this.goPage('auditList',{
|
||||
token:localStorage.getItem('token')
|
||||
})
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
regionText() {
|
||||
@ -399,11 +380,9 @@
|
||||
margin-bottom: 46px;
|
||||
}
|
||||
.content {
|
||||
padding-bottom: 86px;
|
||||
/*padding-bottom: 86px;*/
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
|
||||
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
|
||||
}
|
||||
.carInfo .title {
|
||||
width: 100% !important;
|
||||
|
||||
@ -9,15 +9,13 @@
|
||||
</van-radio-group>
|
||||
</div>
|
||||
<div class="photoWrap" v-if="inSure == 1">
|
||||
<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" -->
|
||||
<van-uploader :after-read="(file) => afterRead(file,'urlList')" class="customUploadMul" :max-count="3" :disabled="!showFun()">
|
||||
<template v-if="urlList.length > 0">
|
||||
<div v-for="(item, index) in urlList" :key="index" class="uploaded-item">
|
||||
<div v-for="(item, index) in urlList" :key="'uploaded-' + index" class="uploaded-item">
|
||||
<img class="photo_item" mode="widthFix" :src="item.replace(/http:\/\//g, 'https://')" />
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="urlList.length < 3 && showFun()">
|
||||
<template v-if="urlList.length < 3">
|
||||
<div class="tipWrap">
|
||||
<img class="photo_item" mode="widthFix" src="@/assets/authentication/carInfo_icon5.png"/>
|
||||
<img class="camera" v-if="showFun()" src="@/assets/authentication/camera.png" />
|
||||
@ -33,7 +31,7 @@
|
||||
<span>{{title}}</span>
|
||||
</div>
|
||||
<div class="photo_img flex flex_between">
|
||||
<van-uploader v-if="leftUrl" :after-read="(file) => afterRead(file,'leftImg')" class="customUpload" @click-upload="(event)=>clickUpload(event,'leftImg')">
|
||||
<van-uploader v-if="leftUrl" :after-read="(file) => afterRead(file,'leftImg')" class="customUpload" :disabled="!showFun()">
|
||||
<template v-if="form.leftImg">
|
||||
<img class="photo_item" mode="widthFix" :src="form.leftImg.replace(/http:\/\//g, 'https://')" />
|
||||
</template>
|
||||
@ -42,7 +40,7 @@
|
||||
<img class="camera" v-if="showFun()" src="@/assets/authentication/camera.png" />
|
||||
</template>
|
||||
</van-uploader>
|
||||
<van-uploader v-if="rightUrl" :after-read="(file) => afterRead(file,'rightImg')" class="customUpload" @click-upload="(event)=>clickUpload(event,'rightImg')">
|
||||
<van-uploader v-if="rightUrl" :after-read="(file) => afterRead(file,'rightImg')" class="customUpload" :disabled="!showFun()">
|
||||
<template v-if="form.rightImg">
|
||||
<img class="photo_item" mode="widthFix" :src="form.rightImg.replace(/http:\/\//g, 'https://')" />
|
||||
</template>
|
||||
@ -58,8 +56,6 @@
|
||||
|
||||
<script>
|
||||
import {uploadImage} from "@/api/mine";
|
||||
import { ImagePreview } from 'vant';
|
||||
|
||||
/*let baseUrl=''
|
||||
if (window.location.href.includes('www.sinoassist.com')) {
|
||||
baseUrl = 'https://www.sinoassist.com'
|
||||
@ -99,61 +95,37 @@ export default {
|
||||
isInsure:'',
|
||||
},
|
||||
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() {
|
||||
setTimeout(()=>{
|
||||
this.form.isInsure=this.inSure
|
||||
// this.form.isInsure=1
|
||||
},1500)
|
||||
},
|
||||
methods: {
|
||||
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){ // 支持多文件上传
|
||||
async afterRead(file,type,index){ // 支持多文件上传
|
||||
const formData = new FormData();
|
||||
formData.append("file" , file.file);
|
||||
let res = await uploadImage(formData)
|
||||
if (type=='urlList'){
|
||||
console.log("this.urlList",this.urlList?.length)
|
||||
if(this.urlList?.length==3){
|
||||
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)
|
||||
if (type=='urlList' && (index==0 || index)){
|
||||
this.$set( this.form.urlList,index,res.data)
|
||||
}else if(type=='urlList'){
|
||||
this.form[type].push(...this.urlList,res.data)
|
||||
}else{
|
||||
this.form[type] = res.data
|
||||
this.$emit(type, this.form[type])
|
||||
}
|
||||
this.$emit(type, this.form[type])
|
||||
},
|
||||
radioChange(val){
|
||||
this.$emit('insureHandle',val)
|
||||
@ -186,23 +158,10 @@ export default {
|
||||
width: 100% !important;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
/* ::v-deep .van-uploader__preview{
|
||||
width: 100% !important;
|
||||
}*/
|
||||
}
|
||||
.uploaded-item,.tipWrap{
|
||||
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 {
|
||||
padding: 20px 12px 22px 17px;
|
||||
@ -294,8 +253,3 @@ export default {
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style>
|
||||
.van-image-preview{
|
||||
z-index: 9999999999 !important;
|
||||
}
|
||||
</style>
|
||||
@ -8,7 +8,7 @@
|
||||
:border="false"
|
||||
:fixed="true"
|
||||
:safe-area-inset-top="true"
|
||||
@click-left="goListPage"
|
||||
@click-left="h5GoBack"
|
||||
/>
|
||||
</div>
|
||||
<tip-bar :title="'应国家政策要求:从事货运行业的司机用户,身份证照片、驾驶证信息、行驶证信息、人车合影及承运资质信息必须进行实名认证。'"></tip-bar>
|
||||
@ -37,7 +37,7 @@
|
||||
<input type="text" disabled placeholder="请输入持卡人性别" v-model="form.sex">
|
||||
<input type="text" placeholder="请输入持卡人身份证号" v-model="form.identityCardNumber">
|
||||
</div>
|
||||
</div>
|
||||
</div>=
|
||||
<fixed-button title="实名认证" @myClick="goRealName" v-if="showFun() && !esignFlag"></fixed-button>
|
||||
<fixed-button @myClick="clickHandler" v-if="showFun() && esignFlag"></fixed-button>
|
||||
<!-- <protocol-dialog></protocol-dialog>-->
|
||||
@ -49,13 +49,7 @@
|
||||
import fixedButton from "./component/fixedButton";
|
||||
import photoItem from "./component/photoItem";
|
||||
import tipBar from "./component/tipBar";
|
||||
import {
|
||||
ocrRecognize,
|
||||
driverInfoVerify,
|
||||
driverInfoVerifyDetail,
|
||||
driverRealName,
|
||||
infoVerifyProgress
|
||||
} from '@/api/authentication'
|
||||
import { ocrRecognize, driverInfoVerify, driverInfoVerifyDetail, driverRealName } from '@/api/authentication'
|
||||
import { leftCopy } from '@/utils/common.js'
|
||||
import { myMixins } from '@/utils/myMixins.js'
|
||||
// import {version} from "@/utils/baseUrl"
|
||||
@ -86,40 +80,23 @@
|
||||
headerUrl: require('@/assets/authentication/person_header.png'),
|
||||
idFront: require('@/assets/authentication/person_idcard1.png'),
|
||||
idBack: require('@/assets/authentication/person_idcard2.png'),
|
||||
user:'',
|
||||
cardId:'',
|
||||
show: undefined,
|
||||
type: 'full',
|
||||
type: localStorage.getItem('type'),
|
||||
esignFlag: false,
|
||||
}
|
||||
},
|
||||
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) {
|
||||
this.show = true
|
||||
if( this.show ) {
|
||||
await this.getDetail()
|
||||
}
|
||||
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))
|
||||
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 )
|
||||
// }
|
||||
},
|
||||
async onShow() {
|
||||
this.esignFlag = localStorage.getItem('esignFlag');
|
||||
},
|
||||
methods: {
|
||||
async getDetail() {
|
||||
@ -127,12 +104,6 @@
|
||||
verifyType: 1
|
||||
})
|
||||
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) {
|
||||
this.form.icon = data
|
||||
@ -159,6 +130,7 @@
|
||||
imageUrl: url
|
||||
});
|
||||
let idInfo = res?.data?.data?.back?.data
|
||||
// let validPeriod = '2014.07.09-长期'
|
||||
let validPeriod = idInfo?.validPeriod; // 有效期
|
||||
this.form.idCardAuthority = idInfo?.issueAuthority
|
||||
let dateArr = validPeriod.split('-');
|
||||
@ -195,20 +167,30 @@
|
||||
this.$toast('身份证正面照片未上传')
|
||||
return
|
||||
}
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
let token = urlParams.get('token');
|
||||
if(this.form.name && this.form.identityCardNumber) {
|
||||
let res = await driverRealName( {
|
||||
phone: this.form.phone,
|
||||
name: this.form.name,
|
||||
idNo: this.form.identityCardNumber,
|
||||
token:token,
|
||||
jump:1
|
||||
})
|
||||
let info = res?.data
|
||||
console.log('info', info)
|
||||
localStorage.setItem("personAuditInfo",JSON.stringify({form:this.form}))
|
||||
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 {
|
||||
this.$toast('身份证信息识别错误')
|
||||
}
|
||||
@ -236,26 +218,13 @@
|
||||
await this.getRegisterInfo({
|
||||
verifyType: 1
|
||||
})
|
||||
localStorage.setItem("personAuditInfo",'')
|
||||
setTimeout(() => {
|
||||
this.goListPage()
|
||||
|
||||
}, 100)
|
||||
} else {
|
||||
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>
|
||||
@ -275,9 +244,7 @@
|
||||
}
|
||||
.content {
|
||||
padding-bottom: 86px;
|
||||
height: 90%;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch; /* 启用iOS惯性滚动 */
|
||||
scroll-behavior: smooth; /* 平滑滚动(部分浏览器支持) */
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user