Files
Neo-ZQYY/CLAUDE.md
Neo 8228b3fa37 chore: migrate IDE environment from Kiro to Claude Code
- Add CLAUDE.md (root + ETL subdirectory + db subdirectory) consolidating all Kiro steering docs
- Add .mcp.json migrated from .kiro/settings/mcp.json (test DBs enabled, prod disabled)
- Add .claude/commands/ (audit, doc-sync, db-docs) replacing Kiro skills
- Add .claude/hooks/ (session_start, post_edit_audit, stop_audit_check) replacing Kiro hooks
- Add .claude/settings.json registering all hooks
- Add scripts/audit/prescan.py merging Kiro's audit_flagger + compliance_prescan
- Remove .kiro/agents, hooks, scripts, settings, skills, state (migrated or obsolete)
- Update .gitignore for Claude Code

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 15:48:08 +08:00

11 KiB
Raw Blame History

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

项目概览

NeoZQYY Monorepo — 面向台球门店业务的全栈数据平台。多门店隔离(site_id + RLS领域语言中文货币 CNY金额 numeric(2)

子系统

目录 说明
apps/etl/connectors/feiqiu/ 飞球 ConnectorAPI → ODS → DWD → DWS
apps/backend/ FastAPI 后端JWT 双认证、WebSocket、AI 集成)
apps/miniprogram/ 微信小程序C 端Donut + TDesign
apps/admin-web/ 系统管理后台React+Vite+AntD— 开发/运维视角,操作 ETL 库
apps/tenant-admin/ 租户管理后台React+Vite+AntD— 门店管理员视角,操作业务库
apps/mcp-server/ MCP ServerPostgreSQL 只读AI 工具集成)
packages/shared/ 跨项目共享包enums, money, datetime_utils
db/ DDL / 迁移 / 种子数据

两个管理后台的区别

  • admin-web:开发/运维用ETL 配置、数据质量、系统监控,全局视角
  • tenant-admin:门店管理员用(site_admin/tenant_admin),用户审核/管理、Excel 上传、维客线索,门店隔离视角

技术栈

  • Python 3.10+uv workspace4 成员etl/connectors/feiqiu、backend、mcp-server、shared
  • 前端React + Vite + Ant Design各应用独立 pnpm
  • PostgreSQL 四库:etl_feiqiu / test_etl_feiqiuETL六层 Schemazqyy_app / test_zqyy_app(业务)
  • DSNPG_DSNETLAPP_DB_DSN(业务),根 .env 定义
  • 配置分层:.env < .env.local < 环境变量 < CLI 参数

常用命令

# 依赖安装
uv sync                              # Python 全量安装
cd apps/admin-web && pnpm install    # 前端admin-web / tenant-admin 各自独立)

# 开发服务器
cd apps/backend && uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload
cd apps/admin-web && pnpm dev        # port 5173
cd apps/tenant-admin && pnpm dev

# ETL
cd apps/etl/connectors/feiqiu
python -m cli.main --dry-run --tasks DWD_LOAD_FROM_ODS
python -m cli.main --pg-dsn "$PG_DSN" --store-id "$STORE_ID" --api-token "$API_TOKEN"

# 测试
cd apps/etl/connectors/feiqiu && pytest tests/unit         # ETL 单元测试
cd apps/etl/connectors/feiqiu && pytest tests/integration --with-db  # ETL 集成测试
cd apps/backend && pytest tests/                           # 后端测试
cd /c/NeoZQYY && pytest tests/ -v                          # Monorepo 属性测试hypothesis
cd apps/admin-web && pnpm test                             # 前端 Vitest
cd apps/admin-web && pnpm e2e                              # Playwright e2e
cd apps/admin-web && pnpm lint                             # TypeScript 检查
cd apps/miniprogram && npm test                            # 小程序 Jest

架构模式

数据库

  • 六层 Schemametaods(原始)→ dwd(规范化)→ core(聚合)→ dws(业务汇总)→ appRLS 视图)
  • 跨库访问:zqyy_app 通过 FDW 只读映射 etl_feiqiu.app schema
  • 多门店隔离:site_id + RLSapp schema 视图层通过 app.current_site_id 会话变量过滤

