diff --git a/docs/操作日志_智能气阀归属空值展示_20260813.md b/docs/操作日志_智能气阀归属空值展示_20260813.md new file mode 100644 index 0000000..b544e5f --- /dev/null +++ b/docs/操作日志_智能气阀归属空值展示_20260813.md @@ -0,0 +1,37 @@ +# 智能气阀归属空值展示操作日志 + +操作时间:2026-08-13 +操作类型:修改 +影响模块:平台总后台智能气阀管理 + +## 操作前状态 + +智能气阀的库房、气站、配送点和用户归属没有数据时,列表、详情和编辑只读区域使用通用默认文案 `-`,与当前业务页面的“未填写”约定不一致。 + +## 具体操作 + +1. 为四个可选归属字段统一配置空值文案“未填写”。 +2. 保持四个字段的可选关系、接口键和归属互斥规则不变。 +3. 增加专项静态检查,防止后续配置遗漏或回退。 + +## 操作后状态 + +库房、气站、配送点和用户归属没有数据时,在列表、详情及编辑只读展示中统一显示“未填写”。其他字段的空值文案不受影响。 + +## 代码变更 + +- `frontend/platform_admin/src/api/resources.ts`:配置四个归属字段的空值文案。 +- `frontend/platform_admin/scripts/check-product-ownership-display.mjs`:增加归属展示专项检查。 +- `frontend/platform_admin/package.json`:注册专项检查命令。 + +## 验证结果 + +- `npm.cmd run product-ownership-display:check`:通过,四类空归属统一显示“未填写”。 +- `npm.cmd run product-ownership:check`:通过,归属互斥选择行为保持正常。 +- `npm.cmd run resource-pages:check`:通过,详情 46 类、新建 25 类、编辑 23 类。 +- `npm.cmd run build`:通过,TypeScript 类型检查与 Vite 生产构建成功。 +- `git diff --check`:通过,未发现空白符错误。 + +## 风险评估 + +仅修改前端展示元数据,不改变数据库、后端接口、历史数据和归属变更业务规则。 diff --git a/docs/项目文档_智能气阀归属空值展示_v1.0.md b/docs/项目文档_智能气阀归属空值展示_v1.0.md new file mode 100644 index 0000000..937df10 --- /dev/null +++ b/docs/项目文档_智能气阀归属空值展示_v1.0.md @@ -0,0 +1,33 @@ +# 项目文档:智能气阀归属空值展示 v1.0 + +## 1. 项目概述 + +智能气阀的库房、气站、配送点和用户均为可选且互斥的当前归属。未设置的归属统一展示为“未填写”,避免使用含义不明确的横线。 + +## 2. 目录结构说明 + +```text +platforms/ +├── frontend/platform_admin/ +│ ├── src/api/resources.ts +│ └── scripts/check-product-ownership-display.mjs +└── docs/ + ├── 项目文档_智能气阀归属空值展示_v1.0.md + └── 操作日志_智能气阀归属空值展示_20260813.md +``` + +## 3. 核心行为 + +- `warehouse_identity` 空值显示“未填写”。 +- `gas_basic_identity` 空值显示“未填写”。 +- `delivery_basic_identity` 空值显示“未填写”。 +- `user_account_identity` 空值显示“未填写”。 +- 非空关系仍按现有规则显示业务名称或唯一标识。 + +## 4. 接口兼容性 + +前端仍通过四个 identity 字段读取和提交关系,不修改接口字段及数据格式。归属变更继续遵守最多一个当前归属的规则。 + +## 5. 维护指南 + +智能气阀归属字段应作为同一组维护。调整其中一个字段的空值文案时,应同步检查其余三个字段以及列表、详情和编辑页面。 diff --git a/frontend/platform_admin/package.json b/frontend/platform_admin/package.json index c88b1d5..2d63f37 100644 --- a/frontend/platform_admin/package.json +++ b/frontend/platform_admin/package.json @@ -23,6 +23,7 @@ "staff-relations:check": "node scripts/check-staff-relation-policy.mjs", "user-address-display:check": "node scripts/check-user-address-relation-display.mjs", "product-ownership:check": "node scripts/check-product-ownership-action.mjs", + "product-ownership-display:check": "node scripts/check-product-ownership-display.mjs", "resource-search:check": "node scripts/check-resource-search.mjs", "audit:platform": "node scripts/check-backend-contract.mjs", "lint": "biome lint .", diff --git a/frontend/platform_admin/scripts/check-product-ownership-display.mjs b/frontend/platform_admin/scripts/check-product-ownership-display.mjs new file mode 100644 index 0000000..2360308 --- /dev/null +++ b/frontend/platform_admin/scripts/check-product-ownership-display.mjs @@ -0,0 +1,23 @@ +/** + * 功能:检查智能气阀四类可选归属的空值文案保持一致。 + * 版本:v1.0.0 + */ +import { readFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; + +const resourcesUrl = new URL('../src/api/resources.ts', import.meta.url); +const source = await readFile(fileURLToPath(resourcesUrl), 'utf8'); +const ownershipRelations = [ + "relation('warehouse_identity', '/product_warehouse', false, { emptyText: '未填写' })", + "relation('gas_basic_identity', '/gas_basic', false, { emptyText: '未填写' })", + "relation('delivery_basic_identity', '/delivery_basic', false, { emptyText: '未填写' })", + "relation('user_account_identity', '/user_account', false, { emptyText: '未填写' })", +]; + +for (const relation of ownershipRelations) { + if (!source.includes(relation)) { + throw new Error(`智能气阀归属空值文案配置缺失:${relation}`); + } +} + +console.log('智能气阀归属展示检查通过:四类空归属统一显示“未填写”。'); diff --git a/frontend/platform_admin/src/api/resources.ts b/frontend/platform_admin/src/api/resources.ts index e5cd021..55c432a 100644 --- a/frontend/platform_admin/src/api/resources.ts +++ b/frontend/platform_admin/src/api/resources.ts @@ -447,7 +447,7 @@ export const resources: ResourceUiDefinition[] = [ define('producer_account', '生产商管理', 'writable', [f('producer_code', { required: true }), f('name', { required: true }), f('credit_code'), f('principal'), f('phone'), f('address', { emptyText: '未填写', placeholder: '请输入地址' }), f('username', { required: true }), f('password', { required: true }), f('display_name'), producerAdminRole(), f('remark')]), define('product_type', '智能气阀类型', 'editable', [f('code', { required: true }), f('name', { required: true })]), define('product_warehouse', '智能气阀库房', 'editable', [f('code', { required: true }), f('name', { required: true }), f('address', { emptyText: '未填写', placeholder: '请输入地址' }), f('manager'), f('phone')]), - define('product_info', '智能气阀', 'editable', [f('code', { required: true }), f('name', { required: true }), relation('producer_account_identity', '/producer_account', true, { label: '生产商', listLabel: '生产商', listRelationNameOnly: true, displayRelationLabel: true, showIdentityCopy: true, emptyText: '未填写', placeholder: '请选择生产商' }), relation('product_type_identity', '/product_type', true, { label: '智能气阀类型', listLabel: '智能气阀类型', listRelationNameOnly: true, displayRelationLabel: true, showIdentityCopy: true, emptyText: '未填写', placeholder: '请选择智能气阀类型' }), f('params', { required: true }), relation('warehouse_identity', '/product_warehouse'), relation('gas_basic_identity', '/gas_basic'), relation('delivery_basic_identity', '/delivery_basic'), relation('user_account_identity', '/user_account'), f('produced_at', { required: true })], 'list', [ + define('product_info', '智能气阀', 'editable', [f('code', { required: true }), f('name', { required: true }), relation('producer_account_identity', '/producer_account', true, { label: '生产商', listLabel: '生产商', listRelationNameOnly: true, displayRelationLabel: true, showIdentityCopy: true, emptyText: '未填写', placeholder: '请选择生产商' }), relation('product_type_identity', '/product_type', true, { label: '智能气阀类型', listLabel: '智能气阀类型', listRelationNameOnly: true, displayRelationLabel: true, showIdentityCopy: true, emptyText: '未填写', placeholder: '请选择智能气阀类型' }), f('params', { required: true }), relation('warehouse_identity', '/product_warehouse', false, { emptyText: '未填写' }), relation('gas_basic_identity', '/gas_basic', false, { emptyText: '未填写' }), relation('delivery_basic_identity', '/delivery_basic', false, { emptyText: '未填写' }), relation('user_account_identity', '/user_account', false, { emptyText: '未填写' }), f('produced_at', { required: true })], 'list', [ { name: '修改智能气阀状态', resource: '/product_info/:identity/lifecycle', method: 'PATCH', fields: [f('product_status', { required: true, type: 'select', options: [{ label: '待处理', value: 10 }, { label: '在库', value: 28 }, { label: '运输中', value: 29 }, { label: '使用中', value: 30 }, { label: '维修中', value: 31 }, { label: '已报废', value: 27 }] })] }, { name: '变更智能气阀归属', resource: '/product_info/:identity', method: 'PUT', fields: [relation('warehouse_identity', '/product_warehouse'), relation('gas_basic_identity', '/gas_basic'), relation('delivery_basic_identity', '/delivery_basic'), relation('user_account_identity', '/user_account'), f('action', { required: true, type: 'select', options: [{ label: '入库', value: 'warehouse' }, { label: '分配', value: 'assigned' }, { label: '归还', value: 'returned' }, { label: '人工调整', value: 'manual' }] }), f('reason', { required: true }), f('remark')] }, ]),