|
|
|
|
@ -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<WorkOrderMapper, WorkO |
|
|
|
|
List<WorkOrderDto> list = baseMapper.selectWorkOrderList(workOrder); |
|
|
|
|
Map<String,List<WorkOrderDto>> resultList = new HashMap<>(); |
|
|
|
|
if("1".equals(workOrder.getType())){ |
|
|
|
|
resultList = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode)); |
|
|
|
|
Map<String, List<WorkOrderDto>> woCodeGroup = list.stream().collect(Collectors.groupingBy(WorkOrderDto::getWoCode)); |
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<WorkOrderDto>> entry : woCodeGroup.entrySet()) { |
|
|
|
|
String woCode = entry.getKey(); |
|
|
|
|
List<WorkOrderDto> woList = entry.getValue(); |
|
|
|
|
|
|
|
|
|
//按processName二次分组
|
|
|
|
|
Map<String, List<WorkOrderDto>> processGroup = woList.stream() |
|
|
|
|
.collect(Collectors.groupingBy(WorkOrderDto::getProcessName)); |
|
|
|
|
|
|
|
|
|
//整合每个processName的时间
|
|
|
|
|
List<WorkOrderDto> mergedProcessList = new ArrayList<>(); |
|
|
|
|
for (Map.Entry<String, List<WorkOrderDto>> processEntry : processGroup.entrySet()) { |
|
|
|
|
String processName = processEntry.getKey(); |
|
|
|
|
List<WorkOrderDto> 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<String, Map<String, List<WorkOrderDto>>> teamWoGroupMap = list.stream() |
|
|
|
|
.collect(Collectors.groupingBy( |
|
|
|
|
@ -195,14 +240,14 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
.max(String::compareTo) |
|
|
|
|
.orElse(null); |
|
|
|
|
|
|
|
|
|
// 计算最小开始时间
|
|
|
|
|
// 计算实际最小开始时间
|
|
|
|
|
String minFactStartTime = woList.stream() |
|
|
|
|
.map(WorkOrderDto::getFactStartTime) |
|
|
|
|
.filter(Objects::nonNull) // 过滤空时间,避免NPE
|
|
|
|
|
.min(String::compareTo) |
|
|
|
|
.orElse(null); |
|
|
|
|
|
|
|
|
|
// 计算最大结束时间
|
|
|
|
|
// 计算实际最大结束时间
|
|
|
|
|
String maxFactEndTime = woList.stream() |
|
|
|
|
.map(WorkOrderDto::getFactEndTime) |
|
|
|
|
.filter(Objects::nonNull) // 过滤空时间,避免NPE
|
|
|
|
|
@ -217,6 +262,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
workOrderDto.setFactStartTime(minFactStartTime); |
|
|
|
|
workOrderDto.setFactEndTime(maxFactEndTime); |
|
|
|
|
workOrderDto.setTeamName(teamName); |
|
|
|
|
workOrderDto.setOrderStatus(woList.get(0).getOrderStatus()); |
|
|
|
|
list1.add(workOrderDto); |
|
|
|
|
} |
|
|
|
|
resultList.put(teamName,list1); |
|
|
|
|
@ -265,7 +311,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
.max(String::compareTo) |
|
|
|
|
.orElse(null); |
|
|
|
|
|
|
|
|
|
// 计算最小开始时间
|
|
|
|
|
// 计算实际最小开始时间
|
|
|
|
|
String minFactStartTime = woList.stream() |
|
|
|
|
.map(WorkOrderDto::getFactStartTime) |
|
|
|
|
.filter(Objects::nonNull) // 过滤空时间,避免NPE
|
|
|
|
|
@ -287,6 +333,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
workOrderDto.setStartTime(minStartTime); |
|
|
|
|
workOrderDto.setEndTime(maxEndTime); |
|
|
|
|
workOrderDto.setEquipName(equipName); |
|
|
|
|
workOrderDto.setOrderStatus(woList.get(0).getOrderStatus()); |
|
|
|
|
list1.add(workOrderDto); |
|
|
|
|
} |
|
|
|
|
resultList.put(equipName,list1); |
|
|
|
|
@ -726,4 +773,53 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
} |
|
|
|
|
return capacityList; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取时间列表中的最早时间(字符串转LocalDateTime比较) |
|
|
|
|
*/ |
|
|
|
|
private static String getMinTime(List<String> 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<String> 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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|