Files
huang b9733c4913
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m12s
fix: 修正零售价架构错误 + 清理旧微信配置 + 归档提案 + 前端接口文档
1. 修正 retail_price 架构:
   - 删除 batch-pricing 接口的 pricing_target 字段和 retail_price 分支
     (上级只能改下级成本价,不能改零售价)
   - 新增 PATCH /api/admin/packages/:id/retail-price 接口
     (代理自己改自己的零售价,校验 retail_price >= cost_price)

2. 清理旧微信 YAML 配置(已全部迁移到数据库 tb_wechat_config):
   - 删除 config.yaml 中 wechat.official_account 配置节
   - 删除 NewOfficialAccountApp() 旧工厂函数
   - 清理 personal_customer service 中的死代码(旧登录/绑定微信方法)
   - 清理 docker-compose.prod.yml 中旧微信环境变量和证书挂载注释

3. 归档四个已完成提案到 openspec/changes/archive/

4. 新增前端接口变更说明文档(docs/前端接口变更说明.md)

5. 修正归档提案和 specs 中关于 pricing_target 的错误描述
2026-03-19 17:39:43 +08:00

2.2 KiB
Raw Blame History

personal-customer Specification

ADDED Requirements

Requirement: 个人客户登录主流程改为微信授权

系统 SHALL 将个人客户登录主流程从“手机号 + 验证码登录”调整为“资产验证 + 微信授权登录”。

  • 新登录入口:
    • POST /api/c/v1/auth/verify-assetA1无认证
    • POST /api/c/v1/auth/wechat-loginA2无认证
    • POST /api/c/v1/auth/miniapp-loginA3无认证
  • 请求与响应要点:
    • A2/A3 请求体 MUST 包含 codeasset_token
    • A2/A3 响应体 MUST 包含 tokenneed_bind_phoneis_new_user
  • 错误码:
    • 1006 参数错误
    • 1002 token 无效或过期
    • 1040 微信授权失败

Scenario: 通过微信授权完成登录

  • WHEN 用户先完成 A1再提交 A2 或 A3
  • THEN 系统 SHALL 完成客户识别/创建、资产绑定并返回登录 token

Scenario: 不再支持旧手机号直登入口

  • WHEN 客户端调用旧手机号登录路径(如 /api/c/v1/login
  • THEN 系统 MUST 按新路由规范拒绝或迁移提示,不再作为主登录路径

Requirement: 手机号从“登录凭据”调整为“登录后补充资料”

系统 MUST 将手机号能力调整为登录后绑定/换绑,而非登录入口。

  • 相关接口:
    • POST /api/c/v1/auth/send-codeA4无认证
    • POST /api/c/v1/auth/bind-phoneA5需认证
    • POST /api/c/v1/auth/change-phoneA6需认证
  • 响应字段:
    • A5/A6 MUST 返回绑定后的 phone

Scenario: 首次登录后要求绑定手机号

  • WHEN client.require_phone_binding=true 且用户未绑定手机号
  • THEN 登录响应 MUST 返回 need_bind_phone=true
  • THEN 用户通过 A4+A5 完成绑定后进入业务页面

Requirement: 微信身份字段迁移到 OpenID 关联能力

系统 SHALL 保留 PersonalCustomer.wx_open_idwx_union_id 字段的兼容性,但新登录链路 MUST 以 PersonalCustomerOpenID 为主。

Scenario: 读取用户微信身份

  • WHEN 登录流程需要按微信身份识别客户
  • THEN 系统 MUST 优先查询 PersonalCustomerOpenID
  • THEN 不再依赖 PersonalCustomer 单字段承载多 AppID 场景