司机管理模块,开票通知模块

This commit is contained in:
2023-08-18 14:52:29 +08:00
parent 1a119820dd
commit 90e3353058
17 changed files with 701 additions and 232 deletions

View File

@ -60,4 +60,67 @@ export function saveDriver(data){
contentType:'application/json',
data
})
}
//司机停启用操作
export function enableAction(data){
return request({
url:'/supplierAppV2/dispatchApp/user/enableAction',
method:'POST',
contentType:'application/json',
data
})
}
//工单对账列表
export function accountRecordList(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/accountRecordList',
method:'POST',
contentType:'application/json',
data
})
}
//工单对账详情
export function getAccountRecordDetail(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/getAccountRecordDetail',
method:'POST',
contentType:'application/json',
data
})
}
//工单对账计算金额(记账)
export function accountRecordCompute(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/accountRecordCompute',
method:'POST',
contentType:'application/json',
data
})
}
//修改服务商记账信息 (重新记账)
export function updateAccountRecordInfo(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/updateAccountRecordInfo',
method:'POST',
contentType:'application/json',
data
})
}
//开票通知列表
export function notifyInvoiceList(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/notifyInvoiceList',
method:'POST',
contentType:'application/json',
data
})
}
//开票通知详情
export function notifyInvoiceDetail(data){
return request({
url:'/supplierAppV2/dispatchApp/accountRecord/notifyInvoiceDetail',
method:'POST',
contentType:'application/json',
data
})
}

BIN
src/assets/arrow_bottom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

BIN
src/assets/line.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

View File

@ -6,6 +6,7 @@
:placeholder="placeholder"
required
@input="$emit('input', $event)"
@blur="$emit('blurIn')"
input-align="right"
/>
</van-cell-group>

View File

@ -108,7 +108,7 @@ const routes = [
name: 'driverAdd',
component:()=>import('@/views/index/driverAdd'),
meta: {
name:'司机新增或修改'
title:'司机新增或修改'
}
}
]

View File

@ -1,59 +0,0 @@
import { formatDate, formatNumber } from '@/utils/common'
// 拼接 预约时间 picker
export function getAppointFun (time) {
let arr = []
// 当天剩余时间段
let obj = getCurrentDatePicker(time)
arr.push(obj)
// 后六天的可选时间段
let tempArr = getAfterTimeList()
arr.push(...tempArr)
return arr
}
// 拼接 当天剩余的可预约时间段(默认第一个是两小时之后可选)
const getCurrentDatePicker = time => {
let obj = {}
obj.text = formatDate(time);
let timeArr = getCurrentTimeList()
obj.children = timeArr
return obj
}
// 当天日期的时间段
const getCurrentTimeList = () => {
let todayDate = new Date()
let tempArr = []
tempArr.push({ text: '尽快到' }); // 首先添加尽快到
if( todayDate.getMinutes() <= 30 && todayDate.getMinutes() > 0 ) {
let tempVal = todayDate.getHours() + 2;
let tempHalfHours = formatNumber(tempVal) + ':30';
tempArr.push({ text: tempHalfHours });
}
let startFlag = (todayDate.getMinutes() == 0) ? (todayDate.getHours() + 2) : (todayDate.getHours() + 3)
tempArr = getDateTimeList(startFlag, tempArr)
return tempArr
}
// 获取后六天的 预约时间 picker
const getAfterTimeList = () => {
let afterArr = []
for(let i = 1; i < 7; i++ ) {
let obj = {};
let tempTime = formatDate(new Date().getTime() + (i * 24* 60 * 60 * 1000))
obj.text = tempTime
let timeArr = []
obj.children = getDateTimeList(0, timeArr)
afterArr.push(obj)
}
return afterArr
}
// 获取某个时间段后的所有可选时段
const getDateTimeList = (startHours = 0, list) => {
for(let i = startHours; i < 24; i++ ) {
list.push({ text: formatNumber(i) + ':' + '00' })
list.push({ text: formatNumber(i) + ':' + '30' })
}
return list
}

View File

@ -22,9 +22,23 @@ const leftCopy = (obj, source) => {
}
}
const timeFormat=(data) =>{
const currentDate = new Date(data);
const year = currentDate.getFullYear();
const month = String(currentDate.getMonth() + 1).padStart(2, '0');
const day = String(currentDate.getDate()).padStart(2, '0');
const hours = String(currentDate.getHours()).padStart(2, '0');
const minutes = String(currentDate.getMinutes()).padStart(2, '0');
const seconds = String(currentDate.getSeconds()).padStart(2, '0');
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
// console.log("formattedDate",formattedDate)
return formattedDate;
}
module.exports = {
formatNumber,
formatDate,
leftCopy,
timeFormat
}

