Compare commits

...

10 Commits

Author SHA1 Message Date
431c7ce7a2 CRM_26-06-30#story#8858,关于“我的车辆”中行驶证主页照片识别出的“车牌号”和“车架号”的校验需求 2026-06-23 16:44:37 +08:00
68ff233674 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(跳转详情修改2) 2026-06-22 18:03:27 +08:00
14bf6ea2ee CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(车辆信息跳转路由) 2026-06-22 10:09:19 +08:00
07a355b35c gitignore 2026-06-22 10:07:32 +08:00
a2d1e13d94 CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-17 11:59:04 +08:00
f184e5fcc2 CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-17 11:58:59 +08:00
4fb1152cdf CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-17 11:58:58 +08:00
1addd5112b CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-10 15:36:13 +08:00
cd51aec32a CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(问题修复) 2026-06-09 16:38:01 +08:00
4a2513e100 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(默认停用) 2026-06-09 16:10:19 +08:00
13 changed files with 153 additions and 36 deletions

3
.gitignore vendored
View File

@@ -1,7 +1,8 @@
.DS_Store .DS_Store
node_modules node_modules
/dist /dist
/.kaifa
/.summaries
# local env files # local env files
.env.local .env.local

BIN
src/assets/sucai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -337,7 +337,7 @@ const routes = [
name: 'goToApp', name: 'goToApp',
component:()=>import('@/views/goToApp/goToApp.vue'), component:()=>import('@/views/goToApp/goToApp.vue'),
meta: { meta: {
title:'电瓶详情' title:'中道小板运输'
} }
}, },
...kpiRouter, ...kpiRouter,

View File

@@ -7,6 +7,12 @@
<div class="font_cls">如已安装未自动跳转 <span @click="downLoadHandler">立即下载</span></div> <div class="font_cls">如已安装未自动跳转 <span @click="downLoadHandler">立即下载</span></div>
</div> </div>
</div> </div>
<!-- 微信内置浏览器引导 -->
<div v-if="showGuide" class="guide-mask" @click.self="closeGuide">
<img class="guide-img" src="@/assets/sucai.png" alt="引导在浏览器打开" />
<div class="guide-btn" @click="closeGuide">我知道了</div>
</div>
</div> </div>
</template> </template>
@@ -14,7 +20,22 @@
import { getNewVersion } from "@/api/order" import { getNewVersion } from "@/api/order"
export default { export default {
name: "goToApp", name: "goToApp",
data() {
return {
showGuide: false
}
},
mounted() {
this.showGuide = this.isWeixin()
},
methods: { methods: {
isWeixin() {
const ua = navigator.userAgent.toLowerCase()
return ua.indexOf('micromessenger') !== -1
},
closeGuide() {
this.showGuide = false
},
goAppHandler() { goAppHandler() {
window.location.href = "rvdriver://page/pagesLogin/phoneLogin?source=h5Link"; window.location.href = "rvdriver://page/pagesLogin/phoneLogin?source=h5Link";
}, },
@@ -70,4 +91,32 @@ export default {
} }
} }
} }
.guide-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 999;
display: flex;
flex-direction: column;
align-items: center;
background: rgba(0, 0, 0, 0.85);
}
.guide-img {
width: 90%;
margin-top: 0;
object-fit: contain;
}
.guide-btn {
width: 140px;
height: 40px;
margin-top: 40px;
border: 1px solid #FFFFFF;
border-radius: 20px;
font-size: 15px;
color: #FFFFFF;
line-height: 40px;
text-align: center;
}
</style> </style>

View File

