修复配送订单创建方合同约束

This commit is contained in:
czl231
2026-08-14 01:15:33 +08:00
parent 9c3abf76d5
commit 08f1a917b3
9 changed files with 407 additions and 26 deletions

View File

@@ -202,7 +202,7 @@
创建订单时必须提交唯一请求号、有效合同、创建方、用户地址、合同气瓶集合、联系人和联系方式。后端根据合同价格和默认配送费计算订单金额,不接受前端自行决定最终金额。
平台创建订单时,创建方类型支持用户、工作人员、配送站和气站创建方候选必须根据已选类型分别加载用户账户、工作人员账户、配送站或气站;未选择类型时禁用创建方字段,切换类型时清空创建方并重新加载候选。候选以用户名或机构名称等业务名称展示,不直接要求管理员识别唯一标识。
平台创建订单时,创建方类型支持用户、工作人员、配送站和气站,但创建方必须受所选配送合同约束。用户、气站和合同指定的配送站由合同自动带出并只读展示;合同未指定配送站时不得选择配送站创建方。工作人员候选仅包含启用账号:合同指定配送站时限定为该气站、该配送站的工作人员,合同未指定配送站时限定为该气站直属工作人员。切换创建方类型或配送合同时必须清空创建方并重新匹配;切换合同还必须清空旧地址和合同气瓶。候选和自动带出值均以业务名称展示,不要求管理员识别唯一标识。服务端必须执行相同的合同归属校验,并对跨合同主体返回明确中文错误。
创建订单页面必须先选择配送合同,收货地址下拉仅展示该合同签约用户的地址。地址选项以完整地址为主文案并标记默认地址;存在默认地址时自动选中,切换合同时清空原地址。若合同用户没有可用地址,页面应明确引导先维护用户地址并禁止提交。

View File

@@ -0,0 +1,62 @@
# 配送订单创建方合同约束 v1.1
## 1. 项目概述
本次修复平台总后台创建气体配送订单时,创建方候选与配送合同相互独立的问题。旧实现允许管理员选择任意用户、气站、配送点或工作人员,错误组合直到提交后才收到泛化参数错误;配送点和工作人员还缺少完整的服务端合同归属校验。
## 2. 业务规则
- 用户创建方只能是合同签约用户,由合同自动带出并只读展示。
- 气站创建方只能是合同签约气站,由合同自动带出并只读展示。
- 配送点创建方只能是合同指定配送点;合同未指定配送点时禁止使用该类型。
- 合同指定配送点时,工作人员候选仅包含同时属于合同气站、合同配送点的启用人员。
- 合同未指定配送点时,工作人员候选仅包含合同气站直属的启用人员。
- 切换配送合同时,收货地址、合同气瓶和原创建方全部清空;保留创建方类型并按新合同重新匹配。
- 平台登录管理员是操作人,不自动作为订单业务创建方。
- 前端候选限制与后端最终校验同时生效,伪造请求不能绕过。
- 本次不修改数据库结构和业务数据。
## 3. 核心文件
- `frontend/platform_admin/src/api/resources.ts`:声明合同上下文、固定主体映射和工作人员组织筛选规则。
- `frontend/platform_admin/src/views/resource/use-resource-relation-linkage.ts`:负责合同切换、主体自动带出、工作人员候选过滤和提交前校验。
- `frontend/platform_admin/src/views/resource/ResourceFieldForm.vue`:在合同或类型未选择时禁用创建方并展示操作引导。
- `frontend/platform_admin/src/views/resource/ResourceRecordPage.vue`:展示合同约束说明,并将合同直接确定的主体设为只读。
- `backend/api/internal/logic/platform/gasorder/gasorder.go`:校验四类创建方与合同的归属关系,并返回安全的中文业务错误。
- `backend/api/internal/logic/platform/gasorder/gasorder_test.go`:覆盖合法组合、跨合同主体、无配送点合同、直属工作人员和停用工作人员。
## 4. 行为变化
| 场景 | 修改前 | 修改后 |
| --- | --- | --- |
| 用户、气站创建方 | 可从全平台候选中选择 | 合同自动带出,只读 |
| 配送点创建方 | 可选择任意配送点 | 仅合同指定配送点;未指定时禁止 |
| 工作人员创建方 | 可选择任意工作人员 | 仅合同履约组织内的启用人员 |
| 切换合同 | 地址、气瓶联动,创建方不联动 | 地址、气瓶、创建方全部重新匹配 |
| 伪造跨合同请求 | 用户和气站部分拦截,配送点和人员缺口 | 四种类型均由服务端拒绝 |
| 错误提示 | 请求参数不正确 | 返回具体的合同归属中文原因 |
## 5. 操作日志
操作时间2026-08-14
操作类型:修复、扩展
影响模块:平台总后台、气体配送订单创建接口
操作前状态:创建方仅按类型加载全平台候选;合同不参与筛选;配送点和工作人员缺少服务端合同一致性校验。
具体操作:扩展动态关系配置以支持合同上下文、固定主体和组织筛选;补充创建页说明、只读展示及切换清理;新增后端四类创建方校验和中文业务错误;增加专项检查与单元测试。
操作后状态:创建方与配送合同保持一致,错误组合无法在正常页面选中,伪造请求也会被后端拒绝。
验证结果执行前端创建方专项检查、TypeScript 类型检查、生产构建及后端 gasorder 单元测试;详细结果以本次提交记录为准。
风险评估:动态合同约束仅在显式配置的订单创建方字段启用,其他动态关系保持原行为;数据库和公共接口字段保持兼容。
## 6. 维护指南
- 新增创建方类型时,必须同时声明前端候选来源、合同归属规则和后端校验。
- 不得只依赖前端过滤,所有组织归属规则必须在服务端重复校验。
- 合同模型新增履约主体时,应同步检查创建方、地址和合同气瓶的切换清理逻辑。
- 中文业务错误只允许透传预定义错误,数据库错误继续使用通用脱敏响应。