统一智能气阀空归属展示

库房、气站、配送点和用户归属为空时统一显示未填写,保留归属互斥与接口规则,并补充专项检查、中文操作日志及项目文档。
This commit is contained in:
czl231
2026-08-13 21:17:57 +08:00
parent 81920d43e8
commit f8e91fb00a
5 changed files with 95 additions and 1 deletions

View File

@@ -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`:通过,未发现空白符错误。
## 风险评估
仅修改前端展示元数据,不改变数据库、后端接口、历史数据和归属变更业务规则。

View File

@@ -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. 维护指南
智能气阀归属字段应作为同一组维护。调整其中一个字段的空值文案时,应同步检查其余三个字段以及列表、详情和编辑页面。

View File

@@ -23,6 +23,7 @@
"staff-relations:check": "node scripts/check-staff-relation-policy.mjs", "staff-relations:check": "node scripts/check-staff-relation-policy.mjs",
"user-address-display:check": "node scripts/check-user-address-relation-display.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: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", "resource-search:check": "node scripts/check-resource-search.mjs",
"audit:platform": "node scripts/check-backend-contract.mjs", "audit:platform": "node scripts/check-backend-contract.mjs",
"lint": "biome lint .", "lint": "biome lint .",

View File

@@ -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('智能气阀归属展示检查通过:四类空归属统一显示“未填写”。');

View File

@@ -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('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_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_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/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')] }, { 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')] },
]), ]),