@@ -26,6 +26,7 @@
data() { data() {
return { return {
name: '', name: '',
potentialFlag: '',
formPayload: null, formPayload: null,
qrCodeUrl: '', qrCodeUrl: '',
qrCode: '', qrCode: '',
@@ -35,6 +36,8 @@
} }
}, },
async mounted() { async mounted() {
const urlParams = new URLSearchParams(window.location.search);
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
const cached = localStorage.getItem('supplierAddForm'); const cached = localStorage.getItem('supplierAddForm');
if (cached) { if (cached) {
this.formPayload = JSON.parse(cached); this.formPayload = JSON.parse(cached);
@@ -83,9 +86,9 @@
if (res?.code != 0) { if (res?.code != 0) {
Dialog.alert({ title: '提示', message: '该服务商已存在,查看信息' }).then(() => { Dialog.alert({ title: '提示', message: '该服务商已存在,查看信息' }).then(() => {
localStorage.removeItem('supplierAddForm'); localStorage.removeItem('supplierAddForm');
const target = { name: 'supplierInfo', query: { id: res?.code } }; const target = { name: 'supplierInfo', query: { id: res?.code, potentialFlag: this.potentialFlag } };
localStorage.setItem('lastRoute', JSON.stringify(target)); localStorage.setItem('lastRoute', JSON.stringify(target));
this.goPage('supplierInfo', { id: res?.code }); this.goPage('supplierInfo', { id: res?.code, potentialFlag: this.potentialFlag });
}); });
} else { } else {
Toast('该服务商已存在'); Toast('该服务商已存在');
@@ -93,7 +96,8 @@
} else { } else {
localStorage.removeItem('supplierAddForm'); localStorage.removeItem('supplierAddForm');
const supplierId = res?.data; const supplierId = res?.data;
const target = { name: 'supplierAddResult', query: { id: supplierId } }; const potentialFlag = this.potentialFlag;
const target = { name: 'supplierAddResult', query: { id: supplierId, potentialFlag } };
localStorage.setItem('lastRoute', JSON.stringify(target)); localStorage.setItem('lastRoute', JSON.stringify(target));
Dialog.confirm({ Dialog.confirm({
title: '提示', title: '提示',
@@ -101,11 +105,11 @@
confirmButtonText: '去添加', confirmButtonText: '去添加',
cancelButtonText: '取消', cancelButtonText: '取消',
}).then(() => { }).then(() => {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'vehicleManage', query: { id: supplierId } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'vehicleManage', query: { id: supplierId, potentialFlag } }));
this.goPage('vehicleManage', { id: supplierId }); this.goPage('vehicleManage', { id: supplierId, potentialFlag });
}).catch(() => { }).catch(() => {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: supplierId } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: supplierId, potentialFlag } }));
this.goPage('supplierAddResult', { id: supplierId }); this.goPage('supplierAddResult', { id: supplierId, potentialFlag });
}); });
} }
} catch (e) { } catch (e) {

View File

@@ -122,7 +122,7 @@
<span>司机状态</span> <span>司机状态</span>
</div> </div>
<div class="isJoin"> <div class="isJoin">
<van-radio-group v-model="states" @change="isUse" class="joinWrap"> <van-radio-group v-model="states" @change="isUse" :disabled="statesDisabled" :class="{ 'disabled-tree': statesDisabled }" class="joinWrap">
<van-radio :name="1" style="margin-right: 26px" class="item"> <van-radio :name="1" style="margin-right: 26px" class="item">
启用 启用
<img <img
@@ -185,6 +185,7 @@ export default {
iconList: [], iconList: [],
driverInfo: {}, driverInfo: {},
drivingLicenceName: '', drivingLicenceName: '',
potentialFlag: '',
idCardAuthority:'', idCardAuthority:'',
idCardValidStartTime:'', idCardValidStartTime:'',
idCardValidEndTime:'', idCardValidEndTime:'',
@@ -222,6 +223,11 @@ export default {
this.identityCardFront = this.$route.params?.identityCardFront; this.identityCardFront = this.$route.params?.identityCardFront;
this.driverInfo.lssueDate = this.$route.params?.lssueDate; this.driverInfo.lssueDate = this.$route.params?.lssueDate;
this.drivingLicenceName = this.$route.params?.drivingLicenceName; this.drivingLicenceName = this.$route.params?.drivingLicenceName;
this.potentialFlag = this.$route.params?.potentialFlag || '';
console.log('this.potentialFlagthis.potentialFlag', this.potentialFlag)
if(!this.id && this.potentialFlag === '1') {
this.states = 0;
}
if( this.identityCardFront ) { if( this.identityCardFront ) {
this.identityCardFrontList = [{ url : this.identityCardFront }]; this.identityCardFrontList = [{ url : this.identityCardFront }];
} }
@@ -242,7 +248,7 @@ export default {
const selectedValue = selectElement.value; const selectedValue = selectElement.value;
this.drivingModel=selectedValue this.drivingModel=selectedValue
}); });
console.log('statesDisabled', this.statesDisabled)
}, },
methods:{ methods:{
isUse(e){ isUse(e){
@@ -456,6 +462,11 @@ export default {
},2000) },2000)
}, },
}, },
computed: {
statesDisabled() {
return !this.id && this.potentialFlag === '1';
}
},
components:{ components:{
TwoCommonBtn, TwoCommonBtn,
CellGroup CellGroup

View File

@@ -137,6 +137,7 @@ export default {
supplierId: '', supplierId: '',
routeId: '', routeId: '',
initialized: false, initialized: false,
potentialFlag: '',
supplierType:'', supplierType:'',
count: 0, count: 0,
isLoading: false, isLoading: false,
@@ -186,6 +187,7 @@ export default {
this.supplierId = rawId ? Number(rawId) : ''; this.supplierId = rawId ? Number(rawId) : '';
const potentialId = this.$route.query.potentialId || urlParams.get('potentialId'); const potentialId = this.$route.query.potentialId || urlParams.get('potentialId');
this.routeId = potentialId; this.routeId = potentialId;
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
if(!rawId) { if(!rawId) {
this.getPermissions(); this.getPermissions();
} }
@@ -193,8 +195,8 @@ export default {
}, },
methods:{ methods:{
nextToResult() { nextToResult() {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: this.routeId } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: this.routeId, potentialFlag: this.potentialFlag } }));
this.goPage('supplierAddResult', { id: this.routeId }); this.goPage('supplierAddResult', { id: this.routeId, potentialFlag: this.potentialFlag });
}, },
isMiniProgram(item) { isMiniProgram(item) {
return item.registerFrom === '小程序' || (item.jobNumber && item.jobNumber.includes('小程序')) return item.registerFrom === '小程序' || (item.jobNumber && item.jobNumber.includes('小程序'))
@@ -255,7 +257,7 @@ export default {
}else{ }else{
this.$router.push({ this.$router.push({
name: 'driverAdd', name: 'driverAdd',
params: this.supplierId ? { supplierId: this.supplierId } : {} params: { supplierId: this.supplierId || undefined, potentialFlag: this.potentialFlag || undefined }
}) })
} }
}, },

