17 Commits

Author SHA1 Message Date
2bb1885b37 story#7065,救援责任险相关需求-调度APP推广及系统配套功能 2025-08-22 14:41:21 +08:00
fcf088a6f6 story#7074,地图搜索位置改动为后台接口 2025-08-21 10:15:57 +08:00
60836e19da story#7074,地图搜索位置改动为后台接口 2025-08-21 09:05:47 +08:00
1abb7ac605 story#7074,地图搜索位置改动为后台接口 2025-08-20 17:53:07 +08:00
2c94eee160 story#7062,供应商培训和财务发票上传挂钩--曹智龙 2025-08-18 16:02:22 +08:00
4bbc53a9aa story#6982 车辆信息修改--强制更新视图 2025-08-18 14:38:03 +08:00
5c821e1fc0 story#6735 车辆信息修改--用轻型测试的反显问题,去除轻型 2025-08-14 14:32:02 +08:00
a84dd52eae story#6982 车辆信息修改--切换 2025-08-14 14:29:48 +08:00
4dc0e9b835 story#6982 车辆信息修改--自测 2025-08-14 14:07:01 +08:00
e18be51b77 story#6735 报警--数据撤回 2025-08-14 13:51:34 +08:00
c7cc6bfec4 story#6735 报警--ios联调测试 2025-08-14 13:48:48 +08:00
0d862caff1 story#6735 报警--兼容测试 2025-08-14 13:43:53 +08:00
cf60d22074 story#6735 报警--联调样式恢复数据 2025-08-14 13:39:54 +08:00
d99b0d126f story#6735 报警--联调宽度修改 2025-08-14 13:36:02 +08:00
0249e0863d story#6735 报警--联调修改 2025-08-14 13:31:55 +08:00
314ab0b729 story#6982,车辆信息梳理的需求-车辆类别选择限制 2025-08-07 15:31:42 +08:00
24b94ebc8c story#6962,二手拖车系统优化-底盘和上装的外部展示和搜索 2025-08-07 11:54:33 +08:00
13 changed files with 304 additions and 17 deletions

View File

@ -316,4 +316,20 @@ export function unifiedOCRWithCompress(data){
contentType:'application/json',
data
})
}
// 服务商是否培训
export function jumpPage(data){
return request({
url:'/supplierAppV2/dispatchApp/user/jumpPage',
method:'POST',
data
})
}
//
export function sendInsuranceEmail(){
return request({
url:'/supplierAppV2/dispatchApp/user/sendInsuranceEmail',
method:'POST',
})
}

View File

