Преглед изворни кода

排程按照所属工厂加锁

fangpy пре 1 година
родитељ
комит
30dd53d4b9

+ 4 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsBlankOrderDao.java

@@ -42,6 +42,10 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
             "where b.PRODUCTIONSTATUS='20' and (a.LOCKMARK='n' or a.LOCKMARK is null) and a.DELETED='0' and b.DELETED='0' and b.TENANTID = #{tenantId}")
     List<ApsBlankOrderVo> getNotLockOrders(@Param("tenantId") String tenantId);
 
+    @Select("select DISTINCT a.*,c.DELIVERYDATE,c.DELIVERYTIME from aps_blank_order a LEFT JOIN aps_process_operation b on a.ID=b.BLANKID LEFT JOIN aps_production_order c on a.PRODUCTIONORDERID=c.ID\n" +
+            "where a.DELETED='0' and b.DELETED='0' and c.DELETED='0' and (b.LOCKMARK='n' OR b.LOCKMARK is null) and c.TENANTID = #{tenantId}")
+    List<ApsBlankOrderVo> getOrdersHasNotLockProcess(@Param("tenantId") String tenantId);
+
     @Update("update aps_blank_order set CRAFTROUTEID = #{craftrouteid} where ID=#{blankId} ")
     void upCraftrouteId(@Param("blankId") String blankId, @Param("craftrouteid") String craftrouteid);
 

+ 126 - 108
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java

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