|
@@ -71,8 +71,6 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
@Autowired
|
|
|
private ApsBlankOrderDao apsBlankOrderDao;
|
|
|
@Autowired
|
|
|
- private RwApsServer rwApsServer;
|
|
|
- @Autowired
|
|
|
private ApsProcessOperationProcessEquServiceImpl processOperationProcessEquService;
|
|
|
@Autowired
|
|
|
private ApsScheduleConfigService apsScheduleConfigService;
|
|
@@ -99,9 +97,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
@Autowired
|
|
|
private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
|
|
|
@Autowired
|
|
|
- private RedissonClient redissonClient;
|
|
|
- @Autowired
|
|
|
private ApsEquipmentCalendarService apsEquipmentCalendarService;
|
|
|
+ @Autowired
|
|
|
+ private ApsService apsService;
|
|
|
|
|
|
|
|
|
@Override
|
|
@@ -481,159 +479,129 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
* @param apsBlankOrders
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
public void blankOrderAps(List<ApsBlankOrderVo> apsBlankOrders) {
|
|
|
- // 当前等路人所属工厂
|
|
|
- SysUserVo currentUser = CXCommonUtils.getCurrentUser();
|
|
|
- String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
|
|
|
- if (StringUtils.isBlank(tenantId)) {
|
|
|
- throw new CustomException("所属工厂不能为空");
|
|
|
- }
|
|
|
- assert apsBlankOrders != null : "排程订单不能为空";
|
|
|
- // 按照所属工厂加锁
|
|
|
- RLock rLock = redissonClient.getLock(tenantId);
|
|
|
- try {
|
|
|
- // 加锁最大1小时
|
|
|
- rLock.lock(1, TimeUnit.HOURS);
|
|
|
- // 合并待发布未锁定的订单一起排程
|
|
|
- List<String> hasIds = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
- String idStrs = CollUtil.join(hasIds, "','");
|
|
|
- idStrs = "'" + idStrs + "'";
|
|
|
- // 查询存在未锁定的作业坯料计划
|
|
|
-// List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs,tenantId);
|
|
|
- List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getOrdersHasNotLockProcess(idStrs,tenantId);
|
|
|
- if (fbNotLock != null && fbNotLock.size() > 0) {
|
|
|
- apsBlankOrders.addAll(fbNotLock);
|
|
|
- }
|
|
|
+ apsService.apsSchedule(apsBlankOrders);
|
|
|
+ }
|
|
|
|
|
|
- // 先删除所有作业的明细
|
|
|
- List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
- processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
|
|
|
- // 模型转换
|
|
|
- ProductionScheduleVo productionScheduleVo = apsPlanModelSet(apsBlankOrders);
|
|
|
- JSONConfig jsonConfig = JSONConfig.create();
|
|
|
- jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
|
|
|
- logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
|
|
|
- // APS平台排程接口调用
|
|
|
- ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
|
|
|
- if (!"200".equals(productionScheduleRetVo.getCode())) {
|
|
|
- throw new CustomException(productionScheduleRetVo.getMsg());
|
|
|
- }
|
|
|
- // 排程结果保存
|
|
|
- List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
|
|
|
- // 最后节点集合
|
|
|
- List<ProductionProcesses> lastProcess = new ArrayList<>();
|
|
|
- if (productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size() > 0) {
|
|
|
- for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
|
|
|
- // 非合并生产工序
|
|
|
- if (process.getAluminumCoils() == null) {
|
|
|
+ /**
|
|
|
+ * 排程结果操作
|
|
|
+ * @param productionScheduleRetVo
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void apsAfter(ProductionScheduleRetVo productionScheduleRetVo,List<ApsBlankOrderVo> apsBlankOrders){
|
|
|
+ // 先删除所有作业的明细
|
|
|
+ List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
+ processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
|
|
|
+ // 排程结果保存
|
|
|
+ List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
|
|
|
+ // 最后节点集合
|
|
|
+ List<ProductionProcesses> lastProcess = new ArrayList<>();
|
|
|
+ if (productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size() > 0) {
|
|
|
+ for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
|
|
|
+ // 非合并生产工序
|
|
|
+ if (process.getAluminumCoils() == null) {
|
|
|
+ ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
|
|
|
+ apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
|
|
|
+ apsProcessOperationProcessEqu.setProcessid(process.getId());
|
|
|
+ apsProcessOperationProcessEqu.setBlankid(process.getProduceOrder().get(0).getId());
|
|
|
+ apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
|
|
|
+ apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
|
|
|
+ apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshopid());
|
|
|
+ apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
|
|
|
+ apsProcessOperationProcessEqu.setTenantid(process.getEquipment().getFactoryid());
|
|
|
+ apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
+ apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
+ apsProcessOperationProcessEqu.setPlanprocessrall(process.getProducePcNum());
|
|
|
+ apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
|
|
|
+ apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
|
|
|
+ apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
|
|
|
+ apsProcessOperationProcessEqu.setDeleted("0");
|
|
|
+ apsProcessOperationProcessEqu.setUnfinishroll(process.getProducePcNum());
|
|
|
+ apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
|
|
|
+ }
|
|
|
+ // 合并生产工序
|
|
|
+ else {
|
|
|
+ // 保存到明细表
|
|
|
+ Map<String, List<AluminumCoil>> bsAl = new HashMap<>();
|
|
|
+ for (AluminumCoil aluminumCoil : process.getAluminumCoils()) {
|
|
|
+ if (bsAl.containsKey(aluminumCoil.getBsId())) {
|
|
|
+ bsAl.get(aluminumCoil.getBsId()).add(aluminumCoil);
|
|
|
+ } else {
|
|
|
+ List<AluminumCoil> coils = new ArrayList<>();
|
|
|
+ coils.add(aluminumCoil);
|
|
|
+ bsAl.put(aluminumCoil.getBsId(), coils);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bsAl.forEach((k, v) -> {
|
|
|
ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
|
|
|
apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
|
|
|
- apsProcessOperationProcessEqu.setProcessid(process.getId());
|
|
|
- apsProcessOperationProcessEqu.setBlankid(process.getProduceOrder().get(0).getId());
|
|
|
+ apsProcessOperationProcessEqu.setProcessid(k);
|
|
|
+ apsProcessOperationProcessEqu.setBlankid(v.get(0).getBlankid());
|
|
|
apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
|
|
|
apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
|
|
|
+ apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
+ apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
+ apsProcessOperationProcessEqu.setPlanprocessrall(v.size());
|
|
|
apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshopid());
|
|
|
apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
|
|
|
apsProcessOperationProcessEqu.setTenantid(process.getEquipment().getFactoryid());
|
|
|
- apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
- apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
- apsProcessOperationProcessEqu.setPlanprocessrall(process.getProducePcNum());
|
|
|
apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
|
|
|
apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
|
|
|
apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
|
|
|
apsProcessOperationProcessEqu.setDeleted("0");
|
|
|
- apsProcessOperationProcessEqu.setUnfinishroll(process.getProducePcNum());
|
|
|
+ apsProcessOperationProcessEqu.setUnfinishroll(v.size());
|
|
|
apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
|
|
|
- }
|
|
|
- // 合并生产工序
|
|
|
- else {
|
|
|
- // 保存到明细表
|
|
|
- Map<String, List<AluminumCoil>> bsAl = new HashMap<>();
|
|
|
- for (AluminumCoil aluminumCoil : process.getAluminumCoils()) {
|
|
|
- if (bsAl.containsKey(aluminumCoil.getBsId())) {
|
|
|
- bsAl.get(aluminumCoil.getBsId()).add(aluminumCoil);
|
|
|
- } else {
|
|
|
- List<AluminumCoil> coils = new ArrayList<>();
|
|
|
- coils.add(aluminumCoil);
|
|
|
- bsAl.put(aluminumCoil.getBsId(), coils);
|
|
|
- }
|
|
|
- }
|
|
|
- bsAl.forEach((k, v) -> {
|
|
|
- ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
|
|
|
- apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
|
|
|
- apsProcessOperationProcessEqu.setProcessid(k);
|
|
|
- apsProcessOperationProcessEqu.setBlankid(v.get(0).getBlankid());
|
|
|
- apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
|
|
|
- apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
|
|
|
- apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
- apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
|
|
- apsProcessOperationProcessEqu.setPlanprocessrall(v.size());
|
|
|
- apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshopid());
|
|
|
- apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
|
|
|
- apsProcessOperationProcessEqu.setTenantid(process.getEquipment().getFactoryid());
|
|
|
- apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
|
|
|
- apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
|
|
|
- apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
|
|
|
- apsProcessOperationProcessEqu.setDeleted("0");
|
|
|
- apsProcessOperationProcessEqu.setUnfinishroll(v.size());
|
|
|
- apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
|
|
|
- });
|
|
|
- }
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- // 是否为最后一个节点
|
|
|
- if (process.getNextProcessesIds() == null || process.getNextProcessesIds().size() == 0) {
|
|
|
- lastProcess.add(process);
|
|
|
- }
|
|
|
+ // 是否为最后一个节点
|
|
|
+ if (process.getNextProcessesIds() == null || process.getNextProcessesIds().size() == 0) {
|
|
|
+ lastProcess.add(process);
|
|
|
}
|
|
|
}
|
|
|
- if (apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size() > 0) {
|
|
|
- // 再保存新数据
|
|
|
- processOperationProcessEquService.saveBatch(apsProcessOperationProcessEquDos);
|
|
|
- // 回写订单排程交货期
|
|
|
- Map<String, Date> orderDeliveryTime = new HashMap<>();
|
|
|
- for (ProductionProcesses process : lastProcess) {
|
|
|
- List<ProduceOrder> produceOrder = process.getProduceOrder();
|
|
|
- if (produceOrder != null && produceOrder.size() > 0) {
|
|
|
- for (ProduceOrder order : produceOrder) {
|
|
|
- Date endDate = Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
- ApsBlankOrderDo blankOrder = this.getById(order.getId());
|
|
|
- if (orderDeliveryTime.containsKey(blankOrder.getProductionorderid())) {
|
|
|
- // 对比取最大值
|
|
|
- if (endDate.compareTo(orderDeliveryTime.get(blankOrder.getProductionorderid())) > 0) {
|
|
|
- orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
|
|
|
- }
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ if (apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size() > 0) {
|
|
|
+ // 再保存新数据
|
|
|
+ processOperationProcessEquService.saveBatch(apsProcessOperationProcessEquDos);
|
|
|
+ // 回写订单排程交货期
|
|
|
+ Map<String, Date> orderDeliveryTime = new HashMap<>();
|
|
|
+ for (ProductionProcesses process : lastProcess) {
|
|
|
+ List<ProduceOrder> produceOrder = process.getProduceOrder();
|
|
|
+ if (produceOrder != null && produceOrder.size() > 0) {
|
|
|
+ for (ProduceOrder order : produceOrder) {
|
|
|
+ Date endDate = Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ ApsBlankOrderDo blankOrder = this.getById(order.getId());
|
|
|
+ if (orderDeliveryTime.containsKey(blankOrder.getProductionorderid())) {
|
|
|
+ // 对比取最大值
|
|
|
+ if (endDate.compareTo(orderDeliveryTime.get(blankOrder.getProductionorderid())) > 0) {
|
|
|
orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // 更新订单的排程交货期、排程状态
|
|
|
- if (orderDeliveryTime.size() > 0) {
|
|
|
- orderDeliveryTime.forEach((k, v) -> {
|
|
|
- ApsProductionOrderDo productionOrderDo = apsProductionOrderService.getById(k);
|
|
|
- ApsProductionOrderDo apsProductionOrderDo = new ApsProductionOrderDo();
|
|
|
- apsProductionOrderDo.setId(k);
|
|
|
- apsProductionOrderDo.setScheduledeliverydate(v);
|
|
|
- if (productionOrderDo.getDeliverytime() != null && productionOrderDo.getDeliverytime() > 0 && v != null) {
|
|
|
- apsProductionOrderDo.setScheduledeliverydate(DateUtil.offsetHour(v, productionOrderDo.getDeliverytime()));
|
|
|
- }
|
|
|
- // 排程状态更新为待发布
|
|
|
+ }
|
|
|
+ // 更新订单的排程交货期、排程状态
|
|
|
+ if (orderDeliveryTime.size() > 0) {
|
|
|
+ orderDeliveryTime.forEach((k, v) -> {
|
|
|
+ ApsProductionOrderDo productionOrderDo = apsProductionOrderService.getById(k);
|
|
|
+ ApsProductionOrderDo apsProductionOrderDo = new ApsProductionOrderDo();
|
|
|
+ apsProductionOrderDo.setId(k);
|
|
|
+ apsProductionOrderDo.setScheduledeliverydate(v);
|
|
|
+ if (productionOrderDo.getDeliverytime() != null && productionOrderDo.getDeliverytime() > 0 && v != null) {
|
|
|
+ apsProductionOrderDo.setScheduledeliverydate(DateUtil.offsetHour(v, productionOrderDo.getDeliverytime()));
|
|
|
+ }
|
|
|
+ // 排程状态更新为待发布
|
|
|
// apsProductionOrderDo.setSchedulstatus(SCHEDULSTATUS_TORELEASE);
|
|
|
- apsProductionOrderService.updateById(apsProductionOrderDo);
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
+ apsProductionOrderService.updateById(apsProductionOrderDo);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
- backupProcessOperation(apsProcessOperationProcessEquDos, productionScheduleRetVo.getProcesses());
|
|
|
- } catch (Exception e) {
|
|
|
- throw e;
|
|
|
- } finally {
|
|
|
- rLock.unlock();
|
|
|
}
|
|
|
+
|
|
|
+ backupProcessOperation(apsProcessOperationProcessEquDos, productionScheduleRetVo.getProcesses());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -673,6 +641,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
*/
|
|
|
@Override
|
|
|
public ProductionScheduleVo apsPlanModelSet(List<ApsBlankOrderVo> apsBlankOrders) {
|
|
|
+ // 待排程坯料计划ID集合
|
|
|
+ List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
|
|
|
productionScheduleVo.setProductionScheduleId("批量排程");
|
|
|
List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
|
|
@@ -701,6 +671,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
} else {
|
|
|
productionScheduleVo.setApsPlanStartDate(DateUtil.date().offset(DateField.HOUR, a));
|
|
|
}
|
|
|
+ productionScheduleVo.setWashingtime(apsScheduleConfig.getWashingtime());
|
|
|
+ productionScheduleVo.setStandingtime(apsScheduleConfig.getStandingtime());
|
|
|
} else {
|
|
|
throw new CustomException("排程参数缺失");
|
|
|
}
|
|
@@ -761,12 +733,14 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 查询设备锁定的已排程的时间段
|
|
|
List<ApsProcessOperationProcessEquDo> processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
.eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .notIn(ApsProcessOperationProcessEquDo::getBlankid,blankids)
|
|
|
.ge(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
.orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
);
|
|
|
// 查询当前设备最后一个生产任务、连续生产需要考虑使用
|
|
|
List<ApsProcessOperationProcessEquDo> lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
.eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .notIn(ApsProcessOperationProcessEquDo::getBlankid,blankids)
|
|
|
.gt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
.orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
);
|
|
@@ -1051,6 +1025,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
aspCheckItemUse.put(aspCheckItemsDo.getId(), 0);
|
|
|
// 退火炉套筒间隙扣除
|
|
|
if (apsScheduleConfig != null) {
|
|
|
+ if(aspCheckItemsDo.getEquipmentwidth() == null){
|
|
|
+ throw new CustomException("退火炉的宽度没有维护");
|
|
|
+ }
|
|
|
aspCheckItemsDo.setEquipmentwidth(aspCheckItemsDo.getEquipmentwidth().subtract(apsScheduleConfig.getLooseness()));
|
|
|
}
|
|
|
}
|