feat(consignment): 支持多数量拆分与份额级赠送,并对齐待抢单看板
- 匹配引擎支持一条库存按剩余数量拆给多张整单/拼单,份额数量、报酬、分配数量按实际占用计算 - 「我的寄卖」改为按占用单/份额一行 + 剩余库存行,卖家按 allocation/share/workOrder 定位确认加好友与提交凭证 - 解绑/撤销/超时按 allocation 精确回补,修复单绑定字段在多占用下被误清的问题 - 拼单好友赠送改为份额级 friend_added_at / gift_available_at(迁移 146),新增后台按份额确认加好友入口与寄卖赠送列 - 待抢单匹配看板改用新引擎:覆盖全部寄卖分类、拼单余量、精确/非精确/冲突明细,去掉手枪品类写死 - 发布押金改为该提报单全部售出/作废后才释放,避免多件库存分多单时提前退款 - 补齐集成测试与单测:拆分、多占用、份额级独立冷却与凭证、看板新旧引擎对齐
This commit is contained in:
@@ -52,6 +52,7 @@ import VideoPreview, { formatAcceptanceVideoDuration } from '@/components/files/
|
||||
import {
|
||||
acceptAdminWorkOrder,
|
||||
acceptAdminWorkOrderShare,
|
||||
confirmAdminWorkOrderShareFriendAdded,
|
||||
acceptAdminWorkOrders,
|
||||
assignAdminWorkOrderToWorker,
|
||||
cancelAdminWorkOrder,
|
||||
@@ -3734,6 +3735,22 @@ export default function WorkOrdersPanel() {
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '寄卖赠送',
|
||||
width: 120,
|
||||
render: (_, share) => {
|
||||
if (!share.consignmentInventoryId) return '-'
|
||||
if (share.status === 'accepted') return <Tag color="green">已完成</Tag>
|
||||
if (share.status === 'submitted')
|
||||
return <Tag color="processing">待审核</Tag>
|
||||
if (!share.friendAddedAt) return <Tag>待加好友</Tag>
|
||||
const availableAt = Date.parse(String(share.giftAvailableAt || ''))
|
||||
if (Number.isFinite(availableAt) && availableAt > Date.now()) {
|
||||
return <Tag color="orange">冷却中</Tag>
|
||||
}
|
||||
return <Tag color="green">待赠送</Tag>
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '问题',
|
||||
width: 120,
|
||||
@@ -3906,6 +3923,29 @@ export default function WorkOrdersPanel() {
|
||||
)
|
||||
) : null
|
||||
|
||||
const consignmentGiftAction =
|
||||
sharingOrder?.acceptanceMode === 'friend_gift' &&
|
||||
share.consignmentInventoryId &&
|
||||
share.status === 'joined' &&
|
||||
!share.friendAddedAt ? (
|
||||
<Button
|
||||
size="small"
|
||||
title="只确认该卖家的份额,其他卖家的冷却不受影响"
|
||||
onClick={() => {
|
||||
void runAction(
|
||||
() =>
|
||||
confirmAdminWorkOrderShareFriendAdded(
|
||||
sharingOrder.workOrderId,
|
||||
share.shareId,
|
||||
),
|
||||
'已确认该份额加好友,赠送冷却开始',
|
||||
)
|
||||
}}
|
||||
>
|
||||
确认加好友
|
||||
</Button>
|
||||
) : null
|
||||
|
||||
return (
|
||||
<Space size={6} className="admin-share-actions">
|
||||
{share.status === 'submitted' ? (
|
||||
@@ -3969,6 +4009,7 @@ export default function WorkOrdersPanel() {
|
||||
撤份额
|
||||
</Button>
|
||||
) : null}
|
||||
{consignmentGiftAction}
|
||||
{problemAction}
|
||||
</Space>
|
||||
)
|
||||
|
||||
@@ -530,6 +530,14 @@ export default function WorkerConsignmentPage() {
|
||||
return null
|
||||
}
|
||||
|
||||
function resolveActionTarget(item: WorkerConsignmentRecord) {
|
||||
return {
|
||||
workOrderId: item.workOrderId,
|
||||
shareId: item.shareId ?? null,
|
||||
allocationId: item.allocationId ?? null,
|
||||
}
|
||||
}
|
||||
|
||||
function handleConfirmFriend(item: WorkerConsignmentRecord) {
|
||||
const submissionId = resolveActionSubmissionId(item)
|
||||
if (submissionId == null) return
|
||||
@@ -554,7 +562,7 @@ export default function WorkerConsignmentPage() {
|
||||
centered: true,
|
||||
onOk: async () => {
|
||||
try {
|
||||
await confirmWorkerConsignmentFriendAdded(submissionId)
|
||||
await confirmWorkerConsignmentFriendAdded(submissionId, resolveActionTarget(item))
|
||||
message.success('已确认加好友,赠送冷却开始')
|
||||
await myConsignmentsQuery.refetch()
|
||||
} catch (err: any) {
|
||||
@@ -578,7 +586,8 @@ export default function WorkerConsignmentPage() {
|
||||
}
|
||||
|
||||
async function handleEvidenceSubmit() {
|
||||
const submissionId = evidenceItem ? resolveActionSubmissionId(evidenceItem) : null
|
||||
if (!evidenceItem) return
|
||||
const submissionId = resolveActionSubmissionId(evidenceItem)
|
||||
if (submissionId == null) return
|
||||
const urls = evidenceFiles.map((file) => file.url).filter(Boolean)
|
||||
if (urls.length === 0) {
|
||||
@@ -594,7 +603,10 @@ export default function WorkerConsignmentPage() {
|
||||
imageUrls: urls,
|
||||
...(note ? { note } : {}),
|
||||
}
|
||||
await submitWorkerConsignmentGiftEvidence(submissionId, payload)
|
||||
await submitWorkerConsignmentGiftEvidence(submissionId, {
|
||||
...resolveActionTarget(evidenceItem),
|
||||
...payload,
|
||||
})
|
||||
message.success('赠送截图已提交,等待客服验收')
|
||||
closeEvidenceModal()
|
||||
await myConsignmentsQuery.refetch()
|
||||
@@ -1137,7 +1149,7 @@ export default function WorkerConsignmentPage() {
|
||||
<div className="worker-consignment-record-list">
|
||||
{records.map((record) => (
|
||||
<ConsignmentRecordCard
|
||||
key={record.consignmentNo}
|
||||
key={`${record.submissionId ?? 'x'}-${record.inventoryId ?? 'x'}-${record.allocationId ?? 'stock'}-${record.workOrderId ?? 0}`}
|
||||
record={record}
|
||||
now={cooldownNow}
|
||||
onConfirmFriend={handleConfirmFriend}
|
||||
@@ -1526,6 +1538,11 @@ function ConsignmentRecordCard({
|
||||
寄售价{' '}
|
||||
<strong>¥{((record.salePriceFen ?? record.askingPriceFen) / 100).toFixed(2)}</strong>
|
||||
</span>
|
||||
{record.allocationId && Number(record.allocatedQuantity || 0) > 0 ? (
|
||||
<span>
|
||||
本单占用 <strong>{record.allocatedQuantity} 件</strong>
|
||||
</span>
|
||||
) : null}
|
||||
{Number(record.quantity || 1) > 1 ? (
|
||||
<span>
|
||||
数量{' '}
|
||||
|
||||
Reference in New Issue
Block a user