View File

@ -16,7 +16,7 @@ service.interceptors.request.use(
config.headers['Content-Type'] = config.contentType || 'application/x-www-form-urlencoded'
// const urlParams = new URLSearchParams(window.location.search);
// const token = urlParams.get('token');
let token='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJzemwiLCJhdWQiOlsic3VwcGxpZXItYXBwIl0sIm5iZiI6MTY5MjE2ODQ3OCwidXNlcl9pbmZvIjp7InVzZXJJZCI6NTQ1ODUsInBob25lIjoiMTc2MzAwMzU2NTgiLCJuYW1lIjoi5bCP5a6LIiwic3VwcGxpZXJOYW1lIjoi5LiK5rW35a6J55WFQSIsInN1cHBsaWVySWQiOjExMjgsInN1cHBsaWVyVHlwZSI6MSwidXNlcm5hbWUiOiJzemwiLCJ1c2VyVHlwZSI6IkFQUCIsImF1dGhvcml0aWVzIjpbXX0sInNjb3BlIjpbImFsbCJdLCJpc3MiOiJodHRwczovL3Npbm9hc3Npc3QuY29tIiwiZXhwIjoxNjkyMjU0ODc4LCJpYXQiOjE2OTIxNjg0Nzh9.yVreEsJqwcEy6jALrhqQ9tasuBKqEE-y3fq_TXfaspE'
let token='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJzemwiLCJhdWQiOlsic3VwcGxpZXItYXBwIl0sIm5iZiI6MTY5MjI2MzgzOSwidXNlcl9pbmZvIjp7InVzZXJJZCI6NTQ1ODUsInBob25lIjoiMTc2MzAwMzU2NTgiLCJuYW1lIjoi5bCP5a6LIiwic3VwcGxpZXJOYW1lIjoi5LiK5rW35a6J55WFQSIsInN1cHBsaWVySWQiOjExMjgsInN1cHBsaWVyVHlwZSI6MSwidXNlcm5hbWUiOiJzemwiLCJ1c2VyVHlwZSI6IkFQUCIsImF1dGhvcml0aWVzIjpbXX0sInNjb3BlIjpbImFsbCJdLCJpc3MiOiJodHRwczovL3Npbm9hc3Npc3QuY29tIiwiZXhwIjoxNjkyMzUwMjM5LCJpYXQiOjE2OTIyNjM4Mzl9.Mldu7SmfjNEdH-bItFCLVL-zo-IopHWTc8LkTXOtC58'
config.headers['Authorization'] = `${token}`;
return config
},

View File