View File

@@ -314,7 +314,7 @@
serviceAreaCode: checkArr.join(','), serviceAreaCode: checkArr.join(','),
}; };
localStorage.setItem('supplierAddForm', JSON.stringify(payload)); localStorage.setItem('supplierAddForm', JSON.stringify(payload));
this.goPage('addWechat', {}); this.goPage('addWechat', { potentialFlag: 1 });
} }
}, },
async QrCodeResult() { //获取添加企微结果 async QrCodeResult() { //获取添加企微结果

View File

@@ -19,6 +19,7 @@
data() { data() {
return { return {
id: '', id: '',
potentialFlag: '',
name: '', name: '',
qrCodeUrl: '', qrCodeUrl: '',
qrCode: '', qrCode: '',
@@ -29,14 +30,15 @@
async mounted() { async mounted() {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
this.id = this.$route.query.id || urlParams.get('id'); this.id = this.$route.query.id || urlParams.get('id');
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
if (this.id) { if (this.id) {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: this.id } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: this.id, potentialFlag: this.potentialFlag } }));
} }
}, },
methods: { methods: {
async searchInfo() { async searchInfo() {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierInfo', query: { id: this.id } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierInfo', query: { id: this.id, potentialFlag: this.potentialFlag } }));
this.goPage('supplierInfo', { id: this.id }) this.goPage('supplierInfo', { id: this.id, potentialFlag: this.potentialFlag })
} }
} }
} }

View File