@ -102,4 +102,14 @@ export function auditCarInfoAgain(data){
contentType: 'application/json',
data
})
}
}
// 我的发布列表
export function getAddressForService(data){
return request({
url: '/base/gaodeMap/getPlaceByAddress',
method:'GET',
params: data,
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/assets/insured.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -17,5 +17,13 @@ const reportRouter = [
title: '道路救援',
}
},
{
path: '/insuredPage',
name: 'insuredPage',
component: () => import('@/views/liabilityInsurance/insuredPage'),
meta:{
title: '参保救援职业责任险',
}
},
]
export default reportRouter

View File

@ -1,3 +1,4 @@
import { getAddressForService } from "@/api/secondHandCar"
// 获取定位, 返回 经纬度
export function getLocal(mapContext) {
return new Promise((resolve, reject) => {
@ -46,7 +47,19 @@ export function getAddress(mapContext, lnglat) {
// 输入提示
export function searchFun(mapContext, cityCode, keyword) {
return new Promise((resolve) => {
mapContext.plugin('AMap.AutoComplete', function(){
getAddressForService({
city: '',
address: keyword
}).then((res) => {
if(res.code == 200) {
resolve(res?.data?.pois || [])
} else {
resolve([])
}
}).catch(() => {
resolve([])
})
/*mapContext.plugin('AMap.AutoComplete', function(){
var autoOptions = {
city: cityCode || '全国',
};
@ -61,7 +74,7 @@ export function searchFun(mapContext, cityCode, keyword) {
resolve([])
}
})
})
})*/
})
}

View File

@ -76,7 +76,7 @@
import { Decimal } from 'decimal.js';
import { Dialog } from "vant";
import { myMixins } from "@/utils/myMixins"
import { uploadInvoice, getBillingInfo, deleteInvoice, createBatch } from "@/api/mine"
import { uploadInvoice, getBillingInfo, deleteInvoice, createBatch, jumpPage} from "@/api/mine"
export default {
name: "uploadInvoice",
mixins:[ myMixins ],
@ -132,6 +132,10 @@
}
},
methods: {
async getJumpHandler() {
let res = await jumpPage();
return res
},
async initData() {
this.list = JSON.parse(localStorage.getItem('list'));
this.batchIds = [];
@ -230,7 +234,12 @@
}).catch(() => {
});
},
beforeRead (file) {
async beforeRead (file) {
let res = await this.getJumpHandler();
if(res?.data?.jump) {
this.$message.warning("您有没有完成的培训请在中道调度APP上完成培训再进行发票上传")
return false
}
const FileExt = file.name.replace(/.+\./, "");
if (['jpg', 'png', 'jpeg', 'pdf', 'ofd'].indexOf(FileExt.toLowerCase()) === -1) {
this.$toast('请上传后缀名为jpg、jpeg、png、pdf、ofd的文件')

View File

@ -308,7 +308,7 @@ export default {
}else{
this.supplierServiceList = this.oldSupplierServiceList
}
this.setDefault();
},
},
@ -321,6 +321,23 @@ export default {
}
},
methods:{
setDefault() {
if( this.vehicleLicenseInfo?.vehicleType?.includes('小型') || this.vehicleLicenseInfo?.vehicleType?.includes('微型') || this.vehicleLicenseInfo?.vehicleType?.includes('普通') || this.vehicleLicenseInfo?.vehicleType?.includes('摩托') ) {
this.vehicleTypes.map(item => {
if( item.value == 1 || item.value == 9 ) {
item.disabled = false;
} else {
item.disabled = true;
}
})
this.$forceUpdate();
} else {
this.vehicleTypes.map(item => {
item.disabled = false;
})
this.$forceUpdate();
}
},
getVehicleLicense(color) {
if( color == '蓝' ) {
this.vehicleLicense = 1
@ -402,6 +419,7 @@ export default {
this.vehicleLicenseInfo.registrationDate = frontInfo?.registerDate;
this.vehicleLicenseInfo.issueDate = frontInfo?.issueDate;
this.vehicleLicenseInfo.issueAuthority = frontInfo?.seal;
this.setDefault();
}
},
async vehicleBackOcrHandler() { // 行驶证副页 ocr 识别

View File

@ -0,0 +1,199 @@
<template>
<div class="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="goBack"
/>
</div>
<div class="contentWrap">
<div>
为降低日常救援工作中的不可预期的车损赔付带来的运营风险和资金压力减少由此衍生而来的可能投诉顺应行业服务标准不断增长的局势中道救援自有车辆已全部投保了救援职业责任险
</div>
<div>
通过日常的交流了解此险种对于服务商而言投保相对较难很多服务商在无投保渠道的情况下选择了对于我们救援场景保障能力稍弱不太匹配的货物险从而从形成了现在很多救援车无保障或者特殊场景货物险理赔难的局面
</div>
<div>
为此中道救援经过与保司沟通协调特为与中道救援合作紧密的服务商提供救援职业责任险参保渠道提升服务商服务能力降低运营风险实现共同进步
</div>
<div>救援职业责任险简介</div>
<div>1综合保额50万元可全方位覆盖我们日常的经营活动</div>
<div> 2保费支付可采用救援服务费抵扣的方式降低资金压力</div>
<div> 3详细保险条款保费和其他问题如需了解请与辖区区域经理联系</div>
<div> 其他意见建议如需交流请与18621558505曲仁杰联系</div>
<div> 如确认参保请点击下方参保按钮会有专人与贵司联系</div>
</div>
<div class="upload_btn_wrap">
<div class="btn_save" @click="showPoup = true">参保</div>
</div>
<div class="poupCommon" v-if="showPoup">
<div class="showPoupContainer">
<img class="insured" src="@/assets/insured-jianbian.png">
<img class="insure" src="@/assets/insured.png">
<div class="con">
<div class="title">请确认</div>
<div class="title">是否参保救援职业责任险</div>
<div class="btnWrap">
<div class="btn confirmBtn" @click="saveHandle">确认</div>
<div class="btn closeBtn" @click="showPoup = false">取消</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {myMixins} from "@/utils/myMixins"
import {sendInsuranceEmail} from "@/api/mine"
export default {
name: "insuredPage",
mixins: [myMixins],
data() {
return {
showPoup: false,
}
},
async mounted() {
},
methods: {
async saveHandle() {
await sendInsuranceEmail();
this.$toast('操作成功');
this.showPoup=false
setTimeout(()=>{
this.goBack()
},1500)
},
}
}
</script>
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.wrap {
@include wh(100%, 100%);
background-color: #F4F5F7;
overflow-y: auto;
position: relative;
}
.navBar {
height: 46px;
}
.contentWrap {
padding-top: 15px;
div {
padding: 0 18px;
line-height: 22px;
}
}
.upload_btn_wrap {
position: fixed;
width: 100%;
box-sizing: border-box;
bottom: 10px;
left: 0;
padding: 15px 30px;
display: flex;
color: #fff;
font-weight: bold;
font-size: 14px;
line-height: 40px;
div {
height: 40px;
line-height: 40px;
border-radius: 5px;
text-align: center;
flex: 1;
}
.btn_save {
background: #354D93;
margin-right: 4px;
}
}
.poupCommon {
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .7);
position: absolute;
top: 0;
left: 0;
.showPoupContainer {
width: 290px;
height: 242px;
background-color: #FFFFFF;
border-radius: 12px;
position: absolute;
z-index: 11;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
.con {
top: 80px !important;
display: flex;
flex-direction: column;
align-items: center;
margin-top: 60px;
}
.title {
font-weight: 500;
font-size: 16px;
color: #040404;
line-height: 28px;
}
.insure {
width: 78px;
height: 78px;
position: absolute;
z-index: 11;
top: -34px;
left: 50%;
transform: translateX(-50%);
}
.insured {
width: 100%;
position: absolute;
z-index: -1;
}
.btnWrap {
margin-top: 36px;
text-align: center;
.btn{
width: 174px;
height: 42px;
line-height: 42px;
border-radius: 23px;
}
.closeBtn {
font-weight: 400;
font-size: 14px;
color: #2C4155;
opacity: .6;
}
.confirmBtn {
font-weight: 500;
font-size: 15px;
background: #F1BA63;
color: #FFFFFF;
}
}
}
}
</style>

View File

@ -90,7 +90,7 @@
}
let activeObj = this.addressList[this.activeIndex];
let _tempObj = {
startPoiAddress: activeObj?.district + activeObj?.address + activeObj?.name,
startPoiAddress: activeObj?.address + activeObj?.name,
startLat: activeObj?.location?.lat,
startLng: activeObj?.location?.lng,
adCode: activeObj?.adcode,

View File

@ -16,7 +16,6 @@
:preview-src-list="[item]"
class="swipeImg"
/>
<!-- <img v-if="item" class="swipeImg" :src="item" />-->
</el-carousel-item>
</el-carousel>
<van-swipe v-else @change="onChange" :autoplay="3000">
@ -34,8 +33,9 @@
<span>{{ detailInfo.boardType?.label }}</span>
<span>{{ detailInfo.licenseType?.label }}</span>
<span>{{detailInfo.brandModel?.match(/^[\u4e00-\u9fa5]+/)?.[0]?.replace(/牌$/, '')}}</span>
<span>{{ formatToWan(detailInfo.mileage) }}公里</span>
<span>{{ detailInfo.emissionStandard?.label }}</span>
<span>{{ detailInfo.underpanBrand }}</span>
<span>{{ formatToWan(detailInfo.mileage) }}公里</span>
</div>
<div class="time">
<span>{{ detailInfo.createTime?.substring(0,10) }}</span><span>{{ detailInfo.areaName }}</span><span>发布</span>

View File

@ -119,7 +119,7 @@
<div class="right">
<div class="title">{{item.vehicleType}}</div>
<div v-if="activeTab==0" class="type">{{ item.boardType?.label ? item.boardType?.label+' | ' : ''}} {{ item.licenseType?.label }} |
{{ item.brandModel?.match(/^[\u4e00-\u9fa5]+/)?.[0]?.replace(/$/, '') }} | {{item.emissionStandard?.label}} | {{ formatToWan(item.mileage) }}公里</div>
{{ item.brandModel?.match(/^[\u4e00-\u9fa5]+/)?.[0]?.replace(/$/, '') }} | {{item.emissionStandard?.label}} | {{item.underpanBrand}} | {{ formatToWan(item.mileage) }}公里</div>
<div v-else class="type">{{ item.boardType?.label ? item.boardType?.label+' | ' : ''}} {{item.emissionStandard?.label}}</div>
<div class="date" v-show="activeTab==0 && item.registerDate">注册日期 {{item.registerDate?.substring(0,10)}}</div>
<div class="priceWrap" v-if="activeTab==0" >
@ -354,6 +354,8 @@ export default {
sessionStorage.setItem('areaCode',String(this.areaCode));
sessionStorage.setItem('areaName',this.areaName);
sessionStorage.setItem('dateVal',this.dateVal);
sessionStorage.setItem('brandModel',this.brandModel);
sessionStorage.setItem('underpanBrand',this.underpanBrand);
},
getSearchVal(){
this.activeTab = Number(sessionStorage.getItem('indexActiveTab')) || 0;
@ -367,6 +369,8 @@ export default {
this.areaCode=Number(sessionStorage.getItem('areaCode')) || '';
this.areaName=sessionStorage.getItem('areaName') || '';
this.dateVal=sessionStorage.getItem('dateVal') || '';
this.brandModel=sessionStorage.getItem('brandModel') || '';
this.underpanBrand=sessionStorage.getItem('underpanBrand') || '';
},
goMine(){//我的发布
this.$router.push({ name: "mineRelease"})
@ -428,6 +432,8 @@ export default {
areaCode:this.areaCode,
startTime:this.startTime,
endTime:this.endTime,
brandModel:this.brandModel,
underpanBrand:this.underpanBrand,
})
this.total=res.total
if(this.pageNum == 1){// 第一页直接赋值
@ -686,9 +692,9 @@ export default {
color: #282828;
line-height: 23px;
width: 200px;
white-space: nowrap; /* 强制文本在一行显示 */
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
/* white-space: nowrap; !* 强制文本在一行显示 *!
overflow: hidden; !* 隐藏超出部分 *!
text-overflow: ellipsis; !* 超出部分显示省略号 *!*/
}
.date{
font-weight: 400;

View File

@ -25,12 +25,12 @@
<div class="label">{{item.startTime}}</div>
</div>
<div class="alarm_content">
<div class="label">车辆名称:</div>
<div class="content">{{item.vehicleName}}</div>
<div class="label flexLabel">车辆名称:</div>
<div class="content flexContent">{{item.vehicleName}}</div>
</div>
<div class="alarm_content">
<div class="label">报警详情:</div>
<div class="content">{{item.alarmRemark}}</div>
<div class="label flexLabel">报警详情:</div>
<div class="content flexContent">{{item.alarmRemark}}</div>
</div>
</div>
</div>
@ -200,6 +200,14 @@
.label {
color: rgba(0, 0, 0, 0.5);
}
.flexLabel {
min-width: 50px;
flex-shrink: 0;
}
.flexContent {
flex: 1;
word-break: break-all;
}
.title_left {
display: flex;
align-items: center;