fix: 修复多商户优惠券选择异常和空指针问题
1. 新增coupon_list数组类型校验避免渲染异常 2. 重构优惠券选择逻辑,使用merch_id隔离选中状态避免多商户污染 3. 增加orderCreateData.coupon的类型兜底处理,防止非对象/数组类型报错 4. 修复优惠券弹窗选中状态同步逻辑,保留用户已选优惠券
This commit is contained in:
@@ -234,7 +234,7 @@
|
||||
<view class="order-cell coupon" v-if="modules.indexOf('coupon') != -1">
|
||||
<text class="tit">{{ $lang('order.payment.orderMoney.coupon') }}</text>
|
||||
<view class="box text-overflow"@click="openSiteCoupon(calculateGoodsData.merch_id)">
|
||||
<template v-if="orderCreateData.coupon[calculateGoodsData.merch_id].coupon_id">
|
||||
<template v-if="(orderCreateData.coupon && orderCreateData.coupon[calculateGoodsData.merch_id] && orderCreateData.coupon[calculateGoodsData.merch_id].coupon_id)">
|
||||
<text class="money price-font" style="max-width: 100%;">{{ $lang('order.payment.orderMoney.couponSelected', { count: 1 }) }}</text>
|
||||
<!-- <text class="unit price-font">优惠</text>
|
||||
<text class="money price-font">{{ (calculateData && calculateData.coupon_money ? calculateData.coupon_money : 0) | moneyFormat }}</text> -->
|
||||
@@ -550,7 +550,7 @@
|
||||
<view v-if="couponItem.type == 'discount' && couponItem.discount_limit > 0" class="limit">{{ $lang('order.payment.couponPopup.maxDiscount', { amount: couponItem.discount_limit }) }}</view>
|
||||
<view class="time font-size-goods-tag">{{ $lang('order.payment.couponPopup.validPeriod') }}{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : $lang('order.payment.couponPopup.permanentValid') }}</view>
|
||||
</view>
|
||||
<view class="iconfont" :class="selectCouponId == couponItem.coupon_id ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></view>
|
||||
<view class="iconfont" :class="selectCouponMap[merchCoupon.merch_id] == couponItem.coupon_id ? 'icon-yuan_checked color-base-text' : 'icon-yuan_checkbox'"></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -55,7 +55,8 @@ export default {
|
||||
merch_id: 0,
|
||||
data: []
|
||||
},
|
||||
selectCouponId:0
|
||||
// 按 merch_id 隔离,避免多商户之间互相污染
|
||||
selectCouponMap: {}
|
||||
}
|
||||
},
|
||||
inject: ['promotion'],
|
||||
@@ -85,7 +86,7 @@ export default {
|
||||
goodsData() {
|
||||
if (this.paymentData) {
|
||||
this.paymentData.goods_list.forEach(item => {
|
||||
if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
|
||||
if (item.sku_spec_format && typeof item.sku_spec_format === 'string') item.sku_spec_format = JSON.parse(item.sku_spec_format);
|
||||
})
|
||||
return this.paymentData;
|
||||
}
|
||||
@@ -93,7 +94,7 @@ export default {
|
||||
calculateGoodsData() {
|
||||
if (this.calculateData) {
|
||||
this.calculateData.goods_list.forEach(item => {
|
||||
if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
|
||||
if (item.sku_spec_format && typeof item.sku_spec_format === 'string') item.sku_spec_format = JSON.parse(item.sku_spec_format);
|
||||
})
|
||||
return this.calculateData;
|
||||
}
|
||||
@@ -189,7 +190,7 @@ export default {
|
||||
//多商户商品分类
|
||||
goodsSpecFormat(goods_list){
|
||||
goods_list.forEach(item => {
|
||||
if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
|
||||
if (item.sku_spec_format && typeof item.sku_spec_format === 'string') item.sku_spec_format = JSON.parse(item.sku_spec_format);
|
||||
})
|
||||
return goods_list
|
||||
},
|
||||
@@ -249,7 +250,11 @@ export default {
|
||||
this.modules = data.modules;
|
||||
|
||||
//记录多商户优惠券
|
||||
this.orderCreateData.coupon = data.coupon
|
||||
// 兜底为对象,避免后续被当作数组处理
|
||||
if (!data.coupon || typeof data.coupon !== 'object' || Array.isArray(data.coupon)) {
|
||||
data.coupon = {};
|
||||
}
|
||||
this.orderCreateData.coupon = data.coupon;
|
||||
|
||||
//查询优惠券
|
||||
this.getCouponList();
|
||||
@@ -365,7 +370,17 @@ export default {
|
||||
}
|
||||
});
|
||||
//多商户
|
||||
this.orderCreateData.coupon = res.data.coupon
|
||||
// 保留用户已选的 coupon_id,后端回传的 res.data.coupon 默认都是 0 会覆盖掉
|
||||
const prevCoupon = (this.orderCreateData.coupon && typeof this.orderCreateData.coupon === 'object' && !Array.isArray(this.orderCreateData.coupon)) ? this.orderCreateData.coupon : {};
|
||||
this.orderCreateData.coupon = res.data.coupon || {};
|
||||
if (this.orderCreateData.coupon && typeof this.orderCreateData.coupon === 'object' && !Array.isArray(this.orderCreateData.coupon)) {
|
||||
Object.keys(prevCoupon).forEach(merch_id => {
|
||||
const chosen = prevCoupon[merch_id] && prevCoupon[merch_id].coupon_id;
|
||||
if (chosen && (!this.orderCreateData.coupon[merch_id] || !this.orderCreateData.coupon[merch_id].coupon_id)) {
|
||||
this.orderCreateData.coupon[merch_id] = { coupon_id: chosen };
|
||||
}
|
||||
});
|
||||
}
|
||||
// if (!res.data.coupon_id) this.orderCreateData.coupon.coupon_id = 0;
|
||||
// else this.orderCreateData.coupon.coupon_id = res.data.coupon_id;
|
||||
|
||||
@@ -731,44 +746,52 @@ export default {
|
||||
this.tempData = null;
|
||||
},
|
||||
//优惠券单独多商户
|
||||
/**
|
||||
* 显示店铺优惠券信息
|
||||
* @param {Object} siteId
|
||||
* @param {Object} couponData
|
||||
*/
|
||||
openSiteCoupon(merch_id) {
|
||||
|
||||
this.tempData = this.$util.deepClone(this.orderCreateData);
|
||||
this.merchCoupon.merch_id = merch_id;
|
||||
this.selectCouponId = this.orderCreateData.coupon[merch_id].coupon_id;
|
||||
// this.selectCouponMoney = this.orderCreateData.coupon[siteId].coupon_money;
|
||||
|
||||
this.merchCoupon.data = this.coupon_list[merch_id];
|
||||
this.$refs.couponPopup.open();
|
||||
this.$forceUpdate();
|
||||
},
|
||||
/**商户选择券*/
|
||||
selectCoupon(data,merch_id) {
|
||||
|
||||
// if (this.orderCreateData.coupon[merch_id].coupon_id == data.coupon_id){
|
||||
// this.orderCreateData.coupon[merch_id].coupon_id = 0
|
||||
// }else{
|
||||
// this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
|
||||
// };
|
||||
if (this.selectCouponId != data.coupon_id) {
|
||||
this.selectCouponId = data.coupon_id;
|
||||
} else {
|
||||
this.selectCouponId = 0;
|
||||
}
|
||||
this.$forceUpdate();
|
||||
// this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
|
||||
},
|
||||
//确定使用优惠券
|
||||
useCpopon() {
|
||||
this.orderCreateData.coupon[this.merchCoupon.merch_id].coupon_id = this.selectCouponId;
|
||||
this.$refs.couponPopup.close();
|
||||
this.calculate();
|
||||
},
|
||||
/**
|
||||
* 显示店铺优惠券信息
|
||||
* @param {Object} siteId
|
||||
* @param {Object} couponData
|
||||
*/
|
||||
openSiteCoupon(merch_id) {
|
||||
|
||||
this.tempData = this.$util.deepClone(this.orderCreateData);
|
||||
this.merchCoupon.merch_id = merch_id;
|
||||
// 从当前订单已选的 coupon_id 取值,没有则取弹窗里缓存的,再没有为 0
|
||||
const exist = this.orderCreateData.coupon && this.orderCreateData.coupon[merch_id];
|
||||
const cached = this.selectCouponMap[merch_id] || 0;
|
||||
this.selectCouponMap[merch_id] = exist ? (exist.coupon_id || 0) : cached;
|
||||
// this.selectCouponMoney = this.orderCreateData.coupon[siteId].coupon_money;
|
||||
|
||||
// 兜底: 列表为空时给一个空数组,弹窗不会渲染空指针
|
||||
this.merchCoupon.data = (this.coupon_list && this.coupon_list[merch_id]) || [];
|
||||
this.$refs.couponPopup.open();
|
||||
this.$forceUpdate();
|
||||
},
|
||||
/**商户选择券*/
|
||||
selectCoupon(data, merch_id) {
|
||||
|
||||
// if (this.orderCreateData.coupon[merch_id].coupon_id == data.coupon_id){
|
||||
// this.orderCreateData.coupon[merch_id].coupon_id = 0
|
||||
// }else{
|
||||
// this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
|
||||
// };
|
||||
const cur = this.selectCouponMap[merch_id] || 0;
|
||||
this.selectCouponMap[merch_id] = (cur != data.coupon_id) ? data.coupon_id : 0;
|
||||
this.$forceUpdate();
|
||||
// this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
|
||||
},
|
||||
//确定使用优惠券
|
||||
useCpopon() {
|
||||
const merch_id = this.merchCoupon.merch_id;
|
||||
// 确保 orderCreateData.coupon 是对象结构,后端按 merch_id 取值
|
||||
if (!this.orderCreateData.coupon || typeof this.orderCreateData.coupon !== 'object' || Array.isArray(this.orderCreateData.coupon)) {
|
||||
this.orderCreateData.coupon = {};
|
||||
}
|
||||
this.orderCreateData.coupon[merch_id] = {
|
||||
coupon_id: this.selectCouponMap[merch_id] || 0
|
||||
};
|
||||
this.$refs.couponPopup.close();
|
||||
this.calculate();
|
||||
},
|
||||
|
||||
//-------------------
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user