优化快手接单匹配
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user