货无忧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

704 lines
16 KiB

<template>
<u-navbar title="增值服务" bgColor='#D3832A' leftIconColor='#ffffff' titleStyle='color:#ffffff' placeholder
:autoBack="true" leftIconSize='35'></u-navbar>
<view class="select_top">
<view class="selectlist">
<view>增值服务类型</view>
<view @click="showlist">
<view>{{priceType[checkserveindex].typename}}</view>
<image src="/static/rigthview.png"></image>
</view>
</view>
<view class="inputtext" v-if="checkserve==2">
<view>超区公里数(KM)</view>
<view>
<input placeholder="请输入" v-model="distance" />
</view>
</view>
<view class="inputtext" v-if="checkserve==1">
<view>上楼层数</view>
<view>
<input placeholder="请输入" v-model="floor" />
</view>
</view>
<view class="inputtext" v-if="checkserve==3">
<view>平移距离(米)</view>
<view>
<input placeholder="请输入" v-model="distance" />
</view>
</view>
<view class="inputtext" v-if="typestate==2">
<view>录入包条码</view>
<view>
<input placeholder="请输入" v-model="scancode" />
<view @click="scandata(true)" class="">确认</view>
</view>
</view>
<!-- <view class="selectlist">
<view>楼层</view>
<view>
<view>请选择</view>
<image src="/static/rigthview.png"></image>
</view>
</view> -->
<view class="checktype">
<view>包件类型</view>
<view>
<view @click="setdetails('typestate',1)" :class="typestate==1?'xz':''">
<image :src="typestate==1?'/pagesHome/static/yescheckblue.png':'/pagesHome/static/nocheckblue.png'">
</image>
<view>全部</view>
</view>
<view v-if="checkserve!=2&&checkserve!=6" @click="setdetails('typestate',2)" :class="typestate==2?'xz':''">
<image :src="typestate==2?'/pagesHome/static/yescheckblue.png':'/pagesHome/static/nocheckblue.png'">
</image>
<view>部分</view>
</view>
</view>
</view>
</view>
<scroll-view scroll-y="true" class="scvbo">
<view class="itemscbox" v-for="(item,index) in allpack" v-if="typestate==1">
<view class="types1">
<view>{{index+1}}</view>
<view @click="removeitem(index)">移除</view>
</view>
<view class="types2">
<image src="/pagesHome/static/scanicon1.png"></image>
<view @click.stop="goorderdetail(item)">订单编号:{{item.orderCode}}</view>
</view>
<view class="types2">
<image src="/pagesHome/static/scanicon1.png"></image>
<template v-if="Number(item.conditions) !== 3">
<view>包件码:{{item.orderPackageCode}}</view>
</template>
<!-- 零担 -->
<template v-else>
<view>总数:{{item.maxQuantity}}</view>
</template>
</view>
<template v-if="Number(item.conditions) === 3">
<view class="zeroSignboard">
<view>
零担
</view>
</view>
</template>
</view>
<view class="itemscbox" v-for="(item,index) in scanpack" v-if="typestate==2">
<view class="types1">
<view>{{index+1}}</view>
<view @click="removeitem(index)">移除</view>
</view>
<view class="types2">
<image src="/pagesHome/static/scanicon1.png"></image>
<view @click.stop="goorderdetail(item)">订单编号:{{item.orderCode}}</view>
</view>
<view class="types2">
<image src="/pagesHome/static/scanicon1.png"></image>
<template v-if="Number(item.conditions) !== 3">
<view>包件码:{{item.orderPackageCode}}</view>
</template>
<!-- 零担 -->
<template v-else>
<view style="display: flex;">
<view>数量:</view>
<input type="number" v-model="item.zeroQuantity" @input="inputNum(item)">
</view>
</template>
</view>
<template v-if="Number(item.conditions) === 3">
<view class="zeroSignboard">
<view>
零担
</view>
</view>
</template>
</view>
</scroll-view>
<!-- 提交增值服务 -->
<view class="submitqrs" @click="submitpackge">确定</view>
<tiplist ref="tiplists"></tiplist>
<saomiao2></saomiao2>
</template>
<script lang="ts" setup>
import {
addvaluegetAllPackageList,
addvaluesaveAddvalueInfo,
addvaluescanAddvaluePackage,
addvalueaddvalueInfo,
addvalueeditAddvalueInfo,
addvalueupdateAddvalueInfo,
} from '@/api/user.js'
import {
onLoad,
onShow,
onHide,
onUnload
} from '@dcloudio/uni-app';
import { reactive, ref, toRefs, watchEffect } from "vue";
import utils from '../../../utils/utils';
const tiplists = ref(null)
let details = reactive({
typestate: 1,
priceType: [
{ typename: '上楼', type: 1 },
{ typename: '超区', type: 2 },
{ typename: '平移', type: 3 },
{ typename: '搬运', type: 4 },
{ typename: '分拣入户', type: 5 },
{ typename: '专车', type: 6 },
],
checkserveindex: 0,
checkserve: 1,
allpack: [],
scanpack: [],
reservationId: '',
floor: '',
distance: '',
scancode: '',
deliveryId: '',
editId: '',
addvalueType: '',
addvalueDetailId: ''
})
onLoad((op) => {
details.reservationId = op.reservationId
details.deliveryId = op.deliveryId
details.editId = op.editId
details.addvalueType = op.addvalueType
if (details.addvalueType) {
details.typestate = Number(details.addvalueType)
}
// details.reservationId='1704046446615171074'
})
function goorderdetail(item) {
uni.navigateTo({
url: '/pagesHome/pages/orderDetails/orderDetails?orderCode=' + item.orderCode
})
}
onShow(async () => {
uni.$on('scancodedate', function (code) {
if (code) {
// console.log(code);
details.scancode = code
scandata()
}
})
// 有修改id时
if (details.editId) {
await getallpack()
await init()
}
else await getallpack()
})
onHide(() => {
uni.$off('scancodedate')
})
watchEffect(() => {
details.checkserve = details.priceType[details.checkserveindex].type
})
async function init() {
let data = {
reservationId: details.reservationId,
addvalueType: details.addvalueType,
}
let res = await addvalueeditAddvalueInfo(data)
console.log(res);
console.log('details.allpack :>> ', details.allpack);
if (res.data.addvalueDetailId) {
details.addvalueDetailId = res.data.addvalueDetailId
}
if (res.data.addvalueId) {
details.checkserveindex = Number(res.data.addvalueId) - 1
}
console.log(details.checkserveindex);
if (res.data.floolNum) {
details.floor = res.data.floolNum
}
if (res.data.distance) {
details.distance = res.data.distance
}
if (res.data.isAll === 1) {
details.typestate = 1
} else {
details.typestate = 2
details.scanpack = res.data.packageEntityList
console.log('details.scanpack :>> ', details.scanpack);
details.scanpack.forEach(val => val.zeroQuantity = val.quantity)
}
}
async function scandata(isManual ?: boolean) {
// 包件类型 -- 全部不支持请求
if (details.typestate == 1) return
// 包件类型 -- 部分
let list = []
const _flag = details.scanpack.every(item => {
if (item.orderPackageCode === details.scancode) {
uni.showToast({
title: '重复扫描',
icon: 'none'
})
// #ifdef APP
utils.ttsspke('重复扫描')
// #endif
return false
}
list.push(item.id)
return true
})
if (!_flag) return
let data = {
reservationId: details.reservationId,
barcode: details.scancode,
packageListIds: [],
isManual: 1,
deliveryId: details.deliveryId,
}
// 手输
if (isManual) {
data.isManual = 2
data.packageListIds = list
}
// 请求数据
let response = await addvaluescanAddvaluePackage(data)
if (response.code !== 200) return
details.scanpack = details.scanpack.concat(response.obj)
}
/**
* 移除
*/
function removeitem(index : number) {
if (details.typestate == 1) {
details.allpack.splice(index, 1)
} else if (details.typestate == 2) {
details.scanpack.splice(index, 1)
}
}
/**
* 设置details
*/
function setdetails<T>(uname : string, value : T) : void {
details[uname] = value
}
async function submitpackge() {
let response = null
// 修改提交
if (details.editId) response = await handleEditSubmit()
// 新增提交
else response = await handleNewSubmit()
console.log('res >>', response);
if (response.code !== 200) return
// 返回上一页
uni.navigateBack()
}
/**
* 新增提交
*/
async function handleNewSubmit() {
if ((details.checkserve == 2 || details.checkserve == 3) && !details.distance) {
uni.showToast({
title: '请输入距离',
icon: 'none'
})
return
} else if (details.checkserve == 1 && !details.floor) {
uni.showToast({
title: '请输入楼层数',
icon: 'none'
})
return
}
let data = {
addvalueType: details.checkserve,
floolNum: details.checkserve == 1 ? details.floor : '',
distance: details.checkserve != 1 ? details.distance : '',
num: details.allpack.length,
reservationId: details.reservationId,
packageEntityList: details.allpack,
}
// 包件类型 -- 部分
if (details.typestate == 2) {
data.packageEntityList = details.scanpack
} else {
data.packageEntityList.forEach(val => {
if (Number(val.conditions) === 3) {
val.zeroQuantity = val.maxQuantity
val.quantity = val.maxQuantity
}
})
}
let response = await addvaluesaveAddvalueInfo(data)
return response
}
/**
* 修改提交
*/
async function handleEditSubmit() {
if ((details.checkserve == 2 || details.checkserve == 3) && !details.distance) {
uni.showToast({
title: '请输入距离',
icon: 'none'
})
return
} else if (details.checkserve == 1 && !details.floor) {
uni.showToast({
title: '请输入楼层数',
icon: 'none'
})
return
}
let data = {
addvalueType: details.checkserve,
floolNum: details.checkserve == 1 ? details.floor : '',
distance: details.checkserve != 1 ? details.distance : '',
num: details.allpack.length,
reservationId: details.reservationId,
packageEntityList: details.allpack,
addvalueDetailId: details.addvalueDetailId
}
// 包件类型 -- 部分
if (details.typestate == 2) {
data.packageEntityList = details.scanpack
} else {
data.packageEntityList.forEach(val => val.zeroQuantity = val.quantity)
}
const response = await addvalueupdateAddvalueInfo(data)
return response
}
function showlist() {
let list = []
details.priceType.map(item => {
list.push(item.typename)
})
tiplists.value.setdetails({
title: '请选择增值服务类型',
isshow: true,
tipstate: 2,
list,
checklist: [details.checkserveindex],
inputtext: '',
confirmTxt: '确认选择',
isonecheck: true,
success: (deta) => {
if (deta.checklist.length == 0) {
uni.showToast({
title: '请选择增值服务类型',
icon: 'none'
})
return
}
details.checkserveindex = deta.checklist[0]
if (details.checkserveindex == 1 || details.checkserveindex == 5) {
details.typestate = 1
}
tiplists.value.setdetails({ isshow: false })
},
cancel: (details) => {
tiplists.value.setdetails({ isshow: false })
},
close: (details) => {
tiplists.value.setdetails({ isshow: false })
}
})
}
async function getallpack() {
let data = {
reservationId: details.reservationId,
packageListIds: [],
}
let response = await addvaluegetAllPackageList(data)
console.log('response :>> ', response);
details.allpack = response.data
details.scanpack = []
details.allpack.forEach(val => {
if (Number(val.conditions) === 3) {
val.zeroQuantity = 0
details.scanpack.push(val)
}
})
console.log('details.scanpack :>> ', details.scanpack);
return response
}
/**
* 输入框事件
*/
let timer : any = null
function inputNum(item) {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
console.log('item :>> ', item);
let _value = parseInt(item.zeroQuantity)
if (_value < 0) _value = 0
else if (_value > item.maxQuantity) _value = item.maxQuantity
else if (_value !== _value) _value = 0
item.zeroQuantity = _value
clearTimeout(timer)
}, 200)
}
const {
scancode,
distance,
floor,
allpack,
scanpack,
typestate,
priceType,
checkserveindex,
checkserve
} = toRefs(details)
</script>
<style lang="scss" scoped>
$subjectColor: #d3832a;
.submitqrs {
width: 686upx;
height: 100upx;
background: #D3832A;
border-radius: 16upx;
display: flex;
align-items: center;
justify-content: center;
margin: auto;
color: #FFFFFF;
font-size: 32upx;
font-weight: 400;
}
.scvbo {
width: 100%;
height: 58vh;
margin-top: 15upx;
margin-bottom: 15upx;
.itemscbox {
width: 686upx;
background: #FFFFFF;
border-radius: 16upx;
margin: auto;
margin-bottom: 16upx;
padding: 0 30upx;
box-sizing: border-box;
position: relative;
overflow: hidden;
// background: linear-gradient(45deg, $subjectColor 1%, #fff);
.types2 {
display: flex;
align-items: center;
padding: 25upx 0;
border-bottom: 1upx solid #EEEEEE;
&:nth-last-child(1) {
border-bottom: none;
}
>image {
width: 32upx;
height: 32upx;
margin-right: 14upx;
}
>view {
font-size: 28rpx;
font-weight: 400;
color: #020B18;
}
}
.types1 {
display: flex;
align-items: center;
justify-content: space-between;
padding: 25upx 0;
border-bottom: 1upx solid #EEEEEE;
>view:nth-of-type(1) {
width: 48upx;
height: 48upx;
background-color: #e7f3fd;
color: #178AF2;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
>view:nth-of-type(2) {
width: 84upx;
height: 64upx;
background: rgba(248, 84, 75, 0.102);
border-radius: 4upx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28upx;
font-weight: 400;
color: #F8544B;
}
}
}
}
.select_top {
width: 750upx;
// height: 420upx;
background: #FFFFFF;
padding: 20upx 46upx;
box-sizing: border-box;
>.checktype {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 20upx 0;
padding-bottom: 10upx;
padding-top: 25upx;
>view:nth-of-type(1) {
font-size: 32upx;
font-weight: 400;
color: #092C4D;
}
>view:nth-of-type(2) {
display: flex;
align-items: center;
.xz {
>view {
color: #0086F1 !important;
}
}
>view {
font-size: 28upx;
font-weight: 400;
color: #AFB5BE;
display: flex;
align-items: center;
margin-right: 20upx;
&:nth-last-child(1) {
margin-right: 0 !important;
}
>image {
width: 32upx;
height: 32upx;
margin-right: 10upx;
}
>view {
font-size: 32upx;
font-weight: 400;
color: #020B18;
}
}
}
}
>.inputtext {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 20upx 0;
border-bottom: 1upx solid #EEEEEE;
>view:nth-of-type(1) {
font-size: 32upx;
font-weight: 400;
color: #092C4D;
}
>view:nth-of-type(2) {
flex: 1;
margin-left: 30upx;
text-align: right;
display: flex;
align-items: center;
>input {
flex: 1;
}
>view {
width: 100upx;
height: 45upx;
display: flex;
align-items: center;
justify-content: center;
font-size: 26upx;
color: #D3832A;
border: 1upx solid #D3832A;
border-radius: 5upx;
margin-left: 20upx;
}
}
}
>.selectlist {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 20upx 0;
border-bottom: 1upx solid #EEEEEE;
>view:nth-of-type(1) {
font-size: 32upx;
font-weight: 400;
color: #092C4D;
}
>view:nth-of-type(2) {
display: flex;
align-items: center;
>view {
font-size: 28upx;
font-weight: 400;
color: #AFB5BE;
}
>image {
width: 24upx;
height: 32upx;
}
}
}
}
// 零担标识
.zeroSignboard {
position: absolute;
top: 50%;
left: -20upx;
transform: translateY(-50%);
border: 1upx solid #47a2f4;
padding: 10upx;
border-radius: 50%;
view {
width: 80upx;
height: 80upx;
border: 1upx solid #47a2f4;
border-radius: 50%;
color: #47a2f4;
line-height: 80upx;
text-align: center;
}
}
</style>