|
|
2dfc926f96
|
feat(ai): W1-AI-CLOSURE 超级 Sprint — 9 APP 全链路收口 + chat 上下文真激活
Phase 2.3 chat 上下文捕获链路从未真正激活到完整工作:
- 14 处 ai-float-button 补 sourcePage,chat.ts 三分支同步设 pageFilters.contextId
- 后端 page_context 4 层 BUG 修(列名错位 + RLS site_id 未重设)
- xcx_chat filters.pop 破坏 body.page_context 引用 — dict() 浅拷贝隔离
- chat 流式 markdown 实时解析(表格/标题/列表/加粗 + KPI 富卡)
- reference_card KPI 富卡接入 SSE 路径,db 真写入
- 维客线索 source 显示规则:AI 来源用机器人 icon 替代长文字
数据库:
- public.member_retention_clue 加 emoji + runtime_mode + sandbox_instance_id
- biz.ai_run_logs 加 assistant_id + 复合索引
- chk_ai_cache_type CHECK 约束 8 类应用名
- cache_type / app_type 命名统一(app6_note / app7_customer / app8_consolidation)
- 历史 emoji 抽取脚本 44/44 成功
后端 silent failure 修:
- cleanup_service WHERE app_type → cache_type(90 天清理 + 20K 上限重新生效)
- _build_ai_insight 字段错位修复(app4 → app7 + 字段对齐 prompt schema)
- task_manager talkingPoints 改 app5_tactics + tactics 字段
- task_manager aiSuggestion 改取 one_line_summary
- cache_service.CACHE_EXPIRY_DAYS 加 app2a_finance_area
- WS /ws/ai-cache 加 token + JWT + site_id 校验(P0 信息泄露漏洞)
- internal_ai token 改 hmac.compare_digest
工具/文档:
- main.py 加 RotatingFileHandler logs/backend.log + uvicorn /health 过滤
- 新建 utils/clue_category.py(VI 6 类配色 + emoji fallback + source 显示规则)
- 新建 utils/markdown.ts(轻量 md 转 rich-text 解析 + streaming 容错)
- audit + 数据库变更说明 + backlog §七 #14 收口 + #15-#38 残余子任务
- backlog 追加 §十一 App1 参数/MCP/沙箱审计 + §十二 百炼/SQL MCP 主任务线
实地 MCP 走查:14 入口数据层 + 5 代表入口 sourcePage 注入 + customer-detail 全模块 + chat md 渲染 + reference_card 富卡 都已验证。9 项预先 BUG/UX 登记 §七 #29-#38 后续修复。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 16:39:07 +08:00 |
|
|
|
c446920c9e
|
feat(backend): F1-6 sprint2 #5 累计 GMV 加入 sandbox_replay (门店级)
Sprint 2 收尾指标:门店级累计 GMV(与 #1-#4 会员级粒度不同),新建
sandbox_replay/finance_replay.py 模块。无原 fdw_queries.get_total_gmv
函数(0 现有调用方),不写 thin wrapper(spec §5.5 决策原则)。
数据源 dws_finance_daily_summary.gross_amount(门店日度财务汇总,daily 累计)。
SQL 模式 SUM(gross_amount) WHERE stat_date <= ctx.business_date,与 #1-#4
取最新单行不同,是多行累计 SUM。SQL 层 COALESCE(SUM(...), 0) 兜底,无数据
返回 Decimal('0')(开店前累计 GMV = 0,业务语义)。
口径 gross_amount = table_fee + goods + assistant_pd + assistant_cx,**不含
electricity_money**(与会员级 items_sum 略有差异,docstring 明确防止交叉验证)。
双口径数值验证 PASS(直接 Python,site=2790685415443269 朗朗桌球):
- 4a live(today=2026-05-05): ¥5,725,837.51
- 4b sandbox=2026-04-20: ¥5,653,063.37(差异 ¥72,774,即 4-21~4-27 七天合计)
新增防御性回归测试 test_get_total_gmv_no_member_ids_param 阻断未来误加
member_id 参数(门店级粒度强约束)。
unit test sprint1+sprint2 累计 28/28 PASS,无回归。
Sprint 2 收尾(4 项迁移 + #3 推迟 Sprint 3 等 ETL 配合)。
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_total_gmv.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 01:32:14 +08:00 |
|
|
|
7b1cfadc2e
|
feat(backend): F1-6 sprint2 #4 储值卡余额迁移 sandbox_replay (SCD2 时光机)
新建 sandbox_replay/balance_replay.py 模块,迁移 fdw_queries.get_member_balance,
fdw_queries 改 thin wrapper 保持 5 处现有调用(chat/coach/customer x2/task_manager)
透明兼容。
数据源 dim_member_card_account 是 SCD2 维度表(原生支持时光机),sandbox 改造
关键是替换 scd2_is_current=1 过滤为 scd2_start_time + scd2_end_time 时间过滤
(ref_date+1day 边界 = 当天结束时仍 active 的版本,timestamptz 比较稳定)。
双口径 UI 走查 PASS(member=2799207363643141 葛先生,SCD2 历史余额变化样本):
- 4a live(today=2026-05-05): 储值余额 ¥6,602
- 4b sandbox=2026-04-20: 储值余额 ¥18,080(差异 1.1w+,时光机效果显著)
unit test sprint1+sprint2 累计 24/24 PASS,无回归。
附带本次 sprint 2 触发的架构级登记:
- 新建 docs/_overview/architecture-evolution-backlog.md(DWD 孤立 + Core 中间件 +
库重组,长远架构演进 backlog)
- F1-6-tasks.md 登记 #3 累计交易笔数推迟 Sprint 3(ETL 配合新增
total_open_table_count,因现有 total_visit_count 实算 COUNT(settle_type IN (1,3))
含商城订单,不符 Neo "开台次数"业务语义)
- sandbox-replay-engine-spec §5.5 thin wrapper 决策原则(已在 #2 commit)
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_member_balance.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 01:26:18 +08:00 |
|
|
|
32716bc71a
|
feat(backend): F1-6 sprint2 #2 累计消费总额加入 sandbox_replay
新增指标(无 fdw_queries 原查询 + 0 现有调用方 + 无 thin wrapper),沿用
sprint 1/sprint2 #1 模式 @trace_service + @runtime_aware decorator + 显式
stat_date <= ctx.business_date 上界 + dws_member_consumption_summary
.total_consume_amount 字段 items_sum 口径。
双口径数值验证 PASS(member=2799207087163141 黄先生,直接 Python 调用):
- 4a live(today=2026-05-05): get_total_consume_amount=1252.65
- 4b sandbox=2026-04-20: get_total_consume_amount=999.99(walkthrough 测试快照)
unit test sprint1+sprint2 累计 19/19 PASS,无回归。
记录 thin wrapper 决策原则到 spec §5.5(迁移辅助层,非常态架构;
fdw_queries 长远退化纯 ETL 物理访问层,清理放收尾 sprint)。
注:#3 累计交易笔数因 spec §4 字段未明确(dws_order_summary vs
total_visit_count)暂停,等 Neo 决断后继续。
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_total_consume_amount.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 00:52:08 +08:00 |
|
|
|
d418621951
|
feat(backend): F1-6 sprint2 #1 60d 消费迁移到 sandbox_replay
迁移 fdw_queries.get_consumption_60d 到 sandbox_replay.consumption_replay,
沿用 sprint 1 模式: @trace_service + @runtime_aware decorator + 显式
stat_date <= ctx.business_date 上界(与视图过滤双保险),fdw_queries 改
thin wrapper 保持 customer_service 2 处调用兼容。
双口径走查 PASS(member=2799207087163141 黄先生):
- 4a live(today=2026-05-05): 小程序 stat 卡条 60天消费 ¥115(consume_amount_60d=115.36)
- 4b sandbox=2026-04-20: 小程序 stat 卡条 60天消费 ¥89(walkthrough 测试快照 88.88)
unit test sprint1+sprint2 累计 15/15 PASS,无回归。
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_consumption_60d.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 00:27:13 +08:00 |
|
|
|
9f1e35d71a
|
feat(backend): F1-6 sprint1 sandbox_replay 模块脚手架 + get_last_visit_days 迁移试点 (W1)
F1-5b 完成后启动 F1-6 沙箱时光机阶段 B,Sprint 1 范围:
1. 建立 sandbox_replay 模块脚手架
2. 实现 @runtime_aware decorator(自动注入 RuntimeContext)
3. 试点迁移 1 个指标:get_last_visit_days(P1-4 距上次到店天数)
4. MCP 端到端 4a/4b 双口径走查
新增文件:
- apps/backend/app/services/sandbox_replay/__init__.py(模块入口 + re-export)
- apps/backend/app/services/sandbox_replay/_decorator.py(@runtime_aware 实现)
- apps/backend/app/services/sandbox_replay/consumption_replay.py(get_last_visit_days 试点)
- docs/_overview/wave1-findings/F1-6-tasks.md(F1-6 任务清单 4 个 sprint)
- docs/audit/changes/2026-05-05__f1_6_sprint1_sandbox_replay_kickoff.md(Sprint 1 审计)
修改:
- apps/backend/app/services/fdw_queries.py:218-238
get_last_visit_days 改 thin wrapper,委托 sandbox_replay.consumption_replay
保持 75+ 现有调用点无感兼容
关键 bug 修复:@trace_service + @runtime_aware 嵌套 sig.bind 失败
- 现象:仅 FastAPI 请求 + 有活跃 TraceContext 时复现
(直接 Python 脚本 get_current_trace 返回 None,跳过 _build_params_dict)
- 根因:functools.wraps 设置 __wrapped__ 让 inspect.signature 追溯原函数
→ bind 时缺 keyword-only 必传 ctx → TypeError
- 修复:_decorator.py 不用 functools.wraps,手动复制元信息但不设
__wrapped__,inspect.signature 看到 wrapper 自身 (*args, **kwargs)
测试:
- unit test 10/10 PASS(本地 .gitignore:71 不入仓)
- 直接 customer_service.get_customer_detail PASS(独立诊断脚本)
- etl_conn 复用模式 PASS
MCP 双口径(member=2799207087163141 黄先生):
- 4a live (today=2026-05-05): daysSinceVisit=32(05-05 - 04-03)
- 4b sandbox=2026-04-20: daysSinceVisit=31(04-20 - 03-20)
通过插 walkthrough 测试快照 stat_date=2026-04-15 演示
(测试库 dws_member_consumption_summary 仅 stat_date=2026-05-01 一行,
sandbox=4-20 时被视图层 stat_date <= business_date_now() 过滤)
- 测试快照已清理,sandbox 已切回 live
Sprint 2-4 待启动(见 F1-6-tasks.md):
- Sprint 2:5 个会员 P1 指标(余额/60d 消费/累计交易/GMV/累计服务客户数)
- Sprint 3:5 个助教/门店 P1 + MP-2 完整(含 ETL 改造)
- Sprint 4:5 个 P2 算法重算指标
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 23:53:19 +08:00 |
|
|
|
16c6fb0d3b
|
fix(backend): F1-5b A6 ETL 连接显式 client_encoding=UTF8 防御 GBK (W1)
Windows GBK 环境下 psycopg2/libpq 在拼接连接字符串时,会读取系统
用户名 / 计算机名,若含中文(0xd6 是 GBK 首字节)会触发
UnicodeDecodeError。admin_db_health.py:105-115 已用显式 DSN +
PGCLIENTENCODING 修过,但 database.py 中的 4 个 connect 函数遗漏。
变更:
- apps/backend/app/database.py
- 新增 _CONN_KWARGS = {**_KEEPALIVE_KWARGS, "client_encoding": "UTF8"}
- 4 处 psycopg2.connect 调用从 **_KEEPALIVE_KWARGS 改为 **_CONN_KWARGS:
* get_connection(zqyy_app 业务库)
* get_etl_global_readonly_connection(ETL 全局只读)
* get_etl_readonly_connection(ETL RLS 只读)
* get_etl_write_connection(ETL 可写)
业务影响:
- 影响 75+ 调用点(grep 统计),Windows GBK 环境下未来出现
UnicodeDecodeError 概率大幅降低
- Linux UTF-8 环境无影响
- ETL RLS / FDW 链路无逻辑变化(client_encoding 是协议层)
验证:
- 后端 reload + /health 200 OK
- /api/admin/db-health 测试库 connected(test_zqyy_app + test_etl_feiqiu)
- BE-3 / T3 unit test 5/5 PASS,间接证明 ETL 连接链路无破坏
§3.3 标"sandbox 无关",4b 跳过(client_encoding 是协议层,与 sandbox
业务时钟无关)。
未加 feature flag ETL_FORCE_UTF8(§8.3 兜底建议):client_encoding=UTF8
是 PostgreSQL 默认安全设置,无需 flag 控制。若未来出现特殊业务字段
含非 UTF-8 字节再考虑加 flag。
审计:docs/audit/changes/2026-05-05__wave1_f1_5b_a6_etl_conn_utf8.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 22:11:43 +08:00 |
|
|
|
3916085063
|
fix(miniprogram): F1-5b MP-4 coach-detail id 边界保护 (W1)
走查发现 pages/coach-detail 在某种入口下 data.coachId 为 undefined /
空字符串,导致后端 /api/xcx/coaches/undefined 请求 422,体现为助教
详情页加载失败。后端日志多次出现该 422 记录。
变更:
- apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts:247
onLoad 加 guard(参考 coach-service-records.ts 同款模式):
- 检查 options.id 非空 + 非字面 'undefined'
- 数字格式校验 (^\d+$)
- 失败时 wx.showToast("缺少助教标识") + 1s 后 navigateBack
(失败时 fallback switchTab board-finance)
双口径验证(weixin-devtools-mcp):
- 缺参入口 /pages/coach-detail/coach-detail(无 query) → guard 触发,
toast 显示 + 退回 board-finance,不再发出 422 请求
- 正常入口 ?id=3148987180059141 → 通过 guard,pageState=normal 加载成功
§3.3 标"sandbox 无关",4b 跳过(权限/参数路径与 sandbox 无关联)。
审计:docs/audit/changes/2026-05-05__wave1_f1_5b_mp4_coach_detail_id_guard.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 19:17:02 +08:00 |
|
|
|
c43375734a
|
feat(admin-web,backend): F1-5b Wave B UI-3 + UI-5 admin-web sandbox 透出补强 (W1)
UI-3 AIDashboard sandbox 提示 + today_calls 分组:
- 后端 schemas/admin_ai.py DashboardResponse 加 today_live_calls / today_sandbox_calls 字段(默认 0,向后兼容)
- 后端 services/ai/admin_service.py _get_range_stats SELECT 加 2 个 FILTER COUNT 表达式
- 前端 api/adminAI.ts DashboardResponse 类型补 2 字段
- 前端 pages/AIDashboard.tsx
- 顶部加 sandbox Alert 提示条,选中 site sandbox 模式下显示业务日 + 实例 ID
- today_calls 卡片下方加分组 Tag(实时 X / 沙箱 Y),feature flag 控制
- import fetchRuntimeContext + useEffect 拉 RuntimeContext
- apps/admin-web/.env.example 新建,加 VITE_AI_RUNTIME_GROUPING=false 默认值说明
UI-5 AITriggerJobs runtime 列:
- 后端 schemas/admin_ai.py TriggerJobItem 加 runtime_mode / sandbox_instance_id 可选字段
- 后端 admin_service.py list_trigger_jobs / get_trigger_job 各加 SELECT 列
- 前端 adminAI.ts TriggerJobItem 类型补 2 字段
- 前端 pages/AITriggerJobs.tsx 列表 columns 加运行模式 + 沙箱实例(同 UI-1 模式),详情 Modal 加 2 项(同 UI-2 模式)
双口径验证(Playwright + DB 直查):
- UI-3 4a live: 选中默认门店,无 Alert,today_card 仅显示总数(flag off)
- UI-3 4b sandbox=4-20: Alert 显示"沙箱 + 业务日 + sbx_…",today_calls=93(sandbox 当日)
- UI-5 4a/4b: SQL INSERT 注入 walkthrough 测试行(id=9 live, id=10 sandbox),列表正确渲染 Tag + 短哈希
trend_7d 双线 / app_distribution 堆叠分布等更深入分组改造延后到 Wave C(§8.3 风险:破坏图表)。
审计:
- docs/audit/changes/2026-05-05__wave1_f1_5b_ui3_aidashboard_sandbox.md
- docs/audit/changes/2026-05-05__wave1_f1_5b_ui5_aitriggerjobs_runtime.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 19:16:47 +08:00 |
|
|
|
96dae0c778
|
fix: F1-5b MP-3 + MP-5 沙箱业务日小程序适配 (W1)
MP-3 customer-detail coachTasks.lastService 业务日上界裁剪:
- apps/backend/app/services/customer_service.py
- import as_runtime_today_param 从 late import 提至模块顶部
- _build_coach_tasks 开头取 ref_date,供两段 SQL 共用
- 第一条直查 biz.coach_tasks 加 `AND updated_at < (%s::date + INTERVAL '1 day')::timestamptz`
- 删除原方法内重复 ref_date 调用
- 业务影响:sandbox=2026-04-20 时,customer-detail 的"上次服务"
时间不再展示 sandbox 业务日之后的助教任务更新(沙箱不读未来)
- 测试:apps/backend/tests/test_customer_detail_mp3_lastservice.py
本地通过,因 .gitignore:71 不入仓(同 T1 / af02446 处理方式)
MP-5 coach-service-records 接入 getBusinessClock:
- apps/miniprogram/miniprogram/pages/coach-service-records/coach-service-records.ts
- import getBusinessClock + data 加 clockYear/clockMonth/clockDay 字段
- onLoad 改 async,await getBusinessClock() 取 business_year/month/date
- loadData / switchMonth 4 处 new Date() → clockYear/Month/Day
- 业务影响:sandbox=2026-04-20 时,coach-service-records 默认显示
"2026 年 4 月"业绩(而非 today 月),canGoNext=false 阻止翻到 5 月,
"前 5 日预估金额"规则按 sandbox business_date 判断
双口径验证(weixin-devtools-mcp + DB 直查):
- MP-3 4a live: lastService 最大 04-19(无未来时间)
- MP-3 4b sandbox=4-20: 5-01 任务 task_id=8348/8347 完全消失
- MP-5 4a live: clockYear/Month/Day=2026/5/5,monthLabel="2026年5月"
- MP-5 4b sandbox=4-20: monthLabel="2026年4月" + 35 笔/¥4,657
first group=2026-04-20(后端 SQL 上界裁剪生效)
审计:
- docs/audit/changes/2026-05-05__wave1_f1_5b_mp3_lastservice_upper_bound.md
- docs/audit/changes/2026-05-05__wave1_f1_5b_mp5_coach_service_records_clock.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 18:43:08 +08:00 |
|
|
|
3c8d72edd4
|
feat(ai): F1-5b Wave A admin-web sandbox 透出 UI-1/2/4 (W1)
完成 F1-5b Wave A admin-web 改造:
UI-1 AIRunLogs 列表加 runtime_mode + sandbox_instance_id 列
- 后端 schema RunLogItem 补 runtime_mode / sandbox_instance_id 字段
- 后端 SQL list_run_logs SELECT 加这两列
- 前端 columns 加"运行模式"(orange/blue Tag) + "沙箱实例"(短哈希 + tooltip)
UI-2 AIRunLogs 详情 Drawer 加 runtime 字段
- 后端 SQL get_run_log SELECT 加 runtime 列
- 前端 Descriptions 加"运行模式" + "沙箱实例"两项
UI-4 全局 sandbox 徽章(覆盖所有 admin-web 页面)
- App.tsx Footer 三段式: 左 sandbox 徽章 / 中 任务状态 / 右 占位
- 30s 轮询 fetchRuntimeContext(userSiteId)
- sandbox: 橙色"沙箱"+ 业务日 + 短哈希实例 ID(monospace)
- live: 绿色"实时"+ 真实今天
双口径 4a/4b 验证(MCP Playwright 实地走查):
- UI-1 4a live: 列表全行 live 蓝 Tag
- UI-1 4b sandbox: SQL INSERT walkthrough_ui12 → 列表显示 sandbox 橙 Tag + 短哈希
- UI-2 4b: Drawer 详情 runtime_mode='sandbox' 橙 Tag + sandbox_instance_id monospace 全 ID
- UI-4 4a: footer 左侧绿"实时"+ 2026-05-05
- UI-4 4b: 切 sandbox=2026-04-20 后 footer 显示橙"沙箱"+ 业务日 + sbx_e7a7e5c5...
- 截图归档 docs/audit/changes/screenshots/2026-05-05_f1_5b_wave_a/
剩余 Wave A: MP-3/5 小程序 sandbox / MP-1 board-finance 字段复核 / BE-1 task-list 403
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 15:14:29 +08:00 |
|
|
|
af02446740
|
feat(ai): F1-5b Wave A 中段 沙箱业务日全栈架构主体收口 (W1)
完成 F1-5b 任务:
- T1 RuntimeContext unit 测试基础(36 case PASS,本地不入仓走 .gitignore:71)
- A1 admin_service.py 4 处 CURRENT_DATE → business_date 改造
- _get_range_stats / _get_7d_trend / _get_app_distribution
- 上下界双全(下界 - 6 days + 上界 < + 1 day,Step 4b 暴露原 PR
上界缺失,sandbox=4-20 时 trend_7d 漏 4-21~5-01 数据 → 修补)
- 全局聚合 list_trigger_jobs / get_budget 保留 CURRENT_DATE
(Neo D 决策选 A: 多 site 时全局无单一业务日)
- A2 fdw_queries:113 / 2552 异常分支兜底 + 三层 fallback + warning
- conn=None 也尝试 get_runtime_context(自开 conn)
- RuntimeContext 不可用降级真实 today + logger.warning
- A3 _fdw_context docstring 显式登记唯一 ETL 入口架构契约
(D2 完整且统一: 所有 ETL 视图查询通过 _fdw_context 自动 SET 三个
GUC: site_id / business_date / runtime_mode)
- 防御 hook post_edit_business_date_check.py
Wave 2 后续 PR 引回 CURRENT_DATE / date.today() 即提醒
双口径验证(§3.1 4a + 4b):
- 4a live: dashboard trend_7d 2 条 4-30~5-01 (真实今天)
- 4b sandbox=2026-04-20: trend_7d 1 条仅 4-20 (业务日上界生效硬证据)
- pytest test_runtime_context 36/36 全过
未完(下一批 Wave A): T2 integration / UI-1/2/4 / MP-3/5 / MP-1 / BE-1
F1-5b-tasks.md 新增 + audit 记录已就位
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 15:01:51 +08:00 |
|
|
|
a045625d48
|
fix(backend): 后端日志走查发现 2 个 schema 不一致 bug
- coach_service.py:594 _build_task_groups SQL 查 biz.notes.is_pinned
但表无该字段 → UndefinedColumn 抛错 + 事务终止 + 级联 _build_notes
/ _build_history_months 全部失败(InFailedSqlTransaction)
修复:删除 is_pinned 列,pinned 降级 False(置顶功能未落库,
不影响核心备注展示)。
- customer_service.py:1088 _get_consumption_month_summary SQL 用错
3 个字段(从 v_dwd_assistant_service_log 复制粘贴未适配
v_dwd_settlement_head 字段名差异):
sh.tenant_member_id → sh.member_id
sh.is_delete = 0 → 删除(view 已过滤已撤销订单)
sh.settle_time → sh.create_time
→ 高频 UndefinedColumn,小程序 customer-records 月度 rechargeTotal
恒返回 0,consumption60D 恒返回 null。
走查覆盖(MCP):
- 小程序 customer-records 调 /api/xcx/customers/{id}/consumption-records
修前: rechargeTotal=0, consumption60D=null
修后: rechargeTotal=1009.08, consumption60D=7758.24, daysSinceVisit=31
visitCount=1, consumeTotal=384.02 全部 PASS
发现来源:tmp/20260505_backed_LOG.txt 后端日志 grep
ERROR/Traceback 反复出现 UndefinedColumn。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 11:59:30 +08:00 |
|
|
|
95a4500c75
|
chore(ops): reload 卡死三层预防 + F1-5a 完整走查报告
reload 卡死三层预防(走查中遭遇 uvicorn graceful shutdown 死等触发):
- Layer 1 (apps/backend/start_uvicorn.py 新): 把 reload-excludes
封装在 Python 字符串内,ps1 命令行只有字面路径,根治 PowerShell
PSNativeCommandArgumentPassing 在不同 profile 下 wildcard 展开
行为差异(数组 splatting 和 --% 都不稳)。同时显式设
timeout-graceful-shutdown=5,5 秒强杀防死等
- Layer 2 (scripts/ops/backend-watchdog.ps1 新): 自主 socket 探针
(TcpClient + 手写 HTTP/1.1 GET,Connection: close)规避 .NET
HttpClient pool 复用 + 系统代理误报;3s × 3 = 9s 触发重启;
进程链 kill 至 pwsh 后端窗口(关闭原窗口);3 次/小时上限自停
- Layer 3 (scripts/ops/start-admin.ps1): 启动时拉起 watchdog,
菜单 [4] 仅重启后端选项,主菜单退出时一并 kill 看门狗
CLAUDE.md: 新增"后端 reload 卡死预防(强制)"章节,
分级文件风险表 + SOP + 启动菜单速查
走查报告(应查尽查严肃版):
- 后端 6 个改造点 PASS(P1-P4 + GUC + ai_run_logs runtime 字段)
- admin-web 7 页 Playwright 实地走查 → 5 项 UI 不完整登记 F1-5b
- 小程序看板 tab 7 页 weixin-devtools-mcp 实地 + DB 数据核对 →
board-finance 5/6 项上界裁剪吻合;board-customer 业务日生效;
board-coach 月度聚合表设计盲区;5 项 sandbox 覆盖盲区登记 F1-5b
- 8 张走查截图归档 docs/audit/changes/screenshots/2026-05-05_f1_5a_walkthrough/
audit_dashboard 刷新到 153 条审计
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 11:53:08 +08:00 |
|
|
|
1baa21222b
|
fix(backend): F1-5a 走查发现 2 个生产 bug
- xcx_runtime_clock.py: require_approved 是 factory,Depends 必须 ()
调用,否则 user 是 function 不是 CurrentUser → AttributeError 500
→ 沙盒在小程序所有页面失效的根因(getBusinessClock 一直降级 localFallback)
- admin_service.py:retry_trigger_job INSERT payload 字段是 jsonb,
psycopg2 读出是 dict,未 Json() wrap 直接 INSERT 触发
"can't adapt type 'dict'" → 生产环境点重试必 500
(该 bug 在 6f8f1231 即引入,F1-5a 走查时通过 SQL 复现端到端验证暴露)
走查覆盖:
- xcx_runtime_clock: 修后小程序 GET /api/xcx/runtime/clock 200,
返回完整 sandbox ctx(business_date / sandbox_instance_id)
- retry_trigger_job: SQL 复现 INSERT 包含真实 jsonb payload
({foo:bar,n:42}),修后 runtime_mode=sandbox + sandbox_instance_id
+ payload 完整保留全部 PASS
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 11:52:40 +08:00 |
|
|
|
421e193041
|
fix(ai): F1-5a 沙箱 batch-run 接入 runtime_context (W1 / 阶段 A 主体)
Neo F1-5 反馈: "让沙箱起到其真正的作用. 真正的模拟日期, 仅能看到沙箱设定日期
及之前日期的数据, 并运行 AI 的各个业务."
调研发现 (4 个并行子代理): batch-run 端点 _run_batch 是空壳 stub
(只 logger.info, 实际不跑 AI), GUC apply_runtime_session_vars 0 处调用
(dead code), 7 张业务表 6 张有 runtime 复合索引唯独 ai_run_logs 漏建,
App2/2a 3 行 _calc_date_range 漏传 ref_date.
本 commit (F1-5a 阶段 A 主体, F1-5b 后续完整 zqyy_app RLS 视图层):
后端核心:
- admin_service.py: _run_batch 真实化 (Semaphore(5)+asyncio.gather+
return_exceptions=True+ctx_snapshot 防漂移); estimate 入口抓
RuntimeContext 快照, confirm 取出传给 worker
- admin_ai.py: confirm_batch_run lazy 注入 dispatcher
- admin_service.retry_trigger_job: INSERT 落 runtime_mode +
sandbox_instance_id 列 (用 runtime_insert_columns helper)
- runtime_context.py: get_runtime_context 加 bind_to_session 参数,
激活 GUC app.current_business_date / app.current_runtime_mode
- run_log_service.create_log: 启用 bind_to_session=True 试点
App2/2a 3 行 ref_date 修复:
- app2_finance_prompt.py:817 储值卡余额变化板块
- app2_finance_prompt.py:841 日粒度 series + 异常检测窗口
- app2a_finance_area_prompt.py:466 区域日粒度 series
DB:
- migrations/20260505__ai_run_logs_runtime_index.sql:
补 (site_id, runtime_mode, sandbox_instance_id, created_at DESC) 复合索引
前端:
- AIOperations.tsx: 顶部加 sandbox 模式提示条 (Alert 显示 sandbox_date +
sandbox_instance_id + 影响范围 + 切回 live 入口)
未做 (留 F1-5b 完整 zqyy_app RLS 视图层一并):
- B1 admin_service 6 处 CURRENT_DATE -> business_date
- B2 fdw_queries 异常分支兜底
- GUC 完整传递 (fdw_queries / page_context 等)
- 测试 3 套 (.gitignore:71 排除, F2-2 入仓时 commit)
- P20 SPEC \xa76/\xa710/\xa711/\xa715 (F1-5b 完整收口后同步更准确)
Neo 决策: docs/_overview/wave1-findings/F1-5-impl-decisions.md
详见 docs/audit/changes/2026-05-05__wave1_f1_5a_sandbox_batch_run.md
|
2026-05-05 03:01:48 +08:00 |
|
|
|
b0340349bd
|
feat(etl): cfg_* 视图入口统一 + NULL 兼容 + 3 处 _load_* 历史 Bug (W1-T2 / P0-1)
Wave 1 Day 3 沙箱配置参数切片。
DB 迁移 (20260504__cfg_views_null_compatible.sql):
- 4 个 v_cfg_* 视图 WHERE 加 NULL 兼容
(effective_to IS NULL OR effective_to >= ...)
- 顺手清理 v_cfg_assistant_level_price / v_cfg_performance_tier
WHERE 重复一次的 bug
- 测试库已执行,4 校验 PASS
ETL 代码 (4 处 SQL):
- base_index_task.py: FROM dws.cfg_index_parameters -> app.v_cfg_index_parameters
- base_dws_task.py 3 处 _load_* (performance_tier / level_price / bonus_rules)
改 FROM app.v_cfg_*,顺手修历史 Bug:原 SQL 不带 effective_from/to WHERE
效果:
- 修复视图 NULL 行被过滤问题(SPI 27 行原本读到 0)
- 沙箱模式回放历史日期时,参数自动按 sandbox_date 切片
- _load_* 直接得到当前生效行(原 12/9 行历史 Python 挑)
参考:
- docs/audit/changes/2026-05-04__wave1_t2_scd2_view_unify.md
- docs/database/changes/2026-05-04__cfg_views_null_compatible.md
|
2026-05-04 08:10:57 +08:00 |
|
|
|
9eb495686f
|
feat(miniprogram): board-finance isCurrentMonthFilter 接入业务时钟 (W1-T1 / P0-3)
Wave 1 Day 2 看板沙箱接入。
调研修正:
- xcx_board.py + board_service.py 服务层已接入 runtime_context (L264/L712)
- board-customer.ts / board-coach.ts 0 处使用 new Date(),无需改
- 唯一遗漏: board-finance.ts isCurrentMonthFilter 用 new Date().getDate()
沙箱回放历史日期会判错"本月前 5 天预估"提示
修复:
- import getBusinessClock from utils/runtime-clock
- isCurrentMonthFilter 接收可选 businessDate 参数;空值降级 new Date()
- data 加 businessDate: ''
- onShow 拉业务时钟 + 修正 isCurrentMonth
- onTimeChange 用 this.data.businessDate
参考: docs/audit/changes/2026-05-04__wave1_t1_board_sandbox_clock.md
|
2026-05-04 07:42:51 +08:00 |
|
|
|
8fad5579bf
|
refactor(admin-web): 归档 OpsPanel.tsx 死代码
Wave 0 死代码清理产出。OpsPanel.tsx 的功能已被 Dashboard.tsx
内联化取代(走 components/ops/* 三个独立子组件),App.tsx 不再
import,无业务依赖。
按 _archived/ 归档惯例(同 LogViewer.tsx),git mv 至 _archived/
保留可恢复路径,触发 pre_read_archived_block.py hook 阻断后续
意外读取。
参考: docs/_overview/05-orphan-pages-cleanup.md
|
2026-05-04 07:37:47 +08:00 |
|
|
|
17f045a89e
|
fix(backend): Wave 1 Day 1 三个 P0 D Bug 修复
- W1-T3 修 4 处 fdw_etl.* 必坏残留 → app.* (P0-5 致命 1)
· tenant_users.py L431/L456-457: v_dim_assistant + v_dim_staff(_ex)
· tenant_excel.py L394/L411: v_dim_assistant + v_dim_staff
· tenant_clues.py L119: v_dim_member
· 修复后 tenant-admin 用户审核 / Excel 上传 / 维客线索恢复正常
- W1-T4 JWT aud sign 端写入 (P0-5 致命 2 最小止血)
· jwt.py 全部 token 创建/解码函数加 audience 参数
· auth.py admin 端加 audience="admin"
· xcx_auth.py miniapp 端加 audience="miniapp" (8 处调用)
· 18 router 切强制 aud 校验留 Wave 2
- W1-T5 DBViewer 白名单 + 黑名单双保险 (P0-8)
· 白名单: SELECT/WITH/EXPLAIN/SHOW 开头
· 黑名单: 17 关键词覆盖全 DML/DDL/DCL
· 注释剥离避免误伤;15/15 单测 PASS
参考: docs/audit/changes/2026-05-04__wave1_day1_d_bug_triple_fix.md
|
2026-05-04 07:36:20 +08:00 |
|
|
|
caf179a5da
|
feat: 2026-04-15~05-02 累积变更基线 — AI 重构 + Runtime Context + DWS 修复
涵盖(每条对应已存的审计记录):
- AI 模块拆分:apps/backend/app/ai/apps -> prompts/(8 个 APP + app2a 派生)
audit: 2026-04-20__ai-module-complete.md
- admin-web AI 管理套件:AIDashboard / AIOperations / AIRunLogs / AITriggers / TriggerManager
audit: 2026-04-21__admin-web-ai-management-suite.md
- App2 财务洞察 prompt v3 -> v5.1 + 小程序 AI 接入(chat / board-finance)
audit: 2026-04-22__app2_prompt_v5_1_and_miniprogram_ai_insight.md
- App2 prewarm 全过滤器 + AI 触发器 cron reschedule
audit: 2026-04-21__app2-finance-prewarm-all-filters.md
migration: 20260420_ai_trigger_jobs_and_app2_prewarm.sql / 20260421_app2_prewarm_cron_reschedule.sql
- AppType 联合类型对齐 + adminAiAppTypes.test.ts
audit: 2026-04-30__admin_web_ai_app_type_alignment.md
- DashScope tokens_used 提取修复
audit: 2026-04-30__backend_dashscope_tokens_used_extraction.md
- App3 线索完整详情 prompt
audit: 2026-05-01__backend_app3_full_detail_prompt.md
- Runtime Context 沙箱(5-1~5-2 主线):
- 后端 schema/service + admin_runtime_context / xcx_runtime_clock 两个 router
- admin-web RuntimeContext.tsx + miniprogram runtime-clock.ts
- migration: 20260501__runtime_context_sandbox.sql
- tools/db/verify_admin_web_sandbox.py + verify_sandbox_end_to_end.py
- database/changes: 7 份 sandbox_* 验证报告
- 飞球 DWS 修复:finance_area_daily 区域汇总 + task_engine 调整
+ RLS 视图业务日上界(migration 20260502 + scripts/ops/gen_rls_business_date_migration.py)
合规:
- .gitignore 启用 tmp/ 排除
- 不入仓:apps/etl/connectors/feiqiu/.env(API_TOKEN secret,本地修改保留)
待验证清单:
- docs/audit/changes/2026-05-04__cumulative_baseline_pending_verification.md
每个主题的功能完整性 / 上线验证几乎都未收口,按优先级 P0~P3 逐一处理
|
2026-05-04 02:30:19 +08:00 |
|
|
|
f2e0de8fab
|
chore(migration): Cursor → Claude Code 反向迁移 + 单轨化(v2)
- 删除 5 个 AGENTS.md(根 + 4 子模块)与 .cursor/、.cursorignore,全部已备份
- 在 CLAUDE.md 末尾追加 5 节迁移必需内容(CLI/Shell 中文与编码、Claude Code 资产入口、Hook 与权限、不破坏原则、历史追溯),保留用户选定的 226 行项目规则全集
- 用户级 12 个 skills 从 ~/.cursor/skills/ 剥包装回迁到 ~/.claude/skills/(neozqyy-cursor-migration → neozqyy-claude-code-migration)
- docs/ai-env-history/ 顶层 10 文件入仓(含 conversation_index.csv、file_impact_index.csv,已脱敏);sessions/ 原文继续本地保留
- 新增 tools/claude-code/migrate_ai_environment.py(--check 14/14 通过)
- 新增 docs/claude_code_migration.md 与 docs/audit/changes/2026-05-02__claude_code_migration.md
- .gitignore 调整:开放 2 个 CSV 索引入仓,保留 sessions/ 与 claude-history/ 排除
- 不混入 124 个业务变更(AI 模块重构、runtime_context、sandbox 等保持 unstaged)
- 备份位置:~/.claude/backups/pre-claude-code-migration-2026-05-02/
第二轮迁移(第一轮 commit 6facb2d 已被 git reset 回滚;本轮策略为追加而非重写 CLAUDE.md)
|
2026-05-03 21:08:13 +08:00 |
|
|
|
81e41730ec
|
迁移 Claude/Codex/Cursor 开发环境与追溯资产
Co-Authored-By: OpenAI Codex <codex@openai.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-05-02 03:11:39 +08:00 |
|
|
|
7107884138
|
feat(admin-web): AIPrewarm 分组展示 + 每行触发 + AppType 联合类型
1. AIPrewarm.tsx:
- areaToAppType(area) helper · area='all' → app2_finance · 其他 → app2a_finance_area
- handleRunOne / handleBackfillMissing 按 area 动态选 app_type
- MissingRowWithGroup 含 __group_header 字段
- groupedMissing 数据构造(全域 + 区域两组 · 每组前插 header 行)
- 每列 onCell colSpan 合并单元格实现"全域 / 区域"分组标题行
- Descriptions 加全域 8/X + 区域 64/X 双段统计
2. api/adminAI.ts:
- 新增 AppType 联合类型(9 项,含 app2a_finance_area)
- runApp 签名 appType: AppType(替代原 string)
- RunAppResponse.app_type 同步为 AppType
3. AIOperations.tsx:
- runAppType state 类型改为 AppType | undefined
- import { AppType } type
实测:
- pnpm tsc --noEmit 全项目通过
- playwright E2E 访问 /ai/prewarm 显示 "全域 8/8 · 区域 63/64" 分段统计
分组标题行正确合并 · 单独生成按钮按 area 路由到正确 app_type
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 21:56:17 +08:00 |
|
|
|
66be873e70
|
feat(miniprogram): 财务看板按 area 切 cache_type + seq 精确匹配 + UX 修复
board-finance.ts _loadAIInsights 改造:
1. cache_type 动态切换:
area='all' → 'app2_finance'
area != 'all' → 'app2a_finance_area'
2. seq 精确匹配(替代末两条启发式):
- map 阶段保留 seq 字段 (Number(item.seq) || idx+1)
- _extractSummary 优先 find(i => i.seq === 11/12)
- 回退:找不到时用末两条启发式
3. UX bug 修复:
原代码 cache miss 时静默 return 导致切换区域后 UI 保留上个区域陈旧数据
修复:进入函数先 setData 清空 aiInsights / aiInsightSummary / aiInsightDetails
/ summaryLightType / summaryLightLabel
实测:微信开发者 MCP E2E 验证:
- 全域面板 12 条 + 🔴 红灯 + seq 1-12 精确
- 切 vip 显示 app2a "客单价异动 321 元 符合 VIP 高客单定位"
- 切 mahjong 显示 app2a "麻将房成交收入 46,339 元 + 🟡 黄灯"
- 业态差异化识别准确
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 21:55:58 +08:00 |
|
|
|
8638ecad2a
|
feat(backend): 新增 app2a 区域财务洞察 APP 派生 · dispatcher 72 循环拆分
1. apps/backend/app/ai/prompts/app2a_finance_area_prompt.py (新建):
- payload: 业态说明 + 区域占比 + 对比口径 + 核心 KPI + 优惠构成
+ 助教成本 + 区域级单位经济 + 按星期聚合 + 日粒度异常 + 行业基线
- 5 个区域级辅助函数:_fetch_area_daily_series / _build_area_unit_economics
/ _aggregate_by_weekday_area / _detect_anomaly_days_area / _fetch_area_share
- AREA_INDUSTRY_TRAITS 字典(7 业态 trait + peer 描述)
- 复用 app2_finance_prompt 的 _build_coach_kpi / _build_discount_kpi 等公共函数
2. config.py: AIConfig 增加 app_id_2a_finance_area + DASHSCOPE_APP_ID_2A_FINANCE_AREA
3. schemas.py: CacheTypeEnum 增加 APP2A_FINANCE_AREA
4. dispatcher.py:
- APP2A_AREA_OPTIONS 常量(8 业态 · area != 'all')
- _handle_dws_completed 72 循环拆分:
area='all' 走 app2_finance · 其他 8 业态走 app2a_finance_area
- run_single_app 新增 elif 'app2a_finance_area' 分支(拒绝 area='all')
5. admin_ai.py: _SUPPORTED_APP_TYPES 加 'app2a_finance_area'
6. prompts/__init__.py: 导出 build_app2a_area_prompt
7. .env: 追加 DASHSCOPE_APP_ID_2A_FINANCE_AREA 百炼 APP ID
实测:7 项集成单测全通过(config/cache_type/router/prompts/dispatcher 常量/
4 业态 prompt 构建/拒绝 area=all)· 端到端实调 vip 组合返回 12 条高质量洞察
严格遵守 v1.2 system prompt 全部 7 项硬约束(H1-H7)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 21:55:26 +08:00 |
|
|
|
cd511d0670
|
feat(etl): app2a DWS 增加 member_order_count 聚合 + 修复 area 未匹配订单 all 兜底
1. finance_area_daily.py:
- _AREA_AGG_FIELDS 增加 member_order_count · _COUNT_FIELDS 常量统一 int 转换
- extract SQL 增加 sh.member_id 字段
- transform 按 CLAUDE.md DWS 规范 member_id > 0 判定是否会员订单
- _build_area_row / _build_sum_row 支持新计数字段
2. pre-existing bug 修复(顺手):
area_code 为 None(table_id 未映射)的订单之前既不计入具体区域也不计入 all,
导致全店 order_count/member_order_count > 各区域之和。
修复:新增 _unknown 桶收纳未匹配订单 · 构建 all 行时追加合入 source_rows。
3. backfill_finance_area_daily.py extract SQL 加 sh.member_id
支持回填历史 member_order_count 数据。
实测:纯函数单测 + 测试库 ETL 7 天回放 · 04-18/04-20 等日期全店 vs 区域和
从差 1 单修复为 0 差异 · 纯函数新增 2 条未匹配订单用例断言全通过。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-22 21:54:37 +08:00 |
|
|
|
b44096600d
|
chore(cleanup): 清理历史会话遗留未跟踪产物 — gitignore 追加 + 文件归位
- .gitignore: 追加 .playwright-mcp/ 与 apps/miniprogram/.font_patch_tmp/ 两条忽略规则
- apps/miniprogram/scripts/: 新建目录, 迁入 TDesign BOM 修复脚本 inspect-wechat-font.ps1 及其检查报告
- 根目录 excel_analysis_report.txt / sheet_structure.txt 归位 tmp/, 修正 root-file 风险标签
- 审计记录 2026-04-20__legacy-untracked-cleanup-review.md, 含实际执行段与回滚路径
- audit_dashboard.md 由 gen_audit_dashboard.py 刷新至 130 条
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-20 06:48:27 +08:00 |
|
|
|
80bda9b991
|
chore(audit): 2026-04-20 历史批次预审 + 文档同步 + .gitignore 修正
- 新增 docs/audit/changes/2026-04-20__historical-batch-pre-audit.md
157 文件分批盘点审计(7 条主线 + 10 项高/中风险 + 2 份迁移 SQL DDL 清单)
- 补追 docs/audit/changes/2026-04-15__meituan-settle-core-sync.md
原审计产物因 .gitignore 屏蔽长期未入仓,本次一并追回
- 刷新 docs/audit/audit_dashboard.md(33 条审计记录)
- .gitignore 白名单放行 docs/audit/changes/*.md 与 audit_dashboard.md
同时屏蔽 changes/changes/ 嵌套误产物目录
- 新增 docs/specs/audit-gap-recovery/tasks.md
扫描嵌套目录发现 96 份 D 类孤本(从未入过 git history),
生成独立 PRD 供单开任务清理与补追
- 文档同步(高风险项):
- apps/backend/docs/API-REFERENCE.md (+69)
- apps/miniprogram/README.md (+50)
- apps/etl/connectors/feiqiu/docs/architecture/data_flow.md (+52/-2)
- apps/etl/connectors/feiqiu/docs/architecture/system_overview.md (+5/-3)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-20 06:32:58 +08:00 |
|
|
|
2a7a5d68aa
|
feat: 2026-04-15~04-20 累积变更基线 — 多主线合流
主线 1: rns1-customer-coach-api + 04-miniapp-core-business 后端实施
- 新增 GET /xcx/coaches/{id}/banner 轻量接口
- performance/records 加 coach_id 参数 + view_board_coach 权限分流
- coach/customer/performance/board/task 服务层重构
- fdw_queries 结算单粒度聚合 + consumption_summary 视图统一
- task_generator 回访宽限 72h + UPSERT 替代策略 + Step 5 保底清理
- recall_detector settle_type=3 双重限制 + 门店级 resolved
主线 2: 小程序权限分流 + 新增 coach-service-records 管理者视角业绩明细页
- perf-progress 共享模块去重 task-list/coach-detail 动画逻辑
- isScattered 散客标记端到端
- foodDetail/phoneFull/creator* 字段透传
主线 3: P19 指数回测框架 Phase 1+2
- 3 个指数表 stat_date 日快照模式
- 新增 DWS_INDEX_BACKFILL / DWS_TASK_SIMULATION 工具任务
- task_engine 升级 HTTP 实时 + 推演回测双模式
主线 4: Core 维度层启用
- 新增 CORE_DIM_SYNC 任务(DWD → core 4 维度表)
- 修复 app 视图空查询问题
主线 5: member_project_tag 改为 LAST_30_VISITS 消费次数窗口
主线 6: 2 个迁移 SQL 已执行(stat_date + member_project_tag 新窗口)
- schema 基线与 DDL 快照同步
主线 7: 开发机路径迁移 C:\NeoZQYY → C:\Project\NeoZQYY(约 95% 改动量)
附带: 新建运维脚本(churned_customer_report / simulate_historical_tasks /
backfill_index_snapshots)+ tools/task-analysis/ 任务分析工具
合计 157 文件。未包含中间产物(tmp/ .playwright-mcp/ inspect-* excel/sheet 分析 txt)。
审计记录见下一个 commit。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-20 06:32:07 +08:00 |
|
|
|
79d3c2e97e
|
开发机迁移
|
2026-04-10 06:24:13 +08:00 |
|
|
|
779b2f6d52
|
chore: v1 整理 — 清理历史文件、DDL 合并、文档归档
- 清理 1155 个已删除的历史文件(废弃 prompt_logs、tmp、旧 ops 脚本)
- export/ 数据文件从 git 移除(已在 .gitignore)
- demo-miniprogram 从 tmp/ 移入 apps/,添加 CLAUDE.md 注解
- DDL 合并:完整 schema 定义填充到 db/*/schemas/(从 docs/database/ddl/ 复制)
- 39 个 v1 迁移脚本归档到 db/_archived/migrations_v1_merged/
- 4 个迁移变更类 BD_Manual 文档归档到 docs/database/_archived/
- .gitignore 补充 .vite/ 和 apps/*.zip
- settings.json 添加 effortLevel 默认配置
- scripts/ops/ 新增运维脚本入库
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-04-06 00:39:27 +08:00 |
|
|
|
6f8f12314f
|
feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-04-06 00:03:48 +08:00 |
|
|
|
70324d8542
|
chore: 文档与 IDE 配置整理
- .kiro/specs/ → docs/specs/(41 个历史需求 spec 迁移,移除 .config.kiro)
- CLAUDE.md 三层拆分:根文件精简 + apps/backend/CLAUDE.md + .claude/commands/
- 新增 /spec-close、/pre-change 两个工作流命令
- DDL 基线刷新(从测试库重新导出 11 个文件,dws 35→38 表,biz 18→21 表)
- BD_Manual → BD_manual 命名统一(48 个文件)
- 修复 3 处文档与数据库不一致(auth.users.status 默认值、scheduled_tasks 字段、RLS 视图数)
- 新增 BD_manual_public_rbac_tables.md(public schema 8 张 RBAC/工作流表)
- 合并 biz.trigger_jobs 文档(10→12 字段,归档独立文档)
- docs/database/README.md 索引更新
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-04-06 00:02:37 +08:00 |
|
|
|
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 |
|
|
|
beb88d5bea
|
feat: chat integration, tenant admin spec, backend chat service, miniprogram updates, DEMO moved to tmp, XCX-TEST removed, migrations & docs
|
2026-03-20 09:02:10 +08:00 |
|
|
|
675301f38b
|
feat: gift card breakdown - migrations, fdw queries, finance recharge task, board-finance page updates
|
2026-03-20 03:24:17 +08:00 |
|
|
|
8f8abad4c9
|
chore: update tasks.md
|
2026-03-20 01:48:27 +08:00 |
|
|
|
79f9a0e1da
|
feat: batch update - gift card breakdown spec, backend APIs, miniprogram pages, ETL finance recharge, docs & migrations
|
2026-03-20 01:43:48 +08:00 |
|
|
|
075caf067f
|
小程序迁移 静态页面完成!!!
|
2026-03-18 05:14:35 +08:00 |
|
|
|
72bb11b34f
|
1
|
2026-03-15 10:15:02 +08:00 |
|
|
|
6e20987d2f
|
微信小程序页面迁移校验之前 P5任务处理之前
|
2026-03-09 01:19:21 +08:00 |
|
|
|
b25308c3f4
|
feat: P1-P3 全栈集成 — 数据库基础 + DWS 扩展 + 小程序鉴权 + 工程化体系
## P1 数据库基础
- zqyy_app: 创建 auth/biz schema、FDW 连接 etl_feiqiu
- etl_feiqiu: 创建 app schema RLS 视图、商品库存预警表
- 清理 assistant_abolish 残留数据
## P2 ETL/DWS 扩展
- 新增 DWS 助教订单贡献度表 (dws.assistant_order_contribution)
- 新增 assistant_order_contribution_task 任务及 RLS 视图
- member_consumption 增加充值字段、assistant_daily 增加处罚字段
- 更新 ODS/DWD/DWS 任务文档及业务规则文档
- 更新 consistency_checker、flow_runner、task_registry 等核心模块
## P3 小程序鉴权系统
- 新增 xcx_auth 路由/schema(微信登录 + JWT)
- 新增 wechat/role/matching/application 服务层
- zqyy_app 鉴权表迁移 + 角色权限种子数据
- auth/dependencies.py 支持小程序 JWT 鉴权
## 文档与审计
- 新增 DOCUMENTATION-MAP 文档导航
- 新增 7 份 BD_Manual 数据库变更文档
- 更新 DDL 基线快照(etl_feiqiu 6 schema + zqyy_app auth)
- 新增全栈集成审计记录、部署检查清单更新
- 新增 BACKLOG 路线图、FDW→Core 迁移计划
## Kiro 工程化
- 新增 5 个 Spec(P1/P2/P3/全栈集成/核心业务)
- 新增审计自动化脚本(agent_on_stop/build_audit_context/compliance_prescan)
- 新增 6 个 Hook(合规检查/会话日志/提交审计等)
- 新增 doc-map steering 文件
## 运维与测试
- 新增 ops 脚本:迁移验证/API 健康检查/ETL 监控/集成报告
- 新增属性测试:test_dws_contribution / test_auth_system
- 清理过期 export 报告文件
- 更新 .gitignore 排除规则
|
2026-02-26 08:03:53 +08:00 |
|
|
|
fafc95e64c
|
在前后端开发联调前 的提交20260223
|
2026-02-23 23:02:20 +08:00 |
|
|
|
254ccb1e77
|
feat: TaskSelector v2 全链路展示 + 同步检查 + MCP Server + 服务器 Git 排除
- admin-web: TaskSelector 重构为按域+层全链路展示,新增同步检查功能
- admin-web: TaskConfig 动态加载 Flow/处理模式定义,DWD 表过滤内嵌域面板
- admin-web: App hydrate 完成前显示 loading,避免误跳 /login
- backend: 新增 /tasks/sync-check 对比后端与 ETL 真实注册表
- backend: 新增 /tasks/flows 返回 Flow 和处理模式定义
- apps/mcp-server: 新增 MCP Server 模块(百炼 AI PostgreSQL 只读查询)
- scripts/server: 新增 setup-server-git.py + server-exclude.txt
- docs: 更新 LAUNCH-CHECKLIST 添加 Git 排除配置步骤
- pyproject.toml: workspace members 新增 mcp-server
|
2026-02-19 10:31:16 +08:00 |
|
|
|
4eac07da47
|
在准备环境前提交次全部更改。
|
2026-02-19 08:35:13 +08:00 |
|
|
|
ded6dfb9d8
|
init: 项目初始提交 - NeoZQYY Monorepo 完整代码
|
2026-02-15 14:58:14 +08:00 |
|