@ -1,47 +1,33 @@
<template>
<div class="wrap">
<cell-group label="司机姓名" placeholder="请输入司机姓名" @input="getName(name)" v-model="name"/>
<cell-group label="手机号码" placeholder="请输入手机号" @input="getPhone(phone)" v-model="phone"/>
<cell-group label="身份证号" placeholder="请输入身份证号" @input="getCarId(carId)" v-model="carId"/>
<!-- <div class="itemContent">-->
<!-- <div class="titleType">-->
<!-- <img class="startImg" src="@/assets/start.png" />-->
<!-- <span>司机姓名</span>-->
<!-- </div>-->
<!-- <div class="checkContent">-->
<!-- <input placeholder="请输入司机姓名" />-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="lineBot"></div>-->
<!-- <div class="itemContent">-->
<!-- <div class="titleType">-->
<!-- <img class="startImg" src="@/assets/start.png" />-->
<!-- <span>手机号码</span>-->
<!-- </div>-->
<!-- <div class="checkContent">-->
<!-- <input placeholder="请输入手机号码" />-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="lineBot"></div>-->
<!-- <div class="itemContent">-->
<!-- <div class="titleType">-->
<!-- <img class="startImg" src="@/assets/start.png" />-->
<!-- <span>身份证号</span>-->
<!-- </div>-->
<!-- <div class="checkContent">-->
<!-- <input placeholder="请输入身份证号" />-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="lineBot"></div>-->
<div class="navBar">
<van-nav-bar
:title="id ? '修改司机信息' : '添加司机'"
left-arrow
left-arrow-color="#FFFFFF"
:border="false"
:fixed="true"
:safe-area-inset-top="true"
@click-left="h5GoBack"
/>
</div>
<cell-group label="司机姓名" placeholder="请输入司机姓名" v-model="driverName"/>
<cell-group label="手机号码" v-model="driverPhone" @blurIn="validatePhoneNumber" placeholder="请输入手机号" />
<p v-if="phoneNumberError" class="error-message">{{ phoneNumberErrorMessage }}</p>
<cell-group label="身份证号" v-model="identityCardNumber" placeholder="请输入身份证号" />
<div class="itemContent">
<div class="titleType">
<img class="startImg" src="@/assets/start.png" />
<span>准驾车型</span>
</div>
<select id="mySelect" class="chosen-select" style="width: 44px">
<select id="mySelect" v-model="drivingModel" class="chosen-select" style="width: 44px">
<option value="A1">A1</option>
<option value="A2">A2</option>
<option value="A3">A3</option>
<option value="B1">B1</option>
<option value="B2">B2</option>
<option value="C1">C1</option>
<option value="C2">C2</option>
<option value="C3">C3</option>
</select>
</div>
<div class="lineBot"></div>
@ -51,8 +37,8 @@
<span>司机状态</span>
</div>
<div class="isJoin">
<van-radio-group v-model="radio" @change="isUse" class="joinWrap">
<van-radio name="启用" style="margin-right: 26px" class="item">
<van-radio-group v-model="states" @change="isUse" class="joinWrap">
<van-radio :name="1" style="margin-right: 26px" class="item">
启用
<img
slot="icon"
@ -60,7 +46,7 @@
:src="props.checked ? activeIcon : inactiveIcon"
>
</van-radio>
<van-radio name="停用" class="item">
<van-radio :name="0" class="item">
停用
<img
slot="icon"
@ -77,46 +63,86 @@
</template>
<script>
import {myMixins} from "@/utils/myMixins"
import {timeFormat} from "@/utils/common"
import {saveDriver} from "@/api/mine"
import TwoCommonBtn from "@/components/twoBtnCommon.vue"
import CellGroup from "@/components/cellGroup.vue"
export default {
name: "driverAdd",
mixins:[myMixins],
data(){
return{
name:"",
phone:"",
carId:"",
radio:'启用',
id:'',
driverName:"",
driverPhone:"",
identityCardNumber:"",
drivingModel:'',
states:'',
activeIcon: require('@/assets/check.png'),
inactiveIcon: require('@/assets/uncheck.png')
inactiveIcon: require('@/assets/uncheck.png'),
phoneNumberError: false,
phoneNumberErrorMessage: ''
}
},
mounted() {
console.log("radio",this.radio)
this.id = this.$route.params?.id;
this.driverName = this.$route.params?.name;
this.driverPhone = this.$route.params?.phone;
this.drivingModel = this.$route.params?.drivingModel;
this.identityCardNumber = this.$route.params?.identityCardNumber;
this.states = this.$route.params?.states;
const selectElement = document.getElementById('mySelect');
selectElement.addEventListener('change', function() {
const selectedValue = selectElement.value;
console.log('Selected value:', selectedValue);
this.drivingModel=selectedValue
});
},
methods:{
isUse(e){
console.log("是否启用",e)
this.states=e
},
cancelBtn(){
console.log("取消司机")
async submitBtn(){
let res = await saveDriver({
driverId:this.id ? this.id : '',
driverName:this.driverName ,
driverPhone:this.driverPhone,
identityCardNumber:this.identityCardNumber,
drivingModel:this.drivingModel,
states:Number(this.states),
createTime:timeFormat(new Date())
})
if(res.code === 200){
if(this.id){
this.$toast('修改成功')
}else{
this.$toast('添加成功')
}
setTimeout(()=>{
this.$router.back();
},2000)
}
},
submitBtn(){
console.log("提交司机")
cancelBtn(){//取消
this.driverName='';
this.driverPhone='',
this.identityCardNumber='',
this.drivingModel=''
this.states=''
},
getName(e){
console.log("NAME",e);
},
getPhone(e){
console.log("phone",e);
},
getCarId(e){
console.log("car",e);
validatePhoneNumber() {
const phoneNumberRegex = /^1[0-9]{10}$/;
if (phoneNumberRegex.test(this.driverPhone)) {
this.phoneNumberError = true;
this.phoneNumberErrorMessage = '电话号码格式不正确请输入有效的11位手机号码。';
} else {
this.phoneNumberError = false;
this.phoneNumberErrorMessage = '';
}
}
},
components:{
@ -129,12 +155,19 @@ export default {
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.error-message {
color: red;
}
.wrap{
@include wh(100%,100%);
box-sizing: border-box;
padding-left: 16px;
}
.navBar{
//height: 46px;
margin-bottom: 46px;
}
.itemContent{
@include flexColBet;
line-height: 56px;

View File

@ -8,68 +8,41 @@
:border="false"
:fixed="true"
:safe-area-inset-top="true"
@click-left="goPage"
@click-left="goBack"
>
<template slot="right">
<div class="rightWrap" @click="addDriver">
<div class="rightWrap" @click="goPage('driverAdd')">
<img src="@/assets/addImg.png" />
<span class="addTxt">添加</span>
</div>
</template>
</van-nav-bar>
</div>
<div class="itemWrap">
<div class="itemWrap" v-for="(item,index) in driverList" :key="index">
<div class="name-status">
<div class="namephone">王小微 / 15234345656</div>
<div class="namephone">{{ item.driverName }} / {{ item.driverPhone }}</div>
<div class="twoBtn">
<button class="del">启用</button>
<button class="revise">修改</button>
<button class="del" @click="handleStatus(item)">{{ item.states?.label == '启用' ? '停用' : '启用' }}</button>
<button class="revise" @click="updateDriver(item)">修改</button>
</div>
</div>
<div class="" style="display: flex">
<div class="sex" style="margin-right: 40px">
<span class="halfOpci">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span>
<span class="allOpci"></span>
<span class="allOpci">{{item.sex?.label}}</span>
</div>
<div class="carType">
<span class="halfOpci">准驾车型:</span>
<span class="allOpci">C2</span>
<span class="allOpci">{{item.drivingModel}}</span>
</div>
</div>
<div>
<span class="halfOpci">身份证号:</span>
<span class="allOpci">4115241999083449090</span>
</div>
<div class="">
<span class="halfOpci">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span>
<span class="statusNo">停用</span>
</div>
</div>
<div class="itemWrap">
<div class="name-status">
<div class="namephone">王小微 / 15234345656</div>
<div class="twoBtn">
<button class="del">停用</button>
<button class="revise" @click="goPage('driverAdd')">修改</button>
</div>
</div>
<div class="" style="display: flex">
<div class="sex" style="margin-right: 40px">
<span class="halfOpci">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span>
<span class="allOpci"></span>
</div>
<div class="carType">
<span class="halfOpci">准驾车型:</span>
<span class="allOpci">C2</span>
</div>
</div>
<div>
<span class="halfOpci">身份证号:</span>
<span class="allOpci">4115241999083449090</span>
<span class="allOpci">{{ item.identityCardNumber }}</span>
</div>
<div>
<span class="halfOpci">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span>
<span class="statusYes">启用</span>
<span :class="item.states?.code == 1 ? 'statusYes' : 'statusNo'">{{ item.states?.label }}</span>
</div>
</div>
@ -79,10 +52,64 @@
<script>
import {myMixins} from "@/utils/myMixins"
import {driverList,enableAction} from "@/api/mine"
export default {
name: "driverManage",
mixins:[myMixins],
data(){
return{
pageNum:1,
pageSize:10,
total:'',
driverList:[],
states:''
}
},
mounted() {
this.getDriverList()
},
methods:{
async getDriverList(){
let res = await driverList({
pageNum:this.pageNum,
pageSize:this.pageSize
});
if(res.code == 200){
this.total=res.total
this.driverList=res.data
}
},
async handleStatus(item){
if(item.states.code === 0){
this.states = 1
}else{
this.states = 0
}
let res = await enableAction({
driverId:item.driverId,
states:this.states
})
await this.getDriverList();
setTimeout(()=>{
this.$toast('操作成功')
},)
console.log("item",res)
},
updateDriver(item){
// 在当前组件中进行路由跳转并传递参数对象
this.$router.push({
name: 'driverAdd', // 目标路由的名称
params: {
id: item.driverId, // 参数对象的属性
name: item.driverName,
phone:item.driverPhone,
drivingModel:item.drivingModel,
identityCardNumber:item.identityCardNumber,
states:item.states.code
}
});
}
}
}
</script>
@ -95,6 +122,7 @@ export default {
box-sizing: border-box;
padding: 13px;
@include wh(100%, 100%);
overflow-y: auto;
}
.navBar{
//height: 46px;

View File

@ -12,8 +12,12 @@
/>
</div>
<div class="contentWrap">
<div class="item" v-for="(item,index) in 4" :key="index">
<div class="itemContent">ZDZD230630253236 拖车 128</div>
<div class="item" v-for="(item,index) in detailList" :key="index">
<div class="itemContent">
<span> {{ item.orderCode }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span>{{ item.serviceName }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span> {{item.settleAmount}}</span>
</div>
<div class="line"></div>
</div>
</div>
@ -22,11 +26,41 @@
<script>
import {myMixins} from "@/utils/myMixins"
import {notifyInvoiceDetail} from "@/api/mine"
export default {
name: "invoicingDetail",
mixins:[myMixins],
data(){
return{
pageNum:1,
pageSize:10,
detailList:[],
form:{
batchCode:'',
startTime:'',
overTime:'',
}
}
},
async mounted() {
console.log(this.$route.query?.id)
this.form.batchCode=this.$route.query?.id;
this.form.startTime=this.$route.query?.startTime;
this.form.overTime=this.$route.query?.overTime;
await this.getDetail()
},
methods:{
async getDetail(){
let res=await notifyInvoiceDetail({
pageNum:this.pageNum,
pageSize:this.pageSize,
...this.form,
})
if(res.code=== 200){
this.detailList=res.data
}
// console.log("resssss",res)
}
}
}
</script>

View File

@ -2,7 +2,7 @@
<div class="wrap">
<div class="navBar">
<van-nav-bar
title="工单对账"
title="开票通知"
left-arrow
left-arrow-color="#FFFFFF"
:border="false"
@ -11,52 +11,77 @@
@click-left="goBack"
/>
</div>
<div class="itemWrap" v-for="(item,index) in 3" :key="index">
<div class="itemWrap" v-for="(item,index) in notifyList" :key="index" >
<div class="item line1">
<div class="itemTime">
<span class="title">开票月份:</span>
<span class="content">2023年7月</span>
<span class="content">{{ item.invoiceMonth }}</span>
</div>
<div class="orderNum">
<span class="title">总案件数:</span>
<span class="content">86</span>
</div>
<div class="checkBtn" @click="goPage('invoicingDetail')">查看
<span class="content">{{ item.orderNum }}</span>
</div>
<div class="checkBtn" @click="goPage('invoicingDetail',{id:item.batchCode,startTime:item.startTime,overTime:item.overTime})">查看 </div>
</div>
<div class="item">
<span class="title">批次号:</span>
<span class="content">PC230626124283</span>
<span class="content">{{ item.batchCode }}</span>
</div>
<div class="item">
<span class="title">结算总金额:</span>
<span class="content">1238</span>
<span class="content">{{ item.totalMoney }}</span>
</div>
<div class="item">
<span class="title">扣款金额:</span>
<span class="content">2300</span>
<span class="content">{{ item.cutMoney }}</span>
</div>
<div class="item">
<span class="title">扣款原因:</span>
<span class="content" style="color: #FF8F37;">调度不及时导致客户等待时间过长</span>
<span class="content" style="color: #FF8F37;">{{ item.remark }}</span>
</div>
<div class="item">
<span class="title">最终开票金额:</span>
<span class="content">1008</span>
<span class="content">{{ item.invoiceMoney }}</span>
</div>
</div>
<div v-show="show" class="bgShow">
<img src="@/assets/empty.png">
</div>
</div>
</template>
<script>
import {myMixins} from "@/utils/myMixins"
import {notifyInvoiceList} from "@/api/mine"
export default {
name: "invoicingNotify",
mixins:[myMixins],
data(){
return{
notifyList:[],
pageNum:1,
pageSize:10,
show:false
}
},
mounted() {
this.getNotifyList()
},
methods:{
checkDetail(index){
console.log("查看详情"+index)
async getNotifyList(){
let res = await notifyInvoiceList({
pageNum:this.pageNum,
pageSize:this.pageSize
})
if(res.code === 0){
this.notifyList=res.data;
console.log(this.notifyList)
if(this.notifyList.length === 0){
this.show=true
}else{
this.show=false
}
}
},
}
}
@ -72,8 +97,8 @@ export default {
}
.navBar{
height: 46px;
//margin-bottom: 46px;
//height: 46px;
margin-bottom: 46px;
}
.itemWrap{
background: #FFFFFF;
@ -107,5 +132,9 @@ export default {
}
}
}
.bgShow{
@include wh(100%,80%);
@include flexCenter;
justify-content: center;
}
</style>

View File

@ -188,15 +188,15 @@ export default {
},
change(e) {
console.log("拖车服务",e)
// console.log("拖车服务",e)
this.trailerService=e
},
change2(e) {
console.log("小修服务",e)
// console.log("小修服务",e)
this.smallRepairService=e
},
isChange(e){
console.log("是否参与",e)
// console.log("是否参与",e)
this.isJoin=e
},
cancelBtn(){//取消车辆

View File

@ -1,5 +1,5 @@
<template>
<div class="wrap" >
<div class="wrap" @scroll="handleScroll">
<div class="navBar">
<van-nav-bar
title="车辆管理"
@ -33,7 +33,9 @@
</div>
</div>
<van-dialog v-model="show" title="确定删除吗" show-cancel-button @confirm="handleConfirm"></van-dialog>
<div v-if="loading">加载中...</div>
</div>
</template>
<script>
@ -50,6 +52,8 @@ export default {
pageNum:1,
pageSize:10,
total:'',
loading:false,
items: [], // 当前页数
}
},
mounted() {
@ -62,18 +66,21 @@ export default {
pageSize:this.pageSize
})
if(result.code === 200){
this.vehicleList=result.data;
this.total=result.total
//
if(this.pageNum == 1){// 第一页直接赋值
this.vehicleList=result.data;
}else{// 第二页数据拼接
let preList = this.vehicleList;
let arr = result.data;
this.vehicleList = preList.concat(arr)
}
}
},
deleteItem(id){//删除车辆
this.show=true
this.id=id
},
addVehicle(){//添加车辆
console.log("添加")
},
async handleConfirm(){//调删除车辆接口
let result= await deleteVehicle({
vehicleId:this.id
@ -81,16 +88,22 @@ export default {
if(result.code === 200){
this.$toast('删除成功');
await this.getVehicleList();
}else{
this.$toast(result.msg)
}
},
async handleScroll(){
this.pageNum += 1;
let res= await this.getVehicleList();
let newData=res.data
this.vehicleList=[...this.vehicleList,...newData]
// console.log("滑动")
let num = Math.ceil( this.total / 10)
if(num <= this.pageNum){
console.log("不在加载数据")
}else{
this.pageNum++;
await this.getVehicleList()
console.log("111111111111")
}
},
console.log("滑动")
}
}
}
</script>

View File

@ -23,8 +23,8 @@
<div class="rightItem">{{ orderDetailInfo.userName }}</div>
<div class="rightItem">{{ orderDetailInfo.userPhone }}</div>
<div class="rightItem">{{ orderDetailInfo.plateNumber }}</div>
<div class="rightItem" style="line-height: 17px">
<span >{{orderDetailInfo.model}}</span>
<div class="rightItem" style="line-height: 17px;width: 220px;align-items: baseline">
<span >{{orderDetailInfo.model}} </span>
<span>{{ orderDetailInfo.brand }}</span>
</div>
</div>

View File

@ -1,44 +1,55 @@
<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="h5GoBack"
/>
</div>
<div class="baseInfo common">
<div class="title">基本信息:</div>
<div class="line"></div>
<div class="item">
<span class="title">工单编号</span>
<span class="content" id="copyText">ZD230626124283</span>
<span class="titleLeft">工单编号</span>
<span class="content" id="copyText">{{ orderInfo.orderCode }}</span>
<img @click="copyText" src="@/assets/copy.png" />
</div>
<div class="item">
<span class="title">车牌号&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="content">湘H-DD899</span>
<span class="titleLeft">车牌号&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="content">{{orderInfo.plateNumber}}</span>
</div>
<div class="item">
<span class="title">服务类型</span>
<span class="content" >搭电</span>
<span class="titleLeft">服务类型</span>
<span class="content" >{{ orderInfo.serviceName }}</span>
</div>
<div class="item">
<span class="title">工单状态</span>
<span class="content" >未完成</span>
<span class="titleLeft">工单状态</span>
<span class="content" >{{ orderInfo.taskSuccessStatus?.label }}</span>
</div>
<div class="item">
<span class="title">结算比例</span>
<span class="content" >按服务不成功结算</span>
<span class="titleLeft">结算比例</span>
<span class="content" >{{ orderInfo.supplierSettleRatio?.label }}</span>
</div>
<div class="item">
<span class="title">结算类型</span>
<span class="content" >系统一口价</span>
<span class="titleLeft">结算类型</span>
<span class="content" >{{ orderInfo.settleType?.label }}</span>
</div>
<div class="item" >
<span class="title">结算方式</span>
<span class="titleLeft">结算方式</span>
<div class="content" style="width: calc(100% - 84px);display: flex;justify-content: space-between;line-height: 27px" >
<span>起步价:135</span>
<span>包含公里数:15</span>
<span>超出单价:6</span>
<span>{{orderInfo.taskSettleType?.label}}</span>
<!-- <span>包含公里数:15</span>-->
<!-- <span>超出单价:6</span>-->
</div>
</div>
<div class="item">
<span class="title">扣除责任险费</span>
<span class="content">0</span>
<span class="titleLeft">扣除责任险费</span>
<span class="content">{{orderInfo.policyAmount}} {{orderInfo.cutInsuranceAmount}}</span>
</div>
</div>
@ -55,10 +66,10 @@
<div>备注说明:</div>
</div>
<div class="inputContent">
<div class="halfOpcity"><input type="number"/>公里</div>
<div class="halfOpcity"><input type="number"/></div>
<div class="halfOpcity"><input type="number"/></div>
<div class="halfOpcity"><input type="number" />公里</div>
<div class="halfOpcity"><input type="number"/></div>
<div class="halfOpcity"><input type="number" v-model="form.supplierTyreAmount"/></div>
<div class="halfOpcity"><input type="number" v-model="form.supplierCustomerAmount"/></div>
<div class="btnComputed">计算</div>
</div>
</div>
@ -70,11 +81,44 @@
<script>
import {myMixins} from '@/utils/myMixins'
import {getAccountRecordDetail} from "@/api/mine"
import TwoCommonBtn from "@/components/twoBtnCommon.vue"
import order from "../../store/modules/order";
export default {
name: "accountingView",
computed: {
order() {
return order
}
},
mixins:[myMixins],
data(){
return{
id:'',
postfix:'',
orderInfo:{},
form:{
supplierCustomerAmount:'',
supplierTyreAmount:'',
}
}
},
async mounted() {
this.id=this.$route.params?.id;
this.postfix=this.$route.params?.postfix;
await this.getDetail()
},
methods:{
async getDetail(){
let res= await getAccountRecordDetail({
id:this.id,
postfix:this.postfix
})
if(res.code === 200){
this.orderInfo=res.data
}
// console.log("res",res)
},
cancelBtn(){
console.log("取消")
},
@ -90,11 +134,15 @@ export default {
<style scoped lang="scss">
@import "@/styles/mixin.scss";
@import "@/styles/common.scss";
.wrap{
width: 100%;
height: 100%;
background-color: #F4F5F7;
}
.navBar{
margin-bottom: 46px;
}
.title{
@include fontWeightSize(bold,14px);
color: #323643;
@ -110,8 +158,10 @@ export default {
.item{
display: flex;
align-items: center;
@include fontWeightSize(400,12px);
.title{
font-size: 12px !important;
font-weight: 400 !important;
//@include fontWeightSize(400,12px) !important;
.titleLeft{
opacity: .5;
line-height: 27px;
}
@ -128,6 +178,7 @@ img{
}
.baseInfo{
@include wh(100%,276px);
}
.supplierData{
@include wh(100%,438px);

View File

@ -1,24 +1,152 @@
<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="goPage"
<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"
>
<template slot="right">
<div class="rightWrap">
<span class="dateTitle">{{ ymTime }}</span>
<img src="@/assets/line.png" class="img1"/>
<img src="@/assets/arrow_bottom.png" class="img2" @click="showDatetime = !showDatetime"/>
</div>
</template>
</van-nav-bar>
</div>
<van-datetime-picker
class="dataTime"
v-if="showDatetime"
v-model="currentDate"
type="year-month"
title="查询时间"
@confirm="onConfirm"
@cancel="showDatetime == false"
/>
</div>
</div>
<div class="tab_wrap">
<div v-for="(item, index) in tabArr" :key="index" :class="{'active' : activeIndex == index}"
@click="changeTab(index)">
{{ item.name }}
</div>
</div>
<div >
<div class="content_wrap" v-for="(item,index) in orderList" :key="index">
<div class="codeTxt common">
<div class="leftStatus ">
<span style="margin-right: 20px" class="orderCode">{{item.orderCode}}</span>
<span class="carCode">{{ item.plateNumber }}</span>
</div>
<div class="rightBtn">
<span class="serviceStatus">{{ item.taskStatus?.label }}</span>
</div>
</div>
<div class="line"></div>
<div class="supplier">
<span class="halfTxt">服务商:</span>
<span class="allTxt">{{ item.supplierName }}</span>
</div>
<div class="status common">
<div class="leftStatus" >
<span class="halfTxt">审核状态:</span>
<span class="allTxt">{{ item.accountStatus?.label }}</span>
</div>
<div class="rightBtn">
<button class="btn" v-if="queryType == 1" @click="handleAccounting(item)">记账</button>
<button class="btn" v-if="[3, 5].includes(queryType)">重新记账</button>
<button class="btn" v-if="queryType == 7">查看详情</button>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {myMixins} from "@/utils/myMixins"
import {accountRecordList} from "@/api/mine"
import {timeFormat} from "@/utils/common"
export default {
name: "workOrderReconciliation",
methods:{
mixins: [myMixins],
data() {
return {
tabArr: [{name: '待记账', status: 1}, {name: '待审核', status: 3}, {name: '审核失败', status: 5}, {name: '审核完成', status: 7}],
activeIndex: 0,
orderList: [],
pageNum: 1,
pageSize: 10,
total: 0,
queryType:1,
queryTime:'',
showDatetime: false,
currentDate: new Date(),
ymTime: ''
}
},
mounted() {
this.initSelectTime();
this.getList();
},
methods: {
async changeTab(index) {
this.activeIndex = index
if(this.activeIndex === 0){
this.queryType = 1
}else if(this.activeIndex === 1){
this.queryType = 3
}else if(this.activeIndex === 2){
this.queryType = 5
}else if(this.activeIndex === 3){
this.queryType = 7
}
this.total = 0;
this.pageNum = 1
this.orderList = [];
await this.getList()
},
async getList(){
let res = await accountRecordList({
pageNum:this.pageNum,
pageSize:this.pageSize,
queryType:this.queryType,
queryTime:this.queryTime
})
if(res.code === 200){
this.orderList = res.data;
}
},
handleAccounting(item){
console.log("iiii",item)
this.$router.push({
name: 'accountingView', // 目标路由的名称
params: {
id: item.id, // 参数对象的属性
postfix:item.postfix
}
});
},
onConfirm(value) {
this.showDatetime = false
const date = new Date(value);
const year = date.getFullYear(); // 获取年份,结果为 2023
const month = (date.getMonth() + 1).toString().padStart(2, '0'); // 获取月份,需要注意月份从 0 开始,所以要加 1结果为 9
this.ymTime = year + '-' + month
this.queryTime=timeFormat(value);
this.getList();
},
initSelectTime() {//初始化查询时间
const year = this.currentDate.getFullYear(); // 获取年份,结果为 2023
const month = (this.currentDate.getMonth() + 1).toString().padStart(2, '0'); // 获取月份,需要注意月份从 0 开始,所以要加 1结果为 9
this.ymTime = year + '-' + month;
this.queryTime=timeFormat(new Date());
// console.log(this.queryTime)
},
}
}
</script>
@ -26,7 +154,141 @@ export default {
<style scoped lang="scss">
@import "@/styles/common.scss";
@import "@/styles/mixin.scss";
.navBar{
.wrap {
@include wh(100%, 100%);
background: #F4F5F7;
box-sizing: border-box;
padding: 0 12px;
overflow-y: auto;
}
.dataTime {
position: absolute;
z-index: 11;
top: 46px;
right: 0;
}
.navBar {
margin-bottom: 46px;
.rightWrap {
@include flexCenter;
justify-content: space-around;
@include wh(106px, 26px);
background: linear-gradient(180deg, #A3B8E9 0%, #6C81CD 100%);
border-radius: 4px;
border: 1px solid;
border-image: linear-gradient(270deg, rgba(103, 122, 193, 1), rgba(160, 178, 226, 1), rgba(160, 178, 226, 1), rgba(103, 122, 193, 1)) 1 1;
.img1 {
@include wh(1px, 18px)
}
.img2 {
@include wh(7px, 5px)
}
.dateTitle {
@include fontWeightSize(bolder, 12px);
color: #FFFFFF;
opacity: .9;
}
}
}
.tab_wrap {
@include fontWeightSize(bolder, 15px);
display: flex;
justify-content: space-around;
padding: 10px 0 15px 0;
color: #737373;
opacity: .7;
div {
padding-top: 8px;
}
.active {
color: #3678FF;
position: relative;
}
.active:after {
content: '';
display: block;
width: 18px;
height: 3px;
background: linear-gradient(270deg, #33A3FF 0%, #176AFE 100%);
border-radius: 2px;
position: absolute;
margin-top: 3px;
left: 50%;
transform: translateX(-50%);
}
}
.content_wrap {
@include wh(100%, 96px);
background: #FFFFFF;
box-shadow: 0px 1px 4px 0px rgba(39, 52, 125, 0.05);
border-radius: 6px;
border: 1px solid #E6E6E6;
backdrop-filter: blur(5.602678571428572px);
@include flexBetween;
box-sizing: border-box;
padding: 10px 0;
margin-bottom: 10px;
.common {
@include flexColBet();
margin-left: 18px;
margin-right: 14px;
}
.line {
@include wh(100%, 1px);
background: #E9E9EA;
opacity: 0.6;
}
.supplier {
margin-left: 18px;
margin-right: 14px;
}
.btn {
//@include wh(48px, 18px);
@include all-height(20px);
text-align: center;
@include bgFontColor(#FFFFFF, #354D93);
border-radius: 3px;
border: none;
}
.halfTxt {
display: inline-block;
width: 55px;
@include fontWeightSize(400, 12px);
opacity: .5;
}
.allTxt {
@include fontWeightSize(400, 12px)
}
.orderCode {
@include fontWeightSize(bold, 13px)
}
.carCode {
@include fontWeightSize(bold, 12px)
}
.serviceStatus {
@include fontWeightSize(bolder, 13x);
color: #09B820;
}
}
</style>