修复气站合同用户权限与服务关系边界

This commit is contained in:
czl231
2026-08-18 22:49:14 +08:00
parent 61a61f916b
commit 9a31cadf5f
27 changed files with 635 additions and 59 deletions

View File

@@ -168,6 +168,8 @@
用户账户的新建、详情和编辑复用工作人员账户布局,并使用各自独立 URL。用户头像通过受保护资源接口读取不在通用详情响应中暴露头像 URI用户账户列表与平台账户列表沿用工作人员列表的受控缩略图规则。详情页继续展示钱包摘要并可进入钱包独立详情页。
总后台变更或归档用户服务关系时,若原气站仍存在该用户的生效合同、未完成配送订单或未关闭工单,必须拒绝转移并提示先完成相关业务;不得通过先归档关系再新建关系绕过校验。
### 6.4 智能气阀管理
| 资源 | 路径 | 模式 | 已实现能力 |

View File

@@ -87,6 +87,7 @@
### 4.4 用户管理
- 用户账户是平台全局账户;当前气站可管理由总后台分配到本站的用户,也可自行创建用户并在同一事务内建立本站服务关系。
- 支持用户新增、编辑、启停和归档。
- 创建用户时在同一事务内创建其当前气站、当前配送点服务关系。
- 支持当前气站用户地址新增、编辑、启停和归档。
@@ -97,6 +98,8 @@
### 4.5 合同管理
- 配送合同支持创建、草稿编辑、启用、续签和终止。
- 合同列表和详情由合同接口按已保存的签约用户主键返回当前业务名称,不得为了名称展示开放平台用户全集;签约用户记录不存在时显示“签约用户记录已失效”。
- 签约用户已不再属于当前气站时,历史合同仍可查看和终止,但不可编辑、启用、续签、绑定或解绑气瓶,也不可继续创建订单。
- 启用仅适用于草稿合同;已终止合同不得直接启用,只能通过续签填写新的生效时间、到期时间和原因后恢复履约。
- 配送合同创建、草稿编辑和续签必须填写到期时间,且到期时间必须晚于生效时间;历史缺失值应提示补录,不得推测回填。
- 合同只能选择当前气站用户及当前气站配送点。
@@ -162,6 +165,8 @@
- `/staff/add``/gasorder/create` 保留原菜单入口,直接渲染独立新建页。
- 审核、归档确认、重置密码、合同流转、合同气瓶解绑和订单状态动作继续使用短弹窗。
- 详情接口必须校验当前气站数据范围;前端路由隐藏不能替代服务端对象权限。
- 当前服务关系用户可查看完整本站账户上下文;仅被当前气站合同引用的用户只允许查看基础账户详情及该合同保存的本站配送点,不进入本站用户列表,不返回地址和钱包,不允许编辑、重置密码或执行其他账户动作。
- 合同范围用户详情必须同时校验用户业务标识与当前气站合同,不得借此开放平台全局用户查询。
## 6. 菜单输出

View File

@@ -0,0 +1,66 @@
# 气站合同用户权限修复操作日志
操作时间2026-08-18
操作类型:扩展与修复
影响模块:气站配送合同、平台用户服务关系、气站资源列表
## 操作前状态
- 气站合同列表通过本站用户详情接口补载签约用户名称。
- 合同用户已不属于当前气站时,名称补载返回参数错误并显示“名称加载失败”。
- 总后台可在存在未完成履约业务时变更或归档用户服务关系。
- 合同用户转出后,编辑、启用、续签、气瓶绑定和订单创建缺少统一阻断。
## 具体操作
- 合同列表与详情按合同已保存的全局用户主键读取当前业务名称,并随合同响应返回。
- 名称读取始终受合同所属气站范围保护,不新增平台用户全集查询能力。
- 新建合同和订单候选继续限定为与合同气站存在有效服务关系的用户。
- 签约用户转出后,仅保留合同查看和终止能力,阻止其他合同变更及继续履约。
- 总后台变更、归档服务关系前检查生效合同、未完成订单和未关闭工单。
- 未新增字段、未修改表结构、未执行历史数据回填。
- 合同中的用户名称可进入只读账户详情;详情接口必须验证当前气站确实存在引用该用户的合同。
- 合同范围只读详情返回用户基础主档和合同保存的本站配送点,不返回地址、钱包或其他气站服务关系,且前端隐藏编辑、重置密码和全部账户动作入口。
## 操作后状态
- 气站合同列表直接显示签约用户名称,不再请求不属于本站的用户详情。
- 历史合同可以继续识别签约用户;用户记录不存在时显示“签约用户记录已失效”。
- 用户转出后的合同不可继续编辑或履约,仍允许查看和终止。
- 总后台无法通过直接更新、状态归档或删除入口绕过转移阻断。
- 总后台分配合同中的签约用户即使不属于当前气站,也可从合同查看包含该合同配送点的只读账户详情;普通本站用户列表范围保持不变。
## 代码变更
- `backend/api/internal/logic/platform/gasorder/contract_party_display.go`:提供合同签约用户名称和服务关系状态查询。
- `backend/api/internal/logic/platform/gasorder/gasorder.go`:统一合同、绑定、续签和订单创建的用户归属校验。
- `backend/api/internal/logic/gas/gasorder.go`:返回当前气站合同的签约用户显示信息。
- `backend/api/internal/logic/gas/scope.go``user.go`:增加当前气站合同范围用户的只读详情、合同配送点上下文及头像鉴权,写接口仍要求有效服务关系。
- `backend/api/internal/logic/gas/user_test.go`:验证合同用户查询同时受用户标识和当前气站约束。
- `backend/api/internal/logic/platform/user/relation.go`:增加用户跨气站转移和归档阻断。
- `backend/api/internal/routers/platform.go`:为服务关系状态和归档注册业务专用处理器。
- `frontend/gas_admin/src/views/shared/resource-list-field-display.ts`:优先使用合同接口返回的用户名称。
- `frontend/gas_admin/src/views/resource/use-resource-relations.ts`:已有范围内名称时不再补载关联用户。
- `frontend/gas_admin/src/api/resource-page-rules.ts``ResourceRecordPage.vue`:限制用户转出后的合同编辑和动作。
- `frontend/gas_admin/src/api/resource-page-rules.ts``resource-display.ts``ResourceRecordPage.vue``CrudListPage.vue`:传递合同上下文、标记合同范围只读用户,并隐藏编辑、钱包和账户动作。
- `frontend/platform_admin/src` 对应资源页面:同步合同用户名称与转出后的动作限制,保持总后台一致。
## 验证结果
- `go test ./...`:通过,覆盖全部后端包。
- 合同签约用户展示查询与候选范围测试:通过。
- 用户转移的生效合同、未完成订单、未关闭工单及无阻断业务测试:通过。
- `pnpm run type:check`:通过。
- `pnpm run contract:check`通过20 个资源一致。
- `pnpm run resource-pages:check`:通过,详情 20、新建 11、编辑 8。
- `pnpm run build`:通过。
- 平台总后台 `pnpm run type:check``pnpm run resource-pages:check``pnpm run build`:通过。
- 气站合同范围用户详情查询测试:通过;普通服务关系用户详情与写接口范围不变。
## 风险评估
- 名称查询只能从当前合同记录到达一个签约用户,不会扩大气站可枚举的用户范围。
- 历史合同没有名称快照,按“不修改数据库”的约束显示用户当前名称;记录不存在时使用明确失效文案。
- 新增阻断只影响跨气站转移或解除关系,不影响同一气站内调整配送点和服务人员。
- 合同范围详情仅扩展按合同可达的只读路径,不改变用户列表范围;地址、钱包和所有写操作继续要求当前有效服务关系。
- 用户只读详情不展示合同履约内部字段“签约用户仍属当前气站”,统一以“账户权限:仅查看当前合同关联资料”说明访问边界,避免与合同、配送点的气站归属混淆。