feat(device): 无障碍保护存活心跳检测 + 掉线终端告警 #61

Closed
Ghost wants to merge 15 commits from feat/compare-record-status into main

15 Commits

Author SHA1 Message Date
陈世睿 0bd42ea325 fix(compare): platform_results 接受 dict, 修成功比价记录被 422 拒
客户端 fromComparison 把 done.params.platform_results(按 platform_id 键的 dict)
原样上报, 但 schema 误声明为 list → pydantic 422 → 成功记录从不落库, 记录页只剩
失败/终止 (2026-06-17 加该字段上报后复现)。改 dict | list 宽松存(仅进 raw_payload)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:16:23 +08:00
陈世睿 0028c07c7b fix(alembic): 合并 device 与 launch_confirm_sample 双 head(分支合并产物)
feat/a11y-liveness-heartbeat 合进 feat/compare-record-status 后,device 链(3a8fa058789c)与 main 来的 launch_confirm_sample_table 成两 head;加合并节点 86852351f5bb 收敛单 head。全链路在临时 sqlite upgrade head 通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 14:49:46 +08:00
陈世睿 dd8375f822 Merge branch 'feat/a11y-liveness-heartbeat' into feat/compare-record-status 2026-06-20 14:47:54 +08:00
陈世睿 713a0a2afe Merge branch 'main' of https://gitea.shaguabijia.com/WonderableAI/shaguabijia-app-server into feat/a11y-liveness-heartbeat 2026-06-20 14:26:45 +08:00
陈世睿 150aa4f81a Merge origin/main into feat/a11y-liveness-heartbeat(并解决 alembic 双 head)
合并 main 引入 cps_wx_user / 穿山甲配置后台化 / 注销账号校验 / 文档重构 等。
合并产生 alembic 双 head(main 的 cps_wx_user + 本分支 device_kill_alert_pending)→ 新增合并节点 3a8fa058789c 收敛为单 head, alembic upgrade head 恢复正常(修 run.sh 的 Multiple head revisions)。
顺手修 heartbeat_monitor_worker 掉线告警日志 🔴 emoji 在 Windows GBK 控制台 UnicodeEncodeError(非致命刷屏)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 10:37:46 +08:00
陈世睿 4d1162053e feat(device): 无障碍掉线后置检测 — kill_alert_pending + liveness 查询/ack 端点
推送暂缓改 pull:worker 检出掉线即置 kill_alert_pending(与 liveness_state 解耦,心跳恢复 touch_heartbeat 不清,规避竞态),客户端进 App 拉 GET /device/liveness 命中→弹自启动引导,POST /device/liveness/ack 清。含 alembic 加列(临时 sqlite 验通)。spec: accessibility-liveness-pull-prompt.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 22:35:12 +08:00
陈世睿 b949d3b662 Merge remote-tracking branch 'origin/main' into feat/compare-record-status 2026-06-19 10:18:10 +08:00
陈世睿 060cb74a84 fix(alembic): cps_v2_platforms 兼容本地 SQLite
队友这条迁移只在 PG 测过:server_default 用了 PG 专属 ::jsonb(SQLite 报 unrecognized token),
且 op.alter_column 改可空/类型 SQLite 原生不支持。改成:platforms default 分方言(PG 仍 ::jsonb、
SQLite 用纯 JSON 字面量)+ 所有 alter_column 包进 op.batch_alter_table(SQLite 重建表、PG 等价直接 ALTER)。
线上 PG 行为不变,本地 SQLite dev 能正常 upgrade。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:18:10 +08:00
陈世睿 caee1c355d Merge branch 'main' of https://gitea.shaguabijia.com/WonderableAI/shaguabijia-app-server into feat/compare-record-status 2026-06-18 21:42:48 +08:00
陈世睿 9409ee6e05 Merge branch 'main' of https://gitea.shaguabijia.com/WonderableAI/shaguabijia-app-server into feat/compare-record-status 2026-06-18 10:19:46 +08:00
陈世睿 020dd143c7 Merge branch 'main' of https://gitea.shaguabijia.com/WonderableAI/shaguabijia-app-server into feat/compare-record-status 2026-06-17 20:36:30 +08:00
陈世睿 a59b49fdc9 比价结果状态 2026-06-17 14:56:42 +08:00
陈世睿 07a8710d5a feat(compare-record): 逐平台 status 落库,记录页显示异常文案
ComparisonResultIn 增 status / store_closed 两字段(原本 pydantic 静默丢弃)。
客户端上报前把 done.params 的 comparison_results + platform_results.status
合并写入,记录页据此对无价平台显示「未满起送价/门店打烊/店家未入驻/比价失败」,
而非笼统的「店家未入驻」。纯字段透传,best/saved/status 派生逻辑不变(仍按 price 过滤)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 14:41:56 +08:00
陈世睿 b3b731f25d Merge origin/main into feat/a11y-liveness-heartbeat
冲突全在领券「弹窗频控按 App 独立」这一功能——本分支夹带的旧 WIP 草稿(2026-06-12,
app_package 可空+NULL 兜底行)与 main 上已合并的最终版 #52(2026-06-14,package NOT NULL
+"" 占位)是同一功能的两套不兼容实现。

解决:四个 coupon 文件(api/models/repositories/schemas)一律取 main(#52)——它是
权威已合版,且文件未冲突区已自动并入 #52 的签名,只有取 theirs 才自洽。

Alembic 收敛为单 head:
- 删本分支 WIP 迁移 coupon_engagement_app_package(否则与 #52 重复建 per-App 列)
  及其仅用于挂接它的两个空 merge 节点 3a9941e76909 / f3d0a16bb4c2
- device_liveness_table 的 down_revision 由 f3d0a16bb4c2 改挂 main 头 store_mapping_tb_dl_invalid

验证:alembic heads 单头;全链在临时 sqlite upgrade head 通过;
coupon_prompt_engagement 只有 package、无 app_package;app 全量 import 通过。

注:本分支不再保留他人领券 WIP——无损,#52 即该功能的最终版,已在 main。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 10:12:49 +08:00
陈世睿 8adad30ff2 feat(device): 无障碍保护存活心跳检测 + 掉线终端告警
- 新增 device 表 + /api/v1/device/{register,heartbeat} + 迁移 device_table
- heartbeat_monitor_worker 周期扫描心跳超时(App 被杀/无障碍停)→ 服务器终端打印告警
  (推送本期未接,先用 logger 终端打印代替真实通知;integrations/jpush.py 已备,后续直接替换)
- config / .env.example 增 JPUSH_* / HEARTBEAT_*
- 见 spec(仓库外 e:\codes\spec\accessibility-liveness-push.md)

注:本提交同时快照了并行 session 未提交的 coupon_state 改动 + 相关 migration
(与本功能同迁移链耦合,无法单独拆分,经确认一并提交)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 22:16:39 +08:00