记录一次把产线工时表切到 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 日单条数据的情况,空数据和跨月边界还没充分测。