售后金额上浮

This commit is contained in:
liu
2026-09-07 23:27:56 +08:00
parent 58c733baa2
commit edf5e42c38
6 changed files with 130 additions and 25 deletions
+52 -20
View File
@@ -86,6 +86,10 @@ const calcUnitRefPrice = (total: number, spec: string): number => {
return Number.isFinite(pack) && pack > 0 ? total / pack : total;
};
/** 售后金额按客户等级上浮折算:实收 = 输入 × (100+percent)/100(两位小数截断,与后端 calcLevelPrice 同口径) */
const calcLevelAmount = (amount: number, percent: number): number =>
Math.trunc(amount * (100 + percent)) / 100;
/**
* 采购单管理(C1 在门店订单页合并生成 / C2-C3 导出 / C4 明细矩阵修改)
* 采购单无独立明细表,明细直接溯源门店订货明细:商品行 × 门店列
@@ -209,17 +213,20 @@ const PurchaseOrderPage: React.FC = () => {
const [billSaving, setBillSaving] = useState(false);
const [billForm] = Form.useForm<{ stores: BillGenerateStoreParams[] }>();
// 弹窗内实时预览:附加金额 = 筐×筐单价 + 托盘×托盘单价;总额 = 商品 + 配送费 + 附加 + 售后金额(可正负)
// 弹窗内实时预览:附加金额 = 筐×筐单价 + 托盘×托盘单价;售后金额 = 输入 × 客户等级上浮比例;总额 = 商品 + 配送费 + 附加 + 售后(可正负)
const watchBillStores = Form.useWatch('stores', billForm) ?? [];
const billPreview = (billPrepare?.stores ?? []).map((row, index) => {
const input = watchBillStores[index] ?? {};
const deliveryFee = Number(input.delivery_fee ?? 0);
const afterSale = Number(input.after_sale ?? 0);
const levelPercent = Number(row.level_percent ?? 0);
const afterSaleInput = Number(input.after_sale ?? 0);
const afterSale = calcLevelAmount(afterSaleInput, levelPercent);
const added =
Number(input.box_num ?? 0) * Number(row.box_price) +
Number(input.tray_num ?? 0) * Number(row.tray_price);
return {
added,
afterSale,
total: Number(row.product_amount) + deliveryFee + added + afterSale,
};
});
@@ -1460,7 +1467,7 @@ const PurchaseOrderPage: React.FC = () => {
{billPrepare && (
<>
<div className="py-2 text-gray-500">
/====
/== 15 1% 15.15
{billAllGenerated ? '该采购单已全部生成账单,仅可查看。' : '生成后采购单中的全部订单将关联到对应门店账单。'}
</div>
<Form form={billForm} layout="vertical" onFinish={handleBillSave}>
@@ -1471,9 +1478,18 @@ const PurchaseOrderPage: React.FC = () => {
<div className="w-40 shrink-0"></div>
<div className="w-28 shrink-0 text-center"></div>
<div className="w-32 shrink-0 text-center"></div>
<div className="w-32 shrink-0 text-center">¥{billPrepare.stores[0]?.box_price ?? '0.00'}/</div>
<div className="w-32 shrink-0 text-center">¥{billPrepare.stores[0]?.tray_price ?? '0.00'}/</div>
<div className="w-36 shrink-0 text-center"></div>
<div className="w-32 shrink-0 text-center">
<div></div>
<div>¥{billPrepare.stores[0]?.box_price ?? '0.00'}/</div>
</div>
<div className="w-32 shrink-0 text-center">
<div></div>
<div>¥{billPrepare.stores[0]?.tray_price ?? '0.00'}/</div>
</div>
<div className="w-50 shrink-0 text-center">
<div></div>
<div></div>
</div>
<div className="w-36 shrink-0 text-center"></div>
<div className="w-28 shrink-0 text-center"></div>
<div className="flex-1 text-center"></div>
@@ -1489,6 +1505,11 @@ const PurchaseOrderPage: React.FC = () => {
{row?.order_count ?? 0}
{billed && <Tag className="ml-1!" color="success"></Tag>}
</div>
<div className="text-xs text-gray-400">
{row?.level_name
? `${row.level_name} +${Number(row.level_percent ?? 0)}%`
: '无等级(不上浮)'}
</div>
</div>
<div className="w-28 shrink-0 text-center">
<Text strong>¥{row?.product_amount ?? '0.00'}</Text>
@@ -1497,7 +1518,7 @@ const PurchaseOrderPage: React.FC = () => {
<Input />
</Form.Item>
<Form.Item
className="m-0! w-32 shrink-0 px-1!"
className="m-0! w-32 shrink-0 px-1! flex justify-center"
name={[field.name, 'delivery_fee']}
rules={[{ required: true, message: '请输入配送费' }]}
>
@@ -1510,7 +1531,7 @@ const PurchaseOrderPage: React.FC = () => {
/>
</Form.Item>
<Form.Item
className="m-0! w-32 shrink-0 px-1!"
className="m-0! w-32 shrink-0 px-1! flex justify-center"
name={[field.name, 'box_num']}
rules={[{ required: true, message: '请输入周转筐数量' }]}
>
@@ -1522,7 +1543,7 @@ const PurchaseOrderPage: React.FC = () => {
/>
</Form.Item>
<Form.Item
className="m-0! w-32 shrink-0 px-1!"
className="m-0! w-32 shrink-0 px-1! flex justify-center"
name={[field.name, 'tray_num']}
rules={[{ required: true, message: '请输入周转托盘数量' }]}
>
@@ -1533,17 +1554,28 @@ const PurchaseOrderPage: React.FC = () => {
placeholder="正压负回"
/>
</Form.Item>
<Form.Item
className="m-0! w-36 shrink-0 px-1!"
name={[field.name, 'after_sale']}
>
<InputNumber
className="w-full"
precision={2}
disabled={billed}
placeholder="可正负,计入总额"
/>
</Form.Item>
<div className="w-50 shrink-0 px-1! flex justify-center">
<Space.Compact block>
<Space.Addon>
{/* 售后金额按客户等级上浮折算预览(实收 = 输入 × (100+上浮%)/100);已生成账单行为存档值不再折算 */}
{(
<div className="text-xs text-orange-500 text-center">
¥{billPreview[field.name]?.afterSale.toFixed(2)}
</div>
)}
</Space.Addon>
<Form.Item className="m-0!" name={[field.name, 'after_sale']}>
<InputNumber
className="w-full"
precision={2}
prefix={'¥'}
disabled={billed}
placeholder="可正负,计入总额"
/>
</Form.Item>
</Space.Compact>
</div>
<Form.Item
className="m-0! w-36 shrink-0 px-1!"
name={[field.name, 'remark']}