Compare commits

...

29 Commits

Author SHA1 Message Date
e7bb5a23be CRM_26-07-09#story#8922,抢单链接页面更改及 BI 埋点新增需求 2026-06-30 10:39:41 +08:00
da844d0e24 CRM_26-06-30#story#8869,救援 APP、中道神行小程序、跑圈小板运输小程序和小板运输APP端上传损伤照片自动生成推送链接需求 2026-06-30 10:01:07 +08:00
1d7b200f76 环境救援照片页面修改 2026-06-29 14:22:01 +08:00
ddb3817d6e CRM_26-06-30#story#8869,救援 APP、中道神行小程序、跑圈小板运输小程序和小板运输APP端上传损伤照片自动生成推送链接需求 2026-06-26 16:52:40 +08:00
2ff9e7684f CRM_26-06-30#story#8858,关于“我的车辆”中行驶证主页照片识别出的“车牌号”和“车架号”的校验需求 2026-06-25 16:09:11 +08:00
c7327de2e5 CRM_26-06-30#story#8858,关于“我的车辆”中行驶证主页照片识别出的“车牌号”和“车架号”的校验需求 2026-06-25 15:31:21 +08:00
9c324fbff3 CRM_26-06-30#story#8858,关于“我的车辆”中行驶证主页照片识别出的“车牌号”和“车架号”的校验需求 2026-06-23 16:45:20 +08:00
69469ed61f CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(跳转详情修改2) 2026-06-22 16:25:31 +08:00
3a880c0f34 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(车辆信息跳转路由) 2026-06-22 10:02:57 +08:00
798a2a60c9 CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-17 11:51:41 +08:00
0ad22527a1 CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-17 11:47:59 +08:00
f30afdd1e9 CRM_26-06-16#story#8836,小板跳转APP的h5链接增加操作指引 2026-06-17 11:43:19 +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
7c40fbc4c5 Revert "CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(停启用修改)"
This reverts commit 57f83916
2026-06-09 15:28:46 +08:00
336bb11c42 Revert "CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(禁用)"
This reverts commit 4aae54f9
2026-06-09 15:28:16 +08:00
4aae54f9a5 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(禁用) 2026-06-09 11:29:02 +08:00
57f839166e CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(停启用修改) 2026-06-09 11:06:48 +08:00
e4757849dd CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(车辆返回按钮) 2026-06-09 10:25:49 +08:00
61e8418459 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(完善信息去除) 2026-06-08 14:30:25 +08:00
80c15dcf1b CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(添加跳转) 2026-06-08 11:30:52 +08:00
8a053c5a80 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(错误兼容) 2026-06-08 11:02:17 +08:00
d5d777afd3 CRM_26-06-04#story#8753,增加潜在供应商招募的H5链接中的信息填写 2026-06-04 11:15:18 +08:00
0483c2d0a7 CRM_26-06-04#story#8753,增加潜在供应商招募的H5链接中的信息填写 2026-06-04 10:49:27 +08:00
3c1f238163 CRM_26-06-16#task#16902,调度APP--服务商无法上传发票---李洁 2026-06-02 17:25:44 +08:00
384a64b2c8 CRM_26-06-04#story#8731,关于将小程序(神行)和APP的“人”和“车”独立分开的需求 2026-06-01 16:12:49 +08:00
c55f6b4045 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(跳转详情修改2) 2026-05-15 14:20:58 +08:00
0b4127a0e2 CRM_26-04-22#story#8495,潜在供应商H5页面提交信息,信息审核,提交补充信息与退回理由的优化与修复(跳转详情修改--修改跳转) 2026-05-15 13:47:35 +08:00
20 changed files with 993 additions and 107 deletions

14
src/api/damagePhoto.js Normal file
View File

@@ -0,0 +1,14 @@
import request from '@/utils/http'
/**
* 查询 H5 损伤照片
* @param {Object} data - { userOrderId, taskOrderId }
*/
export function getDamagePhotos(data) {
return request({
url: '/api/h5-interface/damagePhotos',
method: 'POST',
contentType: 'application/json',
data
})
}

View File

@@ -0,0 +1,10 @@
import request from '@/utils/http'
export function getBeforeDispatchImage(data) {
return request({
url: '/supplierAppV2/dispatchApp/order/getBeforeDispatchImage',
method: 'POST',
contentType: 'application/json',
data
})
}

View File

