优化快手接单匹配

This commit is contained in:
yml2213
2026-08-18 10:06:01 +08:00
parent fe569fe75a
commit c6e9a9b962
14 changed files with 665 additions and 142 deletions
@@ -30,6 +30,7 @@ import {
deleteAdminWorkProductRule,
fetchAdminWorkCategories,
fetchAdminWorkProductRules,
reprocessAdminKuaishouWorkOrderMatches,
saveAdminWorkProductRule,
} from '@/services/admin'
import type { CollectField, WorkProductRule } from '@/types/worker-platform'
@@ -92,12 +93,19 @@ export default function ProductRulesPanel() {
skuCode: rule.skuCode,
productName: rule.productName,
matchType: rule.matchType,
sellerId: rule.match.sellerId,
itemId: rule.match.itemId,
relItemId: rule.match.relItemId,
skuId: rule.match.skuId,
relSkuId: rule.match.relSkuId,
itemTitle: rule.match.itemTitle,
skuNick: rule.match.skuNick,
itemTitleMatchType: rule.match.itemTitleMatchType,
skuNickMatchType: rule.match.skuNickMatchType,
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,
sharingTotalQuantity: rule.sharing?.totalQuantity || 1,
sharingUnitReward: (rule.sharing?.unitReward || 0) / 100,
@@ -121,10 +129,17 @@ export default function ProductRulesPanel() {
skuCode?: string
productName?: string
matchType?: string
sellerId?: string
itemId?: string
relItemId?: string
skuId?: string
relSkuId?: string
itemTitle?: string
skuNick?: string
itemTitleMatchType?: 'contains' | 'exact'
skuNickMatchType?: 'contains' | 'exact'
categoryId?: number
rewardAmount?: number
requiredDepositAmount?: number
depositThresholdAmount?: number
pricingMode?: string
unitPrice?: number
sharingEnabled?: boolean
@@ -172,11 +187,10 @@ export default function ProductRulesPanel() {
skuCode: rule.skuCode,
productName: rule.productName,
matchType: rule.matchType,
...rule.match,
categoryId: rule.categoryId || undefined,
rewardAmount: rule.rewardAmount / 100,
unitPrice: rule.unitPriceFen / 100,
requiredDepositAmount: rule.requiredDepositAmount / 100,
depositThresholdAmount: rule.depositThresholdAmount / 100,
sharingEnabled: rule.sharing?.enabled || false,
sharingTotalQuantity: rule.sharing?.totalQuantity || 1,
sharingUnitReward: (rule.sharing?.unitReward || 0) / 100,
@@ -213,6 +227,23 @@ export default function ProductRulesPanel() {
}
}
async function reprocessKuaishouOrders() {
try {
const response = await reprocessAdminKuaishouWorkOrderMatches()
const result = response.data
message.success(
`已扫描 ${result.scannedCount} 笔快手订单,新增 ${result.createdCount} 个接单工单`,
)
await Promise.all([
queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-product-rules'] }),
queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-summary'] }),
queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-orders'] }),
])
} catch (error) {
message.error(error instanceof Error ? error.message : '快手订单重匹配失败')
}
}
function syncSharingRuleForm(next: {
sharingTotalQuantity?: number
sharingUnitReward?: number
@@ -239,11 +270,18 @@ export default function ProductRulesPanel() {
{
title: '规则 / 商品',
key: 'rule',
width: '24%',
width: '29%',
render: (_, row) => (
<div className="cell-stack">
<Typography.Text strong title={row.productName || row.skuCode}>
{row.productName || row.skuCode || row.ruleKey}
<Typography.Text
strong
title={row.match.skuNick || row.match.itemTitle || row.productName || row.skuCode}
>
{row.match.skuNick ||
row.match.itemTitle ||
row.productName ||
row.skuCode ||
row.ruleKey}
</Typography.Text>
<Space size={4} wrap style={{ marginTop: 2 }}>
<Tag color="blue" style={{ margin: 0, fontSize: 11, lineHeight: '18px' }}>
@@ -255,6 +293,11 @@ export default function ProductRulesPanel() {
</Typography.Text>
) : null}
</Space>
{row.match.itemTitle || row.match.skuNick ? (
<Typography.Text type="secondary" ellipsis={{ tooltip: true }} style={{ fontSize: 11 }}>
{[row.match.itemTitle, row.match.skuNick].filter(Boolean).join(' / ')}
</Typography.Text>
) : null}
</div>
),
},
@@ -318,20 +361,10 @@ export default function ProductRulesPanel() {
</div>
),
},
{
title: '押金',
key: 'deposit',
width: '9%',
render: (_, row) => (
<Typography.Text type={row.requiredDepositAmount > 0 ? undefined : 'secondary'}>
{formatMoney(row.requiredDepositAmount)}
</Typography.Text>
),
},
{
title: '匹配',
dataIndex: 'matchType',
width: '7%',
width: '8%',
render: (value) => (
<Tag color={value === 'exact' ? 'blue' : 'orange'} style={{ margin: 0 }}>
{value === 'exact' ? '精确' : '包含'}
@@ -434,9 +467,10 @@ export default function ProductRulesPanel() {
initialValues={{
platform: 'kuaishou',
matchType: 'contains',
itemTitleMatchType: 'exact',
skuNickMatchType: 'exact',
pricingMode: 'fixed',
rewardAmount: 25,
depositThresholdAmount: 200,
enabled: true,
autoCreate: false,
sharingEnabled: false,
@@ -483,7 +517,53 @@ export default function ProductRulesPanel() {
</Form.Item>
<Form.Item label="商品名称" name="productName" className="span-2">
<Input placeholder="用于包含/精确匹配商品" />
<Input placeholder="旧规则兼容字段;快手订单请配置下方大标题和 SKU" />
</Form.Item>
<Form.Item label="快手大标题" name="itemTitle" className="span-2">
<Input placeholder="itemTitle,例如:和平精英密钥……" />
</Form.Item>
<Form.Item label="大标题匹配" name="itemTitleMatchType">
<Select
options={[
{ value: 'exact', label: '精确' },
{ value: 'contains', label: '包含' },
]}
/>
</Form.Item>
<Form.Item label="具体 SKU 名称" name="skuNick">
<Input placeholder="ext.skuNick,例如:1个精英尊尚专属礼盒" />
</Form.Item>
<Form.Item label="SKU 名称匹配" name="skuNickMatchType">
<Select
options={[
{ value: 'exact', label: '精确' },
{ value: 'contains', label: '包含' },
]}
/>
</Form.Item>
<Form.Item label="快手卖家 ID" name="sellerId">
<Input placeholder="sellerId,留空通配" />
</Form.Item>
<Form.Item label="快手商品 ID" name="itemId">
<Input placeholder="itemId,精确匹配" />
</Form.Item>
<Form.Item label="快手 SKU ID" name="skuId">
<Input placeholder="skuId,精确匹配" />
</Form.Item>
<Form.Item label="关联商品 ID" name="relItemId">
<Input placeholder="ext.relItemId,精确匹配" />
</Form.Item>
<Form.Item label="关联 SKU ID" name="relSkuId">
<Input placeholder="ext.relSkuId,精确匹配" />
</Form.Item>
<Form.Item label="所属分类" name="categoryId">
@@ -532,14 +612,6 @@ export default function ProductRulesPanel() {
<InputNumber min={0} max={9999} className="full-width" />
</Form.Item>
<Form.Item label="押金阈值" name="depositThresholdAmount">
<InputNumber min={0} step={10} addonAfter="元" className="full-width" />
</Form.Item>
<Form.Item label="固定押金" name="requiredDepositAmount">
<InputNumber min={0} step={10} addonAfter="元" className="full-width" />
</Form.Item>
<Form.Item label="任务时限" name="timeoutMinutes">
<InputNumber min={0} step={5} addonAfter="分钟" className="full-width" />
</Form.Item>
@@ -670,6 +742,7 @@ export default function ProductRulesPanel() {
>
</Button>
<Button onClick={reprocessKuaishouOrders}></Button>
<Button type="primary" icon={<PlusOutlined />} onClick={resetRuleForm}>
</Button>