zhuzihao
e38120ad49
feat(ad-revenue): 收益报表分页/场景筛选/倒序,并修复信息流金币审计复算口径+ 大盘改版 ( #84 )
...
收益报表(/admin/api/ad-revenue-report):
- 明细改按时间倒序;新增 offset 真分页(limit 作每页大小、total 为全量),可翻页看当前筛选下全部数据,突破原 1000 条上限。
- 「场景」(feed_scene)下推后端做全局筛选,同时作用于明细/合计/daily·hourly 趋势(原为前端仅过滤明细)。
- 新增全量 hourly 序列,按小时趋势改用它,不再受分页截断影响。
修复信息流金币审计复算口径漂移(ad_audit):
- 发奖侧 grant_feed_reward 早已是「一条广告=1份、LT 按账号累计条数(COUNT)」,但审计仍按 unit_count 逐份累加 + SUM(unit_count) 做 LT 基线,导致单条停留>20s(份数>1)时应发虚高、必然「✗ 不符」。
- 审计改为每条 granted 按 1 份复算、LT 基线用 COUNT,与发奖对齐;金币审计页与收益报表(复用同一复算)一并恢复正确。纯复算口径修正,不改实际发奖、不动钱。
文档同步更新 admin-ad-revenue-report.md。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #84
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-27 22:42:54 +08:00
marco
3d67749101
fix(compare-record): specs 兼容 pricebot 嵌套规格对象
...
pricebot 嵌套规格统一(2026-06-27)后 calibration.specs 可能是规格对象
[{name, qty, sub_specs}] 而非字符串。ComparisonItemIn.specs 加 before-validator
把对象拍平成可读字符串"主项(子1,子2)",兼容新旧输入、保持 list[str] 契约(下游零改动)。
防两坑:① 直接声明 list[str] → 对象 specs 整条 422 被拒、不入库;
② 仅放宽成裸 list → 下游 join 出"[object Object]"乱码。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.2.3
2026-06-27 09:26:00 +08:00
marco
f1c2ea662b
fix(migration): merge alembic 3-way 分叉为单 head(修本地 upgrade head 报 Multiple head revisions)
...
#82(invite_cash)/埋点(c2874d2bf705)/device_first_protected_at 三个 PR 并行合 main 留下 3 个 head,
`alembic upgrade head`(单数)报 Multiple head revisions。加一个空 merge 迁移把三支并成单 head,
deploy 的 `upgrade heads`(复数)和本地 `upgrade head` 都干净。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.2.2
2026-06-27 03:06:53 +08:00
marco
be15a119a7
fix(migration): 缩短 revision id 至 26 字符(修 alembic_version varchar(32) 截断致 0.2.1 部署失败)
...
invite_cash_account_and_compare_reward(38字符) > alembic_version.version_num varchar(32),
INSERT 时 psycopg StringDataRightTruncation → 部署 alembic 迁移失败。改为 invite_cash_compare_reward(26)。
该迁移是链末端(无后续 down_revision 依赖)、首次部署(任何环境都没应用过、PG DDL 事务失败已回滚无残留), 改 id 安全。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.2.1
2026-06-27 02:58:29 +08:00
zhuzihao
59fe715245
feat(analytics): 埋点事件接收接口 + admin 查询接口 + 埋点表 ( #83 )
...
Reviewed-on: #83
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 23:56:29 +08:00
zhuzihao
667cda566f
feat(analytics): 埋点事件接收接口 + admin 查询接口 + 埋点表 ( #81 )
...
新手引导埋点的服务端:
- 表 analytics_event(五维硬性列 + props JSON 扩展字段;event/device_id/user_id/session_id/created_at 带索引)
- POST /api/v1/analytics/events:客户端批量上报(不鉴权、body 读可选 user_id、补 client_ip + server_at)
- admin GET /admin/api/event-logs:列表 + 按 事件/设备/用户/会话/时间 筛选(offset 分页,照 list_feedbacks)
- alembic migration 建表(autogenerate 顺带检出的 ad/cps 历史索引漂移已手动剔除)
app 主后端 :8770 与 admin :8771 共用同一 SQLite,admin 同库直接查、无需跨库。
配套客户端五维上报 + admin 日志页(另两仓库 PR)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #81
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 23:33:31 +08:00
xiebing
19f5987436
feat(invite): 邀请奖励金账户(与金币隔离) + 比价发奖 + 奖励金提现 ( #82 )
...
Reviewed-on: #82
Co-authored-by: xiebing <xiebing@wonderable.ai >
Co-committed-by: xiebing <xiebing@wonderable.ai >
2026-06-26 21:10:21 +08:00
chenshirui
1d6432d8bb
feat(admin): 设备存活监控接口 + 首次无障碍开启时间(first_protected_at) ( #80 )
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: 陈世睿 <2839904623@qq.com >
Reviewed-on: #80
Co-authored-by: chenshirui <chenshirui@wonderable.ai >
Co-committed-by: chenshirui <chenshirui@wonderable.ai >
2026-06-26 15:28:16 +08:00
guke
2eb44fe947
feat(cps): 每日明细按天按用户领券下钻接口 + /daily date 改全日期 ( #79 )
...
- 新增 GET /admin/api/cps/groups/{id}/day-users?date=YYYY-MM-DD:
按 openid 聚合当天领券(copy)/点击(visit) + 每人 visit 过的券(券×次数)
---------
Co-authored-by: guke <guke@autohome.com.cn >
Reviewed-on: #79
2026-06-26 15:17:37 +08:00
zhuzihao
ea22a11ef9
fix(ad): 激励视频发奖按环境隔离,堵测试包看广告给生产同 id 用户串号发币 ( #77 )
...
## 问题
激励视频发奖走穿山甲 S2S 回调 /api/v1/ad/pangle-callback,发币时只认回调里的裸数字
user_id(grant_ad_reward 仅校验「本库存在该 id」),无任何环境归属校验。
同一 user_id 在测试库(本地 localhost)与正式库(线上)是两个不同的人;穿山甲 S2S 回调
地址只配一个(指向生产),测试包(dev)看广告的回调也会打到生产 → 生产把奖发给「本库里
同 user_id 的另一个真人」,造成跨库串号:测试看一次广告,正式库同号用户也被发币(线上
广告收益页因此多出一条本不该有的发奖记录)。
## 修复(服务端,按环境隔离)
pangle_callback 解析激励视频 mediaExtra 透传的 srv_env(dev/prod),与本服 settings.APP_ENV
不符则受理但不发币、不写记录(is_verify=true 防穿山甲重试)。不带 srv_env 的旧客户端按本
环境放行(兼容,不误伤存量正式用户)。
- 新增回归测试 test_callback_foreign_env_skipped(srv_env=prod 打到 APP_ENV=dev 的服务 → 不发)
- sim_pangle_callback 增加 --srv-env 便于本地手验
客户端配套(mediaExtra 写入 srv_env)见 app-android 对应 PR。
## 生效前提(三者缺一仍漏)
1. 生产 app-server 部署本代码并重启
2. 生产 .env 为 APP_ENV=prod
3. app 重新构建(旧包不带 srv_env 仍走兼容放行)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #77
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 13:17:27 +08:00
zhuzihao
2edebfad83
feat(auth): 短信登录防刷 — 同一设备id同IP 每小时限 5 次 ( #78 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #78
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 13:17:07 +08:00
guke
3dca126411
fix(dev): 启动脚本钉定 .venv 解释器 + watchfiles 降噪 ( #75 )
...
微信优惠券增加美团/京东中间页,领券前获取微信头像授权(主功能)
---------
Co-authored-by: guke <guke@autohome.com.cn >
Reviewed-on: #75
Co-authored-by: guke <guke@wonderable.ai >
Co-committed-by: guke <guke@wonderable.ai >
2026-06-25 17:47:30 +08:00
zhuzihao
acdb10b516
feat(ad): 提现看视频广告后端支持(withdrawal_ad 场景 + 开关下发) ( #74 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #74
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
0.1.23
0.2.0
2026-06-24 22:38:06 +08:00
marco
b1849834f7
fix(alembic): merge meituan_coupon_image_meta 与 comparison/ad 双 head
2026-06-24 20:50:21 +08:00
guke
8008366abc
fix(wx-cps): 修复 微信cps分发时淘宝落地页授权刷新导致click_value 重复入库问题 0624 ( #73 )
...
通过authed=1判断当前请求是否是微信授权回填,如果是授权回填,不再insert cps_click
---------
Co-authored-by: guke <guke@autohome.com.cn >
Reviewed-on: #73
Co-authored-by: guke <guke@wonderable.ai >
Co-committed-by: guke <guke@wonderable.ai >
2026-06-24 18:15:44 +08:00
marco
43f28d358b
docs: 补全 API 与数据库文档
...
- 新增 device-liveness(无障碍存活监控)、internal(内部回写端点)、cps-redirect(CPS 短链落地)三族单文件文档
- API 总览补录此前缺失端点:coupon prompt 频控、report/invite、wxpay 回调、platform 客户端配置、feedback/user/ad 零散读端点
- database 新增 cps_wx_user / device_liveness / launch_confirm_sample 三表文档,更新 OVERVIEW/README/comparison_record/数据库迁移/后端技术实现
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.21
0.1.22
2026-06-24 04:07:54 +08:00
zhuzihao
128db7fb86
feat(admin): 广告收益报表改为逐条广告事件 + 用户列显示手机号 ( #72 )
...
报表主表从「按 用户×类型×应用×代码位 聚合」改成「逐条广告事件」(每次广告一行):
- 激励视频:展示(ad_ecpm)与发奖(ad_reward)按 ad_session_id 合并成一行,直接给出
eCPM/收益 + 状态/应发/实发/一致;展开看该条金币复算因子
- 信息流:轮播每条展示各一行;整场发奖(client_event_id 与展示 impressionId 对不上)单独成行
- 纯展示行不计对账(matched 恒 true);有展示无发奖 / 有发奖无展示各自成行
- 每行补 user_phone(批量查 User.phone,完整不脱敏,与用户/钱包/比价记录页一致)
- 合计与对账在全量上统计、不受 limit 影响;event_key 作前端稳定 rowKey
ad_audit.audit_rows 顺带补返回 ad_session_id(供展示↔发奖按会话合并)。
真实库验证:逐条输出正确、合计交叉核对一致(展示条数=ecpm行数、实发=库实发)、schema 校验通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #72
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-24 03:54:01 +08:00
zhuzihao
c222137b2a
feat(auth): 默认昵称加“用户”前缀(用户+9 位随机串) ( #70 )
...
新用户注册即分配的默认昵称由 9 位字母数字随机串改为“用户”+9 位随机串(如 用户aB3xK9mP2),更友好可读;长度 11 仍在 nickname(64)与改名上限(20)内。同步更新 test_login_assigns_username_and_nickname 断言。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #70
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-24 03:53:58 +08:00
zhuzihao
d8c7a6d1ef
feat(auth): 测试账号免验证码登录 + 每次走引导 + 每日上限 ( #69 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #69
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-24 03:53:52 +08:00
chenshuobo
4a9d3f1d1a
调整首页滚动条用户名称打码规则 ( #68 )
...
改了什么:将 savings-feed 用户名脱敏改为 PRD 规则;有昵称按长度打码,无昵称真实用户显示 用户*****后两位;种子和兜底继续合成多样化脱敏名。
为什么改:避免旧规则出现 用户********xxx,与产品要求的用户标识打码格式保持一致。
验证方式:本地请求 /api/v1/platform/savings-feed?limit=8,确认返回 用户*****xx、首字+**、首字+***+末 等新格式。
---------
Co-authored-by: lowmaster-chen <1119780489@qq.com >
Reviewed-on: #68
Co-authored-by: chenshuobo <chenshuobo@wonderable.ai >
Co-committed-by: chenshuobo <chenshuobo@wonderable.ai >
2026-06-23 21:09:23 +08:00
chenshuobo
b07ccb4bf5
feat(meituan-coupon): 采集记录头图大小/类型 + 读取侧缩放口子 + 回填脚本 ( #71 )
...
Reviewed-on: #71
Co-authored-by: chenshuobo <chenshuobo@wonderable.ai >
Co-committed-by: chenshuobo <chenshuobo@wonderable.ai >
2026-06-23 21:09:10 +08:00
marco
2164155a23
docs(cps): 加 CPS 发券分发 + 微信授权 交接文档
...
设群/建活动/生成落地页短链/美团对账/统计 + 微信网页授权拿 openid 做用户级统计的
完整说明,含数据流/数据表/平台差异/端点清单/配置项/代码地图/部署/排障/已知技术债。
挂入 docs/README 的 guides 索引。供他人接手。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 18:02:08 +08:00
marco
e81fd0a176
fix(alembic): 合并多 head( #65 device 迁移 + comparison_token_cols)
...
#65 的 device 迁移链与 comparison_token_cols 都从 ceb286289426 分叉成双 head,alembic upgrade head 报 Multiple head revisions;加 merge 迁移 4dc2af7ebe74 合并(空 DDL 仅接链)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.20
2026-06-23 17:58:30 +08:00
chenshirui
a6f55a00b8
feat(device): 无障碍保护存活心跳检测 + 掉线后置检测(pull) ( #65 )
...
Co-authored-by: 陈世睿 <2839904623@qq.com >
Reviewed-on: #65
Co-authored-by: chenshirui <chenshirui@wonderable.ai >
Co-committed-by: chenshirui <chenshirui@wonderable.ai >
2026-06-23 17:33:38 +08:00
marco
a584e1f59f
feat(comparison): 比价记录累计 LLM token(入/出)并在 admin 展示
...
server 从 llm_calls[].usage 累加 prompt/completion_tokens 落库,admin 比价记录列表/详情据此展示 token 数与估算成本;配套迁移 comparison_token_cols。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 17:24:54 +08:00
marco
e13f0f7658
fix(cps): 群内微信用户按"本群点击"算,不用 first_group_id
...
first_group_id 只记首次授权群;同一用户(cookie 已存)再去别的群不再走授权回调,
会被漏算(实测:用户首次在群47授权,再去群52点击,群52详情显示0)。
改为:在本群有带 openid 点击的 distinct openid 即本群用户,关联 cps_wx_user 画像。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 16:36:57 +08:00
chenshuobo
f868414966
feat(feedback): 补齐反馈历史审核发奖闭环 ( #66 )
...
- 新增反馈审核字段和迁移,支持 pending/adopted/rejected、未采纳原因和采纳金币
- 增加用户端反馈历史 records 接口和 admin 采纳/拒绝接口
- 采纳时同事务写状态、金币流水和审计日志,拦截重复审核
- 验证:pytest tests/test_feedback.py tests/test_admin_write.py tests/test_admin_read.py
---------
Co-authored-by: lowmaster-chen <1119780489@qq.com >
Reviewed-on: #66
Co-authored-by: chenshuobo <chenshuobo@wonderable.ai >
Co-committed-by: chenshuobo <chenshuobo@wonderable.ai >
0.1.18
2026-06-22 23:18:42 +08:00
zhuzihao
900cc83d38
fix(ad): 广告配置默认信息流位 104090333 → 104142227 ( #67 )
...
_AD_CONFIG_DEFAULTS 里 compare/coupon_feed_code_id 的旧默认 104090333
不在穿山甲应用 5830519 名下(请求报 44406「配置为 null」、出不了广告);
2026-06-21 真机核对后台,5830519 名下真实信息流位是 104142227「信息流 1」。
客户端接入 /api/v1/platform/ad-config 下发后会以此默认为准(空库回退),
故更正默认值。注:若 DB 里已存过 104090333,仍需在 admin 广告管理页改存为 104142227。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #67
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-22 23:00:27 +08:00
zhuzihao
3cab75b6ac
feat(admin-withdraw): 提现详情金币记录分页 + 风险标签拆分 ( #64 )
...
- user_coin_records 增返 total(三源 granted 计数和),支持前端页码分页
- 风险标签「历史异常提现」拆成「提现拒绝N笔」「提现失败N笔」(拒绝=人工驳回退款,失败=打款失败退款)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #64
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-21 23:41:40 +08:00
marco
08bbb5775e
fix(compare-record): platform_results 类型 list→dict,修部分失败比价上报 422 丢记录
...
ComparisonRecordIn.platform_results 误声明为 list,但 pricebot/客户端透传的是 dict
({platform_id: {status,reason,...}})。该字段仅「失败/部分失败」比价 done 帧才带,故
成功比价一直正常入库、部分失败比价上报被 pydantic 422 拒导致不入库、记录页查不到。
改 dict 后用线上真实 body 验证通过;字段仅随 raw_payload 落库、无结构化列、零副作用。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.16
0.1.17
2026-06-21 05:11:29 +08:00
zhuzihao
8a2f72d366
feat(user): 昵称上限放宽到 20 字(与客户端/原型一致) ( #63 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #63
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-21 00:16:40 +08:00
marco
f7a3ef2e0b
feat(internal): 启动确认窗 agent 兜底样本落盘(pricebot 回写)
...
- 新增内部端点 POST /internal/launch-confirm-sample(X-Internal-Secret 鉴权):
pricebot 对没见过文案的启动确认窗用 LLM 兜底放行后,把样本(host 包 / 弹窗树 /
LLM plan / 设备 locale 机型)回写落 launch_confirm_sample 表,供研发人工沉淀回
pricebot 规则 yaml
- 配套: model LaunchConfirmSample + schema + repo(都上报不去重) + alembic 迁移
launch_confirm_sample_table(down_revision=cps_wx_user) + main 注册 router +
models/__init__ 登记
- docs: 后端技术实现.md 加 §6.5 pricebot 回写内部端点说明
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.13
0.1.14
0.1.15
2026-06-20 13:39:45 +08:00
marco
d8358a6816
fix(user): 注销账号前置校验资金余额 + 释放微信/邀请码唯一约束
...
- delete_account 端点: 有可提现现金余额 / 在审提现单(reviewing)时拒绝注销(409), 防余额锁死在 deleted 行无法退出; pending 提现已在途不拦(对账 worker 不依赖 user.status)
- soft_delete_account: 注销连带清 wechat_openid/nickname/avatar(释放微信绑定槽, 否则该微信永久无法再被任何账号绑定→提现通道锁死) + invite_code(释放邀请码唯一槽)
- wallet 新增 get_cash_balance_cents(只读, 不建账户) 供注销前置校验; 复用 has_reviewing_withdraw
- 新增 tests/test_delete_account.py
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.11
0.1.12
2026-06-20 02:03:33 +08:00
marco
95a07f75b7
feat(ad): 穿山甲广告配置后台化(app_id/各位ID/验签密钥/各场景开关)
...
- app_config 存 ad_config(默认=客户端当前内置 ID,空库维持现状)
- GET /platform/ad-config 下发客户端(不含验签密钥 reward_mkey)
- admin GET/PATCH /admin/api/ad-config 读写(operator/finance + 审计,mkey 不记明文)
- pangle 回调验签 m-key 优先读后台配置、.env 兜底兼容
- 比价/领券信息流位拆分(compare/coupon_feed_code_id)
- 客户端需发版接入 /platform/ad-config 才生效;本次后端就绪、不影响现状
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-20 01:35:17 +08:00
marco
733a51260f
feat(cps): 微信网页授权加总开关 WX_MP_OAUTH_ENABLED(默认关)
...
服务号认证审核中,先关掉落地页授权(走原逻辑不跳授权/不拿 openid),整套微信代码保留。
审核通过后 .env 置 WX_MP_OAUTH_ENABLED=true + 重启即启用,无需改代码。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.8
0.1.9
0.1.10
2026-06-19 12:03:58 +08:00
marco
7fd70a264d
feat(cps): 微信网页授权接入——落地页拿 openid/昵称头像,用户级群统计
...
- 服务号网页授权(WX_MP_APPID/SECRET,区别于 App 的 WECHAT_APP_ID):
落地页 base 静默拿 openid;点「领券」补 userinfo 拿昵称头像(交互触发避快照页)
- 新表 cps_wx_user + cps_click 加 openid + 迁移;integrations/wx_oauth
- /c/{code} 授权链路 + 回调 /wx/oauth/cb + cookie 免重复授权;click 带 openid
- admin 群详情加「群内微信用户」(领券画像)端点
- 下单归因到人需 user-level sid,本期只做身份+领券侧
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-19 11:44:11 +08:00
marco
4b98d405d7
feat: OTA 版本下发端点(检查更新)
...
- app_config 加 get/set_app_version(独立 key,复用表不进 CONFIG_DEFS)
- GET /api/v1/platform/app-version 公开读 + POST /internal/app-version 内部写(X-Internal-Secret)
- tests/test_app_version.py 5 端到端测试
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.6
0.1.7
2026-06-19 08:31:31 +08:00
marco
63400c29cc
docs(api): 补录比价透传端点到 API 总览
...
intent/precoupon/step、intent/step、trace/finalize、meituan/top-sales 补进总览表,
标注 Phase 流程与不鉴权; 更新最后更新日期到 2026-06-18。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
0.1.5
2026-06-19 07:04:48 +08:00
marco
42be0f828f
feat(cps): 加微信网页授权域名校验文件端点(MP_verify)
...
coupon.shaguabijia.com 全反代 app-server,微信请求该域名根目录 MP_verify_xxx.txt
验证域名归属(放根目录)。为微信网页授权(落地页拿 openid)接入做准备。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-19 05:53:45 +08:00
marco
5bafe5b71a
feat(cps): 群每天明细端点(点击+订单按天合并,含退款/净佣金)
...
- repo group_order_daily:订单按 pay_time 北京分天聚合(口径同 _order_agg)+ 退款佣金合计
- GET /groups/{id}/daily?days=N:点击侧(补零连续天)与订单侧(仅美团群有 sid)按天合并
- 用生产 g46 真实数据验证按天口径无误
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-18 17:32:18 +08:00
marco
498da05995
docs(database): 补充数据库表文档(cps/invite/price_observation/store_mapping 等)
...
(工作区既有改动, 非本次会话产出)
2026-06-17 23:32:36 +08:00
marco
3cab3b9055
fix(compare-record): admin 放行 cancelled 筛选 + llm_calls 拉取改后台任务
...
- admin 列表 status pattern 加 cancelled(客户端会上报用户终止比价)
- 上报端点拉 pricebot llm_calls 改 BackgroundTasks 异步回填, 不阻塞上报响应(独立 session)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 23:32:36 +08:00
marco
f790519765
fix(cps): 时序分桶对 naive datetime 按 UTC 兜底(本地 SQLite 错桶)
...
clicked_at.astimezone 对 naive(SQLite 读回无 tz)会按系统时区解释→分桶偏移;
naive 先按 UTC 兜底再转北京,与 queries._as_utc 约定一致。生产 PG(tz-aware)本就正确。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 23:06:05 +08:00
marco
a2fd666203
feat(admin): 比价记录 debug 页后端——补全链路 + DB 迁移
...
model/schema 的 debug 字段已在 4ee6de2 起头,本次补完整条链路:
- repo upsert 存客户端环境/性能字段;端点同机拉 pricebot llm_calls 落库 + 算 llm次数/重试
- schema 加 platform_results 透传(admin「卡在哪一步」从 raw_payload 读)
- admin 比价记录查询接口(按 user_id/phone 列表分页 + 详情含 llm_calls)
- 迁移 comparison_debug_fields: 给 comparison_record 加环境/性能/llm_calls 列(全 nullable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 22:33:33 +08:00
marco
aa898fc09a
feat(cps): 群点击时序聚合端点(天/小时级 PV/UV/复制,补零连续桶)
...
- repo group_click_timeseries:北京时区分桶,visit/copy 的 PV/UV,无数据补 0
- GET /cps/groups/{id}/timeseries?granularity=day&days=N | granularity=hour
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 22:31:34 +08:00
marco
4ee6de2548
feat(cps): 活动支持编辑(PATCH /activities/{id})
...
- CpsActivityUpdate schema + repo update_activity(部分更新,非 None 覆盖)
- router 按「合并后最终值」校验平台必填项(同新建口径),写审计 cps.activity.update
- 可改名/平台/对应字段/落地页图/备注/状态
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 22:13:35 +08:00
marco
c78cfc838f
feat(cps): 群/活动支持删除(operator,二次确认,不级联删已发链接)
...
- repo delete_group/delete_activity + DELETE /cps/groups/{id} 与 /cps/activities/{id}
- 硬删记录但保留 cps_link:已发短链继续可用(落地页不依赖 group/activity 存活)
- 写审计 cps.group.delete / cps.activity.delete
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 21:43:34 +08:00
marco
d55f47fc59
feat(cps): 淘宝活动落地页图做活——每活动关联图,运营上传/选已有
...
- model: cps_activity.image_url + 迁移 cps_activity_image 回填存量淘宝活动为现有图
- admin: 新建淘宝活动必传图(上传 /upload-image 或选已有 /activity-images),存绝对 URL
- 落地页 cps_redirect: 按 link→activity 取图展示,缺图兜底默认图,img src 经 html.escape
- media: save_cps_image + to_abs_media_url(基于 CPS_REDIRECT_BASE,跨域 admin-web 可显示)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 21:32:10 +08:00
marco
7368a1ca8a
feat(cps): 淘宝落地页改用设计图主视觉 + 复制按钮上提至 75% 屏高
...
- banner/card 手画区域整体换成设计图 /media/taobao_landing.jpg(~240KB jpg)
- 复制淘口令按钮从底部固定上提到 top:75vh, 上方留白
- 图入库(data/media 白名单, 同 dl.html 先例), 同域 /media serve
- 淘口令注入 / 复制 / toast 逻辑不变
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 20:53:34 +08:00
marco
3a40f617bd
feat(cps): 后端接入淘宝/京东多平台(payload + 群多平台 + 复制统计 + 迁移)
...
- model: cps_group.platforms 多选 / cps_activity.payload(淘口令/京东链接)
/ cps_link.sid 可空 + 复制统计
- admin API: 群与活动平台多选、批量生成落地页短链 referral-links、对账字段可空
- 落地页 cps_redirect: 淘宝展示淘口令(记 copy 事件) / 京东 302 / 美团原逻辑
- 迁移 cps_v2_platforms: 加 platforms/payload/event_type 列, sid 放宽可空(含 downgrade)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 19:21:20 +08:00