| event_payload |
{"ref":"refs/heads/main","befo {"ref":"refs/heads/main","before":"cc720a3ed232225461ea8651defce0f7de17a7e8","after":"8dea76f88dbc1d25b9138740a700858621193fcf","compare_url":"https://gitea.g-hi.com/luoanwu/yggdrasil-local-life-tools/compare/cc720a3ed232225461ea8651defce0f7de17a7e8...8dea76f88dbc1d25b9138740a700858621193fcf","commits":[{"id":"8dea76f88dbc1d25b9138740a700858621193fcf","message":"feat(setup): 调价建议按规则生成、开店配置界面、参考数据非破坏性引导\n\n调价建议生成器(此前全仓没有任何代码创建 PricingSuggestion):\n- POST /pricing/suggestions/generate 按门店已开启的规则从本店数据生成:\n 竞品跟价(同价位带对标)、周末高峰、平峰折扣、节假日溢价;库存告急无数据来源不生成。\n- 规则建议不带销量 / 毛利预测(source=rule,verify / margin / conf 为 null);\n 数据不够不生成并在 skipped 里说明原因;同店并发只落一条,处理后 7 天内不重提。\n- 生成与采纳用同一套餐权益;同一套餐 24 小时内调价不超过 2 次由系统拦截,\n 其余护栏文案改为「需人工把关」。\n- 迁移 20261004072931:PricingSuggestion.source 列与取值约束。\n\n开店配置界面(真实接口模式;离线演示不变):\n- 产品定价:新建 / 编辑 / 下架套餐。\n- 门店资料:房台资源新增 / 编辑 / 设为维护 / 恢复可用;总部可改门店资料。\n- 门店连锁:总部新建门店,套餐不含连锁能力时显示后端原因。\n- 动态调价:按规则生成按钮,按来源标注建议。\n- 客户端把参数校验失败的具体字段带进提示。\n\n参考数据引导:\n- 节假日日历、内容模板、合规法规抽到 prisma/reference-data.ts,种子与引导共用。\n- npm run bootstrap:reference 只补缺、不删除、可重复、并发安全;\n 容器入口在迁移后默认执行。模板不再带编造的使用量;热点是样例,不进引导。\n\n验证:后端 99 文件 925 条、接口覆盖 252/254(基线 2 未变);前端整链通过;\n浏览器完整回归 256 通过 / 2 按设计跳过,含刚注册空商户的冷启动场景。\n规则见 docs/contracts/pricing-suggestion-rules.md,\n记录见 docs/setup-and-generators-governance-2026-10-04.md。\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/yggdrasil-local-life-tools/commit/8dea76f88dbc1d25b9138740a700858621193fcf","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-10-04T01:23:02-07:00","added":["docs/contracts/pricing-suggestion-rules.md","docs/setup-and-generators-governance-2026-10-04.md","e2e/tests/17-setup-screens.spec.ts","server/prisma/bootstrap-reference.ts","server/prisma/migrations/20261004072931_pricing_suggestion_source/migration.sql","server/prisma/reference-data.ts","server/src/modules/pricing/generator.ts","server/test/r61-pricing-generator.test.ts","server/test/r62-reference-bootstrap.test.ts","团购本地生活AI运营App/scripts/test-setup-screens.mjs"],"removed":[],"modified":["CLAUDE.md","README.md","e2e/package.json","server/docker-entrypoint.sh","server/package.json","server/prisma/schema.prisma","server/prisma/seed.ts","server/src/middleware/entitlement.ts","server/src/modules/pricing/routes.ts","server/src/modules/pricing/service.ts","server/src/openapi.ts","server/test/r39-entitlement.test.ts","团购本地生活AI运营App/api.js","团购本地生活AI运营App/index.html","团购本地生活AI运营App/package.json","团购本地生活AI运营App/screen-governance.generated.json","团购本地生活AI运营App/screens-more.jsx","团购本地生活AI运营App/screens-p2.jsx","团购本地生活AI运营App/screens-strategy.jsx","团购本地生活AI运营App/scripts/test-static.mjs","开发计划.md"]}],"total_commits":0,"head_commit":{"id":"8dea76f88dbc1d25b9138740a700858621193fcf","message":"feat(setup): 调价建议按规则生成、开店配置界面、参考数据非破坏性引导\n\n调价建议生成器(此前全仓没有任何代码创建 PricingSuggestion):\n- POST /pricing/suggestions/generate 按门店已开启的规则从本店数据生成:\n 竞品跟价(同价位带对标)、周末高峰、平峰折扣、节假日溢价;库存告急无数据来源不生成。\n- 规则建议不带销量 / 毛利预测(source=rule,verify / margin / conf 为 null);\n 数据不够不生成并在 skipped 里说明原因;同店并发只落一条,处理后 7 天内不重提。\n- 生成与采纳用同一套餐权益;同一套餐 24 小时内调价不超过 2 次由系统拦截,\n 其余护栏文案改为「需人工把关」。\n- 迁移 20261004072931:PricingSuggestion.source 列与取值约束。\n\n开店配置界面(真实接口模式;离线演示不变):\n- 产品定价:新建 / 编辑 / 下架套餐。\n- 门店资料:房台资源新增 / 编辑 / 设为维护 / 恢复可用;总部可改门店资料。\n- 门店连锁:总部新建门店,套餐不含连锁能力时显示后端原因。\n- 动态调价:按规则生成按钮,按来源标注建议。\n- 客户端把参数校验失败的具体字段带进提示。\n\n参考数据引导:\n- 节假日日历、内容模板、合规法规抽到 prisma/reference-data.ts,种子与引导共用。\n- npm run bootstrap:reference 只补缺、不删除、可重复、并发安全;\n 容器入口在迁移后默认执行。模板不再带编造的使用量;热点是样例,不进引导。\n\n验证:后端 99 文件 925 条、接口覆盖 252/254(基线 2 未变);前端整链通过;\n浏览器完整回归 256 通过 / 2 按设计跳过,含刚注册空商户的冷启动场景。\n规则见 docs/contracts/pricing-suggestion-rules.md,\n记录见 docs/setup-and-generators-governance-2026-10-04.md。\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/yggdrasil-local-life-tools/commit/8dea76f88dbc1d25b9138740a700858621193fcf","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-10-04T01:23:02-07:00","added":["docs/contracts/pricing-suggestion-rules.md","docs/setup-and-generators-governance-2026-10-04.md","e2e/tests/17-setup-screens.spec.ts","server/prisma/bootstrap-reference.ts","server/prisma/migrations/20261004072931_pricing_suggestion_source/migration.sql","server/prisma/reference-data.ts","server/src/modules/pricing/generator.ts","server/test/r61-pricing-generator.test.ts","server/test/r62-reference-bootstrap.test.ts","团购本地生活AI运营App/scripts/test-setup-screens.mjs"],"removed":[],"modified":["CLAUDE.md","README.md","e2e/package.json","server/docker-entrypoint.sh","server/package.json","server/prisma/schema.prisma","server/prisma/seed.ts","server/src/middleware/entitlement.ts","server/src/modules/pricing/routes.ts","server/src/modules/pricing/service.ts","server/src/openapi.ts","server/test/r39-entitlement.test.ts","团购本地生活AI运营App/api.js","团购本地生活AI运营App/index.html","团购本地生活AI运营App/package.json","团购本地生活AI运营App/screen-governance.generated.json","团购本地生活AI运营App/screens-more.jsx","团购本地生活AI运营App/screens-p2.jsx","团购本地生活AI运营App/screens-strategy.jsx","团购本地生活AI运营App/scripts/test-static.mjs","开发计划.md"]},"repository":{"id":51,"owner":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"law@g-hi.com","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"},"name":"yggdrasil-local-life-tools","full_name":"luoanwu/yggdrasil-local-life-tools","description":"","empty":false,"private":false,"fork":false,"template":false,"mirror":false,"size":92762,"language":"","languages_url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/yggdrasil-local-life-tools/languages","html_url":"https://gitea.g-hi.com/luoanwu/yggdrasil-local-life-tools","url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/yggdrasil-local-life-tools","link":"","ssh_url":"git@gitea.g-hi.com:luoanwu/yggdrasil-local-life-tools.git","clone_url":"https://gitea.g-hi.com/luoanwu/yggdrasil-local-life-tools.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"branch_count":2,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"main","archived":false,"created_at":"2026-07-02T16:02:07+08:00","updated_at":"2026-10-04T15:23:49+08:00","archived_at":"1970-01-01T08:00:00+08:00","permissions":{"admin":true,"push":true,"pull":true},"has_code":true,"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"all","has_releases":true,"has_packages":true,"has_actions":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":true,"allow_rebase_update":true,"allow_manual_merge":false,"autodetect_manual_merge":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":true,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","topics":[],"licenses":[]},"pusher":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"5+luoanwu@noreply.localhost","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"},"sender":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"5+luoanwu@noreply.localhost","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"}}... |