开发日记:值班排班管理系统 v2 升级

举报
哦啦啦啦啦 发表于 2026/08/22 19:21:10 2026/08/22
【摘要】 一、今天做了什么对现有的值班排班管理系统做了一次 v2 升级,核心改动是从硬编码走向可配置。同时踩了 GitCode 认证和私有仓库权限的坑,记录一下。1.1 起因原版系统功能可用但不够灵活:人员姓名写死在代码里(张三李四王五……)每月轮休固定 8 天 × 3 组,用的 K6 完全图 1-factorization 自动排想改人名?想调轮休天数?得改源码重新部署v2 要解决的就是:让用户自己...

一、今天做了什么

对现有的值班排班管理系统做了一次 v2 升级,核心改动是从硬编码走向可配置。同时踩了 GitCode 认证和私有仓库权限的坑,记录一下。

1.1 起因

原版系统功能可用但不够灵活:

  • 人员姓名写死在代码里(张三李四王五……)
  • 每月轮休固定 8 天 × 3 组,用的 K6 完全图 1-factorization 自动排
  • 想改人名?想调轮休天数?得改源码重新部署

v2 要解决的就是:让用户自己在界面上配,不用碰代码。

1.2 四个需求

# 需求 实现方式
1 人员姓名可编辑 设置弹窗 + config.json 持久化,固定人员/额外人员分开管理
2 每月轮休可自定义 按月配置轮休组(选人 + 起始日 + 天数),不配则全员可排班
3 固定人员全年一致 年度均衡评分权重 100(最高),轮休差距=0,值班差距=1
4 临时人员本月均衡 额外人员年度评分=0,只参与月度均衡(权重 30)

1.3 改动清单

scheduler.py    200312 行   Scheduler 类接受配置参数,不再硬编码
app.py           45140 行   新增 /api/config GET/POST 接口
index.html       60132 行   新增设置按钮 + 弹窗骨架
app.js          250725 行   设置弹窗交互逻辑(人员管理 + 轮休配置)
style.css       450823 行   弹窗样式
config.json      — → 新增      配置持久化文件

二、算法设计

2.1 评分公式(没变,但作用对象变了)

总分 = 年度均衡 × 100 + 月度均衡 × 30 + 稀疏分布 × 10 + 补偿加分

关键改动在年度均衡的计算对象

  • 固定人员:和固定 6 人的平均值比 → 保证全年值班天数接近
  • 额外人员:年度均衡评分 = 0 → 只靠月度均衡 + 稀疏分布来排

这样临时来帮忙的人不会被年度均衡"拉偏",只在当月内分均匀就行。

2.2 自定义轮休

原来用 1-factorization 自动生成 3 个 pair,现在改成用户按月配置

{
  "rest_config": {
    "1": [
      {"people": ["张三", "李四"], "start_day": 1, "days": 8},
      {"people": ["王五", "赵六"], "start_day": 9, "days": 8},
      {"people": ["钱七", "孙八"], "start_day": 17, "days": 8}
    ],
    "2": []
  }
}

某月配空数组 → 该月无人轮休,全员可排班。

2.3 验证结果

用 Flask test_client 跑了全套 API 测试:

[1] GET /api/config: OK, 固定6人 额外2人 轮休配置12[2] GET /api/schedule: OK, 12个月, 值班均衡差距=1, 轮休均衡差距=0
[3] GET /api/schedule?month=3: OK, 3月有31天排班
[4] POST /api/config: OK, 保存了3固定+1额外配置
[5] 新配置排班: OK, 固定人员=['甲', '乙', '丙'], 丁仅7-8月参与
[6] POST /api/regenerate: OK
[7] 无效配置返回400: OK
[8] 2月无轮休配置: OK, 全员可排班
=== 所有 API 测试通过 ===

固定人员全年值班:{张三:56, 李四:56, 王五:56, 赵六:56, 钱七:55, 孙八:56},差距=1,达标(目标 ≤ 2)。


三、开发流程

这次用了华为云 CodeArts(码道)来写代码,流程是:

  1. 克隆原项目 → 放入 CodeArts 沙箱
  2. 自然语言描述需求 → CodeArts 自动读取代码、设计配置结构、重写文件
  3. 自动验证 → 语法检查 + 算法测试 + API 测试 + 真实启动

CodeArts 生成的代码质量不错,scheduler.py 的配置化改造和 app.js 的弹窗交互逻辑都是一次生成、测试通过,没需要人工修。

整个过程大约 8 分钟,大部分时间在等 CodeArts 生成 app.js(725 行的前端交互逻辑确实复杂)。


四、踩坑记录

git clone 凭证

现象: npx skills add 克隆仓库失败,报 Authentication failed。

原因: gitcode-oauth 工具保存的是 OAuth API token,但 git clone 走 HTTPS 需要的是 git 凭证。两套东西不通用。

解决: 拿到 OAuth token 后,手动写入 ~/.git-credentials

echo "https://${USERNAME}:${TOKEN}@gitcode.com" > ~/.git-credentials
git config --global credential.helper store

4.2 CodeArts 沙箱路径映射

现象: CodeArts 看到空目录,找不到项目文件。

原因: bwrap 沙箱把 /root/job-envs/sandboxes/codearts-xxx 挂载为 /workspace。acpx 的 --cwd 传的是宿主机路径,但 CodeArts 在沙箱内看不到这个路径。

解决: 在 prompt 里告诉 CodeArts 文件在 /workspace/scheduling-app/ 下。

4.3 私有仓库 403

现象: 安装 publish-work-to-gallery skill 时,Lingxi-HandsOn/gallery 仓库返回 403。

原因: 仓库是私有的,当前 GitCode 账号不是组织成员。

状态: 待解决,需要获取组织权限或换账号。


五、下一步

  • [ ] 解决 Lingxi-HandsOn/gallery 仓库权限问题
  • [ ] 安装 publish-work-to-gallery skill 并发布作品到开发者作品展览馆
  • [ ] 考虑把 config.json 改成前端 localStorage + 后端文件双写,避免多用户冲突
  • [ ] 加一个"轮休预览"功能,配置完轮休后能看到当月轮休日历再生成排班

六、总结

v2 的核心思路是把硬编码变成配置项,让排班系统从"改代码才能调参数"变成"界面点两下就行"。算法核心没变(贪心评分 + 年度均衡),只是让评分函数能区分固定人员和临时人员,对两类人用不同的均衡策略。

CodeArts 在这次开发中表现不错——需求描述清楚的话,它能一次性生成前后端代码并通过测试。关键是要把沙箱路径问题解决,否则它看不到项目文件就白搭。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。