Merge branch 'main' into dev

This commit is contained in:
2026-11-09 12:25:57 +08:00
147 changed files with 8065 additions and 3016 deletions
+33 -7
View File
@@ -7,8 +7,8 @@ set -Eeuo pipefail
#
# 它把以前散落在文档里的脚本步骤串成一条可重复执行的流水线:
# ① 存量订单项收入回填 revenue:backfill
# ② 渠道/商品由管道处理(无需回填)
# ③ 财务历史重建(分窗口) finance:rebuild-cutover
# ② 订单级收单核销补投 voucher:backfill-order-received
# ③ 财务历史重建(分窗口) finance:rebuild-derived
# ④ 上线验收(只读 SQL) scripts/verify-finance-launch.sql
#
# 设计原则:
@@ -40,6 +40,7 @@ WINDOW_DAYS="${WINDOW_DAYS:-30}"
BATCH_SIZE="${BATCH_SIZE:-5000}"
MAX_BATCHES="${MAX_BATCHES:-1000}"
MAX_BACKFILL_ROUNDS="${MAX_BACKFILL_ROUNDS:-5}"
VOUCHER_BACKFILL_DAYS="${VOUCHER_BACKFILL_DAYS:-7}"
DRY_RUN=false
SKIP_BACKFILL=false
@@ -81,6 +82,7 @@ usage() {
POST_DEPLOY_COMPOSE_FILE 指定 compose 文件(默认 docker-compose.yml)
TOOLS_IMAGE 工具镜像名(默认 order-site/tools:latest)
WINDOW_DAYS / BATCH_SIZE / MAX_BATCHES 同上对应选项的默认值
VOUCHER_BACKFILL_DAYS 订单级收单核销补投回看天数(默认 7)
首次上线顺序(避免商品未归一先同步产生大量异常):
① bash deploy/post-deploy.sh --only=backfill
@@ -147,6 +149,7 @@ validate_integer "--window-days" "$WINDOW_DAYS" 1 400
validate_integer "--batch-size" "$BATCH_SIZE" 1 50000
validate_integer "--max-batches" "$MAX_BATCHES" 1 10000
validate_integer "MAX_BACKFILL_ROUNDS" "$MAX_BACKFILL_ROUNDS" 1 100
validate_integer "VOUCHER_BACKFILL_DAYS" "$VOUCHER_BACKFILL_DAYS" 1 90
should_run() {
[[ -z "$ONLY" || "$ONLY" == "$1" ]]
@@ -343,7 +346,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_status = 'pending'" | tr -d '[:space:]')"
PENDING_FULFILLMENT="$(psql_scalar "SELECT count(*) FROM fulfillments WHERE status = 'pending'" | tr -d '[:space:]')"
log " postgres 运行中 / 迁移 103–106 已应用"
log " 待回填收入项:${PENDING_REVENUE} 行;待回填履约方式:${PENDING_FULFILLMENT} 行"
@@ -362,7 +365,20 @@ step_backfill() {
run_backfill revenue:backfill --batchSize="$BATCH_SIZE" --maxBatches="$MAX_BATCHES"
fi
log "② 渠道判定与商品归一出管道负责,无需手工回填"
log "② 补投订单级收单核销任务(最近 ${VOUCHER_BACKFILL_DAYS} 天)"
if [[ "$DRY_RUN" == true ]]; then
if docker image inspect "$TOOLS_IMAGE" >/dev/null 2>&1; then
run_tool voucher:backfill-order-received --days="$VOUCHER_BACKFILL_DAYS" ||
warn "订单级核销补投 dry-run 预览失败(不影响后续)"
else
log " [dry-run] 跳过执行(工具镜像未构建)"
fi
else
run_tool voucher:backfill-order-received \
--days="$VOUCHER_BACKFILL_DAYS" \
--execute \
--confirm=ENQUEUE_ORDER_RECEIVED
fi
if [[ "$DRY_RUN" != true ]]; then
refresh_stats
@@ -388,17 +404,18 @@ step_sync() {
if [[ "$products" == "0" ]]; then
warn "商品目录为空:财务重建会生成大量 product_mapping_missing 异常;建议先完成商品初始化再跑 --only=sync"
fi
log "③ 财务历史重建(finance:rebuild-cutover),区间 ${from} → ${to},每窗 ${WINDOW_DAYS} 天"
log "③ 财务派生数据重建(finance:rebuild-derived),区间 ${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:rebuild-cutover -- --date-from=${from} --date-to=${win_to}"
log " [dry-run] npm run finance:rebuild-derived -- --date-from=${from} --date-to=${win_to} --execute --confirm=REBUILD_DERIVED"
else
log " 窗口 ${from} → ${win_to}"
run_tool finance:rebuild-cutover --date-from="$from" --date-to="$win_to"
run_tool finance:rebuild-derived --date-from="$from" --date-to="$win_to" \
--execute --confirm=REBUILD_DERIVED
fi
[[ "$win_to" == "$to" ]] && break
from="$(date_add_days "$win_to" 1)"
@@ -418,6 +435,15 @@ step_verify() {
warn "验收未通过(psql 退出码 ${code}):按上面 FAIL 项的「处理建议」逐条处理后,重跑 --only=verify"
return 1
fi
if [[ "$DRY_RUN" == true ]]; then
log " [dry-run] npm run audit:finance -- --strict"
else
ensure_tools_image
if ! run_tool audit:finance -- --strict; then
warn "财务审计未通过:修复销售范围/事实/总账差异后重跑 --only=verify"
return 1
fi
fi
log "验收全部通过"
}