Browse Source

进行履职任务

luojun 2 years ago
parent
commit
0fbbfa609e
17 changed files with 957 additions and 37 deletions
  1. 137 1
      project_data/sql/0.0.2/soc/soc.sql
  2. 12 3
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteOrgService.java
  3. 10 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteOrgFallbackFactory.java
  4. 81 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafecheckPlanController.java
  5. 13 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafetyTaskController.java
  6. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/domain/CoreSafecheckPlanToRole.java
  7. 1 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/domain/CoreSafetyTask.java
  8. 44 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/dto/SafetyTaskBuildDto.java
  9. 521 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java
  10. 9 9
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java
  11. 54 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/vo/PlanTaskBuildVo.java
  12. 27 17
      soc-modules/soc-modules-core/src/main/resources/mapper/safetycheck/CoreSafetyTaskMapper.xml
  13. 19 4
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeptController.java
  14. 3 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysOrgMapper.java
  15. 2 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysOrgService.java
  16. 8 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java
  17. 13 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysOrgMapper.xml

+ 137 - 1
project_data/sql/0.0.2/soc/soc.sql

@@ -381,6 +381,69 @@ INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, quer
 INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (2228, '演练计划编辑', 2321, 4, '', null, null, 1, 0, 'F', '0', '0', 'core:drillPlan:edit', '1', null, null, '超级管理员', now(), '', null, '');
 INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (2229, '演练计划删除', 2321, 5, '', null, null, 1, 0, 'F', '0', '0', 'core:drillPlan:remove', '1', null, null, '超级管理员', now(), '', null, '');
 
