接单平台等级 CRUD 完善,修复默认分类停用被重置
- 等级面板支持编辑、启用/停用切换、删除(默认等级与使用中等级受保护) - 新增等级删除接口及使用量校验 - 修复默认分类停用后被 ensureWorkerPlatformDefaults 重置为启用的问题,默认分类仅不存在时创建 - 分类操作后改为显式刷新列表
This commit is contained in:
@@ -323,6 +323,22 @@ export async function upsertWorkerLevel(input: {
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
export async function countWorkerLevelUsages(levelId: number | string): Promise<number> {
|
||||
const result = await query<{ total: number }>(
|
||||
'SELECT COUNT(*)::int AS total FROM worker_users WHERE level_id = $1',
|
||||
[Number(levelId)],
|
||||
)
|
||||
return Number(result.rows[0]?.total || 0)
|
||||
}
|
||||
|
||||
export async function deleteWorkerLevel(levelId: number | string): Promise<{ deleted: boolean }> {
|
||||
const result = await query<{ id: number }>(
|
||||
'DELETE FROM worker_levels WHERE id = $1 RETURNING id',
|
||||
[Number(levelId)],
|
||||
)
|
||||
return { deleted: Boolean(result.rows[0]) }
|
||||
}
|
||||
|
||||
export async function getWorkerUserByUsername(username: string): Promise<WorkerUserRow | null> {
|
||||
const result = await query<WorkerUserRow>(
|
||||
`${WORKER_USER_SELECT} WHERE wu.username = $1 LIMIT 1`,
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
creditAdminWorkerWallet,
|
||||
createAdminMockWorkOrder,
|
||||
deleteAdminWorkCategory,
|
||||
deleteAdminWorkerLevel,
|
||||
getAdminWorkerFinanceConfig,
|
||||
getAdminWorkerPlatformSummary,
|
||||
listAdminWorkerFinanceRequests,
|
||||
@@ -65,6 +66,22 @@ router.post(
|
||||
}),
|
||||
)
|
||||
|
||||
router.delete(
|
||||
'/worker-platform/levels/:levelId',
|
||||
requireAdminRoles(['admin']),
|
||||
createJsonHandler((req) => deleteAdminWorkerLevel(String(req.params.levelId || '')), {
|
||||
successMessage: '接单等级已删除',
|
||||
errorMessage: '删除接单等级失败',
|
||||
scope: '[admin/worker-platform/levels/:levelId]',
|
||||
audit: (_req, data) => ({
|
||||
action: 'worker_level_deleted',
|
||||
targetType: 'worker_level',
|
||||
targetId: String(_req.params.levelId || ''),
|
||||
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
||||
}),
|
||||
}),
|
||||
)
|
||||
|
||||
router.get(
|
||||
'/worker-platform/categories',
|
||||
requireAdminRoles(['admin', 'operator', 'support']),
|
||||
|
||||
@@ -10,14 +10,17 @@ import {
|
||||
countWorkerAcceptedOrders,
|
||||
countWorkerActiveOrders,
|
||||
countWorkCategoryUsages,
|
||||
countWorkerLevelUsages,
|
||||
createWorkOrder,
|
||||
createWorkOrderEvent,
|
||||
createWorkerFinanceRequest,
|
||||
createWorkerUser,
|
||||
deleteWorkCategory,
|
||||
deleteWorkerLevel,
|
||||
getWorkerFinanceRequestById,
|
||||
getWorkerFinanceRequestSummary,
|
||||
getWorkCategoryById,
|
||||
getWorkCategoryByKey,
|
||||
getWorkerLevelById,
|
||||
getWorkerLevelByKey,
|
||||
getWorkerUserByInviteCode,
|
||||
@@ -110,13 +113,16 @@ export async function ensureWorkerPlatformDefaults() {
|
||||
}),
|
||||
now,
|
||||
}))
|
||||
const category = await upsertWorkCategory({
|
||||
categoryKey: DEFAULT_CATEGORY_KEY,
|
||||
name: '默认分类',
|
||||
sortOrder: 100,
|
||||
status: 'active',
|
||||
now,
|
||||
})
|
||||
const existingCategory = await getWorkCategoryByKey(DEFAULT_CATEGORY_KEY)
|
||||
const category =
|
||||
existingCategory ||
|
||||
(await upsertWorkCategory({
|
||||
categoryKey: DEFAULT_CATEGORY_KEY,
|
||||
name: '默认分类',
|
||||
sortOrder: 100,
|
||||
status: 'active',
|
||||
now,
|
||||
}))
|
||||
return { level, category }
|
||||
}
|
||||
|
||||
@@ -933,6 +939,31 @@ export async function saveAdminWorkerLevel(payload: JsonObject = {}) {
|
||||
return { level: mapWorkerLevel(level) }
|
||||
}
|
||||
|
||||
export async function deleteAdminWorkerLevel(levelId: number | string) {
|
||||
const level = await getWorkerLevelById(Number(levelId))
|
||||
if (!level) {
|
||||
throw createHttpError('等级不存在', {
|
||||
statusCode: 404,
|
||||
errorCode: 'worker_level_not_found',
|
||||
})
|
||||
}
|
||||
if (level.level_key === DEFAULT_LEVEL_KEY) {
|
||||
throw createHttpError('默认等级(VIP1)不可删除', {
|
||||
statusCode: 409,
|
||||
errorCode: 'worker_level_default_protected',
|
||||
})
|
||||
}
|
||||
const usageCount = await countWorkerLevelUsages(Number(levelId))
|
||||
if (usageCount > 0) {
|
||||
throw createHttpError(`该等级正在被 ${usageCount} 名打手使用,请先调整打手等级后再删除`, {
|
||||
statusCode: 409,
|
||||
errorCode: 'worker_level_in_use',
|
||||
})
|
||||
}
|
||||
const { deleted } = await deleteWorkerLevel(Number(levelId))
|
||||
return { deleted }
|
||||
}
|
||||
|
||||
export async function listAdminWorkProductRules(query: JsonObject = {}) {
|
||||
await ensureWorkerPlatformDefaults()
|
||||
const enabledValue = String(query.enabled ?? '').trim()
|
||||
|
||||
Reference in New Issue
Block a user