feat(worker-platform): 分类标识改为系统自动生成并在前端UI隐藏

This commit is contained in:
yml2213
2026-09-13 14:25:51 +08:00
parent abccecf8ed
commit aba508f4f6
4 changed files with 151 additions and 29 deletions
@@ -1,9 +1,11 @@
import {
countWorkCategoryUsages,
createWorkCategory,
deleteWorkCategory,
getWorkCategoryById,
getWorkCategoryByKey,
listAllWorkCategories,
updateWorkCategoryById,
upsertWorkCategory,
} from '../../repositories/worker-platform/work-category-repo.js'
import {
@@ -69,12 +71,25 @@ export async function listAdminWorkCategories() {
return { items: (await listAllWorkCategories()).map(mapWorkCategory) }
}
async function generateUniqueCategoryKey(): Promise<string> {
for (let i = 0; i < 10; i++) {
const key = `cat_${Date.now().toString(36)}_${randomId('', 3)}`
const existing = await getWorkCategoryByKey(key)
if (!existing) {
return key
}
}
return `cat_${Date.now().toString(36)}_${randomId('', 6)}`
}
export async function saveAdminWorkCategory(payload: JsonObject = {}) {
const now = nowIso()
const categoryKey = normalizeSlugKey(
payload.categoryKey || payload.category_key || payload.name,
DEFAULT_CATEGORY_KEY,
)
const rawCategoryId = payload.categoryId ?? payload.category_id ?? payload.id
const categoryId =
rawCategoryId !== undefined && rawCategoryId !== null && String(rawCategoryId).trim() !== ''
? Number(rawCategoryId)
: null
const name = String(payload.name || '').trim() || '默认分类'
const rawParentId = payload.parentId ?? payload.parent_id
const parentId =
@@ -87,6 +102,8 @@ export async function saveAdminWorkCategory(payload: JsonObject = {}) {
: payload.icon_url !== undefined
? String(payload.icon_url || '').trim() || null
: null
const sortOrder = normalizeInteger(payload.sortOrder ?? payload.sort_order, 100)
const status = normalizeEnabledStatus(payload.status)
if (parentId) {
const parent = await getWorkCategoryById(parentId)
@@ -96,7 +113,7 @@ export async function saveAdminWorkCategory(payload: JsonObject = {}) {
errorCode: 'parent_category_not_found',
})
}
if (parent.category_key === categoryKey) {
if (categoryId && parent.id === categoryId) {
throw createHttpError('上级分类不能是当前分类自身', {
statusCode: 400,
errorCode: 'invalid_parent_category',
@@ -110,26 +127,80 @@ export async function saveAdminWorkCategory(payload: JsonObject = {}) {
}
}
const existing = await getWorkCategoryByKey(categoryKey)
if (existing && parentId) {
const usages = await countWorkCategoryUsages(existing.id)
if (usages.childCategoryCount > 0) {
throw createHttpError('该分类下已有子分类,无法再作为二级分类', {
statusCode: 400,
errorCode: 'category_has_children',
// 编辑已有分类
if (categoryId) {
const existing = await getWorkCategoryById(categoryId)
if (!existing) {
throw createHttpError('分类不存在', {
statusCode: 404,
errorCode: 'work_category_not_found',
})
}
if (parentId) {
const usages = await countWorkCategoryUsages(existing.id)
if (usages.childCategoryCount > 0) {
throw createHttpError('该分类下已有子分类,无法再作为二级分类', {
statusCode: 400,
errorCode: 'category_has_children',
})
}
}
const category = await updateWorkCategoryById(categoryId, {
name,
parentId,
iconUrl,
sortOrder,
status,
now,
})
if (!category) {
throw createHttpError('分类更新失败', {
statusCode: 500,
errorCode: 'category_update_failed',
})
}
return { category: mapWorkCategory(category) }
}
// 创建新分类:系统自动生成全局唯一 categoryKey,无需用户手动填写
let categoryKey = ''
const providedKey = String(payload.categoryKey || payload.category_key || '').trim()
if (providedKey) {
const normalizedKey = normalizeSlugKey(providedKey, '')
if (normalizedKey) {
const existingWithKey = await getWorkCategoryByKey(normalizedKey)
if (existingWithKey) {
throw createHttpError('分类标识已存在,请勿重复创建', {
statusCode: 400,
errorCode: 'category_key_conflict',
})
}
categoryKey = normalizedKey
}
}
const category = await upsertWorkCategory({
if (!categoryKey) {
categoryKey = await generateUniqueCategoryKey()
}
const category = await createWorkCategory({
categoryKey,
name,
parentId,
iconUrl,
sortOrder: normalizeInteger(payload.sortOrder ?? payload.sort_order, 100),
status: normalizeEnabledStatus(payload.status),
sortOrder,
status,
now,
})
if (!category) {
throw createHttpError('创建分类失败', {
statusCode: 500,
errorCode: 'category_create_failed',
})
}
return { category: mapWorkCategory(category) }
}