Explorar el Código

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

fangpy hace 1 año
padre
commit
14d4ada889
Se han modificado 28 ficheros con 1200 adiciones y 102 borrados
  1. 17 0
      bs-common/src/main/java/com/rongwei/safecommon/utils/CXCommonUtils.java
  2. 1 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProductionOrderDao.java
  3. 133 83
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  4. 13 4
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationServiceImpl.java
  5. 2 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductDetailServiceImpl.java
  6. 9 3
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  7. 7 2
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java
  8. 1 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ReportCheckServiceImpl.java
  9. 10 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductionOrderDo.java
  10. 3 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CheckAndSaveOrUpdateBlankReq.java
  11. 3 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CheckAndSaveOrUpdateOrderReq.java
  12. 3 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/PreviousProcessVo.java
  13. 6 0
      cx-safe-check/cx-save-check-common/pom.xml
  14. 14 0
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/dao/SaveCheckCommonDao.java
  15. 4 0
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/AspSafeAttachmentsService.java
  16. 3 0
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/CheckItemsService.java
  17. 184 1
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/AspSafeAttachmentsServiceImpl.java
  18. 10 4
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/AspSpecialEquipmentCertificateServiceImpl.java
  19. 227 2
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/CheckItemsServiceImpl.java
  20. 58 0
      cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/utils/ClassExcelVerifyHandler.java
  21. 31 1
      cx-safe-check/cx-save-check-common/src/main/resources/mybatis/SaveCheckCommonDao.xml
  22. 6 0
      cx-safe-check/cx-save-check-entity/pom.xml
  23. 28 0
      cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/domian/CheckItemsDo.java
  24. 15 0
      cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/vo/CheckAreaVo.java
  25. 161 0
      cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/vo/ImportAspSafeAttachmentsVo.java
  26. 235 0
      cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/vo/ImportCheckItemsVo.java
  27. 9 0
      cx-safe-check/cx-save-check-server/src/main/java/com/rongwei/savecheck/controller/AspSafeAttachmentsController.java
  28. 7 0
      cx-safe-check/cx-save-check-server/src/main/java/com/rongwei/savecheck/controller/CheckItemsController.java

+ 17 - 0
bs-common/src/main/java/com/rongwei/safecommon/utils/CXCommonUtils.java

@@ -33,6 +33,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.function.BooleanSupplier;
 import java.util.stream.Collectors;
 
 import static com.rongwei.safecommon.utils.SaveConstans.*;
@@ -349,4 +350,20 @@ public class CXCommonUtils {
         return commonFeginClient.upload(file, relationid);
     }
 
+    /**
+     * 参数校验
+     *
+     * @param booleanSupplier
+     * @param returnMsg
+     * @param errorMsg
+     * @param errorMsgParameter
+     */
+    public static void parameterCheck(BooleanSupplier booleanSupplier, String returnMsg, String errorMsg, Object... errorMsgParameter) {
+        if (booleanSupplier.getAsBoolean()) {
+            log.error(errorMsg, errorMsgParameter);
+            if (org.apache.commons.lang.StringUtils.isNotBlank(returnMsg)) {
+                throw new RuntimeException(returnMsg);
+            }
+        }
+    }
 }

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

@@ -37,7 +37,7 @@ public interface ApsProductionOrderDao extends BaseMapper<ApsProductionOrderDo>
             "\tand ((IFNULL(o.CHANGEDATE,'')='' and TIMESTAMPDIFF(HOUR,o.ORDERDATE,NOW())>48) or (IFNULL(o.CHANGEDATE,'')!='' and TIMESTAMPDIFF(HOUR,o.CHANGEDATE,NOW())>48))")
     List<ApsProductionOrderDo> getOrderOuttimeAudit();
 
