ソースを参照

Merge remote-tracking branch 'origin/master'

xiahan 1 年間 前
コミット
565a8dfdfb

+ 12 - 0
bs-common/src/main/java/com/rongwei/safecommon/utils/SaveConstans.java

@@ -192,6 +192,10 @@ public class SaveConstans {
          * 作业延期提醒
          */
         public static final String PROCESSDELAY_REMIND = "processdelay";
+        /**
+         * 报工不合格提醒
+         */
+        public static final String REPORTUNQUALIFY_REMIND = "reportunqualify";
     }
 
     public static class NotifyTitle {
@@ -313,6 +317,10 @@ public class SaveConstans {
          * 特种设备提醒
          */
         public static final String SPECIALEQUIPMENT_TITLE="特种设备提醒";
+        /**
+         * 报工不合格提醒
+         */
+        public static final String REPORTUNQUALIFY_TITLE="订单作业报工不合格";
     }
 
     public static class NotifyContent {
@@ -433,6 +441,10 @@ public class SaveConstans {
          * 特种设备提醒内容
          */
         public static final String SPECIALEQUIPMENT_CONTENT="设备类型:【%s】,设备编号:【%s】,设备名称:【%s】,年检日期:【%s】";
+        /**
+         * 报工不合格提醒
+         */
+        public static final String REPORTUNQUALIFY_CONTENT = "报工检验不合格,请及时调整计划,详情参见邮件提醒";
     }
 
     /**

+ 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} and a.ID not in (${hasIds})")
+    List<ApsBlankOrderVo> getOrdersHasNotLockProcess(@Param("hasIds") String hasIds,@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);
 

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

@@ -51,6 +51,18 @@ public interface ApsProductionOrderDao extends BaseMapper<ApsProductionOrderDo>
             "\tleft join aps_blank_order b on b.DELETED='0' and b.ID=p.BLANKID\n" +
             "\twhere e.DELETED='0' and (p.PROCESSSTATUS='30' or p.PROCESSSTATUS='40') and (e.WORKSTATUS='待开工' or e.WORKSTATUS='加工中') and TIMESTAMPDIFF(DAY,DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(e.PLANENDDATE,'%Y-%m-%d'))<0)")
     List<ApsProductionOrderDo> getProcessDelay();
+
+    @Select("select po.ID,po.ORDERNO,po.CUSTOMNAME,po.ORDERDATE,b.ID as AUDITORID,o.OUTPUTNUMBER as AUDITOR,p.PROCESS as CUSTOMORDERNO,o.INSEPCTIONLEVEL as CUSTOMORDERTYPE,\n" +
+            "\to.MAJORDESC as REMARK,o.MINORDESC as OTHERPRECAUTION,po.CREATEUSERID,u.ACCOUNT as CREATEUSERNAME,u.EMAIL as MODIFYUSERNAME\n" +
+            "from aps_report_output o\n" +
+            "left join aps_report_records r on r.DELETED='0' and r.ID=o.MAINID\n" +
+            "left join aps_process_operation p on r.PROCESSOPERATIONID=p.ID and p.DELETED='0'\n" +
+            "left join aps_blank_order b on b.DELETED='0' and p.BLANKID=b.ID\n" +
+            "left join aps_production_order po on po.DELETED='0' and b.PRODUCTIONORDERID=po.ID\n" +
+            "left join sys_user u on po.CREATEUSERID=u.ID and u.DELETED='0'\n" +
+            "where o.DELETED='0' and o.QUALIFIED='否' and TIMESTAMPDIFF(DAY,DATE_FORMAT(r.CHECKDATE,'%Y-%m-%d'),DATE_FORMAT(NOW(),'%Y-%m-%d'))=1\n" +
+            "order by po.ORDERNO,b.ID")
+    List<ApsProductionOrderDo> getReportUnqualify();
 }
 
 

+ 2 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProductionOrderService.java

@@ -28,4 +28,6 @@ public interface ApsProductionOrderService extends IService<ApsProductionOrderDo
     void processDelay();
 
     R deleteOrder(DeleteOrderVo req);
+
+    void reportUnqualify();
 }

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

+ 12 - 7
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationServiceImpl.java

@@ -691,7 +691,11 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
             //遍历查询是否有工序没有对应的设备代号和车间代号
             for (ApsProcessOperationProcessEquDo equDo : list) {
                 //查询工序作业
-                ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationList.stream().filter(item -> item.getId().equals(equDo.getProcessid())).findFirst().get();
+                ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationList.stream().filter(item -> item.getId().equals(equDo.getProcessid())).findFirst().orElse(null);
+
+                if (ObjectUtil.isEmpty(apsProcessOperationDo)) {
+                    return R.error("未找到对应工序作业明细,请检查是否正在排程");
+                }
 
                 //校验设备代号
                 if (ObjectUtil.isNotEmpty(equDo.getProcessdeviceid())) {
@@ -1013,28 +1017,29 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
 
     /**
      * 忽略冲突
+     *
      * @param ids
      * @return
      */
     @Override
     public R cancelConflict(List<String> ids) {
         List<String> collect = ids.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
-        if(collect.isEmpty()){
+        if (collect.isEmpty()) {
             log.error("参数异常");
             return R.error("参数异常");
         }
         List<ApsProcessOperationProcessEquDo> list = apsProcessOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                 .in(ApsProcessOperationProcessEquDo::getProcessid, ids)
                 .eq(BaseDo::getDeleted, "0"));
-        if(list.isEmpty()){
-            log.error("无法根据工序作业ID:{} 获取到工序作业明细",ids);
+        if (list.isEmpty()) {
+            log.error("无法根据工序作业ID:{} 获取到工序作业明细", ids);
             return R.error("无法找到工序作业明细");
         }
-        list.forEach(info->{
+        list.forEach(info -> {
             info.setConflictdes("");
-            if(StringUtils.isBlank(info.getConflictdes()) && StringUtils.isBlank(info.getSoftconflictdes())){
+            if (StringUtils.isBlank(info.getConflictdes()) && StringUtils.isBlank(info.getSoftconflictdes())) {
                 info.setHasconflict(LOCKMARK_N);
-            }else{
+            } else {
                 info.setHasconflict(LOCKMARK_Y);
             }
         });

+ 59 - 4
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java

@@ -12,6 +12,7 @@ import com.rongwei.bscommon.sys.utils.ApsUtils;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.BaseDo;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.rwcommon.vo.MailDo;
@@ -24,12 +25,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.rongwei.safecommon.utils.SaveConstans.DatePattern.DATE_PATTERN_YMD;
 import static com.rongwei.safecommon.utils.SaveConstans.NotifyContent.*;
 import static com.rongwei.safecommon.utils.SaveConstans.NotifyTitle.*;
 import static com.rongwei.safecommon.utils.SaveConstans.NotifyType.*;
@@ -431,6 +430,62 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         }
     }
 
+    /*
+    报工不合格提醒
+     */
+    @Override
+    public void reportUnqualify() {
+        log.info("报工不合格提醒开始");
+        List<ApsProductionOrderDo> apsProductionOrderDos = this.baseMapper.getReportUnqualify();
+        if (apsProductionOrderDos.isEmpty()) {
+            return;
+        }
+        //所有的坯料计划id
+        List<String> blankIds = apsProductionOrderDos.stream().map(ApsProductionOrderDo::getAuditorid).distinct().collect(Collectors.toList());
+        //坯料输出成品
+        List<ApsProcessOutputProductDo> apsProcessOutputProductDos = apsProcessOutputProductService.list(new LambdaQueryWrapper<ApsProcessOutputProductDo>()
+                .in(ApsProcessOutputProductDo::getBlankid, blankIds)
+                .eq(BaseDo::getDeleted, "0")
+                .orderByDesc(ApsProcessOutputProductDo::getModifydate));
+
+        //按照订单分组
+        Map<String, List<ApsProductionOrderDo>> orderList = apsProductionOrderDos.stream().collect(Collectors.groupingBy(e -> e.getId()));
+        final String[] content = {""};
+        orderList.forEach((k, olist) -> {
+            //系统通知(移动端和PC端个人工作台)
+            CXCommonUtils.sendNotify(REPORTUNQUALIFY_TITLE, REPORTUNQUALIFY_CONTENT, null, Arrays.asList(olist.get(0).getCreateuserid().split(",")), k, REPORTUNQUALIFY_REMIND, false);
+
+            //邮件内容
+            content[0] = "<div>报工检验不合格,请及时调整计划</div>" +
+                    "<div>客户【" + olist.get(0).getCustomname() + "】【" + DateUtil.format(olist.get(0).getOrderdate(), DATE_PATTERN_YMD) + "】的订单【" + olist.get(0).getOrderno() + "】</div>";
+            //按照坯料计划分组
+            Map<String, List<ApsProductionOrderDo>> blankList = olist.stream().collect(Collectors.groupingBy(o -> o.getAuditorid()));
+            blankList.forEach((b, blist) -> {
+                List<ApsProcessOutputProductDo> apsProcessOutputProductDoList = apsProcessOutputProductDos.stream().filter(out -> out.getBlankid().equals(b)).collect(Collectors.toList());
+                for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
+                    content[0] += "<div>产品【" + apsProcessOutputProductDo.getProductname() + "】</div>";
+                }
+            });
+
+            for (ApsProductionOrderDo apsProductionOrderDo : olist) {
+                content[0] += "<div>批次号【" + apsProductionOrderDo.getAuditor() + "】工序【" + apsProductionOrderDo.getCustomorderno() + "】检验等级【" + apsProductionOrderDo.getCustomordertype() + "】</div>";
+                content[0] += "<div>主要缺陷【" + (apsProductionOrderDo.getRemark() == null ? "" : apsProductionOrderDo.getRemark()) + "】</div>";
+                content[0] += "<div>次要缺陷【" + (apsProductionOrderDo.getOtherprecaution() == null ? "" : apsProductionOrderDo.getOtherprecaution()) + "】</div>";
+            }
+
+            //邮件提醒
+            if (StringUtils.isNotEmpty(olist.get(0).getModifyusername())) {
+                MailDo mailDo = new MailDo();
+                mailDo.setReceiveEmail(olist.get(0).getModifyusername().split(","));
+                mailDo.setNeedTransReceive(false);
+                mailDo.setCcEmail(new String[]{});
+                mailDo.setSubject(REPORTUNQUALIFY_TITLE);
+                mailDo.setContent(content[0]);
+                autoCommonFeginClient.sendHtmlMail(mailDo);
+            }
+        });
+    }
+
 }
 
 

+ 9 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportOutputServiceImpl.java

@@ -62,6 +62,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setMainid(req.getMainId());
                         apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
                         apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        apsReportOutputDo.setLevel(req.getLevel());
                         //生成批次号
                         SysSerialVo vo = new SysSerialVo();
                         vo.setModulecode("aps_report_output_" + req.getDeviceId());
@@ -93,6 +94,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setMainid(req.getMainId());
                         apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
                         apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        apsReportOutputDo.setLevel(req.getLevel());
                         //生成批次号
                         String code = req.getMark() + req.getYearCode() + req.getMonthCode() + req.getEquipmentCode() + req.getHeatNumber() + i;
                         apsReportOutputDo.setOutputnumber(code);
@@ -116,6 +118,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                 apsReportOutputDo.setOutputid(list.get(0).getId());
                 apsReportOutputDo.setOutputmaterial(list.get(0).getOutputmaterial());
                 apsReportOutputDo.setOutputnumber(req.getInputBatchNumber());
+                apsReportOutputDo.setLevel(req.getLevel());
                 JSONObject json = new JSONObject();
                 json.put("batchNumber", req.getInputBatchNumber());
                 //生成二维码
@@ -132,11 +135,12 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setMainid(req.getMainId());
                         apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
                         apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        apsReportOutputDo.setLevel(req.getLevel());
                         //生成批次号
                         //生成批次号
                         SysSerialVo vo = new SysSerialVo();
                         vo.setModulecode("aps_report_output_" + req.getInputBatchNumber().split("-")[0]);
-                        vo.setRuleTemplateStr(req.getInputBatchNumber().split("-")[0] + "-" + req.getCodeRule());
+                        vo.setRuleTemplateStr(req.getInputBatchNumber().split("-")[0] + "-" + "@{serialNumber:#00}");
                         vo.setResetrule("date:yyyyMM");
                         vo.setIfautomaticreset("y");
                         vo.setInitValue(0L);
@@ -197,6 +201,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
                         apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
                         apsReportOutputDo.setId(SecurityUtil.getUUID());
+                        apsReportOutputDo.setLevel(req.getLevel());
                         resList.add(apsReportOutputDo);
                     }
                 }
@@ -211,6 +216,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setMainid(req.getMainId());
                         apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
                         apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        apsReportOutputDo.setLevel(req.getLevel());
                         resList.add(apsReportOutputDo);
                     }
                 }
