fix(订单): 确认页商品金额与商品总价按规格原价展示

- 确认接口 priceGroup 增加 sumPrice(规格原价 × 数量),活动订单取活动价
- 下单引擎商品卡片使用规格原价,商品总价使用 sumPrice,等级/会员优惠单独列示
- 旧版确认页商品总价按 sumPrice 展示,修复运费字段名不一致导致的 NaN
- 快递费用显示优惠前金额,会员运费优惠单独展示
This commit is contained in:
吴昊天 2026-10-22 13:19:03 +08:00
parent 944774bd44
commit 96a54240cd
4 changed files with 60 additions and 16 deletions

View File

@ -300,7 +300,8 @@ class CenterOrderController
'pay_price' => $priceData['payPrice'],// 应付金额
'pay_postage' => $priceData['payPostage'],// 配送费
'priceGroup' => [
'totalPrice' => $priceData['totalPrice'],// 订单总金额
'totalPrice' => $priceData['totalPrice'],// 订单总金额(等级/会员优惠后)
'sumPrice' => $priceData['sumPrice'] ?? $priceData['totalPrice'],// 商品原价总额(等级/会员优惠前)
'payPostage' => $priceData['payPostage'],// 配送费
'postageDiscount' => 0,// 配送费优惠
'levelPrice' => $priceData['levelPrice'] ?? 0,// 等级优惠
@ -410,6 +411,8 @@ class CenterOrderController
$giftPrice = $priceGroup['giftPrice'] ?? 0;
$priceData = [
'totalPrice' => $priceGroup['totalPrice'] ?? 0,
// 原价总额:商品规格原价 × 数量之和,供确认页“商品总价”展示
'sumPrice' => $priceGroup['sumPrice'] ?? 0,
'payPrice' => bcadd(
(string)bcadd((string)($priceGroup['totalPrice'] ?? 0), (string)($priceGroup['storePostage'] ?? 0), 2),
(string)$giftPrice,
@ -576,7 +579,8 @@ class CenterOrderController
'pay_price' => $priceData['payPrice'],// 应付金额
'pay_postage' => $priceGroup['storePostage'] ?? 0,// 配送费
'priceGroup' => [
'totalPrice' => $priceGroup['totalPrice'] ?? 0,// 订单总金额
'totalPrice' => $priceGroup['totalPrice'] ?? 0,// 订单总金额(等级/会员优惠后)
'sumPrice' => $priceGroup['sumPrice'] ?? 0,// 商品原价总额(等级/会员优惠前)
'payPostage' => $priceGroup['storePostage'] ?? 0,// 配送费
'postageDiscount' => $priceGroup['storePostageDiscount'] ?? 0,// 配送费优惠
'levelPrice' => $priceGroup['levelPrice'] ?? 0,// 等级优惠
@ -2175,8 +2179,14 @@ class CenterOrderController
}
$totalPrice = bcmul((string)$cartInfo[0]['truePrice'], (string)$cartInfo[0]['cart_num'], 2);
// 活动订单没有等级/会员折扣,原价总额取活动价;普通订单取规格原价
$sumPrice = $isActivityOrder
? $totalPrice
: bcmul((string)($skuInfo['price'] ?? $productInfo['price'] ?? 0), (string)$num, 2);
$priceData = [
'totalPrice' => $totalPrice,
// 规格原价总额(等级/会员优惠前),与 cartInfo[0].sum_price 对齐
'sumPrice' => $sumPrice,
'payPrice' => bcadd($totalPrice, (string)$payPostage, 2),
'payPostage' => $payPostage,
'isStoreFreePostage' => false,

View File

@ -22,7 +22,7 @@
<!-- 运费(仅支持快递配送时显示) -->
<view class="item acea-row row-between-wrapper" v-if="showPostage">
<view>{{ $t(`快递费用`) }}</view>
<view class="money" v-if="!integralTotal && payPostage > 0">¥{{ payPostage }}</view>
<view class="money" v-if="!integralTotal && originalPostage > 0">¥{{ formattedOriginalPostage }}</view>
<view class="money" v-else-if="!integralTotal">{{ $t(`免运费`) }}</view>
<view class="money" v-else>{{ $t(`免运费`) }}</view>
</view>
@ -100,6 +100,16 @@ const formattedDoorPostage = computed(() => {
const v = parseFloat(props.doorPostage || 0);
return isNaN(v) ? '0.00' : v.toFixed(2);
});
/** 快递费用原价 = 优惠后运费 + 会员运费优惠,优惠单独展示在下方 */
const originalPostage = computed(() => {
const pay = parseFloat(props.payPostage || 0);
const discount = parseFloat(props.postageDiscount || 0);
return (isNaN(pay) ? 0 : pay) + (isNaN(discount) ? 0 : discount);
});
/** 快递费用原价格式化:保留两位小数 */
const formattedOriginalPostage = computed(() => originalPostage.value.toFixed(2));
</script>
<style scoped>

View File

@ -46,7 +46,7 @@
:image="(item.productInfo || {}).image"
:name="(item.productInfo || {}).store_name"
:sku-label="getSkuLabel(item)"
:price="item.truePrice"
:price="getOriginalUnitPrice(item)"
:integral-price="isIntegral && idx === 0 ? integralUnitPrice : 0"
:num="item.cart_num"
/>
@ -393,6 +393,21 @@ function getSkuLabel(item) {
if (productInfo.attrInfo && productInfo.attrInfo.suk) return productInfo.attrInfo.suk;
return '';
}
/**
* 商品卡片展示金额:规格原价(活动订单取活动价),不使用 truePrice(等级/会员优惠后单价)
* @param {Object} item 购物车商品项
* @return {string|number} 金额
*/
function getOriginalUnitPrice(item) {
if (!item) return '0.00';
// 活动订单展示活动价,普通订单展示规格原价(truePrice 是等级/会员优惠后单价)
if (item.activity_type && item.activity_type !== 'normal') {
return item.truePrice || item.sum_price || '0.00';
}
var productInfo = item.productInfo || {};
var attrInfo = productInfo.attrInfo || {};
return attrInfo.price || productInfo.price || item.sum_price || item.truePrice || '0.00';
}
/**
* 点击商品卡片跳转对应商品详情页
* @param {Object} item 购物车商品项
@ -445,11 +460,12 @@ async function loadConfirmData() {
var data = res.data || {};
cartInfo.value = data.cartInfo || [];
orderKey.value = data.order_key || '';
totalPrice.value = data.total_price || 0;
payPrice.value = data.pay_price || 0;
payPostage.value = data.pay_postage || 0;
// 确认接口返回 priceGroup,不能只使用顶层金额字段,否则等级/会员折扣会丢失。
var confirmPriceGroup = data.priceGroup || {};
// 商品总价展示规格原价之和(等级/会员优惠前的 sumPrice)
totalPrice.value = confirmPriceGroup.sumPrice ?? data.sum_price ?? data.total_price ?? 0;
payPrice.value = data.pay_price || 0;
payPostage.value = data.pay_postage || 0;
levelPrice.value = confirmPriceGroup.levelPrice ?? data.level_price ?? 0;
memberPrice.value = confirmPriceGroup.memberPrice ?? data.member_price ?? 0;
postageDiscount.value = confirmPriceGroup.postageDiscount ?? data.postage_discount ?? 0;

View File

@ -242,10 +242,10 @@
</view>
</view>
<view class='item acea-row row-between-wrapper'
v-if="priceGroup.payPostage > 0 || priceGroup.payPostageDiscount > 0">
v-if="priceGroup.payPostage > 0 || priceGroup.postageDiscount > 0">
<view>{{$t(`配送运费`)}}:</view>
<view class='money'>
{{$t(`¥`)}}{{(parseFloat(priceGroup.payPostage)+parseFloat(priceGroup.payPostageDiscount)).toFixed(2)}}
{{$t(`¥`)}}{{(parseFloat(priceGroup.payPostage)+parseFloat(priceGroup.postageDiscount)).toFixed(2)}}
</view>
</view>
<view class='item acea-row row-between-wrapper'
@ -258,9 +258,9 @@
<view>{{$t(`付费会员优惠`)}}:</view>
<view class='money'>-{{$t(`¥`)}}{{parseFloat(priceGroup.memberPrice).toFixed(2)}}</view>
</view>
<view class='item acea-row row-between-wrapper' v-if="priceGroup.payPostageDiscount > 0">
<view class='item acea-row row-between-wrapper' v-if="priceGroup.postageDiscount > 0">
<view>{{$t(`会员运费优惠`)}}:</view>
<view class='money'>-{{$t(`¥`)}}{{parseFloat(priceGroup.payPostageDiscount).toFixed(2)}}</view>
<view class='money'>-{{$t(`¥`)}}{{parseFloat(priceGroup.postageDiscount).toFixed(2)}}</view>
</view>
<view class='item acea-row row-between-wrapper' v-if="coupon_price > 0">
<view>{{$t(`优惠券抵扣`)}}:</view>
@ -835,8 +835,8 @@
integral_price.value = result.deduction_price;
coupon_price.value = result.coupon_price;
integral.value = useIntegral.value ? result.SurplusIntegral : usable_integral.value;
priceGroup.value['payPostage'] = shippingTypeLocal == 1 ? 0 : result.pay_postage;
priceGroup.value['postageDiscount'] = result.storePostageDiscount;
priceGroup.value['payPostage'] = shippingTypeLocal == 1 ? 0 : (result.pay_postage ?? 0);
priceGroup.value['postageDiscount'] = result.storePostageDiscount ?? 0;
}
})
}
@ -1064,9 +1064,17 @@
totalPrice.value = util.$h.Add(parseFloat(res.data.priceGroup.totalPrice),
parseFloat(res.data
.priceGroup.payPostage));
allPrice.value = util.$h.Add(parseFloat(res.data.priceGroup.totalPrice),
parseFloat(res.data
.priceGroup.memberPrice)).toFixed(2);
allPrice.value = (() => {
const pg = res.data.priceGroup || {};
// 商品总价展示规格原价之和;sumPrice 缺失时回补等级/会员优惠
const originalTotal = pg.sumPrice !== undefined && pg.sumPrice !== null
? pg.sumPrice
: util.$h.Add(
util.$h.Add(parseFloat(pg.totalPrice || 0), parseFloat(pg.levelPrice || 0)),
parseFloat(pg.memberPrice || 0)
);
return parseFloat(originalTotal).toFixed(2);
})();
seckillId.value = parseInt(res.data.seckill_id);
invoice_func.value = res.data.invoice_func;
special_invoice.value = res.data.special_invoice;