wangfukang 21 hours ago
parent
commit
db58c3a83a
  1. 188
      package1/buyFood/buyFood.vue

188
package1/buyFood/buyFood.vue

@ -107,17 +107,17 @@
</view>
</view>
</view>
<view class="delivery-card social-destination-card" v-if="useSocialDeliveryChoice">
<view class="delivery-card social-destination-card" v-if="useSocialDeliveryChoice && transferDeliverySwitchChecked">
<view class="delivery-head">
<view class="delivery-title">
配送方式
</view>
<view class="delivery-desc">
送到宿舍由中转配送完成,送到大门由商家自配送完成
{{socialTransferDeliveryEnabled ? '送到宿舍由中转配送完成,送到大门由商家自配送完成' : '当前仅支持送到大门,由商家自配送完成'}}
</view>
</view>
<view class="delivery-options">
<view class="delivery-option" @tap="checkSocialDeliveryDestination('dorm')">
<view class="delivery-option" v-if="socialTransferDeliveryEnabled" @tap="checkSocialDeliveryDestination('dorm')">
<view class="delivery-choice">
<view class="radio-check" v-if="socialDeliveryDestination === 'dorm'">
<uni-icons type="checkmarkempty" size="12"></uni-icons>
@ -141,6 +141,17 @@
{{socialGateDeliveryText}}
</view>
</view>
<view class="gate-location-panel" v-if="socialDeliveryDestination === 'gate'" @tap.stop>
<view class="gate-location-title">请选择送达地点</view>
<view class="gate-location-empty" v-if="!gateLocations.length">商家暂未设置送达地点</view>
<view class="gate-location-item" v-for="item in gateLocations" :key="item.id" @tap.stop="selectGateLocation(item)">
<view class="radio-check" v-if="isGateLocationSelected(item)">
<uni-icons type="checkmarkempty" size="12"></uni-icons>
</view>
<view class="radio-no-check" v-else></view>
<text>{{item.locationName}}</text>
</view>
</view>
</view>
</view>
<view class="delivery-card" v-if="isPaotui && !isSocialArea">
@ -712,7 +723,14 @@
deliverySwitchChecked: false,
deliverySwitchLoading: false,
areaKind: 1,
socialDeliveryDestination: 'dorm'
socialDeliveryDestination: 'dorm',
transferDeliveryEnabled: 1,
transferDeliverySwitchChecked: false,
gateLocations: [],
gateLocationLoaded: false,
gateLocationShopId: '',
selectedGateLocationId: '',
selectedGateLocationName: ''
}
},
components: {
@ -776,6 +794,9 @@
useSocialDeliveryChoice() {
return this.isPaotui && this.isTargetSocialDeliveryRegion && !this.isStoreGroupOrder;
},
socialTransferDeliveryEnabled() {
return Number(this.transferDeliveryEnabled) !== 0;
},
goodsAmountCalc() {
if (this.isGroupBuy && this.groupItem) {
if(this.groupItem.item.moreBuyData){
@ -975,6 +996,7 @@
this.updateImmediateTimeStr();
this.fetchBaseDeliveryFee();
this.fetchDeliverySwitch();
this.fetchTransferDeliverySwitch();
let pendingWorker = uni.getStorageSync('pendingAssignWorker');
if (pendingWorker) {
uni.removeStorageSync('pendingAssignWorker');
@ -1251,6 +1273,96 @@
}
return false;
},
fetchTransferDeliverySwitch() {
if (!this.isTargetSocialDeliveryRegion) return Promise.resolve(true);
const regionId = this.getCurrentRegionId();
if (!regionId) {
this.transferDeliveryEnabled = 1;
this.transferDeliverySwitchChecked = true;
return Promise.resolve(true);
}
return this.tui.request('/app/shopArea/transferDeliverySwitch/get', 'GET', {
regionId: regionId
}, false, true).then((res) => {
if (res.code == 200 || res.success) {
this.transferDeliveryEnabled = res.result == null ? 1 : Number(res.result);
} else {
this.transferDeliveryEnabled = 1;
}
this.transferDeliverySwitchChecked = true;
this.syncSocialDestinationByTransferSwitch();
return true;
}).catch(() => {
this.transferDeliveryEnabled = 1;
this.transferDeliverySwitchChecked = true;
this.syncSocialDestinationByTransferSwitch();
return true;
});
},
syncSocialDestinationByTransferSwitch() {
if (!this.isTargetSocialDeliveryRegion || this.socialTransferDeliveryEnabled) {
if (this.useSocialDeliveryChoice && this.socialDeliveryDestination === 'gate') {
this.fetchGateLocations();
}
return;
}
if (this.socialDeliveryDestination !== 'gate') {
this.socialDeliveryDestination = 'gate';
this.assignedWorker = null;
if (this.useSocialDeliveryChoice) {
this.applySocialDeliveryDefaults();
this.refreshDeliveryTimeByModeChange();
}
}
if (this.useSocialDeliveryChoice) {
this.fetchGateLocations();
}
},
fetchGateLocations() {
if (!this.useSocialDeliveryChoice) return Promise.resolve([]);
const shopId = this.shopItem.id || this.shopItem.shopId;
if (!shopId) return Promise.resolve([]);
if (this.gateLocationLoaded && this.gateLocationShopId === String(shopId)) {
return Promise.resolve(this.gateLocations);
}
return this.tui.request('/app/shop/gateLocation/list', 'GET', {
shopId: shopId
}, false, true).then((res) => {
const list = (res.code == 200 || res.success) && Array.isArray(res.result) ? res.result : [];
this.gateLocations = list;
this.gateLocationShopId = String(shopId);
this.gateLocationLoaded = true;
if (this.selectedGateLocationId && !list.some(item => String(item.id) === String(this.selectedGateLocationId))) {
this.selectedGateLocationId = '';
this.selectedGateLocationName = '';
}
return list;
}).catch(() => {
this.gateLocationLoaded = false;
return [];
});
},
isGateLocationSelected(item) {
return !!item && String(this.selectedGateLocationId) === String(item.id);
},
selectGateLocation(item) {
if (!item) return;
this.selectedGateLocationId = item.id;
this.selectedGateLocationName = item.locationName || '';
},
async ensureGateLocationSelected() {
if (!(this.useSocialDeliveryChoice && this.socialDeliveryDestination === 'gate')) return true;
await this.fetchGateLocations();
if (!this.gateLocations.length) {
this.tui.toast('商家暂未设置送达地点');
return false;
}
if (!this.selectedGateLocationName) {
this.tui.toast('请选择送达地点');
return false;
}
return true;
},
fetchDeliverySwitch() {
if (!this.shouldCheckDeliverySwitch()) return Promise.resolve(true);
const regionId = this.getCurrentRegionId();
@ -1319,7 +1431,13 @@
return;
}
this.isPaotui = true;
if (this.isTargetSocialDeliveryRegion && this.transferDeliverySwitchChecked && !this.socialTransferDeliveryEnabled) {
this.socialDeliveryDestination = 'gate';
}
this.applySocialDeliveryDefaults();
if (this.useSocialDeliveryChoice && this.socialDeliveryDestination === 'gate') {
this.fetchGateLocations();
}
this.fetchCoupons();
},
switchToStoreMode() {
@ -1536,11 +1654,21 @@
return;
}
if (this.isTargetSocialDeliveryRegion && this.transferDeliverySwitchChecked && !this.socialTransferDeliveryEnabled) {
this.socialDeliveryDestination = 'gate';
}
if (this.isSocialArea && this.isPaotui) {
this.applySocialDeliveryDefaults();
}
if (this.useSocialDeliveryChoice && !isJoiningFaceToFace) {
if (!this.transferDeliverySwitchChecked) {
await this.fetchTransferDeliverySwitch();
}
if (!this.socialTransferDeliveryEnabled && this.socialDeliveryDestination !== 'gate') {
this.socialDeliveryDestination = 'gate';
this.applySocialDeliveryDefaults();
}
if (this.socialDeliveryDestination === 'dorm' && this.shopItem.supportTransferDelivery != 1) {
this.tui.toast('中转配送配置不完整,请联系商家');
return;
@ -1549,6 +1677,9 @@
this.tui.toast('商家自配送配置不完整,请联系商家');
return;
}
if (this.socialDeliveryDestination === 'gate' && !(await this.ensureGateLocationSelected())) {
return;
}
}
if (this.isPaotui && this.selected === 'buzhiding' && !isJoiningFaceToFace) {
@ -1673,12 +1804,17 @@
this.refreshDeliveryTimeByModeChange();
},
checkSocialDeliveryDestination(type) {
if (type === this.socialDeliveryDestination) return;
if (!this.socialTransferDeliveryEnabled && type === 'dorm') return;
if (type === this.socialDeliveryDestination) {
if (type === 'gate') this.fetchGateLocations();
return;
}
this.socialDeliveryDestination = type;
this.assignedWorker = null;
this.applySocialDeliveryDefaults();
this.refreshDeliveryTimeByModeChange();
this.fetchCoupons();
if (type === 'gate') this.fetchGateLocations();
},
wxPayment() {
let that = this;
@ -1819,6 +1955,13 @@
}
return name;
},
buildSubmitRemark() {
const remark = this.remark || '';
if (this.useSocialDeliveryChoice && this.socialDeliveryDestination === 'gate' && this.selectedGateLocationName) {
return remark ? remark + '-' + this.selectedGateLocationName : this.selectedGateLocationName;
}
return remark;
},
submitOrderToBackend() {
if (this.isCreatingOrder) return;
this.isCreatingOrder = true;
@ -1865,7 +2008,7 @@
deliveryType: deliveryType,
isPack: this.isStoreGroupOrder ? 0 : (this.isPaotui ? 1 : this.isPack),
packageFee: this.packageFee,
remark: this.remark,
remark: this.buildSubmitRemark(),
items: items,
receiverName: this.formData.address ? this.formData.address.receiverName : '',
receiverPhone: this.formData.address ? this.formData.address.phone : '',
@ -2749,6 +2892,39 @@
box-shadow: 0 12rpx 26rpx rgba(11, 155, 115, 0.2);
}
.gate-location-panel {
margin-top: 18rpx;
padding-top: 18rpx;
border-top: 1rpx solid #f0f3f2;
}
.gate-location-title {
margin-bottom: 12rpx;
color: #66716d;
font-size: 24rpx;
font-weight: 700;
line-height: 36rpx;
}
.gate-location-empty {
color: #ff5722;
font-size: 24rpx;
line-height: 40rpx;
}
.gate-location-item {
display: flex;
align-items: center;
min-height: 64rpx;
font-size: 28rpx;
font-weight: 700;
line-height: 40rpx;
}
.gate-location-item + .gate-location-item {
margin-top: 8rpx;
}
.worker-entry {
width: 50%;
color: $muted;

Loading…
Cancel
Save