@@ -225,6 +231,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                 apsReportOutputDo.setMainid(req.getMainId());
                 apsReportOutputDo.setOutputid(list.get(0).getId());
                 apsReportOutputDo.setOutputmaterial(list.get(0).getOutputmaterial());
+                apsReportOutputDo.setLevel(req.getLevel());
                 resList.add(apsReportOutputDo);
             } else {//输出物料数量>1,或者单卷输出数量>1
                 for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : list) {
@@ -237,6 +244,7 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
                         apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
                         apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
                         apsReportOutputDo.setId(SecurityUtil.getUUID());
+                        apsReportOutputDo.setLevel(req.getLevel());
                         resList.add(apsReportOutputDo);
                     }
                 }

+ 2 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java

@@ -264,6 +264,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         req2.setIfBlankProcess(apsProcessOperationDo.getIfblankprocess());
         req2.setBlankType(apsBlankOrderDo.getBlanktype());
         req2.setMainId(apsReportRecordsDo.getId());
+        req2.setLevel(apsProcessOperationDo.getLevel());
         R r = apsReportOutputService.insertMyReportOutputWithOutBatchNumber(req2);
         if (!r.getCode().equals("200")) {
             return R.error(r.getMsg());
@@ -463,6 +464,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         insertMyReportOutputReq.setHeatNumber(heatNumber);
         insertMyReportOutputReq.setInputBatchNumber(apsReportRecordsDo.getBatchnumber());
         insertMyReportOutputReq.setBlankType(apsBlankOrderDo.getBlanktype());
+        insertMyReportOutputReq.setLevel(apsProcessOperationDo.getLevel());
 
         R r = apsReportOutputService.insertMyReportOutput(insertMyReportOutputReq);
         if (!r.getCode().equals("200")) {

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsReportOutputDo.java

@@ -140,6 +140,11 @@ public class ApsReportOutputDo extends BaseDo implements Serializable {
      */
     private String minordesc;
 
+    /**
+     * 对应工序作业的排序
+     */
+    private Integer level;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/InsertMyReportOutputReq.java

@@ -68,4 +68,9 @@ public class InsertMyReportOutputReq {
      */
     private String inputBatchNumber;
 
+    /**
+     * 工序作业的排序
+     */
+    private Integer level;
+
 }

+ 8 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductionOrderController.java

@@ -98,4 +98,12 @@ public class ApsProductionOrderController {
     public R deleteOrder(@RequestBody DeleteOrderVo req){
         return apsProductionOrderService.deleteOrder(req);
     }
+
+    /*
+    报工不合格提醒
+     */
+    @PostMapping("/reportUnqualify")
+    public void reportUnqualify() {
+        apsProductionOrderService.reportUnqualify();
+    }
 }

+ 2 - 2
cx-equipment/cx-equipment-common/src/main/java/com/rongwei/bscommon/sys/service/impl/EquipmentSendNotifyServiceImpl.java

@@ -167,8 +167,8 @@ public class EquipmentSendNotifyServiceImpl implements EquipmentSendNotifyServic
                 maintenanceTaskDo.getMaintenancesite(), simpleDateFormat.format(maintenanceTaskDo.getTaskendtime()), maintenanceTaskDo.getPrincipal(),
                 maintenanceTaskDo.getOtherengineers());
 
-        // 删除提醒
-        CXCommonUtils.deleteSendNotify("maintain", id);
+        // 删除提醒 走前端
+//        CXCommonUtils.deleteSendNotify("maintain", id);
 
         CXCommonUtils.sendNotify(ACCEPTANCE_SYSTEM_TITLE, context, null, userId.stream().distinct().collect(Collectors.toList()),
                 maintenanceTaskDo.getId(), ACCEPTMAINTAINTASK, false);