接单平台分类管理完善:抢单大厅分类筛选与分类 CRUD

- 抢单大厅新增分类 Tab 筛选(仅显示启用分类,支持按分类查询工单)
- 管理端分类面板支持编辑、启用/停用切换、删除(被工单/规则引用时禁止删除)
- 后端工单列表支持 categoryId 筛选,大厅接口返回分类列表
This commit is contained in:
yml2213
2026-08-01 14:59:58 +08:00
parent 8dfe797c25
commit 0369186b18
8 changed files with 234 additions and 15 deletions
@@ -9,12 +9,15 @@ import {
addWorkerWalletCredit,
countWorkerAcceptedOrders,
countWorkerActiveOrders,
countWorkCategoryUsages,
createWorkOrder,
createWorkOrderEvent,
createWorkerFinanceRequest,
createWorkerUser,
deleteWorkCategory,
getWorkerFinanceRequestById,
getWorkerFinanceRequestSummary,
getWorkCategoryById,
getWorkerLevelById,
getWorkerLevelByKey,
getWorkerUserByInviteCode,
@@ -28,6 +31,7 @@ import {
listPendingMaterialWorkOrdersByPlatformOrderId,
listWorkerWalletLedgers,
grabWorkOrder,
listWorkCategories,
listWorkOrders,
listWorkProductRules,
listWorkerLevels,
@@ -627,17 +631,21 @@ export async function listWorkerHallOrders(query: JsonObject = {}, session: Work
requireActiveWorkerSession(session)
const page = normalizePage(query.page)
const pageSize = normalizePageSize(query.pageSize)
const categoryId = normalizeOptionalId(query.categoryId)
const { items, total } = await listWorkOrders({
page,
pageSize,
status: WORK_ORDER_STATUS.OPEN,
keyword: String(query.keyword || '').trim(),
categoryId: categoryId || 0,
})
const worker = await getRequiredWorker(session.workerId)
const permissions = resolveWorkerPermissions(worker)
const categories = (await listWorkCategories()).map(mapWorkCategory)
return {
items: items.map((item) => mapWorkOrderForWorker(item, permissions)),
pagination: { page, pageSize, total },
categories,
}
}
@@ -880,6 +888,28 @@ export async function saveAdminWorkCategory(payload: JsonObject = {}) {
return { category: mapWorkCategory(category) }
}
export async function deleteAdminWorkCategory(categoryId: number | string) {
const category = await getWorkCategoryById(Number(categoryId))
if (!category) {
throw createHttpError('分类不存在', {
statusCode: 404,
errorCode: 'work_category_not_found',
})
}
const usages = await countWorkCategoryUsages(Number(categoryId))
if (usages.workOrderCount > 0 || usages.productRuleCount > 0) {
throw createHttpError(
`该分类已被 ${usages.workOrderCount} 个工单和 ${usages.productRuleCount} 条物品规则使用,无法删除,请先停用`,
{
statusCode: 409,
errorCode: 'work_category_in_use',
},
)
}
const { deleted } = await deleteWorkCategory(Number(categoryId))
return { deleted }
}
export async function saveAdminWorkerLevel(payload: JsonObject = {}) {
const now = nowIso()
const levelKey = String(payload.levelKey || payload.level_key || '').trim() || DEFAULT_LEVEL_KEY