diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue
index 870f4dd..583df6a 100644
--- a/frontend/src/views/Settings.vue
+++ b/frontend/src/views/Settings.vue
@@ -90,20 +90,24 @@
- 大分类用于设置可接单部门限制,子分类继承大分类的部门设置。单价分值支持小数(如0.35)
+ 支持三级分类:一级分类(顶级) → 二级分类(设置接单部门) → 三级分类(设置单价分值)。三级分类继承二级分类的部门设置。
@@ -115,32 +119,38 @@
:pagination="{ pageSize: 20 }"
>
-
+
+ 一级
+ 二级
+ 三级
+
+
{{ record.parentName || '--' }}
- 大分类
+ --
-
- └
+
+ └
{{ record.name || '--' }}
- {{ record.unitScore ?? '--' }}
+ {{ record.unitScore ?? '--' }}
--
- {{ record.estimatedHours ?? '--' }}
+ {{ record.estimatedHours ?? '--' }}
--
-
+
{{ getDeptNamesFromIds(record.allowedDeptIds) }}
所有接单部门
- 继承大分类
+ 继承二级
+ --
编辑
- 添加子分类
+ 添加二级
+
+
+ 添加三级
删除
@@ -1169,15 +1187,15 @@
width="600px"
>
-
-
+
+
@@ -1186,12 +1204,29 @@
+
+
+
+
+ {{ getLevel2DisplayName(parent) }}
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
- 选择父级部门会自动包含所有子部门。子分类会继承大分类的部门设置。
+ 选择父级部门会自动包含所有子部门。三级分类会继承此设置。
-
-
+
+
- 子分类将继承大分类的可接单部门设置
+ 一级分类是顶级分类,用于组织二级分类
+
+
+
+
+
+
+ 三级分类将继承二级分类的可接单部门设置
@@ -1950,7 +1992,7 @@ const defaultDepartmentForm = (): DepartmentForm => ({
})
const formData = reactive({
- demandType: {} as Partial & { departmentIds?: number[], isSubType?: boolean },
+ demandType: {} as Partial & { departmentIds?: number[], addLevel?: string },
taskSubType: {} as Partial,
brand: {} as Partial,
platform: {} as Partial,
@@ -2069,11 +2111,35 @@ const receivingDepartments = computed(() => {
return departments.value.filter(dept => dept.deptType === 'receiving')
})
-// 大分类列表(parentId为null的需求类型)
-const parentDemandTypes = computed(() => {
+// 一级分类列表(parentId为null的需求类型)
+const level1DemandTypes = computed(() => {
return demandTypes.value.filter(dt => !dt.parentId)
})
+// 二级分类列表(父级是一级分类的)
+const level2DemandTypes = computed(() => {
+ const level1Ids = level1DemandTypes.value.map(dt => dt.id)
+ return demandTypes.value.filter(dt => dt.parentId && level1Ids.includes(dt.parentId))
+})
+
+// 三级分类列表(父级是二级分类的)
+const level3DemandTypes = computed(() => {
+ const level2Ids = level2DemandTypes.value.map(dt => dt.id)
+ return demandTypes.value.filter(dt => dt.parentId && level2Ids.includes(dt.parentId))
+})
+
+// 兼容旧代码
+const parentDemandTypes = level2DemandTypes
+
+// 获取需求类型的层级
+const getDemandTypeLevel = (record: DemandType): number => {
+ if (!record.parentId) return 1
+ const parent = demandTypes.value.find(dt => dt.id === record.parentId)
+ if (!parent) return 1
+ if (!parent.parentId) return 2
+ return 3
+}
+
// 扁平化的部门选项(带层级显示)
const flatDepartmentOptions = computed(() => {
const receiving = departments.value.filter(dept => dept.deptType === 'receiving')
@@ -2142,9 +2208,20 @@ const getDeptNamesFromIds = (idsStr: string) => {
// 获取需求类型弹窗标题
const getDemandTypeModalTitle = () => {
if (editingItem.value) {
- return formData.demandType.parentId ? '编辑子分类' : '编辑大分类'
+ const level = getDemandTypeLevel(editingItem.value as DemandType)
+ if (level === 1) return '编辑一级分类'
+ if (level === 2) return '编辑二级分类'
+ return '编辑三级分类'
}
- return formData.demandType.isSubType ? '添加子分类' : '添加大分类'
+ if (formData.demandType.addLevel === 'level1') return '添加一级分类'
+ if (formData.demandType.addLevel === 'level2') return '添加二级分类'
+ return '添加三级分类'
+}
+
+// 获取二级分类的显示名称(包含一级分类)
+const getLevel2DisplayName = (level2: DemandType) => {
+ const level1 = level1DemandTypes.value.find(dt => dt.id === level2.parentId)
+ return level1 ? `${level1.name} / ${level2.name}` : level2.name
}
const leaderOptions = computed(() =>
@@ -2176,14 +2253,15 @@ const getLimitPeriodLabel = (value?: string) => {
// 表格列定义
const demandTypeColumns = [
{ title: 'ID', dataIndex: 'id', key: 'id', width: 60 },
- { title: '分类', key: 'parentName', width: 100 },
+ { title: '级别', key: 'level', width: 70 },
+ { title: '上级', key: 'parentName', width: 100 },
{ title: '类型名称', dataIndex: 'name', key: 'name' },
{ title: '单价分值', dataIndex: 'unitScore', key: 'unitScore', width: 100 },
- { title: '预计时长(h)', dataIndex: 'estimatedHours', key: 'estimatedHours', width: 110 },
+ { title: '预计时长(h)', dataIndex: 'estimatedHours', key: 'estimatedHours', width: 100 },
{ title: '可接单部门', key: 'allowedDepts', ellipsis: true },
{ title: '排序', dataIndex: 'sortOrder', key: 'sortOrder', width: 60 },
- { title: '状态', key: 'status', width: 80 },
- { title: '操作', key: 'actions', width: 200 }
+ { title: '状态', key: 'status', width: 70 },
+ { title: '操作', key: 'actions', width: 220 }
]
const taskSubTypeColumns = [
@@ -2535,20 +2613,20 @@ const showDemandTypeModal = async (item?: DemandType | null, type?: string | nul
const departmentIds = item.allowedDeptIds
? item.allowedDeptIds.split(',').map(id => parseInt(id.trim())).filter(id => !isNaN(id))
: []
+ const level = getDemandTypeLevel(item)
formData.demandType = {
...item,
departmentIds,
- isSubType: !!item.parentId
+ addLevel: level === 1 ? 'level1' : level === 2 ? 'level2' : 'level3'
}
} else {
// 新建模式
- const isSubType = type === 'sub'
formData.demandType = {
sortOrder: 0,
isEnabled: 1,
departmentIds: [],
- isSubType,
- parentId: isSubType ? (defaultParentId || null) : null
+ addLevel: type || 'level1',
+ parentId: defaultParentId || null
}
}
@@ -2627,14 +2705,16 @@ const closeModal = (type: string) => {
// 保存操作
const saveDemandType = async () => {
try {
- // 子分类必须选择父级
- if (formData.demandType.isSubType && !formData.demandType.parentId) {
- message.error('请选择所属大分类')
+ const addLevel = formData.demandType.addLevel || 'level1'
+
+ // 二级、三级分类必须选择父级
+ if ((addLevel === 'level2' || addLevel === 'level3') && !formData.demandType.parentId) {
+ message.error(addLevel === 'level2' ? '请选择所属一级分类' : '请选择所属二级分类')
return
}
- // 子分类必须填写单价分值
- if (formData.demandType.isSubType && (formData.demandType.unitScore === null || formData.demandType.unitScore === undefined)) {
+ // 三级分类必须填写单价分值
+ if (addLevel === 'level3' && (formData.demandType.unitScore === null || formData.demandType.unitScore === undefined)) {
message.error('请输入单价分值')
return
}
@@ -2642,16 +2722,16 @@ const saveDemandType = async () => {
// 构建保存数据,确保字段名正确
const saveData: Partial = {
name: formData.demandType.name,
- // 大分类不设置单价,子分类才设置
- unitScore: formData.demandType.isSubType ? formData.demandType.unitScore : 0,
- estimatedHours: formData.demandType.isSubType ? formData.demandType.estimatedHours : null,
+ // 只有三级分类设置单价
+ unitScore: addLevel === 'level3' ? formData.demandType.unitScore : 0,
+ estimatedHours: addLevel === 'level3' ? formData.demandType.estimatedHours : null,
description: formData.demandType.description,
sortOrder: formData.demandType.sortOrder ?? 0,
isEnabled: formData.demandType.isEnabled ?? 1,
- // 父级ID(子分类需要设置)
- parentId: formData.demandType.isSubType ? formData.demandType.parentId : null,
- // 将部门ID数组转换为逗号分隔的字符串(仅大分类需要设置)
- allowedDeptIds: !formData.demandType.isSubType && formData.demandType.departmentIds?.length > 0
+ // 父级ID(二级、三级分类需要设置)
+ parentId: (addLevel === 'level2' || addLevel === 'level3') ? formData.demandType.parentId : null,
+ // 将部门ID数组转换为逗号分隔的字符串(仅二级分类需要设置)
+ allowedDeptIds: addLevel === 'level2' && formData.demandType.departmentIds?.length > 0
? formData.demandType.departmentIds.join(',')
: null
}