Files
managePet-mini-program/src/pages/orderDispatch/index.vue
T
2025-11-26 10:05:45 +08:00

505 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="shop_page_container">
<nut-navbar title="订单编辑" :fixed="true" ref="navtest" left-show :safe-area-inset-top="true"
:custom-color="'#312D22'">
</nut-navbar>
<div class="base_box short_box">
<div class="short_item" style="border-bottom: 1px solid #E9E8E8;padding-bottom: 10px;">
<div class="short_item_title">订单号:{{orderItem?.orderId}}</div>
<div class="short_item_pay">{{orderItem?.payStatus == 1 ? '已支付' : '未支付'}}</div>
</div>
<div class="show_box_item" style="border-bottom: 1px solid #E9E8E8;padding-bottom: 10px;">
<div class="short_item_title">地址信息</div>
<div class="short_item_time">{{extractPhoneNumber( orderItem?.userServiceAddr) }}</div>
<div class="short_item_normal">{{orderItem?.addr }}</div>
</div>
<div class="show_box_item" style="border-bottom: 1px solid #E9E8E8;padding-bottom: 10px;">
<div class="short_item_title">宠物信息</div>
<div v-for="(item, index) in orderItem?.petList" :key="index">
<div class="short_item_time">{{ item?.nickName+' | '+item?.assortment+' | '+ item?.weight+'kg'}}</div>
<div class="short_item_normal">{{item?.goodsNameList }}</div>
</div>
</div>
</div>
<div class="show_box_item">
<div class="short_item_time">订单服务时长</div>
<div class="choose_box">
<nut-input v-model="showProjectServerTime" placeholder="请输入订单服务时长" type="number" >
<template #right>
分钟
</template>
</nut-input>
</div>
</div>
<div class="show_box_item">
<div class="short_item_time">服务时间</div>
<div class="choose_box" @tap="handleshowtimepopup">
<div class="con_content">{{ showtimeboxinfo }}</div>
</div>
</div>
<div class="show_box_item">
<div class="short_item_time">详细地址信息</div>
<div class="choose_box" @tap="handlegotoaddresspage">
<div class="con_content_address">{{ showaddressName }}</div>
<div class="loaction_icon">
<img src="../../static/images/locationYellow.png" alt="">
</div>
</div>
</div>
<div class="show_box_item">
<div class="short_item_time">更换车辆</div>
<div class="choose_box">
<CarNoSelecter v-model="showCarNo" :localdata="carOptions" @change="carChoose" placeholder="车辆信息">
</CarNoSelecter>
</div>
</div>
<div>
<time-popup :showbottomstates="showtimebottomstates" @selfclose="handleclosetimebottom"
:timelists="orderServiceTimeList.info" @uploadtime="handleuploadtime"></time-popup>
</div>
</div>
<div class="bottom_safe_area"> </div>
<nut-safe-area position="bottom"></nut-safe-area>
<div class="shopcar_box">
<button class="submit-btn" :style="{ backgroundColor: '#FFCD35' }" @click="handleSubmit">
确认
</button>
<div class="shopcar_box_list">
</div>
<nut-safe-area position="bottom"></nut-safe-area>
</div>
</template>
<script setup>
import {
ref,
reactive
} from 'vue';
import timePopup from '../../components/timepopup'
import CarNoSelecter from '../../components/carNoSelecter'
import {
orderCar,
orderDispatch
} from '../../api/orders'
import {
isDateTimeGreaterThanCurrent
} from '../../utils/date'
import {
carList
} from '../../api/cars.js'
import {
useUserInfo
} from '@/store'
const userInfo = useUserInfo()
const showtimeboxinfo = ref('请选择您预约的洗护时间段')
const timeboxinfoList = ref([])
const showtimebottomstates = ref(false)
const showaddressName = ref('请设置服务地址')
const showCarNo = ref('请选择您的车辆')
const showCarNoItem = ref({})
const chooseUid = ref(0)
const showProjectServerTime = ref('请输入服务时间')
const orderServiceTimeList = reactive({
info: []
})
const carOptions = ref([])
const orderItem = ref({})
const submitList = reactive({
info: {
petGoodsInfos: [],
serviceTime: "",
serviceAddrId: 0
}
})
const fieldNames = ref({
text: "addr",
value: "id",
});
function handleSubmit() {
const submitParams = {
"carId": showCarNo.value,
"orderId":orderItem.value.orderId,
"orderUpdateDTO": {
"addr": showaddressName.value,
"carId": showCarNo.value,
"orderId":orderItem.value.orderId,
"projectionServiceTime": showProjectServerTime.value,
"remark": orderItem.value.remark,
"serviceTime": showtimeboxinfo.value,
"userServiceAddrId":orderItem.value.userServiceAddrId
}
}
console.log(submitParams,'==========submitParams')
orderDispatch(submitParams).then(res => {
if (res.code == 200) {
uni.showToast({
title: '派单成功',
icon: 'success',
duration: 2000
})
// 返回上一页或刷新数据
setTimeout(() => {
// uni.navigateBack()
uni.switchTab({
url: `/pages/index/index`
})
}, 1500)
} else {
uni.showToast({
title: '派单失败,请稍后重试',
icon: 'success',
duration: 2000
})
}
})
}
//车辆选择
function carChoose(val) {
showCarNo.value = val.value
showCarNoItem.value = val
}
function handleuploadtime(e) {
console.log(e, 'handleuploadtime')
showtimeboxinfo.value = e
}
// // 时间处理函数
function getorderServiceTime() {
carList(userInfo.getUid).then((res) => {
if (res.code == 200) {
orderServiceTimeList.info = []
orderServiceTimeList.info.length = 0
let j = 1
for (let item of res.data) {
console.log('------', item)
let date = new Date(item?.serviceDate).getDay()
let result = {
backtime: item?.serviceDate,
date,
ischeck: j == 1 ? true : false,
day: item?.serviceDate?.split('-')[1] + '.' + item?.serviceDate.split('-')[2],
timelist: item?.carDispatchList[0].dispatchResults
}
j += 1
for (let j in result.timelist) {
result.timelist[j].ischeck = false
result.timelist[j].isOver = isDateTimeGreaterThanCurrent(item?.serviceDate, result
.timelist[j].time) //
}
orderServiceTimeList.info.push(result)
}
console.log(orderServiceTimeList, 'res.data.times')
}
})
}
function handleclosetimebottom(e) {
showtimebottomstates.value = e
}
function handlegotoaddresspage() {
uni.navigateTo({
url: '/pages/addresslist/index?type=2'+'&uid='+chooseUid.value,
})
}
function handleshowtimepopup() {
console.log(showtimebottomstates.value)
showtimebottomstates.value = !showtimebottomstates.value
}
onShow(_ => {
uni.$on('returnData', (e) => {
showaddressName.value = e.e.addr
console.log(e)
})
})
onLoad((e) => {
if (e.orderInfo && e.orderInfo != 'undefined') {
const res = JSON.parse(e.orderInfo)
orderItem.value = res
showtimeboxinfo.value = res.serviceTime
showaddressName.value = res.addr
showProjectServerTime.value = res?.projectionServiceTime ? res.projectionServiceTime:0
chooseUid.value = res.uid
getorderServiceTime()
usetCarList()
orderGoodsList(res)
console.log(res);
}
})
function orderGoodsList(data) {
let petLists = data?.petList
if (petLists?.length<=0 )return;
const result = petLists.map(pet => {
// 使用对象展开运算符保留所有原有属性
return {
...pet,
// 添加新的 goodsNameList 属性
goodsNameList: pet.petDetailList
.map(detail => detail.goodsName)
.join(', ')
};
});
orderItem.value.petList = result
console.log(orderItem.value, ">>>>>>n===")
}
//提交编辑信息
function usetCarList() {
orderCar(userInfo.uid).then(res => {
if (res.code == 200) {
const newCarList = res.data.map(car => ({
...car, // 保留原有所有属性
text: car.carNo, // 添加text字段,值为carNo
value: car.id // 添加value字段,值为id
}));
carOptions.value = newCarList
showCarNo.value = newCarList.find(car => car.carNo == orderItem.value.carNo)?.id
}
})
}
function extractPhoneNumber(str) {
if (str?.length <= 0) return ""
// 尝试多种可能的格式
const patterns = [
/联系电话[::]\s*(\d{11})/, // 格式:联系电话:13912712777
/电话[::]\s*(\d{11})/, // 格式:电话:13912712777
/手机[::]\s*(\d{11})/, // 格式:手机:13912712777
/1[3-9]\d{9}/ // 直接匹配11位手机号
];
// for (const pattern of patterns) {
// const match = str.match(pattern);
// if (match) {
// // 返回第一个捕获组或整个匹配
// return match[1] || match[0];
// }
// }
return ""; // 没有找到手机号
}
</script>
<style lang="scss">
image {
height: 100%;
width: 100%;
}
.shop_page_container {
// --nut-navbar-background: #FFDE5E;
--nut-button-border-radius: 0px 25px 25px 0px;
--nut-navbar-color: #312D22;
--nut-button-default-color: #312D22;
--nut-radio-button-border-radius: 8rpx;
--nut-form-item-label-width: 50rpx;
--nut-navbar-box-shadow: 0px 0px 0px 0px;
--nut-textarea-font: 16pt;
--nut-input-border-bottom:rgba(0,0,0,0);
height: 100%;
background-color: #F3F3F3;
}
.show_box {
background-color: #FFFFFF;
border-radius: 16rpx 16rpx 0rpx 0rpx;
}
.show_box_item {
padding: 24rpx;
padding-bottom: 0rpx;
box-sizing: border-box;
}
.choose_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
margin-top: 12rpx;
width: 702rpx;
height: 112rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #E5E4E4;
color: $uni-text-color-grey;
font-size: $uni-font-size-base;
padding: 24rpx;
box-sizing: border-box;
}
.bottom_safe_area {
height: 128rpx;
padding-bottom: 60rpx;
}
.short_item_time {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
max-width: 500rpx;
margin-top: 20rpx;
// text-align: right;
}
.short_item_normal {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
max-width: 650rpx;
margin-top: 20rpx;
// text-align: right;
}
.shopcar_box {
position: fixed;
bottom: 0px;
left: 0px;
background-color: #fff;
.shopcar_box_list {
height: 68rpx;
width: 750rpx;
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
padding: 20rpx;
box-sizing: border-box;
.box_list_button {
width: 702rpx;
height: 88rpx;
background: linear-gradient(270deg, #FFCD35 0%, #FFDE5E 100%);
border-radius: 74rpx 74rpx 74rpx 74rpx;
display: flex;
justify-content: center;
align-items: center;
color: $uni-text-color;
}
}
}
.con_content {
color: #444137;
font-size: 13pt;
}
.con_content_address {
color: #444137;
font-size: 13pt;
white-space: nowrap;
/* 禁止换行 */
overflow: hidden;
/* 隐藏超出部分 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
// width: 500px; /* 设置一个固定宽度或最大宽度 */
}
.submit-btn {
// margin-top: 50rpx;
height: 88rpx;
width: 700rpx;
line-height: 88rpx;
border-radius: 44rpx;
color: #ffffff;
font-size: 32rpx;
background-color: #cccccc;
transition: background-color 0.3s;
justify-content: space-between;
}
.base_box {
width: 702rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
padding: 24rpx;
box-sizing: border-box;
margin: 24rpx;
}
.short_box {
padding-bottom: 0rpx;
background-color: #FFFFFF;
.short_item {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
margin-bottom: 26rpx;
padding: 24rpx;
.short_item_title {
color: $uni-text-color;
font-size: $uni-font-size-base;
font-weight: 500;
}
.short_item_time {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
max-width: 500rpx;
text-align: right;
}
.short_item_pay {
font-size: $uni-font-size-base;
color: $uni-text-color-grey;
max-width: 500rpx;
text-align: right;
color: red;
}
}
}
.short_box::after {
content: '';
display: table;
}
.loaction_icon {
position: absolute;
right: 44rpx;
width: 32rpx;
height: 40rpx;
}
.choose_box_text {
display: flex;
flex-flow: row nowrap;
align-items: center;
margin-top: 12rpx;
width: 702rpx;
height: 112rpx;
background: #FFFFFF;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #E5E4E4;
color: $uni-text-color-grey;
font-size: $uni-font-size-base;
box-sizing: border-box;
}
</style>