feat: 物品规则支持按数量计价(二次匹配SKU文字数量)
- 规则新增单价(unit_price_fen,0 关闭),开启后接单总价 = 单价 × 商品名称文字中的规格数量 - 新增 resolveSkuNameQuantity:支持阿拉伯数字与中文数字(如 指挥官秘钥15个 → 15、三个 → 3) - 建单同步时按文字数量计算奖励,skuQuantity 记入工单 material.source 便于核对 - 规则表单新增计价方式(固定金额/按数量×单价),列表展示单价 - 新增 3 个数量解析单元测试(269 全通过)
This commit is contained in:
@@ -22,6 +22,7 @@ import {
|
||||
InputNumber,
|
||||
Modal,
|
||||
Popconfirm,
|
||||
Radio,
|
||||
Select,
|
||||
Space,
|
||||
Statistic,
|
||||
@@ -114,6 +115,8 @@ export default function ProductRulesPanel() {
|
||||
rewardAmount?: number
|
||||
requiredDepositAmount?: number
|
||||
depositThresholdAmount?: number
|
||||
pricingMode?: string
|
||||
unitPrice?: number
|
||||
sharingEnabled?: boolean
|
||||
sharingTotalQuantity?: number
|
||||
sharingUnitReward?: number
|
||||
@@ -123,11 +126,15 @@ export default function ProductRulesPanel() {
|
||||
fieldsText?: string
|
||||
enabled?: boolean
|
||||
autoCreate?: boolean
|
||||
sortOrder?: number
|
||||
}) {
|
||||
try {
|
||||
const unitMode = values.pricingMode === 'unit'
|
||||
const { pricingMode: _pricingMode, ...payload } = values
|
||||
await saveAdminWorkProductRule({
|
||||
...values,
|
||||
...payload,
|
||||
ruleId: editingRule?.ruleId,
|
||||
unitPrice: unitMode ? Number(values.unitPrice || 0) : 0,
|
||||
})
|
||||
message.success(editingRule ? '物品规则已更新' : '物品规则已创建')
|
||||
resetRuleForm()
|
||||
@@ -160,7 +167,9 @@ export default function ProductRulesPanel() {
|
||||
productName: rule.productName,
|
||||
matchType: rule.matchType,
|
||||
categoryId: rule.categoryId || undefined,
|
||||
pricingMode: rule.unitPriceFen > 0 ? 'unit' : 'fixed',
|
||||
rewardAmount: rule.rewardAmount / 100,
|
||||
unitPrice: rule.unitPriceFen / 100,
|
||||
requiredDepositAmount: rule.requiredDepositAmount / 100,
|
||||
depositThresholdAmount: rule.depositThresholdAmount / 100,
|
||||
sharingEnabled: rule.sharing?.enabled || false,
|
||||
@@ -250,8 +259,17 @@ export default function ProductRulesPanel() {
|
||||
{ title: '分类', width: 140, render: (_, row) => row.categoryName || '-' },
|
||||
{
|
||||
title: '接单金额',
|
||||
width: 120,
|
||||
render: (_, row) => formatMoney(row.rewardAmount),
|
||||
width: 150,
|
||||
render: (_, row) => (
|
||||
<div className="cell-stack">
|
||||
<span>{formatMoney(row.rewardAmount)}</span>
|
||||
{row.unitPriceFen > 0 ? (
|
||||
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
||||
按数量计价:{formatMoney(row.unitPriceFen)} × 数量
|
||||
</Typography.Text>
|
||||
) : null}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '押金',
|
||||
@@ -333,6 +351,7 @@ export default function ProductRulesPanel() {
|
||||
initialValues={{
|
||||
platform: 'kuaishou',
|
||||
matchType: 'contains',
|
||||
pricingMode: 'fixed',
|
||||
rewardAmount: 25,
|
||||
depositThresholdAmount: 200,
|
||||
enabled: true,
|
||||
@@ -405,14 +424,47 @@ export default function ProductRulesPanel() {
|
||||
)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="接单金额" name="rewardAmount">
|
||||
<InputNumber
|
||||
min={0.01}
|
||||
step={1}
|
||||
addonAfter="元"
|
||||
<Form.Item
|
||||
label="计价方式"
|
||||
name="pricingMode"
|
||||
tooltip="按数量计价时,接单总价 = 单价 × 商品名称文字中的规格数量(如「指挥官秘钥15个」→ 15)"
|
||||
>
|
||||
<Radio.Group
|
||||
className="full-width"
|
||||
options={[
|
||||
{ value: 'fixed', label: '固定金额' },
|
||||
{ value: 'unit', label: '按数量 × 单价' },
|
||||
]}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item noStyle shouldUpdate>
|
||||
{({ getFieldValue }) =>
|
||||
getFieldValue('pricingMode') === 'unit' ? (
|
||||
<Form.Item
|
||||
label="单价"
|
||||
name="unitPrice"
|
||||
rules={[{ required: true, message: '请填写单价' }]}
|
||||
extra="接单总价 = 单价 × 商品名称文字中的数量"
|
||||
>
|
||||
<InputNumber
|
||||
min={0.01}
|
||||
step={1}
|
||||
addonAfter="元"
|
||||
className="full-width"
|
||||
/>
|
||||
</Form.Item>
|
||||
) : (
|
||||
<Form.Item label="接单金额" name="rewardAmount">
|
||||
<InputNumber
|
||||
min={0.01}
|
||||
step={1}
|
||||
addonAfter="元"
|
||||
className="full-width"
|
||||
/>
|
||||
</Form.Item>
|
||||
)
|
||||
}
|
||||
</Form.Item>
|
||||
<Form.Item label="押金阈值" name="depositThresholdAmount">
|
||||
<InputNumber
|
||||
min={0}
|
||||
|
||||
@@ -99,6 +99,7 @@ export function saveAdminWorkProductRule(payload: {
|
||||
enabled?: boolean
|
||||
autoCreate?: boolean
|
||||
rewardAmount?: number
|
||||
unitPrice?: number
|
||||
requiredDepositAmount?: number
|
||||
depositThresholdAmount?: number
|
||||
sharingEnabled?: boolean
|
||||
|
||||
@@ -147,6 +147,7 @@ export type WorkProductRule = {
|
||||
enabled: boolean
|
||||
autoCreate: boolean
|
||||
rewardAmount: number
|
||||
unitPriceFen: number
|
||||
requiredDepositAmount: number
|
||||
depositThresholdAmount: number
|
||||
sharing?: WorkOrderSharingConfig
|
||||
|
||||
Reference in New Issue
Block a user