|
@@ -1,5 +1,6 @@
|
|
|
package com.rongwei.bscommon.sys.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.date.DateField;
|
|
@@ -723,7 +724,7 @@ public class ApsServiceImpl implements ApsService {
|
|
|
productionScheduleVo.setEquipmentList(equipmentList1);
|
|
|
apsProductionSchedules.add(productionScheduleVo);
|
|
|
} catch (Exception e) {
|
|
|
- logger.info("坯料计划:+bo.getBlanknumber() + ;排程数据初始化异常", e);
|
|
|
+ logger.info("坯料计划:"+bo.getBlanknumber() + ";排程数据初始化异常", e);
|
|
|
String msg = "坯料计划:" + bo.getBlanknumber() + ";排程数据初始化异常";
|
|
|
throw new CustomException(msg + " " + DateUtil.formatDateTime(new Date()));
|
|
|
}
|
|
@@ -784,125 +785,183 @@ public class ApsServiceImpl implements ApsService {
|
|
|
System.out.println("排程数据:" + JSONUtil.toJsonStr(apsProductionSchedule, jsonConfig));
|
|
|
logger.info("排程数据:" + JSONUtil.toJsonStr(apsProductionSchedule, jsonConfig));
|
|
|
// APS平台排程接口调用
|
|
|
- ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(apsProductionSchedule);
|
|
|
- logger.info("排程结果:" + JSONUtil.toJsonStr(productionScheduleRetVo, jsonConfig));
|
|
|
- //排程结束时间
|
|
|
- DateTime endTime = DateUtil.date();
|
|
|
- //日志写入文件
|
|
|
- logWriter(JSONUtil.toJsonStr(apsProductionSchedule, jsonConfig), JSONUtil.toJsonStr(productionScheduleRetVo, jsonConfig), apsType.getScheduleType());
|
|
|
- //排程日志存入数据库
|
|
|
- logSave(currentUser, startTime, endTime, apsType, apsPlanStartDate, apsPlanEndDate, productionScheduleRetVo);
|
|
|
- if (!"200".equals(productionScheduleRetVo.getCode())) {
|
|
|
- logger.info("排程异常,坯料计划ID:" + blankOrderIds);
|
|
|
- // 排程异常后恢复历史排程结果为锁定状态
|
|
|
- processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
- .in(ApsProcessOperationProcessEquDo::getBlankid, blankOrderIds));
|
|
|
- // 没有可排程工序的订单跳过
|
|
|
- if ("没有可排程的工序".equals(productionScheduleRetVo.getMsg())) {
|
|
|
- logger.info("排程异常:没有可排程的工序,坯料计划编号:" + blankOrderIds);
|
|
|
- } else {
|
|
|
- throw new CustomException(productionScheduleRetVo.getMsg() + " " + DateUtil.formatDateTime(new Date()));
|
|
|
- }
|
|
|
+ ProductionScheduleRetVo productionScheduleRetVo;
|
|
|
+ if (apsType.getConstraintMode() != null && apsType.getConstraintMode().equals("lz")) {
|
|
|
+ productionScheduleRetVo = rwApsServer.productionLzDdSchedule(apsProductionSchedule);
|
|
|
} else {
|
|
|
- // 获取坯料计划
|
|
|
+ productionScheduleRetVo = rwApsServer.productionSchedule(apsProductionSchedule);
|
|
|
+ }
|
|
|
+ saveRes(productionScheduleRetVo,
|
|
|
+ jsonConfig,
|
|
|
+ apsProductionSchedule,
|
|
|
+ apsType,
|
|
|
+ apsPlanStartDate,
|
|
|
+ apsPlanEndDate,
|
|
|
+ blankOrderIds,
|
|
|
+ apsBlankOrders,
|
|
|
+ currentUser,
|
|
|
+ startTime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveRes(ProductionScheduleRetVo productionScheduleRetVo,
|
|
|
+ JSONConfig jsonConfig,
|
|
|
+ ProductionScheduleVo apsProductionSchedule,
|
|
|
+ ApsTypeVo apsType,
|
|
|
+ Date apsPlanStartDate,
|
|
|
+ Date apsPlanEndDate,
|
|
|
+ List<String> blankOrderIds,
|
|
|
+ List<ApsBlankOrderVo> apsBlankOrders,
|
|
|
+ SysUserVo currentUser,
|
|
|
+ DateTime startTime) {
|
|
|
+
|
|
|
+ logger.info("排程结果:" + JSONUtil.toJsonStr(productionScheduleRetVo, jsonConfig));
|
|
|
+ //排程结束时间
|
|
|
+ DateTime endTime = DateUtil.date();
|
|
|
+ //日志写入文件
|
|
|
+ logWriter(JSONUtil.toJsonStr(apsProductionSchedule, jsonConfig), JSONUtil.toJsonStr(productionScheduleRetVo, jsonConfig), apsType.getScheduleType());
|
|
|
+ //排程日志存入数据库
|
|
|
+ logSave(currentUser, startTime, endTime, apsType, apsPlanStartDate, apsPlanEndDate, productionScheduleRetVo);
|
|
|
+ if (!"200".equals(productionScheduleRetVo.getCode())) {
|
|
|
+ logger.info("排程异常,坯料计划ID:" + blankOrderIds);
|
|
|
+ // 排程异常后恢复历史排程结果为锁定状态
|
|
|
+ processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
+ .in(ApsProcessOperationProcessEquDo::getBlankid, blankOrderIds));
|
|
|
+ // 没有可排程工序的订单跳过
|
|
|
+ if ("没有可排程的工序".equals(productionScheduleRetVo.getMsg())) {
|
|
|
+ logger.info("排程异常:没有可排程的工序,坯料计划编号:" + blankOrderIds);
|
|
|
+ } else {
|
|
|
+ throw new CustomException(productionScheduleRetVo.getMsg() + " " + DateUtil.formatDateTime(new Date()));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 获取坯料计划
|
|
|
/*List<ApsBlankOrderVo> apsBlankOrderss = new ArrayList<>();
|
|
|
apsBlankOrderss.add(bo);*/
|
|
|
- //排程结束后,查询修改时间在排程开始-?的明细,不更新修改信息,并最后重新判断其冲突
|
|
|
- List<ApsProcessOperationProcessEquCheckVo> list = apsProcessOperationProcessEquDao.getNeedCheckEquList(startTime, CXCommonUtils.getCurrentUserFactoryId(currentUser));
|
|
|
-
|
|
|
- if ("dd".equals(apsType.getScheduleType())) {
|
|
|
- if (!list.isEmpty()) {
|
|
|
- List<String> updateIdList = list.stream().map(ApsProcessOperationProcessEquCheckVo::getId).distinct().collect(Collectors.toList());
|
|
|
- List<ProductionProcesses> productionProcesses = productionScheduleRetVo.getProcesses().stream().filter(item -> !updateIdList.contains(item.getId())).collect(Collectors.toList());
|
|
|
- productionScheduleRetVo.setProcesses(productionProcesses);
|
|
|
+ //排程结束后,查询修改时间在排程开始-?的明细,不更新修改信息,并最后重新判断其冲突
|
|
|
+ List<ApsProcessOperationProcessEquCheckVo> list = apsProcessOperationProcessEquDao.getNeedCheckEquList(startTime, CXCommonUtils.getCurrentUserFactoryId(currentUser));
|
|
|
+
|
|
|
+ if ("dd".equals(apsType.getScheduleType())) {
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ List<String> updateIdList = list.stream().map(ApsProcessOperationProcessEquCheckVo::getId).distinct().collect(Collectors.toList());
|
|
|
+ List<ProductionProcesses> productionProcesses = productionScheduleRetVo.getProcesses().stream().filter(item -> !updateIdList.contains(item.getId())).collect(Collectors.toList());
|
|
|
+ productionScheduleRetVo.setProcesses(productionProcesses);
|
|
|
+ }
|
|
|
+ //循环5次,如果执行成功,继续向下执行,如果出现sql超时,等待2分钟后重试,重试5次
|
|
|
+ boolean isSuccess = false;
|
|
|
+ for (int i = 0; i < 5; i++) {
|
|
|
+ if (isSuccess) {
|
|
|
+ break;
|
|
|
}
|
|
|
- //循环5次,如果执行成功,继续向下执行,如果出现sql超时,等待2分钟后重试,重试5次
|
|
|
- boolean isSuccess = false;
|
|
|
- for (int i = 0; i < 5; i++) {
|
|
|
- if (isSuccess) {
|
|
|
- break;
|
|
|
- }
|
|
|
+ try {
|
|
|
+ apsBlankOrderService.ddApsAfter(productionScheduleRetVo, apsBlankOrders, currentUser, apsType);
|
|
|
+ isSuccess = true;
|
|
|
+ } catch (SQLNonTransientConnectionException | CJCommunicationsException |
|
|
|
+ SocketTimeoutException | CommunicationsException e) {
|
|
|
try {
|
|
|
- apsBlankOrderService.ddApsAfter(productionScheduleRetVo, apsBlankOrders, currentUser, apsType);
|
|
|
- isSuccess = true;
|
|
|
- } catch (SQLNonTransientConnectionException | CJCommunicationsException |
|
|
|
- SocketTimeoutException | CommunicationsException | MySQLTransactionRollbackException e) {
|
|
|
- try {
|
|
|
- Thread.sleep(120000);
|
|
|
- logger.info("排程结束写入数据异常,重试");
|
|
|
- } catch (InterruptedException ignored) {
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- throw new CustomException(e.getMessage());
|
|
|
+ Thread.sleep(120000);
|
|
|
+ } catch (InterruptedException ignored) {
|
|
|
}
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new CustomException(e.getMessage());
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- } else {
|
|
|
- //循环5次,如果执行成功,继续向下执行,如果出现sql超时,等待2分钟后重试,重试5次
|
|
|
- boolean isSuccess = false;
|
|
|
- for (int i = 0; i < 5; i++) {
|
|
|
- if (isSuccess) {
|
|
|
- break;
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ //循环5次,如果执行成功,继续向下执行,如果出现sql超时,等待2分钟后重试,重试5次
|
|
|
+ boolean isSuccess = false;
|
|
|
+ for (int i = 0; i < 5; i++) {
|
|
|
+ if (isSuccess) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ apsBlankOrderService.apsAfter(productionScheduleRetVo, apsBlankOrders, currentUser, apsType);
|
|
|
+ isSuccess = true;
|
|
|
+ } catch (SQLNonTransientConnectionException | CJCommunicationsException |
|
|
|
+ SocketTimeoutException | CommunicationsException e) {
|
|
|
try {
|
|
|
- apsBlankOrderService.apsAfter(productionScheduleRetVo, apsBlankOrders, currentUser, apsType);
|
|
|
- isSuccess = true;
|
|
|
- } catch (SQLNonTransientConnectionException | CJCommunicationsException |
|
|
|
- SocketTimeoutException | CommunicationsException | MySQLTransactionRollbackException e) {
|
|
|
- try {
|
|
|
- Thread.sleep(120000);
|
|
|
- logger.info("排程结束写入数据异常,重试");
|
|
|
- } catch (InterruptedException ignored) {
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- throw new CustomException(e.getMessage());
|
|
|
+ Thread.sleep(120000);
|
|
|
+ } catch (InterruptedException ignored) {
|
|
|
}
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new CustomException(e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
- //还原排程过程中,开工/报工的作业的计划时间
|
|
|
- apsProcessOperationProcessEquDao.repairePlanStartDate();
|
|
|
- apsProcessOperationProcessEquDao.repairePlanStartDate2();
|
|
|
-
|
|
|
- if (StrUtil.isNotBlank(productionScheduleRetVo.getMsg())) {
|
|
|
- // 排程异常后恢复历史排程结果为锁定状态
|
|
|
- List<String> blankids = CollUtil.distinct(productionScheduleRetVo.getProcesses().stream().map(v -> v.getProduceOrder().get(0).getId()).collect(Collectors.toList()));
|
|
|
- List<String> allblankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
- List<String> exblankids = null;
|
|
|
- if (blankids != null && blankids.size() > 0) {
|
|
|
- exblankids = allblankids.stream().filter(v -> !blankids.contains(v)).collect(Collectors.toList());
|
|
|
- } else {
|
|
|
- exblankids = allblankids;
|
|
|
- }
|
|
|
- if (exblankids != null && exblankids.size() > 0) {
|
|
|
- processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
- .in(ApsProcessOperationProcessEquDo::getBlankid, exblankids));
|
|
|
- }
|
|
|
+ }
|
|
|
+ //还原排程过程中,开工/报工的作业的计划时间
|
|
|
+ apsProcessOperationProcessEquDao.repairePlanStartDate();
|
|
|
+ apsProcessOperationProcessEquDao.repairePlanStartDate2();
|
|
|
|
|
|
- throw new CustomException(productionScheduleRetVo.getMsg() + " " + DateUtil.formatDateTime(new Date()));
|
|
|
+ if (StrUtil.isNotBlank(productionScheduleRetVo.getMsg())) {
|
|
|
+ // 排程异常后恢复历史排程结果为锁定状态
|
|
|
+ List<String> blankids = CollUtil.distinct(productionScheduleRetVo.getProcesses().stream().map(v -> v.getProduceOrder().get(0).getId()).collect(Collectors.toList()));
|
|
|
+ List<String> allblankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
+ List<String> exblankids = null;
|
|
|
+ if (blankids != null && blankids.size() > 0) {
|
|
|
+ exblankids = allblankids.stream().filter(v -> !blankids.contains(v)).collect(Collectors.toList());
|
|
|
+ } else {
|
|
|
+ exblankids = allblankids;
|
|
|
}
|
|
|
- if (!list.isEmpty()) {
|
|
|
- List<ApsProcessOperationProcessEquCheckVo> waitStartList = list.stream().filter(item -> item.getWorkstatus().equals("待开工")).collect(Collectors.toList());
|
|
|
- for (ApsProcessOperationProcessEquCheckVo equDo : waitStartList) {
|
|
|
- try {
|
|
|
- apsProcessOperationProcessEquService.checkProcessingTimeConflict(equDo,
|
|
|
- null, null, null, equDo.getProcessWay(), new LinkedList<>());
|
|
|
- ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = apsProcessOperationProcessEquService.getById(equDo.getId());
|
|
|
- // 判断是否存在设备不可用
|
|
|
- apsProcessOperationProcessEquService.inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,
|
|
|
- apsProcessOperationProcessEquDo.getProcessdeviceid(),
|
|
|
- apsProcessOperationProcessEquDo.getPlanstartdate(),
|
|
|
- apsProcessOperationProcessEquDo.getPlanenddate(),
|
|
|
- new LinkedList<>());
|
|
|
- } catch (Exception e) {
|
|
|
- logger.error("判断冲突失败:" + equDo.getId(), e);
|
|
|
- }
|
|
|
+ if (exblankids != null && exblankids.size() > 0) {
|
|
|
+ processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark, "y")
|
|
|
+ .in(ApsProcessOperationProcessEquDo::getBlankid, exblankids));
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new CustomException(productionScheduleRetVo.getMsg() + " " + DateUtil.formatDateTime(new Date()));
|
|
|
+ }
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ List<ApsProcessOperationProcessEquCheckVo> waitStartList = list.stream().filter(item -> item.getWorkstatus().equals("待开工")).collect(Collectors.toList());
|
|
|
+ for (ApsProcessOperationProcessEquCheckVo equDo : waitStartList) {
|
|
|
+ try {
|
|
|
+ apsProcessOperationProcessEquService.checkProcessingTimeConflict(equDo,
|
|
|
+ null, null, null, equDo.getProcessWay(), new LinkedList<>());
|
|
|
+ ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = apsProcessOperationProcessEquService.getById(equDo.getId());
|
|
|
+ // 判断是否存在设备不可用
|
|
|
+ apsProcessOperationProcessEquService.inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,
|
|
|
+ apsProcessOperationProcessEquDo.getProcessdeviceid(),
|
|
|
+ apsProcessOperationProcessEquDo.getPlanstartdate(),
|
|
|
+ apsProcessOperationProcessEquDo.getPlanenddate(),
|
|
|
+ new LinkedList<>());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("判断冲突失败:" + equDo.getId(), e);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// private List<ProductionScheduleVo> xmxSplit(ProductionScheduleVo apsProductionSchedule) {
|
|
|
+// List<ProductionScheduleVo> res = new LinkedList<>();
|
|
|
+// List<ProductionProcesses> processes = apsProductionSchedule.getProcesses();
|
|
|
+// List<String> blankIdList = processes.stream().map(item -> item.getProduceOrder().get(0).getId()).distinct().collect(Collectors.toList());
|
|
|
+// //查询涉及到的所有明细
|
|
|
+// List<ApsProcessOperationProcessEquDo> allProcessEquList = apsProcessOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankIdList));
|
|
|
+// for (String blankId : blankIdList) {
|
|
|
+// List<ProductionProcesses> productionProcesses = new LinkedList<>(processes);
|
|
|
+// for (ProductionProcesses productionProcess : productionProcesses) {
|
|
|
+// //不是此坯料计划的明细,并且解锁的,锁定,并且填入加工设备、计划开工时间
|
|
|
+// if (!productionProcess.getProduceOrder().get(0).getId().equals(blankId)
|
|
|
+// && !productionProcess.isIfLock()) {
|
|
|
+// ApsProcessOperationProcessEquDo equDo = allProcessEquList.stream().filter(item -> item.getId().equals(productionProcess.getId())).findFirst().orElse(null);
|
|
|
+// if (equDo != null) {
|
|
|
+// LocalDateTime planstartdate = DateUtil.parseLocalDateTime((CharSequence) equDo.getPlanstartdate());
|
|
|
+// LocalDateTime planenddate = DateUtil.parseLocalDateTime((CharSequence) equDo.getPlanenddate());
|
|
|
+// String processdeviceid = equDo.getProcessdeviceid();
|
|
|
+// Equipment equipment = new Equipment();
|
|
|
+// equipment.setId(processdeviceid);
|
|
|
+// productionProcess.setStartTime(planstartdate);
|
|
|
+// productionProcess.setEndTime(planenddate);
|
|
|
+// productionProcess.setEquipment(equipment);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// ProductionScheduleVo newProductionSchedule = BeanUtil.toBean(apsProductionSchedule, ProductionScheduleVo.class);
|
|
|
+// newProductionSchedule.setProcesses(productionProcesses);
|
|
|
+// res.add(newProductionSchedule);
|
|
|
+// }
|
|
|
+//
|
|
|
+// return res;
|
|
|
+// }
|
|
|
+
|
|
|
private void logSave(SysUserVo currentUser, DateTime startTime, DateTime endTime, ApsTypeVo apsType, Date apsPlanStartDate, Date apsPlanEndDate, ProductionScheduleRetVo productionScheduleRetVo) {
|
|
|
try {
|
|
|
ApsScheduleLogDo apsScheduleLogDo = new ApsScheduleLogDo();
|