chore(deploy): 上线脚本与验收 SQL 适配渠道模型

- post-deploy 去掉已删除的履约回填与 finance:sync,改用 finance:rebuild-cutover
- 验收 SQL 的履约检查改读 fulfillment_channel/status
- 相关文档同步更新
This commit is contained in:
yml2213
2026-10-31 19:57:00 +08:00
parent 0a77524331
commit 2f11ed6bca
6 changed files with 55 additions and 50 deletions
+12 -17
View File
@@ -7,8 +7,8 @@ set -Eeuo pipefail
#
# 它把以前散落在文档里的脚本步骤串成一条可重复执行的流水线:
# ① 存量订单项收入回填 revenue:backfill
# ② 履约方式回填 fulfillment:backfill
# ③ 财务历史同步(分窗口) finance:sync --mode=all
# ② 渠道/商品由管道处理(无需回填)
# ③ 财务历史重建(分窗口) finance:rebuild-cutover
# ④ 上线验收(只读 SQL) scripts/verify-finance-launch.sql
#
# 设计原则:
@@ -343,7 +343,7 @@ preflight() {
fi
PENDING_REVENUE="$(psql_scalar "SELECT count(*) FROM order_items WHERE revenue_basis = 'unknown'" | tr -d '[:space:]')"
PENDING_FULFILLMENT="$(psql_scalar "SELECT count(*) FROM order_items WHERE fulfillment_mode IS NULL" | tr -d '[:space:]')"
PENDING_FULFILLMENT="$(psql_scalar "SELECT count(*) FROM order_items WHERE fulfillment_status = 'pending'" | tr -d '[:space:]')"
log " postgres 运行中 / 迁移 103–106 已应用"
log " 待回填收入项:${PENDING_REVENUE} 行;待回填履约方式:${PENDING_FULFILLMENT} 行"
@@ -362,21 +362,16 @@ step_backfill() {
run_backfill revenue:backfill --batchSize="$BATCH_SIZE" --maxBatches="$MAX_BATCHES"
fi
log "② 回填履约方式(fulfillment:backfill,只填 NULL)"
if [[ "$DRY_RUN" == true ]]; then
log " [dry-run] 跳过执行"
else
run_backfill fulfillment:backfill --batchSize="$BATCH_SIZE" --maxBatches="$MAX_BATCHES"
fi
log "② 渠道判定与商品归一出管道负责,无需手工回填"
if [[ "$DRY_RUN" != true ]]; then
refresh_stats
fi
}
# 回填会 UPDATE 40 万行 order_items:既产生大量死元组,又给新列 fulfillment_mode
# 留下空统计。autovacuum 追不上时,订单列表的 COUNT 会被估算成 orders 全表扫描,
# 冷缓存实测 20 秒级(测试库曾因此 500)。这里在回填后立刻补一次,VACUUM 只拿
# 回填会 UPDATE 40 万行 order_items:既产生大量死元组,又给新列留下空统计。
# autovacuum 追不上时,订单列表的 COUNT 会被估算成 orders 全表扫描,冷缓存实测
# 20 秒级(测试库曾因此 500)。这里在回填后立刻补一次,VACUUM 只拿
# SHARE UPDATE EXCLUSIVE,不阻塞读写。
refresh_stats() {
log "②' 刷新统计信息与可见性(VACUUM ANALYZE order_items/orders)"
@@ -391,19 +386,19 @@ step_sync() {
local products
products="$(psql_scalar 'SELECT count(*) FROM product_catalog' | tr -d '[:space:]')"
if [[ "$products" == "0" ]]; then
warn "商品目录为空:finance:sync 会为未归一订单项生成大量 product_mapping_missing 异常;建议先完成商品初始化再跑 --only=sync"
warn "商品目录为空:财务重建会生成大量 product_mapping_missing 异常;建议先完成商品初始化再跑 --only=sync"
fi
log "③ 财务历史同步(finance:sync --mode=all),区间 ${from} → ${to},每窗 ${WINDOW_DAYS} 天"
log "③ 财务历史重建(finance:rebuild-cutover),区间 ${from} → ${to},每窗 ${WINDOW_DAYS} 天"
while :; do
win_to="$(date_add_days "$from" $((WINDOW_DAYS - 1)))"
if [[ "$win_to" > "$to" ]]; then
win_to="$to"
fi
if [[ "$DRY_RUN" == true ]]; then
log " [dry-run] npm run finance:sync -- --mode=all --from=${from} --to=${win_to}"
log " [dry-run] npm run finance:rebuild-cutover -- --date-from=${from} --date-to=${win_to}"
else
log " 窗口 ${from} → ${win_to}"
run_tool finance:sync --mode=all --from="$from" --to="$win_to"
run_tool finance:rebuild-cutover --date-from="$from" --date-to="$win_to"
fi
[[ "$win_to" == "$to" ]] && break
from="$(date_add_days "$win_to" 1)"
@@ -433,7 +428,7 @@ manual_checklist() {
剩余人工步骤(后台 UI,脚本无法代替):
1) 钱包管理 → 补建客服账户 → 拨付备用金
2) 商品与成本 → 积分钱包 → 发放三平台积分
3) 商品与成本 → 标准商品 →「从接单模板初始化」→「按工单回填商品」→「归一人工商品」
3) 商品与成本 → 标准商品 →「从接单模板初始化」(一次性建模板商品与映射)
4) 商品与成本 → 人工 SKU 配置 →「扫描」并逐项配置
5) 财务 → 总账与对账 →「同步销售事实到总账」→ 试算平衡 → 按需关账
首次上线顺序:--only=backfill → 完成 1)–4) → --only=sync → 完成 5) → --only=verify