交付出件箱

← 返回出件箱

首开签约「先付款后补资料」· 实施方案

2026-08-18 云机 dev2 · 效果图已定稿(长官 08-18 通过)
本文每条结论都带物理出处(file:line),没有一条凭印象。
云机环境 · 非验收证据。


0. 一句话

门店进来只填 机构名 / 联系人 / 手机号 就能直接付款,资料挪到付完之后补;
平台后台新增第 9 个菜单「客服设置」,用列表管各个位置的客服二维码。


1. 🔴 开工前必须先定的一件事(比排期重要)

效果图上写的「资料待补充」是新增状态 —— 查完代码发现不必新增,建议改成"复用旧状态 + 展示层改名"。

物理证据:

做法 代价
❌ 新增「资料待补充」状态 要写 alembic migration 改 CheckConstraint,碰业务关键表 org_signup_profiles
✅ 复用「待提交资料」,门店端显示成「资料待补充」 零 migration、零约束改动,只改白名单一行 + 前端一处映射

建议走 ✅ 那条。 长官点头后我同步把效果图上「本次新增的态」那句改掉(现在图上写的是新增)。


2. 全景:动四块

批次 内容 依赖
F-1 后端:放行「资料没交也能付款」 无
F-2 后台:客服设置(新表 + 上传 + 列表页) 无(可与 F-1 并行)
F-3 前端:签约页瘦成三项 + 下半嵌入支付 F-1
F-4 前端:进度页(二维码卡 + 补充资料 + 文案改串行) F-1、F-2
F-5 回归 + 上 test 真付一单验收 全部

3. F-1 后端:放行付款

改什么

settlement/backend/app/api/settlement/store_service.py:102

PAYABLE_REVIEW_STATUSES = ("资料待审核", "资料已驳回", "待线下付款", "待确认到账")
#                          ↑ 加 "待提交资料"

⚠️ 同一处 92-101 行那段注释必须一起重写 —— 它现在写的是被本次推翻的旧口径:

新口径要写清:现在先收钱、后补资料;平台知道这笔是谁的,因为建档时已有机构名 + 联系人 + 手机号。
(留着旧注释比改错代码更坑 —— 下一个人会照着注释把代码改回去。)

影响面(已 grep,动之前逐个确认,别漏)

位置 现状 要不要动
stores.py:1555 CLOSABLE_STORE_STATUSES 已含「待提交资料」 不动 ✅
channels.py:2011 待提交资料 → 409「机构尚未提交资料」 🔴 要评估:付了钱还没补资料的机构,渠道点进去会 409 看不到
channels.py:1918 profile_status 映射已含「待提交资料」 不动 ✅
stores.py:1654 「除待提交资料外全状态可编辑」 🔴 要评估:平台想帮门店代填时会被挡
platform_mobile_paging.py:140 这里是 Channel.profile_status(渠道的,不是门店的) 不动 ✅ 别看串
scripts/check_parallel_payment_impact.py 上线前存量影响盘点脚本,注释直接引用本白名单 同步更新

验收


4. F-2 后台:客服设置

新表

结算侧没有任何通用配置表(models/settlement.py 现 17 张表,无 config/setting/option)→ 必须新建,例如 support_qrcodes:
id / 位置键 / 位置名 / file_key / 是否启用 / 更新时间 / 更新人

🔴 记忆过期纠正:autogenerate DROP 45 表的高危已经修了

记忆 settlement-autogenerate-drop-risk.md 写着"未修高危",与现网代码不符:
settlement/backend/migrations/env.py:48-72 已改成表级白名单
(return name in target_metadata.tables and name not in CORE_READONLY_TABLES),
注释里写明「改白名单后同一对比 remove_table 0」。我会把这条记忆更正掉。

对本次的实际影响:白名单是从 model metadata 推出来的,不是写死的表名清单 ——
所以新表只要 model 被 import 进 metadata,autogenerate 就认,正常出 create_table。
⚠️ 但反过来:model 没注册 = 表不在白名单 = 迁移静默不生成(近期两个修复提交 a4e8baa2/2518d737 就是在补注册)。
所以这一批的自检必须包含"新 model 已注册"。

文件存储:复用,不另起炉灶

settlement/backend/app/services/settlement/file_storage.py 已有
write_settlement_file / read_settlement_file / delete_settlement_file / settlement_file_exists / list_settlement_files,
且 local / OSS 双后端由 STORAGE_BACKEND 切换。二维码图直接走它。

前端


5. F-3 前端:签约页瘦成三项 + 嵌入支付

settlement/web/app/store/minicup/signup/page.tsx


6. F-4 前端:进度页

settlement/web/app/store/minicup/review/page.tsx

  1. 顶部加客服二维码卡。显示时机(长官 08-18 定):
    只在这一页,且只在资料没过审时显示 —— 资料待审核 / 资料已驳回 / 待提交资料(显示为"资料待补充");
    到 待线下付款(= 审核已通过)及其后不显示
  2. 按钮「修改资料」→「补充资料」(page.tsx:762)
  3. 🔴 付款卡副句要改:page.tsx:794 现在写「与资料审核互不影响,两项都完成后即可开通。」
    —— 这是 8-15 并行口径的原话,改成串行后必须同步改,否则页面自相矛盾

7. 红线(每批都适用)

8. 本地跑法(云机实测可用)

cd 仓库根 && source /tmp/core-env.sh
nohup python3 -m uvicorn app.main:app --host 127.0.0.1 --port 8010 > /tmp/core-8010.log 2>&1 &

cd settlement/backend && REDIS_URL=redis://127.0.0.1:6379/0 \
  SETTLEMENT_JWT_SECRET=local-test-secret CORE_API_BASE=http://127.0.0.1:8010 \
  SETTLEMENT_SERVICE_TOKEN=local-core-bridge-token \
  python3 -m pytest tests/contract/settlement -q -p no:randomly
# 基线:0 失败 / 790 通过 / 12 跳过

cd settlement/web && ./node_modules/.bin/tsc --noEmit    # 不能用 npx tsc

9. 还挂着等长官的

  1. 第 1 节那个选择(复用旧状态 ✅ / 新增状态)—— 不定这个,F-1 没法开工
  2. 二维码话术定稿(现为「遇到问题?长按或扫码添加专属顾问 / 资料怎么填、审核进度、驳回处理等,一对一协助。」)
    —— 已定话术写死在代码里,所以要您给最终版,我逐字照抄