diff --git a/code/fms/fms-vue/src/views/system/module-management/composables/useModuleConfig.js b/code/fms/fms-vue/src/views/system/module-management/composables/useModuleConfig.js index 93fa956a..bb2980cd 100644 --- a/code/fms/fms-vue/src/views/system/module-management/composables/useModuleConfig.js +++ b/code/fms/fms-vue/src/views/system/module-management/composables/useModuleConfig.js @@ -387,6 +387,9 @@ export function useModuleConfig(deps) { const missingListCount = missingConfigCount('listConfig') const missingQueryCount = missingConfigCount('queryConfig') + // 表单设计缺配:启用字段未被 editConfig 任何行引用(b_field_id 口径, + // 不涉及布局细节)。editConfig 同时承载主表表单/子表表格两种编辑方式,口径通用 + const missingEditCount = missingConfigCount('editConfig') return { hasModuleChanges, @@ -398,6 +401,7 @@ export function useModuleConfig(deps) { syncFields, missingListCount, missingQueryCount, + missingEditCount, fillMissingConfigs, } } \ No newline at end of file diff --git a/code/fms/fms-vue/src/views/system/module-management/index.vue b/code/fms/fms-vue/src/views/system/module-management/index.vue index ef071f2f..c8fa8bed 100644 --- a/code/fms/fms-vue/src/views/system/module-management/index.vue +++ b/code/fms/fms-vue/src/views/system/module-management/index.vue @@ -143,7 +143,13 @@ const configGroups = computed(() => { // 界面配置:表单设计(数据模块,含主表表单/子表表格两种编辑方式)→ 列表配置 → 查询配置 const uiItems = [] if (isDataModule.value) { - uiItems.push({ key: 'edit', label: '表单设计', icon: Pencil }) + // 表单设计缺配徽标:启用字段未布局的数量(口径与查询「缺 N」一致) + uiItems.push({ + key: 'edit', + label: '表单设计', + icon: Pencil, + badge: missingEditCount.value ? `缺 ${missingEditCount.value}` : '', + }) } // 列表配置行在加载时自动补全全部启用字段,无「缺失」概念,不带徽标 uiItems.push({ key: 'list', label: '列表配置', icon: List }) @@ -318,6 +324,7 @@ const { syncFields, dirtySections, missingQueryCount, + missingEditCount, fillMissingConfigs, } = useModuleConfig({ moduleSelectedId, diff --git a/code/fms/fms-vue/tests/unit/module-dirty-sections.spec.js b/code/fms/fms-vue/tests/unit/module-dirty-sections.spec.js index 49d38287..dfec5e8b 100644 --- a/code/fms/fms-vue/tests/unit/module-dirty-sections.spec.js +++ b/code/fms/fms-vue/tests/unit/module-dirty-sections.spec.js @@ -136,3 +136,40 @@ describe('useModuleConfig 脏检查', () => { expect(api.hasModuleChanges.value).toBe(false) }) }) + +describe('useModuleConfig 缺配统计(表单设计徽标)', () => { + function configWith(fields, editConfig) { + return { module: { b_id: '1', b_module_type: 'data' }, fields, groups: [], listConfig: [], editConfig, queryConfig: [], autoCode: [], powers: [] } + } + + it('启用字段未被 editConfig 引用即计入缺配', () => { + const fields = [ + { b_id: '10', b_field: 'a', b_canuse: 1 }, + { b_id: '11', b_field: 'b', b_canuse: 1 }, + ] + const editConfig = [{ b_id: 'e1', b_field_id: '10' }] + const { missingEditCount } = setup({ drafts: configWith(fields, editConfig), originals: configWith(fields, editConfig) }) + expect(missingEditCount.value).toBe(1) + }) + + it('停用字段不计入缺配', () => { + const fields = [ + { b_id: '10', b_field: 'a', b_canuse: 1 }, + { b_id: '11', b_field: 'b', b_canuse: 0 }, + ] + const { missingEditCount } = setup({ drafts: configWith(fields, []), originals: configWith(fields, []) }) + expect(missingEditCount.value).toBe(1) + }) + + it('b_field_id 与 b_id 类型不一致(数字/字符串)仍按字符串比较', () => { + const fields = [{ b_id: 10, b_field: 'a', b_canuse: 1 }] + const editConfig = [{ b_id: 'e1', b_field_id: '10' }] + const { missingEditCount } = setup({ drafts: configWith(fields, editConfig), originals: configWith(fields, editConfig) }) + expect(missingEditCount.value).toBe(0) + }) + + it('无字段时缺配为 0(新建模块空态不显示徽标)', () => { + const { missingEditCount } = setup({ drafts: configWith([], []), originals: configWith([], []) }) + expect(missingEditCount.value).toBe(0) + }) +})