This commit is contained in:
@@ -37,7 +37,7 @@
|
||||
|
||||
| 需求切片 | 主通道 | 完整业务边界 | 明确不迁移范围 |
|
||||
| --- | --- | --- | --- |
|
||||
| #189、#181、#57 | 旧 `Handler → Service → Store → Model` | 对现有换货、退款、订单路径做局部修复和拦截 | 不迁移换货、退款或订单模块 |
|
||||
| #189、#181、#57 | 旧 `Handler → Service → Store → Model` | 对现有换货、退款、订单路径做局部修复和拦截;新建设备退款固化订单资产标识快照 | 不迁移换货、退款或订单模块,不兼容历史空快照 |
|
||||
| #182、#44、#53 | 既有 Query 或旧 Store 查询 | 列表/详情字段、实名筛选、批量账号名称解析 | 不建聚合、历史投影或事件消费者 |
|
||||
| #41、#62、#48 | 简单写 + 既有读取 | 店铺开关、实名策略、系统配置的更新和查询 | 不建领域模型,不重构认证/支付模块 |
|
||||
| #188、#97、#33 | Application/既有通知 Adapter | 产生明确业务事件后向既有站内通知接线 | 不建营销平台或新通知中心 |
|
||||
@@ -63,8 +63,9 @@
|
||||
| 企微场景配置 | 管理员配置 `business_type → template_id` 及业务字段到控件 ID/类型/选项 key 的映射;模板必须先在企微后台创建 |
|
||||
| 实名顺序 | 保持已约定的单资产 PATCH、卡批量 POST、设备批量 POST;枚举仅为 `none/before_order/after_order`,批量上限 500、全成全败 |
|
||||
| 列表人员字段 | 退款、充值、换货返回提交人 ID/名称;审批人仅从已同步企微详情中的 userid 批量映射,映射不到返回空,不实时调用企微 |
|
||||
| 设备退款资产标识 | 创建退款时从订单固化 `asset_identifier`;列表和详情只返回退款快照,不按 `device_id` 查询当前设备,不兼容历史空快照;单卡继续使用 ICCID 快照 |
|
||||
| 批量订购 | CSV 只有资产标识列;请求额外选择一个套餐和一个支付方式,不选择代理;整批使用相同参数 |
|
||||
| 导出 | 复用现有导出任务入口,通过六个 datasource code 区分;每类只输出本业务已有且已确认的字段 |
|
||||
| 导出 | 复用现有导出任务入口,通过六个 datasource code 区分;每类只输出系统现有且有稳定来源的字段,原始字段清单中当前无法提供的字段不伪造、不新增模型,也不阻断其他字段导出 |
|
||||
| 支付方式 | `system_config` 分别保存卡和设备允许的支付方式;两类资产默认均启用 `wallet/wechat/alipay`,三项可独立取消但至少保留一项;C 端返回当前购包场景有效集合,创建订单时后端再次校验 |
|
||||
| 设备批量分配 | 复用现有导入任务 API 和状态模型,CSV 单列设备标识;业务参数选择“代理”或“套餐系列”及目标 ID |
|
||||
|
||||
@@ -76,7 +77,7 @@
|
||||
|
||||
### 5. 企微只做 Adapter,审批流程仍由企微模板拥有
|
||||
|
||||
系统按应用保存加密 Secret、回调 Token、EncodingAESKey、`corp_id/agent_id` 和一个从当前可见成员中选择的默认审批发起人;`access_token` 按应用缓存并预留提前刷新。管理员从应用可见通讯录选择成员,账号绑定键为 `(corp_id, userid)`,姓名和部门仅为展示快照。内部员工已绑定且仍可见时优先以本人发起,代理等非企微账号始终以应用默认成员发起;本地申请仍保留真实业务提交人,不用默认成员冒充业务操作者。
|
||||
系统按应用明文保存 Secret、回调 Token、EncodingAESKey、`corp_id/agent_id` 和一个从当前可见成员中选择的默认审批发起人;不要求额外启动加密密钥。`access_token` 按应用缓存并预留提前刷新。管理员从应用可见通讯录选择成员,账号绑定键为 `(corp_id, userid)`,姓名和部门仅为展示快照。内部员工已绑定且仍可见时优先以本人发起,代理等非企微账号始终以应用默认成员发起;本地申请仍保留真实业务提交人,不用默认成员冒充业务操作者。
|
||||
|
||||
场景配置保存已知 `template_id`。保存或发布时调用 `oa/gettemplatedetail` 校验控件 ID、类型、必填项和选择项 key。系统不创建模板、不保存审批节点、不计算部门领导或财务人员;`oa/applyevent` 使用 `use_template_approver=1`,审批人由企微后台模板决定。
|
||||
|
||||
@@ -104,7 +105,7 @@
|
||||
|
||||
批量订购和设备分配只新增业务解析器/执行器,继续使用现有对象存储、任务五态、Asynq 重试、失败明细和下载能力。文件级校验失败不写业务数据;涉及扣款/订购时按现有订单幂等键和钱包流水保证不重复扣款。
|
||||
|
||||
六类导出分别实现 datasource,查询直接投影 DTO,不串联多个业务迁移。不存在的字段不得临时创造含义;先从既有数据组合,确认确实缺失后再增加最小字段和迁移。
|
||||
六类导出分别实现 datasource,查询直接投影 DTO,不串联多个业务迁移。不存在或无稳定来源的字段不得临时创造含义,本 Change 不为此新增字段或迁移;该字段从导出表头中省略并在对接说明中记录,不阻断其他稳定字段的导出交付。
|
||||
|
||||
### 8. 数据、事务、常量与缓存
|
||||
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
|
||||
- 新 Change 完整替代 `complete-july-iteration-test-release` 的后续规划;旧 Change 在本 Change 校验通过前保留完成证据,之后归档为被替代,不继续执行其未完成任务。
|
||||
- 实施遵循“存量能力优先”:优先修改或复用现有接口、字段、Service、Query、任务和基础设施;只有现有能力确实无法承载已确认需求时,才允许做边界最小、可说明必要性的新增。
|
||||
- 本 Change 当前交付不编写或补齐测试代码,不运行单元、集成、验收或业务流程测试,也不执行 `go test`、`go build`、LSP 诊断、迁移和 OpenAPI 生成;只完成生产代码、必要迁移文件和契约文档至可联调状态,可使用 `gofmt`、只读检查与 `git diff --check` 做静态收口。
|
||||
- 将 #189、#181、#57 等缺陷和 #53、#44、#182 等字段/筛选需求收敛为旧 Service、Store 和现有 Query 上的局部修改,不进行 DDD 迁移。
|
||||
- 本 Change 当前交付不编写或补齐测试代码,不运行单元、集成、验收或业务流程测试,也不执行 `go test`、常规 `go build`、LSP 诊断和实际迁移;只完成生产代码、必要迁移文件和契约文档至可联调状态,修改 API 契约后必须重新生成 OpenAPI 核对,可使用 `gofmt`、只读检查与 `git diff --check` 做静态收口。
|
||||
- 将 #189、#181、#57 等缺陷和 #53、#44、#182 等字段/筛选需求收敛为旧 Service、Store 和现有 Query 上的局部修改,不进行 DDD 迁移;#181 的设备退款在创建时固化资产标识快照,列表和详情直接返回快照,不兼容历史空快照。
|
||||
- 增加店铺级 C 端登录限制开关;仅阻止该店铺资产发起新登录,不建立代理 API 权限体系,也不强制吊销已登录 Token。
|
||||
- 补齐三种实名顺序及卡/设备批量配置,保持既有 `realname_policy` 模型和前后端接口约定。
|
||||
- 复用已有站内通知,完成换货单弹窗、固定 100 元钱包余额提醒、套餐 15/7/3 天临期列表和 C 端提醒,不建设通用营销平台。
|
||||
- 复用已完成的渠道无关审批核心,交付最小企业微信 Adapter:管理员从通讯录为系统账号绑定 `(corp_id, userid)`,后台创建模板,本系统配置业务场景/模板/控件映射,完成发起、回调、详情查询和轮询补偿;不做扫码绑定、本地流程设计器或未来渠道抽象扩建。
|
||||
- **BREAKING**:退款和员工线下代充值的人工审批结果改由企业微信终态驱动;新链路可用后停用原系统内人工通过/驳回入口。代理在线扫码充值后置。
|
||||
- 交付单列 CSV 批量订购、六类业务导出、固定档位限速、按资产类型配置支付方式、CSV 批量分配设备等已确认功能,均复用现有导入、导出、Gateway、`system_config` 和任务基础设施。
|
||||
- 冻结已经完成的 #45、#46、#55、#60、#86、#38、#94、#96、#98、#43,仅做接口联调或代码证据核验;冻结行业卡现有复机行为,不按旧提案改写。
|
||||
- 交付单列 CSV 批量订购、六类业务导出、固定档位限速、按资产类型配置支付方式、CSV 批量分配设备等已确认功能,均复用现有导入、导出、Gateway、`system_config` 和任务基础设施;批量订购沿用现有后台认证和入口可见性,不新增“内部员工”账号类型限制;导出仅输出系统现有且有稳定来源的字段,不为原始清单中的缺失字段新增模型或迁移。
|
||||
- 冻结已经完成的 #45、#46、#55、#60、#86、#38、#94、#96、#98、#43,仅做接口联调或代码证据核验;#43 前端可复用套餐列表的建议售价/公司成本价与授权详情的已授权套餐 ID 完成展示和区分,无需新增后端接口;冻结行业卡现有复机行为,不按旧提案改写。
|
||||
- 明确排除原路退款、聚水潭、跨品类换货、分销佣金提现、代理在线扫码充值、通用营销/ERP、自动限速、本地审批流引擎、全局 Audit Event 专项,以及已关闭且不处理的需求。
|
||||
|
||||
## Capabilities
|
||||
@@ -33,7 +33,7 @@
|
||||
- `card-replacement`: 换货前拦截活跃退款,并修复换货套餐在原订单退款后未失效的问题。
|
||||
- `exchange-client-notification`: 创建物流换货单后复用站内通知在 C 端弹窗。
|
||||
- `order-management`: 修复 C 端订单渠道和订单资产标识返回,并支持从历史订单使用稳定资产/套餐引用发起新的下架套餐续费订单。
|
||||
- `refund-api`: 返回正确设备资产标识、提交人,并将退款审批结果切换为企微驱动。
|
||||
- `refund-api`: 新建退款固化并返回正确设备资产标识快照和提交人,不兼容历史空快照,并将退款审批结果切换为企微驱动。
|
||||
- `agent-recharge`: 返回提交人,仅保留员工线下代充值并接入企微审批,代理在线扫码充值后置。
|
||||
- `exchange-admin-management`: 换货列表和详情返回提交人。
|
||||
- `asset-realname-policy`: 支持三种实名顺序、单资产修改、卡/设备批量修改和 C 端生效策略字段。
|
||||
@@ -50,4 +50,4 @@
|
||||
- **数据与基础设施**:使用 PostgreSQL、Redis/Asynq、现有 Outbox、Integration Log、对象存储、站内通知和 `system_config`;不新增外键或 GORM 关联标签,不引入新依赖。
|
||||
- **外部系统**:企业微信自建应用与 Gateway。企微上线需应用 Secret、审批权限、通讯录可见范围、可信 IP、回调 Token/EncodingAESKey 和模板 ID。
|
||||
- **性能**:列表保持分页并批量解析提交人/审批人,禁止 N+1;批量实名上限 500 且事务全成全败;CSV/导出沿用异步任务,外部接口设置超时、幂等和补偿。
|
||||
- **交付边界**:本 Change 以生产代码、迁移文件、接口契约、联调配置和实施证据齐备为完成标准;自动化测试、构建、LSP、迁移执行、OpenAPI 生成及真实企微/Gateway 环境验收均不在本次执行范围,后续联调或发布流程另行承担。
|
||||
- **交付边界**:本 Change 以生产代码、迁移文件、接口契约、联调配置和实施证据齐备为完成标准;API 契约变更需重新生成 OpenAPI 核对。自动化测试、常规构建、LSP、实际迁移执行及真实企微/Gateway 环境验收不在本次执行范围,后续联调或发布流程另行承担。
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 单列 CSV 创建批量订购任务
|
||||
内部员工 SHALL 上传仅包含资产标识的 CSV,并在请求中为整批选择一个套餐和一个支付方式;系统不得要求 CSV 包含代理、套餐系列或支付账户,也不得按行选择不同套餐。
|
||||
通过现有后台认证且当前页面入口可见的用户 SHALL 上传仅包含资产标识的 CSV,并在请求中为整批选择一个套餐和一个支付方式;系统不新增“内部员工”账号类型限制,不得要求 CSV 包含代理、套餐系列或支付账户,也不得按行选择不同套餐。
|
||||
|
||||
#### Scenario: 创建合法批量订购任务
|
||||
- **WHEN** 员工上传单列资产 CSV 并选择有效套餐与支付方式
|
||||
- **WHEN** 已通过现有后台认证的用户上传单列资产 CSV 并选择有效套餐与支付方式
|
||||
- **THEN** 系统创建异步任务并通过统一响应返回任务 ID 和初始状态
|
||||
|
||||
### Requirement: 批量订购复用现有订单和扣款规则
|
||||
@@ -17,4 +17,3 @@
|
||||
#### Scenario: 任务被重复投递
|
||||
- **WHEN** Asynq 重复执行同一批量订购任务
|
||||
- **THEN** 已成功行不重复下单或扣款
|
||||
|
||||
|
||||
@@ -8,9 +8,8 @@
|
||||
- **THEN** 系统异步生成仅包含其可见退款数据的文件,并通过任务接口提供进度和下载结果
|
||||
|
||||
### Requirement: 导出字段必须有稳定来源
|
||||
每个 datasource MUST 明确列名、数据来源和格式;现有表或可批量关联数据无法提供的字段不得伪造,必须先补充经确认的最小数据字段后才能导出。
|
||||
每个 datasource MUST 明确列名、数据来源和格式;只输出现有表或可批量关联数据能稳定提供的字段。原始需求清单中当前无法提供的字段 MUST 省略且不得伪造,本 Change 不为此新增业务字段或迁移,也不阻断其他稳定字段导出。
|
||||
|
||||
#### Scenario: 字段没有数据来源
|
||||
- **WHEN** 业务要求字段在现有数据中不存在且无法可靠推导
|
||||
- **THEN** 该 datasource 不得用空含义或错误值冒充字段,任务保持未交付直到字段契约确认
|
||||
|
||||
- **THEN** 该 datasource 不得用空含义或错误值冒充字段,应省略该列并继续导出其他有稳定来源的字段
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
- **WHEN** 有权限用户查询设备订单产生的退款
|
||||
- **THEN** 响应返回设备资产标识、提交人 ID 和提交人名称
|
||||
|
||||
#### Scenario: 新建设备退款固化资产标识
|
||||
- **WHEN** 用户为设备订单创建退款申请
|
||||
- **THEN** 退款记录从订单固化 `asset_identifier`,列表和详情直接返回该快照,不查询设备当前标识;历史空快照保持为空
|
||||
|
||||
### Requirement: 退款终态由企微审批驱动
|
||||
退款申请 SHALL 关联唯一通用审批实例;企微标准决策为 approved 时执行现有退款终结,rejected/cancelled/deleted 时按对应终态结束,不得由列表可见权限替代审批权限。
|
||||
|
||||
@@ -29,4 +33,3 @@
|
||||
**Reason**: 审批拒绝改由企业微信回调或轮询同步的标准决策驱动。
|
||||
|
||||
**Migration**: 企微测试闭环可用后停用 `POST /api/admin/refunds/:id/reject`,前端改为只读展示审批状态。
|
||||
|
||||
|
||||
@@ -50,8 +50,12 @@
|
||||
|
||||
## 7. 文档与联调交付
|
||||
|
||||
- [x] 7.1 补齐所有新增/修改 API 的 DTO description、枚举名称字段、中文错误码、路由注释和统一响应示例;新增 Handler 同步 `cmd/api/docs.go`、`cmd/gendocs/main.go`,但本次不执行 OpenAPI 生成。【主:API 契约】
|
||||
- [x] 7.1 补齐所有新增/修改 API 的 DTO description、枚举名称字段、中文错误码、路由注释和统一响应示例;新增 Handler 同步 `cmd/api/docs.go`、`cmd/gendocs/main.go`,并按后续明确要求生成 OpenAPI 核对契约。【主:API 契约】
|
||||
- [x] 7.2 增量维护 `.scratch/tech-global-audit/审计覆盖基线.md`,逐项登记 Audit Event、Domain Ledger、Integration Log、Outbox 或 N/A 理由。【主:治理门禁】
|
||||
- [x] 7.3 对全部变更生产代码执行 `gofmt`、只读一致性检查和 `git diff --check`,记录未执行测试、构建、LSP、迁移和 OpenAPI 生成的验证缺口。【主:静态收口】
|
||||
- [x] 7.3 对全部变更生产代码执行 `gofmt`、只读一致性检查和 `git diff --check`,记录未执行测试、常规构建、LSP 和实际迁移的验证缺口;OpenAPI 已按后续明确要求生成核对。【主:静态收口】
|
||||
- [x] 7.4 准备企微、Gateway、Redis/Asynq、对象存储和前端联调所需配置、接口说明、已知限制及回滚步骤;本次不执行真实环境闭环。【主:联调交付】
|
||||
- [x] 7.5 更新实施证据和任务状态,保留 `complete-july-iteration-test-release` 的历史完成证据;严格校验、真实联调验收和归档由后续流程处理。【主:OpenSpec 收口】
|
||||
|
||||
## 8. 补充核对发现的缺口
|
||||
|
||||
- [x] 8.1 核对 #181 设备退款资产标识快照链路:新建退款从订单复制按 VirtualNo 优先、IMEI 兜底生成的 `asset_identifier`,列表和详情只返回退款快照,不按 `device_id` 解析当前设备且不兼容历史空快照;单卡 ICCID 口径保持不变。同步更新对接说明并重新生成 OpenAPI 核对 `asset_identifier`。Audit Event、Domain Ledger、Integration Log、Outbox 均 N/A:只核对快照写入与读取,不修改业务状态。【主:旧 Service|边界:退款资产标识快照|不迁移:退款、订单或资产模块】
|
||||
|
||||
Reference in New Issue
Block a user