188 lines
6.4 KiB
TypeScript
188 lines
6.4 KiB
TypeScript
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
|