-    @Select("SELECT count(1) FROM aps_production_order apo LEFT JOIN aps_blank_order abo ON apo.ID = abo.PRODUCTIONORDERID  AND abo.DELETED = 0 LEFT JOIN aps_process_operation apo2 ON abo.ID = apo2.BLANKID  AND apo2.DELETED = 0  LEFT JOIN aps_process_operation_process_equ apope ON apo2.ID = apope.PROCESSID AND apope.DELETED = 0 WHERE apo.DELETED = 0  AND apo.ID = #{id} AND (apope.CONFLICTDES is not null or apope.CONFLICTDES != '')")
+    @Select("SELECT count(1) FROM aps_production_order apo LEFT JOIN aps_blank_order abo ON apo.ID = abo.PRODUCTIONORDERID  AND abo.DELETED = 0 LEFT JOIN aps_process_operation apo2 ON abo.ID = apo2.BLANKID  AND apo2.DELETED = 0  LEFT JOIN aps_process_operation_process_equ apope ON apo2.ID = apope.PROCESSID AND apope.DELETED = 0 WHERE apo.DELETED = 0  AND apo.ID = #{id} AND (apope.CONFLICTDES is not null AND apope.CONFLICTDES != '')")
     int selectConflictdesCount(@Param("id") String id);
 
     @Select("select o.ID,o.ORDERNO,o.CREATEUSERID,o.CREATEUSERNAME,u.EMAIL as MODIFYUSERNAME from aps_production_order o left join sys_user u on o.CREATEUSERID=u.ID and u.DELETED='0'\n" +

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

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.StopWatch;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -230,7 +231,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         // 更新工序作业的状态
         apsProcessOperationDao.publish(collect);
         // 更新订单表的生产状态
-        blankIds.forEach(blankId->{
+        blankIds.forEach(blankId -> {
             processOperationProcessEquService.updateOrder(blankId);
         });
         // 根据坯料ID 删除 备份数据
@@ -287,7 +288,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         apsProcessOperationDao.publishCancel(collect);
         // 根据坯料ID 删除 备份数据
         // 更新订单表的生产状态
-        blankIds.forEach(blankId->{
+        blankIds.forEach(blankId -> {
             processOperationProcessEquService.updateOrder(blankId);
         });
         ApsUtils.clearBackup(null);
@@ -648,17 +649,24 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         //删除备份
         ApsUtils.clearBackup(null);
         //增加备份
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
         List<List<String>> partition1 = Lists.partition(apsProcessOperationIds, 500);
         partition1.forEach(data -> {
-            apsProcessOperationBackupDao.processOperationBackup(apsProcessOperationIds,
+            apsProcessOperationBackupDao.processOperationBackup(data,
                     currentUser == null ? null : currentUser.getId(), currentUser == null ? null : currentUser.getName());
         });
+        stopWatch.stop();
+        log.error("工序作业备份时长: {}"+stopWatch.getTotalTimeSeconds());
+        StopWatch stopWatch1 = new StopWatch();
+        stopWatch1.start();
         List<List<ApsProcessOperationProcessEquDo>> partition = Lists.partition(apsProcessOperationProcessEquDos, 100);
         partition.forEach(data -> {
-            apsProcessOperationProcessEquBackupDao.processOperationEquBackup(apsProcessOperationProcessEquDos,
+            apsProcessOperationProcessEquBackupDao.processOperationEquBackup(data,
                     currentUser == null ? null : currentUser.getId(), currentUser == null ? null : currentUser.getName());
         });
-
+        stopWatch1.stop();
+        log.error("工序作业明细备份时长: {}"+stopWatch1.getTotalTimeSeconds());
     }
 
     /**
@@ -1390,6 +1398,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     @Override
     @Transactional
     public R checkAndSaveOrUpdateBlank(CheckAndSaveOrUpdateBlankReq req) {
+        //获取校验级别
+        Integer checkLevel = req.getCheckLevel();
+
         //获取坯料计划内容
         ApsBlankOrderDo apsBlankOrderDo = req.getApsBlankOrderDo();
         //获取当前用户信息
@@ -1411,22 +1422,24 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 }
             }
         }
-        //==============拼接工艺路线输出成品==============
-        //查询坯料计划对应工艺路线的输出成品
-        List<String> processOutputList = this.baseMapper.selectProcessByBlankId(apsBlankOrderDo.getId());
-        if (processOutputList != null && processOutputList.size() > 0) {
-            String outputProcessMaterial = "";
-            //排序
-            processOutputList.sort(String::compareTo);
-            for (int i = 0; i < processOutputList.size(); i++) {
-                outputProcessMaterial += "[" + (i + 1) + "]" + processOutputList.get(i);
-                if (i < processOutputList.size() - 1) {
-                    outputProcessMaterial += ",\r\n";
+        if (checkLevel == 3) {
+            //==============拼接工艺路线输出成品==============
+            //查询坯料计划对应工艺路线的输出成品
+            List<String> processOutputList = this.baseMapper.selectProcessByBlankId(apsBlankOrderDo.getId());
+            if (processOutputList != null && processOutputList.size() > 0) {
+                String outputProcessMaterial = "";
+                //排序
+                processOutputList.sort(String::compareTo);
+                for (int i = 0; i < processOutputList.size(); i++) {
+                    outputProcessMaterial += "[" + (i + 1) + "]" + processOutputList.get(i);
+                    if (i < processOutputList.size() - 1) {
+                        outputProcessMaterial += ",\r\n";
+                    }
                 }
+                apsBlankOrderDo.setOutputmaterial(outputProcessMaterial);
+            } else {
+                return R.error("工艺路线没有输出成品");
             }
-            apsBlankOrderDo.setOutputmaterial(outputProcessMaterial);
-        } else {
-            return R.error("工艺路线没有输出成品");
         }
 
         //=============校验输出成品==============
@@ -1519,6 +1532,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 已修改或已删除,并已开工,计划输出订单重量 不能大于 0");
             }
         }
+
+        /**
+         * 如果所选产品明细对应技术要求的坯料类型,或者坯料产品类型与当前坯料需求的不同,
+         * 错误提示:所选产品的坯料类型,或者坯料产品类型与当前坯料需求的技术要求不同,不可作为该坯料的输出成品
+         */
+        for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
+            if (!apsProcessOutputProductDo.getBlanktype().equals(apsBlankOrderDo.getBlanktype()) || !apsProcessOutputProductDo.getBlankproducttype().equals(apsBlankOrderDo.getProducttype())) {
+                return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 所选产品的坯料类型,或者坯料产品类型与当前坯料需求的技术要求不同,不可作为该坯料的输出成品");
+            }
+        }
+
+
         //如果存在订单产品和输出单卷重都相同坯料输出成品,错误提示:以下坯料输出成品重复:{订单产品1}{输出单卷重}{数量单位},{订单产品2}{输出单卷重}{数量单位}
         //组装一下list
         List<String> processOutputDesList = apsProcessOutputProductDoList.stream().map(item -> {
@@ -1559,33 +1584,40 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
 
-        //============校验工艺路线=============
-        //如果坯料需求的坯料输出成品字段值不等于坯料需求的工艺输出成品字段值,错误提示:工艺路线输出成品与坯料输出成品不一致
-        if (!apsBlankOrderDo.getOutputfinishproduct().equals(apsBlankOrderDo.getOutputmaterial())) {
-            return R.error("工艺路线输出成品" + apsBlankOrderDo.getOutputmaterial() + "与坯料输出成品" + apsBlankOrderDo.getOutputfinishproduct() + "不一致");
+        if (checkLevel == 3) {
+            //============校验工艺路线=============
+            //如果坯料需求的坯料输出成品字段值不等于坯料需求的工艺输出成品字段值,错误提示:工艺路线输出成品与坯料输出成品不一致
+            if (!apsBlankOrderDo.getOutputfinishproduct().equals(apsBlankOrderDo.getOutputmaterial())) {
+                return R.error("工艺路线输出成品" + apsBlankOrderDo.getOutputmaterial() + "与坯料输出成品" + apsBlankOrderDo.getOutputfinishproduct() + "不一致");
+            }
         }
-        //如果坯料需求的是否备料=是,并且首道工序作业的是否坯料工序=是,错误提示:工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料
-        //是否备料
-        if (apsBlankOrderDo.getPreparematerial().equals("是")) {
-            //查询坯料计划的工序作业
-            List<ApsProcessOperationDo> processOperationList = apsProcessOperationService.list(new QueryWrapper<ApsProcessOperationDo>().lambda().eq(ApsProcessOperationDo::getBlankid, apsBlankOrderDo.getId()));
-            for (ApsProcessOperationDo processOperationDo : processOperationList) {
-                //没有前道工序作业ID
-                if (ObjectUtil.isEmpty(processOperationDo.getPreviousprocessid())) {
-                    if (processOperationDo.getIfblankprocess().equals("是")) {
-                        return R.error("工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料");
+
+        if (checkLevel == 2 || checkLevel == 3) {
+            //如果坯料需求的是否备料=是,并且首道工序作业的是否坯料工序=是,错误提示:工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料
+            //是否备料
+            if (apsBlankOrderDo.getPreparematerial().equals("是")) {
+                //查询坯料计划的工序作业
+                List<ApsProcessOperationDo> processOperationList = apsProcessOperationService.list(new QueryWrapper<ApsProcessOperationDo>().lambda().eq(ApsProcessOperationDo::getBlankid, apsBlankOrderDo.getId()));
+                for (ApsProcessOperationDo processOperationDo : processOperationList) {
+                    //没有前道工序作业ID
+                    if (ObjectUtil.isEmpty(processOperationDo.getPreviousprocessid())) {
+                        if (processOperationDo.getIfblankprocess().equals("是")) {
+                            return R.error("工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料");
+                        }
+                        break;
                     }
-                    break;
                 }
             }
         }
 
-        //============校验工序作业=============
-        Map<String, Object> params = new HashMap<>();
-        params.put("BLANKID", apsBlankOrderDo.getId());
-        R r = apsProcessOperationService.checkOperation(params);
-        if (!(r.getCode().equals("200"))) {
-            return R.error(r.getMsg());
+        if (checkLevel == 3) {
+            //============校验工序作业=============
+            Map<String, Object> params = new HashMap<>();
+            params.put("BLANKID", apsBlankOrderDo.getId());
+            R r = apsProcessOperationService.checkOperation(params);
+            if (!(r.getCode().equals("200"))) {
+                return R.error(r.getMsg());
+            }
         }
 
         //更新或保存坯料计划和输出成品
@@ -1631,6 +1663,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
 
     public R checkBlankOrder(CheckAndSaveOrUpdateBlankReq req, int j) {
+        //获取校验等级
+        Integer checkLevel = req.getCheckLevel();
         //获取坯料计划内容
         ApsBlankOrderDo apsBlankOrderDo = req.getApsBlankOrderDo();
         //获取当前用户信息
@@ -1652,41 +1686,43 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 }
             }
         }
-        //==============校验交期==================
-        /**
-         * 如果有评审日志,并且变更内容为空,则错误提示:请填写变更内容(暂未实现)
-         * 如果有任一坯料计划的承诺交货期-起或止为空,错误提示:请填写所有坯料计划的承诺交货期
-         * 如果有坯料计划的承诺交货期-止 < 排程交货期,错误提示:第{几}个坯料计划的承诺交货期-止不能早于排程交货期{排程交货期}
-         */
-        if (req.getCheckDevice()) {
-            if (ObjectUtil.isEmpty(apsBlankOrderDo.getPromisedateend())) {
-                return R.error("请填写所有坯料计划的承诺交货期-止");
-            }
-            if (ObjectUtil.isEmpty(apsBlankOrderDo.getScheduledateend())) {
-                return R.error("第" + j + "个坯料计划 排程交货期-止不能为空");
-            }
-            if (apsBlankOrderDo.getPromisedateend().compareTo(apsBlankOrderDo.getScheduledateend()) < 0) {
-                return R.error("第" + j + "个坯料计划的承诺交货期-止不能早于排程交货期-止" + DateUtil.format(apsBlankOrderDo.getScheduledateend(), "yyyy-MM-dd"));
+        if (checkLevel == 3) {
+            //==============校验交期==================
+            /**
+             * 如果有评审日志,并且变更内容为空,则错误提示:请填写变更内容(暂未实现)
+             * 如果有任一坯料计划的承诺交货期-起或止为空,错误提示:请填写所有坯料计划的承诺交货期
+             * 如果有坯料计划的承诺交货期-止 < 排程交货期,错误提示:第{几}个坯料计划的承诺交货期-止不能早于排程交货期{排程交货期}
+             */
+            if (req.getCheckDevice()) {
+                if (ObjectUtil.isEmpty(apsBlankOrderDo.getPromisedateend())) {
+                    return R.error("请填写所有坯料计划的承诺交货期-止");
+                }
+                if (ObjectUtil.isEmpty(apsBlankOrderDo.getScheduledateend())) {
+                    return R.error("第" + j + "个坯料计划 排程交货期-止不能为空");
+                }
+                if (apsBlankOrderDo.getPromisedateend().compareTo(apsBlankOrderDo.getScheduledateend()) < 0) {
+                    return R.error("第" + j + "个坯料计划的承诺交货期-止不能早于排程交货期-止" + DateUtil.format(apsBlankOrderDo.getScheduledateend(), "yyyy-MM-dd"));
+                }
             }
-        }
 
 
-        //==============拼接工艺路线输出成品==============
-        //查询坯料计划对应工艺路线的输出成品
-        List<String> processOutputList = this.baseMapper.selectProcessByBlankId(apsBlankOrderDo.getId());
-        if (processOutputList != null && processOutputList.size() > 0) {
-            String outputProcessMaterial = "";
-            //排序
-            processOutputList.sort(String::compareTo);
-            for (int i = 0; i < processOutputList.size(); i++) {
-                outputProcessMaterial += "[" + (i + 1) + "]" + processOutputList.get(i);
-                if (i < processOutputList.size() - 1) {
-                    outputProcessMaterial += ",\r\n";
+            //==============拼接工艺路线输出成品==============
+            //查询坯料计划对应工艺路线的输出成品
+            List<String> processOutputList = this.baseMapper.selectProcessByBlankId(apsBlankOrderDo.getId());
+            if (processOutputList != null && processOutputList.size() > 0) {
+                String outputProcessMaterial = "";
+                //排序
+                processOutputList.sort(String::compareTo);
+                for (int i = 0; i < processOutputList.size(); i++) {
+                    outputProcessMaterial += "[" + (i + 1) + "]" + processOutputList.get(i);
+                    if (i < processOutputList.size() - 1) {
+                        outputProcessMaterial += ",\r\n";
+                    }
                 }
+                apsBlankOrderDo.setOutputmaterial(outputProcessMaterial);
+            } else {
+                return R.error("第" + j + "个坯料计划 工艺路线没有输出成品");
             }
-            apsBlankOrderDo.setOutputmaterial(outputProcessMaterial);
-        } else {
-            return R.error("第" + j + "个坯料计划 工艺路线没有输出成品");
         }
 
         //=============校验输出成品==============
@@ -1771,11 +1807,23 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
 
+        /**
+         * 如果所选产品明细对应技术要求的坯料类型,或者坯料产品类型与当前坯料需求的不同,
+         * 错误提示:所选产品的坯料类型,或者坯料产品类型与当前坯料需求的技术要求不同,不可作为该坯料的输出成品
+         */
+        for (ApsProcessOutputProductDo apsProcessOutputProductDo : apsProcessOutputProductDoList) {
+            if (!apsProcessOutputProductDo.getBlanktype().equals(apsBlankOrderDo.getBlanktype()) || !apsProcessOutputProductDo.getBlankproducttype().equals(apsBlankOrderDo.getProducttype())) {
+                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 所选产品的坯料类型,或者坯料产品类型与当前坯料需求的技术要求不同,不可作为该坯料的输出成品");
+            }
+        }
+
 
-        //============校验工艺路线=============
-        //如果坯料需求的坯料输出成品字段值不等于坯料需求的工艺输出成品字段值,错误提示:工艺路线输出成品与坯料输出成品不一致
-        if (!apsBlankOrderDo.getOutputfinishproduct().equals(apsBlankOrderDo.getOutputmaterial())) {
-            return R.error("第" + j + "个坯料计划 工艺路线输出成品" + apsBlankOrderDo.getOutputmaterial() + "与坯料输出成品" + apsBlankOrderDo.getOutputfinishproduct() + "不一致");
+        if (checkLevel == 3) {
+            //============校验工艺路线=============
+            //如果坯料需求的坯料输出成品字段值不等于坯料需求的工艺输出成品字段值,错误提示:工艺路线输出成品与坯料输出成品不一致
+            if (!apsBlankOrderDo.getOutputfinishproduct().equals(apsBlankOrderDo.getOutputmaterial())) {
+                return R.error("第" + j + "个坯料计划 工艺路线输出成品" + apsBlankOrderDo.getOutputmaterial() + "与坯料输出成品" + apsBlankOrderDo.getOutputfinishproduct() + "不一致");
+            }
         }
         //如果坯料需求的是否备料=是,并且首道工序作业的是否坯料工序=是,错误提示:工艺路线错误,首道工序作业是坯料工序,备料不能作为输入物料
         //是否备料
@@ -1793,15 +1841,17 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
 
-        //============校验工序作业=============
-        Map<String, Object> params = new HashMap<>();
-        params.put("BLANKID", apsBlankOrderDo.getId());
-        if (req.getCheckDevice()) {
-            params.put("checkDeviceAndOrgCode", true);
-        }
-        R r = apsProcessOperationService.checkOperation(params);
-        if (!(r.getCode().equals("200"))) {
-            return R.error("第" + j + "个坯料计划 " + r.getMsg());
+        if (checkLevel == 3) {
+            //============校验工序作业=============
+            Map<String, Object> params = new HashMap<>();
+            params.put("BLANKID", apsBlankOrderDo.getId());
+            if (req.getCheckDevice()) {
+                params.put("checkDeviceAndOrgCode", true);
+            }
+            R r = apsProcessOperationService.checkOperation(params);
+            if (!(r.getCode().equals("200"))) {
+                return R.error("第" + j + "个坯料计划 " + r.getMsg());
+            }
         }
         return R.ok();
     }

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

@@ -646,7 +646,9 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
 
                         //前道工序输出
                         List<PreviousProcessVo> processVo = newProcessIds.stream().filter(pro -> pro.getPreviousstepid().equals(apsProcessOperationDo1.getPreviousprocessid())).collect(Collectors.toList());
+                        List<ApsProcessOperationOutMaterDo> outMaterDos = processVo.get(0).getApsProcessOperationOutMaterDos().stream().filter(out -> out.getRoption().equals(apsProcessOperationDo1.getPlaninputid())).collect(Collectors.toList());
                         processOperationDo.setPreviousprocessid(processVo.get(0).getProcessId());
+                        processOperationDo.setPlaninputid(outMaterDos.get(0).getId());
 
                         //更新前道工序的后道工序
                         ApsProcessOperationDo aDo = apsProcessOperationDoList.stream().filter(qtr -> processVo.get(0).getProcessId().equals(qtr.getId())).findAny().orElse(null);
@@ -656,10 +658,6 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                             aDo.setNextprocessid(aDo.getNextprocessid() + "," + processId);
                         }
 
-                        //本道工序信息
-                        previousProcessVo.setProcessId(processId);
-                        previousProcessVo.setPreviousstepid(apsProcessOperationDo1.getId());
-
                         //本道工序的输出
                         List<ApsProcessOperationOutMaterDo> apsProcessOperationOutMaterDos1 = apsProcessOperationOutMaterDos.stream().filter(omd -> apsProcessOperationDo1.getId().equals(omd.getMainid())).collect(Collectors.toList());
                         if (apsProcessOperationOutMaterDos1.size() == 0) {
@@ -667,12 +665,18 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                         }
                         for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : apsProcessOperationOutMaterDos1) {
                             ApsProcessOperationOutMaterDo processOperationOutMaterDo = BeanUtil.toBean(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo.class);
+                            processOperationOutMaterDo.setRoption(apsProcessOperationOutMaterDo.getId());
                             processOperationOutMaterDo.setId(SecurityUtil.getUUID());
                             processOperationOutMaterDo.setMainid(processId);
                             processOperationOutMaterDo.setBlankid(oldblankid);
                             apsProcessOperationOutMaterDoList.add(processOperationOutMaterDo);
                         }
 
+                        //本道工序信息
+                        previousProcessVo.setProcessId(processId);
+                        previousProcessVo.setPreviousstepid(apsProcessOperationDo1.getId());
+                        previousProcessVo.setApsProcessOperationOutMaterDos(apsProcessOperationOutMaterDoList);
+
                         //本道工序的可选设备
                         List<ApsProcessOperationEquDo> apsProcessOperationEquDos1 = apsProcessOperationEquDos.stream().filter(crse -> apsProcessOperationDo1.getId().equals(crse.getMainid())).collect(Collectors.toList());
                         for (ApsProcessOperationEquDo apsProcessOperationEquDo : apsProcessOperationEquDos1) {
@@ -720,11 +724,13 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                     }
                     for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : apsProcessOperationOutMaterDos1) {
                         ApsProcessOperationOutMaterDo processOperationOutMaterDo = BeanUtil.toBean(apsProcessOperationOutMaterDo, ApsProcessOperationOutMaterDo.class);
+                        processOperationOutMaterDo.setRoption(apsProcessOperationOutMaterDo.getId());
                         processOperationOutMaterDo.setId(SecurityUtil.getUUID());
                         processOperationOutMaterDo.setMainid(processId);
                         processOperationOutMaterDo.setBlankid(oldblankid);
                         apsProcessOperationOutMaterDoList.add(processOperationOutMaterDo);
                     }
+                    previousProcessVo.setApsProcessOperationOutMaterDos(apsProcessOperationOutMaterDoList);
 
                     //本道工序的可选设备
                     List<ApsProcessOperationEquDo> apsProcessOperationEquDos1 = apsProcessOperationEquDos.stream().filter(omd -> apsProcessOperationDo.getId().equals(omd.getMainid())).collect(Collectors.toList());
@@ -1538,6 +1544,9 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
      */
     private BigDecimal changeSize(BigDecimal oldVal, String countRule, BigDecimal changeVal, BigDecimal curVal) {
         BigDecimal newVal = null;
+        if (!StringUtils.isNotBlank(countRule)) {
+            return oldVal;
+        }
         if (!countRule.equals("自定义") && oldVal != null) {
             if (countRule.equals("=")) {
                 newVal = changeVal;

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

@@ -161,6 +161,7 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
                 apsProductionOrderDo.setRemark(vNcOrderVo.getRemark());
                 apsProductionOrderDo.setDeliverydate(vNcOrderVo.getDeliverydate());
                 apsProductionOrderDo.setBelongfactory(vNcOrderVo.getBelongfactory());
+                apsProductionOrderDo.setIsfromcustom("1");
 
                 //明细
                 //客户订单系统的明细数据
@@ -331,6 +332,7 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
             apsProductionMergeOrderDo.setRemark(vNcOrderVo.getRemark());
             apsProductionMergeOrderDo.setDeliverydate(vNcOrderVo.getDeliverydate());
             apsProductionMergeOrderDo.setBelongfactory(vNcOrderVo.getBelongfactory());
+            apsProductionMergeOrderDo.setIsfromcustom("1");
 
             //明细
             //客户订单系统的明细数据

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

@@ -147,14 +147,18 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         List<ApsBlankOrderDo> apsBlankOrderDoList = apsBlankOrderDao.selectList(new QueryWrapper<ApsBlankOrderDo>().lambda().eq(ApsBlankOrderDo::getProductionorderid, apsProductionOrderDo.getId()).orderByDesc(ApsBlankOrderDo::getModifydate));
         //是否需要检验坯料计划是否已排程
         Boolean checkSchedule = req.getCheckSchedule();
+        //坯料计划校验等级
+        Integer checkLevel = req.getCheckLevel();
 
         //=========检查坯料计划的个数和状态=============
         if (ObjectUtil.isEmpty(apsBlankOrderDoList)) {
             return R.error("坯料计划至少有一个");
         }
-        for (int i = 0; i < apsBlankOrderDoList.size(); i++) {
-            if (apsBlankOrderDoList.get(i).getIsstag().equals("是")) {
-                return R.error("第" + (i + 1) + "个坯料计划为暂存数据,请先保存再提交");
+        if (checkLevel == 3) {
+            for (int i = 0; i < apsBlankOrderDoList.size(); i++) {
+                if (apsBlankOrderDoList.get(i).getIsstag().equals("是")) {
+                    return R.error("第" + (i + 1) + "个坯料计划未提交坯料计划,请先提交坯料计划,再提交流程");
+                }
             }
         }
 
@@ -251,9 +255,11 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
             checkAndSaveOrUpdateBlankReq.setApsBlankOrderDo(apsBlankOrderDoList.get(i));
             checkAndSaveOrUpdateBlankReq.setApsProcessOutputProductDoList(apsProcessOutputProductService.list(new QueryWrapper<ApsProcessOutputProductDo>().lambda().eq(ApsProcessOutputProductDo::getBlankid, apsBlankOrderDoList.get(i).getId())));
             checkAndSaveOrUpdateBlankReq.setApsProductDetailDoList(productDetailDoList);
+            checkAndSaveOrUpdateBlankReq.setCheckLevel(checkLevel);
             if (checkSchedule) {
                 checkAndSaveOrUpdateBlankReq.setCheckDevice(true);
             }
+
             R r = apsBlankOrderService.checkBlankOrder(checkAndSaveOrUpdateBlankReq, i + 1);
             if (!r.getCode().equals("200")) {
                 return R.error(r.getMsg());

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

@@ -229,8 +229,8 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         apsReportRecordsDo.setChiefoperatorname(currentUser.getName());
         //开工时间
         apsReportRecordsDo.setStartworktime(DateUtil.date());
-        //报工时间
-        apsReportRecordsDo.setReportworktime(DateUtil.date());
+//        //报工时间
+//        apsReportRecordsDo.setReportworktime(DateUtil.date());
         //报工状态
         apsReportRecordsDo.setReportworkstatus("已开工");
         apsReportRecordsDo.setCheckstatus("待检验");
@@ -503,6 +503,11 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         apsReportRecordsDo.setHeatnumber(heatNumber);
         //报工状态
         apsReportRecordsDo.setReportworkstatus("已报工");
+        //如过报工时间为空,填入当前时间
+        if(ObjectUtil.isEmpty(apsReportRecordsDo.getReportworktime())){
+            apsReportRecordsDo.setReportworktime(DateUtil.date());
+        }
+
         this.updateById(apsReportRecordsDo);
 
         //物理删除原来的报工记录输出物料

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

@@ -118,7 +118,7 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         }
         // 获取该工序生成的物料输出信息
         List<ApsReportOutputDo> reportOutputDos = apsReportOutputService.list(new LambdaQueryWrapper<ApsReportOutputDo>()
-                 .eq(ApsReportOutputDo::getCheckstatus,"待检验")
+//                .eq(ApsReportOutputDo::getCheckstatus,"待检验")
                 .eq(ApsReportOutputDo::getMainid, id)
                 .eq(BaseDo::getDeleted, NO_DELETED));
         if (reportOutputDos.isEmpty()) {

+ 10 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductionOrderDo.java

@@ -607,6 +607,16 @@ public class ApsProductionOrderDo extends BaseDo implements Serializable {
      */
     private String deputygeneralmanagername;
 
+    /**
+     * 变更说明
+     */
+    private String changefile;
+
+    /**
+     * 流程状态
+     */
+    private String processstatustext;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 3 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CheckAndSaveOrUpdateBlankReq.java

@@ -27,4 +27,7 @@ public class CheckAndSaveOrUpdateBlankReq {
 
     //是否需要检验坯料计划的工序作业的加工设备
     private Boolean checkDevice = false;
+
+    //检验级别 默认最高级别(1:校验坯料需求,2:校验坯料需求和工艺路线【不校验分卷数量和重量】,3:全部校验)
+    private Integer checkLevel = 3;
 }

+ 3 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CheckAndSaveOrUpdateOrderReq.java

@@ -34,4 +34,7 @@ public class CheckAndSaveOrUpdateOrderReq {
 
     //是否需要发布
     private Boolean isNeedPublish = false;
+
+    //坯料计划 校验等级
+    private Integer checkLevel = 3;
 }

+ 3 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/PreviousProcessVo.java

@@ -4,6 +4,7 @@ import com.rongwei.bsentity.domain.ApsProcessOperationOutMaterDo;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 public class PreviousProcessVo {
@@ -17,4 +18,6 @@ public class PreviousProcessVo {
     private Integer planprocessrall;
     //工序输出
     private ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo;
+    //工序多个输出
+    private List<ApsProcessOperationOutMaterDo> apsProcessOperationOutMaterDos;
 }

+ 6 - 0
cx-safe-check/cx-save-check-common/pom.xml

@@ -31,6 +31,12 @@
             <artifactId>easyexcel</artifactId>
             <version>3.3.2</version>
         </dependency>
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-base</artifactId>
+            <version>4.4.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 14 - 0
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/dao/SaveCheckCommonDao.java

@@ -1,9 +1,13 @@
 package com.rongwei.sfcommon.sys.dao;
 
 
+import com.rongwe.scentity.vo.CheckAreaVo;
 import com.rongwe.scentity.vo.UserMailOrgVo;
+import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -30,4 +34,14 @@ public interface SaveCheckCommonDao {
                                                         @Param("tenantId") String tenantId);
 
     List<UserMailOrgVo> getUserInfoByTenantIdAndRoleCode(@Param("tenantId") String tenantId,@Param("roleCodes") List<String> roleCodes);
+
+    @Select("select * from sys_file_item where ID = #{id}")
+    SysFileItemDo getFileItemByID(@Param("id") String id);
+
+
+    List<CheckAreaVo> getCheckArea(@Param("tenantid")String tenantid);
+
+    List<SysOrganizationDo> getOrgByTenantId(@Param("tenantid")String tenantid);
+
+    List<SysUserDo> getUserInfoByTenantId(@Param("tenantid")String tenantid);
 }

+ 4 - 0
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/AspSafeAttachmentsService.java

@@ -4,9 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwe.scentity.domian.AspSafeAttachmentsDo;
 import com.rongwei.rwcommon.base.R;
 
+import java.util.Map;
+
 /**
  *
  */
 public interface AspSafeAttachmentsService extends IService<AspSafeAttachmentsDo> {
   R stateUpdateScheduledTasks();
+
+  R importExcel(Map<String, String> queryParameter);
 }

+ 3 - 0
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/sys/service/CheckItemsService.java

@@ -7,6 +7,7 @@ import com.rongwe.scentity.domian.CheckItemsDo;
 import com.rongwei.rwcommon.base.R;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -25,5 +26,7 @@ public interface CheckItemsService extends IService<CheckItemsDo> {
     void reportEquMessage();
 
     R stateUpdateScheduledTasks();
+
+    R importExcel(Map<String, String> queryParameter);
 }
 

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

@@ -1,19 +1,34 @@
 package com.rongwei.sfcommon.sys.service.impl;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwe.scentity.domian.AspSafeAttachmentsDo;
+import com.rongwe.scentity.vo.CheckAreaVo;
+import com.rongwe.scentity.vo.ImportAspSafeAttachmentsVo;
 import com.rongwe.scentity.vo.UserMailOrgVo;
+import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
+import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.sfcommon.sys.dao.AspSafeAttachmentsDao;
 import com.rongwei.sfcommon.sys.dao.SaveCheckCommonDao;
 import com.rongwei.sfcommon.sys.service.AspSafeAttachmentsService;
+import com.rongwei.sfcommon.utils.ClassExcelVerifyHandler;
+import lombok.SneakyThrows;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
@@ -42,10 +57,20 @@ public class AspSafeAttachmentsServiceImpl extends ServiceImpl<AspSafeAttachment
      * 特种设备管理员
      */
     public static final String SPECIAL_EQUIPMENT_ADMINISTRATOR = "role031";
+    public static final String EMPTY_ERROR_MSG = "第%s行 %s 为空";
+    public static final String DATE_FORMAT_ERROR_MSG = "第%s行 %s 时间格式不正确";
+    public static final List<SimpleDateFormat> DATE_FORMAT_LIST = new ArrayList<SimpleDateFormat>() {{
+        add(new SimpleDateFormat("yyyy-MM-dd"));
+        add(new SimpleDateFormat("yyyy/MM/dd"));
+        add(new SimpleDateFormat("yyyy.MM.dd"));
+        add(new SimpleDateFormat("yyyyMMdd"));
+    }};
 
     private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
     @Autowired
     private SaveCheckCommonDao saveCheckCommonDao;
+    @Autowired
+    private ClassExcelVerifyHandler verifyHandler;
 
     @Override
     public R stateUpdateScheduledTasks() {
@@ -92,6 +117,11 @@ public class AspSafeAttachmentsServiceImpl extends ServiceImpl<AspSafeAttachment
         return R.ok();
     }
 
+    /**
+     * 发送消息提醒
+     *
+     * @param sendNotifyMap
+     */
     public void sendNotify(Map<AspSafeAttachmentsDo, List<String>> sendNotifyMap) {
         sendNotifyMap.forEach((k, v) -> {
             // 发送消息提醒
@@ -101,6 +131,159 @@ public class AspSafeAttachmentsServiceImpl extends ServiceImpl<AspSafeAttachment
                     k.getId(), SAFETY_ATTACHMENT_VERIFICATION, false);
         });
     }
+
+    /**
+     * 导入excel
+     *
+     * @param queryParameter
+     * @return
+     */
+    @SneakyThrows
+    @Override
+    public R importExcel(Map<String, String> queryParameter) {
+        String fileId = queryParameter.getOrDefault("fileId", "");
+        CXCommonUtils.parameterCheck(() -> StringUtils.isBlank(fileId), "请上传文件", "文件ID为空");
+        SysFileItemDo fileItemDo = saveCheckCommonDao.getFileItemByID(fileId);
+        CXCommonUtils.parameterCheck(() -> fileItemDo == null, "文件解析有误!请联系管理员", "无法根据文件ID:{},获取到文件信息", fileId);
+        String realPath = fileItemDo.getFullpath();
+        CXCommonUtils.parameterCheck(() -> StringUtils.isBlank(realPath), "文件解析有误!请联系管理员", "根据文件ID:{},无法获取到文件路径", fileId);
+        File file = new File(realPath);
+        CXCommonUtils.parameterCheck(() -> !file.exists(), "文件解析有误!请联系管理员", "根据文件地址:{},无法获取文件", realPath);
+        ImportParams params = new ImportParams();
+        params.setTitleRows(0);
+        params.setHeadRows(1);
+        params.setVerifyHandler(verifyHandler);
+        List<ImportAspSafeAttachmentsVo> userList = ExcelImportUtil.importExcel(file, ImportAspSafeAttachmentsVo.class, params);
+        log.info("userList:{}",userList);
+        // 存放异常数据
+        List<String> errorMsgList = new ArrayList<>();
+        // 解析后的数据
+        List<AspSafeAttachmentsDo> saveList = new ArrayList<>();
+        ImportAspSafeAttachmentsVo importAspSafeAttachmentsVo;
+        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+        String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
+        //获取区域信息
+        Map<String, String> checkAreaMap = saveCheckCommonDao.getCheckArea(tenantId).stream().collect(Collectors.toMap(CheckAreaVo::getName, CheckAreaVo::getId, (v1, v2) -> v1));
+        // 获取组织机构信息
+        Map<String, String> orgMap = saveCheckCommonDao.getOrgByTenantId(tenantId).stream().collect(Collectors.toMap(SysOrganizationDo::getFullname, SysOrganizationDo::getId, (v1, v2) -> v1));
+        // 用户信息
+        Map<String, String> userMap = saveCheckCommonDao.getUserInfoByTenantId(tenantId).stream().collect(Collectors.toMap(SysUserDo::getName, SysUserDo::getId, (v1, v2) -> v1));
+
+        for (int i = 0; i < userList.size(); i++) {
+            importAspSafeAttachmentsVo = userList.get(i);
+            // 数据格式校验
+            checkDataAccuracy(i + 1, importAspSafeAttachmentsVo, errorMsgList);
+
+            if (StringUtils.isNotBlank(importAspSafeAttachmentsVo.getTreeName()) && !checkAreaMap.containsKey(importAspSafeAttachmentsVo.getTreeName())) {
+                errorMsgList.add("第" + (i + 1) + "行树表名称不存在");
+            }
+            if (errorMsgList.isEmpty()) {
+                saveList.add(voToDo(importAspSafeAttachmentsVo, checkAreaMap, orgMap, userMap, tenantId));
+            }
+        }
+        if (!errorMsgList.isEmpty()) {
+            log.error("excel数据异常:{}", errorMsgList);
+            throw new CustomException(StringUtils.join(errorMsgList, ";"));
+        }
+        if (!saveList.isEmpty()) {
+            this.saveBatch(saveList, 100);
+        }
+
+        return R.ok();
+    }
+
+    private void checkDataAccuracy(int index, ImportAspSafeAttachmentsVo importAspSafeAttachmentsVo, List<String> errorMsgList) {
+        if (StringUtils.isBlank(importAspSafeAttachmentsVo.getTreeName())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "左侧树表"));
+        }
+        if (StringUtils.isBlank(importAspSafeAttachmentsVo.getAttachmenttype())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "附件类型"));
+        }
+        if (StringUtils.isBlank(importAspSafeAttachmentsVo.getName())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "名称"));
+        }
+        if (StringUtils.isBlank(importAspSafeAttachmentsVo.getInspectionstr())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "检验/更换日期"));
+        }
+        if (StringUtils.isBlank(importAspSafeAttachmentsVo.getNextinspectionstr())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "下次检验/更换日期"));
+        }
+        if (StringUtils.isBlank(importAspSafeAttachmentsVo.getCertificatenumber())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "证书/报告编号"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(importAspSafeAttachmentsVo.getManufacturestr()) && dateFormatValidation(importAspSafeAttachmentsVo.getManufacturestr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "出厂日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(importAspSafeAttachmentsVo.getNextinspectionstr()) && dateFormatValidation(importAspSafeAttachmentsVo.getNextinspectionstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "下次检验/更换日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(importAspSafeAttachmentsVo.getInspectionstr()) &&  dateFormatValidation(importAspSafeAttachmentsVo.getInspectionstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "检验/更换日期"));
+        }
+    }
+
+    private Date dateFormatValidation(String strDate) {
+        Date date = null;
+        for (SimpleDateFormat simpleDateFormat : DATE_FORMAT_LIST) {
+            try {
+                date = simpleDateFormat.parse(strDate);
+                break;
+            } catch (Exception e) {
+                log.info("时间格式不正确");
+            }
+        }
+        return date;
+    }
+
+    /**
+     * vo 转 do
+     *
+     * @param checkArea
+     * @param vo
+     * @return
+     */
+    private AspSafeAttachmentsDo voToDo(ImportAspSafeAttachmentsVo vo,
+                                        Map<String, String> checkAreaMap,
+                                        Map<String, String> orgMap,
+                                        Map<String, String> userMap,
+                                        String tenantId) {
+        AspSafeAttachmentsDo aspSafeAttachmentsDo = new AspSafeAttachmentsDo();
+        BeanUtils.copyProperties(vo, aspSafeAttachmentsDo);
+        aspSafeAttachmentsDo.setId(SecurityUtil.getUUID());
+        aspSafeAttachmentsDo.setTenantid(tenantId);
+        aspSafeAttachmentsDo.setCreatedate(new Date());
+        aspSafeAttachmentsDo.setMainid(checkAreaMap.get(vo.getTreeName()));
+        aspSafeAttachmentsDo.setUseshopid(orgMap.get(vo.getUseshop()));
+        // 时间转换
+        if (StringUtils.isNotBlank(vo.getManufacturestr())) {
+            aspSafeAttachmentsDo.setManufacturedate(dateFormatValidation(vo.getManufacturestr()));
+        }
+
+        aspSafeAttachmentsDo.setInspectiondate(dateFormatValidation(vo.getInspectionstr()));
+        aspSafeAttachmentsDo.setNextinspectiondate(dateFormatValidation(vo.getNextinspectionstr()));
+        if (StringUtils.isNotBlank(vo.getResponsible())) {
+            String ids = Arrays.stream(vo.getResponsible().split(",")).map(username -> userMap.get(username)).collect(Collectors.joining(",0"));
+            // 设置责任人ID
+            aspSafeAttachmentsDo.setResponsibleid(ids);
+        }
+
+        LocalDate date1 = aspSafeAttachmentsDo.getNextinspectiondate().toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        long daysBetween = ChronoUnit.DAYS.between(LocalDate.now(), date1);
+        if (daysBetween <= 30) {
+            aspSafeAttachmentsDo.setReminderstate(HIGH);
+        } else if (daysBetween <= 90) {
+            aspSafeAttachmentsDo.setReminderstate(MIDDLE);
+        } else {
+            aspSafeAttachmentsDo.setReminderstate(LOW);
+        }
+        return aspSafeAttachmentsDo;
+    }
+
 }
 
 

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

@@ -3,6 +3,8 @@ package com.rongwei.sfcommon.sys.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwe.scentity.domian.AspSpecialEquipmentCertificateDo;
 import com.rongwe.scentity.vo.UserMailOrgVo;
+import com.rongwei.rwadmincommon.system.domain.SysDictDo;
+import com.rongwei.rwadmincommon.system.service.SysDictService;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.sfcommon.sys.dao.AspSpecialEquipmentCertificateDao;
@@ -11,7 +13,6 @@ import com.rongwei.sfcommon.sys.service.AspSpecialEquipmentCertificateService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
@@ -22,9 +23,7 @@ import java.util.stream.Collectors;
 
 import static com.rongwei.safecommon.utils.SaveConstans.*;
 import static com.rongwei.safecommon.utils.SaveConstans.NotifyContent.PERSONNEL_CERTIFICATES_CONTENT;
-import static com.rongwei.safecommon.utils.SaveConstans.NotifyContent.SAFETY_ATTACHMENT_VERIFICATION_CONTENT;
 import static com.rongwei.safecommon.utils.SaveConstans.NotifyTitle.PERSONNEL_CERTIFICATES_TITLE;
-import static com.rongwei.safecommon.utils.SaveConstans.NotifyTitle.SAFETY_ATTACHMENT_VERIFICATION_TITLE;
 import static com.rongwei.safecommon.utils.SaveConstans.NotifyType.PERSONNEL_CERTIFICATES;
 
 /**
@@ -48,6 +47,8 @@ public class AspSpecialEquipmentCertificateServiceImpl extends ServiceImpl<AspSp
     private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
     @Autowired
     private SaveCheckCommonDao saveCheckCommonDao;
+    @Autowired
+    private SysDictService sysDictService;
 
     @Override
     public R stateUpdateScheduledTasks() {
@@ -95,10 +96,15 @@ public class AspSpecialEquipmentCertificateServiceImpl extends ServiceImpl<AspSp
 
 
     public void sendNotify(Map<AspSpecialEquipmentCertificateDo, List<String>> sendNotifyMap) {
+        // 获取数据字典
+        List<SysDictDo> aspCheckItemType = sysDictService.getDictsByType("asp_check_item_type");
         sendNotifyMap.forEach((k, v) -> {
+            SysDictDo sysDictDo = aspCheckItemType.stream()
+                    .filter(info -> info.getValue().equals(k.getCertificatesort()))
+                    .findFirst().orElse(null);
             // 发送消息提醒
             CXCommonUtils.sendNotify(PERSONNEL_CERTIFICATES_TITLE,
-                    String.format(PERSONNEL_CERTIFICATES_CONTENT, k.getName(), k.getOrgname(), k.getCertificatesort(),
+                    String.format(PERSONNEL_CERTIFICATES_CONTENT, k.getName(), k.getOrgname(), sysDictDo == null ? "" : sysDictDo.getName(),
                             k.getReviewdate()), null, v.stream().distinct().collect(Collectors.toList()),
                     k.getId(), PERSONNEL_CERTIFICATES, false);
         });

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

@@ -1,5 +1,7 @@
 package com.rongwei.sfcommon.sys.service.impl;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -8,21 +10,33 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwe.scentity.domian.CheckItemsDo;
 import com.rongwe.scentity.domian.PointCheckDo;
+import com.rongwe.scentity.vo.CheckAreaVo;
 import com.rongwe.scentity.vo.CheckItemsTypeVo;
+import com.rongwe.scentity.vo.ImportCheckItemsVo;
 import com.rongwe.scentity.vo.UserMailOrgVo;
 import com.rongwei.rwadmincommon.system.domain.SysDictDo;
 import com.rongwei.rwadmincommon.system.service.impl.SysDictServiceImpl;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.sfcommon.sys.dao.CheckItemsDao;
 import com.rongwei.sfcommon.sys.dao.SaveCheckCommonDao;
 import com.rongwei.sfcommon.sys.service.CheckItemsService;
 import com.rongwei.sfcommon.sys.service.PointCheckService;
+import com.rongwei.sfcommon.utils.ClassExcelVerifyHandler;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
@@ -37,7 +51,6 @@ import static com.rongwei.safecommon.utils.SaveConstans.NotifyType.SPECIALEQUIPM
 
 @Service("checkItemsService")
 public class CheckItemsServiceImpl extends ServiceImpl<CheckItemsDao, CheckItemsDo> implements CheckItemsService {
-
     /**
      * 组织机构代码
      */
@@ -45,10 +58,28 @@ public class CheckItemsServiceImpl extends ServiceImpl<CheckItemsDao, CheckItems
         add("code-safe");
         add("role031");
     }};
+    // 设备使用状态数据字典
+    public static final String SBSYZT_DICT = "sbsyzt";
+    // 特种设备类别数据字典
+    public static final String TZSBLB_DICT = "tzsblb";
+    // 检验结论
+    public static final String JYJL_DICT = "jyjl";
+    // 设备类型
+    public static final String CHECK_ITEM_TYPE_DICT = "asp_check_item_type";
+
     /**
      * 特种设备管理员
      */
     public static final String SPECIAL_EQUIPMENT_ADMINISTRATOR = "role031";
+    public static final String EMPTY_ERROR_MSG = "第%s行 %s 为空";
+    public static final String DATE_FORMAT_ERROR_MSG = "第%s行 %s 时间格式不正确";
+    public static final List<SimpleDateFormat> DATE_FORMAT_LIST = new ArrayList<SimpleDateFormat>() {{
+        add(new SimpleDateFormat("yyyy-MM-dd"));
+        add(new SimpleDateFormat("yyyy/MM/dd"));
+        add(new SimpleDateFormat("yyyy.MM.dd"));
+        add(new SimpleDateFormat("yyyyMMdd"));
+    }};
+    private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
     @Autowired
     @Lazy
     private PointCheckService pointCheckService;
@@ -58,6 +89,8 @@ public class CheckItemsServiceImpl extends ServiceImpl<CheckItemsDao, CheckItems
     private SaveCheckCommonDao saveCheckCommonDao;
     @Autowired
     private SysDictServiceImpl sysDictService;
+    @Autowired
+    private ClassExcelVerifyHandler verifyHandler;
 
     /**
      * 设备列表删除验证是否存在点检记录
@@ -207,4 +240,196 @@ public class CheckItemsServiceImpl extends ServiceImpl<CheckItemsDao, CheckItems
                     k.getId(), SPECIALEQUIPMENT, false);
         });
     }
+
+
+    @Override
+    public R importExcel(Map<String, String> queryParameter) {
+        String fileId = queryParameter.getOrDefault("fileId", "");
+        CXCommonUtils.parameterCheck(() -> StringUtils.isBlank(fileId), "请上传文件", "文件ID为空");
+        SysFileItemDo fileItemDo = saveCheckCommonDao.getFileItemByID(fileId);
+        CXCommonUtils.parameterCheck(() -> fileItemDo == null, "文件解析有误!请联系管理员", "无法根据文件ID:{},获取到文件信息", fileId);
+        String realPath = fileItemDo.getFullpath();
+        CXCommonUtils.parameterCheck(() -> StringUtils.isBlank(realPath), "文件解析有误!请联系管理员", "根据文件ID:{},无法获取到文件路径", fileId);
+        File file = new File(realPath);
+        CXCommonUtils.parameterCheck(() -> !file.exists(), "文件解析有误!请联系管理员", "根据文件地址:{},无法获取文件", realPath);
+        ImportParams params = new ImportParams();
+        params.setTitleRows(0);
+        params.setHeadRows(1);
+        params.setVerifyHandler(verifyHandler);
+        List<ImportCheckItemsVo> userList = ExcelImportUtil.importExcel(file, ImportCheckItemsVo.class, params);
+        log.info("userList:{}", userList);
+        // 存放异常数据
+        List<String> errorMsgList = new ArrayList<>();
+        // 解析后的数据
+        List<CheckItemsDo> saveList = new ArrayList<>();
+        ImportCheckItemsVo importCheckItemsVo;
+        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+        String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
+        //获取区域信息
+        Map<String, String> checkAreaMap = saveCheckCommonDao.getCheckArea(tenantId).stream().collect(Collectors.toMap(CheckAreaVo::getName, CheckAreaVo::getId, (v1, v2) -> v1));
+        // 获取组织机构信息
+        Map<String, String> orgMap = null;
+        //saveCheckCommonDao.getOrgByTenantId(tenantId).stream().collect(Collectors.toMap(SysOrganizationDo::getFullname, SysOrganizationDo::getId, (v1, v2) -> v1));
+        // 用户信息
+        Map<String, String> userMap = null;
+        // saveCheckCommonDao.getUserInfoByTenantId(tenantId).stream().collect(Collectors.toMap(SysUserDo::getName, SysUserDo::getId, (v1, v2) -> v1));
+        // 设备使用状态数据字典
+        Map<String, String> deviceStatusDict = sysDictService.getDictsByType(SBSYZT_DICT).stream().collect(Collectors.toMap(SysDictDo::getName, SysDictDo::getValue, (v1, v2) -> v1));
+        Map<String, String> deviceTypeDict = sysDictService.getDictsByType(TZSBLB_DICT).stream().collect(Collectors.toMap(SysDictDo::getName, SysDictDo::getValue, (v1, v2) -> v1));
+        Map<String, String> conclusionTypeDict = sysDictService.getDictsByType(JYJL_DICT).stream().collect(Collectors.toMap(SysDictDo::getName, SysDictDo::getValue, (v1, v2) -> v1));
+        Map<String, String> typeDict = sysDictService.getDictsByType(CHECK_ITEM_TYPE_DICT).stream().collect(Collectors.toMap(SysDictDo::getName, SysDictDo::getValue, (v1, v2) -> v1));
+
+        for (int i = 0; i < userList.size(); i++) {
+            importCheckItemsVo = userList.get(i);
+            // 数据格式校验
+            checkDataAccuracy(i + 1, importCheckItemsVo, errorMsgList);
+
+            if (StringUtils.isNotBlank(importCheckItemsVo.getTreeName()) && !checkAreaMap.containsKey(importCheckItemsVo.getTreeName())) {
+                errorMsgList.add("第" + (i + 1) + "行树表名称不存在");
+            }
+            if (errorMsgList.isEmpty()) {
+                saveList.add(voToDo(importCheckItemsVo, checkAreaMap, tenantId, deviceStatusDict,
+                        deviceTypeDict, conclusionTypeDict, typeDict));
+            }
+        }
+        if (!errorMsgList.isEmpty()) {
+            log.error("excel数据异常:{}", errorMsgList);
+            throw new CustomException(StringUtils.join(errorMsgList, ";"));
+        }
+        if (!saveList.isEmpty()) {
+            this.saveBatch(saveList, 100);
+        }
+
+        return R.ok();
+    }
+
+    private void checkDataAccuracy(int index, ImportCheckItemsVo checkItemsVo, List<String> errorMsgList) {
+        if (StringUtils.isBlank(checkItemsVo.getTreeName())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "左侧树表"));
+        }
+        if (StringUtils.isBlank(checkItemsVo.getCheckitemname())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "设备名称"));
+        }
+        if (StringUtils.isBlank(checkItemsVo.getCheckitemtype())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "设备类型"));
+        }
+        if (StringUtils.isBlank(checkItemsVo.getDevicecheckstr())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "检验日期"));
+        }
+        if (StringUtils.isBlank(checkItemsVo.getNextcheckstr())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "下次检验日期"));
+        }
+        if (StringUtils.isBlank(checkItemsVo.getWarnstr())) {
+            errorMsgList.add(String.format(EMPTY_ERROR_MSG, index, "预计提醒日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(checkItemsVo.getDevicecheckstr()) && dateFormatValidation(checkItemsVo.getDevicecheckstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "检验日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(checkItemsVo.getNextcheckstr()) && dateFormatValidation(checkItemsVo.getNextcheckstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "下次检验日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(checkItemsVo.getWarnstr()) && dateFormatValidation(checkItemsVo.getWarnstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "预计提醒日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(checkItemsVo.getDevicecreatestr()) && dateFormatValidation(checkItemsVo.getDevicecreatestr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "设备制造日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(checkItemsVo.getDeviceinstallstr()) && dateFormatValidation(checkItemsVo.getDeviceinstallstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "设备安装日期"));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(checkItemsVo.getDevicestartstr()) && dateFormatValidation(checkItemsVo.getDevicestartstr()) == null) {
+            errorMsgList.add(String.format(DATE_FORMAT_ERROR_MSG, index, "开始使用日期"));
+        }
+    }
+
+    private Date dateFormatValidation(String strDate) {
+        Date date = null;
+        for (SimpleDateFormat simpleDateFormat : DATE_FORMAT_LIST) {
+            try {
+                date = simpleDateFormat.parse(strDate);
+                break;
+            } catch (Exception e) {
+                log.info("时间格式不正确");
+            }
+        }
+        return date;
+    }
+
+    /**
+     * vo 转 do
+     *
+     * @param checkArea
+     * @param vo
+     * @return
+     */
+    private CheckItemsDo voToDo(ImportCheckItemsVo vo,
+                                Map<String, String> checkAreaMap,
+                                String tenantId,
+                                Map<String, String> deviceStatusDict,
+                                Map<String, String> deviceTypeDict,
+                                Map<String, String> conclusionTypeDict,
+                                Map<String, String> typeDict) {
+        CheckItemsDo checkItemsDo = new CheckItemsDo();
+        BeanUtils.copyProperties(vo, checkItemsDo);
+        checkItemsDo.setId(SecurityUtil.getUUID());
+        checkItemsDo.setTenantid(tenantId);
+        checkItemsDo.setCreatedate(new Date());
+        checkItemsDo.setCheckitemareaid(checkAreaMap.get(vo.getTreeName()));
+        checkItemsDo.setSource("1");
+        if (StringUtils.isNotBlank(vo.getCheckitemtype())) {
+            checkItemsDo.setCheckitemtype(typeDict.get(vo.getCheckitemtype()));
+        }
+        if (StringUtils.isNotBlank(vo.getDevicestatus())) {
+            checkItemsDo.setDevicestatus(deviceStatusDict.get(vo.getDevicestatus()));
+        }
+        if (StringUtils.isNotBlank(vo.getCategory())) {
+            checkItemsDo.setCategory(deviceTypeDict.get(vo.getCategory()));
+        }
+        if (StringUtils.isNotBlank(vo.getInspectresult())) {
+            checkItemsDo.setInspectresult(conclusionTypeDict.get(vo.getInspectresult()));
+        }
+
+        if (StringUtils.isNotBlank(vo.getNextcheckstr())) {
+            checkItemsDo.setNextcheckdate(dateFormatValidation(vo.getNextcheckstr()));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(vo.getWarnstr())) {
+            checkItemsDo.setWarndate(dateFormatValidation(vo.getWarnstr()));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(vo.getDevicecreatestr())) {
+            checkItemsDo.setDevicecreatedate(dateFormatValidation(vo.getDevicecreatestr()));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(vo.getDeviceinstallstr())) {
+            checkItemsDo.setDeviceinstalldate(dateFormatValidation(vo.getDeviceinstallstr()));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(vo.getDevicestartstr())) {
+            checkItemsDo.setDevicestartdate(dateFormatValidation(vo.getDevicestartstr()));
+        }
+        // 校验时间格式是否正确
+        if (StringUtils.isNotBlank(vo.getDevicecheckstr())) {
+            checkItemsDo.setDevicecheckdate(dateFormatValidation(vo.getDevicecheckstr()));
+        }
+
+        LocalDate date1 = checkItemsDo.getNextcheckdate().toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        long daysBetween = ChronoUnit.DAYS.between(LocalDate.now(), date1);
+        if (daysBetween <= 30) {
+            checkItemsDo.setReminderstate(HIGH);
+        } else if (daysBetween <= 60) {
+            checkItemsDo.setReminderstate(MIDDLE);
+        } else {
+            checkItemsDo.setReminderstate(LOW);
+        }
+        return checkItemsDo;
+    }
 }

+ 58 - 0
cx-safe-check/cx-save-check-common/src/main/java/com/rongwei/sfcommon/utils/ClassExcelVerifyHandler.java

@@ -0,0 +1,58 @@
+package com.rongwei.sfcommon.utils;
+
+import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
+import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.SneakyThrows;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+
+/**
+ * ClassExcelVerifyHandler class
+ *
+ * @author XH
+ * @date 2024/06/19
+ */
+@Component
+public class ClassExcelVerifyHandler implements IExcelVerifyHandler<Object> {
+    @SneakyThrows
+    @Override
+    public ExcelVerifyHandlerResult verifyHandler(Object obj) {
+        ExcelVerifyHandlerResult result=new ExcelVerifyHandlerResult(true);
+        if (ObjectUtil.isNotNull(obj)){
+            //判断对象属性是否全部为空
+            boolean b = areAllFieldsNull(obj);
+            result.setSuccess(!b);
+        }
+        return result;
+    }
+
+    private  boolean areAllFieldsNull(Object obj) {
+        if (obj == null) {
+            // 如果对象是null,我们返回true(尽管这可能不是你所期望的)
+            // 或者你可以抛出一个异常,取决于你的用例
+            return true;
+        }
+
+        Class<?> clazz = obj.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        for (Field field : fields) {
+            field.setAccessible(true); // 允许访问私有字段
+            try {
+                if (field.get(obj) != null) {
+                    // 如果找到任何非null的字段,返回false
+                    return false;
+                }
+            } catch (IllegalAccessException e) {
+                // 这通常不会发生,因为我们已经设置了setAccessible(true)
+                // 但为了完整性,我们还是捕获了这个异常
+                throw new RuntimeException(e);
+            }
+        }
+        // 如果没有找到任何非null的字段,返回true
+        return true;
+    }
+}

+ 31 - 1
cx-safe-check/cx-save-check-common/src/main/resources/mybatis/SaveCheckCommonDao.xml

@@ -110,11 +110,41 @@
         LEFT JOIN sys_organization so on suo.ORGID=so.ID and so.DELETED='0'
         <where>
             su.DELETED='0'
-            AND FIND_IN_SET(#{tenantId},so.FULLPID)
+            AND (FIND_IN_SET(#{tenantId},so.FULLPID) or so.ID=#{tenantId})
             AND sr.CODE in
             <foreach collection="roleCodes" item="code" open="(" close=")" separator=",">
                 #{code}
             </foreach>
         </where>
     </select>
+    <select id="getCheckArea" resultType="com.rongwe.scentity.vo.CheckAreaVo">
+        SELECT
+            acia.AREANAME,
+            acia.ID as id,
+            IFNULL(CONCAT(GROUP_CONCAT(b.AREANAME order by b.TREECODE separator '/'),'/',acia.AREANAME),acia.AREANAME) as name
+        FROM
+            asp_check_items_area acia
+                LEFT JOIN asp_check_items_area  b ON  FIND_IN_SET(b.ID,acia.FULLPID) and b.DELETED='0'
+        WHERE
+            acia.DELETED = '0'
+            <bind name="pid" value="'%' + tenantid+ '%'" />
+          and (acia.ID=#{tenantid} OR  acia.FULLPID like #{pid})
+        group by  acia.ID
+    </select>
+    <select id="getOrgByTenantId" resultType="com.rongwei.rwadmincommon.system.domain.SysOrganizationDo">
+        <bind name="pid" value="'%' + tenantid+ '%'" />
+        select ID ,FULLNAME from sys_organization where DELETED='0' and (ID=#{tenantid} OR  FULLPID like #{pid})
+    </select>
+    <select id="getUserInfoByTenantId" resultType="com.rongwei.rwadmincommon.system.domain.SysUserDo">
+        select
+        su.ID as id,
+        su.NAME as name
+        from sys_user su
+        lEFT JOIN sys_user_org suo on suo.USERID = su.ID and suo.DELETED = '0'
+        LEFT JOIN sys_organization so on suo.ORGID=so.ID and so.DELETED='0'
+        <where>
+            su.DELETED='0'
+            AND (FIND_IN_SET(#{tenantid},so.FULLPID) or so.ID=#{tenantid})
+        </where>
+    </select>
 </mapper>

+ 6 - 0
cx-safe-check/cx-save-check-entity/pom.xml

@@ -29,5 +29,11 @@
             <artifactId>rw-admin-common</artifactId>
             <version>1.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-annotation</artifactId>
+            <version>4.4.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 28 - 0
cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/domian/CheckItemsDo.java

@@ -366,4 +366,32 @@ public class CheckItemsDo extends BaseDo implements Serializable {
 	 * 提醒状态
 	 */
 	private String reminderstate;
+	/**
+	 * 厂内车牌号
+	 */
+	private String plantnumber;
+	/**
+	 * 自重(单位T)
+	 */
+	private BigDecimal weight;
+	/**
+	 * 厂内编号
+	 */
+	private String plantcode;
+	/**
+	 * 设备位置
+	 */
+	private String equaddress;
+	/**
+	 * 额定起重量/高度(单位T/M)
+	 */
+	private String weigthorheight;
+	/**
+	 * 双限位
+	 */
+	private String doublelimitposition;
+	/**
+	 * 容积
+	 */
+	private String volume;
 }

+ 15 - 0
cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/vo/CheckAreaVo.java

@@ -0,0 +1,15 @@
+package com.rongwe.scentity.vo;
+
+import lombok.Data;
+
+/**
+ * CheckAreaVo class
+ *
+ * @author XH
+ * @date 2024/06/19
+ */
+@Data
+public class CheckAreaVo {
+    private String name;
+    private String id;
+}

+ 161 - 0
cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/vo/ImportAspSafeAttachmentsVo.java

@@ -0,0 +1,161 @@
+package com.rongwe.scentity.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * ImportAspSafeAttachmentsVo class
+ *
+ * @author XH
+ * @date 2024/06/19
+ */
+@Data
+public class ImportAspSafeAttachmentsVo  implements Serializable {
+    /**
+     * 树名称
+     */
+    @Excel(name = "左侧树表", orderNum = "0")
+    private String treeName;
+    /**
+     * 附件类型
+     */
+    @Excel(name = "安全附件类型", orderNum = "1")
+    private String attachmenttype;
+    /**
+     * 名称
+     */
+    @Excel(name = "名称", orderNum = "2")
+    private String name;
+    /**
+     * 型号
+     */
+    @Excel(name = "型号", orderNum = "3")
+    private String model;
+    /**
+     * 编号
+     */
+    @Excel(name = "编号", orderNum = "4")
+    private String number;
+    /**
+     * 制造厂
+     */
+    @Excel(name = "制造厂", orderNum = "5")
+    private String manufacturer;
+    /**
+     * 出厂日期
+     */
+    @Excel(name = "出厂日期", orderNum = "6")
+    private String manufacturestr;
+    /**
+     * 检测周期
+     */
+    @Excel(name = "检测周期", orderNum = "7")
+    private String detectionperiod;
+    /**
+     * 检测类型
+     */
+    @Excel(name = "检测类型", orderNum = "8")
+    private String detectiontype;
+    /**
+     * 检测单位
+     */
+    @Excel(name = "检测单位", orderNum = "9")
+    private String testingcompany;
+    /**
+     * 检测/更换日期
+     */
+    @Excel(name = "检验/更换日期", orderNum = "10")
+    private String inspectionstr;
+    /**
+     * 下次检测/更换日期
+     */
+    @Excel(name = "下次检验/更换日期", orderNum = "11")
+    private String nextinspectionstr;
+    /**
+     * 等级
+     */
+    @Excel(name = "等级", orderNum = "12")
+    private String grade;
+    /**
+     * 证书编号
+     */
+    @Excel(name = "证书/报告编号", orderNum = "13")
+    private String certificatenumber;
+    /**
+     * 责任人
+     */
+    @Excel(name = "责任人", orderNum = "14")
+    private String responsible;
+    /**
+     * 数量
+     */
+    @Excel(name = "数量", orderNum = "15")
+    private String quantity;
+    /**
+     * 防雷类型
+     */
+    @Excel(name = "防雷类型", orderNum = "16")
+    private String antilightingtype;
+    /**
+     * 位置编号
+     */
+    @Excel(name = "位置编号", orderNum = "17")
+    private String positionnumber;
+    /**
+     * 使用车间
+     */
+    @Excel(name = "使用车间", orderNum = "18")
+    private String useshop;
+    /**
+     * 使用地点
+     */
+    @Excel(name = "使用地点", orderNum = "19")
+    private String useplace;
+    /**
+     * 安装地点
+     */
+    @Excel(name = "具体安装地点", orderNum = "20")
+    private String installplace;
+    /**
+     * 安装部位
+     */
+    @Excel(name = "安装部位", orderNum = "21")
+    private String installsite;
+    /**
+     * 最大误差
+     */
+    @Excel(name = "最大允许误差", orderNum = "22")
+    private String maximumerror;
+    /**
+     * 测量范围
+     */
+    @Excel(name = "测量范围", orderNum = "23")
+    private String measuringrange;
+    /**
+     * 拾包公司名称
+     */
+    @Excel(name = "拾包公司名称", orderNum = "24")
+    private String pickupcompany;
+
+    /**
+     * 检测气体
+     */
+    @Excel(name = "检测气体", orderNum = "25")
+    private String tracergas;
+    /**
+     * 环境温度
+     */
+    @Excel(name = "环境温度", orderNum = "26")
+    private String ambienttemperature;
+    /**
+     * 工作电压
+     */
+    @Excel(name = "工作电压", orderNum = "27")
+    private String workingvoltage;
+
+    @Excel(name = "备注", orderNum = "28")
+    private String remark;
+
+}

+ 235 - 0
cx-safe-check/cx-save-check-entity/src/main/java/com/rongwe/scentity/vo/ImportCheckItemsVo.java

@@ -0,0 +1,235 @@
+package com.rongwe.scentity.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * ImportCheckItemsVo class
+ *
+ * @author XH
+ * @date 2024/06/20
+ */
+@Data
+public class ImportCheckItemsVo implements Serializable {
+    /**
+     * 树名称
+     */
+    @Excel(name = "左侧树表", orderNum = "0")
+    private String treeName;
+
+    /**
+     *
+     */
+    @Excel(name = "设备名称", orderNum = "1")
+    private String checkitemname;
+
+    /**
+     * 设备类型
+     */
+    @Excel(name = "设备类型", orderNum = "2")
+    private String checkitemtype;
+
+    /**
+     * 规格型号
+     */
+    @Excel(name = "规格型号", orderNum = "3")
+    private String devicemodel;
+
+    /**
+     * 出厂编号
+     */
+    @Excel(name = "出厂编号", orderNum = "4")
+    private String deviceoutcode;
+    /**
+     * 安装地点
+     */
+    @Excel(name = "安装地点", orderNum = "5")
+    private String deviceaddress;
+
+    /**
+     * 设备编号
+     */
+    @Excel(name = "设备编号", orderNum = "6")
+    private String checkitemcode;
+
+    /**
+     * 设备代码
+     */
+    @Excel(name = "设备代码", orderNum = "7")
+    private String devicecode;
+
+    /**
+     * 注册代码
+     */
+    @Excel(name = "注册代码", orderNum = "8")
+    private String signupcode;
+
+    /**
+     * 制造单位名称
+     */
+    @Excel(name = "设备制造单位名称", orderNum = "9")
+    private String devicenakedname;
+
+    /**
+     * 设备制造日期
+     */
+    @Excel(name = "设备制造日期", orderNum = "10")
+    private String devicecreatestr;
+
+    /**
+     * 设备使用状态
+     */
+    @Excel(name = "设备使用状态", orderNum = "11")
+    private String devicestatus;
+    /**
+     * 使用登记证编号
+     */
+    @Excel(name = "使用登记证编号", orderNum = "12")
+    private String registrationno;
+    /**
+     * 环保号
+     */
+    @Excel(name = "环保号", orderNum = "13")
+    private String environmentalprotectionno;
+
+    /**
+     * 备案号
+     */
+    @Excel(name = "备案号", orderNum = "14")
+    private String filingno;
+    /**
+     * 设备安装日期
+     */
+    @Excel(name = "设备安装日期",orderNum = "15")
+    private String deviceinstallstr;
+
+    /**
+     * 设备开始使用日期
+     */
+    @Excel(name = "开始使用日期",orderNum = "16")
+    private String devicestartstr;
+
+    /**
+     * 类别
+     */
+    @Excel(name = "类别",orderNum = "17")
+    private String category;
+
+    /**
+     * 年限
+     */
+    @Excel(name = "年限",orderNum = "18")
+    private Integer life;
+    /**
+     * 检验日期
+     */
+    @Excel(name = "检验日期", orderNum = "19")
+    private String devicecheckstr;
+
+    /**
+     * 下次检验日期
+     */
+    @Excel(name = "下次检验日期", orderNum = "20")
+    private String nextcheckstr;
+
+    /**
+     * 检验结论
+     */
+    @Excel(name = "检验结论", orderNum = "21")
+    private String inspectresult;
+    /**
+     * 检验机构名称
+     */
+    @Excel(name = "检验机构名称",orderNum = "22")
+    private String inspectby;
+
+    /**
+     * 预计提醒日期
+     */
+    @Excel(name = "预计提醒日期",orderNum = "23")
+    private String warnstr;
+    /**
+     * 厂内车牌号
+     */
+    @Excel(name = "厂内车牌号",orderNum = "24")
+    private String plantnumber;
+    /**
+     * 自重(单位T)
+     */
+    @Excel(name = "自重(单位T)",orderNum = "25")
+    private BigDecimal weight;
+    /**
+     * 厂内编号
+     */
+    @Excel(name = "厂内编号",orderNum = "26")
+    private String plantcode;
+    /**
+     * 设备位置
+     */
+    @Excel(name = "设备位置",orderNum = "27")
+    private String equaddress;
+
+    /**
+     * 额定起重量/高度
+     */
+    @Excel(name = "额定起重量/高度",orderNum = "28")
+    private String weigthorheight;
+
+    /**
+     * 双限位
+     */
+    @Excel(name = "双限位",orderNum = "29")
+    private String doublelimitposition;
+
+    /**
+     * 公称直径(mm)
+     */
+    @Excel(name ="公称直径(mm)",orderNum = "30")
+    private String nominaldiameter;
+
+    /**
+     * 公称壁厚(mm)
+     */
+    @Excel(name ="公称壁厚(mm)",orderNum = "31")
+    private String nominalwallthickness;
+
+    /**
+     * 管道长度(m)
+     */
+    @Excel(name ="管道长度(m)",orderNum = "32")
+    private String pipelinelength;
+    /**
+     * 容积
+     */
+    @Excel(name ="容积",orderNum = "33")
+    private String volume;
+    /**
+     *压力(Mpa)
+     */
+    @Excel(name ="压力(Mpa)",orderNum = "34")
+    private String pressure;
+    /**
+     * 温度(℃)
+     */
+    @Excel(name ="温度(℃)",orderNum = "35")
+    private String temperature;
+    /**
+     * 介质
+     */
+    @Excel(name ="介质",orderNum = "36")
+    private String medium;
+    /**
+     * 设备用途
+     */
+    @Excel(name ="设备用途",orderNum = "37")
+    private String equipmentusage;
+    /**
+     * 备注
+     */
+    @Excel(name ="备注",orderNum = "38")
+    private String deviceremark;
+}

+ 9 - 0
cx-safe-check/cx-save-check-server/src/main/java/com/rongwei/savecheck/controller/AspSafeAttachmentsController.java

@@ -8,9 +8,12 @@ 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;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 /**
  * AspSafeAttachmentsController class
  *
@@ -31,4 +34,10 @@ public class AspSafeAttachmentsController {
         log.info("安全附件定时任务,更改安全附件预警级别");
         return aspSafeAttachmentsService.stateUpdateScheduledTasks();
     }
+
+    @PostMapping("/import")
+    public R importExport(@RequestBody Map<String, String> queryParameter){
+        log.info("开始导入安全附件信息");
+        return  aspSafeAttachmentsService.importExcel(queryParameter);
+    }
 }

+ 7 - 0
cx-safe-check/cx-save-check-server/src/main/java/com/rongwei/savecheck/controller/CheckItemsController.java

@@ -60,4 +60,11 @@ public class CheckItemsController {
         log.info("安全附件定时任务,更改安全附件预警级别");
         return checkItemsService.stateUpdateScheduledTasks();
     }
+
+
+    @PostMapping("/import")
+    public R importExport(@RequestBody Map<String, String> queryParameter){
+        log.info("开始导入安全附件信息");
+        return  checkItemsService.importExcel(queryParameter);
+    }
 }