Files
Neo-ZQYY/docs/audit/changes/2026-02-27__biz-day-cutoff-prd-sync-check.md
Neo 14a12342b5 chore(audit): 补追 96 份未入仓审计孤本 — 覆盖 2026-02-26 ~ 2026-04-08
这些审计记录原本堆积在 docs/audit/changes/changes/ 嵌套误产物目录下(由开发机迁移
79d3c2e 前后的不明批量操作产生)。由于同期 .gitignore 屏蔽了 docs/audit/ 全目录,
它们从未入过 git 任何分支 history。删除即永久丢失。

按 docs/specs/audit-gap-recovery/tasks.md 阶段 1 执行,将全部 96 份 D 类孤本
(主目录无同名、git history 亦无记录)复制到 docs/audit/changes/ 主目录入仓。

涵盖主题: P1-P18 全栈集成 / 多模块累积变更 / ETL bug 修复 / 业务日切 /
   召回与任务引擎改造 / 租户管理与审批 / 董事会财务 / 客户与助教详情 /
   DDL 基线合并 / Kiro 到 Claude Code 迁移

阶段 2(B 类内容漂移 1 份)和阶段 4(嵌套目录删除)独立推进。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 06:35:42 +08:00

21 KiB
Raw Blame History

变更审计:营业日分割规则 PRD 同步检查 + 全栈集成收口

  • 日期: 2026-02-27 08:11:17
  • Prompt-ID: P20260227-075054
  • 风险等级: 🔴DB schema + 鉴权 + ETL 配置 + 管理后台 + 小程序 + 共享包)
  • 触发原因: root-file, dir:admin-web, dir:backend, dir:etl, dir:miniprogram, dir:db, db-schema-change, dir:shared

1. 变更概览

本次审计覆盖 213 个文件(+7873 / -217792 行),核心为营业日分割规则(BUSINESS_DAY_START_HOUR=8全栈贯通、小程序鉴权流程优化new→pending→approved 三态、管理后台任务终止功能、ETL DWS 任务 biz_date 重构、以及大量历史临时文件清理。

用户原始 Prompt「8:00作为天的分割规则是否也同步到了 docs/prd/specs 相应的说明中?帮我检查。」

2. 变更范围

2.1 管理后台admin-web

  • App.tsx:启动时初始化营业日配置 store
  • TaskConfig.tsx:日期选择器下方新增 BusinessDayHint 组件
  • TaskManager.tsx历史记录表新增「终止」操作列running 状态可终止)
  • api/businessDay.tscomponents/BusinessDayHint.tsxstore/businessDayStore.ts:营业日配置 API + 提示组件 + zustand store新增文件

2.2 后端backend

  • config.py:新增 WX_APPID/WX_SECRET/WX_DEV_MODE/BUSINESS_DAY_START_HOUR 配置项
  • main.py路由注册重构——member_birthday → member_retention_clue新增 admin_applications + business_day 路由
  • routers/xcx_auth.py用户状态三态new/pending/approved+ dev-login mock 端点
  • routers/tasks.pyETL_ONLY_EXPECTED 白名单,避免同步检查误报
  • routers/admin_applications.pyrouters/business_day.pyrouters/member_retention_clue.py:新增路由
  • schemas/xcx_auth.py:新增 DevLoginRequest schema
  • schemas/member_retention_clue.py:维客线索 schema
  • services/application.py:申请提交后自动 new→pending 状态流转
  • services/wechat.pyWX_APPID/WX_SECRET 改为模块级常量引用
  • middleware/permission.py:权限中间件调整

