48 Commits

Author SHA1 Message Date
4f5e03d1c8 救援职业责任险界面,描述1的文字更改 2025-10-10 20:42:49 +08:00
f03f323a6f 换请求方式 2025-09-26 13:23:55 +08:00
817a0f1e84 跳转后添加type=invoice 参数 2025-09-26 13:23:55 +08:00
ec204dc631 培训添加发票参数 2025-09-26 13:23:54 +08:00
d1726e3041 行驶证核验通过--颜色 2025-09-24 16:08:59 +08:00
01b724964d kpi总览界面,拒单明细type值遗漏补充 2025-09-19 15:23:56 +08:00
aabcd9ea29 车辆审核状态不能修改 2025-09-19 13:10:59 +08:00
ad8312f54b kpi总览界面,数据NAN解决 2025-09-18 15:13:08 +08:00
2c9dac15ce kpi总览界面,隐藏两个平安的指标 2025-09-17 21:58:01 +08:00
2e0f372a9b task#9508 大力神更名为随车吊平板车的相关问题 2025-09-17 10:23:30 +08:00
740ad98a99 实名认证接口加参数ump:1 2025-09-15 13:17:41 +08:00
ecc6e23663 VConsole调试删除 2025-09-15 08:58:50 +08:00
6dcc59ea2d 实名认证链接decode测试 2025-09-12 11:43:57 +08:00
f897506e86 实名认证调整 2025-09-12 11:14:41 +08:00
06d530fada 认证页的返回都调转列表页 2025-09-12 11:10:43 +08:00
3f64c42fbf 实名认证返回参数丢失测试解决 2025-09-12 11:01:33 +08:00
1b62e6eebf kpi界面,月日师傅二级tab设为一样 2025-09-12 10:59:19 +08:00
074575b703 kpi界面,月日师傅二级tab设为一样 2025-09-12 10:58:15 +08:00
6d5a91279a 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:38:35 +08:00
e9c3befe50 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:35:40 +08:00
91f14b9389 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:33:01 +08:00
a6dcd9ef03 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:27:17 +08:00
77d8bbf27c 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:21:55 +08:00
4c90532462 实名认证页,认证结果esignFlag做缓存,添加打印 2025-09-12 10:18:55 +08:00
204d6b354f 实名认证页,认证结果esignFlag做缓存 2025-09-12 10:16:17 +08:00
91aa8f3f05 实名认证页返回都到列表页 2025-09-12 09:22:29 +08:00
9f2b343662 实名认证页代码优化 2025-09-11 23:07:46 +08:00
e02456e807 实名认证页代码优化 2025-09-11 22:35:20 +08:00
ad0094fda2 认证页增加双击不放大功能,滚动条丝滑滚动优化 2025-09-11 17:30:47 +08:00
87263991ff 认证页下一步添加接口 2025-09-11 16:59:10 +08:00
415a0be018 CRM_25-09-25#story#7216,车辆信息梳理的需求-“公车”的服务内容调整 2025-09-11 16:05:08 +08:00
7aefcd8141 kpi催促明细,添加催促次数 2025-09-11 15:58:50 +08:00
6eb407d956 实名认证esignFlag缓存添加 2025-09-11 14:58:07 +08:00
7cfa03bf74 实名认证操作成功后返回到认证列表页 2025-09-11 14:48:37 +08:00
b7ee2bb3d7 实名认证界面加缓存数据 2025-09-11 14:42:49 +08:00
066abdeeb0 救援职业责任险 2025-09-11 14:36:38 +08:00
3b8837ce68 实名认证界面加缓存数据 2025-09-11 14:25:16 +08:00
8f730c7d04 实名认证接口加token参数 2025-09-11 13:05:01 +08:00
56046dc878 实名认证加token参数 2025-09-11 11:52:03 +08:00
da9cc2f588 实名认证加token参数 2025-09-11 11:50:09 +08:00
ab7593ae2d 车辆服务刷新问题 2025-09-11 09:49:06 +08:00
3a7c06ff2f story#7189,跳转加token参数 2025-09-10 16:42:14 +08:00
ab82fa04a6 story#7189,高度调整 2025-09-10 16:09:08 +08:00
695ce00a66 story#7131:调度APP车辆管理功能调整的需求-新增搜索和筛选功能 2025-09-10 15:12:52 +08:00
c6c6f9e6a9 story#7189,type默认'full' 2025-09-10 13:38:52 +08:00
65e5bd2814 kpi率乘以一百 2025-09-10 10:17:11 +08:00
f008ef0d09 kpi字段替换 2025-09-10 10:17:11 +08:00
5ffa3f3d9e 平安聚合时效 2025-09-10 10:17:11 +08:00
14 changed files with 460 additions and 185 deletions

