MES系统生产节拍计算

1.原先:

QueryWrapper<MdProcessFeedback> fbquery2 = new QueryWrapper<>();
        fbquery2.eq("workline_id",worklineId);

        if(worklineId==203||worklineId==204){
            String inlineProcessId = this.sysConfigService.selectConfigByKey("md.default.inline.process.id");
            if(StringUtils.isNotEmpty(inlineProcessId)){

                try {
                    fbquery2.eq("process_id",Long.valueOf(inlineProcessId));
                }catch (Exception e){
                    throw new ServiceException("请检查上线工序配置:md.default.inline.process.id");
                }

            }else {
                throw new ServiceException("请检查上线工序配置");
            }

        }else {
            String inlineProcessId = this.sysConfigService.selectConfigByKey("md.ckd.inline.process.id");


            if(StringUtils.isNotEmpty(inlineProcessId)){

                try {
                    fbquery2.eq("process_id",Long.valueOf(inlineProcessId));
                }catch (Exception e){
                    throw new ServiceException("请检查上线工序配置:md.ckd.inline.process.id");
                }

            }else {
                throw new ServiceException("请检查上线工序配置:md.ckd.inline.process.id");
            }
        }
        fbquery2.ge("feedback_time_first",startDate+" 00:00:00");
        fbquery2.le("feedback_time_first",endDate+" 23:59:59");
        fbquery2.orderByAsc("feedback_time_first");

        List<MdProcessFeedback> feedbackList = iMdProcessFeedbackService.list(fbquery2);
        long todayOnline = feedbackList.size();
        if(todayOnline>0l){
            dto.setTodayOnline( Math.toIntExact(todayOnline));
        }
        // 计算生产节拍
        double taktTime = 0;
        if (todayOnline > 1 && startDate.equals(endDate)) {
            // 获取最早和最晚报工时间
            Date firstDate = feedbackList.get(0).getFeedbackTimeFirst();
            Date lastDate = feedbackList.get(feedbackList.size() - 1).getFeedbackTimeFirst();

            long durationMillis = lastDate.getTime() - firstDate.getTime();
            double durationMinutes = durationMillis / 60000.0;
            // 生产节拍 = 总时间 / (数量-1)
            taktTime = (double) durationMinutes / (todayOnline - 1);
        } else {
            // 产量不足无法计算节拍
            taktTime = 0; // 或标记为 -1 表示无效
        }
        dto.setTaktNum(taktTime);

问题:没有剔除中间休息的时间

2.新增逻辑后AI给的代码:

QueryWrapper<MdProcessFeedback> fbquery2 = new QueryWrapper<>();
fbquery2.eq("workline_id", worklineId);

// 设置工序ID
String inlineProcessId;
if (worklineId == 203 || worklineId == 204) {
    inlineProcessId = this.sysConfigService.selectConfigByKey("md.default.inline.process.id");
    if (StringUtils.isEmpty(inlineProcessId)) {
        throw new ServiceException("请检查上线工序配置:md.default.inline.process.id");
    }
} else {
    inlineProcessId = this.sysConfigService.selectConfigByKey("md.ckd.inline.process.id");
    if (StringUtils.isEmpty(inlineProcessId)) {
        throw new ServiceException("请检查上线工序配置:md.ckd.inline.process.id");
    }
}

try {
    fbquery2.eq("process_id", Long.valueOf(inlineProcessId));
} catch (Exception e) {
    throw new ServiceException("请检查上线工序配置格式");
}

fbquery2.ge("feedback_time_first", startDate + " 00:00:00");
fbquery2.le("feedback_time_first", endDate + " 23:59:59");
fbquery2.eq("ok_flag", "Y");
fbquery2.orderByAsc("feedback_time_first");

List<MdProcessFeedback> feedbackList = iMdProcessFeedbackService.list(fbquery2);

// 原始上线数量
long todayOnline = feedbackList.size();
dto.setTodayOnline(Math.toIntExact(todayOnline));

double taktTime = 0;
if (todayOnline > 1 && startDate.equals(endDate)) {
    List<Long> validIntervals = new ArrayList<>();
    for (int i = 1; i < feedbackList.size(); i++) {
        Date prev = feedbackList.get(i - 1).getFeedbackTimeFirst();
        Date curr = feedbackList.get(i).getFeedbackTimeFirst();

        long diffMillis = curr.getTime() - prev.getTime();
        long diffSeconds = diffMillis / 1000;

        if (diffSeconds <= 600) { // 10分钟以内
            validIntervals.add(diffSeconds);
        }
    }

    if (!validIntervals.isEmpty()) {
        double sum = validIntervals.stream().mapToDouble(Long::doubleValue).sum();
        taktTime = sum / validIntervals.size(); // 平均节拍秒数
        taktTime = taktTime / 60.0; // 转换为分钟
    } else {
        taktTime = 0; // 或设为 -1 表示无有效节拍
    }
}

dto.setTaktNum(taktTime);

🔎 输出样例

假设当天有以下时间节点:

  • 08:00:00

  • 08:02:00

  • 08:14:00(>10分钟)

  • 08:15:00

最终会保留 (08:00→08:02)(08:14→08:15),剔除掉中间超10分钟的间隔,基于有效间隔算平均。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值