Files
order_site/apps/backend/src/routes/worker/consignment.ts
T
yml2213 103299a7c9 feat(consignment): 发布寄卖自动从接单模板带出建议价
- 新纯函数 suggestConsignmentPriceFromRules:模板商品名(安卓暗潮1钻)用与
  订单同一套规格解析器拆解,系统+系列+钻级全对上才命中;系统按通配口径
  (模板写通用/双端两端都算,模板没写系统不命中——宁可不建议不给错价);
  多条命中取最高价
- 新端点 GET /worker/consignment/price-suggestion(requireActiveWorker)
- 发布表单规格选齐后 300ms 防抖请求:同规格去重、过期响应丢弃;命中自动
  填入寄售价并提示来源与条数;卖家手改过价只提示不覆盖,换规格重新带出;
  提交成功状态复位;接口失败静默(本地没配模板保持手填,行为不变)
- 建议:本地模板没配不影响任何现有行为,生产库模板越多建议越准

后端 483(+建议价命中/不符排除/取最高/通用模板用例)/ 前端 54 测试全绿
docs/寄卖系统优化方案.md 记录批次 X
2026-09-17 13:14:10 +08:00

106 lines
3.4 KiB
TypeScript

import { Router } from 'express'
import {
confirmWorkerConsignmentFriendAdded,
getWorkerConsignmentPriceSuggestion,
listWorkerConsignments,
publishWorkerConsignment,
submitWorkerConsignmentGiftEvidence,
} from '../../services/worker-platform/consignment-worker-service.js'
import { sendRouteError } from '../../utils/http.js'
import { getRequiredWorkerSession, requireActiveWorker } from './session.js'
const router = Router()
/**
* POST /api/v1/worker/consignment/publish
* 打手在接单平台直接提报苏尔南手枪寄卖
*/
router.post('/consignment/publish', requireActiveWorker, async (req, res) => {
try {
const session = getRequiredWorkerSession(req)
const result = await publishWorkerConsignment(session.workerId, req.body || {})
res.json({ ok: true, data: result })
} catch (error) {
sendRouteError(res, error, '提交寄卖失败', '[worker/consignment/publish]')
}
})
/**
* GET /api/v1/worker/consignment/price-suggestion?system=&series=&diamondLevel=
* 发布寄卖时按规格从「接单模板」带出建议价(安卓+暗潮+1钻 → 模板价 ¥120)
*/
router.get('/consignment/price-suggestion', requireActiveWorker, async (req, res) => {
try {
const result = await getWorkerConsignmentPriceSuggestion({
system: req.query.system,
series: req.query.series,
diamondLevel: req.query.diamondLevel,
})
res.json({ ok: true, data: result })
} catch (error) {
sendRouteError(res, error, '获取建议价失败', '[worker/consignment/price-suggestion]')
}
})
/**
* GET /api/v1/worker/consignment/my-items
* 打手查看自己在接单平台寄卖的手枪列表与状态
*/
router.get('/consignment/my-items', async (req, res) => {
try {
const session = getRequiredWorkerSession(req)
const result = await listWorkerConsignments(session.workerId)
res.json({ ok: true, data: result })
} catch (error) {
sendRouteError(res, error, '获取我的寄卖列表失败', '[worker/consignment/my-items]')
}
})
/**
* 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]')
}
},
)
export default router