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

Closed
Ghost wants to merge 15 commits from feat/compare-record-status into main
No description provided.
Ghost added 15 commits 2026-06-20 22:19:20 +08:00
- 新增 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>
冲突全在领券「弹窗频控按 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>
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>
队友这条迁移只在 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>
推送暂缓改 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>
合并 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>
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>
客户端 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>
Ghost closed this pull request 2026-06-26 11:51:38 +08:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WonderableAI/shaguabijia-app-server#61