current_total_price 全链路(超详细版)
1. 业务定义(一句话)
⚡⚡⚡ current_total_price 是中间展示口径,等于商品小计加运费(current_subtotal_price + current_shipping_price),仅用于购物车/结账页展示,不参与订单应付金额计算。
2. 与 total_price 的本质区别
| 对比维度 | current_total_price | total_price |
|---|---|---|
| 计算公式 | subtotal + shipping | subtotal + shipping + tax + coupon + promotion + tip + payment + insurance + offer |
| 参与字段数 | 2项 | 9项 |
| 参与 total_price 汇总 | ❌ 否,仅展示 | ✅ 是,最终应付金额 |
| 用途 | 购物车/结账页实时预览 | 支付、对账、退款口径 |
| 含税 | ❌ 否 | ✅ 含税 |
| 含优惠 | ❌ 否 | ✅ 含优惠扣减 |
⚡⚡⚡ 两者不是层层递进关系,current_total_price 是「商品+运费」的粗略预览,total_price 是含全部费用的最终应付额。
3. 核心入口
// OrderService.php:renew 中
$current_total_price = $current_subtotal_price + $current_shipping_price;在 renew 方法中计算后写入 o_order.current_total_price,但不参与 total_price 的汇总。
4. 字段输出结构
| 字段 | 类型 | 含义 | 示例 |
|---|---|---|---|
o_order.current_total_price | float | 中间展示总价 | 265.00 |
o_order.current_subtotal_price | float | 商品小计 | 250.00 |
o_order.current_shipping_price | float | 运费 | 15.00 |
5. 边界场景说明
5.1 运费为 0
current_total_price == current_subtotal_price(与 subtotal 完全相同)。
5.2 自提/无需配送
current_shipping_price = 0,current_total_price 纯商品额。
5.3 切换地址导致运费变化
renew 重算后 current_shipping_price 变化,current_total_price 同步更新,展示给买家。
5.4 优惠券不影响 current_total_price
优惠券(coupon)和活动(promotion)在 current_total_price 公式中没有位置,只出现在 total_price 中。
6. 关键代码索引
| 逻辑 | 文件:行号 |
|---|---|
| current_total_price 计算与写回 | OrderService.php:renew |
| 参与字段 subtotal | OrderService.php:2271 |
| 参与字段 shipping | OrderService.php:2272 |
7. 设计矛盾记录(2026-06-16)
7.1 矛盾现象
current_total_price 与同系列 current_* 字段口径不一致:
| 字段 | 是否为用户货币值 | 是否参与 total_price 汇总 |
|---|---|---|
current_subtotal_price | ✅ 已通过 currencyExchange 转用户货币 | ✅ |
current_shipping_price | ✅ 已通过 currencyExchange 转用户货币 | ✅ |
current_tax_price | ✅ 用户货币 | ✅ |
current_promotion_price | ✅ 用户货币 | ✅ |
current_coupon_price | ✅ 用户货币 | ✅ |
current_total_price | ❌ 只等于 subtotal + shipping | ❌ 仅展示,不参与汇总 |
同系列字段全部是用户货币值且参与 total_price 汇总,唯独 current_total_price 是例外。
7.2 代码证据
CartService.php:742–751 — cart 层 total_price_currency 是完整的 9 项之和:
$return['total_price_currency'] = 0;
$return['total_price_currency'] += $return['subtotal_price_currency'];
$return['total_price_currency'] += $return['shipping_price_currency'] ?? 0;
$return['total_price_currency'] += $return['payment_price_currency'] ?? 0;
$return['total_price_currency'] += $return['tip_price_currency'] ?? 0;
$return['total_price_currency'] += $return['tax_price_currency'] ?? 0;
$return['total_price_currency'] += $return['coupon_price_currency'] ?? 0;
$return['total_price_currency'] += $return['insurance_price_currency'] ?? 0;
$return['total_price_currency'] += $return['promotion_price_currency'] ?? 0;
$return['total_price_currency'] += $return['diy_offer_price_currency'] ?? 0;OrderService.php:2077, 2276 — order 层 current_total_price 只是两数之和:
$current_total_price = $current_subtotal_price + $order['current_shipping_price'];7.3 结论
current_total_price 更像是历史遗留的简化预览字段(只表达商品+运费),没有随业务扩展(tax/coupon/promotion/offer 等字段陆续加入)而同步演进。
Cart 层已有正确的 total_price_currency = 9项之和;Order 层的 current_total_price 和 total_price 是两套独立口径,不存在包含关系。
建议后续审视该字段是否仍有保留必要,或改为与 total_price 口径一致。