记录一次把产线工时表切到 10 秒快照并重算利用率(2026-05-21)
记录一次把产线工时表切到 10 秒快照并重算利用率(2026-05-21)
数据频率一换,累计算法不换,报表就是 100% 假象。
今天这一天基本都耗在 factory_api_server.py 和前端报表上。数据库从旧表 work_load 切到新表 work_load_0521,本来以为只是换个连接串,结果时间字段从时段变成每 10 秒一条快照,利用率算法也跟着塌了,改到第三轮才把口径理顺。
一、新表 work_load_0521:TIME 是单点快照,不是 START/END
拿到的新库配置很直接:100.64.0.2:3306,表名 work_load_0521,每 10 秒记录一次人员及工时。字段里 TIME 代表记录时间,worker_num 是人数,workload 是总工时,area 和 main_area 保持原意。
跟旧表 work_load 放一起,差异一眼就能看出来:
| 维度 | 旧表 work_load | 新表 work_load_0521 |
|---|---|---|
| 时间 | START_TIME / END_TIME | TIME(快照单点) |
| 工时 | WORKTIME(秒) | 无此字段,WORKLOAD 为累计值 |
| 频率 | 不定时 | 10 秒一次 |
| 记录数 | 1041 条/天 | 11280 条/天 |
旧表是时段模型:一条记录有开始、有结束,判断在岗直接拿 END_TIME 和 NOW() 比就行。新表是快照模型:每个 10 秒一个点,要判断“还在不在岗”,只能看最新记录超过 60 秒没更新就归 0。这不是换个字段名的事,是整个查询逻辑都得重写。
二、第一版 API:工时累计改成 active_snapshots × 10s
后端 factory_api_server.py 重写后的核心变化:
- 数据源时间:原来用
START_TIME / END_TIME,现在只认TIME。 - 在岗判断:不用
END_TIME vs NOW(),改成最新记录 >60s 未更新→归 0。 - 工时累计:原来
SUM(WORKTIME)是时段秒数;新模型用active_snapshots × 10s,也就是每个“有人”的 10 秒快照累起来,就是有人时长。 - 有效工时:两个模型都是人·秒,但新表每个快照本身就等于人数×10,所以
SUM(WORKLOAD)就是有效工时。
前端利用率公式也跟着改。旧的 workload / worktime × 100 在新模型下会算出 141%——因为 worktime 已经不是时段秒数了。改成 workload / (worktime × 5工位) × 100,当天算出来 28.3%。
当天实际数据快照:15:49 到 22:16 之间有人,今日工时 6 时 54 分,有效工时 35,260 人·秒,22 点后没人,在岗总数 0。终于不是 141% 了,28.3% 才像产线真实满载度。
三、利用率全 100%:累计工时被赋成了有效工时同值
刚调到 28.3% 没多久,就发现分析页里利用率清一色 100%。查下去,根因特别简单:利用率 = 有效工时 / 累计工时,但累计工时那个字段被赋成和有效工时同一个值,分母分子永远一样,所以永远 100%。
按用户给的新口径,累计工时不再用实时在岗数据,改成固定出勤时间:上层布线 2 人一天 16 小时,其他工位都是 1 人一天 8 小时。利用率 = 实际有效工时 / 固定出勤工时 × 100%。
改造后第一次按 16h 算出来的表长这样:
| 工位 | 编制 | 固定出勤(人·秒) | 实际有效(人·秒) | 利用率 |
|---|---|---|---|---|
| 上层布线 | 2人×16h | 115,200 | 13,630 | 11.8% |
| 上层组装 | 1人×8h | 28,800 | 8,950 | 31.1% |
| 底层组装布线 | 1人×8h | 28,800 | 8,080 | 28.1% |
| 工具区 | 1人×8h | 28,800 | 1,410 | 4.9% |
| 中层组装 | 1人×8h | 28,800 | 3,190 | 11.1% |
| 全线合计 | 64h | 230,400 | 35,260 | 15.3% |
后端就新增了 FIXED_WORKTIME 字典,daily_summary 加 fixed_worktime 字段,summary 加 total_fixed_worktime,前端几个 KPI 也一起改掉。
四、SCBX 出勤改回 2 人×8h,全部“累计工时”改名“出勤时间”
第一版固定出勤里,SCBX 上层布线按 2 人×16h 算,用户马上纠正:上层布线就是 2 人×8h,不是 16h。修正后全线总固定出勤从 230,400 人·秒(64h)降到 172,800 人·秒(48h)。
同时把全量文案里的“累计工时”都改成“出勤时间”。KPI、图表、分析页、表头全部统一。这步不复杂,但得挨个搜文案,不然有些地方还留着旧名字,后面看数据就会对不上口径。
五、右上角日期选择器:有数据的日期打绿点
这次改动还有一个重要需求:右上角要能选日期,选到哪天就看哪天的数据。要求是:
- 点右上角 📅 展开日历面板。
- 有数据的日期底部显示绿色圆点。
- 选中日期蓝色高亮,切到那天数据。
- 选无数据日期 → 空状态页「所选日期无数据」。
- 提供「回到今天」按钮。
- 面板外点击自动关闭。
实现完之后,当前只有 5 月 21 日有数据,因为新表 work_load_0521 今天才开始采集。以后每天数据累积进去,圆点会自动出现,不用手写数据源列表。
遗留
- 修正 SCBX 为 2 人×8h 后,各工位利用率和全线利用率我还没重新跑一遍对表,只确认了总固定出勤变成 48h。
- 新表当天“记录总数”在改完那会儿没来得及记录,后续补数据时需要重点看 11280 条/天这个量级有没有达到预期。
- 日期选择器目前只验证了 5 月 21 日单条数据的情况,空数据和跨月边界还没充分测。