2026-08-18 云机 dev2 · 效果图已定稿(长官 08-18 通过)
本文每条结论都带物理出处(file:line),没有一条凭印象。
云机环境 · 非验收证据。
门店进来只填 机构名 / 联系人 / 手机号 就能直接付款,资料挪到付完之后补;
平台后台新增第 9 个菜单「客服设置」,用列表管各个位置的客服二维码。
效果图上写的「资料待补充」是新增状态 —— 查完代码发现不必新增,建议改成"复用旧状态 + 展示层改名"。
物理证据:
settlement/backend/app/models/settlement.py:194 有数据库层 CheckConstraint 锁死机构状态取值:待提交资料 / 资料待审核 / 资料已驳回 / 待线下付款 / 待确认到账 / 已开通 / 已到期 / 已关闭 / 已停用stores.py:1654 原话:| 做法 | 代价 |
|---|---|
| ❌ 新增「资料待补充」状态 | 要写 alembic migration 改 CheckConstraint,碰业务关键表 org_signup_profiles |
| ✅ 复用「待提交资料」,门店端显示成「资料待补充」 | 零 migration、零约束改动,只改白名单一行 + 前端一处映射 |
建议走 ✅ 那条。 长官点头后我同步把效果图上「本次新增的态」那句改掉(现在图上写的是新增)。
| 批次 | 内容 | 依赖 |
|---|---|---|
| F-1 | 后端:放行「资料没交也能付款」 | 无 |
| F-2 | 后台:客服设置(新表 + 上传 + 列表页) | 无(可与 F-1 并行) |
| F-3 | 前端:签约页瘦成三项 + 下半嵌入支付 | F-1 |
| F-4 | 前端:进度页(二维码卡 + 补充资料 + 文案改串行) | F-1、F-2 |
| F-5 | 回归 + 上 test 真付一单验收 | 全部 |
settlement/backend/app/api/settlement/store_service.py:102
PAYABLE_REVIEW_STATUSES = ("资料待审核", "资料已驳回", "待线下付款", "待确认到账")
# ↑ 加 "待提交资料"
⚠️ 同一处 92-101 行那段注释必须一起重写 —— 它现在写的是被本次推翻的旧口径:
新口径要写清:现在先收钱、后补资料;平台知道这笔是谁的,因为建档时已有机构名 + 联系人 + 手机号。
(留着旧注释比改错代码更坑 —— 下一个人会照着注释把代码改回去。)
| 位置 | 现状 | 要不要动 |
|---|---|---|
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 |
上线前存量影响盘点脚本,注释直接引用本白名单 | 同步更新 |
0 失败 / 790 通过 / 12 跳过(跑法见文末)结算侧没有任何通用配置表(models/settlement.py 现 17 张表,无 config/setting/option)→ 必须新建,例如 support_qrcodes:
id / 位置键 / 位置名 / file_key / 是否启用 / 更新时间 / 更新人
记忆 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 切换。二维码图直接走它。
admin/minicup/_components/minicup-admin-shell.tsx:76-86 的 ADMIN_NAV_ITEMS 末尾追加{ label: "客服设置", href: "/admin/minicup/support" },不动既有八项顺序(那里注释原话:admin/minicup/prices/page.tsx 的结构 —— 表格、状态胶囊、编辑弹框、绿按钮令牌全复用,settlement/web/app/store/minicup/signup/page.tsx
page.tsx:618-641:机构名称 / 营业执照公司全称 / 联系人 / 手机号 / 机构地址)services/settlement/store_signup.py:393 有原话),这一批不用动它们api/settlement/store_signup.py:285 的 submit 会返回 review_token,store_review 会话就能调付款端点(store_service.py:105 的 require_store_pay 明确放行 store_review)settlement/web/app/store/minicup/review/page.tsx
资料待审核 / 资料已驳回 / 待提交资料(显示为"资料待补充");待线下付款(= 审核已通过)及其后不显示page.tsx:762)page.tsx:794 现在写「与资料审核互不影响,两项都完成后即可开通。」org_signup_profiles 的 CheckConstraint(走第 1 节 ✅ 方案就不用碰)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