centsToYuan($cents); return $price->yuanToCents($yuan, $multiplier); } /** * 套餐清单应付 * * 未绑套餐:应付 = 当前明细合计。 * 已绑套餐:应付 = 套餐价快照 + 当前合计 − 原价快照(删除的套餐行会从原价里扣掉)。 * * @param array $items * @return array{package_amount:int,original_amount:int,diff_amount:int,payable_amount:int,items_amount:int} */ public function listPayable(int $packageId, int $packageAmount, int $originalAmount, array $items): array { $itemsAmount = 0; foreach ($items as $item) { $qty = max(1, (int) ($item['quantity'] ?? 1)); $itemsAmount += (int) ($item['unit_price'] ?? 0) * $qty; } if ($packageId <= 0) { return [ 'package_amount' => 0, 'original_amount' => $itemsAmount, 'diff_amount' => 0, 'payable_amount' => $itemsAmount, 'items_amount' => $itemsAmount, ]; } $payable = max(0, $packageAmount + $itemsAmount - $originalAmount); return [ 'package_amount' => $packageAmount, 'original_amount' => $originalAmount, 'diff_amount' => $payable - $packageAmount, 'payable_amount' => $payable, 'items_amount' => $itemsAmount, ]; } /** * 给金额数组补 *_text 元字段,方便前端直接渲染 * * @param array $amounts * @return array */ public function withText(array $amounts, bool $showPrice = true): array { $price = PriceService::getInstance(); foreach (['package_amount', 'original_amount', 'diff_amount', 'payable_amount', 'items_amount', 'discount_amount'] as $key) { if (!array_key_exists($key, $amounts)) { continue; } $cents = (int) $amounts[$key]; $amounts[$key . '_text'] = $showPrice ? $price->centsToYuan($cents) : PriceService::MASK; } return $amounts; } }