diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java index 60cd56c..767bc2c 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java @@ -25,4 +25,6 @@ public class WorkOrderDto { private String equipName; private String equipCode; private String type; + private String orderStatus; + private String planStatus; } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml index 135208c..72cfe08 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml @@ -97,7 +97,9 @@ to_char(b.fact_end_time,'YYYY-MM-DD HH24:MI:SS') AS "factEndTime", c.ts_name AS "teamName", b.equip_name AS "equipName", - b.equip_code AS "equipCode" + b.equip_code AS "equipCode", + a.status AS "orderStatus", + b.status AS "planStatus" FROM MES_WORK_ORDER a LEFT JOIN MES_WORK_PLAN b ON a.ID = b.WO_ID @@ -106,7 +108,6 @@ and to_char(b.start_time,'YYYY-MM-DD') = #{startTime} - and to_char(b.end_time,'YYYY-MM-DD') = #{startTime} and a.wo_code = #{woCode} @@ -118,6 +119,7 @@ and b.equip_name = #{equipName} + order by a.WO_CODE,b.start_time diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java index df0fa1f..ed01e80 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java @@ -48,6 +48,8 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.concurrent.*; @@ -151,7 +153,50 @@ public class WorkOrderServiceImpl extends BaseServiceImpl list = baseMapper.selectWorkOrderList(workOrder); Map> resultList = new HashMap<>(); if("1".equals(workOrder.getType())){ - resultList = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode)); + Map> woCodeGroup = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode)); + + for (Map.Entry> entry : woCodeGroup.entrySet()) { + String woCode = entry.getKey(); + List woList = entry.getValue(); + + //按processName二次分组 + Map> processGroup = woList.stream() + .collect(Collectors.groupingBy(WorkOrderDto::getProcessName)); + + //整合每个processName的时间 + List mergedProcessList = new ArrayList<>(); + for (Map.Entry> processEntry : processGroup.entrySet()) { + String processName = processEntry.getKey(); + List processList = processEntry.getValue(); + + // 计算最早的开始时间、最晚的结束时间 + String minStartTime = getMinTime(processList.stream().map(WorkOrderDto::getPlanStartTime).toList()); + String maxEndTime = getMaxTime(processList.stream().map(WorkOrderDto::getPlanEndTime).toList()); + + // 封装整合后的DTO(复用第一个对象或新建) + WorkOrderDto mergedDto = new WorkOrderDto(); + mergedDto.setWoCode(woCode); + mergedDto.setProcessName(processName); + for(WorkOrderDto dto : processList){ + if(dto.getPlanStartTime().equals(minStartTime)){ + mergedDto.setStartTime(dto.getStartTime()); + } + if(dto.getPlanEndTime().equals(maxEndTime)){ + mergedDto.setEndTime(dto.getEndTime()); + mergedDto.setPlanStatus(dto.getPlanStatus()); + } + } + if(!maxEndTime.substring(0,10).equals(minStartTime.substring(0,10))){ + mergedDto.setEndTime("24:00"); + } + mergedDto.setPlanStartTime(minStartTime); + mergedDto.setPlanEndTime(maxEndTime); + mergedProcessList.add(mergedDto); + } + + resultList.put(woCode, mergedProcessList); + } + }else if("2".equals(workOrder.getType())){ Map>> teamWoGroupMap = list.stream() .collect(Collectors.groupingBy( @@ -195,14 +240,14 @@ public class WorkOrderServiceImpl extends BaseServiceImpl timeStrList) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + if (timeStrList == null || timeStrList.isEmpty()) { + return null; + } + return timeStrList.stream() + .filter(Objects::nonNull) + .map(t -> { + try { + return LocalDateTime.parse(t, dateTimeFormatter); + } catch (DateTimeParseException e) { + // 处理时间格式错误(根据业务需求:抛异常/返回null/返回默认值) + System.err.println("时间格式错误:" + t + ",异常:" + e.getMessage()); + return null; + } + }) + .filter(Objects::nonNull) + .min(LocalDateTime::compareTo) + .map(dt -> dt.format(dateTimeFormatter)) + .orElse(null); + } + + /** + * 获取时间列表中的最晚时间(字符串转LocalDateTime比较) + */ + private static String getMaxTime(List timeStrList) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + if (timeStrList == null || timeStrList.isEmpty()) { + return null; + } + return timeStrList.stream() + .filter(Objects::nonNull) + .map(t -> { + try { + return LocalDateTime.parse(t, dateTimeFormatter); + } catch (DateTimeParseException e) { + System.err.println("时间格式错误:" + t + ",异常:" + e.getMessage()); + return null; + } + }) + .filter(Objects::nonNull) + .max(LocalDateTime::compareTo) + .map(dt -> dt.format(dateTimeFormatter)) + .orElse(null); + } }