|
@@ -26,6 +26,8 @@ import com.rongwei.rwcommon.utils.SecurityUtil;
|
|
|
import com.rongwei.rwcommon.utils.StringUtils;
|
|
|
import com.rongwei.safecommon.utils.CXCommonUtils;
|
|
|
import com.rongwei.safecommon.utils.SaveConstans;
|
|
|
+import org.redisson.api.RLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -37,6 +39,7 @@ import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.time.ZoneId;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.rongwei.bscommon.sys.service.impl.ApsProductionOrderServiceImpl.ERROR_MSG;
|
|
@@ -94,6 +97,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
private ApsProcessOperationEquService apsProcessOperationEquService;
|
|
|
@Autowired
|
|
|
private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
|
|
|
|
|
|
@Override
|
|
@@ -478,140 +483,153 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
// 当前等路人所属工厂
|
|
|
SysUserVo currentUser = CXCommonUtils.getCurrentUser();
|
|
|
String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
|
|
|
- assert apsBlankOrders != null : "排程订单不能为空";
|
|
|
- // 合并待发布未锁定的订单一起排程
|
|
|
- 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);
|
|
|
- if (fbNotLock != null && fbNotLock.size() > 0) {
|
|
|
- apsBlankOrders.addAll(fbNotLock);
|
|
|
+ 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);
|
|
|
+ if (fbNotLock != null && fbNotLock.size() > 0) {
|
|
|
+ apsBlankOrders.addAll(fbNotLock);
|
|
|
+ }
|
|
|
|
|
|
- // 先删除所有作业的明细
|
|
|
- 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) {
|
|
|
- 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) -> {
|
|
|
+ // 先删除所有作业的明细
|
|
|
+ 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) {
|
|
|
ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
|
|
|
apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
|
|
|
- apsProcessOperationProcessEqu.setProcessid(k);
|
|
|
- apsProcessOperationProcessEqu.setBlankid(v.get(0).getBlankid());
|
|
|
+ apsProcessOperationProcessEqu.setProcessid(process.getId());
|
|
|
+ apsProcessOperationProcessEqu.setBlankid(process.getProduceOrder().get(0).getId());
|
|
|
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(v.size());
|
|
|
+ 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(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) {
|
|
|
+ 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);
|
|
|
}
|
|
|
- } 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());
|
|
|
}
|
|
|
|
|
|
/**
|