RLS 视图双 Schema 规则(踩坑 2026-03-29

新建 DWS/DWD 表的 RLS 视图必须同时在原 schemadws)和 app schema 创建。后端通过 app.v_* 访问。只在 dws 创建会导致后端查询失败。迁移模板:先 CREATE VIEW dws.v_xxx,再 CREATE VIEW app.v_xxxWHERE 条件相同。回滚需逆序 DROP。

ETL

  • 任务模式:继承 BaseTaskExtract → Transform → Loadorchestration/task_registry.py 注册
  • 加载器模式:每张目标表一个 Loaderupsert() + 冲突处理
  • SCD2 处理:scd/ 模块
  • Flow--pipeline 参数指定(如 api_full

后端

  • 全局响应包装:ResponseWrapperMiddleware 把所有 2xx 响应包为 { "code": 0, "data": <payload> }
  • CamelModel 基类snake_case → camelCase 自动转换(小程序 API 用)
  • JWT 双认证用户名密码admin+ 微信 code小程序待审核用户有 limited token
  • AI 集成8 个千问应用通过 DashScope SDKchat/finance/clue/analysis/tactics/note/customer/consolidate带熔断、限流、预算追踪
  • 后台服务lifespanTaskQueue(按 site_id 消费)、Scheduler(读 scheduled_tasks 自动入队、4 个触发器

文件归属规则

判断标准 放置位置
只有本模块开发者需要看的文档 模块内 docs/
跨模块对照或全局视角的文档 docs/
只验证本模块逻辑的测试 模块内 tests/
守护 monorepo 结构/约定的测试 tests/
只操作本模块数据的脚本 模块内 scripts/
运维/全局工具脚本 scripts/
审计记录(任何模块的变更) docs/audit/ — 禁止写入子模块
数据库文档(全局 schema 视角) docs/database/

审计产物路径:

  • 变更记录:docs/audit/changes/<YYYY-MM-DD>__<slug>.md
  • 审计一览表:docs/audit/audit_dashboard.mdscripts/audit/gen_audit_dashboard.py 自动生成,勿手动编辑)

飞球数据规范

权威文档:docs/reports/DWD-DOC/DWD 12 条)+ 同目录 DWS 权威规范。与 BD 手册、ETL 文档、DDL 注释冲突时以 DWD-DOC 为准。

硬规则速查

  1. consume_money 禁止直接计算 → 用 items_sum = table_charge_money + goods_money + assistant_pd_money + assistant_cx_money + electricity_money
  2. 助教费用拆分:assistant_pd_money(陪打)+ assistant_cx_money(超休),禁止用 service_fee / ASSISTANT_BASE / ASSISTANT_BONUS
  3. 支付恒等式:balance_amount = recharge_card_amount + gift_card_amount,三者不可重复计算
  4. settle_type 过滤:正向交易 IN (1, 3),本表无 is_delete 字段
  5. 会员信息通过 member_id JOIN 维度表(scd2_is_current=1结算单冗余字段不可靠DQ-6/DQ-7
  6. 支付方式拆分来源是 dwd_paymentDQ-8payment_method=2 现金,payment_method=4 扫码。dwd_settlement_head_ex.cash_amount/online_amount 不可靠
  7. 散客:member_id ≤ 0,全链路过滤入口加 member_id > 0
  8. 课程类型/定价/绩效档位/奖金/指数权重 → 配置表读取,禁止硬编码
  9. DWS 汇总表 delete-before-insert库存表 upsert
  10. 折扣互斥:discount_manual + discount_other = adjust_amount
  11. 现金流互斥:platform_settlement_amountgroupbuy_pay_amount 互斥
  12. 废单判断:dwd_assistant_service_log_ex.is_trash

取数优先级

DWS > DWD明细+维度表)> 禁止 ODSAPI 快照表,同一 id 有 100+ 行重复JOIN 会行膨胀)

参考优先级

DWD-DOC > DWS 权威规范 > BD 手册 > ETL 任务文档 > 业务规则文档 > DDL 注释

废弃对象黑名单(禁止引用)

  • dwd_assistant_trash_event / _ex2026-02-22 DROP→ 用 dwd_assistant_service_log_ex.is_trash
  • ods.assistant_cancellation_records2026-02-22→ 无需独立链路
  • ODS_ASSISTANT_ABOLISH / ASSISTANT_ABOLISH2026-02-22→ 无
  • BILLIARD_VIP2026-03-07→ V1-V4 归 BILLIARDV5 归 SNOOKER
  • dws_member_recall_index / v_dws_member_recall_index2026-03-20→ WBI + NCI
  • 所有 _archived/ 目录禁止读取或参考

