wangfukang 15 hours ago
parent
commit
dbee3304a9
  1. 11
      package2/group/groupBuyList.vue
  2. 21
      package2/shop/merchantCenter.vue
  3. 90
      package2/shop/merchantRegister.vue
  4. 88
      package2/shop/shopInfo.vue
  5. 172
      package2/shop/transferDeliveryOrderList.vue

11
package2/group/groupBuyList.vue

@ -528,13 +528,20 @@
const cookingTimeValue = item.shopTakeaway && item.shopTakeaway.cookingTime ? Number(item.shopTakeaway.cookingTime) : 0
const cookingTime = isNaN(cookingTimeValue) ? 0 : cookingTimeValue
const selfDeliveryTime = Number(item.shopDeliveryDuration)
const transferTimeValue = Number(item.transferDeliveryDuration)
const transferTime = item.supportTransferDelivery == 1 && !isNaN(transferTimeValue) && transferTimeValue > 0 ? transferTimeValue : 0
item._dormStatus = this.groupTags[index % this.groupTags.length]
item._groupTip = ['还差1人就成团', '刚下课,大家都在拼', '这口热乎的很适合夜宵', '附近同学想一起点'][index % 4]
let baseDeliveryTime
if (item.supportShopDelivery == 1 && !isNaN(selfDeliveryTime) && selfDeliveryTime > 0) {
item.groupDeliveryTime = cookingTime + selfDeliveryTime
baseDeliveryTime = cookingTime + selfDeliveryTime
} else {
item.groupDeliveryTime = item.groupDeliveryTime === null || item.groupDeliveryTime === undefined ? cookingTime + 30 : item.groupDeliveryTime
const rawBaseDeliveryTime = item.groupDeliveryTime === null || item.groupDeliveryTime === undefined ? cookingTime + 30 : Number(item.groupDeliveryTime)
baseDeliveryTime = isNaN(rawBaseDeliveryTime) ? cookingTime + 30 : rawBaseDeliveryTime
}
item.groupDeliveryBaseTime = baseDeliveryTime
item.groupDeliveryTime = baseDeliveryTime + transferTime
item.groupDeliveryTimeIncludesTransfer = transferTime > 0 ? 1 : 0
item._liveAvatars = [
this.groupAvatars[index % this.groupAvatars.length],
this.groupAvatars[(index + 1) % this.groupAvatars.length],

21
package2/shop/merchantCenter.vue

@ -81,7 +81,7 @@
待回复差评
</view>
</view>
<view class="order33" @tap="goDetail('selfDelivery')">
<view class="order33" v-if="shopConfig.supportShopDelivery == 1" @tap="goDetail('selfDelivery')">
<view class="order44" style="color: red;">
{{shopData.shopDeliveryPendingCount == undefined?0:shopData.shopDeliveryPendingCount}}
</view>
@ -89,6 +89,14 @@
自配送订单
</view>
</view>
<view class="order33" v-if="shopConfig.supportTransferDelivery == 1" @tap="goDetail('transferDelivery')">
<view class="order44" style="color: red;">
{{shopData.transferDeliveryPendingCount == undefined?0:shopData.transferDeliveryPendingCount}}
</view>
<view class="order55">
中转配送
</view>
</view>
</view>
<!-- <view class="order22">
@ -198,6 +206,7 @@
menuButtonInfo: {},
businessStatus:1,
shop:{},
shopConfig:{},
shopData:{},
daixiaofei:0,
daichucan:0,
@ -215,6 +224,7 @@
},
methods: {
getData(){
this.refreshShopConfig()
this.tui.request("/mall/order/countByShop/"+uni.getStorageSync('shopId'), "GET", {}, false, true).then((res) => {
if (res.code == 200) {
this.shopData = res.result
@ -237,6 +247,12 @@
uni.hideLoading()
}).catch((res) => {})
},
refreshShopConfig(){
const shopList = uni.getStorageSync('schoolShop') || []
if(Array.isArray(shopList)){
this.shopConfig = shopList.find(item => item.id == uni.getStorageSync('shopId')) || {}
}
},
//
getBusinessStatus(){
this.tui.request("/app/shoptakeaway/getByShopId", "GET", {
@ -298,6 +314,9 @@
case 'selfDelivery':
url = '/package2/shop/selfDeliveryOrderList'
break;
case 'transferDelivery':
url = '/package2/shop/transferDeliveryOrderList'
break;
case 'dd':
url = '/package2/shop/shopOrderList'
break;

90
package2/shop/merchantRegister.vue

@ -245,6 +245,40 @@
</view>
</block>
</view>
<view class="content" v-if="formData.merchantType == 1">
<view class="section-title">中转配送</view>
<view class="value">
<view class="name">支持中转配送</view>
<view class="text" style="text-align: right;">
<label class="radio" style="padding-right: 20rpx;" @tap="setTransferDelivery(1)">
<radio :checked="formData.supportTransferDelivery == 1" /><text></text>
</label>
<label class="radio" @tap="setTransferDelivery(0)">
<radio :checked="formData.supportTransferDelivery == 0" /><text></text>
</label>
</view>
</view>
<block v-if="formData.supportTransferDelivery == 1">
<view class="value">
<view class="name">中转时长</view>
<view class="text">
<input type="number" v-model="formData.transferDeliveryDuration" placeholder="请输入分钟数" />
</view>
</view>
<view class="value">
<view class="name">中转地点</view>
<view class="text" style="text-align: right;">
<picker :range="transferAddressList" range-key="text" @change="transferAddressChange"
:disabled="!formData.regionId">
<view class="picker-text" :class="{ placeholder: !formData.transferAddressName }">
{{ formData.transferAddressName || (formData.regionId ? '请选择中转地点' : '请先选择所属区域') }}
<uni-icons type="bottom" size="14" color="#999"></uni-icons>
</view>
</picker>
</view>
</view>
</block>
</view>
<button @tap.stop="submit()">保存</button>
</view>
@ -262,6 +296,7 @@
data() {
return {
addressList:[],
transferAddressList:[],
merchantTypeList: [{
value: 1,
text: '外卖商家'
@ -306,7 +341,11 @@
shopDeliveryDuration:'',
workerId:'',
workerName:'',
workerPhone:''
workerPhone:'',
supportTransferDelivery:0,
transferDeliveryDuration:'',
transferAddressId:'',
transferAddressName:''
},
choose:false,
isChoose:false,
@ -408,6 +447,7 @@
let that = this;
let url = ''
this.normalizeSelfDelivery()
this.normalizeTransferDelivery()
let verify = this.verifyField()
if(verify != true){
uni.showToast({
@ -457,6 +497,25 @@
this.workerMobile = ''
}
},
setTransferDelivery(type){
this.formData.supportTransferDelivery = type
if(type != 1){
this.formData.transferDeliveryDuration = ''
this.formData.transferAddressId = ''
this.formData.transferAddressName = ''
}else if(!this.formData.regionId){
this.tui.toast('请先选择所属区域')
}else if(this.transferAddressList.length == 0){
this.getTransferAddressList(this.formData.regionId)
}
},
transferAddressChange(e){
const item = this.transferAddressList[e.detail.value]
if(item){
this.formData.transferAddressId = item.value
this.formData.transferAddressName = item.text
}
},
formatOrderBkge(){
let value = parseFloat(this.formData.orderBkge || 0)
if(isNaN(value) || value < 0) value = 0
@ -493,6 +552,13 @@
}
this.formatOrderBkge()
},
normalizeTransferDelivery(){
if(this.formData.merchantType != 1 || this.formData.supportTransferDelivery != 1){
this.setTransferDelivery(0)
return
}
this.formData.transferDeliveryDuration = parseInt(this.formData.transferDeliveryDuration || 0)
},
//
getRegionList() {
let that = this;
@ -512,8 +578,26 @@
if (region) {
this.formData.regionId = region.value;
this.formData.region = region.text
this.formData.transferAddressId = ''
this.formData.transferAddressName = ''
this.getTransferAddressList(region.value)
}
},
getTransferAddressList(regionId) {
if (!regionId) {
this.transferAddressList = []
return
}
this.tui.request('/app/shopArea/getByParentId/' + regionId, 'GET', {}, false, false, true).then((res) => {
if (res.code !== 200) return
this.transferAddressList = (Array.isArray(res.result) ? res.result : []).map(item => {
return {
value: item.id,
text: item.title || item.name || item.regionName || item.areaName || '未命名地址'
}
})
})
},
sendLoginSms(){ //
if (this.choose) return
this.isChoose = false
@ -583,6 +667,10 @@
msg = '配送时长'
}else if(data.merchantType == 1 && data.supportShopDelivery == 1 && !data.workerId){
msg = '自配送配送员'
}else if(data.merchantType == 1 && data.supportTransferDelivery == 1 && !data.transferDeliveryDuration){
msg = '中转配送时长'
}else if(data.merchantType == 1 && data.supportTransferDelivery == 1 && !data.transferAddressId){
msg = '中转地点'
}
return msg == ""?true:msg
}

88
package2/shop/shopInfo.vue

@ -132,6 +132,36 @@
</view>
</block>
</view>
<view class="list-box">
<view class="section-title">中转配送</view>
<view class="list-1">
<view class="list-name">支持中转配送</view>
<view class="list-right">
<label class="radio" style="padding-right: 20rpx;" @tap="setTransferDelivery(1)">
<radio :checked="shop.supportTransferDelivery == 1" /><text></text>
</label>
<label class="radio" @tap="setTransferDelivery(0)">
<radio :checked="shop.supportTransferDelivery == 0" /><text></text>
</label>
</view>
</view>
<block v-if="shop.supportTransferDelivery == 1">
<view class="list-1">
<view class="list-name">中转时长</view>
<view class="list-right">
<input type="number" v-model="shop.transferDeliveryDuration" placeholder="分钟" />
</view>
</view>
<view class="list-1">
<view class="list-name">中转地点</view>
<view class="list-right">
<picker :range="addressList" range-key="text" @change="transferAddressChange">
<view>{{shop.transferAddressName || '请选择'}}</view>
</picker>
</view>
</view>
</block>
</view>
<view class="list-box">
<view class="list-2" @click="submit">
保存
@ -148,6 +178,7 @@
shopImages:[],
huanjing:'',
workerMobile:'',
addressList:[],
deliveryLocationList:[{
value: 1,
text: '送到宿舍'
@ -180,7 +211,9 @@
}
if(this.shop.supportShopDelivery == null) this.shop.supportShopDelivery = 0
if(this.shop.orderBkge == null) this.shop.orderBkge = 0
if(this.shop.supportTransferDelivery == null) this.shop.supportTransferDelivery = 0
this.workerMobile = this.shop.workerPhone || ''
this.getRegionList()
},
methods: {
navigatorTo(e){
@ -256,6 +289,32 @@
this.workerMobile = ''
}
},
setTransferDelivery(type){
this.shop.supportTransferDelivery = type
if(type != 1){
this.shop.transferDeliveryDuration = ''
this.shop.transferAddressId = ''
this.shop.transferAddressName = ''
}
},
getRegionList(){
this.tui.request('/app/shopArea/getByParentId/0', 'get', {}, false, false, true).then((res) => {
if (res.code !== 200) return
this.addressList = (Array.isArray(res.result) ? res.result : []).map(item => {
return {
value: item.id,
text: item.title || item.name || item.regionName || item.areaName || '未命名区域'
}
})
})
},
transferAddressChange(e){
const item = this.addressList[e.detail.value]
if(item){
this.shop.transferAddressId = item.value
this.shop.transferAddressName = item.text
}
},
formatOrderBkge(){
let value = parseFloat(this.shop.orderBkge || 0)
if(isNaN(value) || value < 0) value = 0
@ -305,6 +364,22 @@
}
return true
},
normalizeTransferDelivery(){
if(this.shop.supportTransferDelivery != 1){
this.setTransferDelivery(0)
return true
}
if(!this.shop.transferDeliveryDuration){
this.tui.toast('请输入中转配送时长')
return false
}
if(!this.shop.transferAddressId){
this.tui.toast('请选择中转地点')
return false
}
this.shop.transferDeliveryDuration = parseInt(this.shop.transferDeliveryDuration || 0)
return true
},
updateLocalShopCache(){
let shopList = uni.getStorageSync('schoolShop') || []
if(Array.isArray(shopList)){
@ -315,6 +390,7 @@
},
submit(){
if(!this.normalizeSelfDelivery()) return
if(!this.normalizeTransferDelivery()) return
this.tui.request("/app/shop/updateSelfDelivery", "post", {
id: this.shop.id,
supportShopDelivery: this.shop.supportShopDelivery,
@ -329,6 +405,18 @@
this.tui.toast(deliveryRes.message)
return Promise.reject(deliveryRes)
}
return this.tui.request("/app/shop/updateTransferDelivery", "post", {
id: this.shop.id,
supportTransferDelivery: this.shop.supportTransferDelivery,
transferDeliveryDuration: this.shop.transferDeliveryDuration,
transferAddressId: this.shop.transferAddressId,
transferAddressName: this.shop.transferAddressName
}, false, true)
}).then((transferRes) => {
if (transferRes.code != 200) {
this.tui.toast(transferRes.message)
return Promise.reject(transferRes)
}
return this.tui.request("/app/shop/edit", "PUT", this.shop, false, true)
}).then((res) => {
if (res.code == 200) {

172
package2/shop/transferDeliveryOrderList.vue

@ -0,0 +1,172 @@
<template>
<view class="page">
<view class="nav">
<view class="back" @tap="back"><uni-icons type="left" size="26"></uni-icons></view>
<view class="title">中转配送</view>
</view>
<scroll-view class="list" scroll-y @scrolltolower="loadMore">
<view class="card" v-for="(item,index) in list" :key="item.id">
<view class="card-head">
<view class="tag">中转配送</view>
<view class="code" v-if="item.numberCode">#{{item.numberCode}}</view>
</view>
<view class="row">
<view class="label">中转点</view>
<view class="value">{{item.transferAddressName || item.shopName}}</view>
</view>
<view class="row">
<view class="label">配送员</view>
<view class="value phone-value" @tap.stop="makeCall(item.workerPhone)">
<text>{{item.workerName || '未分配'}}</text>
<text v-if="item.workerPhone" class="phone">{{item.workerPhone}}</text>
</view>
</view>
<view class="row">
<view class="label">用户</view>
<view class="value phone-value" @tap.stop="makeCall(item.receiverPhone)">
<text>{{item.receiverName}}</text>
<text v-if="item.receiverPhone" class="phone">{{item.receiverPhone}}</text>
</view>
</view>
<view class="address">{{item.receiverAddress}}</view>
<view class="image-row" v-if="item.transferArriveImage">
<image :src="item.transferArriveImage" mode="aspectFill"></image>
</view>
<view class="actions">
<view class="photo-btn" @tap="chooseImage(index)">拍照</view>
<view class="main-btn" @tap="transferArrive(index,item)">送达中转点</view>
</view>
</view>
<view class="empty" v-if="list.length === 0 && loadStatus === 'nomore'">暂无中转配送单</view>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
list: [],
loadStatus: 'more',
totalPages: 1,
searchForm: {
pageNum: 1,
pageSize: 10,
status: 1,
deliveryType: 1,
transferDelivery: 1,
transferArriveEmpty: true,
shopId: '',
regionId: ''
}
}
},
onShow() {
this.resetList()
},
methods: {
back() {
uni.navigateBack()
},
resetList() {
this.searchForm.pageNum = 1
this.totalPages = 1
this.list = []
this.loadStatus = 'more'
this.searchForm.shopId = uni.getStorageSync('shopId')
const area = uni.getStorageSync('area')
this.searchForm.regionId = area ? JSON.parse(area).id : ''
this.getList()
},
loadMore() {
if (this.searchForm.pageNum >= this.totalPages) return
this.searchForm.pageNum++
this.getList()
},
getList() {
this.tui.request('/mall/delivery/pageTransferDelivery', 'POST', this.searchForm, false, false).then((res) => {
if (res.code == 200) {
const records = res.result.records || []
this.list = this.searchForm.pageNum == 1 ? records : this.list.concat(records)
this.totalPages = res.result.pages || 1
this.loadStatus = this.searchForm.pageNum >= this.totalPages ? 'nomore' : 'more'
} else {
this.tui.toast(res.message)
}
})
},
chooseImage(index) {
uni.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['camera', 'album'],
success: (res) => {
const file = res.tempFiles && res.tempFiles[0] ? res.tempFiles[0].tempFilePath : ''
if (file) this.uploadImage(index, file)
}
})
},
uploadImage(index, filePath) {
uni.uploadFile({
url: this.tui.interfaceUrl() + '/upload/file',
filePath,
name: 'file',
header: {
'accessToken': uni.getStorageSync('hiver_token'),
'content-type': 'multipart/form-data'
},
success: (res) => {
const data = JSON.parse(res.data)
this.$set(this.list[index], 'transferArriveImage', data.result)
}
})
},
transferArrive(index, item) {
this.tui.request('/mall/delivery/transferArrive', 'POST', {
deliveryId: item.id,
transferArriveImage: item.transferArriveImage || ''
}, false, true).then((res) => {
if (res.code == 200) {
this.list.splice(index, 1)
this.tui.toast('操作成功')
} else {
this.tui.toast(res.message)
}
})
},
makeCall(phone) {
if (!phone) {
this.tui.toast('暂无手机号')
return
}
uni.makePhoneCall({
phoneNumber: phone
})
}
}
}
</script>
<style>
.page{min-height:100vh;background:#F5F8F5;padding:120rpx 24rpx 24rpx;box-sizing:border-box;}
.nav{position:fixed;top:0;left:0;right:0;height:110rpx;background:#F5F8F5;z-index:9;display:flex;align-items:flex-end;justify-content:center;padding-bottom:18rpx;}
.back{position:absolute;left:24rpx;bottom:12rpx;width:68rpx;height:68rpx;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;}
.title{font-size:32rpx;font-weight:800;}
.list{height:calc(100vh - 140rpx);}
.card{background:#fff;border-radius:24rpx;padding:24rpx;margin-bottom:20rpx;box-shadow:0 10rpx 26rpx rgba(0,35,28,.08);}
.card-head{display:flex;align-items:center;margin-bottom:20rpx;}
.tag{background:#fff2e9;color:#f36c21;border-radius:12rpx;padding:8rpx 14rpx;font-weight:700;}
.code{margin-left:auto;font-weight:800;font-size:32rpx;}
.row{display:flex;line-height:46rpx;}
.label{width:120rpx;color:#7a8582;}
.value{flex:1;font-weight:700;}
.phone-value{display:flex;align-items:center;gap:16rpx;color:#123d35;}
.phone{color:#0b9b73;text-decoration:underline;}
.address{margin-top:10rpx;color:#6c7773;line-height:40rpx;}
.image-row image{width:160rpx;height:160rpx;border-radius:16rpx;margin-top:16rpx;}
.actions{display:flex;margin-top:22rpx;gap:18rpx;}
.photo-btn,.main-btn{flex:1;height:76rpx;line-height:76rpx;text-align:center;border-radius:38rpx;font-weight:700;}
.photo-btn{background:#f2f6f4;color:#0b9b73;}
.main-btn{background:linear-gradient(90deg,#e3ff96,#a6ffea);color:#00231c;}
.empty{text-align:center;color:#8a9692;padding:80rpx 0;}
</style>
Loading…
Cancel
Save