Forráskód Böngészése

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

xiahan 10 hónapja
szülő
commit
abcd2b115b
17 módosított fájl, 512 hozzáadás és 33 törlés
  1. 16 0
      bs-common/src/main/java/com/rongwei/safecommon/utils/SaveConstans.java
  2. 3 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProductionOrderService.java
  3. 39 26
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  4. 73 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  5. 1 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java
  6. 4 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationBackupDo.java
  7. 6 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationDo.java
  8. 6 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationHistoryDo.java
  9. 11 0
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductionOrderController.java
  10. 18 1
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SrmIssuesListDao.java
  11. 14 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SysNotifyAnnounceDao.java
  12. 9 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/dao/SysNotifyAnnounceUserDao.java
  13. 2 0
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/SrmIssuesListService.java
  14. 226 3
      cx-question/cx-question-common/src/main/java/com/rongwei/bscommon/sys/service/impl/SrmIssuesListServiceImpl.java
  15. 44 0
      cx-question/cx-question-entity/src/main/java/com/rongwei/bsentity/vo/SrmIssuesListVo.java
  16. 40 0
      cx-question/cx-question-server/src/main/java/com/rongwei/businessServer/controller/SrmIssuesListController.java
  17. BIN
      cx-question/cx-question-server/src/main/resources/template/ProblemTrackingAndResolution.docx

+ 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 ="生产问题审批超时提醒";
+    }
 }

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

@@ -35,4 +35,7 @@ public interface ApsProductionOrderService extends IService<ApsProductionOrderDo
     R saveHistoryInfo(String id);
 
     R haveBeChanged(OrderHaveBeChangedReq req);
+
+    R closeOrder();
+
 }

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

@@ -1910,6 +1910,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
             apsProcessOutputProductDo.setBlankid(apsBlankOrderDo.getId());
             apsProcessOutputProductDo.setTenantid(tenantId);
+            if (ObjectUtil.isEmpty(apsProcessOutputProductDo.getChangeproducttype())) {
+                apsProcessOutputProductDo.setChangeproducttype("");
+            }
+            if (ObjectUtil.isEmpty(apsProcessOutputProductDo.getChangeproducttypeid())) {
+                apsProcessOutputProductDo.setChangeproducttypeid("");
+            }
+            if (ObjectUtil.isEmpty(apsProcessOutputProductDo.getChangealloy())) {
+                apsProcessOutputProductDo.setChangealloy("");
+            }
+            if (ObjectUtil.isEmpty(apsProcessOutputProductDo.getChangealloystatus())) {
+                apsProcessOutputProductDo.setChangealloystatus("");
+            }
         }
         if (ObjectUtil.isNotEmpty(apsProcessOutputProductDoList)) {
             apsProcessOutputProductService.saveOrUpdateBatch(apsProcessOutputProductDoList);
@@ -2047,17 +2059,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();
@@ -2069,7 +2082,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())) {
@@ -2079,7 +2092,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() + " 坯料是铝板和板锭时长度必填");
 //                }
 //            }
 //        }
@@ -2096,13 +2109,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"));
                 }
             }
         }
@@ -2140,7 +2153,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
 
             } else {
-                return R.error("第" + j + "个坯料计划 工艺路线没有输出成品");
+                return R.error("坯料计划" + apsBlankOrderDo.getBlanknumber() + " 工艺路线没有输出成品");
             }
         }
 
@@ -2163,10 +2176,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;
                     }
@@ -2202,10 +2215,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() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                 }
             }
         }
@@ -2219,18 +2232,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() + " 输出卷数必须是坯料卷数的倍数");
                 }
             }
 
@@ -2238,7 +2251,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() + " 是板锭和铝板时长度必填");
             }
         }
 
@@ -2250,10 +2263,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() + "不同,不可作为该坯料的输出成品");
             }
         }
 
@@ -2280,7 +2293,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);
         }
 
         //如果坯料输出成品的计划输出订单重量合计>坯料的总重量,错误提示:坯料输出成品的计划输出订单重量合计不能大于坯料的总重量
@@ -2293,14 +2306,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() + "不一致");
             }
         }
 
@@ -2309,7 +2322,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) {
@@ -2322,7 +2335,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;
                     }
@@ -2334,7 +2347,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() + " 请选择工艺路线");
             }
         }
 
@@ -2347,7 +2360,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();

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

@@ -1,10 +1,12 @@
 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;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.*;
 import com.rongwei.bscommon.sys.service.*;
@@ -22,6 +24,10 @@ 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;
 import org.springframework.beans.BeanUtils;
@@ -106,6 +112,10 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
     private NewSysMindMappingDao newSysMindMappingDao;
     @Autowired
     private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
+    @Autowired
+    private RunTaskService runTaskService;
+    @Autowired
+    private ProcessInstService processInstService;
 
 
     public static final String ERROR_MSG = "%s上诉订单的排程交货期大于承诺交货期";
@@ -200,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() + "还未提交,请先提交坯料计划再提交订单");
                 }
             }
         }
@@ -367,6 +377,13 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
                     apsProcessOperationProcessEquService.updateProductionStatus(request);
                 }
             }
+        } else {
+            if (ObjectUtil.isNotEmpty(apsBlankOrderDoList)) {
+                //更新生产状态
+                CommonUpdateProductionStatusReq request = new CommonUpdateProductionStatusReq();
+                request.setBlankId(apsBlankOrderDoList.get(0).getId());
+                apsProcessOperationProcessEquService.updateProductionStatus(request);
+            }
         }
 
 
@@ -793,6 +810,61 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         return R.ok();
     }
 
+    @Override
+    @Transactional
+    public R closeOrder() {
+        //查询所有 订单评审状态=已发布计划,生产状态=已完工 的订单
+        List<ApsProductionOrderDo> productionOrderDoList = this.list(new QueryWrapper<ApsProductionOrderDo>().lambda()
+                .eq(ApsProductionOrderDo::getAuditstatus, "已发布计划")
+                .eq(ApsProductionOrderDo::getProductionstatus, "50"));
+        if (ObjectUtil.isEmpty(productionOrderDoList)) {
+            return R.ok();
+        }
+
+        //需要更新的流程实例ID集合
+        List<String> processInstIdList = productionOrderDoList.stream().map(ApsProductionOrderDo::getProcessinstid).collect(Collectors.toList());
+
+        if (ObjectUtil.isEmpty(processInstIdList)) {
+            return R.ok();
+        }
+
+        List<RunTaskDo> needUpdateList = new LinkedList<>();
+        //更新所有 流程节点(wf_run_task)的审批状态为30,结束流程,形成闭环
+        for (String processInstId : processInstIdList) {
+            //获取最新的一个节点
+            RunTaskDo one = runTaskService.getOne(new QueryWrapper<RunTaskDo>().lambda()
+                    .eq(RunTaskDo::getProcessinstid, processInstId)
+                    .eq(RunTaskDo::getTaskname, "生产计划员5")
+                    .in(RunTaskDo::getTaskstatus, Arrays.asList("10", "20"))
+                    .orderByDesc(RunTaskDo::getModifydate).last("limit 1"));
+
+            RunTaskDo needUpdate = new RunTaskDo();
+            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());
+        this.update(new UpdateWrapper<ApsProductionOrderDo>().lambda()
+                .set(ApsProductionOrderDo::getAuditstatus, "已完工关闭")
+                .in(ApsProductionOrderDo::getId, orderIdList));
+
+        return R.ok();
+    }
+
 }
 
 

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

@@ -1102,6 +1102,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                         && !CXCommonUtils.removeExtraZerosAndDecimal(apsProcessOperationOutMaterDo.getProlength()).equals("0")) {
                     outPut = outPut + "*长" + CXCommonUtils.removeExtraZerosAndDecimal(apsProcessOperationOutMaterDo.getProlength());
                 }
+                outPut = outPut + "mm";
 //                outPut = outPut + " " + CXCommonUtils.removeExtraZerosAndDecimal(apsProcessOperationOutMaterDo.getSinglerollweight()) + "吨";
             } catch (Exception ignored) {
             }

+ 4 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationBackupDo.java

@@ -454,6 +454,10 @@ public class ApsProcessOperationBackupDo extends BaseDo implements Serializable
      * 是否已分卷
      */
     private String issubsection;
+    /**
+     * 作业指导附件
+     */
+    private String file;
 
 
     /**

+ 6 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationDo.java

@@ -454,7 +454,7 @@ public class ApsProcessOperationDo extends BaseDo {
     /**
      * 设备运转速度(毫米/分钟)
      */
-    @TableField("workspeed")
+    @TableField("WORKSPEED")
     private BigDecimal workspeed;
     /**
      * 剩余待报工卷数
@@ -471,6 +471,11 @@ public class ApsProcessOperationDo extends BaseDo {
      */
     @TableField("ISSUBSECTION")
     private String issubsection;
+    /**
+     * 作业指导附件
+     */
+    @TableField("FILE")
+    private String file;
 
 
 }

+ 6 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationHistoryDo.java

@@ -451,7 +451,7 @@ public class ApsProcessOperationHistoryDo extends BaseDo {
     /**
      * 设备运转速度(毫米/分钟)
      */
-    @TableField("workspeed")
+    @TableField("WORKSPEED")
     private BigDecimal workspeed;
     /**
      * 剩余待报工卷数
@@ -463,6 +463,11 @@ public class ApsProcessOperationHistoryDo extends BaseDo {
      */
     @TableField("LEAVEWAITWORKROLL")
     private Integer leavewaitworkroll;
+    /**
+     * 作业指导附件
+     */
+    @TableField("FILE")
+    private String file;
 
 
 }

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

@@ -9,6 +9,7 @@ import com.rongwei.rwcommon.base.R;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -143,4 +144,14 @@ public class ApsProductionOrderController {
     public R haveBeChanged(@RequestBody OrderHaveBeChangedReq req) {
         return apsProductionOrderService.haveBeChanged(req);
     }
+
+    /**
+     * 每天凌晨1点执行一次
+     * 每天定时任务检查所有订单评审状态=已发布计划的订单,如果订单生产状态=已完工,则更新订单评审状态=已完工关闭(个人工作台的评审消息自动清除)
+     */
+    @Scheduled(cron = "0 1 * * *")
+    @PostMapping("/closeOrder")
+    public R closeOrder(){
+        return apsProductionOrderService.closeOrder();
+    }
 }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 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();
 }

+ 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,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);
+        }
+    }
 }

+ 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;
+
+}

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

@@ -0,0 +1,40 @@
+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 static com.rongwei.safecommon.utils.SaveConstans.IssuesListNotice.ISSUES_EMAIL_TITLE;
+
+
+/**
+ * 生产问题管理
+ * 2024-09-25 hp
+ */
+@Controller
+@RequestMapping("/srmIssueslist")
+@Slf4j
+public class SrmIssuesListController {
+
+    @Autowired
+    SrmIssuesListService srmIssuesListService;
+
+
+    /**
+     * 每10min 执行一次定时任务
+     * 生产问题审批超时提醒
+     * @return
+     */
+    @Scheduled(cron = "0 0/10 * * * ? ")
+    @PostMapping("approvalTimeoutReminder")
+    public R batchSavePlansTiming(){
+         return srmIssuesListService.approvalTimeoutReminder();
+    }
+}

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