编码前需求审问(强制)

新建功能/模块/页面/接口、重构、多模块联动、需求存在模糊或隐含假设时:

  1. 不立即动手,先提问循环(每轮 3-5 个问题)
  2. 必问维度:用户角色、核心操作、完成后果、数据写入/展示/来源、错误/成功反馈、认证权限、存储(哪个库/新表?)、终端适配、边界条件(并发/幂等/超时)
  3. 输出「需求确认摘要」,用户确认后才进入实施

例外:用户说"直接改/跳过审问/不用问了"、Bug 修复(有明确复现步骤)、纯格式/文档调整、已有完整 spec

逻辑改动前置调研(强制)

任何逻辑改动ETL/业务规则/API/数据模型/前端交互),写代码前必须完成调研:

  1. 用 Explore 子代理调研:目标模块文件、docs/audit/changes/ 历史审计、相关 README/PRD/BD 手册、要修改的文件及其调用方/被调用方、数据流向(上游→当前→下游)、影响范围
  2. 输出「改动前上下文摘要」(模块职责、历史变更、影响范围、风险点),用户确认后开始实施

流程:需求审问 → 用户确认 → 前置调研 → 用户确认 → 编码实施

例外:纯格式调整、注释/文档纯文字修改、用户说"直接改/跳过调研"、新建文件且不涉及已有逻辑

数据库 Schema 变更规则

修改任何影响 PostgreSQL schema 的内容(迁移/DDL/表定义/ORM 模型)时,必须同步更新 docs/database/

  • 变更说明:新增/修改/删除的表、字段、约束、索引
  • 兼容性:对 ETL、后端 API、小程序字段映射的影响
  • 回滚策略:如何撤销
  • 验证步骤:至少 3 条校验 SQL

测试与验证环境规范

  1. 必须 load_dotenv 加载根 .env;必需变量缺失时立即报错,禁止静默回退空字符串
  2. cwd 与正式一致ETL → apps/etl/connectors/feiqiu/;后端 → apps/backend/
  3. 配置走 AppConfig.load() 正常流程,不得为测试单独构造简化配置
  4. 数据库使用测试库(TEST_DB_DSN),禁止连正式库
  5. 属性测试分组执行:每次单个测试函数或 -k 筛选禁止一次性跑全部hypothesis 默认 max_examples=100

例外:用户指定简化环境、纯单元测试用 FakeDB/FakeAPI、--dry-run CLI 验证

脚本规范

  • 复杂操作优先写 Python 脚本,避免复杂 shell 逻辑
  • 一次性运维脚本 → scripts/ops/;模块专属 → 模块内 scripts/
  • scripts/ops/ 中的脚本不在 uv workspace 内,导入 ETL 纯函数需用 importlib.util + stub 方式(参考 scripts/ops/backfill_finance_area_daily.pytests/conftest.py

子代理使用原则

  • 委托子代理批量文件读取≥3 个)、大范围搜索、不熟悉的模块探索、多步骤 shell 操作
  • 主流程直接处理:单个已知文件、简单单条命令、小范围精确搜索

审计

任何逻辑改动必须可追溯、可验证、可回滚。

完成一轮改动后,使用 /audit 命令执行审计。流程:

  1. 运行 python scripts/audit/prescan.py 预扫描(自动识别变更文件、分类风险、合规检查,零 token
  2. 补充语义上下文(从对话记忆中提取每个变更的原因和思路)
  3. 委托子代理写审计记录到 docs/audit/changes/
  4. 补齐缺失的文档同步
  5. 运行 python scripts/audit/gen_audit_dashboard.py 刷新审计一览表

预扫描脚本支持 --files 参数:当 git status 包含大量历史未提交变更时,可只传入本次会话涉及的文件列表。

已废弃(不再使用):

  • Prompt-ID 溯源、docs/audit/prompt_logs/ — Claude Code 原生 session 日志已覆盖
  • AI_CHANGELOG 文件内标记 — git blame 替代
  • CHANGE 块级代码标记 — git blame 替代
  • Session 日志 (docs/audit/session_logs/) — Claude Code 原生 session 存储已覆盖