View File

@ -31,10 +31,14 @@
} }
</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>
window.selfLink = window.location.href;
window.selfSearch = window.location.search;
</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

@ -323,6 +323,7 @@ export function jumpPage(data){
return request({ return request({
url:'/supplierAppV2/dispatchApp/user/jumpPage', url:'/supplierAppV2/dispatchApp/user/jumpPage',
method:'POST', method:'POST',
contentType:'application/json',
data data
}) })
} }

View File

@ -175,7 +175,7 @@ export default {
confirmButtonColor: '#0E76F4', confirmButtonColor: '#0E76F4',
showCancelButton: false, showCancelButton: false,
}).then(async() => { }).then(async() => {
this.goPage('newTrainingList', { supplierId : this.supplierId }) this.goPage('newTrainingList', { supplierId : this.supplierId, type: 'invoice' })
}).catch(() => { }).catch(() => {
// on cancel // on cancel
}); });
@ -189,7 +189,9 @@ export default {
this.getNotifyList() this.getNotifyList()
}, },
async getJumpHandler() { async getJumpHandler() {
let res = await jumpPage(); let res = await jumpPage({
type: 'invoice'
});
return res return res
}, },
getMonth(item) { getMonth(item) {

View File

@ -95,6 +95,7 @@
multiple multiple
:multiple-limit="isMultiple ? 2 : 1" :multiple-limit="isMultiple ? 2 : 1"
v-model="selectedOption" v-model="selectedOption"
:disabled="vehicleInfoDisabled"
value-key="name" value-key="name"
class="elSelect" class="elSelect"
collapse-tags="collapse-tags" collapse-tags="collapse-tags"
@ -121,6 +122,7 @@
value-key="name" value-key="name"
class="elSelect" class="elSelect"
collapse-tags="collapse-tags" collapse-tags="collapse-tags"
:disabled="vehicleInfoDisabled"
placeholder="请选择" style="width: 55%" placeholder="请选择" style="width: 55%"
> >
<el-option <el-option
@ -190,7 +192,7 @@
<span>车辆状态</span> <span>车辆状态</span>
</div> </div>
<div class="isJoin"> <div class="isJoin">
<van-radio-group v-model="vehicleStatus" @change="isVehicleChange" class="joinWrap"> <van-radio-group v-model="vehicleStatus" :class="{ 'disabled-tree': vehicleInfoDisabled }" :disabled="vehicleInfoDisabled" @change="isVehicleChange" class="joinWrap">
<van-radio :name="1" style="margin-right: 26px"> <van-radio :name="1" style="margin-right: 26px">
启用 启用
<img <img
@ -305,6 +307,7 @@
ref="tree" ref="tree"
:highlight-current="true" :highlight-current="true"
:expand-on-click-node="false" :expand-on-click-node="false"
:class="{ 'disabled-tree': vehicleInfoDisabled }"
:data="supplierServiceList" :data="supplierServiceList"
:props="defaultProps"> :props="defaultProps">
</el-tree> </el-tree>
@ -384,6 +387,7 @@ export default {
vehicleLicense:'',//牌照 vehicleLicense:'',//牌照
vehicleFrontLicensePlate:'',//车头照车牌号码 vehicleFrontLicensePlate:'',//车头照车牌号码
insuranceCorp: '', insuranceCorp: '',
auditStatus: '',
vehicleTypes:[{ vehicleTypes:[{
name: '小修车', name: '小修车',
value: 1 value: 1
@ -401,7 +405,7 @@ export default {
name:'牵引车', name:'牵引车',
value: 5 }, value: 5 },
{ {
name:'大力神', name:'随车吊平板车',
value:6}, value:6},
{ {
name:'充电车', name:'充电车',
@ -491,6 +495,11 @@ export default {
}] }]
} }
}, },
computed: {
vehicleInfoDisabled() {
return [1,2].includes(this.auditStatus)
},
},
watch:{ watch:{
selectedOption(newVal){ selectedOption(newVal){
if(newVal == 4){ if(newVal == 4){
@ -510,7 +519,7 @@ export default {
this.vehicleTypes[8].disabled=false this.vehicleTypes[8].disabled=false
this.vehicleTypes[9].disabled=false this.vehicleTypes[9].disabled=false
} }
if (newVal == 1 || newVal == 7){ if (newVal == 1 || newVal == 7 || newVal == 9){
let arr = [] let arr = []
this.supplierServiceList.forEach((item)=>{ this.supplierServiceList.forEach((item)=>{
if(!(item.name == '拖车服务' || item.name == '大型车救援')){ if(!(item.name == '拖车服务' || item.name == '大型车救援')){
@ -731,6 +740,7 @@ export default {
this.selectedOption=result.vehicleType?.split(',').map((item)=>{ this.selectedOption=result.vehicleType?.split(',').map((item)=>{
return Number(item); return Number(item);
}); });
this.auditStatus = result.auditStatus;
this.virtualVehicle = result.virtualVehicle; this.virtualVehicle = result.virtualVehicle;
this.$refs.tree.setCheckedKeys(result.serviceIds) this.$refs.tree.setCheckedKeys(result.serviceIds)
this.vehicleStatus = result.vehicleStatus this.vehicleStatus = result.vehicleStatus
@ -743,7 +753,7 @@ export default {
this.vehicleLicense = result.vehicleLicense; this.vehicleLicense = result.vehicleLicense;
this.vehicleFrontLicensePlate = result.vehicleFrontLicensePlate; this.vehicleFrontLicensePlate = result.vehicleFrontLicensePlate;
this.hasLiabilityInsurance = result.hasLiabilityInsurance this.hasLiabilityInsurance = result.hasLiabilityInsurance
this.vehicleStatus = result.vehicleStatus this.insuranceCorp = result.insuranceCorp;
if(this.insurancePicturePhoto) { if(this.insurancePicturePhoto) {
this.insurancePictureFiles = [{url: this.insurancePicturePhoto}] this.insurancePictureFiles = [{url: this.insurancePicturePhoto}]
} }
@ -819,7 +829,7 @@ export default {
this.$toast('车辆状态不能为空') this.$toast('车辆状态不能为空')
return return
} }
if(this.hasLiabilityInsurance === null || this.hasLiabilityInsurance === undefined) { // 有职业责任险,就需要有保单照片 if(this.hasLiabilityInsurance === null || this.hasLiabilityInsurance === undefined || this.hasLiabilityInsurance === '') { // 有职业责任险,就需要有保单照片
this.$toast('救援职业责任险不能为空') this.$toast('救援职业责任险不能为空')
return return
} }
@ -848,7 +858,7 @@ export default {
vehicleId:this.id ? this.id : '', vehicleId:this.id ? this.id : '',
plateNumber:this.carNum ? this.carNum :'', plateNumber:this.carNum ? this.carNum :'',
vehicleType:this.selectedOption?.length>0 ? this.selectedOption.join(',') : '', vehicleType:this.selectedOption?.length>0 ? this.selectedOption.join(',') : '',
hasPolymerization:this.isJoin, // hasPolymerization:this.isJoin,
serviceIds:this.serviceIds ? this.serviceIds : [], serviceIds:this.serviceIds ? this.serviceIds : [],
vehicleLicenseFront: this.vehicleLicenseFront, vehicleLicenseFront: this.vehicleLicenseFront,
vehicleLicenseBack: this.vehicleLicenseBack, vehicleLicenseBack: this.vehicleLicenseBack,
@ -985,4 +995,8 @@ export default {
border: none !important; border: none !important;
text-align: right !important; text-align: right !important;
} }
.disabled-tree {
pointer-events: none;
opacity: 0.6;
}
</style> </style>

View File

@ -18,9 +18,19 @@
</template> </template>
</van-nav-bar> </van-nav-bar>
</div> </div>
<van-search
v-model="searchVal"
show-action
placeholder="车辆名称/车牌号/车架号"
@search="resetHandler"
>
<template #action>
<div @click="resetHandler">搜索</div>
</template>
</van-search>
<div class="filterWrap"> <div class="filterWrap">
<!-- <div >--> <!-- <div >-->
<el-input v-model="searchVal" @blur="resetHandler" placeholder="车辆名称/车牌号/车架号" :class="{'customSel':true,'customInput':true , 'has-value': searchVal }" > <!--<el-input v-model="searchVal" @blur="resetHandler" placeholder="车辆名称/车牌号/车架号" :class="{'customSel':true,'customInput':true , 'has-value': searchVal }" >
<template #suffix> <template #suffix>
<i <i
v-if="searchVal" v-if="searchVal"
@ -28,7 +38,7 @@
@click="searchVal = ''" @click="searchVal = ''"
></i> ></i>
</template> </template>
</el-input> </el-input>-->
<el-select @change="resetHandler" multiple :collapse-tags="true" v-model="inputStatusList" placeholder="录入状态" :class="{'customSel':true , 'has-value': inputStatusList }" clearable> <el-select @change="resetHandler" multiple :collapse-tags="true" v-model="inputStatusList" placeholder="录入状态" :class="{'customSel':true , 'has-value': inputStatusList }" clearable>
<el-option <el-option
v-for="item in inputStatusListOptions" v-for="item in inputStatusListOptions"
@ -47,7 +57,7 @@
:value="item.value"> :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
<el-select @change="resetHandler" multiple :collapse-tags="true" v-model="liabilityInsuranceAudit" placeholder="职业责任险" :class="{'customSel':true , 'has-value': liabilityInsuranceAudit }" clearable> <el-select @change="resetHandler" multiple :collapse-tags="true" v-model="liabilityInsuranceAuditList" placeholder="职业责任险" :class="{'customSel':true , 'has-value': liabilityInsuranceAuditList }" clearable>
<el-option <el-option
v-for="item in insuresOptions" v-for="item in insuresOptions"
:key="item.value" :key="item.value"
@ -58,6 +68,7 @@
<!-- </div>--> <!-- </div>-->
</div> </div>
<div class="wrap_cls">
<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"
@ -65,40 +76,43 @@
finished-text="没有更多了" finished-text="没有更多了"
@load="onLoad" @load="onLoad"
> >
<div class="carItem" v-for="(item,index) in vehicleList" :key="index"> <div class="carItem" v-for="(item,index) in vehicleList" :key="index" @click="updateVehicle(item)">
<div class="carCode"> <div class="carCode">
<div class="codeLeft">{{item.plateNumber}} / {{item.vehicleTypeString}}</div> <div class="codeLeft">{{item.plateNumber}} / {{item.vehicleTypeString}}
<div class="twoBtn"> <span class="ml10" v-if="item.vehicleStatus" :class="{'insuranceSuccess': item.vehicleStatus == 1, 'insuranceDanger': item.vehicleStatus != 1}">{{ item.vehicleStatus == 1 ? '启用' : '停用' }} </span>
<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> </div>
<div class="juhe flex-between"> <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>
<span class="zdJuhe">认证<span :class="item.authStatus == 1 ? 'isYes' :'isNo'">{{item.authStatus == 1 ? '已认证' :'未认证'}}</span></span> <span class="flex-right">
<span class="common_cls" v-if="item.inputStatusString" :class="getClass(item.inputStatusString)?.className">{{item.inputStatusString}}</span>
<span class="common_cls" v-if="item.authStateString" :class="getClass(item.authStateString)?.className">{{item.authStateString}}</span>
</span>
</div> </div>
<div class="juhe"> <div class="juhe flex-between">
<span class="zdJuhe mr10">最近登录时间{{item.lastLoginTime}}</span> <span class="zdJuhe">救援责任险</span>
<span class="flex-right" v-if="item.rescueInsurance">
<span class="common_cls" @click.stop="showTip(item.liabilityInsuranceAuditMsg)" :class="getClass(item.rescueInsurance)?.className">{{item.rescueInsurance}}</span>
</span>
</div> </div>
<div class="juhe"> <div class="juhe flex-between">
<span class="zdJuhe mr10">救援职业责任险情况<span :class="getClass(item.liabilityInsuranceAudit)?.className">{{getClass(item.liabilityInsuranceAudit)?.title}}</span></span> <span class="zdJuhe">最近登录时间</span>
<span class="flex-right">{{item.lastLoginTime}}</span>
</div> </div>
<!--<div class="carType">{{ item.serviceName }}</div> <van-icon class="arrow_position" v-if="permissonList.includes('vehicleModifyBtn')" name="arrow" />
<div class="juhe">
<span class="zdJuhe">是否参与中道聚合: </span>
<span :class="item.hasPolymerization.code == 0 ? 'isYes' :'isNo'">{{item.hasPolymerization.label}}</span>
</div>-->
</div> </div>
</van-list> </van-list>
</van-pull-refresh> </van-pull-refresh>
</div>
<van-dialog v-model="show" title="确定删除吗" show-cancel-button @confirm="handleConfirm"></van-dialog> <van-dialog v-model="show" title="确定删除吗" show-cancel-button @confirm="handleConfirm"></van-dialog>
</div> </div>
</template> </template>
<script> <script>
import {Dialog} from "vant";
import { myMixins} from "@/utils/myMixins"; import { myMixins} from "@/utils/myMixins";
import {supplierVehicleList,deleteVehicle,userOperationPermissions} from "@/api/mine" import {supplierVehicleList,deleteVehicle,userOperationPermissions} from "@/api/mine"
export default { export default {
@ -115,11 +129,12 @@ export default {
isLoading: false, isLoading: false,
loading: false, loading: false,
finished: false, finished: false,
showPopover: false,
permissonList:[], permissonList:[],
inputStatusList: [], inputStatusList: [],
searchVal: '', searchVal: '',
authStates: [], authStates: [],
liabilityInsuranceAudit: [], liabilityInsuranceAuditList: [],
inputStatusListOptions: [{ inputStatusListOptions: [{
name: '行驶证未录入', name: '行驶证未录入',
value: 0 value: 0
@ -162,40 +177,57 @@ export default {
} }
}, },
mounted() { mounted() {
// this.getVehicleList();
this.getPermissions(); this.getPermissions();
}, },
methods:{ methods:{
showTip(msg) {
Dialog.alert({
title: '未通过原因',
message: msg,
}).then(() => {
});
},
getClass(id) { getClass(id) {
const ids = String(id) const ids = String(id)
const steps = { const steps = {
'1': { '待审核': {
title: '待审核', className: 'main_cls'
className: 'insuranceMain'
}, },
'2': { '有责任险': {
title: '有责任险', className: 'success_cls'
className: 'insuranceSuccess'
}, },
'3': { '有货物险': {
title: '有货物险', className: 'info_cls'
className: 'insuranceTip'
}, },
'4': { '未通过': {
title: '未通过(点击显示原因)', className: 'danger_cls'
className: 'insuranceDanger'
}, },
'5': { '': {
title: '无', className: 'default_cls'
className: ''
}, },
'6': { '': {
title: '空', className: 'default_cls'
className: '' },
'行驶证未录入': {
className: 'default_cls'
},
'行驶证核验通过': {
className: 'success_cls'
},
'行驶证核验不通过': {
className: 'danger_cls'
},
'车头照未录入': {
className: 'default_cls'
},
'车头照认证通过': {
className: 'success_cls'
},
'车头照认证不通过': {
className: 'danger_cls'
} }
} }
return steps[ids] || { className: 'default_cls' }
return steps[ids] || { title: '', className: '' }
}, },
async onLoad(){ async onLoad(){
await this.getVehicleList() await this.getVehicleList()
@ -205,11 +237,12 @@ export default {
// 数据全部加载完成 // 数据全部加载完成
if (this.vehicleList.length >= this.total) { if (this.vehicleList.length >= this.total) {
this.finished = true; this.finished = true;
} else {
this.finished = false;
} }
}, },
onRefresh() { async onRefresh() {
this.pageNum=1 await this.resetHandler()
// this.getVehicleList()
setTimeout(() => { setTimeout(() => {
this.$toast('刷新成功'); this.$toast('刷新成功');
this.isLoading = false; this.isLoading = false;
@ -218,7 +251,11 @@ export default {
async getVehicleList(){ async getVehicleList(){
let result = await supplierVehicleList({ let result = await supplierVehicleList({
pageNum:this.pageNum, pageNum:this.pageNum,
pageSize:this.pageSize pageSize:this.pageSize,
searchVal: this.searchVal,
inputStatusList: this.inputStatusList,
authStates: this.authStates,
liabilityInsuranceAuditList: this.liabilityInsuranceAuditList,
}) })
this.total=result.total this.total=result.total
if(this.pageNum == 1){// 第一页直接赋值 if(this.pageNum == 1){// 第一页直接赋值
@ -247,18 +284,21 @@ export default {
await this.getVehicleList(); await this.getVehicleList();
}, },
async resetHandler() { async resetHandler() {
// debounce(async () => {
this.pageNum=1 this.pageNum=1
this.finished = false;
this.total = 0;
// this.vehicleList = [];
await this.getVehicleList(); await this.getVehicleList();
// }, 1000)
}, },
updateVehicle(item){//修改 updateVehicle(item){//修改
if( this.permissonList.includes('vehicleModifyBtn') ) {
this.$router.push({ this.$router.push({
name:'vehicleAdd', name:'vehicleAdd',
params:{ params:{
id:item.vehicleId id:item.vehicleId
} }
}) })
}
}, },
} }
@ -268,12 +308,41 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/styles/mixin.scss"; @import "@/styles/mixin.scss";
@import "@/styles/common.scss"; @import "@/styles/common.scss";
.ml10 {
margin-left: 10px;
}
.wrap{ .wrap{
background: #F4F5F7; background: #F4F5F7;
@include sizingPadding(13px,13px);
@include wh(100%, 100%); @include wh(100%, 100%);
overflow-y: auto; overflow-y: auto;
} }
.wrap_cls {
width: 100%;
padding-left: 13px;
padding-right: 13px;
box-sizing: border-box;
}
.common_cls {
color: #fff;
padding: 4px 8px;
border-radius: 3px;
margin-right: 6px;
}
.default_cls {
background-color: #B0BEC5;
}
.danger_cls {
background-color: red;
}
.success_cls {
background-color: #4CAF50;
}
.info_cls {
background-color: #FF9800;
}
.main_cls {
background-color: #6C9BFF;
}
.navBar{ .navBar{
margin-bottom: 46px; margin-bottom: 46px;
.rightWrap{ .rightWrap{
@ -292,13 +361,14 @@ export default {
} }
} }
.carItem{ .carItem{
@include wh(100%,110px); @include wh(100%,120px);
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);
padding: 11px 13px 11px 15px; padding: 11px 13px 11px 15px;
margin-bottom: 10px; margin-bottom: 10px;
@include flexBetween; @include flexBetween;
position: relative;
.carCode{ .carCode{
@include flexColBet; @include flexColBet;
.codeLeft{ .codeLeft{
@ -334,6 +404,11 @@ export default {
opacity: .7; opacity: .7;
@include fontWeightSize(400,12px) @include fontWeightSize(400,12px)
} }
.zdJuhe {
width: 80px;
text-align: right;
margin-left: -10px;
}
.isYes{ .isYes{
color: #09B820; color: #09B820;
@include fontWeightSize(400,12px); @include fontWeightSize(400,12px);
@ -342,6 +417,13 @@ export default {
color: #FF0000; color: #FF0000;
@include fontWeightSize(400,12px); @include fontWeightSize(400,12px);
} }
}
.arrow_position {
position: absolute;
right: 5px;
top: 50px;
font-size: 20px;
opacity: 0.6;
} }
.mr10 { .mr10 {
margin-right: 10px; margin-right: 10px;
@ -361,11 +443,13 @@ export default {
.flex-between { .flex-between {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center;
} }
.filterWrap { .filterWrap {
width: calc(100% - 5px); width: 100%;
padding-right: 5px; padding-right: 13px;
padding-left: 13px;
display: flex; display: flex;
overflow-x: auto; /* 允许横向滚动 */ overflow-x: auto; /* 允许横向滚动 */
white-space: nowrap; /* 防止子元素换行 */ white-space: nowrap; /* 防止子元素换行 */
@ -373,7 +457,7 @@ export default {
-webkit-overflow-scrolling: touch; /* 在iOS上平滑滚动 */ -webkit-overflow-scrolling: touch; /* 在iOS上平滑滚动 */
scrollbar-width: none; /* Firefox */ scrollbar-width: none; /* Firefox */
padding-bottom: 10px; padding-bottom: 10px;
padding: 10px; /*padding: 10px;*/
margin-bottom: 10px; margin-bottom: 10px;
background-color: #fff; background-color: #fff;
box-sizing: border-box; box-sizing: border-box;
@ -382,14 +466,14 @@ export default {
} }
.customSel { .customSel {
flex: 0 0 auto; /* 防止子元素被压缩 */ flex: 0 0 auto; /* 防止子元素被压缩 */
width: 100px; width: calc(33% - 5px);
/*width: 100%;*/ /*width: 100%;*/
height: 25px; height: 25px;
background: #F5F5F5; background: #F5F5F5;
border-radius: 4px; border-radius: 4px;
font-size: 10px; font-size: 10px;
color: #323233; color: #323233;
margin-left: 5px; margin-right: 5px;
::v-deep .el-input__inner{ ::v-deep .el-input__inner{
padding: 0 2px; padding: 0 2px;
height: 25px; height: 25px;
@ -445,5 +529,11 @@ export default {
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.flex-right {
display: flex;
flex: 1;
justify-content: flex-start;
margin-left: 10px;
}
</style> </style>

View File

@ -65,8 +65,8 @@
<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.customerSatisfaction" :title-text="'平安好评率'" <circle-char v-if="false" ref="Doughnut2" :data="indexData && indexData.pinganFavorableRate" :title-text="'平安好评率'" :is-store="false"
:bg-color="Number(indexData?.customerSatisfaction || 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>
</div> </div>
@ -78,7 +78,7 @@
:is-store="false" :is-store="false"
@clickUse="clickJumpHandle(8)"></circle-char> @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="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.polymerizationSuccessRate" :title-text="'总聚合成功率'" :bg-color="Number(indexData?.polymerizationSuccessRate || 0) >= 80 ? '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>
</div> </div>
</div> </div>
<div :class="{'reciceOrder':true,'webCom':!isMobile}"> <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="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?.polymerizationSuccessArriving) > 22, 'numGreen': Number(indexData?.polymerizationSuccessArriving) <= 22 }">{{ indexData && indexData.polymerizationSuccessArriving }}</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>
<div class="line"></div> <div class="line"></div>
@ -283,7 +283,7 @@ export default {
{name: '总览',value:0}, {name: '月/总'}, {name: '日/总'},{name: '月/师傅'}, {name: '日/师傅'}, {name: '拒单明细'}, {name: '总览',value:0}, {name: '月/总'}, {name: '日/总'},{name: '月/师傅'}, {name: '日/师傅'}, {name: '拒单明细'},
{name: '超时明细'}, {name: '催促明细'},{name: '投诉明细'}, {name: '不使用APP案件明细'}, {name: '车辆在线情况'} , {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,要求暂时隐藏得分总览 driverList: [{name: '接单情况'}, {name: '服务评价'}, {name: 'APP使用情况'}, {name: '时效 '}],//story#7149,要求暂时隐藏得分总览
@ -384,7 +384,7 @@ export default {
return return
} }
this.$refs.Doughnut1.initCircle() this.$refs.Doughnut1.initCircle()
this.$refs.Doughnut2.initCircle() // this.$refs.Doughnut2.initCircle()
this.$refs.Doughnut3.initCircle() this.$refs.Doughnut3.initCircle()
this.$refs.Doughnut4.initCircle() this.$refs.Doughnut4.initCircle()
this.$refs.Doughnut5.initCircle() this.$refs.Doughnut5.initCircle()
@ -991,7 +991,9 @@ export default {
'threeMinutesContactRate', 'threeMinutesContactRate',
'urgeRate', 'urgeRate',
'appRate', 'appRate',
'polymerizationSuccessRate' 'polymerizationSuccessRate',
'pinganFavorableRate',
'wholeJuheSuccessRate',
]; ];
for (let key in this.indexData){ for (let key in this.indexData){
if (propertiesToProcess.includes(key)) { if (propertiesToProcess.includes(key)) {
@ -1138,7 +1140,7 @@ export default {
{label: '催促创建时间 ', prop: 'urgeTime'}, {label: '催促创建时间 ', prop: 'urgeTime'},
{label: '服务商接单时间 ', prop: 'taskAcceptTime'}, {label: '服务商接单时间 ', prop: 'taskAcceptTime'},
{label: '备注内容(催促内容) ', prop: 'urgeRemark'}, {label: '备注内容(催促内容) ', prop: 'urgeRemark'},
// {label: '催促次数 ', prop: ''},无催促次数,催促一次生成一条新的 {label: '催促次数', prop: 'urgeCount'},//无催促次数,催促一次生成一条新的
{label: '服务商名称', prop: 'supplierName'}, {label: '服务商名称', prop: 'supplierName'},
{label: '服务车辆', prop: 'vehicleName'}, {label: '服务车辆', prop: 'vehicleName'},
{label: '服务完成状况', prop: 'orderStatusString'}, {label: '服务完成状况', prop: 'orderStatusString'},
@ -1373,7 +1375,7 @@ export default {
if (this.value == 1) { if (this.value == 1) {
this.detailList?.map(item => { this.detailList?.map(item => {
this.v1.push(item.receiving) this.v1.push(item.receiving)
this.v2.push(item.threeMinutesReceivingRate.replace('%', '')) this.v2.push(item.threeMinutesContactRate.replace('%', ''))
}) })
} else { } else {
this.detailList?.map(item => { this.detailList?.map(item => {
@ -1387,7 +1389,7 @@ export default {
columnObj.label = item.month // 每一列的标题的名称 columnObj.label = item.month // 每一列的标题的名称
columnObj.prop = props + index //自定义每一列标题字段名称 columnObj.prop = props + index //自定义每一列标题字段名称
this.etlLabelList.push(columnObj) this.etlLabelList.push(columnObj)
let mappings = [ 'receiving', 'threeMinutesReceivingRate', 'arriving','fortyMinutesArrivalRate','polymerizationSuccessArriving']; let mappings = [ 'receiving', 'threeMinutesContactRate', 'arriving','fortyMinutesArrivalRate','polymerizationSuccessArriving'];
for (let i = 0; i < mappings.length; i++) { for (let i = 0; i < mappings.length; i++) {
this.$set(this.etlDetailList[i], columnObj.prop, item[mappings[i]]); this.$set(this.etlDetailList[i], columnObj.prop, item[mappings[i]]);
} }
@ -1395,7 +1397,7 @@ export default {
} else { } else {
this.detailList?.map(item => { this.detailList?.map(item => {
this.v1.push(item.receiving) this.v1.push(item.receiving)
this.v2.push(item.threeMinutesReceivingRate.replace('%', '')) this.v2.push(item.threeMinutesContactRate.replace('%', ''))
}) })
if (this.swithVal) { if (this.swithVal) {
this.detailList?.map(item => { this.detailList?.map(item => {
@ -1414,7 +1416,7 @@ export default {
this.labelList = [ this.labelList = [
{label: '月份', prop: 'month'}, {label: '月份', prop: 'month'},
{label: '接单时效', prop: 'receiving'}, {label: '接单时效', prop: 'receiving'},
{label: '3分钟联系客户率', prop: 'threeMinutesReceivingRate'}, {label: '3分钟联系客户率', prop: 'threeMinutesContactRate'},
{label: '到达时效', prop: 'arriving'}, {label: '到达时效', prop: 'arriving'},
{label: '平安聚合成功到达时效', prop: 'pinganJuheSuccessArriving'}, {label: '平安聚合成功到达时效', prop: 'pinganJuheSuccessArriving'},
] ]
@ -1595,8 +1597,10 @@ export default {
}, },
setType(type) { setType(type) {
switch (type) { switch (type) {
case 6: case 5:
return 1; return 1;
case 6:
return 2;
case 7: case 7:
return 7; return 7;
case 8: case 8:

View File

@ -22,7 +22,7 @@
为此中道救援经过与保司沟通协调特为与中道救援合作紧密的服务商提供救援职业责任险参保渠道提升服务商服务能力降低运营风险实现共同进步 为此中道救援经过与保司沟通协调特为与中道救援合作紧密的服务商提供救援职业责任险参保渠道提升服务商服务能力降低运营风险实现共同进步
</div> </div>
<div>救援职业责任险简介</div> <div>救援职业责任险简介</div>
<div>1综合保额50万元可全方位覆盖我们日常的经营活动</div> <div> 1综合保额100万元其中救援责任50万元物流责任50万元可全方位覆盖我们日常的经营活动</div>
<div> 2保费支付可采用救援服务费抵扣的方式降低资金压力</div> <div> 2保费支付可采用救援服务费抵扣的方式降低资金压力</div>
<div> 3详细保险条款保费和其他问题如需了解请与辖区区域经理联系</div> <div> 3详细保险条款保费和其他问题如需了解请与辖区区域经理联系</div>
<div> 其他意见建议如需交流请与18621558505曲仁杰联系</div> <div> 其他意见建议如需交流请与18621558505曲仁杰联系</div>

View File

@ -78,9 +78,11 @@ export default {
isLoading:false, isLoading:false,
showPoup:true,//进入弹框 showPoup:true,//进入弹框
isFinished:false, isFinished:false,
type: '',
} }
}, },
mounted() { mounted() {
this.type = this.$route.query?.type;
// this.onRefresh(); // this.onRefresh();
this.getList(); this.getList();
@ -120,6 +122,7 @@ export default {
pageSize:this.pageSize, pageSize:this.pageSize,
docType:1, docType:1,
trainingType:4, trainingType:4,
type: this.type,
}) })
this.pageList=res.data?.list || []; this.pageList=res.data?.list || [];
if(res.data.assessState == 0){ if(res.data.assessState == 0){

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,7 +33,7 @@
<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>
@ -40,7 +42,7 @@
<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) { // 禁止双击放大
let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault(); // 阻止双击放大
}
lastTouchEnd = now;
}, { passive: false });
this.show = true 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>