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分钟的间隔,基于有效间隔算平均。

7719

被折叠的 条评论
为什么被折叠?