2.3 ETLfeiqiu connector

  • config/defaults.py + config/env_parser.py + config/settings.py:新增 business_day_start_hour 配置
  • orchestration/flow_runner.py:调度逻辑调整
  • quality/consistency_checker.py一致性检查重构136 行变更)
  • tasks/dws/*.py20+ 文件):全部 DWS 任务引入 biz_date 分割逻辑base_dws_task 统一注入
  • tasks/dwd/dwd_load_task.pyDWD 加载微调
  • tasks/verification/index_verifier.py:指标验证调整

2.4 共享包shared

  • packages/shared/src/neozqyy_shared/__init__.py:导出新增
  • packages/shared/src/neozqyy_shared/datetime_utils.py新增营业日计算工具92 行)

2.5 数据库db

  • db/fdw/setup_fdw_reverse.sql + setup_fdw_reverse_test.sqlFDW 反向映射更新
  • DDL 基线多文件更新etl_feiqiu 六层 + zqyy_app auth/public

2.6 小程序miniprogram

  • app.jsonapp.tstypings/index.d.ts:应用配置 + 启动逻辑 + 类型定义调整

2.7 根目录

  • .env + .env.template:新增 WX_APPID/WX_SECRET/WX_DEV_MODE/BUSINESS_DAY_START_HOUR
  • .gitignore:新增忽略规则

3. 风险与回滚

风险点 等级 回滚要点
营业日分割逻辑全栈贯通 🔴 回退 BUSINESS_DAY_START_HOUR 配置 + ETL base_dws_task biz_date 注入
用户状态三态new/pending/approved 🟡 回退 xcx_auth.py + application.py 状态流转逻辑
member_birthday → member_retention_clue 路由替换 🟡 恢复 member_birthday 路由注册
DWS 任务批量重构20+ 文件) 🔴 git revert 整批 DWS 任务文件
ETL_ONLY_EXPECTED 白名单 🟢 删除白名单集合即可

4. 验证

  • 管理后台:启动后检查 BusinessDayHint 是否正确显示营业日分割时间
  • 后端:GET /api/business-day/config 返回 {"start_hour": 8}
  • ETL--dry-run 模式验证 DWS 任务 biz_date 计算是否以 08:00 为分割点
  • 小程序鉴权dev-login 端点测试 new→pending→approved 状态流转
  • 数据库:检查 DDL 基线与测试库实际结构一致

5. 本次对话文件变更

新增文件

  • docs/audit/prompt_logs/prompt_log_20260227_075054.md
  • scripts/ops/_check_etl_log_tail.py

删除文件

(无)

6. 合规检查

检查项 状态
文档同步code_without_docs 无缺失
新增迁移 SQL 无新增
BD_Manual 文档 ⚠️ has_bd_manual=false见 DB 对账段落)
DDL 基线 ⚠️ has_ddl_baseline=false
接口变更 api_changed=false
OpenAPI Spec 已同步

改动注解

apps/admin-web/src/App.tsx

  • 变更类型:修改
  • 原始原因:营业日分割规则需要在管理后台启动时加载,供日期选择器等组件使用
  • 思路分析:在 App 组件 useEffect 中调用 businessDayStore.init(),与 authStore.hydrate 并行执行;降级策略封装在 store 内部App 层不处理异常
  • 修改结果管理后台启动时自动拉取营业日配置BusinessDayHint 等下游组件可直接消费 store 数据

apps/admin-web/src/api/businessDay.ts

  • 变更类型:新增(非 session_diff.added为累积变更
  • 原始原因:管理后台需要调用后端营业日配置接口
  • 思路分析:封装 GET /api/business-day/config 的 API 调用
  • 修改结果:提供 fetchBusinessDayConfig() 供 store 使用

apps/admin-web/src/components/BusinessDayHint.tsx

  • 变更类型:新增
  • 原始原因:任务配置页日期选择器需要提示用户当前营业日分割时间
  • 思路分析:读取 businessDayStore 中的 start_hour渲染为灰色提示文字
  • 修改结果TaskConfig 页面日期选择器下方显示「营业日以 XX:00 为分割点」提示

apps/admin-web/src/pages/TaskConfig.tsx

  • 变更类型:修改
  • 原始原因:日期选择区域需要展示营业日分割提示
  • 思路分析:在日期范围选择 Row 下方插入 BusinessDayHint 组件,用 Fragment 包裹避免 JSX 单根节点限制
  • 修改结果:用户在配置任务日期时可看到营业日分割时间提示

apps/admin-web/src/pages/TaskManager.tsx

  • 变更类型:修改
  • 原始原因:历史记录中 running 状态的任务需要支持手动终止
  • 思路分析:新增 handleCancelHistory 回调 + 操作列Popconfirm 确认后调用 cancelExecution API仅 running 状态显示终止按钮
  • 修改结果:管理后台历史记录表支持终止正在运行的任务

apps/admin-web/src/store/businessDayStore.ts

  • 变更类型:新增
  • 原始原因:营业日配置需要全局状态管理
  • 思路分析zustand storeinit() 调用 API 获取配置,失败时降级为默认值 8
  • 修改结果:全局可用的营业日配置 store

apps/backend/app/config.py

  • 变更类型:修改
  • 原始原因:后端需要读取微信小程序配置和营业日分割点配置
  • 思路分析:新增 WX_APPID/WX_SECRET/WX_DEV_MODE微信鉴权+ BUSINESS_DAY_START_HOUR营业日分割均从环境变量读取并提供默认值
  • 修改结果:后端配置模块统一管理微信和营业日相关配置

apps/backend/app/main.py

  • 变更类型:修改
  • 原始原因路由注册需要反映模块重构member_birthday→member_retention_clue和新增路由
  • 思路分析:替换 member_birthday 为 member_retention_clue新增 admin_applications + business_day 路由注册
  • 修改结果:后端路由表更新,新增 3 个路由模块

apps/backend/app/routers/tasks.py

  • 变更类型:修改
  • 原始原因ETL 同步检查误报——部分 ETL 任务(一次性初始化/未上线)不应出现在差异列表中
  • 思路分析:定义 ETL_ONLY_EXPECTED 白名单集合,从 etl_only 差集中排除这些任务
  • 修改结果:同步检查不再误报 INIT_*_SCHEMA / SEED_DWS_CONFIG / DWS_ASSISTANT_ORDER_CONTRIBUTION

apps/backend/app/routers/xcx_auth.py

  • 变更类型:修改
  • 原始原因:小程序鉴权流程优化——新用户应为 new 状态(未提交申请),提交申请后才变为 pending
  • 思路分析引入三态流转new→pending→approved新用户 INSERT 时 status='new';新增 dev-login 端点(仅 WX_DEV_MODE=true 时注册),支持开发环境跳过微信 code2Session
  • 修改结果:鉴权流程更精确区分「未申请」和「待审核」状态;开发环境可直接 mock 登录

apps/backend/app/schemas/xcx_auth.py

  • 变更类型:修改
  • 原始原因dev-login 端点需要请求 schema
  • 思路分析:新增 DevLoginRequestopenid + 可选 status
  • 修改结果:开发模式登录接口有明确的请求校验

apps/backend/app/schemas/member_retention_clue.py

  • 变更类型:新增/修改
  • 原始原因member_birthday 重构为 member_retention_clue维客线索
  • 思路分析:扩展 schema 以支持维客线索的完整字段
  • 修改结果:维客线索 API 有完整的请求/响应 schema

apps/backend/app/services/application.py

  • 变更类型:修改
  • 原始原因:用户提交申请后需要自动将状态从 new 流转为 pending
  • 思路分析:在 create_application 末尾新增 UPDATE auth.users SET status='pending' WHERE status IN ('new','rejected')
  • 修改结果:申请提交后用户状态自动流转,前端可据此显示「审核中」页面

apps/backend/app/services/wechat.py

  • 变更类型:修改
  • 原始原因WX_APPID/WX_SECRET 应从 config 模块级常量读取,而非每次调用时 get()
  • 思路分析:改为 from app.config import WX_APPID, WX_SECRET减少重复环境变量读取
  • 修改结果:微信配置读取更高效、更一致

apps/etl/connectors/feiqiu/config/defaults.py

  • 变更类型:修改
  • 原始原因ETL 配置需要支持 business_day_start_hour 参数
  • 思路分析:在 DEFAULTS["app"] 中新增 business_day_start_hour: 8
  • 修改结果ETL 配置默认值包含营业日分割点

apps/etl/connectors/feiqiu/config/env_parser.py

  • 变更类型:修改
  • 原始原因BUSINESS_DAY_START_HOUR 环境变量需要映射到配置路径
  • 思路分析ENV_MAP 新增 BUSINESS_DAY_START_HOUR → app.business_day_start_hour
  • 修改结果:环境变量可覆盖默认的营业日分割点

apps/etl/connectors/feiqiu/config/settings.py

  • 变更类型:修改
  • 原始原因AppConfig 需要暴露 business_day_start_hour 属性
  • 思路分析:新增属性或配置项读取 app.business_day_start_hour
  • 修改结果ETL 任务可通过 AppConfig 获取营业日分割点

apps/etl/connectors/feiqiu/orchestration/flow_runner.py

  • 变更类型:修改
  • 原始原因:调度逻辑需要适配营业日分割
  • 思路分析flow_runner 调整以传递 biz_date 上下文给下游任务
  • 修改结果ETL 调度链路支持营业日感知

apps/etl/connectors/feiqiu/quality/consistency_checker.py

  • 变更类型:修改
  • 原始原因:一致性检查需要适配 biz_date 分割逻辑
  • 思路分析大幅重构136 行变更),检查逻辑按营业日而非自然日对齐
  • 修改结果:数据一致性检查与营业日分割规则对齐

apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py

  • 变更类型:修改
  • 原始原因:所有 DWS 任务需要统一的 biz_date 计算逻辑
  • 思路分析:在 base 类中注入 biz_date 计算(基于 business_day_start_hour子类自动继承
  • 修改结果DWS 任务基类统一提供营业日分割能力20+ 子类无需各自实现

DWS 子任务批量变更(简要)

  • assistant_customer_task.pyassistant_daily_task.pyassistant_finance_task.pyassistant_monthly_task.pyassistant_order_contribution_task.py:助教相关 DWS 任务适配 biz_date
  • finance_base_task.pyfinance_discount_task.pyfinance_income_task.pyfinance_recharge_task.py:财务 DWS 任务适配 biz_date
  • goods_stock_daily_task.pygoods_stock_monthly_task.pygoods_stock_weekly_task.py:库存 DWS 任务适配 biz_date
  • index/member_index_base.pyindex/relation_index_task.pyindex/spending_power_index_task.py:指标任务适配 biz_date
  • member_consumption_task.pymember_visit_task.py:会员 DWS 任务适配 biz_date
  • tasks/verification/index_verifier.py:指标验证适配
  • tasks/dwd/dwd_load_task.pyDWD 加载微调

packages/shared/src/neozqyy_shared/datetime_utils.py

  • 变更类型:新增
  • 原始原因营业日计算逻辑需要跨模块共享ETL + 后端 + 未来小程序)
  • 思路分析:提供 get_business_date() 等工具函数,以 start_hour 为参数计算当前营业日
  • 修改结果:共享包提供统一的营业日计算工具,避免各模块重复实现

apps/backend/app/middleware/permission.py

  • 变更类型:修改
  • 原始原因:权限中间件需要适配新的用户状态三态
  • 思路分析:调整权限检查逻辑以识别 new/pending/approved 状态
  • 修改结果:权限中间件正确处理三态用户的访问控制

apps/backend/app/routers/admin_applications.py

  • 变更类型:新增
  • 原始原因:管理端需要审核用户申请的接口
  • 思路分析:提供申请列表查询 + 审批/拒绝操作的 REST 端点
  • 修改结果:管理端可查看和处理用户申请

apps/backend/app/routers/business_day.py

  • 变更类型:新增
  • 原始原因:管理后台需要查询营业日配置
  • 思路分析GET /api/business-day/config 返回 start_hour
  • 修改结果:前端可获取营业日分割配置

apps/backend/app/routers/member_retention_clue.py

  • 变更类型:新增(替换 member_birthday
  • 原始原因member_birthday 功能重构为更通用的维客线索模块
  • 思路分析:扩展原有生日提醒为完整的维客线索管理
  • 修改结果:后端提供维客线索 CRUD 接口

本次对话新增文件

docs/audit/prompt_logs/prompt_log_20260227_075054.md

  • 变更类型:新增
  • 原始原因Prompt 审计日志自动记录
  • 思路分析agent-on-stop hook 自动生成
  • 修改结果:本次对话的 Prompt 已归档

scripts/ops/_check_etl_log_tail.py

  • 变更类型:新增
  • 原始原因:运维需要快速查看 ETL 最近日志尾部
  • 思路分析:一次性运维脚本,读取 ETL 日志文件末尾内容
  • 修改结果:提供便捷的 ETL 日志查看工具

文件清单Files changed

共 53 个高风险/业务文件(不含 .kiro 内部、docs/prd、tmp 清理等):

# 文件 变更类型
1 .env 修改
2 .env.template 修改
3 .gitignore 修改
4 apps/admin-web/src/App.tsx 修改
5 apps/admin-web/src/api/businessDay.ts 新增
6 apps/admin-web/src/components/BusinessDayHint.tsx 新增
7 apps/admin-web/src/pages/TaskConfig.tsx 修改
8 apps/admin-web/src/pages/TaskManager.tsx 修改
9 apps/admin-web/src/store/businessDayStore.ts 新增
10 apps/backend/README.md 修改
11 apps/backend/app/config.py 修改
12 apps/backend/app/main.py 修改
13 apps/backend/app/middleware/permission.py 修改
14 apps/backend/app/routers/admin_applications.py 新增
15 apps/backend/app/routers/business_day.py 新增
16 apps/backend/app/routers/member_retention_clue.py 新增
17 apps/backend/app/routers/tasks.py 修改
18 apps/backend/app/routers/xcx_auth.py 修改
19 apps/backend/app/schemas/member_retention_clue.py 修改
20 apps/backend/app/schemas/xcx_auth.py 修改
21 apps/backend/app/services/application.py 修改
22 apps/backend/app/services/wechat.py 修改
23 apps/etl/connectors/feiqiu/config/defaults.py 修改
24 apps/etl/connectors/feiqiu/config/env_parser.py 修改
25 apps/etl/connectors/feiqiu/config/settings.py 修改
26 apps/etl/connectors/feiqiu/orchestration/flow_runner.py 修改
27 apps/etl/connectors/feiqiu/quality/consistency_checker.py 修改
28 apps/etl/connectors/feiqiu/scripts/debug/debug_blackbox.py 修改
29 apps/etl/connectors/feiqiu/scripts/run_update.py 修改
30 apps/etl/connectors/feiqiu/tasks/dwd/dwd_load_task.py 修改
31 apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py 修改
32 apps/etl/connectors/feiqiu/tasks/dws/assistant_daily_task.py 修改
33 apps/etl/connectors/feiqiu/tasks/dws/assistant_finance_task.py 修改
34 apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py 修改
35 apps/etl/connectors/feiqiu/tasks/dws/assistant_order_contribution_task.py 修改
36 apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py 修改
37 apps/etl/connectors/feiqiu/tasks/dws/finance_base_task.py 修改
38 apps/etl/connectors/feiqiu/tasks/dws/finance_discount_task.py 修改
39 apps/etl/connectors/feiqiu/tasks/dws/finance_income_task.py 修改
40 apps/etl/connectors/feiqiu/tasks/dws/finance_recharge_task.py 修改
41 apps/etl/connectors/feiqiu/tasks/dws/goods_stock_daily_task.py 修改
42 apps/etl/connectors/feiqiu/tasks/dws/goods_stock_monthly_task.py 修改
43 apps/etl/connectors/feiqiu/tasks/dws/goods_stock_weekly_task.py 修改
44 apps/etl/connectors/feiqiu/tasks/dws/index/member_index_base.py 修改
45 apps/etl/connectors/feiqiu/tasks/dws/index/relation_index_task.py 修改
46 apps/etl/connectors/feiqiu/tasks/dws/index/spending_power_index_task.py 修改
47 apps/etl/connectors/feiqiu/tasks/dws/member_consumption_task.py 修改
48 apps/etl/connectors/feiqiu/tasks/dws/member_visit_task.py 修改
49 apps/etl/connectors/feiqiu/tasks/verification/index_verifier.py 修改
50 apps/etl/connectors/feiqiu/tests/unit/test_config.py 修改
51 packages/shared/src/neozqyy_shared/__init__.py 修改
52 packages/shared/src/neozqyy_shared/datetime_utils.py 新增
53 scripts/ops/_check_etl_log_tail.py 新增

DB 文档全量对账

对账时间2026-02-27 08:11:17测试库test_etl_feiqiu + test_zqyy_app

指标 数值
数据库实际表总数 131
已有文档引用数 150
缺失文档的表数 57

缺失文档的表(按 schema 分组)

core 层7 表)

  • core.dim_assistant9 列)、core.dim_goods_category5 列)、core.dim_member8 列)
  • core.dim_site6 列)、core.dim_table5 列)
  • core.fact_payment7 列)、core.fact_settlement12 列)

dwd 层16 表)

  • dwd.dim_goods_category16 列)、dwd.dim_groupbuy_package22 列)、dwd.dim_groupbuy_package_ex25 列)
  • dwd.dim_member_card_account_ex61 列)、dwd.dim_member_ex14 列)
  • dwd.dim_site17 列)、dwd.dim_site_ex25 列)
  • dwd.dwd_assistant_trash_event11 列)、dwd.dwd_assistant_trash_event_ex4 列)
  • dwd.dwd_groupbuy_redemption25 列)、dwd.dwd_groupbuy_redemption_ex28 列)
  • dwd.dwd_payment12 列)、dwd.dwd_platform_coupon_redemption20 列)、dwd.dwd_platform_coupon_redemption_ex6 列)
  • dwd.dwd_refund12 列)、dwd.dwd_refund_ex20 列)
  • dwd.dwd_settlement_head_ex30 列)、dwd.dwd_table_fee_adjust16 列)
  • dwd.dwd_table_fee_adjust_ex13 列)、dwd.dwd_table_fee_log_ex13 列)

dws 层4 表)

  • dws.cfg_area_category10 列)、dws.cfg_skill_type9 列)
  • dws.dws_ml_manual_order_alloc19 列)、dws.dws_ml_manual_order_source27 列)

meta 层3 表)

  • meta.etl_cursor10 列)、meta.etl_run23 列)、meta.etl_task12 列)

ods 层11 表)

  • ods.assistant_cancellation_records19 列)、ods.group_buy_packages43 列)
  • ods.group_buy_redemption_records57 列)、ods.member_profiles26 列)
  • ods.member_stored_value_cards80 列)、ods.payment_transactions17 列)
  • ods.platform_coupon_redemption_records31 列)、ods.refund_transactions37 列)
  • ods.settlement_records71 列)、ods.stock_goods_category_tree16 列)
  • ods.table_fee_discount_records33 列)、ods.table_fee_transactions47 列)

zqyy_app public 层10 表)

  • public.admin_users8 列)、public.approvals7 列)、public.permissions4 列)
  • public.role_permissions2 列)、public.roles5 列)
  • public.scheduled_tasks13 列)、public.task_execution_log14 列)
  • public.task_queue10 列)、public.tasks9 列)
  • public.user_roles3 列)、public.users8 列)

对账结论

  • 新增文档数0本次仅记录缺失清单未自动生成
  • 更新文档数0
  • 废弃标注数0
  • ⚠️ 57 张表缺少 BD_Manual 文档建议分批补全优先级core/meta > dws > dwd > ods > public
  • ⚠️ DDL 基线has_ddl_baseline=false待合并