+--检查任务表
+DROP TABLE IF EXISTS `core_safety_task`;
+CREATE TABLE `core_safety_task` (
+                                    `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+                                    `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题',
+                                    `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间',
+                                    `modified_id` bigint DEFAULT NULL COMMENT '最后修改人id',
+                                    `modified_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人名称',
+                                    `update_time` datetime(6) DEFAULT NULL COMMENT '更新时间',
+                                    `exception_count` int DEFAULT '0' COMMENT '异常数目',
+                                    `org_id` bigint DEFAULT '0' COMMENT '受检机构',
+                                    `org_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '受检机构',
+                                    `org_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '受检机构',
+                                    `check_org_id` bigint DEFAULT NULL COMMENT '执行检查机构',
+                                    `check_org_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '执行检查机构',
+                                    `status` int DEFAULT NULL COMMENT '0待检查,1检查完成',
+                                    `done_status` int DEFAULT NULL COMMENT '0:代办,1:逾期,2:按时,3:补登',
+                                    `check_type` int DEFAULT NULL COMMENT '0 常规安全检查 1 专项安全检查',
+                                    `check_cycle` int DEFAULT '0' COMMENT '检查周期:0 无周期 1每日、2每周、3每月、4每季、5每半年、6每年',
+                                    `ymd_date` date DEFAULT NULL COMMENT '年月日',
+                                    `ymd_day` int DEFAULT NULL COMMENT '日',
+                                    `ymd_month` int DEFAULT NULL COMMENT '月',
+                                    `ymd_quarter` int DEFAULT NULL COMMENT '季',
+                                    `ymd_week` int DEFAULT NULL COMMENT '周',
+                                    `ymd_year` int DEFAULT NULL COMMENT '年',
+                                    `ymd_halfyear` int DEFAULT NULL COMMENT '半年',
+                                    `submit_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '提交人',
+                                    `submit_time` datetime DEFAULT NULL COMMENT '提交时间',
+                                    `plan_id` bigint DEFAULT NULL COMMENT '计划id',
+                                    `start_time` datetime DEFAULT NULL COMMENT '任务执行开始时间',
+                                    `end_time` datetime DEFAULT NULL COMMENT '任务执行结束时间',
+                                    `plan_start_time` datetime DEFAULT NULL COMMENT '计划开始时间',
+                                    `plan_end_time` datetime DEFAULT NULL COMMENT '计划截止时间',
+                                    `role_id` bigint DEFAULT NULL COMMENT '角色id',
+                                    `deleted` int DEFAULT '0' COMMENT '是否删除0否1是',
+                                    `is_question` int DEFAULT NULL COMMENT '0:未整改 1:已开始整改',
+                                    `batch_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '批次id,同一执行机构一个批次id',
+                                    `source_type` int DEFAULT '0' COMMENT '数据来源 0:检查计划 ,1:登记检查结果',
+                                    `pdf_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '登记簿pdf 文件地址',
+                                    PRIMARY KEY (`id`) USING BTREE,
+                                    KEY `idx_resumption_orgId` (`org_id`) USING BTREE,
+                                    KEY `idx_orgpath` (`org_path`(191)) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+DROP TABLE IF EXISTS `core_safety_task_data`;
+CREATE TABLE `core_safety_task_data` (
+                                         `id` bigint NOT NULL DEFAULT '0',
+                                         `plan_id` bigint DEFAULT NULL COMMENT '计划id',
+                                         `item_id` bigint DEFAULT NULL COMMENT '检查项id',
+                                         `point_id` bigint DEFAULT NULL COMMENT '要点id',
+                                         `task_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '检查任务id',
+                                         `area_id` bigint DEFAULT NULL COMMENT '区域id',
+                                         `res_value` int DEFAULT NULL COMMENT '正常不正常,通过不通过,合格不合格',
+                                         `reform_type` int DEFAULT NULL COMMENT '整改类型',
+                                         `res_time` datetime DEFAULT NULL COMMENT '时分',
+                                         `submit_time` datetime DEFAULT NULL COMMENT '提交时间',
+                                         `res_status` int DEFAULT NULL COMMENT '0未提交 1正常提交 2延迟提交',
+                                         `submit_by` bigint DEFAULT NULL COMMENT '提交人id',
+                                         `submit_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '提交人名',
+                                         PRIMARY KEY (`id`) USING BTREE,
+                                         KEY `item_id` (`point_id`) USING BTREE,
+                                         KEY `check_task_id` (`task_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='安全检查项表';
 -- Web演练任务按钮及权限
 delete from sys_menu where menu_name in ('演练任务登记','演练任务详情','演练任务签名','演练任务评价');
 INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (2215, '演练任务登记', 2322, 1, '', null, null, 1, 0, 'F', '0', '0', 'core:drillTask:edit', '1', '#', null, '超级管理员', now(), '', null, '');
@@ -395,6 +458,18 @@ INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, quer
 INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (2313, '演练统计排名', 2311, 1, '/drillStatistics', null, null, 1, 0, 'C', '0', '0', null, '0', '#', null, '超级管理员', now(), '', null, '');
 INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (2314, '优秀案例管理', 2311, 2, '/rehearsaloptimal', null, null, 1, 0, 'M', '0', '0', '', '0', null, null, '超级管理员', now(), '超级管理员', now(), '');
 INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (2315, '优秀案例学习', 2311, 4, '/rehearsallearning', null, null, 1, 0, 'M', '0', '0', '', '0', null, null, '超级管理员', now(), '超级管理员', now(), '');
+DROP TABLE IF EXISTS `core_safety_task_data_nfc`;
+CREATE TABLE `core_safety_task_data_nfc` (
+                                             `id` bigint NOT NULL DEFAULT '0',
+                                             `task_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '检查任务id',
+                                             `task_data_id` bigint DEFAULT NULL COMMENT '安全检查项id',
+                                             `check_id` bigint NOT NULL DEFAULT '0' COMMENT '采集点id',
+                                             `submit_time` datetime DEFAULT NULL COMMENT '提交时间',
+                                             `status` int DEFAULT '0' COMMENT '状态0未扫1以扫',
+                                             `point_id` bigint DEFAULT NULL COMMENT '要点id',
+                                             PRIMARY KEY (`id`) USING BTREE,
+                                             KEY `task_id` (`task_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='安全检查nfc扫描表';
 
 -- 新增提系统参数
 INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark) VALUES ('演练任务行社推荐数量单季度最大值', 'HS_REC_DRILL_TASK_MAX', '3', 'Y', '超级管理员', '2023-09-21 11:20:41', '', null, null);
@@ -445,4 +520,65 @@ CREATE TABLE `core_message_center`  (
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息中心' ROW_FORMAT = Dynamic;
 
 SET FOREIGN_KEY_CHECKS = 1;
---消息中心end
+--消息中心end
+DROP TABLE IF EXISTS `core_safety_task_data_remark`;
+CREATE TABLE `core_safety_task_data_remark` (
+                                                `id` bigint NOT NULL DEFAULT '0',
+                                                `task_data_id` bigint DEFAULT NULL COMMENT '检查项id',
+                                                `task_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '检查任务id',
+                                                `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '问题描述',
+                                                PRIMARY KEY (`id`) USING BTREE,
+                                                KEY `task_item_id` (`task_data_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='安全检查项表问题描述表';
+
+DROP TABLE IF EXISTS `core_safety_task_data_remarkimg`;
+CREATE TABLE `core_safety_task_data_remarkimg` (
+                                                   `id` bigint NOT NULL DEFAULT '0',
+                                                   `task_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '安全检查任务id',
+                                                   `task_data_id` bigint DEFAULT NULL COMMENT '安全检查项id',
+                                                   `remark_id` bigint DEFAULT NULL COMMENT '安全检查项问题描述id',
+                                                   `img_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '图片存放路径',
+                                                   PRIMARY KEY (`id`) USING BTREE,
+                                                   KEY `data_id` (`remark_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='安全检查产生图片表';
+
+--调整core_safecheck_plan字段
+DELIMITER $$
+CREATE PROCEDURE add_column_if_not_exists()
+BEGIN
+  IF NOT EXISTS (
+      SELECT *
+      FROM INFORMATION_SCHEMA.COLUMNS
+      WHERE TABLE_NAME = 'core_safety_task'
+      AND COLUMN_NAME = 'des'
+  )
+  THEN
+ALTER TABLE core_safety_task
+    ADD COLUMN des VARCHAR(4000) COMMENT '备注';
+END IF;
+END$$
+DELIMITER ;
+
+CALL add_column_if_not_exists();
+DROP PROCEDURE add_column_if_not_exists;
+
+
+
+DELIMITER $$
+CREATE PROCEDURE add_column_if_not_exists()
+BEGIN
+  IF NOT EXISTS (
+      SELECT *
+      FROM INFORMATION_SCHEMA.COLUMNS
+      WHERE TABLE_NAME = 'core_safecheck_plan_to_point'
+      AND COLUMN_NAME = 'required'
+  )
+  THEN
+ALTER TABLE core_safecheck_plan_to_point
+    ADD COLUMN required tinyint(1) COMMENT '是否必检';
+END IF;
+END$$
+DELIMITER ;
+
+CALL add_column_if_not_exists();
+DROP PROCEDURE add_column_if_not_exists;

+ 12 - 3
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteOrgService.java

@@ -55,8 +55,10 @@ public interface RemoteOrgService {
 
     @PostMapping("/dept/findListByOrgTypes")
     R<List<SysOrg>> listByTypes(@RequestBody OrgListByTypesConditionEto eto);
+
     @PostMapping("/dept/listByParentIdAndType")
-    List<SysOrg>listByParentIdAndType(@RequestBody SysOrg sysOrg, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+    List<SysOrg> listByParentIdAndType(@RequestBody SysOrg sysOrg, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
     @GetMapping("/dept/top")
     SysOrg selectTopOrg(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
@@ -64,7 +66,7 @@ public interface RemoteOrgService {
     List<SysOrg> selectByOrgType(@PathVariable("orgType") Integer orgType, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     @GetMapping("/dept/selectByOrgPathAndOrgType/{orgPath}/{orgType}")
-    List<SysOrg> selectByOrgPathAndOrgType(@PathVariable("orgPath") String orgPath,@PathVariable("orgType") Integer orgType, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+    List<SysOrg> selectByOrgPathAndOrgType(@PathVariable("orgPath") String orgPath, @PathVariable("orgType") Integer orgType, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     @PostMapping("/dept/selectOrgByIdList")
     List<SysOrg> selectOrgByIdList(@RequestBody List<Long> orgList, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
@@ -100,6 +102,7 @@ public interface RemoteOrgService {
      */
     @GetMapping("/org/getUpOrgs/{orgId}")
     List<Long> getUpOrgs(@PathVariable("orgId") Long orgId);
+
     /**
      * @param source
      * @return
@@ -124,8 +127,14 @@ public interface RemoteOrgService {
      */
     @PostMapping("/dept/selectByOrgIdList")
     List<SysOrg> selectByOrgIdList(@RequestBody List<Long> ids, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @PostMapping("/dept/selectOrgTypeByIdList")
+    List<Long> selectOrgTypeByIdList(@RequestBody List<Long> ids, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
     @GetMapping("/extend/selectSysOrgExtendById")
-    SysOrgExtend selectSysOrgExtendById(@RequestParam("orgId") Long orgId,  @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+    SysOrgExtend selectSysOrgExtendById(@RequestParam("orgId") Long orgId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+    @GetMapping("/extend/findByOrgTypeAndParent")
+    List<SysOrg> findByOrgTypeAndParent(@RequestParam("orgType")Integer orgType,@RequestParam("path") String path, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     @PostMapping("/dept/deptTree/hangshewhole")
     R<List<SysOrgVO>> hangsheWholePathTree(@RequestBody Long orgId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

+ 10 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteOrgFallbackFactory.java

@@ -123,6 +123,11 @@ public class RemoteOrgFallbackFactory implements FallbackFactory<RemoteOrgServic
             }
 
             @Override
+            public List<Long> selectOrgTypeByIdList(List<Long> ids, String source) {
+                return null;
+            }
+
+            @Override
             public List<SysOrg> findAllOrg(String source) {
                 return null;
             }
@@ -143,6 +148,11 @@ public class RemoteOrgFallbackFactory implements FallbackFactory<RemoteOrgServic
             }
 
             @Override
+            public List<SysOrg> findByOrgTypeAndParent(Integer orgType, String path, String source) {
+                return null;
+            }
+
+            @Override
             public R<List<SysOrgVO>> hangsheWholePathTree(Long orgId,@RequestHeader(SecurityConstants.FROM_SOURCE) String source) {
                 return null;
             }

+ 81 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafecheckPlanController.java

@@ -1,10 +1,17 @@
 package com.xunmei.core.safetyCheck.controller;
 
+import java.util.Date;
 import java.util.List;
 import java.io.IOException;
+import java.util.Map;
+import java.util.TimeZone;
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 
+import cn.hutool.core.date.DateTime;
+import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.core.safetyCheck.domain.CoreSafecheckPlan;
+import com.xunmei.core.safetyCheck.job.SafetyCheckJobBusiness;
 import com.xunmei.core.safetyCheck.service.ICoreSafecheckPlanService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -37,6 +44,8 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 public class CoreSafecheckPlanController extends BaseController {
     @Autowired
     private ICoreSafecheckPlanService coreSafecheckPlanService;
+    @Autowired
+    private SafetyCheckJobBusiness jobBusiness;
 
     /**
      * 查询常规安全检查计划列表
@@ -55,6 +64,7 @@ public class CoreSafecheckPlanController extends BaseController {
     public AjaxResult getPointIds(@PathVariable Long id) {
         return AjaxResult.success(coreSafecheckPlanService.selectItemIdsByPlanId(id));
     }
+
     /**
      * 获取常规安全检查计划详细信息
      */
@@ -98,4 +108,75 @@ public class CoreSafecheckPlanController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(coreSafecheckPlanService.deleteCoreSafecheckPlanByIds(ids));
     }
+
+    @ApiOperation(value = "生成每日常规安全检查任务")
+    @GetMapping(value = "/DayTask")
+//    @RequiresPermissions("core:plan:findById")
+    public AjaxResult safeCheckDayTask() {
+        DateTime datetime = new DateTime();
+        datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        DateHelper dateHelper = new DateHelper(datetime);
+//        SCHEDULEDTASKSLOG.info("开始生成每日常规安全检查任务!");
+        try {
+            Map<String, Date> map = DateHelper.getStartAndEnd(dateHelper, 0);
+            jobBusiness.createTask(datetime, 0, map.get("start"), map.get("end"));
+        } catch (Exception e) {
+            throw new RuntimeException("生成每日常规安全检查任务失败!");
+        }
+//        SCHEDULEDTASKSLOG.info("每日常规安全检查任务生成结束!");
+        return AjaxResult.success("开始生成每日常规安全检查任务!");
+    }
+
+    @ApiOperation(value = "生成每周常规安全检查任务")
+    @GetMapping(value = "/WeekTask")
+//    @RequiresPermissions("core:plan:findById")
+    public AjaxResult safeCheckWeekTask() {
+        DateTime datetime = new DateTime();
+        datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        DateHelper dateHelper = new DateHelper(datetime);
+//        SCHEDULEDTASKSLOG.info("开始生成每周常规安全检查任务!");
+        try {
+            Map<String, Date> map = DateHelper.getStartAndEnd(dateHelper, 1);
+            jobBusiness.createTask(datetime, 1, map.get("start"), map.get("end"));
+        } catch (Exception e) {
+            throw new RuntimeException("生成每周常规安全检查任务失败!");
+        }
+//        SCHEDULEDTASKSLOG.info("每周常规安全检查任务生成结束!");
+        return AjaxResult.success("开始生成每周常规安全检查任务!");
+    }
+
+    @ApiOperation(value = "生成每月常规安全检查任务")
+    @GetMapping(value = "/MonthTask")
+//    @RequiresPermissions("core:plan:findById")
+    public AjaxResult safeCheckMonthTask() {
+        DateTime dateTime = new DateTime();
+        dateTime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        final DateHelper dateHelper = new DateHelper(dateTime);
+
+        Map<String, Date> map = null;
+        try {
+            map = DateHelper.getStartAndEnd(dateHelper, 2);
+            jobBusiness.createTask(dateTime, 2, map.get("start"), map.get("end"));
+//            SCHEDULEDTASKSLOG.info("每月常规安全检查任务生成结束!");
+            int month = dateHelper.getMonth();
+            if (month == 1 || month == 4 || month == 7 || month == 10) {
+                map = DateHelper.getStartAndEnd(dateHelper, 3);
+                jobBusiness.createTask(dateTime, 3, map.get("start"), map.get("end"));
+//                SCHEDULEDTASKSLOG.info("每季度常规安全检查任务生成结束!,当前月份:{}", month);
+            }
+            if (month == 1 || month == 7) {
+                map = DateHelper.getStartAndEnd(dateHelper, 4);
+                jobBusiness.createTask(dateTime, 4, map.get("start"), map.get("end"));
+//                SCHEDULEDTASKSLOG.info("每半年常规安全检查任务生成结束!,当前月份:{}", month);
+            }
+            if (month == 1) {
+                map = DateHelper.getStartAndEnd(dateHelper, 5);
+                jobBusiness.createTask(dateTime, 5, map.get("start"), map.get("end"));
+//                SCHEDULEDTASKSLOG.info("每年常规安全检查任务生成结束! ");
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("生成每月常规安全检查任务失败!");
+        }
+        return AjaxResult.success("开始生成每月常规安全检查任务!");
+    }
 }

+ 13 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafetyTaskController.java

@@ -4,7 +4,12 @@ import java.util.List;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xunmei.common.core.vo.IdNameVo;
+import com.xunmei.core.resumption.dto.resumptionRecord.ResumptionRoleDto;
+import com.xunmei.core.safetyCheck.domain.CoreSafecheckPlan;
 import com.xunmei.core.safetyCheck.domain.CoreSafetyTask;
+import com.xunmei.core.safetyCheck.service.ICoreSafecheckPlanService;
 import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -37,6 +42,8 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 public class CoreSafetyTaskController extends BaseController {
     @Autowired
     private ICoreSafetyTaskService coreSafetyTaskService;
+    @Autowired
+    private ICoreSafecheckPlanService planService;
 
     /**
      * 查询【请填写功能名称】列表
@@ -49,6 +56,12 @@ public class CoreSafetyTaskController extends BaseController {
         return coreSafetyTaskService.selectPage(coreSafetyTask);
     }
 
+    @ApiOperation(value = "履职计划下拉框")
+    @GetMapping("/plan")
+    public AjaxResult plan(Long orgId) {
+        List<CoreSafecheckPlan> list = planService.list(new LambdaQueryWrapper<CoreSafecheckPlan>().eq(CoreSafecheckPlan::getCheckOrg,orgId));
+        return success(list);
+    }
 
     /**
      * 获取【请填写功能名称】详细信息

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/domain/CoreSafecheckPlanToRole.java

@@ -43,6 +43,9 @@ public class CoreSafecheckPlanToRole extends BaseEntity {
         this.roleId = roleId;
     }
 
+    public CoreSafecheckPlanToRole() {
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

+ 1 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/domain/CoreSafetyTask.java

@@ -77,7 +77,7 @@ public class CoreSafetyTask extends BaseEntity {
     private String orgName;
 
     /**
-     * 受检机构
+     * 受检机构SafetyCheckJob
      */
     @ApiModelProperty(value = "受检机构")
     private String orgPath;

+ 44 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/dto/SafetyTaskBuildDto.java

@@ -0,0 +1,44 @@
+package com.xunmei.core.safetyCheck.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class SafetyTaskBuildDto {
+    /*
+    * 当前实体类用于补偿安全检查任务的生成,参数说明如下:
+    *
+    * 1. date,生成某个日期的任务,配合planCycle使用
+    * 2. planCycle,计划周期,0:每天,1:每周,2:每月,3:每季度,4:每半年,5:每年,与planId字段冲突,二者只能选其一,若二者同时有值,则以planId为准
+    * 3. planId,计划id,与planCycle字段冲突,二者只能选其一,若二者同时有值,则以planId为准
+    * 4. execOrgIdList,具体执行检查的机构id列表,若为空,则默认为根据表中配置为准
+    * 5. checkOrgIdList,具体受检的机构id列表,若为空,则默认为根据表中配置为准
+    * 6. roleIdList,执行任务角色id列表,若为空,则默认为根据表中配置为准
+    *
+    * */
+
+    @NotNull(message = "日期不能为空")
+    @ApiModelProperty(value = "生成某个日期的任务,配合planCycle使用")
+    private Date date;
+
+    @NotNull(message = "计划周期不能为空")
+    @ApiModelProperty(value = "计划周期")
+    private Integer planCycle;
+
+    @ApiModelProperty(value = "计划id")
+    private Long  planId;
+
+    @ApiModelProperty(value = "具体执行检查的机构id列表")
+    private List<Long> execOrgIdList;
+
+    @ApiModelProperty(value = "具体受检的机构id列表")
+    private List<Long> checkOrgIdList;
+
+    @ApiModelProperty(value = "执行任务角色id列表")
+    private List<Long> roleIdList;
+
+}

+ 521 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java

@@ -0,0 +1,521 @@
+package com.xunmei.core.safetyCheck.job;
+
+import cn.hutool.core.collection.CollectionUtil;
+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.LambdaUpdateWrapper;
+import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.utils.DateHelper;
+import com.xunmei.core.safetyCheck.domain.*;
+import com.xunmei.core.safetyCheck.domain.CoreSafecheckPlan;
+import com.xunmei.core.safetyCheck.dto.SafetyTaskBuildDto;
+import com.xunmei.core.safetyCheck.mapper.CoreSafecheckPlanMapper;
+import com.xunmei.core.safetyCheck.mapper.CoreSafecheckPlanToCheckOrgMapper;
+import com.xunmei.core.safetyCheck.mapper.CoreSafecheckPlanToExecOrgMapper;
+import com.xunmei.core.safetyCheck.mapper.CoreSafecheckPlanToRoleMapper;
+import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskService;
+import com.xunmei.core.safetyCheck.vo.PlanTaskBuildVo;
+import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysOrg;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * @author jingyuanchao
+ * @date 2022/6/29 14:34
+ */
+
+
+@Slf4j
+@Component
+public class SafetyCheckJobBusiness {
+    @Resource
+    CoreSafecheckPlanMapper planMapper;
+    @Resource
+    ICoreSafetyTaskService checkTaskService;
+
+    @Resource
+    CoreSafecheckPlanToCheckOrgMapper planToCheckOrgMapper;
+    @Resource
+    CoreSafecheckPlanToExecOrgMapper planToExecOrgMapper;
+    @Resource
+    CoreSafecheckPlanToRoleMapper planToRoleMapper;
+    @Autowired
+    private RemoteOrgService orgService;
+
+
+    @Transactional(rollbackFor = Exception.class)
+    public void createTaskForNow(Long planId, Date start, Date end, Boolean isNeedSendTodo, Integer sourceType) throws Exception {
+
+        DateTime datetime = new DateTime();
+        datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+
+        CoreSafecheckPlan checkPlan = planMapper.selectById(planId);
+        Integer planCycle = Math.toIntExact(checkPlan.getPlanCycle());
+
+        if (!planCycle.equals(6)) {
+            DateHelper dateHelper = new DateHelper(datetime);
+            Map<String, Date> map = DateHelper.getStartAndEnd(dateHelper, planCycle);
+            start = map.get("start");
+            end = map.get("end");
+        }
+        createTaskForCycle(datetime, start, end, checkPlan, isNeedSendTodo, sourceType);
+    }
+
+    /**
+     * 页面调用,立即生成任务
+     *
+     * @param dateTime
+     * @param start
+     * @param end
+     * @param plan
+     * @throws Exception
+     */
+    public void createTaskForCycle(DateTime dateTime, Date start, Date end, CoreSafecheckPlan plan, Boolean isNeedSendTodo, Integer sourceType) throws Exception {
+        List<PlanTaskBuildVo> planTask = createPlanTask(plan);
+        //生成具体任务
+        buildTask(dateTime, planTask, start, end, isNeedSendTodo, sourceType);
+    }
+
+
+    /**
+     * 有周期计划生成任务
+     *
+     * @param dateTime
+     * @param planCycle
+     * @param start
+     * @param end
+     * @throws Exception
+     */
+    public void createTask(Date dateTime, int planCycle, Date start, Date end) throws Exception {
+        QueryWrapper<CoreSafecheckPlan> qw = new QueryWrapper<>();
+        qw.lambda().eq(CoreSafecheckPlan::getPlanCycle, planCycle);
+        qw.lambda().eq(CoreSafecheckPlan::getIsDeleted, 0);
+        qw.lambda().eq(CoreSafecheckPlan::getPlanStatus, 1);
+        List<CoreSafecheckPlan> plans = planMapper.selectList(qw);
+        List<PlanTaskBuildVo> tasks = new ArrayList<>();
+        for (CoreSafecheckPlan plan : plans) {
+            List<PlanTaskBuildVo> planTask = createPlanTask(plan);
+            tasks.addAll(planTask);
+        }
+
+        //生成具体任务
+        buildTask(dateTime, tasks, start, end, true, 0);
+    }
+
+    /**
+     * 生成每个计划的任务
+     *
+     * @param plan
+     */
+    private List<PlanTaskBuildVo> createPlanTask(CoreSafecheckPlan plan) {
+
+        List<PlanTaskBuildVo> list = new ArrayList<>();
+        Integer execOrgType = Math.toIntExact(plan.getExecOrgType());
+        Integer checkOrgType = Math.toIntExact(plan.getCheckOrgType());
+
+        //获取具体执行检查的机构
+        QueryWrapper<CoreSafecheckPlanToExecOrg> eos = new QueryWrapper<>();
+        eos.lambda().eq(CoreSafecheckPlanToExecOrg::getPlanId, plan.getId());
+        List<CoreSafecheckPlanToExecOrg> execOrg = planToExecOrgMapper.selectList(eos);
+
+        //获取具体受检的机构
+        QueryWrapper<CoreSafecheckPlanToCheckOrg> cos = new QueryWrapper<>();
+        cos.lambda().eq(CoreSafecheckPlanToCheckOrg::getPlanId, plan.getId());
+        List<CoreSafecheckPlanToCheckOrg> checkOrg = planToCheckOrgMapper.selectList(cos);
+
+        //获取执行角色
+        QueryWrapper<CoreSafecheckPlanToRole> ros = new QueryWrapper<>();
+        ros.lambda().eq(CoreSafecheckPlanToRole::getPlanId, plan.getId());
+        List<CoreSafecheckPlanToRole> roles = planToRoleMapper.selectList(ros);
+
+        List<SysOrg> execOrgs = null;
+        if (ObjectUtil.isEmpty(execOrg)) {
+            //如果没有选择具体执行检查的机构,则根据执行机构类型查询
+            execOrgs = orgService.selectByOrgType(execOrgType, SecurityConstants.INNER);
+        } else {
+            //选择了具体执行检查的机构
+            List<Long> orgIds = execOrg.stream().map(CoreSafecheckPlanToExecOrg::getOrgId).collect(Collectors.toList());
+            execOrgs = orgService.selectOrgByIdList(orgIds, SecurityConstants.INNER);
+        }
+        execOrgs = execOrgs.stream().filter(o -> o.getIsLock() < 1).collect(Collectors.toList());
+
+//        execOrgs = execOrgs.stream().filter(o -> ObjectUtil.equal(o.getIsLock(), false)).collect(Collectors.toList());
+        //此处循环所有执行检查的机构
+        for (SysOrg org : execOrgs) {
+            List<SysOrg> checkOrgs = null;
+            if (ObjectUtil.isEmpty(checkOrg)) {
+                //如果没有选择具体受检的机构,则根据受检机构类型查询
+                checkOrgs = orgService.findByOrgTypeAndParent(checkOrgType, org.getPath(), SecurityConstants.INNER);
+            } else {
+                //选择了具体的受检机构
+                List<Long> ids = checkOrg.stream().map(CoreSafecheckPlanToCheckOrg::getOrgId).collect(Collectors.toList());
+                checkOrgs = orgService.selectOrgByIdList(ids, SecurityConstants.INNER);
+            }
+//            checkOrgs = checkOrgs.stream().filter(o -> ObjectUtil.equal(o.getIsLock(), false)).collect(Collectors.toList());
+            checkOrgs = checkOrgs.stream().filter(o -> o.getIsLock() < 1).collect(Collectors.toList());
+            //构建数据
+            List<PlanTaskBuildVo> bs = getBuild(plan, org, checkOrgs, roles);
+            list.addAll(bs);
+        }
+        return list;
+    }
+
+    /**
+     * 根据入参来生成任务
+     *
+     * @param plan
+     */
+    private List<PlanTaskBuildVo> createPlanTask(CoreSafecheckPlan plan, SafetyTaskBuildDto safetyTaskBuildDto) {
+
+        List<PlanTaskBuildVo> list = new ArrayList<>();
+        Integer execOrgType = Math.toIntExact(plan.getExecOrgType());
+        Integer checkOrgType = Math.toIntExact(plan.getCheckOrgType());
+
+        //获取具体执行检查的机构
+        List<CoreSafecheckPlanToExecOrg> execOrg = null;
+        if (ObjectUtil.isNotEmpty(safetyTaskBuildDto.getExecOrgIdList())) {
+            execOrg = new ArrayList<>();
+            for (Long execOrgId : safetyTaskBuildDto.getExecOrgIdList()) {
+                CoreSafecheckPlanToExecOrg coreSafecheckPlanToExecOrg = new CoreSafecheckPlanToExecOrg();
+                coreSafecheckPlanToExecOrg.setOrgId(execOrgId);
+                coreSafecheckPlanToExecOrg.setPlanId(plan.getId());
+                execOrg.add(coreSafecheckPlanToExecOrg);
+            }
+        } else {
+            LambdaQueryWrapper<CoreSafecheckPlanToExecOrg> eos = new LambdaQueryWrapper<>();
+            eos.eq(CoreSafecheckPlanToExecOrg::getPlanId, plan.getId());
+            execOrg = planToExecOrgMapper.selectList(eos);
+        }
+
+        //获取具体受检的机构
+        List<CoreSafecheckPlanToCheckOrg> checkOrg = null;
+        if (ObjectUtil.isNotEmpty(safetyTaskBuildDto.getCheckOrgIdList())) {
+            checkOrg = new ArrayList<>();
+            for (Long checkOrgId : safetyTaskBuildDto.getCheckOrgIdList()) {
+                CoreSafecheckPlanToCheckOrg coreSafecheckPlanToCheckOrg = new CoreSafecheckPlanToCheckOrg();
+                coreSafecheckPlanToCheckOrg.setOrgId(checkOrgId);
+                coreSafecheckPlanToCheckOrg.setPlanId(plan.getId());
+                checkOrg.add(coreSafecheckPlanToCheckOrg);
+            }
+        } else {
+            LambdaQueryWrapper<CoreSafecheckPlanToCheckOrg> cos = new LambdaQueryWrapper<>();
+            cos.eq(CoreSafecheckPlanToCheckOrg::getPlanId, plan.getId());
+            checkOrg = planToCheckOrgMapper.selectList(cos);
+        }
+
+        //获取执行角色
+        List<CoreSafecheckPlanToRole> roles = null;
+        if (ObjectUtil.isNotEmpty(safetyTaskBuildDto.getRoleIdList())) {
+            roles = new ArrayList<>();
+            for (Long roleId : safetyTaskBuildDto.getRoleIdList()) {
+                CoreSafecheckPlanToRole coreSafecheckPlanToRole = new CoreSafecheckPlanToRole();
+                coreSafecheckPlanToRole.setRoleId(roleId);
+                coreSafecheckPlanToRole.setPlanId(plan.getId());
+                roles.add(coreSafecheckPlanToRole);
+            }
+        } else {
+            LambdaQueryWrapper<CoreSafecheckPlanToRole> ros = new LambdaQueryWrapper<>();
+            ros.eq(CoreSafecheckPlanToRole::getPlanId, plan.getId());
+            roles = planToRoleMapper.selectList(ros);
+        }
+
+
+        List<SysOrg> execOrgs = null;
+        if (ObjectUtil.isEmpty(execOrg)) {
+            //如果没有选择具体执行检查的机构,则根据执行机构类型查询
+            execOrgs = orgService.selectByOrgType(execOrgType, SecurityConstants.INNER);
+        } else {
+            //选择了具体执行检查的机构
+            List<Long> orgIds = execOrg.stream().map(CoreSafecheckPlanToExecOrg::getOrgId).collect(Collectors.toList());
+            execOrgs = orgService.selectOrgByIdList(orgIds, SecurityConstants.INNER);
+        }
+        execOrgs = execOrgs.stream().filter(o -> o.getIsLock() < 1).collect(Collectors.toList());
+
+        //此处循环所有执行检查的机构
+        for (SysOrg org : execOrgs) {
+            List<SysOrg> checkOrgs = null;
+            if (ObjectUtil.isEmpty(checkOrg)) {
+                //如果没有选择具体受检的机构,则根据受检机构类型查询
+                checkOrgs = orgService.findByOrgTypeAndParent(checkOrgType, org.getPath(), SecurityConstants.INNER);
+            } else {
+                //选择了具体的受检机构
+                List<Long> ids = checkOrg.stream().map(CoreSafecheckPlanToCheckOrg::getOrgId).collect(Collectors.toList());
+                checkOrgs = orgService.selectOrgByIdList(ids, SecurityConstants.INNER);
+            }
+            checkOrgs = checkOrgs.stream().filter(o -> o.getIsLock() < 1).collect(Collectors.toList());
+            //构建数据
+            List<PlanTaskBuildVo> bs = getBuild(plan, org, checkOrgs, roles);
+            list.addAll(bs);
+        }
+        return list;
+    }
+
+    /**
+     * 构建任务所需条件
+     *
+     * @param plan
+     * @param check
+     * @param execOrgList
+     * @param roles
+     * @return
+     */
+    private List<PlanTaskBuildVo> getBuild(CoreSafecheckPlan plan, SysOrg check, List<SysOrg> execOrgList, List<CoreSafecheckPlanToRole> roles) {
+
+        List<PlanTaskBuildVo> list = new ArrayList<>();
+
+        PlanTaskBuildVo vo = null;
+        for (SysOrg org : execOrgList) {
+            for (CoreSafecheckPlanToRole role : roles) {
+                vo = new PlanTaskBuildVo();
+                vo.setPlanId(plan.getId());
+                vo.setEndTime(plan.getEndDate());
+                vo.setStartTime(plan.getStartDate());
+                vo.setCheckOrg(check);
+                vo.setExecOrg(org);
+                vo.setPlanName(plan.getPlanName());
+                vo.setRole(role);
+                vo.setPlanCycle(Math.toIntExact(plan.getPlanCycle()));
+                list.add(vo);
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 生成具体任务
+     *
+     * @param datetime
+     * @param tasks
+     * @param start
+     * @param end
+     * @param isNeedSendTodo 是否需要发送待办
+     * @param sourceType     生成任务的数据来源 0:检查计划 ,1:登记检查结果
+     * @return
+     * @throws Exception
+     */
+    private List<CoreSafetyTask> buildTask(Date datetime, List<PlanTaskBuildVo> tasks, Date start, Date end, Boolean isNeedSendTodo, Integer sourceType) throws Exception {
+        Calendar c = Calendar.getInstance();
+        // 设置时间
+        c.setTime(start);
+        // 设置毫秒值为0
+        c.set(Calendar.MILLISECOND, 0);
+        c.set(Calendar.SECOND, 0);
+        start = c.getTime();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sdfa = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        sdfa.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        end = sdfa.parse(sdf.format(end) + " 23:59:59");
+
+        DateHelper dateHelper = new DateHelper(datetime);
+        List<CoreSafetyTask> ats = new ArrayList<>();
+        Map<Long, String> hashMap = new HashMap<>();
+        for (PlanTaskBuildVo taskPlan : tasks) {
+            CoreSafetyTask checkTask = new CoreSafetyTask();
+            checkTask.setTitle(taskPlan.getPlanName());
+            checkTask.setExceptionCount(0L);
+            checkTask.setOrgId(taskPlan.getExecOrg().getId());
+            checkTask.setOrgName(taskPlan.getExecOrg().getName());
+            checkTask.setOrgPath(taskPlan.getExecOrg().getPath());
+            checkTask.setCheckOrgId(taskPlan.getCheckOrg().getId());
+            checkTask.setCheckOrgName(taskPlan.getCheckOrg().getName());
+            checkTask.setStatus(1L);
+            checkTask.setDoneStatus(0L);
+            checkTask.setCheckType(0L);
+            checkTask.setCheckCycle(Long.valueOf(taskPlan.getPlanCycle()));
+            checkTask.setYmdDate(datetime);
+            checkTask.setYmdDay((long) dateHelper.getDay());
+            checkTask.setYmdMonth((long) dateHelper.getMonth());
+            checkTask.setYmdQuarter((long) dateHelper.getQuarter());
+            checkTask.setYmdWeek((long) dateHelper.getWeek());
+            checkTask.setYmdYear((long) dateHelper.getYear());
+            checkTask.setYmdHalfyear((long) dateHelper.getHalfyear());
+            checkTask.setSubmitBy(null);
+            checkTask.setSubmitTime(null);
+            checkTask.setPlanId(taskPlan.getPlanId());
+            checkTask.setPlanStartTime(start);
+            checkTask.setPlanEndTime(end);
+            checkTask.setStartTime(null);
+            checkTask.setEndTime(null);
+            checkTask.setRoleId(taskPlan.getRole().getRoleId());
+            checkTask.setIsQuestion(0L);
+            checkTask.setSourceType(Long.valueOf(sourceType));
+            checkTask.setId(UUID.randomUUID().toString().replace("-", ""));
+            String batchId = hashMap.get(checkTask.getCheckOrgId());
+            if (ObjectUtil.isEmpty(batchId)) {
+                batchId = UUID.randomUUID().toString().replace("-", "");
+                hashMap.put(checkTask.getCheckOrgId(), batchId);
+            }
+            checkTask.setBatchId(batchId);
+
+            ats.add(checkTask);
+            if (ats.size() == 200) {
+                checkTaskService.saveBatch(ats);
+                ats = new ArrayList<>();
+            }
+        }
+
+        if (ats.size() > 0) {
+            checkTaskService.saveBatch(ats);
+        }
+//        if (isNeedSendTodo) {
+//            //发送待办
+//            sendTodo(todoList);
+//        }
+
+        return ats;
+    }
+
+
+    public String getTitle(int completed, int unCompleted) {
+        return String.format("(已完成(%s),未完成(%s))", completed, unCompleted);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void compensationTask(SafetyTaskBuildDto safetyTaskBuildDto) throws Exception {
+//        SCHEDULEDTASKSLOG.info("安全检查补偿任务开始,当前入参时间为:{}", DateUtil.format(safetyTaskBuildDto.getDate(), "yyyy-MM-dd"));
+        DateHelper dateHelper = new DateHelper(safetyTaskBuildDto.getDate());
+
+        Map<String, Date> map = null;
+        List<CoreSafecheckPlan> plans = null;
+        if (safetyTaskBuildDto.getPlanId() != null) {
+            plans = new ArrayList<>();
+            CoreSafecheckPlan coreSafecheckPlan = planMapper.selectById(safetyTaskBuildDto.getPlanId());
+            plans.add(coreSafecheckPlan);
+            map = DateHelper.getStartAndEnd(safetyTaskBuildDto.getDate(), Math.toIntExact(coreSafecheckPlan.getPlanCycle()));
+        } else {
+            LambdaUpdateWrapper<CoreSafecheckPlan> qw = new LambdaUpdateWrapper<>();
+            qw.eq(CoreSafecheckPlan::getPlanCycle, safetyTaskBuildDto.getPlanCycle());
+            qw.eq(CoreSafecheckPlan::getIsDeleted, 0);
+            qw.eq(CoreSafecheckPlan::getPlanStatus, 0);
+            plans = planMapper.selectList(qw);
+            map = DateHelper.getStartAndEnd(safetyTaskBuildDto.getDate(), safetyTaskBuildDto.getPlanCycle());
+        }
+        List<PlanTaskBuildVo> tasks = new ArrayList<>();
+        for (CoreSafecheckPlan plan : plans) {
+            List<PlanTaskBuildVo> planTask = createPlanTask(plan, safetyTaskBuildDto);
+            tasks.addAll(planTask);
+        }
+        //生成具体任务
+        buildTask(safetyTaskBuildDto.getDate(), tasks, map.get("start"), map.get("end"), true, 0);
+    }
+
+    //检查参数
+    public List<String> checkParam(SafetyTaskBuildDto safetyTaskBuildDto) {
+        List<String> list = new ArrayList<>();
+        DateHelper dateHelper = new DateHelper(safetyTaskBuildDto.getDate());
+        Map<String, Date> map = null;
+        List<CoreSafecheckPlan> plans = null;
+        if (safetyTaskBuildDto.getPlanId() != null) {
+            plans = new ArrayList<>();
+            CoreSafecheckPlan coreSafecheckPlan = planMapper.selectById(safetyTaskBuildDto.getPlanId());
+            if (coreSafecheckPlan.getPlanStatus() == 1) {
+                list.add("当前计划:" + coreSafecheckPlan.getPlanName() + "已禁用!");
+                return list;
+            }
+            plans.add(coreSafecheckPlan);
+            map = DateHelper.getStartAndEnd(safetyTaskBuildDto.getDate(), Math.toIntExact(coreSafecheckPlan.getPlanCycle()));
+        } else {
+            LambdaUpdateWrapper<CoreSafecheckPlan> qw = new LambdaUpdateWrapper<>();
+            qw.eq(CoreSafecheckPlan::getPlanCycle, safetyTaskBuildDto.getPlanCycle());
+            qw.eq(CoreSafecheckPlan::getIsDeleted, 0);
+            qw.eq(CoreSafecheckPlan::getPlanStatus, 0);
+            plans = planMapper.selectList(qw);
+            map = DateHelper.getStartAndEnd(safetyTaskBuildDto.getDate(), safetyTaskBuildDto.getPlanCycle());
+        }
+        if (CollectionUtil.isEmpty(plans)) {
+            list.add("计划不存在");
+        }
+        for (CoreSafecheckPlan plan : plans) {
+            if (ObjectUtil.notEqual(plan.getPlanCycle(), safetyTaskBuildDto.getPlanCycle())) {
+                list.add("计划周期与计划不匹配");
+                break;
+            }
+        }
+        if (map.keySet().size() == 0) {
+            list.add("计划周期不存在");
+        }
+        if (ObjectUtil.isNotEmpty(safetyTaskBuildDto.getExecOrgIdList())) {
+            List<Long> execOrgIdList = safetyTaskBuildDto.getExecOrgIdList();
+            for (CoreSafecheckPlan plan : plans) {
+                List<CoreSafecheckPlanToExecOrg> coreSafecheckPlanToExecOrgs = planToExecOrgMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToExecOrg>().eq(CoreSafecheckPlanToExecOrg::getPlanId, plan.getId()));
+                if (CollectionUtil.isEmpty(coreSafecheckPlanToExecOrgs)) {
+                    //说明计划是根据机构类型配置的,获取所有的机构类型,如果参数中执行机构的机构类型存在不属于此计划的执行机构,则返回错误
+                    List<Long> orgTypeList = orgService.selectOrgTypeByIdList(execOrgIdList, SecurityConstants.INNER);
+                    for (Long orgType : orgTypeList) {
+                        if (ObjectUtil.notEqual(orgType, plan.getExecOrgType())) {
+                            list.add("参数中," + plan.getPlanName() + "计划下存在错误执行机构数据");
+                            break;
+                        }
+                    }
+                } else {
+                    //获取当前计划的所有执行机构,如果参数中存在不属于此计划的执行机构,则返回错误
+                    List<Long> collect = coreSafecheckPlanToExecOrgs.stream().map(CoreSafecheckPlanToExecOrg::getOrgId).collect(Collectors.toList());
+                    for (Long execOrgId : execOrgIdList) {
+                        if (!collect.contains(execOrgId)) {
+                            list.add("参数中," + plan.getPlanName() + "计划下存在错误执行机构数据");
+                            break;
+                        }
+                    }
+                }
+
+
+            }
+
+        }
+        if (ObjectUtil.isNotEmpty(safetyTaskBuildDto.getCheckOrgIdList())) {
+            List<Long> checkOrgIdList = safetyTaskBuildDto.getCheckOrgIdList();
+            for (CoreSafecheckPlan plan : plans) {
+                List<CoreSafecheckPlanToCheckOrg> coreSafecheckPlanToCheckOrgs = planToCheckOrgMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrg>().eq(CoreSafecheckPlanToCheckOrg::getPlanId, plan.getId()));
+                if (ObjectUtil.isEmpty(coreSafecheckPlanToCheckOrgs)) {
+                    //说明计划是根据机构类型配置的,获取所有的机构类型,如果参数中受检机构的机构类型存在不属于此计划的受检机构,则返回错误
+                    List<Long> orgTypeList = orgService.selectOrgTypeByIdList(checkOrgIdList, SecurityConstants.INNER);
+                    for (Long orgType : orgTypeList) {
+                        if (ObjectUtil.notEqual(orgType, plan.getCheckOrgType())) {
+                            list.add("参数中," + plan.getPlanName() + "计划下存在错误检查机构数据");
+                            break;
+                        }
+                    }
+                } else {
+                    //获取当前计划的所有受检机构,如果参数中存在不属于此计划的受检机构,则返回错误
+                    List<Long> collect = coreSafecheckPlanToCheckOrgs.stream().map(CoreSafecheckPlanToCheckOrg::getOrgId).collect(Collectors.toList());
+                    for (Long checkOrgId : checkOrgIdList) {
+                        if (!collect.contains(checkOrgId)) {
+                            list.add("参数中," + plan.getPlanName() + "计划下存在错误检查机构数据");
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        if (ObjectUtil.isNotEmpty(safetyTaskBuildDto.getRoleIdList())) {
+            List<Long> roleIdList = safetyTaskBuildDto.getRoleIdList();
+            for (CoreSafecheckPlan plan : plans) {
+                List<CoreSafecheckPlanToRole> coreSafecheckPlanToRoles = planToRoleMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToRole>().eq(CoreSafecheckPlanToRole::getPlanId, plan.getId()));
+                List<Long> collect = coreSafecheckPlanToRoles.stream().map(CoreSafecheckPlanToRole::getRoleId).collect(Collectors.toList());
+                if (!new HashSet<>(collect).containsAll(roleIdList)) {
+                    list.add("参数中," + plan.getPlanName() + "计划下存在错误角色数据");
+                    break;
+                }
+            }
+        }
+        if (DateUtil.beginOfDay(map.get("end")).isBefore(DateUtil.beginOfDay(new Date()))) {
+            list.add("计划周期已过");
+        }
+        return list;
+
+    }
+}

+ 9 - 9
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java

@@ -113,8 +113,8 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     public void insertCoreSafecheckPlan(CoreSafecheckPlan coreSafecheckPlan) {
         //先处理检查计划
         coreSafecheckPlan.setPlanOfOrgId(coreSafecheckPlan.getPlanCreateOrgId());
-
         if (coreSafecheckPlan.getId() == null) {
+            coreSafecheckPlan.setIsDeleted("0");
             coreSafecheckPlan.setCreateTime(DateUtils.getNowDate());
             coreSafecheckPlan.setModifiedBy(SecurityUtils.getUserId());
             coreSafecheckPlanMapper.insert(coreSafecheckPlan);
@@ -134,20 +134,20 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             }
         }
         //再处理检查机构关系
-        if (coreSafecheckPlan.getExecOrgList() != null) {
+        if (coreSafecheckPlan.getExecOrgIds() != null) {
                 coreSafecheckPlanToExecOrgMapper.deleteCoreSafecheckPlanToExecOrgByPlanId(coreSafecheckPlan.getId());
-            for (SysOrg org :
-                    coreSafecheckPlan.getExecOrgList()) {
-                coreSafecheckPlanToExecOrgMapper.insert(new CoreSafecheckPlanToExecOrg(coreSafecheckPlan.getId(), org.getId()));
+            for (Long org :
+                    coreSafecheckPlan.getExecOrgIds()) {
+                coreSafecheckPlanToExecOrgMapper.insert(new CoreSafecheckPlanToExecOrg(coreSafecheckPlan.getId(), org));
 
             }
         }
         //再处理受检机构关系
-        if (coreSafecheckPlan.getCheckOrgList() != null) {
+        if (coreSafecheckPlan.getCheckOrgIds() != null) {
                 coreSafecheckPlanToCheckOrgMapper.deleteCoreSafecheckPlanToCheckOrgByPlanId(coreSafecheckPlan.getId());
-            for (SysOrg org :
-                    coreSafecheckPlan.getCheckOrgList()) {
-                coreSafecheckPlanToCheckOrgMapper.insert(new CoreSafecheckPlanToCheckOrg(coreSafecheckPlan.getId(), org.getId()));
+            for (Long org :
+                    coreSafecheckPlan.getCheckOrgIds()) {
+                coreSafecheckPlanToCheckOrgMapper.insert(new CoreSafecheckPlanToCheckOrg(coreSafecheckPlan.getId(), org));
 
             }
         }

+ 54 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/vo/PlanTaskBuildVo.java

@@ -0,0 +1,54 @@
+package com.xunmei.core.safetyCheck.vo;
+
+import com.xunmei.core.safetyCheck.domain.CoreSafecheckPlanToRole;
+import com.xunmei.system.api.domain.SysOrg;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : 高雄
+ * @date :2022/6/29 18:29
+ * @description :
+ * @modyified By:
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PlanTaskBuildVo {
+
+    private Long planId;
+    /**
+     * 无周期 开始日期
+     */
+    private Date startTime;
+    /**
+     * 无周期结束日期
+     */
+    private Date endTime;
+    /**
+     * 检查周期
+     */
+    private Integer planCycle;
+    /**
+     * 检查名称
+     */
+    private String planName;
+    /**
+     * 检查机构
+     */
+    private SysOrg checkOrg;
+
+    /**
+     * 受检机构
+     */
+    private SysOrg execOrg;
+    /**
+     * 检查角色
+     */
+    private CoreSafecheckPlanToRole role;
+
+}

+ 27 - 17
soc-modules/soc-modules-core/src/main/resources/mapper/safetycheck/CoreSafetyTaskMapper.xml

@@ -201,25 +201,35 @@
     </select>
     <select id="selectCoreSafetyTaskPage" resultType="com.xunmei.core.safetyCheck.domain.CoreSafetyTask">
         SELECT t.title,
-               o1.`name`    as org_name,
-               o2.`name`    as check_org_name,
-               u1.name      as submit_name,
-               r1.role_name as role_name,
-               t.start_time,
-               t.end_time,
-               t.`status`,
-               t.submit_by,
-               t.submit_time,
-               t.exception_count,
-               t.des
+        o1.`name` as org_name,
+        o2.`name` as check_org_name,
+        u1.name as submit_name,
+        r1.role_name as role_name,
+        t.start_time,
+        t.end_time,
+        t.`status`,
+        t.submit_by,
+        t.submit_time,
+        t.exception_count,
+        t.des,
+        t.ymd_date,
+        t.plan_start_time,
+        t.plan_end_time
         FROM core_safety_task t
-                 LEFT JOIN sys_org o1 ON o1.id = t.org_id
-                 LEFT JOIN sys_org o2 ON o2.id = t.check_org_id
-                 LEFT JOIN sys_user u1 ON u1.id = t.submit_by
-                 LEFT JOIN sys_role r1 ON r1.id = t.role_id
+        LEFT JOIN sys_org o1 ON o1.id = t.org_id
+        LEFT JOIN sys_org o2 ON o2.id = t.check_org_id
+        LEFT JOIN sys_user u1 ON u1.id = t.submit_by
+        LEFT JOIN sys_role r1 ON r1.id = t.role_id
         WHERE t.deleted = 0
-
-
+        <if test="task.title != null  and task.title != ''">
+            and t.title like concat('%', #{task.title}, '%')
+        </if>
+        <if test="task.planStartTime != null ">
+            and t.plan_start_time =#{task.planStartTime}
+        </if>
+        <if test="task.status != null  and task.status != ''">
+            and t.status =#{task.status}
+        </if>
     </select>
 
     <insert id="insertCoreSafetyTask" parameterType="com.xunmei.core.safetyCheck.domain.CoreSafetyTask">

+ 19 - 4
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeptController.java

@@ -81,10 +81,10 @@ public class SysDeptController extends BaseController {
     @Log(title = "机构管理", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysOrg dept) {
-       if (orgService.list(new QueryWrapper<SysOrg>().eq("name", dept.getName())).size() > 0) {
+        if (orgService.list(new QueryWrapper<SysOrg>().eq("name", dept.getName())).size() > 0) {
             return error("新增机构'" + dept.getName() + "'失败,机构名称已存在");
         }
-        if(ObjectUtil.isEmpty(dept.getShortName())){
+        if (ObjectUtil.isEmpty(dept.getShortName())) {
             dept.setShortName(dept.getName());
         }
         dept.setCreateBy(SecurityUtils.getUsername());
@@ -246,8 +246,8 @@ public class SysDeptController extends BaseController {
      */
     @InnerAuth
     @GetMapping("/selectByOrgPathAndOrgType/{orgPath}/{orgType}")
-    List<SysOrg> selectByOrgPathAndOrgType(@PathVariable("orgPath") String orgPath,@PathVariable("orgType") Integer orgType) {
-        return orgService.selectByOrgPathAndOrgType(orgPath,orgType);
+    List<SysOrg> selectByOrgPathAndOrgType(@PathVariable("orgPath") String orgPath, @PathVariable("orgType") Integer orgType) {
+        return orgService.selectByOrgPathAndOrgType(orgPath, orgType);
     }
 
     @ApiOperation(value = "根据id获取机构信息", notes = "根据id获取机构信息")
@@ -268,6 +268,7 @@ public class SysDeptController extends BaseController {
     SysOrg getSysOrgByUserId(@PathVariable("userId") Long userId) {
         return orgService.getSysOrgByUserId(userId);
     }
+
     @ApiOperation(value = "获取上级行社", notes = "获取上级行社")
     @InnerAuth
     @PostMapping("/selectParentHs")
@@ -288,4 +289,18 @@ public class SysDeptController extends BaseController {
     List<SysOrg> selectByOrgIdList(@RequestBody List<Long> orgIdList) {
         return orgService.selectByOrgIdList(orgIdList);
     }
+
+    @ApiOperation(value = "根据机构id获取所有的机构类型")
+    @InnerAuth
+    @PostMapping("/selectOrgTypeByIdList")
+    List<Long> selectOrgTypeByIdList(@RequestBody List<Long> orgIdList) {
+        return orgService.selectOrgTypeByIdList(orgIdList);
+    }
+
+    @ApiOperation(value = "根据受检机构类型查询")
+    @InnerAuth
+    @GetMapping("/findByOrgTypeAndParent")
+    List<SysOrg> findByOrgTypeAndParent(Integer orgType, String path) {
+        return orgService.findByOrgTypeAndParent(orgType,path);
+    }
 }

+ 3 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysOrgMapper.java

@@ -25,7 +25,7 @@ public interface SysOrgMapper extends BaseMapper<SysOrg> {
      * @return 【请填写功能名称】
      */
     SysOrg selectSysOrgById(Long id);
-
+    List<Long> selectOrgTypeByIdList(@Param("orgIdList") List<Long> execOrgIdList);
     Long getOrgIdByTaskId(Long taskId);
     /**
      * 查询【请填写功能名称】列表
@@ -85,4 +85,6 @@ public interface SysOrgMapper extends BaseMapper<SysOrg> {
      * @return
      */
     List<IdNameVo> getParentName(@Param("ids") List<Long> ids);
+
+    List<SysOrg> findByOrgTypeAndParent(@Param("orgType")Integer orgType, @Param("path")String path);
 }

+ 2 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysOrgService.java

@@ -87,8 +87,9 @@ public interface ISysOrgService extends IService<SysOrg> {
     List<SysOrg> selectByOrgPathAndOrgType(String orgPath, Integer orgType);
 
     SysOrg getSysOrgByUserId(Long userId);
+    List<Long> selectOrgTypeByIdList(List<Long> execOrgIdList);
 
-
+    List<SysOrg> findByOrgTypeAndParent(Integer orgType, String path);
     /**
      * 查询机构树结构信息
      *

+ 8 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java

@@ -257,6 +257,14 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
     }
 
     @Override
+    public List<Long> selectOrgTypeByIdList(List<Long> execOrgIdList) {
+        return sysOrgMapper.selectOrgTypeByIdList(execOrgIdList);
+    }
+    @Override
+    public List<SysOrg> findByOrgTypeAndParent(Integer orgType, String path) {
+        return sysOrgMapper.findByOrgTypeAndParent(orgType, path);
+    }
+    @Override
     public List<SysOrg> selectDeptTreeList(SysOrg dept) {
         Long userId = SecurityUtils.getUserId();
         SysOrg sysOrg = baseMapper.selectSysOrgByUserId(userId);

+ 13 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysOrgMapper.xml

@@ -668,4 +668,17 @@
         FROM core_monitoring_retrieval_task cmrt
         WHERE id = #{taskId}
     </select>
+    <select id="selectOrgTypeByIdList" resultType="java.lang.Long">
+        select distinct type
+        from sys_org
+        where id in
+        <foreach collection="orgIdList" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+
+    </select>
+    <select id="findByOrgTypeAndParent" resultType="com.xunmei.system.api.domain.SysOrg">
+        select c.* from sys_org c where c.type = #{orgType} and c.path like concat('%',#{path}, '%')  and deleted=0
+
+    </select>
 </mapper>