import { Router } from 'express' import { confirmWorkerConsignmentFriendAdded, getWorkerConsignmentPriceSuggestion, listWorkerConsignments, publishWorkerConsignment, submitWorkerConsignmentGiftEvidence, updateWorkerConsignmentSalePrice, } from '../../services/worker-platform/consignment-worker-service.js' import { fetchWorkerConsignmentContacts } from '../../services/worker-platform/consignment-contact-service.js' import { listWorkerConsignmentProfiles } from '../../services/worker-platform/consignment-profile-service.js' import { sendRouteError } from '../../utils/http.js' import { getRequiredWorkerSession, requireActiveWorker } from './session.js' const router = Router() /** * GET /api/v1/worker/consignment/profiles * 打手端寄卖页按已发布的分类配置动态生成 tab。 */ router.get('/consignment/profiles', async (req, res) => { try { const session = getRequiredWorkerSession(req) const result = await listWorkerConsignmentProfiles(session.workerId) res.json({ ok: true, data: { profiles: result } }) } catch (error) { sendRouteError(res, error, '获取寄卖配置失败', '[worker/consignment/profiles]') } }) /** * PATCH /api/v1/worker/consignment/items/:submissionId/price * 打手修改在售寄卖售价(仅本人、未售出)。 */ router.patch('/consignment/items/:submissionId/price', requireActiveWorker, async (req, res) => { try { const session = getRequiredWorkerSession(req) const result = await updateWorkerConsignmentSalePrice( session.workerId, String(req.params.submissionId || ''), req.body?.salePriceFen ?? req.body?.priceFen, ) res.json({ ok: true, data: result }) } catch (error) { sendRouteError(res, error, '修改寄卖售价失败', '[worker/consignment/price]') } }) /** * GET /api/v1/worker/consignment/contacts * 打手发布寄卖时的「对接客服」下拉:只返回启用中的名单 */ router.get('/consignment/contacts', async (req, res) => { try { const result = await fetchWorkerConsignmentContacts() res.json({ ok: true, data: result }) } catch (error) { sendRouteError(res, error, '获取对接客服失败', '[worker/consignment/contacts]') } }) /** * 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({ profileId: req.query.profileId, system: req.query.system, series: req.query.series, diamondLevel: req.query.diamondLevel, brillianceCount: req.query.brillianceCount, }) res.json({ ok: true, data: result }) } catch (error) { sendRouteError(res, error, '获取建议价失败', '[worker/consignment/price-suggestion]') } }) /** * POST /api/v1/worker/consignment/price-preview * 动态规格发布时按 profileId + specValues 算价(支持自定义字段与配置价)。 */ router.post('/consignment/price-preview', requireActiveWorker, async (req, res) => { try { const result = await getWorkerConsignmentPriceSuggestion({ profileId: req.body?.profileId, values: req.body?.specValues, }) res.json({ ok: true, data: result }) } catch (error) { sendRouteError(res, error, '获取价格预览失败', '[worker/consignment/price-preview]') } }) /** * GET /api/v1/worker/consignment/my-items?group=&keyword=&page=&pageSize= * 打手查看自己在接单平台寄卖的手枪列表与状态(服务端搜索 + 分组 + 分页) */ router.get('/consignment/my-items', async (req, res) => { try { const session = getRequiredWorkerSession(req) const result = await listWorkerConsignments(session.workerId, { group: normalizeConsignmentGroup(req.query.group), keyword: String(req.query.keyword || ''), page: Number(req.query.page || 1), pageSize: Number(req.query.pageSize || 10), }) res.json({ ok: true, data: result }) } catch (error) { sendRouteError(res, error, '获取我的寄卖列表失败', '[worker/consignment/my-items]') } }) function normalizeConsignmentGroup(value: unknown): 'all' | 'reviewing' | 'active' | 'finished' { const raw = String(value || '').trim() if (raw === 'reviewing' || raw === 'active' || raw === 'finished') return raw return 'all' } /** * 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 || '', { workOrderId: req.body?.workOrderId, shareId: req.body?.shareId, allocationId: req.body?.allocationId, }, ) 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