排产相关-sjx

master
sunjianxi 4 days ago
parent 38e3eec46c
commit 88d3e587bf
  1. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java
  2. 6
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  3. 104
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java

@ -25,4 +25,6 @@ public class WorkOrderDto {
private String equipName;
private String equipCode;
private String type;
private String orderStatus;
private String planStatus;
}

@ -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 @@
<where>
<if test="startTime !=null and startTime != ''">
and to_char(b.start_time,'YYYY-MM-DD') = #{startTime}
and to_char(b.end_time,'YYYY-MM-DD') = #{startTime}
</if>
<if test="woCode !=null and woCode != ''">
and a.wo_code = #{woCode}
@ -118,6 +119,7 @@
and b.equip_name = #{equipName}
</if>
</where>
order by a.WO_CODE,b.start_time
</select>
</mapper>

@ -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);
}
}

Loading…
Cancel
Save