报工数据重复提交的原因与处理
同一条工单出现两条相同报工记录,产量被重复统计。本文列出三种重复来源、查证方法,以及从机制上防止重复的配置要点。
现象
同一工单、同一工序、同一时间点出现两条完全相同的报工记录,导致完工数量虚高、工时重复计入。
三种重复来源
来源一:用户重复点击
工人点了提交,页面没立刻响应,以为没点上,又点了一次。
特征:两条记录时间间隔通常在 3 秒以内。
来源二:网络重试
请求发出去了,但响应没回来(网络抖动),前端自动重试,服务端处理了两次。
特征:时间间隔极短(毫秒级),且两条记录内容完全一致。
来源三:数据同步重复
如果报工数据通过接口同步到其他系统(比如 ERP),同步失败后重试,可能重复写入。
特征:重复记录出现在下游系统,而非 MES 本身。
排查步骤
第一步:确认重复的范围
先查清楚是个例还是普遍:
- 只有一条工单重复 → 大概率是用户操作问题
- 多条工单、多个用户都重复 → 大概率是系统机制问题
- 只有某个时间段重复 → 查那个时间的网络和服务状态
查询方法:按"工单号 + 工序 + 数量 + 操作人"分组,找 count 大于 1 的记录。
第二步:看时间间隔
| 时间间隔 | 判断 |
|---|---|
| 小于 1 秒 | 系统重试导致 |
| 1-5 秒 | 用户重复点击 |
| 大于 5 秒 | 用户误操作(以为没提交成功,重新填了一次) |
第三步:看操作日志
查系统操作日志,看这两条记录对应几次请求。
如果日志里只有一次请求但产生了两条数据,问题在服务端(重复消费或事务问题)。
如果日志里有两次请求,问题在客户端或网络层。
解决方法
针对用户重复点击
- 前端加防重复提交:提交后按钮置灰,直到收到响应或超时
- 加提交中的提示:让用户知道"正在提交"
- 响应要快:报工接口响应时间控制在 1 秒内,等待时间短,用户就不会重复点
针对网络重试
在请求里带一个幂等键(比如时间戳 + 用户 + 工单的组合,或者前端生成的 UUID)。
服务端收到请求时先查这个键是否处理过:
- 处理过 → 直接返回上次的结果,不重复写入
- 没处理过 → 正常处理并记录这个键
这是最根本的解决方式,能覆盖所有网络层导致的重复。
针对同步重复
同步接口同样需要幂等设计。下游系统按业务主键(工单+工序+时间)做唯一约束,重复写入时更新而非新增。
已经产生的重复数据怎么处理
- 先备份,导出重复记录的原始数据
- 保留最早的一条(通常是真实的),删除后续的
- 重算受影响的工单完工数量、工时统计
- 检查是否已同步到下游系统,如有,同步修正
- 记录事件,说明处理方式和影响范围
不要直接删数据库记录,要走系统的撤销/作废功能,让操作留痕。
预防措施
| 措施 | 说明 |
|---|---|
| 前端防重 | 提交置灰 + 加载状态 |
| 幂等键 | 服务端按唯一键判重 |
| 唯一约束 | 数据库层面加唯一索引兜底 |
| 操作留痕 | 所有报工可追溯、可撤销 |
| 监控告警 | 定时检查重复记录,异常时告警 |
其中数据库唯一索引是最后一道防线。即使前面都失效,唯一索引也能挡住重复写入。
但要注意:唯一索引的字段选择要考虑业务合理性。有些场景确实允许同一工单同一工序多次报工(分批完工),这时候不能用简单的唯一约束,要用幂等键。
一个容易误判的情况
有时候看起来"重复"的记录其实不是重复:
- 同一工单分两次报工(第一次 50 件、第二次 50 件),如果两次数量刚好相同、时间接近,看起来像重复
- 换班交接时两个班组各报了一次(各报各的产出)
排查时要先确认业务上是否合理,不要一看到"看起来一样"就判定为重复。
判断方法:看报工记录里的班次、操作人、设备字段。如果这些不同,很可能是两次真实的报工。
具体的幂等配置与唯一约束设置,[待补充:百华智造 MES 报工接口幂等配置说明]。
这篇内容对你有帮助吗?
当前为游客态,投票按设备去重