feat(consignment): 一个寄卖单号锚定全流程 + 统一状态机 + 卖家侧确认加好友/提交赠送截图
问题:一件货身上挂着三套互不相通的状态(提报单审核态、仓库库存态、工单赠送态),
my-items 同时返回两个数组、卖家端分两个列表渲染,同一件货显示两行两个号;
且卖家端只映射了前两套状态,"已出库"之后流程就断了,卖家不知道该干什么。
- 提报单号 SUB… 作为唯一「寄卖单号」从发布锚定到结算(零迁移);
listWorkerConsignments 改成一件货一条记录,库存/工单信息挂上去,
客服手工入库的现货(无提报单)才回退用库存号当锚点
- 新增 domain/consignment-item-stage.ts:把三套底层状态推导成卖家看得懂的一个阶段
(待审核/已通过待匹配/已匹配-待加好友/冷却中/待赠送/已赠送待审核/已完成/驳回/作废/取消)
+ 一句"下一步做什么" + 能力位(谁能确认加好友、谁该传截图),列表筛选与 KPI 也改由它驱动
- 卖家侧新增动作(以前只有 publish + my-items,卖家只能干看):
POST /worker/consignment/items/:submissionId/{confirm-friend,gift-evidence}
POST /worker/consignment/inventories/:inventoryId/{confirm-friend,gift-evidence}(手工入库现货)
复用既有工单链路 confirmWorkOrderFriendAdded / submitWorkerOrderAcceptance,
只加归属校验(不是本人履约的订单 403),顺带白拿"冷却没结束不许提交凭证""必须带图"
- 客服端用同一个号:库存列表/详情补 sourceSubmissionNo(LEFT JOIN 提报单),
履约/指派写进工单的寄售信息也带上;关键字搜索支持按寄卖单号搜(计数 SQL 同步补 join)
真实库端到端验证:确认加好友 → gift_phase=friend_countdown / friend_added_at 落库 /
gift_available_at 正好 +72h;冷却期内提交截图被拒(work_order_gift_cooldown_active);
越权操作被拒(consignment_item_not_found);按寄卖单号搜索命中正确。临时数据已清理。
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
import { Router } from 'express'
|
||||
|
||||
import {
|
||||
confirmWorkerConsignmentFriendAdded,
|
||||
confirmWorkerConsignmentInventoryFriendAdded,
|
||||
listWorkerConsignments,
|
||||
publishWorkerConsignment,
|
||||
submitWorkerConsignmentGiftEvidence,
|
||||
submitWorkerConsignmentInventoryGiftEvidence,
|
||||
} from '../../services/worker-platform/consignment-worker-service.js'
|
||||
import { sendRouteError } from '../../utils/http.js'
|
||||
import { getRequiredWorkerSession, requireActiveWorker } from './session.js'
|
||||
@@ -37,4 +41,90 @@ router.get('/consignment/my-items', async (req, res) => {
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* POST /api/v1/worker/consignment/items/:submissionId/confirm-friend
|
||||
* 卖家确认已加好买家好友 → 进入赠送冷却期(确认后未完成赠送押金不退)
|
||||
*/
|
||||
router.post(
|
||||
'/consignment/items/:submissionId/confirm-friend',
|
||||
requireActiveWorker,
|
||||
async (req, res) => {
|
||||
try {
|
||||
const session = getRequiredWorkerSession(req)
|
||||
const result = await confirmWorkerConsignmentFriendAdded(
|
||||
session.workerId,
|
||||
String(req.params.submissionId || ''),
|
||||
session.username || '',
|
||||
)
|
||||
res.json({ ok: true, data: result })
|
||||
} catch (error) {
|
||||
sendRouteError(res, error, '确认加好友失败', '[worker/consignment/confirm-friend]')
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
/**
|
||||
* POST /api/v1/worker/consignment/items/:submissionId/gift-evidence
|
||||
* 卖家上传赠送完成截图,工单转待验收交给客服审核(冷却未结束会被拒绝)
|
||||
*/
|
||||
router.post(
|
||||
'/consignment/items/:submissionId/gift-evidence',
|
||||
requireActiveWorker,
|
||||
async (req, res) => {
|
||||
try {
|
||||
const session = getRequiredWorkerSession(req)
|
||||
const result = await submitWorkerConsignmentGiftEvidence(
|
||||
session.workerId,
|
||||
String(req.params.submissionId || ''),
|
||||
req.body || {},
|
||||
session,
|
||||
)
|
||||
res.json({ ok: true, data: result })
|
||||
} catch (error) {
|
||||
sendRouteError(res, error, '提交赠送截图失败', '[worker/consignment/gift-evidence]')
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
/**
|
||||
* 客服手工入库的现货没有提报单,按库存号走同一套卖家动作。
|
||||
* 单独开路由而不是"一个 id 两义",避免提报单 id 与库存 id 撞号时误操作别人的货。
|
||||
*/
|
||||
router.post(
|
||||
'/consignment/inventories/:inventoryId/confirm-friend',
|
||||
requireActiveWorker,
|
||||
async (req, res) => {
|
||||
try {
|
||||
const session = getRequiredWorkerSession(req)
|
||||
const result = await confirmWorkerConsignmentInventoryFriendAdded(
|
||||
session.workerId,
|
||||
String(req.params.inventoryId || ''),
|
||||
session.username || '',
|
||||
)
|
||||
res.json({ ok: true, data: result })
|
||||
} catch (error) {
|
||||
sendRouteError(res, error, '确认加好友失败', '[worker/consignment/inventory-confirm-friend]')
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/consignment/inventories/:inventoryId/gift-evidence',
|
||||
requireActiveWorker,
|
||||
async (req, res) => {
|
||||
try {
|
||||
const session = getRequiredWorkerSession(req)
|
||||
const result = await submitWorkerConsignmentInventoryGiftEvidence(
|
||||
session.workerId,
|
||||
String(req.params.inventoryId || ''),
|
||||
req.body || {},
|
||||
session,
|
||||
)
|
||||
res.json({ ok: true, data: result })
|
||||
} catch (error) {
|
||||
sendRouteError(res, error, '提交赠送截图失败', '[worker/consignment/inventory-gift-evidence]')
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
Reference in New Issue
Block a user