|
886
|
116
|
9
|
5
|
|
0
|
docs(credential): 补齐M2真实请求键与双侧授权验收前置
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793610828
|
1793610838
|
1793610838
|
0
|
0
|
0
|
Edit
Delete
|
|
96
|
6
|
3
|
5
|
|
0
|
claude/fervent-kirch-e2a254 -> origin/claude/fe claude/fervent-kirch-e2a254 -> origin/claude/fervent-kirch-e2a254...
|
## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模 ## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模块专项通过 / 工作区漂移 / 阻断`
- 结论:
- 战役卡:
- 验收卡:
- runner evidence bundle:
## 验证命令
| 命令 | 结果 | 备注 |
| --- | --- | --- |
| | | |
| | | |
| | | |
## 审计命中
- `audit:tenant`:
- `audit:events`:
- `audit:route-contract`:
- `audit:docs-single-source`:
- 如未跑全量,请说明原因:
## 前端 / 页面验收
- canonical 入口:
- smoke / auth-scope:
- alias / compat 回归:
## 残余风险
- 风险 1:
- 风险 2:
## 文档同步
- [ ] `CLAUDE.md`
- [ ] `AGENTS.md`
- [ ] `README.md`
- [ ] `GEMINI.md`
- [ ] 治理经验库 / 专项记录
## 口径确认
- [ ] 本 PR 只宣称模块级通过,不把模块结果外推为工作区全绿
- [ ] 若存在工作区漂移,已明确标记且未误记到当前模块
- [ ] 若存在热修 lane,已与全域补证据 / build-out lane 隔离
...
|
0
|
0
|
1
|
1
|
1
|
|
0
|
1777597467
|
1779328857
|
1778625303
|
0
|
0
|
0
|
Edit
Delete
|
|
847
|
83
|
4
|
5
|
|
0
|
ci: stop pulling actions from github.com on the Gi ci: stop pulling actions from github.com on the Gitea runner...
|
The Gitea runner repeatedly timed out cloning acti The Gitea runner repeatedly timed out cloning actions/checkout from
github.com (once hanging Set up job for over 10 minutes), so jobs failed
or blocked the single runner before any repository code ran.
- Checkout: plain git with the Gitea task token as Basic credentials,
all branches and tags fetched (F5 provenance needs history), detached
at github.sha, workspace cleaned.
- Node: scripts/ci-setup-node.sh downloads an exact version from
npmmirror and verifies it against the mirror's SHASUMS256.txt; both
governance jobs and the platform job use 22.23.2.
- platform-governance: upload-artifact replaced by printing the gate
reports into the run log. This file now diverges from the
@juhai/governance consumer template.
Verified locally: the checkout snippet against a file:// copy of this
repository (detached at the requested SHA, stale files removed); the
Node script in a linux/arm64 container with a test-only curl stand-in
(install, cache reuse, tampered archive rejected, unknown version
rejected).
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793096895
|
1793096902
|
1793096902
|
0
|
0
|
0
|
Edit
Delete
|
|
850
|
83
|
7
|
5
|
|
0
|
ci: per-run docker PostgreSQL/Redis for acceptance ci: per-run docker PostgreSQL/Redis for acceptance, with reports rebound to e8591c7...
|
Two commits:
- e8591c7 ci: the runtime job no l Two commits:
- e8591c7 ci: the runtime job no longer uses `services:` (never started on this host-mode runner; 127.0.0.1:5432 reached an unrelated PostgreSQL on the runner host in run 26519). scripts/ci-acceptance-services.sh fails without docker; otherwise it starts per-run PostgreSQL/Redis containers on docker-assigned high ports with a random masked password and removes them in an if: always() step. G14 updated.
- 8cf50a6 chore(reports): runtime, UI and static reports rerun on the clean final source e8591c7.
Local evidence (isolated containers, recreated database):
- check:runtime 452/452 (floor 452), frozen oracle 12, outbox 1 scenario / 0 duplicates, outage health 2.
- check:ui 46/46.
- pnpm check with DIGITAL_EMPLOYEE_OS_ROOT at e12d0f2: exit 0, provenance violations 0.
- Script checks: start/connect/stop with no leftovers, repeated stop, and failures for missing docker, a non-prefixed database name and an invalid run id.
Not yet verified: docker on the runner host and its ability to pull postgres:16 / redis:7 (override with CI_POSTGRES_IMAGE / CI_REDIS_IMAGE repository variables).
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793102531
|
1793190011
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
881
|
116
|
5
|
5
|
|
0
|
ci(diagnostic): 只读核对现有runner的维护边界
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793581907
|
1793596652
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
731
|
57
|
2
|
5
|
|
0
|
chore: add material factory model weights
|
<!--
PR 治理模板。提交前请逐项确认,确保符合 docs/standards 下的 <!--
PR 治理模板。提交前请逐项确认,确保符合 docs/standards 下的工程规范。
CI 会执行:pnpm check(命名 + 单源漂移 + 治理棘轮 + lint + typecheck);
有测试 DB 的流水线另执行 DATABASE_URL=... pnpm check:runtime。
-->
## 变更内容
<!-- 简述这次改了什么、为什么改(聚焦 why) -->
-
## 涉及业务概念
<!-- 列出涉及的业务词典英文名,例如 store / order / verification。参见 docs/domain-glossary.md -->
-
## 检查清单
### 命名一致性
- [ ] 业务概念使用了词典中的标准英文名(未出现 shop/branch/seller/voucher/writeOff 等禁用词)
- [ ] 数据库 snake_case + 复数表名;API/JSON 字段 camelCase;类型 PascalCase;常量 SCREAMING_SNAKE_CASE
- [ ] `pnpm check:naming` 通过
- [ ] `pnpm check:schema` 通过,未新增第二份状态/契约真源
### API / 契约
- [ ] 不涉及 API 变更
- [ ] 新增/修改了 API,路由符合 `/api/v1/{resources}` 规范
- [ ] 已更新 `packages/contracts` 中的 Zod schema / DTO / 类型(前后端共用同一份)
- [ ] 无破坏前端兼容的字段删除/重命名(如有,已在描述中说明迁移方案)
### 数据库
- [ ] 不涉及数据库变更
- [ ] 新增/修改了表或字段,已通过 migration review(表名复数、字段 snake_case、外键 xxx_id、时间 _at、状态 status)
- [ ] 高增长表已考虑分区;涉及多租户的表带 tenant_id
- [ ] 写链显式带 tenant_id;跨租户读写按 404/隔离口径处理
### 数据库迁移(迁移即代码:版本/顺序/内容/环境/发布/回滚一致)
- [ ] 改 schema.prisma 的同时**已生成并提交 migration**(`pnpm db:migrate:dev --name <change>`),未只改 schema 不落迁移
- [ ] **未修改已发布过的历史 migration 文件**(内容一致:历史不可变,新变更走新迁移)
- [ ] `pnpm check:migrations` 通过(迁移历史在位 / 无未豁免高危 DDL / schema 表、enum、`@map` 列均已落迁移)
- [ ] 破坏性变更(删表/删列/改名/改类型/加 NOT NULL/加唯一约束)走 **expand→migrate→contract** 三阶段,不一次切
- [ ] 大表加索引用 `CREATE INDEX CONCURRENTLY`;大批量回填走 BullMQ 分批任务,不塞进 migration
- [ ] 高危但确需的 DDL 已加 `-- migration-allow:<原因>` 留痕,并在下方回滚方案说明
- [ ] 非开发环境只用 `migrate deploy`(禁止 `db push` / 线上手动 ALTER);发布前 `pnpm db:migrate:status` 无 drift
### 实时 / 队列
- [ ] 不涉及
- [ ] 关键业务事件进入 BullMQ 或持久化事件表(未仅依赖 Redis Pub/Sub)
- [ ] 写库事件与真实写操作在同一 tx 写入 outbox,未在 commit 后旁路 publish
- [ ] 实时通道选型符合规范(订单/看板/通知用 SSE;设备在线/包间控制/IM 用 WebSocket)
### 质量与发布
- [ ] 通过 `pnpm lint` 与 `pnpm typecheck`
- [ ] 通过 `pnpm check:governance`,`reports/*.latest.json` 已刷新且无棘轮回退
- [ ] 涉及写链 / DB / 租户 / 状态机时,通过 `DATABASE_URL=... pnpm check:runtime`,`reports/runtime-acceptance.latest.json` 已刷新
- [ ] 已补充/更新必要的测试
- [ ] 不需要回滚方案
- [ ] 需要回滚方案,已在下方说明
## 回滚方案 / 其他说明
-
...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1786603028
|
1786603028
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
892
|
116
|
13
|
5
|
|
0
|
chore(reports): adopt Runtime static originals at chore(reports): adopt Runtime static originals at dc13b515 and clarify evidence snapshot...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793674166
|
1793710134
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
853
|
83
|
10
|
5
|
|
0
|
chore(deps): H23 根与 apps/* 对齐框架 0.27.0 安全基线
|
<!--
PR 治理模板。提交前请逐项确认,确保符合 docs/standards 下的 <!--
PR 治理模板。提交前请逐项确认,确保符合 docs/standards 下的工程规范。
CI 会执行:pnpm check(命名 + 单源漂移 + 治理棘轮 + lint + typecheck);
有测试 DB 的流水线另执行 DATABASE_URL=... pnpm check:runtime。
-->
## 变更内容
<!-- 简述这次改了什么、为什么改(聚焦 why) -->
-
## 涉及业务概念
<!-- 列出涉及的业务词典英文名,例如 store / order / verification。参见 docs/domain-glossary.md -->
-
## 检查清单
### 命名一致性
- [ ] 业务概念使用了词典中的标准英文名(未出现 shop/branch/seller/voucher/writeOff 等禁用词)
- [ ] 数据库 snake_case + 复数表名;API/JSON 字段 camelCase;类型 PascalCase;常量 SCREAMING_SNAKE_CASE
- [ ] `pnpm check:naming` 通过
- [ ] `pnpm check:schema` 通过,未新增第二份状态/契约真源
### API / 契约
- [ ] 不涉及 API 变更
- [ ] 新增/修改了 API,路由符合当前生命周期规范:既有 Personnel Core 保持 `/api/personnel/*`,HR v2 领域使用 `/api/v2/{domain}/*`,身份协议使用标准 OIDC 端点
- [ ] 已更新 `packages/contracts` 中的 Zod schema / DTO / 类型(前后端共用同一份)
- [ ] 无破坏前端兼容的字段删除/重命名(如有,已在描述中说明迁移方案)
### 数据库
- [ ] 不涉及数据库变更
- [ ] 新增/修改了表或字段,已通过 migration review(表名复数、字段 snake_case、外键 xxx_id、时间 _at、状态 status)
- [ ] 高增长表已考虑分区;涉及多租户的表带 tenant_id
- [ ] 写链显式带 tenant_id;跨租户读写按 404/隔离口径处理
### 数据库迁移(迁移即代码:版本/顺序/内容/环境/发布/回滚一致)
- [ ] 改 schema.prisma 的同时**已生成并提交 migration**(`pnpm db:migrate:dev --name <change>`),未只改 schema 不落迁移
- [ ] **未修改已发布过的历史 migration 文件**(内容一致:历史不可变,新变更走新迁移)
- [ ] `pnpm check:migrations` 通过(迁移历史在位 / 无未豁免高危 DDL / schema 表、enum、`@map` 列均已落迁移)
- [ ] 破坏性变更(删表/删列/改名/改类型/加 NOT NULL/加唯一约束)走 **expand→migrate→contract** 三阶段,不一次切
- [ ] 大表加索引用 `CREATE INDEX CONCURRENTLY`;大批量回填走 BullMQ 分批任务,不塞进 migration
- [ ] 高危但确需的 DDL 已加 `-- migration-allow:<原因>` 留痕,并在下方回滚方案说明
- [ ] 非开发环境只用 `migrate deploy`(禁止 `db push` / 线上手动 ALTER);发布前 `pnpm db:migrate:status` 无 drift
### 实时 / 队列
- [ ] 不涉及
- [ ] 关键业务事件进入 BullMQ 或持久化事件表(未仅依赖 Redis Pub/Sub)
- [ ] 写库事件与真实写操作在同一 tx 写入 outbox,未在 commit 后旁路 publish
- [ ] 实时通道选型符合规范(订单/看板/通知用 SSE;设备在线/包间控制/IM 用 WebSocket)
### 质量与发布
- [ ] 通过 `pnpm lint` 与 `pnpm typecheck`
- [ ] 通过 `pnpm check:governance`,`reports/*.latest.json` 已刷新且无棘轮回退
- [ ] 涉及写链 / DB / 租户 / 状态机时,通过 `DATABASE_URL=... pnpm check:runtime`,`reports/runtime-acceptance.latest.json` 已刷新
- [ ] 涉及页面或浏览器行为时,`pnpm check:ui` 与 `pnpm check:ui:fastify` 均通过,未只验证一个后端
- [ ] 已补充/更新必要的测试
- [ ] 不需要回滚方案
- [ ] 需要回滚方案,已在下方说明
## 回滚方案 / 其他说明
-
...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793114286
|
1793115451
|
1793114295
|
0
|
0
|
0
|
Edit
Delete
|
|
725
|
18
|
213
|
1
|
|
0
|
bug-批量修改价格
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339439
|
1786339447
|
1786339447
|
0
|
0
|
0
|
Edit
Delete
|
|
726
|
18
|
214
|
1
|
|
0
|
bug-批量修改价格
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339478
|
1786339630
|
1786339630
|
0
|
0
|
0
|
Edit
Delete
|
|
706
|
23
|
44
|
1
|
|
0
|
bug-V2平台调音-1的商家id不显示问题
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784802032
|
1784802046
|
1784802046
|
0
|
0
|
0
|
Edit
Delete
|
|
711
|
23
|
46
|
1
|
|
0
|
bug-V2平台调音-1的商家id不显示问题
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784874674
|
1784874685
|
1784874685
|
0
|
0
|
0
|
Edit
Delete
|
|
712
|
18
|
211
|
1
|
|
0
|
bug
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1785224168
|
1785224183
|
1785224183
|
0
|
0
|
0
|
Edit
Delete
|
|
713
|
18
|
212
|
1
|
|
0
|
bug
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1785224202
|
1785224212
|
1785224212
|
0
|
0
|
0
|
Edit
Delete
|
|
767
|
24
|
1
|
4
|
|
0
|
[后台管理] 按省市统计设备月度新增上线数量报表
|
## 关联 Issue
Close #4 — [后台] 按省市统计设备月度新增上线数量报表
(I ## 关联 Issue
Close #4 — [后台] 按省市统计设备月度新增上线数量报表
(Issue 位于另一仓库 laiqiaojie/jh-project,Gitea 跨仓库 `Close #N` 不会自动关联,merge 后需手动去 jh-project 更新 Issue 状态)
## 变更说明
- 新增 `DeviceOnlineStats` 控制器,暴露 `getProvinceStats`(按月+省份汇总新增上线设备数)、`getCityStats`(指定省份后按城市下钻)两个接口
- `Ahead_authenticate_log_model` 新增对应查询方法:联表 `ahead_authenticate_log` → `ahead_family_servers` → `ahead_yc_shop`,权限过滤复用现有 `Ahead_manage_user_model::check_is_agent()`(超管看全国,运营商强制按 `shop._agent_id` 过滤)
- 与 plan.md 的偏差:实现与计划一致;另外在 `/code-review` 中发现并修复了两个问题(均已回归验证):
- `month` 参数只校验格式未校验取值范围,如 `2026-00` 会被 `strtotime` 静默接受为上一年 12 月而不报错 → 正则改为 `(0[1-9]|1[0-2])` 严格校验月份范围
- 未绑定门店的设备(`room._shop_id` 为 0/未匹配)会被计入 `total` 但在 `GROUP BY shop._province` 时产生一个 province 为 null 的脏分组 → 加 `room._shop_id > 0` 过滤
## 测试说明
- 本地起 PHPStudy,登录后手动调用两个接口验证:正常月份返回 `{code:0, result:{total, list}}`;缺 `month`/非法月份(`2026-00`、`2026-13`、`0000-00`)均正确返回 400
- 用只读 SQL 直接查了云端开发库确认 JOIN 链路正确——本地测试库 `ahead_authenticate_log` 表只有 1 条 2021 年的历史数据,所以当月查询返回空列表是预期行为,不是 bug
- `tests/api/smoke.mjs` 里补充了对应的自动化用例,但该冒烟测试框架整体依赖另一个尚未推送到 `admin` 分支的提交(`694e34c`,属于另一项未提交的工作,不在本 Issue 范围内),为保持本 PR 改动范围干净,本次未包含测试框架文件,仅代码改动
- 需要 Tech Lead 重点看:`check_is_agent()` 权限过滤范围是否符合预期;`room._shop_id > 0` 过滤是否会误伤合法数据
## 产物归档
- Plan:[plan/device-online-stats-by-region-admin.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/plan/device-online-stats-by-region-admin.md)(位于 laiqiaojie/jh-project 仓库)
...
|
0
|
0
|
1
|
1
|
1
|
|
0
|
1788244598
|
1788246926
|
1788245236
|
0
|
0
|
0
|
Edit
Delete
|
|
759
|
85
|
4
|
4
|
|
0
|
[后台] 按省市统计设备月度新增上线数量报表
|
> 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 De > 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 Design PR
[PR #3 — Design: 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/3)
## 工作范围
负责后台接口实现:
- 新增查询接口,按月份统计各省份新增上线设备数量
- 支持下钻查询:指定省份,返回城市级别数据
- 按权限过滤:超管返回全国数据,运营商返回自己区域
## 产物
- (实现前提交,Tech Lead 审核后开始 Build)
## 参考
- 需求说明:[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
- 在线原型:https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8...
|
1
|
0
|
1
|
0
|
2
|
|
0
|
1787909526
|
1789380193
|
1789380193
|
0
|
1
|
0
|
Edit
Delete
|
|
769
|
24
|
2
|
4
|
|
0
|
[Web前端] 按省市统计设备月度新增上线数量报表
|
## 关联 Issue
Related to laiqiaojie/jh-project#5
Re ## 关联 Issue
Related to laiqiaojie/jh-project#5
Related to laiqiaojie/jh-project#8 — 按省市统计设备月度新增上线数量报表(Web 前端)
## 变更说明
- 新增 页面组件
- 省份视图:横向柱状图展示各省份当月新增上线设备数,点击下钻城市
- 城市视图:横向柱状图展示选定省份各城市分布,面包屑返回全国
- 使用 CSS 自定义 bar(不引入 ECharts),保持项目依赖不变
- 更新 :注册 device_online_stats 组件
- 更新 :新增 路由规则
- **修复** : 在父菜单 为空时拼出 双斜杠,导致路由匹配失败
- **修复** : 同一根因的双斜杠问题
## 测试说明
- 月份切换后图表重新加载
- 点击省份柱子进入城市视图,面包屑显示「全国 › XX省」
- 点击「全国」/「返回全国」返回省份视图
- 无数据月份显示空状态
- 点击「数据」顶部菜单 → 侧栏「设备上线分布」→ 组件正常渲染(已端到端验证)
## DB 变更(需手动执行)
## 产物归档
- Plan:(在 jh-project 仓库)
- 设计文档:
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788247154
|
1789379914
|
1789377273
|
0
|
3
|
0
|
Edit
Delete
|
|
760
|
85
|
5
|
4
|
|
0
|
[Web] 按省市统计设备月度新增上线数量报表
|
> 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 De > 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 Design PR
[PR #3 — Design: 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/3)
## 工作范围
负责 Web 前端页面实现:
- 数据报表 → 设备上线分布 页面
- 月份筛选器 + 当月总数卡片 + 省份横向柱状图
- 点击省份下钻到城市视图,支持面包屑返回
## 产物
- plan/device-online-stats-by-region-web.md(实现前提交,Tech Lead 审核后开始 Build)
## 参考
- 需求说明:[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
- 在线原型:https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8...
|
1
|
0
|
1
|
0
|
3
|
|
0
|
1787909556
|
1789380193
|
1789380193
|
0
|
1
|
0
|
Edit
Delete
|
|
770
|
85
|
7
|
4
|
|
0
|
[Skill] build-complete 新增接口文档归档步骤
|
Related to #8
## 说明
在 `build-complete` skill 里新增 Related to #8
## 说明
在 `build-complete` skill 里新增一步:Plan 阶段确定接口设计后、代码开发完成时,如涉及新增/修改接口,需要生成并归档接口文档:
- Apifox(规范化 OpenAPI 文档,Claude 通过 API 增量导入)
- `docs/frontend-specs/<功能名>.md`(面向其他端的对接说明文档,固定五章结构)
背景:issue #4 实现完成后发现接口文档一直没有归档,靠事后补做;这次把它固化成流程里的正式一步,插在"提交 plan.md"和"开代码 PR"之间。
同时补充了代码仓库与 jh-project 分离时的注意事项(milestone/label 可能不存在、Close #N 跨仓库不生效)。...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788247386
|
1789379900
|
1788247940
|
0
|
1
|
0
|
Edit
Delete
|
|
768
|
85
|
6
|
4
|
|
0
|
[Plan] 按省市统计设备月度新增上线数量报表 (后台管理)
|
Related to #8
## 关联 Issue
[#4 — [后台] 按省市统计设备月度新增 Related to #8
## 关联 Issue
[#4 — [后台] 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/issues/4)
## 说明
补交 Plan 阶段产物(此前误提交到已合并关闭的 design 分支,未能进入 main,见此 PR 重新提交)。
代码已实现并提交:[laiqiaojie/admin#1](https://gitea.g-hi.com/laiqiaojie/admin/pulls/1)
按 REVIEW.md「跳过评审的路径」,`plan/` 产物文件不需要 Tech Lead 单独审核,随此 PR 直接入库。...
|
0
|
0
|
1
|
1
|
1
|
|
0
|
1788245555
|
1789379899
|
1788245966
|
0
|
1
|
0
|
Edit
Delete
|
|
756
|
85
|
1
|
4
|
|
0
|
[Intent] 按省市统计设备月度新增上线数量报表
|
Related to #8
## 需求摘要
在「数据报表 > 设备分析」下新增报表,按月筛 Related to #8
## 需求摘要
在「数据报表 > 设备分析」下新增报表,按月筛选展示各省份新激活上线设备数量柱状图排行,支持下钻到城市维度。
## 核心决策
- 统计口径:当月**新激活**上线设备(首次上线,取 ahead_authenticate_log 表的 create_time 字段)
- 地区归属:取设备绑定**门店地址**的省/市字段
- 交互方式:点击省份**下钻**到城市排行(非 Tab 切换)
- 权限:跟随现有 agent_id 角色体系,超管看全国,运营商看自己区域
## 不在范围内
- 不做 Excel 导出
- 不做地图热力图
- 不做区/县级别
- 不做跨月趋势
## 产物文件
[intent/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/intent/device-online-stats-by-region/intent/device-online-stats-by-region.md)
## PM 审核清单(参考 REVIEW.md)
- [ ] 需求背景和问题描述是否准确反映了原始诉求?
- [ ] 期望结果是否可验证?
- [ ] 不在范围内的排除项是否合理?
- [ ] 受影响系统判断是否正确(admin / ahead_authenticate_log)?
- [ ] 本次是否接受排期,进入 Design 阶段?...
|
1
|
0
|
1
|
1
|
2
|
|
0
|
1787817232
|
1789379898
|
1787823622
|
0
|
5
|
0
|
Edit
Delete
|
|
757
|
85
|
2
|
4
|
|
0
|
[Design] 按省市统计设备月度新增上线数量报表
|
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https:// ## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/1)
---
## 审核顺序:PM 先确认原型,再由 Tech Lead Approve
---
## 第一步:PM 确认原型
**原型文件:**
(从仓库拉取后浏览器直接双击打开,可点击交互)
页面状态:
- 全国省份视图 — 月份筛选器 + 当月总数卡片 + 各省份横向柱状图
- 城市下钻视图 — 点击省份柱子进入,面包屑「全国 › 广东省」+ 城市排行
交互流程:点击省份柱子进入城市视图,点击面包屑「全国」或「返回全国」按钮返回。
**PM 审核 checklist:**
- [ ] 页面布局和组件符合预期?
- [ ] 交互路径(下钻、返回)正确?
- [ ] 数据定义(新增上线 = 首次激活,归属 = 门店地址)理解一致?
- [ ] 权限范围(超管看全国,运营商看自己区域)正确?
**PM 确认方式:在本 PR 评论「原型确认 ✅」即可,无需 Approve**
---
## 第二步:Tech Lead 审核(PM 确认后进行)
**数据链路:**
> 待确认:ahead_family_servers._shop_id 是否关联 ahead_yc_shop._id,Build 阶段查库验证。
**新增接口(新建控制器 DeviceOnlineReport.php):**
- POST /DeviceOnlineReport/getStats — 省份排行 + 当月总数
- POST /DeviceOnlineReport/getCityStats — 城市下钻
**权限:** agent_id 从 session 取,= 0 为超管不过滤
**安全:** month 正则校验、province_id intval()、agent_id 不信任前端
**Tech Lead 审核 checklist:**
- [ ] 数据链路正确?表关联关系有无误判?
- [ ] 接口设计合理?参数和响应格式符合规范?
- [ ] 权限处理方式正确?
- [ ] 安全检查要点覆盖?
- [ ] 前端方案可行(ECharts 按需引入)?
**Tech Lead Approve → Merge → 评审会议(里程碑内所有需求一起)→ Plan 阶段**...
|
1
|
0
|
1
|
1
|
0
|
|
0
|
1787824027
|
1789379887
|
1787829412
|
0
|
3
|
0
|
Edit
Delete
|
|
758
|
85
|
3
|
4
|
|
0
|
[Design] 按省市统计设备月度新增上线数量报表
|
Related to #8
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上 Related to #8
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/1)
---
## PM 确认原型
**需求说明文档:**
[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
**在线原型(点击直接打开,可交互,无需登录):**
https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8
**页面状态:**
- 全国省份视图 — 月份筛选器 + 当月总数卡片 + 各省份横向柱状图
- 城市下钻视图 — 点击省份柱子进入,面包屑「全国 › 广东省」+ 城市排行
**交互流程:** 点击省份柱子进入城市视图,点击面包屑「全国」或「返回全国」按钮返回。
**审核 checklist:**
- [ ] 页面布局和组件符合预期?
- [ ] 交互路径(下钻、返回)正确?
- [ ] 数据定义(新增上线 = 首次上线,归属 = 门店注册地址)理解一致?
- [ ] 权限范围(超管看全国,运营商看自己区域)正确?
**确认方式:在本 PR 评论「原型确认 ✅」,然后 Approve + Merge**...
|
1
|
0
|
1
|
1
|
0
|
|
0
|
1787829439
|
1789379899
|
1787908921
|
0
|
7
|
0
|
Edit
Delete
|
|
132
|
6
|
7
|
5
|
|
0
|
Refresh governance coverage counts in AGENTS.md
|
## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模 ## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模块专项通过 / 工作区漂移 / 阻断`
- 结论:
- 战役卡:
- 验收卡:
- runner evidence bundle:
## 验证命令
| 命令 | 结果 | 备注 |
| --- | --- | --- |
| | | |
| | | |
| | | |
## 审计命中
- `audit:tenant`:
- `audit:events`:
- `audit:route-contract`:
- `audit:docs-single-source`:
- 如未跑全量,请说明原因:
## 前端 / 页面验收
- canonical 入口:
- smoke / auth-scope:
- alias / compat 回归:
## 残余风险
- 风险 1:
- 风险 2:
## 文档同步
- [ ] `CLAUDE.md`
- [ ] `AGENTS.md`
- [ ] `README.md`
- [ ] `GEMINI.md`
- [ ] 治理经验库 / 专项记录
## 口径确认
- [ ] 本 PR 只宣称模块级通过,不把模块结果外推为工作区全绿
- [ ] 若存在工作区漂移,已明确标记且未误记到当前模块
- [ ] 若存在热修 lane,已与全域补证据 / build-out lane 隔离
...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779068050
|
1779069305
|
1779068087
|
0
|
0
|
0
|
Edit
Delete
|
|
820
|
124
|
14
|
5
|
|
0
|
Merge remote-tracking branch 'origin/main' Merge remote-tracking branch 'origin/main' into claude/vid01-adv03...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791560682
|
1791560687
|
1791560687
|
0
|
0
|
0
|
Edit
Delete
|
|
740
|
21
|
328
|
1
|
|
0
|
Merge pull request '套餐购买页“购买时长"页签根据后台设置显隐& Merge pull request '套餐购买页“购买时长"页签根据后台设置显隐' (#321) from pay into pay-260818...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672685
|
1786672694
|
1786672694
|
0
|
0
|
0
|
Edit
Delete
|
|
671
|
18
|
204
|
1
|
|
0
|
Merge pull request '合并0519最新' (#112) from Merge pull request '合并0519最新' (#112) from pc into pc-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141864
|
1781141874
|
1781141874
|
0
|
0
|
0
|
Edit
Delete
|
|
614
|
22
|
74
|
1
|
|
0
|
Merge pull request '合并0519' (#5) from app Merge pull request '合并0519' (#5) from app into app-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780972453
|
1780972468
|
1780972468
|
0
|
0
|
0
|
Edit
Delete
|
|
707
|
22
|
91
|
1
|
|
0
|
Merge pull request '一些bug' (#90) from app Merge pull request '一些bug' (#90) from app into app-260728...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871262
|
1784871267
|
1784871267
|
0
|
0
|
0
|
Edit
Delete
|
|
672
|
21
|
308
|
1
|
|
0
|
Merge pull request '260519分支分支' (#3) from Merge pull request '260519分支分支' (#3) from pay into pay-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141923
|
1781141933
|
1781141933
|
0
|
0
|
0
|
Edit
Delete
|
|
670
|
23
|
37
|
1
|
|
0
|
Merge pull request '0519' (#3) from admin Merge pull request '0519' (#3) from admin into admin-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141783
|
1781141791
|
1781141791
|
0
|
0
|
0
|
Edit
Delete
|
|
131
|
6
|
6
|
5
|
|
0
|
Fix CRUD visible runner timeouts and permissions
|
## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模 ## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模块专项通过 / 工作区漂移 / 阻断`
- 结论:
- 战役卡:
- 验收卡:
- runner evidence bundle:
## 验证命令
| 命令 | 结果 | 备注 |
| --- | --- | --- |
| | | |
| | | |
| | | |
## 审计命中
- `audit:tenant`:
- `audit:events`:
- `audit:route-contract`:
- `audit:docs-single-source`:
- 如未跑全量,请说明原因:
## 前端 / 页面验收
- canonical 入口:
- smoke / auth-scope:
- alias / compat 回归:
## 残余风险
- 风险 1:
- 风险 2:
## 文档同步
- [ ] `CLAUDE.md`
- [ ] `AGENTS.md`
- [ ] `README.md`
- [ ] `GEMINI.md`
- [ ] 治理经验库 / 专项记录
## 口径确认
- [ ] 本 PR 只宣称模块级通过,不把模块结果外推为工作区全绿
- [ ] 若存在工作区漂移,已明确标记且未误记到当前模块
- [ ] 若存在热修 lane,已与全域补证据 / build-out lane 隔离
...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1778907435
|
1778907436
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
94
|
6
|
2
|
5
|
|
0
|
Encode DB credentials in synced local env URLs
|
## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模 ## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模块专项通过 / 工作区漂移 / 阻断`
- 结论:
- 战役卡:
- 验收卡:
- runner evidence bundle:
## 验证命令
| 命令 | 结果 | 备注 |
| --- | --- | --- |
| | | |
| | | |
| | | |
## 审计命中
- `audit:tenant`:
- `audit:events`:
- `audit:route-contract`:
- `audit:docs-single-source`:
- 如未跑全量,请说明原因:
## 前端 / 页面验收
- canonical 入口:
- smoke / auth-scope:
- alias / compat 回归:
## 残余风险
- 风险 1:
- 风险 2:
## 文档同步
- [ ] `CLAUDE.md`
- [ ] `AGENTS.md`
- [ ] `README.md`
- [ ] `GEMINI.md`
- [ ] 治理经验库 / 专项记录
## 口径确认
- [ ] 本 PR 只宣称模块级通过,不把模块结果外推为工作区全绿
- [ ] 若存在工作区漂移,已明确标记且未误记到当前模块
- [ ] 若存在热修 lane,已与全域补证据 / build-out lane 隔离
...
|
0
|
0
|
0
|
1
|
5
|
|
0
|
1777515695
|
1779328857
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
155
|
21
|
2
|
1
|
|
0
|
260519分支分支
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779154516
|
1779154531
|
1779154531
|
0
|
0
|
0
|
Edit
Delete
|
|
156
|
21
|
3
|
1
|
|
0
|
260519分支分支
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779154605
|
1781141934
|
1779154649
|
0
|
0
|
0
|
Edit
Delete
|
|
673
|
32
|
1
|
1
|
|
0
|
222
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1781158798
|
1781158798
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
21
|
2
|
21
|
1
|
|
0
|
11111
|
测试
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1773910676
|
1773910796
|
1773910698
|
0
|
0
|
0
|
Edit
Delete
|
|
776
|
18
|
223
|
1
|
|
0
|
11111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436327
|
1789436336
|
1789436336
|
0
|
0
|
0
|
Edit
Delete
|
|
867
|
22
|
117
|
1
|
|
0
|
11111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793164848
|
1793164854
|
1793164854
|
0
|
0
|
0
|
Edit
Delete
|
|
868
|
22
|
118
|
1
|
|
0
|
11111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793164870
|
1793164877
|
1793164877
|
0
|
0
|
0
|
Edit
Delete
|
|
375
|
18
|
166
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779870591
|
1779870599
|
1779870599
|
0
|
0
|
0
|
Edit
Delete
|
|
693
|
23
|
41
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783990894
|
1783990913
|
1783990913
|
0
|
0
|
0
|
Edit
Delete
|
|
771
|
23
|
56
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788426740
|
1788426764
|
1788426764
|
0
|
0
|
0
|
Edit
Delete
|
|
772
|
23
|
57
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788426774
|
1788426780
|
1788426780
|
0
|
0
|
0
|
Edit
Delete
|
|
828
|
23
|
63
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791868451
|
1791868458
|
1791868458
|
0
|
0
|
0
|
Edit
Delete
|
|
829
|
23
|
64
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791868475
|
1791868484
|
1791868484
|
0
|
0
|
0
|
Edit
Delete
|
|
830
|
23
|
65
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791868652
|
1791868657
|
1791868657
|
0
|
0
|
0
|
Edit
Delete
|
|
862
|
23
|
67
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793153904
|
1793153911
|
1793153911
|
0
|
0
|
0
|
Edit
Delete
|
|
863
|
23
|
68
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793154047
|
1793154053
|
1793154053
|
0
|
0
|
0
|
Edit
Delete
|
|
872
|
23
|
69
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793330567
|
1793330572
|
1793330572
|
0
|
0
|
0
|
Edit
Delete
|