接单平台分类管理完善:抢单大厅分类筛选与分类 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
@@ -166,6 +166,7 @@ type ListInput = {
status?: string
keyword?: string
workerId?: number
categoryId?: number
}
type ProductRuleListInput = {
@@ -912,6 +913,14 @@ export async function getWorkCategoryByKey(categoryKey: string): Promise<WorkCat
return result.rows[0] || null
}
export async function getWorkCategoryById(categoryId: number | string): Promise<WorkCategoryRow | null> {
const result = await query<WorkCategoryRow>(
'SELECT * FROM work_categories WHERE id = $1 LIMIT 1',
[Number(categoryId)],
)
return result.rows[0] || null
}
export async function listWorkCategories(): Promise<WorkCategoryRow[]> {
const result = await query<WorkCategoryRow>(
`SELECT * FROM work_categories WHERE status = 'active' ORDER BY sort_order ASC, id ASC`,
@@ -946,6 +955,36 @@ export async function upsertWorkCategory(input: {
return result.rows[0] || null
}
export async function countWorkCategoryUsages(categoryId: number | string): Promise<{
workOrderCount: number
productRuleCount: number
}> {
const [orders, rules] = await Promise.all([
query<{ total: number }>(
'SELECT COUNT(*)::int AS total FROM work_orders WHERE category_id = $1',
[Number(categoryId)],
),
query<{ total: number }>(
'SELECT COUNT(*)::int AS total FROM work_product_rules WHERE category_id = $1',
[Number(categoryId)],
),
])
return {
workOrderCount: Number(orders.rows[0]?.total || 0),
productRuleCount: Number(rules.rows[0]?.total || 0),
}
}
export async function deleteWorkCategory(
categoryId: number | string,
): Promise<{ deleted: boolean }> {
const result = await query<{ id: number }>(
'DELETE FROM work_categories WHERE id = $1 RETURNING id',
[Number(categoryId)],
)
return { deleted: Boolean(result.rows[0]) }
}
export async function listWorkProductRules({
enabled = null,
keyword = '',
@@ -1123,8 +1162,14 @@ export async function listWorkOrders({
status = '',
keyword = '',
workerId = 0,
categoryId = 0,
}: ListInput = {}): Promise<{ items: WorkOrderRow[]; total: number }> {
const { whereClause, params } = buildWorkOrderWhere({ status, keyword, workerId })
const { whereClause, params } = buildWorkOrderWhere({
status,
keyword,
workerId,
categoryId,
})
const totalResult = await query<{ total: number }>(
`
SELECT COUNT(*)::int AS total
@@ -1713,7 +1758,12 @@ function buildWorkerUserWhere({
}
}
function buildWorkOrderWhere({ status = '', keyword = '', workerId = 0 }: ListInput) {
function buildWorkOrderWhere({
status = '',
keyword = '',
workerId = 0,
categoryId = 0,
}: ListInput) {
const filters: string[] = []
const params: unknown[] = []
if (status) {
@@ -1730,6 +1780,10 @@ function buildWorkOrderWhere({ status = '', keyword = '', workerId = 0 }: ListIn
params.push(workerId)
filters.push(`wo.assigned_worker_id = $${params.length}`)
}
if (categoryId) {
params.push(categoryId)
filters.push(`wo.category_id = $${params.length}`)
}
return {
whereClause: filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '',
params,