设备缺失报错提示

parent 6ad77e5d
...@@ -27,6 +27,7 @@ import java.util.stream.Collectors; ...@@ -27,6 +27,7 @@ import java.util.stream.Collectors;
@Service @Service
public class RoutingDataService { public class RoutingDataService {
private static final int ORACLE_IN_BATCH_SIZE = 1000;
@Autowired @Autowired
private ProdProcessExecService _prodProcessExecService; private ProdProcessExecService _prodProcessExecService;
...@@ -78,10 +79,7 @@ public class RoutingDataService { ...@@ -78,10 +79,7 @@ public class RoutingDataService {
// 查询RoutingDiscreteParam中routingDetailId在上述列表中的所有记录 // 查询RoutingDiscreteParam中routingDetailId在上述列表中的所有记录
List<RoutingDiscreteParam> routingDiscreteParams = new ArrayList<>(); List<RoutingDiscreteParam> routingDiscreteParams = new ArrayList<>();
if (!routingDetailIds.isEmpty()) { if (!routingDetailIds.isEmpty()) {
routingDiscreteParams = _routingDiscreteParamService.lambdaQuery() routingDiscreteParams = getRoutingDiscreteParamsByRoutingDetailIds(routingDetailIds);
.in(RoutingDiscreteParam::getRoutingDetailId, routingDetailIds)
.eq(RoutingDiscreteParam::getIsDeleted, 0)
.list();
} }
...@@ -93,6 +91,25 @@ public class RoutingDataService { ...@@ -93,6 +91,25 @@ public class RoutingDataService {
} }
private List<RoutingDiscreteParam> getRoutingDiscreteParamsByRoutingDetailIds(List<Long> routingDetailIds) {
if (routingDetailIds == null || routingDetailIds.isEmpty()) {
return new ArrayList<>();
}
List<RoutingDiscreteParam> routingDiscreteParams = new ArrayList<>();
for (int i = 0; i < routingDetailIds.size(); i += ORACLE_IN_BATCH_SIZE) {
int endIndex = Math.min(i + ORACLE_IN_BATCH_SIZE, routingDetailIds.size());
List<Long> batchIds = routingDetailIds.subList(i, endIndex);
List<RoutingDiscreteParam> batchParams = _routingDiscreteParamService.lambdaQuery()
.in(RoutingDiscreteParam::getRoutingDetailId, batchIds)
.eq(RoutingDiscreteParam::getIsDeleted, 0)
.list();
routingDiscreteParams.addAll(batchParams);
}
return routingDiscreteParams;
}
public Map<Integer, Object> CreateEntry(String SceneId, List<ProdEquipment> ProdEquipments, List<Order> ProdLaunchOrders, List<RoutingDiscreteParam> routingDiscreteParams, List<ProdOrderProcess> ProdOrderProcesss, List<ProdProcessExec> ProdProcessExecs, List<GroupResult> existingResults,int FinishOpertionID) public Map<Integer, Object> CreateEntry(String SceneId, List<ProdEquipment> ProdEquipments, List<Order> ProdLaunchOrders, List<RoutingDiscreteParam> routingDiscreteParams, List<ProdOrderProcess> ProdOrderProcesss, List<ProdProcessExec> ProdProcessExecs, List<GroupResult> existingResults,int FinishOpertionID)
{ {
Map<Integer, Object> list=new HashMap<>(); Map<Integer, Object> list=new HashMap<>();
......
...@@ -31,7 +31,6 @@ import org.springframework.util.CollectionUtils; ...@@ -31,7 +31,6 @@ import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.ZoneOffset;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -51,6 +50,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -51,6 +50,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@Slf4j @Slf4j
public class ChromosomeDataService { public class ChromosomeDataService {
private static final DateTimeFormatter FRONTEND_UTC_MILLIS_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
@Autowired @Autowired
private SceneService sceneService; private SceneService sceneService;
...@@ -853,9 +855,7 @@ public class ChromosomeDataService { ...@@ -853,9 +855,7 @@ public class ChromosomeDataService {
// 检查值是否是时间类型 // 检查值是否是时间类型
if (value instanceof LocalDateTime) { if (value instanceof LocalDateTime) {
LocalDateTime dateTime = (LocalDateTime) value; LocalDateTime dateTime = (LocalDateTime) value;
// 转换为OffsetDateTime以包含时区信息 formattedMap.put(key, formatFrontendUtcDateTime(dateTime));
OffsetDateTime offsetDateTime = dateTime.atOffset(ZoneOffset.UTC);
formattedMap.put(key, offsetDateTime);
} else { } else {
formattedMap.put(key, value); formattedMap.put(key, value);
} }
...@@ -889,9 +889,7 @@ public class ChromosomeDataService { ...@@ -889,9 +889,7 @@ public class ChromosomeDataService {
// 检查是否是时间类型字段 // 检查是否是时间类型字段
if (value instanceof LocalDateTime) { if (value instanceof LocalDateTime) {
LocalDateTime dateTime = (LocalDateTime) value; LocalDateTime dateTime = (LocalDateTime) value;
// 转换为OffsetDateTime以包含时区信息 formattedData.put(field.getName(), formatFrontendUtcDateTime(dateTime));
OffsetDateTime offsetDateTime = dateTime.atOffset(ZoneOffset.UTC);
formattedData.put(field.getName(), offsetDateTime);
} else { } else {
// 对于String类型字段,如果值为null,设置为空字符串 // 对于String类型字段,如果值为null,设置为空字符串
if (value == null && field.getType() == String.class) { if (value == null && field.getType() == String.class) {
...@@ -908,6 +906,10 @@ public class ChromosomeDataService { ...@@ -908,6 +906,10 @@ public class ChromosomeDataService {
return formattedData; return formattedData;
} }
private String formatFrontendUtcDateTime(LocalDateTime dateTime) {
return dateTime == null ? null : dateTime.format(FRONTEND_UTC_MILLIS_FORMATTER);
}
/** /**
* 处理materialInfo实体的特殊查询逻辑 * 处理materialInfo实体的特殊查询逻辑
*/ */
...@@ -2927,4 +2929,4 @@ public class ChromosomeDataService { ...@@ -2927,4 +2929,4 @@ public class ChromosomeDataService {
return map; return map;
} }
} }
\ No newline at end of file
...@@ -49,6 +49,7 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -49,6 +49,7 @@ public class LanuchServiceImpl implements LanuchService {
private static final BigDecimal SECONDS_PER_DAY = BigDecimal.valueOf(24L * 3600L); private static final BigDecimal SECONDS_PER_DAY = BigDecimal.valueOf(24L * 3600L);
private static final BigDecimal MAX_PROCESS_DURATION_SECONDS = private static final BigDecimal MAX_PROCESS_DURATION_SECONDS =
SECONDS_PER_DAY.multiply(MAX_PROCESS_DURATION_DAYS); SECONDS_PER_DAY.multiply(MAX_PROCESS_DURATION_DAYS);
private static final int ORACLE_IN_BATCH_SIZE = 1000;
private final ProdEquipSpecialCalService prodEquipSpecialCalService; private final ProdEquipSpecialCalService prodEquipSpecialCalService;
private final ApsOrderService apsOrderService; private final ApsOrderService apsOrderService;
...@@ -71,6 +72,25 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -71,6 +72,25 @@ public class LanuchServiceImpl implements LanuchService {
private final EquipinfoService equipinfoService; private final EquipinfoService equipinfoService;
private final MaterialInfoService materialInfoService; private final MaterialInfoService materialInfoService;
private final RoutingHeaderService routingHeaderService; private final RoutingHeaderService routingHeaderService;
private List<ProdProcessExec> getProcessExecBySceneAndRoutingDetailIds(String sceneId, List<Long> routingDetailIds) {
if (CollectionUtils.isEmpty(routingDetailIds)) {
return new ArrayList<>();
}
List<ProdProcessExec> processExecList = new ArrayList<>();
for (int i = 0; i < routingDetailIds.size(); i += ORACLE_IN_BATCH_SIZE) {
int endIndex = Math.min(i + ORACLE_IN_BATCH_SIZE, routingDetailIds.size());
List<Long> batchIds = routingDetailIds.subList(i, endIndex);
List<ProdProcessExec> batchProcessExecs = prodProcessExecService.lambdaQuery()
.eq(ProdProcessExec::getSceneId, sceneId)
.in(ProdProcessExec::getRoutingDetailId, batchIds)
.list();
processExecList.addAll(batchProcessExecs);
}
return processExecList;
}
/** /**
* 生成场景数据 * 生成场景数据
* *
...@@ -929,21 +949,21 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -929,21 +949,21 @@ public class LanuchServiceImpl implements LanuchService {
prodProcessExec.setTaskSeq(detail.getTaskSeq()); prodProcessExec.setTaskSeq(detail.getTaskSeq());
prodProcessExec.setRoutingDetailName(detail.getName()); prodProcessExec.setRoutingDetailName(detail.getName());
RoutingDetailEquip routingDetailEquip1 = routingDetailEquip.stream(). List<RoutingDetailEquip> matchedRoutingDetailEquips = Optional.ofNullable(routingDetailEquip)
filter(detailEquip -> detailEquip.getRoutingDetailId().equals(detail.getId())) .orElse(Collections.emptyList())
.stream()
.filter(Objects::nonNull)
.filter(detailEquip -> Objects.equals(detailEquip.getRoutingDetailId(), detail.getId()))
.filter(detailEquip -> detailEquip.getIsdeleted() == null || detailEquip.getIsdeleted() == 0)
.collect(Collectors.toList());
RoutingDetailEquip routingDetailEquip1 = matchedRoutingDetailEquips.stream()
.filter(detailEquip -> detailEquip.getType1() != null) .filter(detailEquip -> detailEquip.getType1() != null)
.filter(detailEquip -> detailEquip.getIsdeleted() == 0)
.findFirst() .findFirst()
.orElse(null); .orElse(matchedRoutingDetailEquips.stream().findFirst().orElse(null));
if (routingDetailEquip1 != null) {
prodProcessExec.setMachineId(routingDetailEquip1.getType1());
}else {
prodProcessExec.setMachineId(detail.getEquipTypeId());
Long machineId = resolveProcessExecMachineId(prodOrderMain, detail, routingHeader, routingDetailEquip1);
prodProcessExec.setMachineId(machineId);
}
prodProcessExec.setRuntime(detail.getRuntime()); prodProcessExec.setRuntime(detail.getRuntime());
...@@ -990,6 +1010,50 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -990,6 +1010,50 @@ public class LanuchServiceImpl implements LanuchService {
return prodProcessExec; return prodProcessExec;
} }
private Long resolveProcessExecMachineId(ProdLaunchOrder prodOrderMain,
RoutingDetail detail,
RoutingHeader routingHeader,
RoutingDetailEquip routingDetailEquip) {
Long machineId = null;
if (routingDetailEquip != null && routingDetailEquip.getType1() != null) {
machineId = routingDetailEquip.getType1();
} else if (detail != null) {
machineId = detail.getEquipTypeId();
}
if (machineId != null) {
return machineId;
}
String orderCode = prodOrderMain == null ? null : prodOrderMain.getOrderCode();
String processName = detail == null ? null : detail.getName();
Long taskSeq = detail == null ? null : detail.getTaskSeq();
String routingCode = routingHeader == null ? null : routingHeader.getCode();
StringBuilder message = new StringBuilder("新建场景失败:订单[")
.append(orderCode == null || orderCode.trim().isEmpty() ? "未命名订单" : orderCode)
.append("]工序[")
.append(processName == null || processName.trim().isEmpty() ? "未命名工序" : processName)
.append("]");
if (taskSeq != null) {
message.append("序号[").append(taskSeq).append("]");
}
if (routingCode != null && !routingCode.trim().isEmpty()) {
message.append("工艺路线[").append(routingCode).append("]");
}
if (routingDetailEquip != null) {
message.append("存在工序设备配置,但资源组为空");
} else {
message.append("未配置资源组/设备类型");
}
message.append(",无法生成执行工序,请维护工艺路线或工序设备中的资源组配置后重试");
throw new SceneGenerationException(message.toString());
}
private void validateProcessDurationLimit(ProdLaunchOrder prodOrderMain, private void validateProcessDurationLimit(ProdLaunchOrder prodOrderMain,
RoutingDetail detail, RoutingDetail detail,
List<RoutingDetailEquip> routingDetailEquip) { List<RoutingDetailEquip> routingDetailEquip) {
...@@ -1117,10 +1181,7 @@ public class LanuchServiceImpl implements LanuchService { ...@@ -1117,10 +1181,7 @@ public class LanuchServiceImpl implements LanuchService {
// 当routingDetailIds为空时,返回空列表 // 当routingDetailIds为空时,返回空列表
processExecList = new ArrayList<>(); processExecList = new ArrayList<>();
} else { } else {
processExecList = prodProcessExecService.lambdaQuery() processExecList = getProcessExecBySceneAndRoutingDetailIds(sceneId, new ArrayList<>(routingDetailIds));
.eq(ProdProcessExec::getSceneId, sceneId)
.in(ProdProcessExec::getRoutingDetailId, new ArrayList<>(routingDetailIds))
.list();
} }
// 构建routingDetailId到execId的映射 // 构建routingDetailId到execId的映射
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment