Browse Source

Merge remote-tracking branch 'origin/mode-min-unit' into mode-min-unit

fangpy 10 months ago
parent
commit
9bca62fe72
21 changed files with 549 additions and 85 deletions
  1. 16 0
      bs-common/src/main/java/com/rongwei/safecommon/utils/SaveConstans.java
  2. 84 46
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  3. 6 5
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java
  4. 15 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  5. 15 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/ApsUtils.java
  6. 34 23
      cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml
  7. 18 1
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SrmIssuesListDao.java
  8. 14 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SysNotifyAnnounceDao.java
  9. 9 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SysNotifyAnnounceUserDao.java
  10. 2 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/SrmIssuesListService.java
  11. 3 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ExportServiceImpl.java
  12. 226 3
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/impl/SrmIssuesListServiceImpl.java
  13. 16 0
      cx-question/cx-question-entity/src/main/java/com/rongwei/bsentity/domin/SrmIssuesListDo.java
  14. 44 0
      cx-question/cx-question-entity/src/main/java/com/rongwei/bsentity/vo/SrmIssuesListVo.java
  15. 42 0
      cx-question/cx-question-server/src/main/java/com/rongwei/businessServer/controller/SrmIssuesListController.java
  16. BIN
      cx-question/cx-question-server/src/main/resources/template/ProblemTrackingAndResolution.docx
  17. 1 1
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/AspSafeAttachmentsServiceImpl.java
  18. 1 1
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/AspSpecialEquipmentCertificateServiceImpl.java
  19. 1 1
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/CheckItemsServiceImpl.java
  20. 1 1
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/SpecialCertificateUrgingServiceImpl.java
  21. 1 1
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/SpecialEquipmentUrgingServiceImpl.java

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

@@ -931,4 +931,20 @@ public class SaveConstans {
         public static final String ALUMINUM_PLATE = "铝板";
         public static final String ALUMINUM_INGOT = "铝锭";
     }
+
+    /**
+     * 生产问题管理 消息提醒
+     */
+    public static class IssuesListNotice {
+
+        public static final String ISSUES_NOTICE_NOTIFYTYPE= "question-notify";
+        public static final String ISSUES_NOTICE_NOTIFYTITLE= "流程催办通知";
+        public static final String ISSUES_NOTICE_SENDERID= "8672bf72ab274bec83052868ae336b38";
+        public static final String ISSUES_UNREAD_STATUS= "2";  // 未读
+        public static final String ISSUES_READ_STATUS= "1";  // 已读
+        public static final String ISSUES_REMARK_OLD ="old"; //提醒前缀标识
+        public static final String ISSUES_REMARK_NEW ="new";
+
+        public static final String ISSUES_EMAIL_TITLE ="生产问题审批超时提醒";
+    }
 }

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

@@ -46,6 +46,7 @@ import java.util.stream.Collectors;
 
 import static com.rongwei.bscommon.sys.service.impl.ApsProductionOrderServiceImpl.ERROR_MSG;
 import static com.rongwei.bscommon.sys.utils.ApsUtils.addNewConflictsDesc;
+import static com.rongwei.bscommon.sys.utils.ApsUtils.removeConflictsDesc;
 import static com.rongwei.safecommon.utils.SaveConstans.ForcedConflictsDescription.EXCEEDING_THE_PROMISED_DELIVERY_DEADLINE;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_N;
 import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_Y;
@@ -2059,17 +2060,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     }
 
     public R checkBlankOrder(CheckAndSaveOrUpdateBlankReq req, int j) {
+        //获取坯料计划内容
+        ApsBlankOrderDo apsBlankOrderDo = req.getApsBlankOrderDo();
 
         //校验坯料计划的必填项
         R checkRes = checkBlankMustWrite(req);
         if (!checkRes.getCode().equals("200")) {
-            return R.error("第" + j + "个坯料计划 " + checkRes.getMsg());
+            return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " " + checkRes.getMsg());
         }
 
         //获取校验等级
         Integer checkLevel = req.getCheckLevel();
-        //获取坯料计划内容
-        ApsBlankOrderDo apsBlankOrderDo = req.getApsBlankOrderDo();
+
         //获取当前用户信息
         //获取当前用户的所属工厂
         SysUserVo currentUser = CXCommonUtils.getCurrentUser();
@@ -2081,7 +2083,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         if (ObjectUtil.isNotEmpty(apsBlankOrderDo.getBlankappearance())
                 && Arrays.asList(SaveConstans.BlankAppearanceType.ALUMINUM_PLATE, SaveConstans.BlankAppearanceType.ALUMINUM_INGOT).contains(apsBlankOrderDo.getBlankappearance())
                 && ObjectUtil.isEmpty(apsBlankOrderDo.getProlength())) {
-            return R.error("第" + j + "个坯料计划 坯料是铝板和铝锭时长度必填");
+            return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 坯料是铝板和铝锭时长度必填");
         }
 //        //如果坯料产品类型对应产品外观类型是铝板或板锭,并且坯料长度为空,则提示:坯料是铝板和板锭时长度必填
 //        if (ObjectUtil.isNotEmpty(apsBlankOrderDo.getProducttypeid())) {
@@ -2091,7 +2093,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 //            if (ObjectUtil.isNotEmpty(pid) && (pid.equals(SaveConstans.ProductionType.BANDING_ID) || pid.equals(SaveConstans.ProductionType.LVBAN_ID))) {
 //                //坯料长度为空
 //                if (ObjectUtil.isEmpty(apsBlankOrderDo.getProlength())) {
-//                    return R.error("第" + j + "个坯料计划 坯料是铝板和板锭时长度必填");
+//                    return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 坯料是铝板和板锭时长度必填");
 //                }
 //            }
 //        }
@@ -2108,13 +2110,13 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     return R.error("请填写所有坯料计划的承诺交货期");
                 }
                 if (ObjectUtil.isEmpty(apsBlankOrderDo.getScheduledateend())) {
-                    return R.error("第" + j + "个坯料计划 排程交货期-止不能为空");
+                    return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 排程交货期-止不能为空");
                 }
                 if (apsBlankOrderDo.getPromisedatestart().compareTo(apsBlankOrderDo.getScheduledatestart()) < 0) {
-                    return R.error("第" + j + "个坯料计划的承诺交货期-起不能早于排程交货期-起" + DateUtil.format(apsBlankOrderDo.getScheduledatestart(), "yyyy-MM-dd"));
+                    return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + "的承诺交货期-起不能早于排程交货期-起" + DateUtil.format(apsBlankOrderDo.getScheduledatestart(), "yyyy-MM-dd"));
                 }
                 if (apsBlankOrderDo.getPromisedateend().compareTo(apsBlankOrderDo.getScheduledateend()) < 0) {
-                    return R.error("第" + j + "个坯料计划的承诺交货期-止不能早于排程交货期-止" + DateUtil.format(apsBlankOrderDo.getScheduledateend(), "yyyy-MM-dd"));
+                    return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + "的承诺交货期-止不能早于排程交货期-止" + DateUtil.format(apsBlankOrderDo.getScheduledateend(), "yyyy-MM-dd"));
                 }
             }
         }
@@ -2152,7 +2154,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
 
             } else {
-                return R.error("第" + j + "个坯料计划 工艺路线没有输出成品");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 工艺路线没有输出成品");
             }
         }
 
@@ -2175,10 +2177,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 //                            //如果输出单卷重<单卷重(起)或 输出单卷重>单卷重(止),错误提示:输出成品:{订单产品} 输出单卷重不符合订单要求
 //                            if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
 //                                    || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
-//                                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
+//                                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
 //                            }
                         } else {//如果对应订单产品明细的订单产品字段值不等于输出成品的订单产品字段值,错误提示:输出成品:{订单产品} 对应订单产品已修改或已删除,请重新选择订单产品
-                            return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
+                            return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                         }
                         break;
                     }
@@ -2214,10 +2216,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 //                    }
                     //输出单卷重>坯料单卷重
                     if (outputWeight.compareTo(blankWeight) > 0) {
-                        return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不能超过坯料单卷重");
+                        return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不能超过坯料单卷重");
                     }
                 } else {//不存在对应的产品明细
-                    return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
+                    return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                 }
             }
         }
@@ -2231,18 +2233,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     haveProductDetail = true;
                     //计划输出订单重量 > 对应订单产品订单总数量;错误提示:输出成品 {订单产品} 计划输出订单重量 不能大于 订单总数量
 //                    if (apsProcessOutputProductDo.getPlanoutputonerollweight().compareTo(apsProductDetailDo.getTotalordercount()) > 0) {
-//                        return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 计划输出订单重量 不能大于 订单总数量");
+//                        return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 计划输出订单重量 不能大于 订单总数量");
 //                    }
                 }
             }
             if (!haveProductDetail && apsProcessOutputProductDo.getPlanoutputonerollweight().compareTo(new BigDecimal(0)) > 0) {
-                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 已修改或已删除,并已开工,计划输出订单重量 不能大于 0");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 已修改或已删除,并已开工,计划输出订单重量 不能大于 0");
             }
 
             //如果输出卷数不是坯料卷数的倍数,错误提示:“输出成品:{订单产品}输出卷数必须是坏料卷数的倍数”
             if (ObjectUtil.isNotEmpty(apsProcessOutputProductDo.getPlanoutputorderroll()) && ObjectUtil.isNotEmpty(apsBlankOrderDo.getRollnum())) {
                 if (apsProcessOutputProductDo.getPlanoutputorderroll() % apsBlankOrderDo.getRollnum() != 0) {
-                    return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出卷数必须是坯料卷数的倍数");
+                    return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出卷数必须是坯料卷数的倍数");
                 }
             }
 
@@ -2250,7 +2252,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             if (ObjectUtil.isNotEmpty(apsProcessOutputProductDo.getBlankappearance())
                     && Arrays.asList(SaveConstans.BlankAppearanceType.ALUMINUM_PLATE, SaveConstans.BlankAppearanceType.ALUMINUM_INGOT).contains(apsProcessOutputProductDo.getBlankappearance())
                     && ObjectUtil.isEmpty(apsProcessOutputProductDo.getProlength())) {
-                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 是板锭和铝板时长度必填");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 是板锭和铝板时长度必填");
             }
         }
 
@@ -2262,10 +2264,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
          */
         for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
             if (!apsProcessOutputProductDo.getBlanktype().equals(apsBlankOrderDo.getBlanktype())) {
-                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 坯料类型" + apsBlankOrderDo.getBlanktype() + "与订单产品的技术要求的坯料类型" + apsProcessOutputProductDo.getBlanktype() + "不同,不可作为该坯料的输出成品");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 坯料类型" + apsBlankOrderDo.getBlanktype() + "与订单产品的技术要求的坯料类型" + apsProcessOutputProductDo.getBlanktype() + "不同,不可作为该坯料的输出成品");
             }
             if (!apsProcessOutputProductDo.getBlankproducttype().equals(apsBlankOrderDo.getProducttype())) {
-                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 坯料需求的产品类型" + apsBlankOrderDo.getProducttype() + "与订单产品的技术要求的坯料产品类型" + apsProcessOutputProductDo.getBlankproducttype() + "不同,不可作为该坯料的输出成品");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 输出成品:" + apsProcessOutputProductDo.getProductname() + " 坯料需求的产品类型" + apsBlankOrderDo.getProducttype() + "与订单产品的技术要求的坯料产品类型" + apsProcessOutputProductDo.getBlankproducttype() + "不同,不可作为该坯料的输出成品");
             }
         }
 
@@ -2292,7 +2294,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         }
         if (endCheckOutputDesList.size() > 0) {
             String join = String.join(",", endCheckOutputDesList);
-            return R.error("第" + j + "个坯料计划 以下坯料输出成品重复:" + join);
+            return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 以下坯料输出成品重复:" + join);
         }
 
         //如果坯料输出成品的计划输出订单重量合计>坯料的总重量,错误提示:坯料输出成品的计划输出订单重量合计不能大于坯料的总重量
@@ -2305,14 +2307,14 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         //坯料的总重量
         BigDecimal totalweight = apsBlankOrderDo.getTotalweight();
         if (planAll.compareTo(totalweight) > 0) {//如果坯料输出成品的计划输出订单重量合计>坯料的总重量
-            return R.error("第" + j + "个坯料计划 坯料输出成品的计划输出订单重量合计不能大于坯料的总重量");
+            return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 坯料输出成品的计划输出订单重量合计不能大于坯料的总重量");
         }
 
 
         //提交工艺路线的校验
         if (checkLevel == 2) {
             if (!apsBlankOrderDo.getBlankoutmaterspecification().equals(apsBlankOrderDo.getProcessoutmaterspecification())) {
-                return R.error("第" + j + "个坯料计划 工艺路线输出物料规格" + apsBlankOrderDo.getProcessoutmaterspecification() + "与坯料输出物料规格" + apsBlankOrderDo.getBlankoutmaterspecification() + "不一致");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 工艺路线输出物料规格" + apsBlankOrderDo.getProcessoutmaterspecification() + "与坯料输出物料规格" + apsBlankOrderDo.getBlankoutmaterspecification() + "不一致");
             }
         }
 
@@ -2321,7 +2323,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             //============校验工艺路线=============
             //如果坯料需求的坯料输出成品字段值不等于坯料需求的工艺输出成品字段值,错误提示:工艺路线输出成品与坯料输出成品不一致
             if (!apsBlankOrderDo.getOutputfinishproduct().equals(apsBlankOrderDo.getOutputmaterial())) {
-                return R.error("第" + j + "个坯料计划 工艺路线输出成品" + apsBlankOrderDo.getOutputmaterial() + "与坯料输出成品" + apsBlankOrderDo.getOutputfinishproduct() + "不一致");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 工艺路线输出成品" + apsBlankOrderDo.getOutputmaterial() + "与坯料输出成品" + apsBlankOrderDo.getOutputfinishproduct() + "不一致");
             }
         }
         if (checkLevel == 2 || checkLevel == 3) {
@@ -2334,7 +2336,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     //没有前道工序作业ID
                     if (ObjectUtil.isEmpty(processOperationDo.getPreviousprocessid())) {
                         if (processOperationDo.getIfblankprocess().equals("是")) {
-                            return R.error("第" + j + "个坯料计划 备料工艺路线首道工序作业不应该包含坯料工序:" + processOperationDo.getProcess());
+                            return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 备料工艺路线首道工序作业不应该包含坯料工序:" + processOperationDo.getProcess());
                         }
                         break;
                     }
@@ -2346,7 +2348,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         if (checkLevel == 2) {
             List<ApsProcessOperationDo> processOperationDos = apsProcessOperationService.list(new QueryWrapper<ApsProcessOperationDo>().lambda().eq(ApsProcessOperationDo::getBlankid, apsBlankOrderDo.getId()));
             if (processOperationDos.size() <= 0) {
-                return R.error("第" + j + "个坯料计划 请选择工艺路线");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 请选择工艺路线");
             }
         }
 
@@ -2359,7 +2361,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
             R r = apsProcessOperationService.checkOperation(params);
             if (!(r.getCode().equals("200"))) {
-                return R.error("第" + j + "个坯料计划 " + r.getMsg());
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " " + r.getMsg());
             }
         }
         return R.ok();
@@ -2711,10 +2713,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             apsBlankOrderDo = this.getById(id);
         }
         if (apsBlankOrderDo == null) {
-            log.error("无法获取到坯料计划信息");
+            logger.error("无法获取到坯料计划信息");
             throw new CustomException("无法获取到坯料计划信息");
         }
+        logger.debug("开始更新坯料计划:{}对应的交货期没", apsBlankOrderDo.getId());
         List<UpdateBlankDeliveryDateVo> blankDeliveryDate = this.getBaseMapper().getBlankDeliveryDate(apsBlankOrderDo.getId());
+        logger.debug("获取当前坯料计划的相关的计划完工时间:{}",blankDeliveryDate);
         if (blankDeliveryDate.isEmpty()) {
             return;
         }
@@ -2725,38 +2729,72 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         Date startDate = timeAddHour(blankDeliveryDate.get(0).getPlanenddate(), blankDeliveryDate.get(0).getDeliverytime());
         //排程交货期-止
         Date endDate = timeAddHour(blankDeliveryDate.get(1).getPlanenddate(), blankDeliveryDate.get(0).getDeliverytime());
+        logger.debug("坯料计划新的排程交货期为:{}-{},旧的为{}-{}", startDate, endDate, apsBlankOrderDo.getScheduledatestart(),
+                apsBlankOrderDo.getScheduledateend());
+        Date newStartDate = apsBlankOrderDo.getPromisedatestart();
+        Date newEndDate = apsBlankOrderDo.getPromisedateend();
+        if (newStartDate == null) {
+            newStartDate = timeAddHour(startDate, 48);
+        }
+        if (newEndDate == null) {
+            newEndDate = timeAddHour(endDate, 48);
+        }
         // 更新数据
         this.update(new LambdaUpdateWrapper<ApsBlankOrderDo>().eq(ApsBlankOrderDo::getId, apsBlankOrderDo.getId())
                 .set(BaseDo::getDeleted, 0)
                 .set(ApsBlankOrderDo::getScheduledatestart, startDate)
-                .set(ApsBlankOrderDo::getScheduledateend, startDate)
-                .set(apsBlankOrderDo.getPromisedatestart() == null, ApsBlankOrderDo::getPromisedatestart, timeAddHour(startDate, 48))
-                .set(apsBlankOrderDo.getPromisedateend() == null, ApsBlankOrderDo::getPromisedateend, timeAddHour(endDate, 48)));
-        apsBlankOrderDo.setPromisedatestart(timeAddHour(startDate, 48));
-        apsBlankOrderDo.setPromisedateend(timeAddHour(endDate, 48));
+                .set(ApsBlankOrderDo::getScheduledateend, endDate)
+                .set(ApsBlankOrderDo::getPromisedatestart, newStartDate)
+                .set(ApsBlankOrderDo::getPromisedateend, newEndDate));
+        logger.debug("坯料计划新的承诺交货日期:{}-{},旧的为{}-{}", newStartDate,newEndDate,
+                apsBlankOrderDo.getPromisedatestart(), apsBlankOrderDo.getPromisedateend());
+
+
         List<String> updateIds = new ArrayList<>();
-        if (startDate.compareTo(apsBlankOrderDo.getPromisedatestart()) > 0) {
+        List<String> removeIds = new ArrayList<>();
+        if (startDate.compareTo(newStartDate) > 0) {
             updateIds.add(blankDeliveryDate.get(0).getId());
+        }else{
+            removeIds.add(blankDeliveryDate.get(0).getId());
         }
-        if (endDate.compareTo(apsBlankOrderDo.getPromisedateend()) > 0) {
+        if (endDate.compareTo(newEndDate) > 0) {
             updateIds.add(blankDeliveryDate.get(1).getId());
+        }else{
+            removeIds.add(blankDeliveryDate.get(1).getId());
         }
-        if (updateIds.isEmpty()) {
-            return;
+
+        if (!updateIds.isEmpty()) {
+            List<ApsProcessOperationProcessEquDo> equDos = apsProcessOperationProcessEquService.getBaseMapper().selectBatchIds(updateIds);
+            logger.debug("记录冲突信息超出承诺交货期:{}", equDos);
+            equDos.forEach(data -> {
+                data.setConflictdes(addNewConflictsDesc(data.getConflictdes(), EXCEEDING_THE_PROMISED_DELIVERY_DEADLINE));
+                if (StringUtils.isBlank(data.getConflictdes()) && StringUtils.isBlank(data.getSoftconflictdes())) {
+                    data.setHasconflict("n");
+                } else {
+                    data.setHasconflict("y");
+                }
+            });
+            if (!equDos.isEmpty()) {
+                apsProcessOperationProcessEquService.updateBatchById(equDos);
+            }
         }
-        List<ApsProcessOperationProcessEquBackupDo> equBackupDos = apsProcessOperationProcessEquBackupDao.selectBatchIds(updateIds);
-        equBackupDos.forEach(data -> {
-            data.setConflictdes(addNewConflictsDesc(data.getConflictdes(), EXCEEDING_THE_PROMISED_DELIVERY_DEADLINE));
-            if (StringUtils.isBlank(data.getConflictdes()) && StringUtils.isBlank(data.getSoftconflictdes())) {
-                data.setHasconflict("n");
-            } else {
-                data.setHasconflict("y");
+        if(!removeIds.isEmpty()){
+            List<ApsProcessOperationProcessEquDo> equDos = apsProcessOperationProcessEquService.getBaseMapper().selectBatchIds(removeIds);
+            logger.debug("记录冲突信息超出承诺交货期:{}", equDos);
+            equDos.forEach(data -> {
+                data.setConflictdes(removeConflictsDesc(data.getConflictdes(), EXCEEDING_THE_PROMISED_DELIVERY_DEADLINE));
+                if (StringUtils.isBlank(data.getConflictdes()) && StringUtils.isBlank(data.getSoftconflictdes())) {
+                    data.setHasconflict("n");
+                } else {
+                    data.setHasconflict("y");
+                }
+            });
+            if (!equDos.isEmpty()) {
+                apsProcessOperationProcessEquService.updateBatchById(equDos);
             }
-        });
-        if (!equBackupDos.isEmpty()) {
-            apsProcessOperationProcessEquBackupService.updateBatchById(equBackupDos);
         }
 
+
     }
 
     public Date timeAddHour(Date date, int hour) {

+ 6 - 5
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -303,7 +303,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 .map(ApsProcessOperationProcessEquDo::getPlanstartdate).min(Comparator.naturalOrder());
         // 获取开工时间间隔=所选作业明细最早计划开工时间-所选加工开始时间
         long timeInterval = minDate.get().getTime() - changingWiresVos.get(0).getProcessingTime().getTime();
-
+        Set<String> blankIds = new HashSet<>();
         // 是否需要清空备份
         AtomicReference<Boolean> emptyBackup = new AtomicReference<>(false);
         List<CheckConflictVo> checkConflictVos = new ArrayList<>();
@@ -331,7 +331,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 log.debug("该工序作业明细:{}已全部报工无需换线", processEqus.getId());
                 continue;
             }
-
+            blankIds.add(processEqus.getBlankid());
             // 获取该工序作业最早的计划开始时间
             Date planstartdate = processEqus.getPlanstartdate();
             Date planenddate = processEqus.getPlanenddate();
@@ -446,8 +446,6 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 }
                 saveList.add(processEqus);
             }
-            // 更新坯料交货期
-            apsBlankOrderService.updateBlankDeliveryDate(null, apsProcessOperationDo.getBlankid());
         }
         // 换线拆单后 需要校验 是否存在冲突 如果存在冲突 提示
 //        if (!checkConflictVos.isEmpty()) {
@@ -478,7 +476,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                         apsProcessOperationProcessEquDo.getPlanenddate());
             });
         }
-
+        blankIds.forEach(data->{
+            // 更新坯料交货期
+            apsBlankOrderService.updateBlankDeliveryDate(null, data);
+        });
         // 重新获取甘特图数据并返回前段
         return R.ok(ganttService.getListById(affectedIdList.stream().distinct().collect(Collectors.toList())));
     }

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

@@ -1,6 +1,7 @@
 package com.rongwei.bscommon.sys.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -23,7 +24,9 @@ import com.rongwei.rwcommonentity.commonservers.domain.SysMindMappingDo;
 import com.rongwei.safecommon.fegin.CXCommonFeginClient;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
+import com.rongwei.wfentity.sys.ProcessInstDo;
 import com.rongwei.wfentity.sys.RunTaskDo;
+import com.rongwei.wfserver.wfcommon.sys.service.ProcessInstService;
 import com.rongwei.wfserver.wfcommon.sys.service.RunTaskService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -111,6 +114,8 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
     private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
     @Autowired
     private RunTaskService runTaskService;
+    @Autowired
+    private ProcessInstService processInstService;
 
 
     public static final String ERROR_MSG = "%s上诉订单的排程交货期大于承诺交货期";
@@ -205,7 +210,7 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         if (checkLevel == 3) {
             for (int i = 0; i < apsBlankOrderDoList.size(); i++) {
                 if (apsBlankOrderDoList.get(i).getIsstag().equals("是")) {
-                    return R.error("第" + (i + 1) + "个坯料计划还未提交,请先提交坯料计划再提交订单");
+                    return R.error("坯料计划" + apsBlankOrderDoList.get(i).getBlanknumber() + "还未提交,请先提交坯料计划再提交订单");
                 }
             }
         }
@@ -837,10 +842,19 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
             needUpdate.setId(one.getId());
             needUpdate.setAssignee("8672bf72ab274bec83052868ae336b38");//系统管理员
             needUpdate.setTaskstatus("30");
+            DateTime nowDate = DateUtil.date();
+            needUpdate.setCreatedate(nowDate);
+            needUpdate.setModifydate(nowDate);
+            needUpdate.setModifyuserid("8672bf72ab274bec83052868ae336b38");
+            needUpdate.setModifyusername("管理员");
             needUpdateList.add(needUpdate);
         }
 
         runTaskService.updateBatchById(needUpdateList);
+        //更新所有流程实例为已完成(20)
+        processInstService.update(new UpdateWrapper<ProcessInstDo>().lambda()
+                .set(ProcessInstDo::getFlowinststatus, "20")
+                .in(ProcessInstDo::getId, processInstIdList));
 
         //更新所有订单的审批状态为 已完工关闭
         List<String> orderIdList = productionOrderDoList.stream().map(ApsProductionOrderDo::getId).collect(Collectors.toList());

+ 15 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/ApsUtils.java

@@ -100,5 +100,19 @@ public class ApsUtils {
         }
         return conflictdeList.stream().distinct().filter(StringUtils::isNotBlank).collect(Collectors.joining(","));
     }
-
+    /**
+     * 删除旧冲突
+     *
+     * @param oldConflictDesc    工序作业的旧冲突
+     * @param removeConflictDesc 需要删除的冲突
+     * @return
+     */
+    public static String removeConflictsDesc(String oldConflictDesc, String removeConflictDesc) {
+        if (StringUtils.isBlank(oldConflictDesc)) {
+            return oldConflictDesc;
+        }
+        List<String> conflictdeList = new ArrayList<>(Arrays.asList(oldConflictDesc.split(",")));
+        conflictdeList.remove(removeConflictDesc);
+        return conflictdeList.stream().distinct().collect(Collectors.joining(","));
+    }
 }

+ 34 - 23
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml

@@ -356,29 +356,40 @@
         SELECT
         CONCAT(aci.USEDEPTID, '/', aci.ID ) AS value ,
         CONCAT(aci.USEDEPTNAME, '/', aci.CHECKITEMNAME) AS label
-        FROM
-        aps_process_operation_process_equ apope
-        LEFT JOIN aps_process_operation apo ON apope.PROCESSID = apo.ID
-        LEFT JOIN asp_check_items aci ON FIND_IN_SET(aci.ID,apo.CANCHOOSEDEVICEID)
-        left join sys_dict c on c.DICTTYPE='asp_check_item_type' AND aci.CHECKITEMTYPE =c.VALUE
-        AND aci.DELETED = '0'
-        <where>
-            apope.DELETED = '0'
-            <if test="idList !=null and idList.size() >0">
-                AND apope.ID IN
-                <foreach collection="idList" item="id" open="(" close=")" separator=",">
-                    #{id}
-                </foreach>
-            </if>
-            and apo.CANCHOOSEDEVICEID is not null
-            GROUP BY  aci.ID
-            <if test="idList !=null and idList.size() >1">
-                <!-- 存在多选工序作业时 筛选共有的设备 -->
-                <bind name="idLength" value="idList.size()"/>
-                HAVING count(*)>=#{idLength}
-            </if>
-            ORDER BY aci.USEDEPTNAME,aci.CHECKITEMNAME,aci.CHECKITEMNAME ASC
-        </where>
+        FROM asp_check_items aci
+        LEFT JOIN aps_process_operation_process_equ apope ON aci.ID=apope.PROCESSDEVICEID
+        where
+        apope.DELETED = '0'
+        and aci.DELETED='0'
+        and apope.PROCESSDEVICEID is not null
+        GROUP BY aci.ID
+        ORDER BY aci.USEDEPTNAME,aci.CHECKITEMNAME,aci.CHECKITEMNAME ASC
+        <!--        SELECT-->
+        <!--        CONCAT(aci.USEDEPTID, '/', aci.ID ) AS value ,-->
+        <!--        CONCAT(aci.USEDEPTNAME, '/', aci.CHECKITEMNAME) AS label-->
+        <!--        FROM-->
+        <!--        aps_process_operation_process_equ apope-->
+        <!--        LEFT JOIN aps_process_operation apo ON apope.PROCESSID = apo.ID-->
+        <!--        LEFT JOIN asp_check_items aci ON FIND_IN_SET(aci.ID,apo.CANCHOOSEDEVICEID)-->
+        <!--        left join sys_dict c on c.DICTTYPE='asp_check_item_type' AND aci.CHECKITEMTYPE =c.VALUE-->
+        <!--        AND aci.DELETED = '0'-->
+        <!--        <where>-->
+        <!--            apope.DELETED = '0'-->
+        <!--            <if test="idList !=null and idList.size() >0">-->
+        <!--                AND apope.ID IN-->
+        <!--                <foreach collection="idList" item="id" open="(" close=")" separator=",">-->
+        <!--                    #{id}-->
+        <!--                </foreach>-->
+        <!--            </if>-->
+        <!--            and apo.CANCHOOSEDEVICEID is not null-->
+        <!--            GROUP BY  aci.ID-->
+        <!--            <if test="idList !=null and idList.size() >1">-->
+        <!--                &lt;!&ndash; 存在多选工序作业时 筛选共有的设备 &ndash;&gt;-->
+        <!--                <bind name="idLength" value="idList.size()"/>-->
+        <!--                HAVING count(*)>=#{idLength}-->
+        <!--            </if>-->
+        <!--            ORDER BY aci.USEDEPTNAME,aci.CHECKITEMNAME,aci.CHECKITEMNAME ASC-->
+        <!--        </where>-->
     </select>
     <select id="checkConflict" resultType="java.lang.String">
         select CONCAT("订单",apo1.ORDERNO,"-",

File diff suppressed because it is too large
+ 18 - 1
cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SrmIssuesListDao.java


+ 14 - 0
cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SysNotifyAnnounceDao.java

@@ -0,0 +1,14 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.rwcommon.base.BaseDao;
+import com.rongwei.rwcommonentity.commonservers.domain.SysNotifyAnnounceDo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface SysNotifyAnnounceDao  extends BaseDao<SysNotifyAnnounceDo> {
+
+
+}

+ 9 - 0
cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SysNotifyAnnounceUserDao.java

@@ -0,0 +1,9 @@
+package com.rongwei.bscommon.sys.dao;
+import com.rongwei.rwcommon.base.BaseDao;
+import com.rongwei.rwcommonentity.commonservers.domain.SysNotifyAnnounceUserDo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysNotifyAnnounceUserDao  extends BaseDao<SysNotifyAnnounceUserDo>{
+
+}

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

@@ -24,4 +24,6 @@ public interface SrmIssuesListService extends IService<SrmIssuesListDo> {
     void productionOverdue();
 
     R getUsersDepartBmzAndCjzr();
+
+    R approvalTimeoutReminder();
 }

+ 3 - 0
cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ExportServiceImpl.java

@@ -93,6 +93,9 @@ public class ExportServiceImpl implements ExportService {
         put("spa", SrmIssuesListDo::getSpa);
         put("TEAMMEMBERS", SrmIssuesListDo::getTeammembers);
         put("FOLLOWUPDAYS", SrmIssuesListDo::getFollowupdays);
+        put("BATCHNUMBER", SrmIssuesListDo::getBatchnumber);
+        put("SPECIFICATIONS", SrmIssuesListDo::getSpecifications);
+        put("ALLOWSTATUS", SrmIssuesListDo::getAllowstatus);
     }};
     // 日期
     public static final List<String> DATE_KEY = new ArrayList<String>() {{

+ 226 - 3
cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/impl/SrmIssuesListServiceImpl.java

@@ -2,34 +2,49 @@ package com.rongwei.bscommon.sys.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.SrmIssuesListDao;
+import com.rongwei.bscommon.sys.dao.SysNotifyAnnounceDao;
+import com.rongwei.bscommon.sys.dao.SysNotifyAnnounceUserDao;
 import com.rongwei.bscommon.sys.service.SrmIssuesListService;
 import com.rongwei.bsentity.domin.SrmIssuesListDo;
+import com.rongwei.bsentity.vo.SrmIssuesListVo;
 import com.rongwei.commonservice.service.SysConfigService;
+import com.rongwei.rwadmincommon.system.dao.SysUserDao;
 import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
+import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwadmincommon.system.service.SysConfigFeignService;
 import com.rongwei.rwadmincommon.system.service.SysOrganizationService;
 import com.rongwei.rwadmincommon.system.vo.SysOrganizationVo;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommon.vo.MailDo;
 import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
+import com.rongwei.rwcommonentity.commonservers.domain.SysNotifyAnnounceDo;
+import com.rongwei.rwcommonentity.commonservers.domain.SysNotifyAnnounceUserDo;
 import com.rongwei.rwcommonentity.commonservers.vo.SysNotifyAnnounceVo;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import dto.DeparterAndWorkShoperVo;
 import dto.SysNoticeVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import sun.misc.BASE64Decoder;
 
+import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.rongwei.safecommon.utils.CXCommonUtils.DEFAULT_NOTIFY_STATUS;
+import static com.rongwei.safecommon.utils.SaveConstans.IssuesListNotice.*;
+
 /**
  * <p>
  * 问题列表 服务实现类
@@ -47,6 +62,23 @@ public class SrmIssuesListServiceImpl extends ServiceImpl<SrmIssuesListDao, SrmI
     private SrmIssuesListDao srmIssuesListDao;
     @Autowired
     private SysOrganizationService sysOrganizationService;
+    @Autowired
+    private SysNotifyAnnounceDao sysNotifyAnnounceDao;
+
+    @Autowired
+    private SysNotifyAnnounceUserDao sysNotifyAnnounceUserDao;
+
+
+    @Resource
+    private SysConfigFeignService sysConfigFeignService;
+
+    @Autowired
+    private SysUserDao sysUserDao;
+
+    private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
+
+
+
 
     @Override
     public void saveFishBoneImg(SrmIssuesListDo srmIssuesListDo) throws IOException {
@@ -166,6 +198,8 @@ public class SrmIssuesListServiceImpl extends ServiceImpl<SrmIssuesListDao, SrmI
         return R.ok(res);
     }
 
+
+
     String selectChejian(String startDepartId) {
         if (ObjectUtil.isEmpty(startDepartId)) {
             return "";
@@ -179,4 +213,193 @@ public class SrmIssuesListServiceImpl extends ServiceImpl<SrmIssuesListDao, SrmI
             return selectChejian(sysOrganizationDo.getPid());
         }
     }
+
+
+    /**
+     * 生产问题审批超时提醒
+     * @return
+     */
+    @Override
+    public R approvalTimeoutReminder() {
+        log.info("生产问题审批超时提醒开始:");
+        String taskname=null;
+        long fourHoursInMillis = 4 * 60 * 60 * 1000; // 4小时转换为毫秒
+        long twentyFourHoursInMillis = 24 * 60 * 60 * 1000; // 24小时转换为毫秒
+        long fortyEightHoursInMillis = 48 * 60 * 60 * 1000; // 48小时转换为毫秒
+        Map<String, List<SysNotifyAnnounceDo>> keyMap =new HashMap<String,  List<SysNotifyAnnounceDo>>();   //主表 id ,remark
+        Map<String, String> issTaskkey =new HashMap<String, String>(); // 主表id , 消息提醒表 id
+        List<SrmIssuesListVo> userEmailList =  new ArrayList<>();
+
+        //1.查询所有未审批,审批中的数据
+        List<SrmIssuesListVo> list =  srmIssuesListDao.selectTimeOutData();
+        //2.查询跟踪类型的所有提醒
+        LambdaQueryWrapper<SysNotifyAnnounceDo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysNotifyAnnounceDo::getDeleted,0)
+                .eq(SysNotifyAnnounceDo::getNotifytype,ISSUES_NOTICE_NOTIFYTYPE)
+                .likeRight(SysNotifyAnnounceDo::getRemark,ISSUES_REMARK_NEW);
+        List<SysNotifyAnnounceDo> sysNotifyAnnounceDoList =
+                sysNotifyAnnounceDao.selectList(queryWrapper);
+        if (!sysNotifyAnnounceDoList.isEmpty()){
+           keyMap = sysNotifyAnnounceDoList.stream().collect(Collectors.groupingBy(SysNotifyAnnounceDo::getRoption));
+        }
+
+        Boolean f=false;
+        //2 查询消息提醒中
+        for(SrmIssuesListVo vo:list){
+            taskname = vo.getTaskname();
+            try {
+                //2.条件判断节点跟超时时间截取数据
+                if (taskname.equals("问题登记人") && System.currentTimeMillis()- vo.getCreatedate().getTime() > twentyFourHoursInMillis){
+                    vo.setNodetime(vo.getCreatedate());
+                    vo.setOperationid(vo.getCreateuserid());
+                    vo.setHour(24);
+                    f= true;
+                } else if ((taskname.equals("部门长") || taskname.equals("生产副总") || taskname.equals("责任部门长") || taskname.equals("车间主任/部门经理审核")
+                        || taskname.equals("车间主任/经理审核")  || taskname.equals("发起人确认")  || taskname.equals("领导审核") || taskname.equals("SPA跟踪"))
+                        && System.currentTimeMillis()- vo.getNodetime().getTime() > fourHoursInMillis) {
+                    f= true;vo.setHour(4);
+                }else if ( (taskname.equals("SPA") || taskname.equals("任务SPA")   || taskname.equals("SPA维护标准化文件"))
+                        && System.currentTimeMillis()- vo.getNodetime().getTime() > fortyEightHoursInMillis) {
+                    f= true;vo.setHour(48);
+                }
+                if (f){
+                    // 生成个人工作台提醒
+                    addNotifyAnnounce(vo,userEmailList,keyMap, issTaskkey);
+                }
+                f=false;
+            }catch (Exception e){
+                log.error(" 节点 {} 问题编号 {} 出现问题 {} ",taskname,vo.getQuestionno(),e.getMessage());
+            }
+        }
+
+        //3.发送邮件
+        sendIssuesListEmail(userEmailList);
+        log.info("生产问题审批超时提醒结束:");
+        return R.ok();
+    }
+
+    /**
+     * 整理发送邮件
+     * @param userEmailList
+     */
+    private void sendIssuesListEmail(List<SrmIssuesListVo> userEmailList) {
+        //获取人员邮件
+        List<SysUserDo> sysUserDos = sysUserDao.selectList(new LambdaQueryWrapper<SysUserDo>().eq(SysUserDo::getDeleted, "0").isNotNull(SysUserDo::getEmail));
+        Map<String, String> userEmailKey = sysUserDos.stream().collect(Collectors.toMap(SysUserDo::getId, SysUserDo::getEmail));
+        StringBuilder content = new StringBuilder();
+        if (!userEmailList.isEmpty()) {
+            Map<String, Map<String, List<SrmIssuesListVo>>> result = userEmailList.stream()
+                    .collect(Collectors.groupingBy(
+                            SrmIssuesListVo::getEmailUserid, // 外部分组键
+                            Collectors.groupingBy(SrmIssuesListVo::getTaskname) // 内部分组键,使用内部groupingBy收集器
+                    ));
+            for (String userid:result.keySet()) {
+                if (userEmailKey.get(userid) != null) {
+                    MailDo mailDo = new MailDo();
+                    mailDo.setSubject(ISSUES_EMAIL_TITLE);
+                    mailDo.setReceiveEmail(new String[]{userEmailKey.get(userid)});
+                 //   mailDo.setReceiveEmail(new String[]{"1311562099@qq.com"});
+                    mailDo.setNeedTransReceive(false);
+                    content = new StringBuilder();
+                    for (String name: result.get(userid).keySet()) {
+                        List<SrmIssuesListVo> srmIssuesListVos = result.get(userid).get(name);
+                        for (int i = 1; i <= srmIssuesListVos.size(); i++) {
+                            if (i==1){
+                                content.append("您好! 有【"+srmIssuesListVos.size()+"】条生产问题在【"+name+"】已经超过【"+srmIssuesListVos.get(i-1).getHour()+"】小时没有处理,请尽快处理!\n");
+                            }
+                            content.append(i+srmIssuesListVos.get(i-1).getReminder()+"\n");
+                        }
+                    }
+                    content.append("详见问题跟踪与解决系统,如果无法点击请复制链接到浏览器中:http://192.168.100.77/#/dashboarditem/8c1b2d26e77947c98c4a4668d687aba2");
+                    mailDo.setContent(content.toString());
+                    try {
+                        sysConfigFeignService.sendTextMail(mailDo);
+
+                    } catch (Exception ignored) {
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 添加工作台提醒消息
+     *
+     * @param
+     * @param
+     * @param vo
+
+     * @param keyMap
+
+     * @return
+     */
+    private void addNotifyAnnounce(SrmIssuesListVo vo, List<SrmIssuesListVo> userEmailList, Map<String, List<SysNotifyAnnounceDo>> keyMap, Map<String, String> issTaskkey) {
+
+      String    title ="【生产问题审批超时提醒】--生产问题【"+vo.getQuestionno()+"】【"+vo.getQuestiontitle()+"】已经超过"+vo.getHour()+"小时没有处理,请尽快处理!";
+
+        if (!keyMap.isEmpty() && keyMap.containsKey(vo.getId()) && keyMap.get(vo.getId()).get(0).getRemark().equals(ISSUES_REMARK_NEW+"-"+vo.getId()+"-"+vo.getNodetime().getTime())){
+            //超时限制内的数据,不做处理
+            return;
+        }
+
+        if  (!keyMap.isEmpty() && keyMap.containsKey(vo.getId()) && !keyMap.get(vo.getId()).get(0).getRemark().equals(ISSUES_REMARK_NEW+"-"+vo.getId()+"-"+vo.getNodetime().getTime())){
+            //并且处理老数据,更换主表 remark 标识
+            String remark = keyMap.get(vo.getId()).get(0).getRemark().replace(ISSUES_REMARK_NEW, ISSUES_REMARK_OLD);
+            LambdaUpdateWrapper<SysNotifyAnnounceDo> announceUpdateWrapper = new LambdaUpdateWrapper<>();
+            announceUpdateWrapper.eq(SysNotifyAnnounceDo::getId,keyMap.get(vo.getId()).get(0).getId()).eq(SysNotifyAnnounceDo::getDeleted,0)
+                    .set(SysNotifyAnnounceDo::getRemark,remark); //已读
+            sysNotifyAnnounceDao.update(null,announceUpdateWrapper);
+            //并且处理老数据,子表更换已读
+            LambdaUpdateWrapper<SysNotifyAnnounceUserDo> userUpdateWrapper = new LambdaUpdateWrapper<>();
+            userUpdateWrapper.eq(SysNotifyAnnounceUserDo::getAnnounceid,keyMap.get(vo.getId()).get(0).getId()).eq(SysNotifyAnnounceUserDo::getDeleted,0)
+                    .set(SysNotifyAnnounceUserDo::getReadstate,ISSUES_READ_STATUS); //已读
+            sysNotifyAnnounceUserDao.update(null,userUpdateWrapper);
+
+        };
+
+        SysNotifyAnnounceDo sysNotifyAnnounceDo=new SysNotifyAnnounceDo();
+        //流程部门是有并签处理,过滤下数据
+        if (issTaskkey.containsKey(vo.getId())){
+            sysNotifyAnnounceDo.setId(issTaskkey.get(vo.getId()));
+        }else {
+            sysNotifyAnnounceDo.setId(SecurityUtil.getUUID());
+            sysNotifyAnnounceDo.setSenderid(ISSUES_NOTICE_SENDERID);
+            sysNotifyAnnounceDo.setNotifytitle(ISSUES_NOTICE_NOTIFYTITLE);
+            sysNotifyAnnounceDo.setNotifytype(ISSUES_NOTICE_NOTIFYTYPE);
+            sysNotifyAnnounceDo.setNotifystatus(DEFAULT_NOTIFY_STATUS);
+            sysNotifyAnnounceDo.setNotifycontent(title);
+            sysNotifyAnnounceDo.setRoption(vo.getId());
+            sysNotifyAnnounceDo.setRemark(ISSUES_REMARK_NEW+"-"+vo.getId()+"-"+vo.getNodetime().getTime());
+            sysNotifyAnnounceDo.setCreatedate(new Date());
+            sysNotifyAnnounceDo.setModifydate(new Date());
+            sysNotifyAnnounceDo.setModifyusername("定时任务");
+            sysNotifyAnnounceDao.insert(sysNotifyAnnounceDo);
+            issTaskkey.put(vo.getId(),sysNotifyAnnounceDo.getId());
+        }
+
+        String userArr[] = null;
+        SysNotifyAnnounceUserDo sysNotifyAnnounceUserDo = new SysNotifyAnnounceUserDo();
+        userArr = vo.getOperationid().split(",");
+        SrmIssuesListVo srmIssuesListVo =null;
+        for (String userId : userArr){
+            sysNotifyAnnounceUserDo.setId(SecurityUtil.getUUID());
+            sysNotifyAnnounceUserDo.setAnnounceid(sysNotifyAnnounceDo.getId());
+            sysNotifyAnnounceUserDo.setRecipientid(userId);
+            sysNotifyAnnounceUserDo.setReadstate(ISSUES_UNREAD_STATUS);//未读
+            sysNotifyAnnounceUserDo.setCreatedate(new Date());
+            sysNotifyAnnounceUserDo.setModifydate(new Date());
+            sysNotifyAnnounceUserDo.setModifyusername("定时任务");
+            sysNotifyAnnounceUserDao.insert(sysNotifyAnnounceUserDo);
+            srmIssuesListVo =new SrmIssuesListVo();
+            srmIssuesListVo.setEmailUserid(userId);
+            srmIssuesListVo.setTaskname(vo.getTaskname());
+            if (vo.getTaskname().equals("问题登记人")){
+                srmIssuesListVo.setReminder("、【"+vo.getQuestionno()+"】【"+vo.getQuestiontitle()+"】已创建,请及时提交流程!");
+            }else {
+                srmIssuesListVo.setReminder("、【"+vo.getQuestionno()+"】【"+vo.getQuestiontitle()+"】已创建,请尽快完成审批!");
+            }
+            srmIssuesListVo.setHour(vo.getHour());
+            userEmailList.add(srmIssuesListVo);
+        }
+    }
 }

+ 16 - 0
cx-question/cx-question-entity/src/main/java/com/rongwei/bsentity/domin/SrmIssuesListDo.java

@@ -270,4 +270,20 @@ public class SrmIssuesListDo extends BaseDo implements Serializable {
     private String undetectedanalysisimgurl;
 
     private static final long serialVersionUID = 1L;
+
+    /**
+     * 批号
+     */
+    private String batchnumber;
+
+    /**
+     * 规格(毫米)
+     */
+    private String specifications;
+
+
+    /**
+     * 合金状态
+     */
+    private String allowstatus;
 }

+ 44 - 0
cx-question/cx-question-entity/src/main/java/com/rongwei/bsentity/vo/SrmIssuesListVo.java

@@ -0,0 +1,44 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domin.SrmIssuesListDo;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SrmIssuesListVo  extends SrmIssuesListDo {
+
+    /**
+     * 节点代办人员
+     */
+    private String operationid;
+
+    /**
+     * 流程节点名称
+     */
+    private String taskname;
+
+
+    /**
+     * 节点创建时间
+     */
+    private Date nodetime;
+
+
+    /**
+     * 邮件提示数据
+     */
+    private String reminder;
+
+
+    /**
+     * 邮件发送人员
+     */
+    private String emailUserid;
+
+    /**
+     * 小时
+     */
+     private Integer hour;
+
+}

+ 42 - 0
cx-question/cx-question-server/src/main/java/com/rongwei/businessServer/controller/SrmIssuesListController.java

@@ -0,0 +1,42 @@
+package com.rongwei.businessServer.controller;
+
+import com.rongwei.bscommon.sys.service.SrmIssuesListService;
+import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.vo.MailDo;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RestController;
+
+import static com.rongwei.safecommon.utils.SaveConstans.IssuesListNotice.ISSUES_EMAIL_TITLE;
+
+
+/**
+ * 生产问题管理
+ * 2024-09-25 hp
+ */
+
+@RestController
+@RequestMapping("srmIssueslist")
+public class SrmIssuesListController {
+
+    @Autowired
+    SrmIssuesListService srmIssuesListService;
+
+
+    /**
+     * 每10min 执行一次定时任务
+     * 生产问题审批超时提醒
+     * @return
+     */
+    @Scheduled(cron = "0 0/10 * * * ? ")
+    @PostMapping("/approvalTimeoutReminder")
+    public R batchSavePlansTiming(){
+        R r = srmIssuesListService.approvalTimeoutReminder();
+        return r;
+    }
+}

BIN
cx-question/cx-question-server/src/main/resources/template/ProblemTrackingAndResolution.docx


+ 1 - 1
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/AspSafeAttachmentsServiceImpl.java

@@ -190,7 +190,7 @@ public class AspSafeAttachmentsServiceImpl extends ServiceImpl<AspSafeAttachment
                 }
                 mailContent.append((i + 1) + "、附件类型:【" + attachmenttype + "】,证书/报告编号:【" + number + "】,名称:【" + name + "】,检验日期:【" + checkDate + "】\n");
             }
-            mailContent.append("详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.78/#/page/lr/a02bf613b27c422f8e6e3b9d427b15dd");
+            mailContent.append("详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100./#/page/lr/a02bf613b27c422f8e6e3b9d427b15dd");
 
             //发送邮件
             MailDo mailDo = new MailDo();

+ 1 - 1
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/AspSpecialEquipmentCertificateServiceImpl.java

@@ -171,7 +171,7 @@ public class AspSpecialEquipmentCertificateServiceImpl extends ServiceImpl<AspSp
                 }
                 mailContent.append((i + 1) + "、姓名:【" + name + "】,所属部门:【" + orgName + "】证书类别:【" + certificate + "】,复审日期:【" + reviewDate + "】\n");
             }
-            mailContent.append("详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.78/#/page/s/76711fe45ac941efa3d58d43b28b4f39");
+            mailContent.append("详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.77/#/page/s/76711fe45ac941efa3d58d43b28b4f39");
 
             //发送邮件
             MailDo mailDo = new MailDo();

+ 1 - 1
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/CheckItemsServiceImpl.java

@@ -292,7 +292,7 @@ public class CheckItemsServiceImpl extends ServiceImpl<CheckItemsDao, CheckItems
                 }
                 mailContent.append((i + 1) + "、设备类型:【" + checkitemtype + "】,设备编号:【" + deviceoutcode + "】,设备名称:【" + checkitemname + "】,检验日期:【" + checkDate + "】\n");
             }
-            mailContent.append("详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.78/#/page/lr/9329c07dd31b4b8b95d4decaa021adc3");
+            mailContent.append("详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.77/#/page/lr/9329c07dd31b4b8b95d4decaa021adc3");
 
             //发送邮件
             MailDo mailDo = new MailDo();

+ 1 - 1
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/SpecialCertificateUrgingServiceImpl.java

@@ -45,7 +45,7 @@ public class SpecialCertificateUrgingServiceImpl implements UrgingService {
     private SysDictService sysDictService;
     public static final String MAIL_CONTENT=" 您好!【%s】提醒您,有如下特种设备人员证书即将年检到期,请尽快处理!\n" +
             "%s" +
-            "\n详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.78/#/page/lr/9329c07dd31b4b8b95d4decaa021adc3";
+            "\n详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.77/#/page/lr/9329c07dd31b4b8b95d4decaa021adc3";
     public static final String MAIL_CONTENT_ITEM="%d、姓名:【%s】,所属部门:【%s】,证书类别:【%s】,复审日期:【%tF】\n";
 
     public static final List<String> ROLE_CODE_LIST = new ArrayList<String>() {{

+ 1 - 1
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/SpecialEquipmentUrgingServiceImpl.java

@@ -34,7 +34,7 @@ import static com.rongwei.safecommon.utils.SaveConstans.NotifyType.SPECIALEQUIPM
 public class SpecialEquipmentUrgingServiceImpl implements UrgingService {
     public static final String MAIL_CONTENT = "  您好!【%s】提醒您,有如下特种设备即将年检到期,请尽快处理!\n" +
             "%s" +
-            "\n详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.78/#/page/lr/9329c07dd31b4b8b95d4decaa021adc3";
+            "\n详见安全生产平台,如果无法点击请复制链接到浏览器中:http://192.168.100.77/#/page/lr/9329c07dd31b4b8b95d4decaa021adc3";
     public static final String MAIL_CONTENT_ITEM = "  %d、设备类型:【%s】,出厂编号:【%s】,设备名称:【%s】,检验日期:【%tF】";
     public static final List<String> ROLE_CODE_LIST = new ArrayList<String>() {{
         add("code-safe");