修复配送合同候选范围与失效联动

This commit is contained in:
czl231
2026-08-13 23:38:29 +08:00
parent 029724a46c
commit 4d2acbaf46
10 changed files with 243 additions and 10 deletions

View File

@@ -185,6 +185,8 @@
合同气瓶必须属于合同用户、处于可用状态且未报废;订单只能使用有效合同中仍绑定的气瓶。
合同气瓶绑定页面只允许选择草稿合同;已生效、已过期或已终止合同不进入绑定候选。合同管理列表仍展示全部生命周期状态。
### 6.6 气体配送订单
| 资源 | 路径 | 模式 | 已实现能力 |
@@ -202,6 +204,8 @@
创建订单页面必须先选择配送合同,收货地址下拉仅展示该合同签约用户的地址。地址选项以完整地址为主文案并标记默认地址;存在默认地址时自动选中,切换合同时清空原地址。若合同用户没有可用地址,页面应明确引导先维护用户地址并禁止提交。
订单合同候选必须同时满足“生效中、已到生效时间、尚未到期且到期时间有效”。草稿、未到生效时间、已到期和已终止合同不得进入订单候选;没有可履约合同时应引导管理员先启用或续签合同并禁止提交。
订单状态机如下:
```text

View File

@@ -0,0 +1,64 @@
# 项目文档_配送合同候选范围修复_v1.0
## 1. 项目概述
本次修复平台总后台业务表单直接加载全部配送合同的问题。合同管理列表需要展示完整生命周期,但创建订单和绑定合同气瓶属于受状态约束的业务操作,候选范围必须与服务端最终校验一致。
## 2. 业务规则
- 创建配送订单只显示当前可履约合同:状态为“生效中”、当前时间不早于生效时间、到期时间存在且当前时间早于到期时间。
- 草稿、未到生效时间、已过期、已终止和缺少到期时间的合同不进入订单候选。
- 绑定合同气瓶只显示草稿合同。
- 合同管理列表不携带候选用途参数,继续展示全部合同。
- 没有可用候选时,页面显示对应业务引导并禁止保存。
- 页面重新加载后,严格筛选结果中不存在的旧合同选择会被清空。
- 服务端创建订单和绑定气瓶时继续执行最终校验,前端筛选不构成安全控制。
## 3. 接口兼容
`GET /gasorder_contract` 新增可选查询参数 `candidate`
- 不传:合同管理全量列表,保持原行为。
- `candidate=order`:仅返回当前可履约合同。
- `candidate=binding`:仅返回草稿合同。
未新增数据库字段、表或迁移,也未修改合同数据。
## 4. 关键文件
```text
backend/api/internal/logic/platform/gasorder/gasorder.go # 合同候选过滤与订单最终校验
backend/api/internal/logic/platform/gasorder/gasorder_test.go # 五类合同状态与查询条件测试
frontend/platform_admin/src/api/resources.ts # 两类合同候选配置与中文提示
frontend/platform_admin/src/views/resource/use-resource-relations.ts # 字段级筛选参数
frontend/platform_admin/src/views/resource/use-resource-relation-linkage.ts # 失效选择清理和空候选阻断
```
## 5. 变更记录
操作时间2026-08-13
操作类型:修复
影响模块:配送合同、配送订单、合同气瓶
操作前状态:订单和合同气瓶表单均展示全部合同,用户选中后才由服务端拒绝。
操作后状态:不同业务表单只展示当前允许操作的合同,并继续保留服务端最终校验。
风险评估:管理列表和既有无参数调用保持兼容;候选接口只收窄可选数据,不修改数据事实。
## 6. 验证方式
```bash
cd backend/api
go test ./internal/logic/platform/gasorder
go test ./...
go vet ./...
cd frontend/platform_admin
npm run gasorder-contract-candidates:check
npm run type:check
npm run contract:check
npm run build
```