@@ -154,6 +154,7 @@
supplierInfo: {}, supplierInfo: {},
type: 'show', type: 'show',
origin: '', origin: '',
potentialFlag: '',
} }
}, },
async mounted() { async mounted() {
@@ -161,13 +162,14 @@
this.id=this.$route.query.id || urlParams.get('id'); this.id=this.$route.query.id || urlParams.get('id');
this.type=this.$route.query.type || urlParams.get('type') || 'show'; this.type=this.$route.query.type || urlParams.get('type') || 'show';
this.origin = this.$route.query.origin || '' this.origin = this.$route.query.origin || ''
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
await this.getInfoHandler(); await this.getInfoHandler();
}, },
methods: { methods: {
goAddVehicle() { goAddVehicle() {
const supplierId = this.id const supplierId = this.id
localStorage.setItem('lastRoute', JSON.stringify({ name: 'vehicleManage', query: { id: supplierId } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'vehicleManage', query: { id: supplierId, potentialFlag: this.potentialFlag } }));
this.goPage('vehicleManage', { id: supplierId }); this.goPage('vehicleManage', { id: supplierId, potentialFlag: this.potentialFlag });
}, },
goModifyPage() { goModifyPage() {
this.goPage('supplierAdd', { id : this.id }) this.goPage('supplierAdd', { id : this.id })

View File

@@ -197,7 +197,7 @@
<span>车辆状态</span> <span>车辆状态</span>
</div> </div>
<div class="isJoin"> <div class="isJoin">
<van-radio-group v-model="vehicleStatus" :class="{ 'disabled-tree': vehicleInfoDisabled }" :disabled="vehicleInfoDisabled" @change="isVehicleChange" class="joinWrap"> <van-radio-group v-model="vehicleStatus" :class="{ 'disabled-tree': vehicleInfoDisabled || vehicleStatusDisabled }" :disabled="vehicleInfoDisabled || vehicleStatusDisabled" @change="isVehicleChange" class="joinWrap">
<van-radio :name="1" style="margin-right: 14px"> <van-radio :name="1" style="margin-right: 14px">
启用 启用
<img <img
@@ -470,7 +470,8 @@ export default {
maxDate: new Date(2099, 11, 31), // 设置最大可选日期2099年12月31日 maxDate: new Date(2099, 11, 31), // 设置最大可选日期2099年12月31日
checkList: [], checkList: [],
virtualVehicle: '', virtualVehicle: '',
vehicleStatus: '', potentialFlag: new URLSearchParams(window.location.search).get('potentialFlag') || '',
vehicleStatus: new URLSearchParams(window.location.search).get('potentialFlag') === '1' ? 2 : '',
showDatePicker: false, showDatePicker: false,
dateVal: '', dateVal: '',
trailerService: '',//拖车服务 trailerService: '',//拖车服务
@@ -648,6 +649,9 @@ export default {
} else { } else {
return false return false
} }
},
vehicleStatusDisabled() {
return !this.id && this.potentialFlag === '1';
} }
}, },
watch:{ watch:{
@@ -871,7 +875,7 @@ export default {
this.vehicleLicenseInfo.address = frontInfo?.address; this.vehicleLicenseInfo.address = frontInfo?.address;
this.vehicleLicenseInfo.useNature = frontInfo?.useCharacter; this.vehicleLicenseInfo.useNature = frontInfo?.useCharacter;
this.vehicleLicenseInfo.model = frontInfo?.model; this.vehicleLicenseInfo.model = frontInfo?.model;
this.vehicleLicenseInfo.vinCode = frontInfo?.vin; this.vehicleLicenseInfo.vinCode = String(frontInfo?.vin || '').toUpperCase().replace(/O/g, '0');
this.vehicleLicenseInfo.engineNumber = frontInfo?.engineNo; this.vehicleLicenseInfo.engineNumber = frontInfo?.engineNo;
this.vehicleLicenseInfo.registrationDate = frontInfo?.registerDate; this.vehicleLicenseInfo.registrationDate = frontInfo?.registerDate;
this.vehicleLicenseInfo.issueDate = frontInfo?.issueDate; this.vehicleLicenseInfo.issueDate = frontInfo?.issueDate;
@@ -1215,7 +1219,8 @@ export default {
this.insuranceChange=false this.insuranceChange=false
}, },
back() { back() {
if( this.supplierId ) { this.$router.back();
/*if( this.supplierId ) {
this.$router.back(); this.$router.back();
} else { } else {
this.$router.push({ this.$router.push({
@@ -1224,10 +1229,55 @@ export default {
id: this.id id: this.id
} }
}) })
} }*/
}, },
validatePlateNumber(value) {
if (!value) {
return { valid: false, message: '请输入车牌号' }
}
const provinceList = ['京','津','冀','晋','蒙','辽','吉','黑','沪','苏','浙','皖','闽','赣','鲁','豫','鄂','湘','粤','桂','琼','渝','川','贵','云','藏','陕','甘','青','宁','新']
const firstChar = value.charAt(0)
if (!provinceList.includes(firstChar)) {
return { valid: false, message: '车牌号首位必须是省级简称(京/沪/津/渝/冀/晋/辽/吉/黑/苏/浙/皖/闽/赣/鲁/豫/鄂/湘/粤/琼/川/贵/云/陕/甘/青/蒙/桂/藏/宁/新)' }
}
if (!/^[\u4e00-\u9fa5][A-Z0-9]+$/.test(value)) {
return { valid: false, message: '车牌号只能包含汉字、字母和数字' }
}
if (![7, 8].includes(value.length)) {
return { valid: false, message: `车牌号必须为 7 位或 8 位(当前 ${value.length} 位)` }
}
return { valid: true, message: '' }
},
validateVinNo(value) {
const normalizedValue = String(value || '').toUpperCase()
if (!normalizedValue) {
return { valid: false, message: '车架号识别错误,请重新拍照上传。' }
}
if (!/^[A-NP-Z0-9]{17}$/.test(normalizedValue)) {
if (normalizedValue.includes('O')) {
return { valid: false, message: '车架号识别错误,请重新拍照上传。' }
}
if (!/^[A-NP-Z0-9]+$/.test(normalizedValue)) {
return { valid: false, message: '车架号识别错误,请重新拍照上传。' }
}
return { valid: false, message: `车架号识别错误,请重新拍照上传。` }
}
return { valid: true, message: '' }
},
async submitBtn(){ async submitBtn(){
const plateResult = this.validatePlateNumber(this.carNum)
if (!plateResult.valid) {
Dialog.alert({ message: plateResult.message })
return
}
const vinCode = String(this.vehicleLicenseInfo.vinCode || '')
const vinResult = this.validateVinNo(vinCode)
if (!vinResult.valid) {
Dialog.alert({ message: vinResult.message })
return
}
this.vehicleLicenseInfo.vinCode = vinCode
if( !this.vehicleLicenseFront ) { if( !this.vehicleLicenseFront ) {
this.$toast('行驶证主页照片不能为空') this.$toast('行驶证主页照片不能为空')
return return

View File

@@ -11,7 +11,7 @@
@click-left="goBack" @click-left="goBack"
> >
<template slot="right" v-if="permissonList.includes('vehicleAddBtn') || supplierId"> <template slot="right" v-if="permissonList.includes('vehicleAddBtn') || supplierId">
<div class="rightWrap" @click="goPage('vehicleAdd', supplierId ? { supplierId } : {})"> <div class="rightWrap" @click="goPage('vehicleAdd', supplierId ? { supplierId, potentialFlag } : {})">
<img src="@/assets/addImg.png" /> <img src="@/assets/addImg.png" />
<span class="addTxt">添加</span> <span class="addTxt">添加</span>
</div> </div>
@@ -149,6 +149,7 @@ export default {
searchVal: '', searchVal: '',
authStates: [], authStates: [],
liabilityInsuranceAuditList: [], liabilityInsuranceAuditList: [],
potentialFlag: '',
inputStatusListOptions: [{ inputStatusListOptions: [{
name: '行驶证未录入', name: '行驶证未录入',
value: 0 value: 0
@@ -199,6 +200,7 @@ export default {
async mounted() { async mounted() {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const rawId = this.$route.query.id || urlParams.get('id'); const rawId = this.$route.query.id || urlParams.get('id');
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
if (rawId) { if (rawId) {
this.routeId = rawId; this.routeId = rawId;
await this.getSupplierById(Number(rawId)); await this.getSupplierById(Number(rawId));
@@ -212,8 +214,8 @@ export default {
}, },
methods:{ methods:{
nextToDriver() { nextToDriver() {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'driverManage', query: { id: this.supplierId, potentialId: this.routeId } })); localStorage.setItem('lastRoute', JSON.stringify({ name: 'driverManage', query: { id: this.supplierId, potentialId: this.routeId, potentialFlag: this.potentialFlag } }));
this.goPage('driverManage', { id: this.supplierId, potentialId: this.routeId }); this.goPage('driverManage', { id: this.supplierId, potentialId: this.routeId, potentialFlag: this.potentialFlag });
}, },
async getSupplierById(id) { async getSupplierById(id) {
let res = await supplierSelectById({ id }); let res = await supplierSelectById({ id });

View File

@@ -498,13 +498,7 @@ export default {
console.log("ii", i) console.log("ii", i)
}, },
goback() { goback() {
this.$router.push({ this.$router.back()
name: "workOrderReconciliation",
params: {
activeIndex: this.index,
queryTime: this.queryTime,
}
})
}, },
async compute() { async compute() {
if(this.orderInfo.contractSettleTypeString == '车主现收'){ if(this.orderInfo.contractSettleTypeString == '车主现收'){