开发日记:值班排班管理系统 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 200 → 312 行 Scheduler 类接受配置参数,不再硬编码
app.py 45 → 140 行 新增 /api/config GET/POST 接口
index.html 60 → 132 行 新增设置按钮 + 弹窗骨架
app.js 250 → 725 行 设置弹窗交互逻辑(人员管理 + 轮休配置)
style.css 450 → 823 行 弹窗样式
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(码道)来写代码,流程是:
- 克隆原项目 → 放入 CodeArts 沙箱
- 自然语言描述需求 → CodeArts 自动读取代码、设计配置结构、重写文件
- 自动验证 → 语法检查 + 算法测试 + 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-galleryskill 并发布作品到开发者作品展览馆 - [ ] 考虑把 config.json 改成前端 localStorage + 后端文件双写,避免多用户冲突
- [ ] 加一个"轮休预览"功能,配置完轮休后能看到当月轮休日历再生成排班
六、总结
v2 的核心思路是把硬编码变成配置项,让排班系统从"改代码才能调参数"变成"界面点两下就行"。算法核心没变(贪心评分 + 年度均衡),只是让评分函数能区分固定人员和临时人员,对两类人用不同的均衡策略。
CodeArts 在这次开发中表现不错——需求描述清楚的话,它能一次性生成前后端代码并通过测试。关键是要把沙箱路径问题解决,否则它看不到项目文件就白搭。
- 点赞
- 收藏
- 关注作者
评论(0)