Files
platforms/docs/项目文档_组织支付记录数据范围修复_v1.0.md

77 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 组织支付记录数据范围修复项目文档 v1.0
## 1. 项目概述
- 项目名称:气站与配送点支付记录数据范围修复。
- 实施范围:`backend/api` 的气站、配送点财务只读接口及对应需求文档。
- 修复目标:移除统一支付单对不存在钱包主键的错误依赖,恢复支付记录列表与详情查询,并保持组织数据隔离。
- 技术栈Go、Gin、GORM、PostgreSQL。
- 数据库影响:不新增字段、不执行迁移、不修改既有支付事实。
## 2. 问题与根因
`payment_order` 是全项目统一支付尝试事实,通过 `business_type``business_identity` 关联具体业务。气站与配送点财务查询沿用了旧钱包支付表的通用关联方式,尝试访问不存在的 `payment_order.wallet_basic_id`,导致 PostgreSQL 返回 `SQLSTATE 42703`
该错误同时影响气站与配送点的支付记录列表和详情接口。数据库结构与统一支付模型一致,不应通过补充钱包主键掩盖查询模型错误。
## 3. 数据范围规则
```text
payment_order
├── business_type = gasorder
│ └── gasorder_basic.identity = business_identity
├── business_type = ec_order
│ └── ec_order.identity = business_identity
└── business_type = recharge
└── wallet_recharge_order.identity = business_identity
└── wallet_basic.id = wallet_basic_id
```
- 气站范围分别校验 `gasorder_basic.gas_basic_id``ec_order.gas_station_id`,或气站自有充值单及钱包归属。
- 配送点范围分别校验 `gasorder_basic.delivery_basic_id``ec_order.delivery_point_id`,或配送点自有充值单及钱包归属。
- 查询使用 `EXISTS`,同时匹配业务类型和业务标识,避免不同业务表的标识偶撞。
- 未知业务类型、业务对象缺失及无法证明组织归属的记录按失败关闭处理。
- 列表和详情复用同一范围过滤器;详情增加支付单 `identity` 条件,不放宽组织校验。
- 关联业务记录归档后,只要事实仍存在且可验证归属,支付记录仍可读取。
## 4. 目录结构与核心文件
```text
platforms/
├── backend/api/internal/logic/
│ ├── common/
│ │ ├── payment_scope.go # 统一支付组织范围过滤器
│ │ └── payment_scope_test.go # PostgreSQL 查询边界回归测试
│ ├── gas/finance.go # 气站支付列表与详情接入
│ └── delivery/finance.go # 配送点支付列表与详情接入
└── docs/
├── 06-气站管理系统需求.md
└── 07-配送点管理系统需求.md
```
`ScopePaymentOrdersByOwner` 只接受 `gas``delivery` 两种主体类型。其他类型统一追加 `1 = 0`,避免调用方参数错误导致越权。
## 5. 接口兼容性
- 保持既有 API 路径、分页参数、响应结构和排序不变。
- 不修改 `PaymentOrder` 模型、支付创建、渠道回调、余额扣款和退款流程。
- 钱包余额支付目前直接写入 `wallet_record`,本次不将其拼装为虚拟 `payment_order`
- 当前用户和工作人员充值不属于气站或配送点支付范围;未来只有组织自有充值单且钱包归属一致时才会被查询。
## 6. 测试与维护
- 回归测试覆盖燃气配送订单、商城订单、组织自有充值三类归属路径。
- 分别断言气站和配送点字段,防止跨组织字段混用。
- 断言未知主体失败关闭、详情保留组织边界,且 SQL 不再引用 `payment_order.wallet_basic_id`
- 后续新增支付业务类型时,必须先明确其组织归属链路,再扩展公共过滤器和对应测试;不得通过付款用户反推组织。
## 7. 已知边界
- 未完成的燃气配送支付尝试跟随订单当前配送点;成功支付后订单状态不允许再次分配,因此成功支付事实归属稳定。
- 钱包余额支付统一创建 `payment_order` 属于后续资金链路设计事项,不纳入本次缺陷修复。
- 支付创建入口的业务类型白名单属于独立安全加固事项,本次查询只负责对未知类型失败关闭。
## 8. 变更记录
- v1.0:修复气站与配送点统一支付记录错误关联钱包主键的问题,补齐组织范围测试和需求口径。