@@ -72,10 +72,12 @@ export function vehicleTypeList(){
})
}
// 服务商服务能力
export function supplierServiceTree(){
export function supplierServiceTree(data){
console.log('ddddddd0', data)
return request({
url:'/supplierAppV2/dispatchApp/user/supplierServiceTree',
method:'POST'
method:'POST',
data
})
}
@@ -115,6 +117,15 @@ export function getSupplierInfo(key){
})
}
// 根据id查询潜在服务商
export function supplierSelectById(params){
return request({
url:'/supplier/potential/supplierSelectById',
method:'GET',
params
})
}
// 获取企微二维码
export function getOrCodeInfo(data){
return request({

BIN
src/assets/sucai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -27,6 +27,14 @@ const routes = [
title: '审核中',
}
},
{
path: '/addWechat',
name: 'addWechat',
component: () => import('@/views/index/addWechat'),
meta:{
title: '添加微信',
}
},
{
path: '/supplierInfo',
name: 'supplierInfo',
@@ -156,6 +164,22 @@ const routes = [
title: '查看发票'
}
},
{
path: '/damagePhotos',
name: 'damagePhotoList',
component: () => import('@/views/damagePhoto/damagePhotoList.vue'),
meta: {
title: '损伤照片'
}
},
{
path: '/environmentPhotos',
name: 'environmentPhotoList',
component: () => import('@/views/environmentPhoto/environmentPhotoList.vue'),
meta: {
title: '环境照片'
}
},
{
path: "/vehicleManage",
name: 'vehicleManage',
@@ -329,7 +353,7 @@ const routes = [
name: 'goToApp',
component:()=>import('@/views/goToApp/goToApp.vue'),
meta: {
title:'电瓶详情'
title:'小板运输司机端'
}
},
...kpiRouter,

View File

@@ -0,0 +1,312 @@
<template>
<div class="wrap damage-photo-wrap">
<div class="navBar">
<van-nav-bar
title="损伤照片"
left-arrow
left-arrow-color="#FFFFFF"
:border="false"
:fixed="true"
:safe-area-inset-top="true"
@click-left="h5GoBack"
/>
</div>
<div class="content-wrap" v-if="loaded">
<!-- 案件信息 -->
<div class="info-card">
<div class="info-item">
<span class="info-label">案件号</span>
<span class="info-value">{{ info.caseNo || '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">车辆标识</span>
<span class="info-value">{{ info.vehicleIdentity || '-' }}</span>
</div>
<div class="info-item">
<span class="info-label">起止路线</span>
<span class="info-value">{{ info.route || '-' }}</span>
</div>
</div>
<!-- 照片列表 -->
<div class="photo-list" v-if="photoList.length">
<div class="photo-card" v-for="(item, index) in photoList" :key="index">
<div class="photo-title">
<span>{{ item.title || '-' }}</span>
<span
v-if="item.replaced || (item.historyList && item.historyList.length)"
class="replaced-tag"
@click="showHistory(item)"
>被替换</span>
</div>
<div class="photo-image" @click="previewCurrent(item.currentUrl)">
<van-image
:src="item.currentUrl"
fit="cover"
width="100%"
height="160"
:error-icon="defaultImg"
error-icon-size="48"
/>
</div>
</div>
</div>
<!-- 空态 -->
<div class="empty-state" v-else>
<van-empty description="暂无损伤照片" />
</div>
</div>
<!-- 历史照片弹框 -->
<van-popup
v-model="historyShow"
position="bottom"
round
closeable
:style="{ height: '70%' }"
@closed="currentHistory = []"
>
<div class="history-popup">
<div class="history-title">历史照片</div>
<div class="history-list" v-if="currentHistory.length">
<div
class="history-item"
v-for="(item, index) in currentHistory"
:key="index"
@click="previewHistory(item.url)"
>
<van-image
:src="item.url"
fit="cover"
width="100%"
height="120"
:error-icon="defaultImg"
error-icon-size="48"
/>
<div class="history-time" v-if="item.replaceTime">替换时间{{ item.replaceTime }}</div>
</div>
</div>
<div class="history-empty" v-else>
<van-empty description="暂无历史照片" />
</div>
</div>
</van-popup>
</div>
</template>
<script>
import { getDamagePhotos } from '@/api/damagePhoto'
import { myMixins } from '@/utils/myMixins'
import { ImagePreview, Toast } from 'vant'
export default {
name: 'damagePhotoList',
mixins: [myMixins],
data() {
return {
loaded: false,
info: {
caseNo: '',
vehicleIdentity: '',
route: ''
},
photoList: [],
historyShow: false,
currentHistory: [],
defaultImg: require('@/assets/empty.png')
}
},
async mounted() {
await this.fetchDamagePhotos()
},
methods: {
async fetchDamagePhotos() {
const userOrderId = this.$route.query.userOrderId
const taskOrderId = this.$route.query.taskOrderId
if (!userOrderId || !taskOrderId) {
Toast('缺少必要参数')
this.loaded = true
return
}
Toast.loading({
message: '加载中...',
forbidClick: true,
duration: 0
})
try {
const res = await getDamagePhotos({
userOrderId: Number(userOrderId),
taskOrderId: Number(taskOrderId)
})
this.info = {
caseNo: res.data?.caseNo || '',
vehicleIdentity: res.data?.vehicleIdentity || '',
route: res.data?.route || ''
}
this.photoList = Array.isArray(res.data?.photos) ? res.data.photos : []
} finally {
Toast.clear()
this.loaded = true
}
},
previewCurrent(url) {
if (!url) return
ImagePreview({
images: [url],
startPosition: 0,
closeable: true
})
},
showHistory(item) {
this.currentHistory = Array.isArray(item.historyList) ? item.historyList : []
this.historyShow = true
},
previewHistory(url) {
if (!url) return
ImagePreview({
images: [url],
startPosition: 0,
closeable: true
})
}
}
}
</script>
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.wrap {
@include wh(100%, 100%);
background-color: #F4F5F7;
overflow-y: auto;
}
.navBar {
height: 46px;
::v-deep .van-nav-bar--fixed {
z-index: 9999 !important;
}
}
.content-wrap {
padding: 10px 15px 20px;
}
.info-card {
background: #fff;
border-radius: 8px;
padding: 15px;
margin-bottom: 10px;
.info-item {
display: flex;
line-height: 24px;
font-size: 13px;
&:not(:last-child) {
margin-bottom: 8px;
}
.info-label {
color: rgba(0, 0, 0, 0.5);
width: 70px;
flex-shrink: 0;
}
.info-value {
color: #323643;
flex: 1;
word-break: break-all;
}
}
}
.photo-list {
.photo-card {
background: #fff;
border-radius: 8px;
padding: 12px 12px 15px;
margin-bottom: 10px;
.photo-title {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 14px;
font-weight: bold;
color: #323643;
margin-bottom: 10px;
.replaced-tag {
font-size: 12px;
font-weight: normal;
color: #fff;
background-color: #ee0a24;
padding: 2px 8px;
border-radius: 4px;
}
}
.photo-image {
width: 100%;
border-radius: 4px;
overflow: hidden;
}
}
}
.empty-state {
margin-top: 30px;
}
.history-popup {
height: 100%;
display: flex;
flex-direction: column;
.history-title {
font-size: 16px;
font-weight: bold;
color: #323643;
text-align: center;
padding: 15px 0;
border-bottom: 1px solid #E9E9EA;
}
.history-list {
flex: 1;
overflow-y: auto;
padding: 15px;
.history-item {
margin-bottom: 15px;
border-radius: 4px;
overflow: hidden;
.history-time {
font-size: 12px;
color: rgba(0, 0, 0, 0.5);
margin-top: 6px;
}
}
}
.history-empty {
flex: 1;
}
}
</style>
<style>
/* 确保图片预览及其遮罩层级高于底部弹框 */
.van-image-preview {
z-index: 10000000003 !important;
}
.van-overlay.van-image-preview__overlay {
z-index: 10000000002 !important;
}
</style>

View File

@@ -0,0 +1,118 @@
<template>
<div class="wrap environment-photo-wrap">
<div v-if="loaded && photoList.length === 0" class="empty-tip">暂无环境照片</div>
<div v-for="(item, index) in photoList" :key="index" class="photo-item">
<div class="media-wrap">
<video
v-if="item.tag && item.tag.includes('video')"
:src="item.imageUrl"
controls
playsinline
class="media"
/>
<img
v-else-if="item.tag && item.tag.includes('img')"
:src="item.imageUrl"
class="media"
@click="previewImage(index)"
/>
</div>
<p v-if="item.title" class="photo-name">{{ item.title }}</p>
</div>
</div>
</template>
<script>
import { Toast, ImagePreview } from 'vant'
import { getBeforeDispatchImage } from '@/api/environmentPhoto'
export default {
name: 'EnvironmentPhotoList',
data() {
return {
photoList: [],
loaded: false
}
},
async mounted() {
await this.fetchPhotos()
},
methods: {
async fetchPhotos() {
const userOrderId = this.$route.query.userOrderId
if (!userOrderId) {
Toast('缺少必要参数')
this.loaded = true
return
}
Toast.loading({
message: '加载中...',
forbidClick: true,
duration: 0
})
try {
const res = await getBeforeDispatchImage({ userOrderId: Number(userOrderId) })
this.photoList = Array.isArray(res.data) ? res.data : []
} finally {
Toast.clear()
this.loaded = true
}
},
previewImage(index) {
const urls = this.photoList
.filter(item => item.tag && item.tag.includes('img'))
.map(item => item.imageUrl)
ImagePreview({ images: urls, startPosition: index })
}
}
}
</script>
<style scoped>.wrap {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #F4F5F7;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.environment-photo-wrap {
padding: 12px;
}
.empty-tip {
text-align: center;
color: #999;
margin-top: 60px;
font-size: 14px;
}
.photo-item {
background: #fff;
border-radius: 6px;
margin-bottom: 12px;
overflow: hidden;
}
.media-wrap {
position: relative;
width: 100%;
padding-top: 56.25%;
}
.photo-item img,
.photo-item video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
.photo-name {
font-size: 13px;
color: #333;
padding: 8px 10px;
margin: 0;
}
</style>

View File

@@ -3,22 +3,57 @@
<div class="content">
<div class="goToBtn" @click="goAppHandler">立即打开</div>
<div class="content_tip">
<div class="font_cls">如未安装请点击下载</div>
<div class="font_cls">如已安装未自动跳转 <span @click="downLoadHandler">立即下载</span></div>
<div class="font_cls">如未安装请点击 <span @click="downLoadHandler">立即下载</span></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>
</template>
<script>
import { getNewVersion } from "@/api/order"
import { getNewVersion, getLog } from "@/api/order"
export default {
name: "goToApp",
data() {
return {
showGuide: false
}
},
mounted() {
getLog({
source: 'App下载页',
event: '页面浏览',
page: '/h5/supplier/dispatch/goToApp'
})
this.showGuide = this.isWeixin()
},
methods: {
isWeixin() {
const ua = navigator.userAgent.toLowerCase()
return ua.indexOf('micromessenger') !== -1
},
closeGuide() {
this.showGuide = false
},
goAppHandler() {
getLog({
source: 'App下载页',
event: '直接打开',
page: '/h5/supplier/dispatch/goToApp'
})
window.location.href = "rvdriver://page/pagesLogin/phoneLogin?source=h5Link";
},
async downLoadHandler() {
getLog({
source: 'App下载页',
event: '立即下载',
page: '/h5/supplier/dispatch/goToApp'
});
getNewVersion({
appType: 5
}).then((res) => {
@@ -70,4 +105,32 @@ export default {
}
}
}
</style>
.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>

View File

@@ -0,0 +1,180 @@
<template>
<div class="wrap">
<div class="top-wrap"></div>
<div class="center-info">
<div class="wei_code_wrap">
<div class="wei_title">请先添加企业微信保证申请流程正常进行</div>
<div class="wei_code_bg">
<img v-if="qrCodeUrl" :src="qrCodeUrl" alt="企业微信二维码" />
</div>
</div>
</div>
<div class="btn_wrap">
<div class="btn" @click="nextStep">下一步</div>
</div>
</div>
</template>
<script>
import QRCode from 'qrcode'
import {getOrCodeInfo, getContactQrCodeResult, saveSupplier} from "@/api/mine"
import {myMixins} from "@/utils/myMixins"
import {Toast, Dialog} from "vant";
export default {
name: "addWechat",
mixins: [myMixins],
data() {
return {
name: '',
potentialFlag: '',
formPayload: null,
qrCodeUrl: '',
qrCode: '',
configId: '',
wechatId: '',
clickFlag: true,
}
},
async mounted() {
const urlParams = new URLSearchParams(window.location.search);
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
const cached = localStorage.getItem('supplierAddForm');
if (cached) {
this.formPayload = JSON.parse(cached);
this.name = this.formPayload.name;
}
if (this.name) {
await this.QrCodeHandler();
}
},
methods: {
async QrCodeHandler() {
await this.QrCodeInfo();
await this.getQrCode();
},
async QrCodeInfo() {
let res = await getOrCodeInfo({ name: this.name });
this.configId = res?.configId;
this.qrCode = res?.qrCode;
},
async getQrCode() {
try {
this.qrCodeUrl = await QRCode.toDataURL(this.qrCode, {
width: 150,
margin: 2,
color: { dark: '#000000', light: '#FFFFFF' },
});
} catch (error) {
console.error('生成二维码失败:', error);
}
},
async nextStep() {
if (!this.clickFlag) return;
let res = await getContactQrCodeResult({ configId: this.configId });
this.wechatId = res?.data?.wechatId;
if (!this.wechatId) {
Toast('请先添加企微再继续');
return;
}
try {
this.clickFlag = false;
const res = await saveSupplier({
...this.formPayload,
wechatId: this.wechatId,
});
if (res?.noToast) {
if (res?.code != 0) {
Dialog.alert({ title: '提示', message: '该服务商已存在,查看信息' }).then(() => {
localStorage.removeItem('supplierAddForm');
const target = { name: 'supplierInfo', query: { id: res?.code, potentialFlag: this.potentialFlag } };
localStorage.setItem('lastRoute', JSON.stringify(target));
this.goPage('supplierInfo', { id: res?.code, potentialFlag: this.potentialFlag });
});
} else {
Toast('该服务商已存在');
}
} else {
localStorage.removeItem('supplierAddForm');
const supplierId = res?.data;
const potentialFlag = this.potentialFlag;
const target = { name: 'supplierAddResult', query: { id: supplierId, potentialFlag } };
localStorage.setItem('lastRoute', JSON.stringify(target));
Dialog.confirm({
title: '提示',
message: '添加车辆和驾驶员会加快审核进度,是否去添加?',
confirmButtonText: '去添加',
cancelButtonText: '取消',
}).then(() => {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'vehicleManage', query: { id: supplierId, potentialFlag } }));
this.goPage('vehicleManage', { id: supplierId, potentialFlag });
}).catch(() => {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: supplierId, potentialFlag } }));
this.goPage('supplierAddResult', { id: supplierId, potentialFlag });
});
}
} catch (e) {
Toast(e?.message || '提交失败');
} finally {
setTimeout(() => { this.clickFlag = true; }, 1000);
}
}
}
}
</script>
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.wrap {
@include wh(100%, 100%);
box-sizing: border-box;
padding-bottom: 100px;
overflow-y: auto;
background: linear-gradient(180deg, #FBFDFE 0%, #F6FBFF 73%, #F0F7FF 100%);
backdrop-filter: blur(5.602678571428572px);
}
.top-wrap {
width: 100%;
height: 175px;
background: linear-gradient(180deg, #DAECFF 0%, rgba(233, 243, 255, 0) 100%);
}
.center-info {
text-align: center;
}
.wei_code_wrap {
margin-top: 10px;
.wei_title {
font-size: 15px;
color: #FF553B;
text-align: center;
}
.wei_code_bg {
width: 163px;
height: 173px;
background-image: url("~@/assets/supplier/weiCodeBg.png");
background-size: 100% 100%;
margin: 8px auto;
display: flex;
align-items: center;
justify-content: center;
}
}
.btn_wrap {
width: 100%;
padding: 15px 0;
position: fixed;
bottom: 10px;
z-index: 10000 !important;
.btn {
width: calc(100% - 80px);
margin-left: 40px;
height: 46px;
background: #0E76F4;
border-radius: 5px;
font-size: 15px;
color: #FFFFFF;
text-align: center;
line-height: 46px;
}
}
</style>

View File

@@ -122,7 +122,7 @@
<span>司机状态</span>
</div>
<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">
启用
<img
@@ -163,6 +163,7 @@ export default {
// baseURL:'',
// licenseOcrInfo:'',
id:'',
supplierId: '',
driverName:"",
driverPhone:"",
identityCardNumber:"",
@@ -184,6 +185,7 @@ export default {
iconList: [],
driverInfo: {},
drivingLicenceName: '',
potentialFlag: '',
idCardAuthority:'',
idCardValidStartTime:'',
idCardValidEndTime:'',
@@ -204,6 +206,7 @@ export default {
let token=localStorage.getItem('token')
this.authorization.Authorization=token;*/
this.id = this.$route.params?.id;
this.supplierId = this.$route.params?.supplierId || '';
this.driverName = this.$route.params?.name;
this.driverPhone = this.$route.params?.phone;
this.drivingModel = this.$route.params?.drivingModel;
@@ -220,6 +223,11 @@ export default {
this.identityCardFront = this.$route.params?.identityCardFront;
this.driverInfo.lssueDate = this.$route.params?.lssueDate;
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 ) {
this.identityCardFrontList = [{ url : this.identityCardFront }];
}
@@ -240,7 +248,7 @@ export default {
const selectedValue = selectElement.value;
this.drivingModel=selectedValue
});
console.log('statesDisabled', this.statesDisabled)
},
methods:{
isUse(e){
@@ -426,6 +434,7 @@ export default {
}
await saveDriver({
driverId:this.id ? this.id : '',
supplierId: this.supplierId || undefined,
driverName:this.driverName ,
driverPhone:this.driverPhone,
identityCardNumber:this.identityCardNumber,
@@ -453,6 +462,11 @@ export default {
},2000)
},
},
computed: {
statesDisabled() {
return !this.id && this.potentialFlag === '1';
}
},
components:{
TwoCommonBtn,
CellGroup

View File

@@ -3,14 +3,14 @@
<div class="navBar">
<van-nav-bar
title="司机管理"
left-arrow
:left-arrow="!supplierId"
left-arrow-color="#FFFFFF"
:border="false"
:fixed="true"
:safe-area-inset-top="true"
@click-left="goBack"
>
<template slot="right" v-if="permissonList.includes('driverAddBtn')">
<template slot="right" v-if="permissonList.includes('driverAddBtn') || supplierId">
<div class="rightWrap" @click="addDriver" >
<img src="@/assets/addImg.png" />
<span class="addTxt">添加</span>
@@ -62,14 +62,14 @@
finished-text="没有更多了"
@load="onLoad"
>
<div class="itemWrap" v-for="(item,index) in driverList" :key="index" @click.stop="updateDriver(item)">
<div class="itemWrap" v-for="(item,index) in driverList" :key="index" @click.stop="!isMiniProgram(item) && updateDriver(item)">
<div class="name-status">
<div class="namephone">{{ item.driverName }} / {{ item.driverPhone }}
<span style="margin-left: 10px" :class="item.states?.code == 1 ? 'statusYes' : 'statusNo'">{{ item.states?.label }}</span>
</div>
<div class="twoBtn">
<!-- 只有启用状态下才展示停用按钮-->
<button v-if="permissonList.includes('driverModifyBtn') && item.states?.code==1" class="del" @click.stop="handleStatus(item)">停用</button>
<!-- 只有启用状态下才展示停用按钮小程序来源司机不显示-->
<button v-if="!isMiniProgram(item) && permissonList.includes('driverModifyBtn') && item.states?.code==1" class="del" @click.stop="handleStatus(item)">停用</button>
<!-- <button v-if="permissonList.includes('driverModifyBtn')" class="revise" @click="updateDriver(item)">修改</button>-->
</div>
</div>
@@ -103,7 +103,7 @@
<span class="halfOpci">身份证号:</span>
<span class="allOpci">{{ item.identityCardNumber }}</span>
</div>
<van-icon class="arrow_position" v-if="permissonList.includes('driverModifyBtn')" name="arrow" />
<van-icon class="arrow_position" v-if="!isMiniProgram(item) && permissonList.includes('driverModifyBtn')" name="arrow" />
<!-- <div>
<span class="halfOpci">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span>
<span :class="item.states?.code == 1 ? 'statusYes' : 'statusNo'">{{ item.states?.label }}</span>
@@ -113,6 +113,9 @@
</van-pull-refresh>
</div>
<div class="btn_wrap" v-if="supplierId">
<div class="btn" @click="nextToResult">下一步</div>
</div>
</div>
</template>
@@ -131,6 +134,10 @@ export default {
total:'',
driverList:[],
states:'',
supplierId: '',
routeId: '',
initialized: false,
potentialFlag: '',
supplierType:'',
count: 0,
isLoading: false,
@@ -176,10 +183,24 @@ export default {
mounted() {
const urlParams = new URLSearchParams(window.location.search);
this.supplierType = urlParams.get('supplierType');
this.getPermissions();
const rawId = this.$route.query.id || urlParams.get('id');
this.supplierId = rawId ? Number(rawId) : '';
const potentialId = this.$route.query.potentialId || urlParams.get('potentialId');
this.routeId = potentialId;
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
if(!rawId) {
this.getPermissions();
}
// this.getDriverList()
},
methods:{
nextToResult() {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: this.routeId, potentialFlag: this.potentialFlag } }));
this.goPage('supplierAddResult', { id: this.routeId, potentialFlag: this.potentialFlag });
},
isMiniProgram(item) {
return item.registerFrom === '小程序' || (item.jobNumber && item.jobNumber.includes('小程序'))
},
getClass(id) {
const ids = String(id)
const steps = {
@@ -236,6 +257,7 @@ export default {
}else{
this.$router.push({
name: 'driverAdd',
params: { supplierId: this.supplierId || undefined, potentialFlag: this.potentialFlag || undefined }
})
}
},
@@ -247,6 +269,7 @@ export default {
idCardStatusList: this.idCardStatusList,
driverLicenseStatusList: this.driverLicenseStatusList,
authStatusList: this.authStatusList,
supplierId: this.supplierId || undefined,
});
if(res.code == 200){
this.total=res.total
@@ -517,4 +540,22 @@ export default {
.flex-between{
line-height: 24px;
}
.btn_wrap {
width: 100%;
padding: 15px 0;
position: fixed;
bottom: 10px;
z-index: 10000;
.btn {
width: calc(100% - 80px);
margin-left: 40px;
height: 46px;
background: #0E76F4;
border-radius: 5px;
font-size: 15px;
color: #FFFFFF;
text-align: center;
line-height: 46px;
}
}
</style>

View File

@@ -202,14 +202,15 @@
}
},
async mounted() {
const urlParams = new URLSearchParams(window.location.search);
const lastRoute = localStorage.getItem('lastRoute');
if (lastRoute) {
this.id = this.$route.query.id || urlParams.get('id');
if (lastRoute && !this.id) {
const { name, query } = JSON.parse(lastRoute);
this.$router.replace({ name, query });
return;
}
const urlParams = new URLSearchParams(window.location.search);
this.id = this.$route.query.id || urlParams.get('id');
await this.getAreaTree();
if(this.id) {
await this.getInfoHandler();
@@ -297,7 +298,23 @@
return
}
if( this.$refs.tree.getCheckedKeys().length > 0 ) {
await this.saveHandler()
let _node = this.$refs.areaCascader.getCheckedNodes();
let checkArr = [];
_node.map(item => { checkArr.push(item.data.id) });
const payload = {
id: this.id,
...this.form,
accountInfoJson: JSON.stringify(this.form.accountInfoDTO),
accountInfoDTO: {},
idCardFrontUrl: this.idFrontPhoto,
idCardBackUrl: this.idBackPhoto,
businessLicense: this.companyPhoto,
accountUrl: this.licensePhoto,
service: this.$refs.tree.getCheckedKeys().join(','),
serviceAreaCode: checkArr.join(','),
};
localStorage.setItem('supplierAddForm', JSON.stringify(payload));
this.goPage('addWechat', { potentialFlag: 1 });
}
},
async QrCodeResult() { //获取添加企微结果

View File

@@ -5,12 +5,6 @@
<img class="wait_icon" src="@/assets/supplier/successIcon.png" alt="">
<div class="info-tip">信息录入完成请等待审核结果</div>
</div>
<div class="wei_code_wrap" v-if="name && id">
<div class="wei_title">请先添加企业微信保证申请流程正常进行</div>
<div class="wei_code_bg">
<img v-if="qrCodeUrl" :src="qrCodeUrl" alt="企业微信二维码" />
</div>
</div>
<div class="btn_wrap">
<div class="btn" @click="searchInfo">信息查看</div>
</div>
@@ -18,16 +12,14 @@
</template>
<script>
import QRCode from 'qrcode'
import {getOrCodeInfo, getContactQrCodeResult, updateWechatId, getSupplierInfo} from "@/api/mine"
import {myMixins} from "@/utils/myMixins"
import {Toast} from "vant";
export default {
name: "supplierAddResult",
mixins:[myMixins],
data() {
return {
id: '',
potentialFlag: '',
name: '',
qrCodeUrl: '',
qrCode: '',
@@ -38,63 +30,15 @@
async mounted() {
const urlParams = new URLSearchParams(window.location.search);
this.id = this.$route.query.id || urlParams.get('id');
await this.getInfoHandler();
if (this.name && this.id) {
await this.QrCodeHandler();
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
if (this.id) {
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierAddResult', query: { id: this.id, potentialFlag: this.potentialFlag } }));
}
},
methods: {
async getInfoHandler() {
let res = await getSupplierInfo({
id: this.id
});
console.log('66666', res)
let _data = res?.data
this.wechatId = _data?.wechatId;
this.name = _data?.name;
},
async QrCodeHandler() {
await this.QrCodeInfo();
await this.getQrCode();
},
async QrCodeInfo() {
let res = await getOrCodeInfo({ name: this.name });
this.configId = res?.configId;
this.qrCode = res?.qrCode;
},
async getQrCode() {
try {
this.qrCodeUrl = await QRCode.toDataURL(this.qrCode, {
width: 150,
margin: 2,
color: { dark: '#000000', light: '#FFFFFF' },
});
} catch (error) {
console.error('生成二维码失败:', error);
}
},
async QrCodeResult() {
let res = await getContactQrCodeResult({ configId: this.configId });
this.wechatId = res?.data?.wechatId;
},
async updateWechat() {
await updateWechatId({
wechatId: this.wechatId,
id: this.id
})
},
async searchInfo() {
if (!this.wechatId ) {
await this.QrCodeResult();
}
if (!this.wechatId) {
Toast('请先添加企微再查看信息');
return;
}
if(this.wechatId) {
await this.updateWechat()
this.goPage('supplierInfo', { id: this.id })
}
localStorage.setItem('lastRoute', JSON.stringify({ name: 'supplierInfo', query: { id: this.id, potentialFlag: this.potentialFlag } }));
this.goPage('supplierInfo', { id: this.id, potentialFlag: this.potentialFlag })
}
}
}

View File

@@ -124,7 +124,9 @@
</div>
</div>
<!-- <div class="btn_wrap" style="margin-bottom: 5px">
<div class="btn" @click="goAddVehicle">完善信息</div>
</div>-->
<div class="btn_wrap" v-if="type == 'show' && supplierInfo?.state == 99 && origin != 'web'">
<div class="btn" @click="goModifyPage">修改信息</div>
</div>
@@ -152,6 +154,7 @@
supplierInfo: {},
type: 'show',
origin: '',
potentialFlag: '',
}
},
async mounted() {
@@ -159,9 +162,15 @@
this.id=this.$route.query.id || urlParams.get('id');
this.type=this.$route.query.type || urlParams.get('type') || 'show';
this.origin = this.$route.query.origin || ''
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
await this.getInfoHandler();
},
methods: {
goAddVehicle() {
const supplierId = this.id
localStorage.setItem('lastRoute', JSON.stringify({ name: 'vehicleManage', query: { id: supplierId, potentialFlag: this.potentialFlag } }));
this.goPage('vehicleManage', { id: supplierId, potentialFlag: this.potentialFlag });
},
goModifyPage() {
this.goPage('supplierAdd', { id : this.id })
},

View File

@@ -287,10 +287,10 @@
if(!res.data.ocrInvoiceRes.data.sellerName.startsWith("国家税务总局") &&
conList.every(a => {
let items = a.itemName.split("*")
return (!items[1].includes("现代服务") && !items[1].includes("运输服务")) || (!items[2].includes("拖车") && !items[2].includes("救援") && !items[2].includes("施救") && !items[2].includes("清障") && !items[2].includes("道路救援"))
return (!items[1].includes("生产生活服务") && !items[1].includes("交通运输服务")) || (!items[2].includes("拖车") && !items[2].includes("救援") && !items[2].includes("施救") && !items[2].includes("清障") && !items[2].includes("道路救援"))
})
){
errorStr = errorStr + "分类必须包含:现代服务/运输服务,服务名称必须包含:拖车/救援/施救/清障/道路救援 ;例如《*现代服务*拖车费》";
errorStr = errorStr + "分类必须包含:生产生活服务/交通运输服务,服务名称必须包含:拖车/救援/施救/清障/道路救援 ;例如《*现代服务*拖车费》";
}
if( !flag ) {

View File

@@ -20,6 +20,7 @@
<van-uploader
v-model="vehicleLicenseFrontList"
:after-read="vehicleLicenseFrontHandler"
@delete="vehicleLicenseFrontDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1"
@@ -35,6 +36,7 @@
<van-uploader
v-model="vehicleLicenseBackList"
:after-read="vehicleLicenseBackHandler"
@delete="vehicleLicenseBackDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1"
@@ -50,6 +52,7 @@
<van-uploader
v-model="vehicleLicenseCarPhotoList"
:after-read="vehicleLicenseCarHandler"
@delete="vehicleLicenseCarPhotoDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1"
@@ -65,6 +68,7 @@
<van-uploader
v-model="vehicleFrontPhotoList"
:after-read="vehicleFrontPhotoHandler"
@delete="vehicleFrontPhotoDelete"
@oversize="onOversize"
:max-size="5 * 1024 * 1024"
max-count="1"
@@ -104,6 +108,7 @@
value-key="name"
class="elSelect"
collapse-tags="collapse-tags"
:popper-append-to-body="false"
placeholder="请选择" style="width: 55%"
>
<el-option
@@ -197,7 +202,7 @@
<span>车辆状态</span>
</div>
<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">
启用
<img
@@ -470,7 +475,8 @@ export default {
maxDate: new Date(2099, 11, 31), // 设置最大可选日期2099年12月31日
checkList: [],
virtualVehicle: '',
vehicleStatus: '',
potentialFlag: new URLSearchParams(window.location.search).get('potentialFlag') || '',
vehicleStatus: new URLSearchParams(window.location.search).get('potentialFlag') === '1' ? 2 : '',
showDatePicker: false,
dateVal: '',
trailerService: '',//拖车服务
@@ -648,6 +654,9 @@ export default {
} else {
return false
}
},
vehicleStatusDisabled() {
return !this.id && this.potentialFlag === '1';
}
},
watch:{
@@ -686,6 +695,9 @@ export default {
async mounted() {
this.id=this.$route.params?.id
this.approvalForm.supplierId=this.$route.params?.supplierId
const urlParams = new URLSearchParams(window.location.search);
const rawId = this.$route.query.supplierId || urlParams.get('supplierId');
this.supplierId = rawId ? Number(rawId) : '';
await this.getSupplierServiceTree();
await this.getTypeList();
if( this.id){
@@ -819,6 +831,19 @@ export default {
this.vehicleFrontPhoto = res.data;
await this.ocrCarFrontHandler()
},
vehicleLicenseFrontDelete() { // 删除 行驶证首页
this.vehicleLicenseFront = '';
},
vehicleLicenseBackDelete() { // 删除 行驶证副页
this.vehicleLicenseBack = '';
this.vehicleLicenseBackOcrFlag = false;
},
vehicleLicenseCarPhotoDelete() { // 删除 行驶证车辆照片
this.vehicleLicenseCarPhoto = '';
},
vehicleFrontPhotoDelete() { // 删除 车头照
this.vehicleFrontPhoto = '';
},
clickPreview(){
console.log(' this.insurancePicturePhoto', this.insurancePicturePhoto)
if(this.insurancePicturePhoto && this.insurancePicturePhoto.indexOf('.pdf') !== -1){
@@ -868,7 +893,7 @@ export default {
this.vehicleLicenseInfo.address = frontInfo?.address;
this.vehicleLicenseInfo.useNature = frontInfo?.useCharacter;
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.registrationDate = frontInfo?.registerDate;
this.vehicleLicenseInfo.issueDate = frontInfo?.issueDate;
@@ -948,7 +973,7 @@ export default {
}
},
async getSupplierServiceTree(){
let res = await supplierServiceTree();
let res = await supplierServiceTree({ supplierId: this.supplierId });
this.supplierServiceList=res.data
this.oldSupplierServiceList=this.supplierServiceList
},
@@ -1212,14 +1237,65 @@ export default {
this.insuranceChange=false
},
back() {
this.$router.push({
name:'vehicleManage',
params:{
id: this.id
this.$router.back();
/*if( this.supplierId ) {
this.$router.back();
} else {
this.$router.push({
name:'vehicleManage',
params:{
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(){
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 ) {
this.$toast('行驶证主页照片不能为空')
return
@@ -1303,6 +1379,7 @@ export default {
// return
await saveVehicle({
vehicleId:this.id ? this.id : '',
supplierId: this.supplierId || undefined,
plateNumber:this.carNum ? this.carNum :'',
vehicleType:this.selectedOption?.length>0 ? this.selectedOption.join(',') : '',
// hasPolymerization:this.isJoin,
@@ -1365,6 +1442,9 @@ export default {
}
.navBar{
margin-bottom: 46px;
::v-deep .van-nav-bar--fixed {
z-index: 9999 !important;
}
}
.wrap{
@include wh(100%,100%);

View File

@@ -3,15 +3,15 @@
<div class="navBar">
<van-nav-bar
title="车辆管理"
left-arrow
:left-arrow="!supplierId"
left-arrow-color="#FFFFFF"
:border="false"
:fixed="true"
:safe-area-inset-top="true"
@click-left="goBack"
>
<template slot="right" v-if="permissonList.includes('vehicleAddBtn')">
<div class="rightWrap" @click="goPage('vehicleAdd')">
<template slot="right" v-if="permissonList.includes('vehicleAddBtn') || supplierId">
<div class="rightWrap" @click="goPage('vehicleAdd', supplierId ? { supplierId, potentialFlag } : {})">
<img src="@/assets/addImg.png" />
<span class="addTxt">添加</span>
</div>
@@ -71,6 +71,7 @@
<div class="wrap_cls">
<van-pull-refresh v-model="isLoading" @refresh="onRefresh">
<van-list
v-if="initialized"
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@@ -114,6 +115,9 @@
</div>
<van-dialog v-model="show" title="确定删除吗" show-cancel-button @confirm="handleConfirm"></van-dialog>
<div class="btn_wrap" v-if="supplierId">
<div class="btn" @click="nextToDriver">下一步</div>
</div>
</div>
</template>
@@ -121,7 +125,7 @@
<script>
import {Dialog} from "vant";
import { myMixins} from "@/utils/myMixins";
import {supplierVehicleList, deleteVehicle, userOperationPermissions, enableVehicle} from "@/api/mine"
import {supplierVehicleList, deleteVehicle, userOperationPermissions, enableVehicle, supplierSelectById} from "@/api/mine"
export default {
name: "vehicleManage",
mixins:[myMixins],
@@ -130,6 +134,9 @@ export default {
vehicleList:[],
show:false,
id:'',
supplierId: '',
routeId: '',
initialized: false,
pageNum:1,
pageSize:10,
total:'',
@@ -142,6 +149,7 @@ export default {
searchVal: '',
authStates: [],
liabilityInsuranceAuditList: [],
potentialFlag: '',
inputStatusListOptions: [{
name: '行驶证未录入',
value: 0
@@ -189,10 +197,31 @@ export default {
}],
}
},
mounted() {
this.getPermissions();
async mounted() {
const urlParams = new URLSearchParams(window.location.search);
const rawId = this.$route.query.id || urlParams.get('id');
this.potentialFlag = this.$route.query.potentialFlag || urlParams.get('potentialFlag') || '';
if (rawId) {
this.routeId = rawId;
await this.getSupplierById(Number(rawId));
} else {
this.initialized = true;
}
let _token = localStorage.getItem('token')
if( _token ) {
this.getPermissions();
}
},
methods:{
nextToDriver() {
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, potentialFlag: this.potentialFlag });
},
async getSupplierById(id) {
let res = await supplierSelectById({ id });
this.supplierId = res?.data?.supplierId || '';
this.initialized = true;
},
showTip(msg) {
Dialog.alert({
title: '未通过原因',
@@ -277,6 +306,7 @@ export default {
inputStatusList: this.inputStatusList,
authStates: this.authStates,
liabilityInsuranceAuditList: this.liabilityInsuranceAuditList,
supplierId: this.supplierId || undefined,
})
this.total=result.total
if(this.pageNum == 1){// 第一页直接赋值
@@ -585,5 +615,23 @@ export default {
justify-content: flex-start;
margin-left: 10px;
}
.btn_wrap {
width: 100%;
padding: 15px 0;
position: fixed;
bottom: 10px;
z-index: 10000;
.btn {
width: calc(100% - 80px);
margin-left: 40px;
height: 46px;
background: #0E76F4;
border-radius: 5px;
font-size: 15px;
color: #FFFFFF;
text-align: center;
line-height: 46px;
}
}
</style>

View File

@@ -96,6 +96,7 @@
<div class="item" v-if="queryType == 9 || queryType ==11 || queryType ==12 || queryType ==5">
<span class="leftTitle fontColor">工单照片:</span><span class="rightContent">
<span class="driverPoiBtn" @click="checkPhoto">查看照片</span>
<span class="driverPoiBtn" v-if="orderDetailInfo.beforeDispatchImages && orderDetailInfo.beforeDispatchImages.length > 0" @click="environmentPhoto">环境照片</span>
</span>
</div>
</div>
@@ -235,6 +236,12 @@ export default {
window.android.sendMessage("orderPhoto,"+this.userOrderId+","+this.orderCode+","+this.taskOrderId+","+isAllowImage);
}
},
environmentPhoto() {
this.$router.push({
path: '/environmentPhotos',
query: { userOrderId: this.userOrderId }
})
},
initMap() {
this.map = new AMap.Map('container',{
zoom:14,//级别(缩放比例 3-20 )

View File

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