| event_payload |
{"ref":"refs/heads/main","befo {"ref":"refs/heads/main","before":"5cff46dfd5d7f08cd2767aa030e973b3cb2cebd5","after":"80ef8d68e96afb51f1b6b62cc34883f0d7712b06","compare_url":"https://gitea.g-hi.com/luoanwu/yggdrasil-local-life-tools/compare/5cff46dfd5d7f08cd2767aa030e973b3cb2cebd5...80ef8d68e96afb51f1b6b62cc34883f0d7712b06","commits":[{"id":"80ef8d68e96afb51f1b6b62cc34883f0d7712b06","message":"fix(setup): 选填字段可以清空;套餐主数据只由总部维护\n\n选填字段清空:\n- 之前套餐的单场时长、房台的容纳人数和最低消费填过就清不掉(界面直接报\n 「接口不支持清空」),文字类选填项清空后在库里留空字符串。\n- PATCH /skus/:id 的 durationText / sessionMinutes / rule / goal / margin,\n PATCH /resources/:id 的 floor / zone / capacity / minChargeYuan 接受 null 表示清空。\n- 文字类选填项传空字符串或全空白,新建和修改都存成 null。\n- 房台数字类选填项传空字符串:新建按没填、修改按清空。之前空字符串会被数字转换\n 当成 0,最低消费悄悄变成 0 元。\n- 必填项不接受 null,照旧 400。\n- 界面:编辑表单把清空的选填项按 null 提交;清空单场时长前提示后果\n (顾客端不能在线预约、新建预约不再按时长排期)。\n\n套餐只由总部维护(权限收回):\n- 之前店长可以新建 / 修改 / 下架 / 重新上架套餐。套餐是全商户共用的主数据,\n 连锁商户里一个门店的店长改了,其他门店一起变。\n- POST / PATCH / DELETE /skus 与 GET /skus?includeInactive=true 只给老板和总部运营;\n 店长、店员 403,仍可读在售套餐。与产品设计里店长「仅本店」的范围、\n 以及门店资料修改和新建门店已是总部专属的做法一致。\n- 店长在产品定价页只读,页面说明由谁维护;采纳调价建议改本店价不受影响。\n- 单店商户的店长同样不能再改套餐,没有开例外;没有做「手动设本店价」的入口。\n\n接口文档:请求体写法支持「类型|null」,生成 nullable。\n\n验证:后端 99 文件 931 条、接口覆盖 252/254(基线 2 未变);前端整链、lint、构建通过;\n浏览器完整回归 262 通过 / 2 按设计跳过 / 0 失败(两套先后单独运行)。\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/80ef8d68e96afb51f1b6b62cc34883f0d7712b06","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-04T18:13:15-07:00","added":[],"removed":[],"modified":["CLAUDE.md","README.md","docs/setup-and-generators-governance-2026-10-04.md","e2e/tests/17-setup-screens.spec.ts","server/src/modules/resources/schema.ts","server/src/modules/resources/service.ts","server/src/modules/skus/routes.ts","server/src/modules/skus/schema.ts","server/src/modules/skus/service.ts","server/src/openapi.ts","server/test/r2-ops.test.ts","server/test/r32-resources.test.ts","团购本地生活AI运营App/api.js","团购本地生活AI运营App/index.html","团购本地生活AI运营App/screens-more.jsx","团购本地生活AI运营App/screens-strategy.jsx","团购本地生活AI运营App/scripts/test-setup-screens.mjs","开发计划.md"]}],"total_commits":0,"head_commit":{"id":"80ef8d68e96afb51f1b6b62cc34883f0d7712b06","message":"fix(setup): 选填字段可以清空;套餐主数据只由总部维护\n\n选填字段清空:\n- 之前套餐的单场时长、房台的容纳人数和最低消费填过就清不掉(界面直接报\n 「接口不支持清空」),文字类选填项清空后在库里留空字符串。\n- PATCH /skus/:id 的 durationText / sessionMinutes / rule / goal / margin,\n PATCH /resources/:id 的 floor / zone / capacity / minChargeYuan 接受 null 表示清空。\n- 文字类选填项传空字符串或全空白,新建和修改都存成 null。\n- 房台数字类选填项传空字符串:新建按没填、修改按清空。之前空字符串会被数字转换\n 当成 0,最低消费悄悄变成 0 元。\n- 必填项不接受 null,照旧 400。\n- 界面:编辑表单把清空的选填项按 null 提交;清空单场时长前提示后果\n (顾客端不能在线预约、新建预约不再按时长排期)。\n\n套餐只由总部维护(权限收回):\n- 之前店长可以新建 / 修改 / 下架 / 重新上架套餐。套餐是全商户共用的主数据,\n 连锁商户里一个门店的店长改了,其他门店一起变。\n- POST / PATCH / DELETE /skus 与 GET /skus?includeInactive=true 只给老板和总部运营;\n 店长、店员 403,仍可读在售套餐。与产品设计里店长「仅本店」的范围、\n 以及门店资料修改和新建门店已是总部专属的做法一致。\n- 店长在产品定价页只读,页面说明由谁维护;采纳调价建议改本店价不受影响。\n- 单店商户的店长同样不能再改套餐,没有开例外;没有做「手动设本店价」的入口。\n\n接口文档:请求体写法支持「类型|null」,生成 nullable。\n\n验证:后端 99 文件 931 条、接口覆盖 252/254(基线 2 未变);前端整链、lint、构建通过;\n浏览器完整回归 262 通过 / 2 按设计跳过 / 0 失败(两套先后单独运行)。\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/80ef8d68e96afb51f1b6b62cc34883f0d7712b06","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-04T18:13:15-07:00","added":[],"removed":[],"modified":["CLAUDE.md","README.md","docs/setup-and-generators-governance-2026-10-04.md","e2e/tests/17-setup-screens.spec.ts","server/src/modules/resources/schema.ts","server/src/modules/resources/service.ts","server/src/modules/skus/routes.ts","server/src/modules/skus/schema.ts","server/src/modules/skus/service.ts","server/src/openapi.ts","server/test/r2-ops.test.ts","server/test/r32-resources.test.ts","团购本地生活AI运营App/api.js","团购本地生活AI运营App/index.html","团购本地生活AI运营App/screens-more.jsx","团购本地生活AI运营App/screens-strategy.jsx","团购本地生活AI运营App/scripts/test-setup-screens.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":93244,"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-05T08:32:27+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"}}... |