Переглянути джерело

Merge remote-tracking branch 'origin/V0.0.2' into V0.0.2

jingyuanchao 2 роки тому
батько
коміт
9c4e932974
15 змінених файлів з 512 додано та 33 видалено
  1. 19 6
      project_data/sql/0.0.2/soc/soc.sql
  2. 12 10
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/config/MybatisPlusConfig.java
  3. 296 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/interceptor/EscapeLikeSqlInterceptor.java
  4. 3 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/domain/TMonitoringRetrievalPlan.java
  5. 80 6
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java
  6. 1 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/controller/ApiPlanController.java
  7. 9 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/controller/CoreMonitoringRetrievalTaskController.java
  8. 7 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/mapper/CoreMonitoringRetrievalTaskMapper.java
  9. 5 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/ICoreMonitoringRetrievalTaskService.java
  10. 11 3
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/impl/CoreMonitoringRetrievalTaskServiceImpl.java
  11. 13 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafecheckPlanController.java
  12. 4 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafecheckPlanService.java
  13. 42 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java
  14. 7 1
      soc-modules/soc-modules-core/src/main/resources/mapper/retrieval/CoreMonitoringRetrievalTaskMapper.xml
  15. 3 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 19 - 6
project_data/sql/0.0.2/soc/soc.sql

@@ -981,7 +981,7 @@ IF
 		
 	END IF;
 	IF
-		EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'soc.sys_area_check' AND COLUMN_NAME = 'area_id' ) THEN
+		EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sys_area_check' AND COLUMN_NAME = 'area_id' ) THEN
 			ALTER TABLE sys_area_check DROP COLUMN area_id;
 		
 	END IF;
@@ -1031,7 +1031,7 @@ IF
 	-- 调阅计划是否立即生成任务
     IF
 NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'core_monitoring_retrieval_plan' AND COLUMN_NAME = 'immediately' ) THEN
-ALTER TABLE `core_monitoring_retrieval_plan` ADD COLUMN `immediately` VARCHAR ( 2 ) DEFAULT NULL COMMENT '是否立即生成任务1是2否';
+ALTER TABLE `core_monitoring_retrieval_plan` ADD COLUMN `immediately` bit(1) NULL DEFAULT NULL COMMENT '立即生成任务';
 
 END IF;
 	-- 履职计划是否下发标识
@@ -1648,6 +1648,10 @@ DELETE from `sys_dict_data` WHERE dict_type='resumption_plan_status';
 INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 1, '使用中', '1', 'resumption_plan_status', NULL, 'default', 'N', '0', '何悦', '2023-08-29 10:25:18', '省联社账号', '2023-10-16 18:19:52', NULL);
 INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 2, '草稿', '0', 'resumption_plan_status', NULL, 'default', 'N', '0', '何悦', '2023-08-29 10:25:29', '省联社账号', '2023-10-16 18:19:59', NULL);
 INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 0, '停用', '2', 'resumption_plan_status', NULL, 'default', 'N', '0', '省联社账号', '2023-10-16 18:20:15', '', NULL, NULL);
+DELETE FROM `sys_dict_data` WHERE `dict_type`='check_status';
+INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 1, '使用中', '1', 'check_status', NULL, 'default', 'N', '0', '超级管理员', '2023-09-12 09:36:04', '省联社账号', '2023-10-17 10:19:11', NULL);
+INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 2, '停用', '2', 'check_status', NULL, 'default', 'N', '0', '超级管理员', '2023-09-12 09:36:12', '省联社账号', '2023-10-17 10:19:47', NULL);
+INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 3, '草稿', '0', 'check_status', NULL, 'default', 'N', '0', '省联社账号', '2023-10-17 10:20:01', '', NULL, NULL);
 
 
 
@@ -2047,10 +2051,19 @@ UPDATE sys_dict_data t SET t.dict_sort = 4 WHERE t.dict_code = 294 and t.dict_ty
 UPDATE sys_dict_data t SET t.dict_label = '待培训' WHERE t.dict_code = 292 and t.dict_type = 'edu_training_do_status' and t.dict_value=0;
 
 -- 教育培训周期字典新增 每日 每周
-UPDATE soc.sys_dict_data t SET t.dict_sort = 3 WHERE dict_type='edu_plan_cycle' and dict_value=3;
-UPDATE soc.sys_dict_data t SET t.dict_sort = 5 WHERE dict_type='edu_plan_cycle' and dict_value=5;
-UPDATE soc.sys_dict_data t SET t.dict_sort = 6 WHERE dict_type='edu_plan_cycle' and dict_value=6;
-UPDATE soc.sys_dict_data t SET t.dict_sort = 4 WHERE dict_type='edu_plan_cycle' and dict_value=4;
+UPDATE sys_dict_data t SET t.dict_sort = 3 WHERE dict_type='edu_plan_cycle' and dict_value=3;
+UPDATE sys_dict_data t SET t.dict_sort = 5 WHERE dict_type='edu_plan_cycle' and dict_value=5;
+UPDATE sys_dict_data t SET t.dict_sort = 6 WHERE dict_type='edu_plan_cycle' and dict_value=6;
+UPDATE sys_dict_data t SET t.dict_sort = 4 WHERE dict_type='edu_plan_cycle' and dict_value=4;
+
+DELETE FROM `sys_dict_type` WHERE  `dict_type`='safety_check_status';
+DELETE FROM `sys_dict_data` WHERE  `dict_type`='safety_check_status';
+INSERT INTO `sys_dict_type` (`dict_name`, `dict_type`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('安全检查状态', 'safety_check_status', '0', '超级管理员', '2023-09-21 10:40:03', '', NULL, '安全检查状态');
+INSERT INTO `sys_dict_data` ( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 1, '待检查', '1', 'safety_check_status', NULL, 'default', 'N', '0', '超级管理员', '2023-09-21 10:44:18', '', NULL, NULL);
+INSERT INTO `sys_dict_data` (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 2, '进行中', '2', 'safety_check_status', NULL, 'default', 'N', '0', '超级管理员', '2023-09-21 10:44:29', '', NULL, NULL);
+INSERT INTO `sys_dict_data` ( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 3, '完成', '3', 'safety_check_status', NULL, 'default', 'N', '0', '超级管理员', '2023-09-21 10:44:36', '', NULL, NULL);
+INSERT INTO `sys_dict_data` ( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 4, '已逾期', '4', 'safety_check_status', NULL, 'default', 'N', '0', '超级管理员', '2023-09-21 10:44:43', '', NULL, NULL);
+
 
 UPDATE `sys_dict_data` SET `dict_label` = '已逾期' WHERE `dict_type` = 'resumption_status' and `dict_value` = '4';
 UPDATE `sys_menu` SET `menu_name` = '布撤防状态监管' WHERE `menu_name` = '防区信息管理' and `platform_type` = '1';

+ 12 - 10
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/config/MybatisPlusConfig.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.xunmei.common.core.interceptor.EscapeLikeSqlInterceptor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -16,12 +17,12 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
  */
 @EnableTransactionManagement(proxyTargetClass = true)
 @Configuration
-public class MybatisPlusConfig
-{
+public class MybatisPlusConfig {
     @Bean
-    public MybatisPlusInterceptor mybatisPlusInterceptor()
-    {
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+
+        interceptor.addInnerInterceptor(escapeLikeSqlInterceptor());
         // 分页插件
         interceptor.addInnerInterceptor(paginationInnerInterceptor());
         // 乐观锁插件
@@ -34,8 +35,7 @@ public class MybatisPlusConfig
     /**
      * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
      */
-    public PaginationInnerInterceptor paginationInnerInterceptor()
-    {
+    public PaginationInnerInterceptor paginationInnerInterceptor() {
         PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
         // 设置数据库类型为mysql
         paginationInnerInterceptor.setDbType(DbType.MYSQL);
@@ -47,16 +47,18 @@ public class MybatisPlusConfig
     /**
      * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
      */
-    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor()
-    {
+    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
         return new OptimisticLockerInnerInterceptor();
     }
 
     /**
      * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
      */
-    public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
-    {
+    public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
         return new BlockAttackInnerInterceptor();
     }
+
+    public EscapeLikeSqlInterceptor escapeLikeSqlInterceptor() {
+        return new EscapeLikeSqlInterceptor();
+    }
 }

+ 296 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/interceptor/EscapeLikeSqlInterceptor.java

@@ -0,0 +1,296 @@
+package com.xunmei.common.core.interceptor;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Filter;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 自定义mybatis-plus拦截器, 用于转义模糊查询参数中的特殊字符
+ *
+ * @author wangjingyang
+ * @date 2021/6/24 10:33
+ */
+public class EscapeLikeSqlInterceptor implements InnerInterceptor {
+    /**
+     * 点
+     */
+    public static final String DOT = ".";
+
+    /**
+     * 按?分割字符串表达式
+     */
+    public static final String PLACEHOLDER_REGEX = "\\?";
+
+    /**
+     * 按.分割字符串表达式
+     */
+    public static final String DOT_REGEX = "\\.";
+
+    /**
+     * like操作通配符
+     */
+    public static final char LIKE_WILDCARD_CHARACTER = '%';
+
+    /**
+     * like操作通常会存在的占位符形式
+     */
+    public static final String PLACEHOLDER = " ?";
+
+    /**
+     * 条件构造器生成sql特有的参数名前缀
+     */
+    public static final String WRAPPER_PARAMETER_PROPERTY = "ew.paramNameValuePairs.";
+
+    /**
+     * like语句在sql中的字符串
+     */
+    private final String LIKE_SQL = " like ";
+
+    private static final String SQL_SPECIAL_CHARACTER = "_%*@|&()[]\"'\\";
+
+    /**
+     * 不应用此拦截器的参数名,方法参数中有此名称的参数则不应用此拦截器
+     */
+    private final String IGNORE = "EscapeLikeSqlIgnore";
+
+    @Override
+    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
+        if (parameter instanceof Map) {
+            Map<?, ?> parameterMap = (Map<?, ?>) parameter;
+            if (parameterMap.containsKey(IGNORE)){
+                return;
+            }
+        }
+
+        if (!needEscape(boundSql.getSql())) {
+            return;
+        }
+        escapeSql(boundSql);
+    }
+
+    @Override
+    public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
+        if (parameter instanceof Map) {
+            Map<?, ?> parameterMap = (Map<?, ?>) parameter;
+            if (parameterMap.containsKey(IGNORE)){
+                return;
+            }
+        }
+
+        BoundSql boundSql = ms.getBoundSql(parameter);
+        if (!needEscape(boundSql.getSql())) {
+            return;
+        }
+        escapeSql(boundSql);
+    }
+
+    /**
+     * sql是否需要转义
+     *
+     * @param sql
+     * @return
+     */
+    private boolean needEscape(String sql) {
+        return containLike(sql) && containPlaceholder(sql);
+    }
+
+    /**
+     * sql是否包含like语句
+     *
+     * @param sql
+     * @return
+     */
+    private boolean containLike(String sql) {
+        return StrUtil.containsIgnoreCase(sql, LIKE_SQL);
+    }
+
+    /**
+     * sql是否包含占位符
+     *
+     * @param sql
+     * @return
+     */
+    private boolean containPlaceholder(String sql) {
+        return StrUtil.contains(sql, PLACEHOLDER);
+    }
+
+    /**
+     * 参数名是否是条件构造器生成
+     *
+     * @param property
+     * @return
+     */
+    private boolean containWrapper(String property) {
+        return StrUtil.contains(property, WRAPPER_PARAMETER_PROPERTY);
+    }
+
+    /**
+     * 参数名是否是对象的嵌套表达式
+     *
+     * @param property
+     * @return
+     */
+    private boolean cascadeParameter(String property) {
+        return StrUtil.contains(property, DOT);
+    }
+
+    /**
+     * 转义sql语句中的特殊字符
+     *
+     * @param boundSql
+     */
+    @SuppressWarnings("unchecked")
+    private void escapeSql(BoundSql boundSql) {
+        String[] split = boundSql.getSql().split(PLACEHOLDER_REGEX);
+        Object parameter = boundSql.getParameterObject();
+        Set<String> processedProperty = new HashSet<>();
+        for (int i = 0; i < split.length; i++) {
+            // like 通常在末尾
+            if (StrUtil.lastIndexOfIgnoreCase(split[i], LIKE_SQL) > -1) {
+                if (parameter instanceof Map) {
+                    // 拿到此位置的"?"对应的参数名
+                    String property = boundSql.getParameterMappings().get(i).getProperty();
+                    // 防止重复转义
+                    if (processedProperty.contains(property)){
+                        continue;
+                    }
+                    Map<Object, Object> parameterMap = (Map<Object, Object>) parameter;
+                    if (containWrapper(property)) {
+                        // 条件构造器构造sql方式
+                        handlerWrapperEscape(property, parameterMap);
+                    } else {
+                        // 自主写sql方式
+                        handlerOriginalSqlEscape(property, parameterMap);
+                    }
+                    processedProperty.add(property);
+                } else if (parameter instanceof String) {
+                    // 单条件&&不通过条件构造器&&直接写sql&&mapper不写@Param注解,会导致parameter直接为参数值而不是map
+//                    BeanUtil.setFieldValue(boundSql, "parameterObject", SqlUtil.addSalashes((String) parameter));
+                    // 强行反射设置属性,暂不清楚为什么更改parameterObject无效
+                    BeanUtil.setFieldValue(boundSql.getParameterObject(), "value", addSalashes(((String) parameter)).toCharArray());
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理通过条件构造器构造sql的转义
+     *
+     * @param property        参数名
+     * @param parameterObject 此条sql的参数map
+     */
+    private void handlerWrapperEscape(String property, Map<?, ?> parameterObject) {
+        String[] keys = property.split(DOT_REGEX);
+        Object ew = parameterObject.get(keys[0]);
+        if (ew instanceof AbstractWrapper) {
+            Map<String, Object> paramNameValuePairs = ((AbstractWrapper<?, ?, ?>) ew).getParamNameValuePairs();
+            // 拿到参数值
+            Object paramValue = paramNameValuePairs.get(keys[2]);
+            if (paramValue instanceof String) {
+                // 去除首尾%并转义后再拼上%
+                paramNameValuePairs.put(keys[2], String.format("%%%s%%", addSalashes((String) paramValue, LIKE_WILDCARD_CHARACTER)));
+            }
+        }
+    }
+
+    /**
+     * 处理自己写sql的转义
+     *
+     * @param property        参数名
+     * @param parameterObject 此条sql的参数map
+     */
+    private void handlerOriginalSqlEscape(String property, Map<Object, Object> parameterObject) {
+        if (cascadeParameter(property)) {
+            // 级联形式的参数,比如参数是对象中的某个字段的值:filter.name
+            String[] keys = property.split(DOT_REGEX, 2);
+            Object parameterBean = parameterObject.get(keys[0]);
+            Object parameterValue = BeanUtil.getProperty(parameterBean, keys[1]);
+            if (parameterValue instanceof String) {
+                BeanUtil.setProperty(parameterBean, keys[1], addSalashes((CharSequence) parameterValue));
+            }
+        } else {
+            // 普通参数名
+            parameterObject.computeIfPresent(property, (key, value) -> {
+                if (value instanceof String) {
+                    return addSalashes((CharSequence) value);
+                }
+                return value;
+            });
+        }
+    }
+
+    private static String addSalashes(CharSequence content, Filter<Character> filter){
+        if (StrUtil.isEmpty(content)) {
+            return StrUtil.str(content);
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < content.length(); i++) {
+            char c = content.charAt(i);
+            if (filter.accept(c)) {
+                sb.append('\\');
+            }
+            sb.append(c);
+        }
+
+        return sb.toString();
+    }
+
+    private static String addSalashes(CharSequence content, CharSequence applyCharacters){
+        if (StrUtil.isEmpty(content)) {
+            return StrUtil.str(content);
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < content.length(); i++) {
+            char c = content.charAt(i);
+            if (StrUtil.contains(applyCharacters, c)) {
+                sb.append('\\');
+            }
+            sb.append(c);
+        }
+
+        return sb.toString();
+    }
+
+    private static String addSalashes(CharSequence content){
+        if (StrUtil.isEmpty(content)) {
+            return StrUtil.str(content);
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < content.length(); i++) {
+            char c = content.charAt(i);
+            if (StrUtil.contains(SQL_SPECIAL_CHARACTER, c)) {
+                sb.append('\\');
+            }
+            sb.append(c);
+        }
+
+        return sb.toString();
+    }
+
+    private static String addSalashes(CharSequence content, char trimFix){
+        if (content.charAt(0) == trimFix){
+            content = content.subSequence(1,content.length());
+        }
+        if (content.charAt(content.length() - 1) == trimFix){
+            content = content.subSequence(0,content.length() - 1);
+        }
+
+        return addSalashes(content);
+    }
+}
+

+ 3 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/domain/TMonitoringRetrievalPlan.java

@@ -51,8 +51,9 @@ public class TMonitoringRetrievalPlan extends BaseEntity {
     private String planName;
     @ApiModelProperty(value = "是否显示下发")
     private String isDistribute;
-    @ApiModelProperty(value = "是否立即下发")
-    private String immediately;
+    @ApiModelProperty(value = "是否立即生效", notes = "0:否,1:是")
+    private Boolean immediately = Boolean.FALSE;
+
     /**
      * 计划归属机构
      */

+ 80 - 6
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java

@@ -172,7 +172,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             i = insertTMonitoringRetrievalPlan(tMonitoringRetrievalPlan1);
             if (tMonitoringRetrievalPlan.getOrgType().equals("3")) {
                 if (!tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString()) &&
-                        tMonitoringRetrievalPlan.getImmediately().equals("1")) {
+                        tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE)) {
                     tMonitoringRetrievalPlan1.setStartTime(new Date());
                     int amount = 0;
                     LocalDate lastDayOfMonth;
@@ -232,7 +232,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                     plan.setParentId(tMonitoringRetrievalPlan.getId());
                     plan.setIsDistribute("1");
                     if (!tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString()) &&
-                            tMonitoringRetrievalPlan.getImmediately().equals("1")) {
+                            tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE)) {
                         plan.setStartTime(new Date());
                         int amount = 0;
                         LocalDate lastDayOfMonth;
@@ -268,7 +268,8 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                 }
             }
         }
-        if ((tMonitoringRetrievalPlan.getImmediately().equals("1") || tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString())) && CollectionUtils.isNotEmpty(tMonitoringRetrievalPlans)) {
+        SysOrg sysOrg1 = remoteOrgService.selectSysOrgById(SecurityUtils.getLoginUser().getOrgId(), SecurityConstants.INNER);
+        if (sysOrg1.getType() == 1 && (tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE) || tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString())) && CollectionUtils.isNotEmpty(tMonitoringRetrievalPlans)) {
             try {
                 iCoreMonitoringRetrievalTaskService.noCycleTask(tMonitoringRetrievalPlans);
             } catch (Exception e) {
@@ -369,7 +370,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                 plan.setParentId(tMonitoringRetrievalPlan.getId());
                 plan.setIsDistribute("1");
                 if (!tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString()) &&
-                        tMonitoringRetrievalPlan.getImmediately().equals("1")) {
+                        tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE)) {
                     plan.setStartTime(new Date());
                     int amount = 0;
                     LocalDate lastDayOfMonth;
@@ -403,7 +404,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                 }
                 tMonitoringRetrievalPlans.add(plan);
             }
-            if ((tMonitoringRetrievalPlan.getImmediately().equals("1") || tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString())) && CollectionUtils.isNotEmpty(tMonitoringRetrievalPlans)) {
+            if ((tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE) || tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString())) && CollectionUtils.isNotEmpty(tMonitoringRetrievalPlans)) {
                 try {
                     iCoreMonitoringRetrievalTaskService.noCycleTask(tMonitoringRetrievalPlans);
                 } catch (Exception e) {
@@ -446,7 +447,80 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             QueryWrapper queryWrapper = new QueryWrapper();
             queryWrapper.eq("parent_id", plan.getId());
             baseMapper.delete(queryWrapper);
-            distribute(plan.getId());
+            SysOrg sysOrg1 = remoteOrgService.selectSysOrgById(SecurityUtils.getLoginUser().getOrgId(), SecurityConstants.INNER);
+            List<TMonitoringRetrievalPlan> tMonitoringRetrievalPlans = new ArrayList<>();
+            if (sysOrg1.getType() == 1) {
+                distribute(plan.getId());
+            } else {
+                SysOrg sysOrg = new SysOrg();
+                sysOrg.setPath(plan.getOrgPath());
+                sysOrg.setType(Integer.valueOf(tMonitoringRetrievalPlan.getOrgType()));
+                List<SysOrg> sysOrgs = remoteOrgService.listByParentIdAndType(sysOrg, SecurityConstants.INNER);
+                for (SysOrg s : sysOrgs) {
+                    TMonitoringRetrievalPlan plan1 = new TMonitoringRetrievalPlan();
+                    BeanUtils.copyProperties(tMonitoringRetrievalPlan, plan1);
+                    plan1.setPlanName(tMonitoringRetrievalPlan.getPlanName());
+                    plan1.setOrgId(s.getId());
+                    plan1.setOrgName(s.getShortName());
+                    plan1.setRoleId(tMonitoringRetrievalPlan.getRoleId());
+                    plan1.setRoleName(tMonitoringRetrievalPlan.getRoleName());
+                    plan1.setOrgPath(s.getPath());
+                    plan1.setOrgType(tMonitoringRetrievalPlan.getOrgType());
+                    plan1.setPlanCycle(tMonitoringRetrievalPlan.getPlanCycle());
+                    plan1.setPlanFrequency(tMonitoringRetrievalPlan.getPlanFrequency());
+                    plan1.setPlanStatus(ZERO);
+                    plan1.setCreateBy(SecurityUtils.getUsername());
+                    plan1.setUpdateTime(DateUtils.getNowDate());
+                    plan1.setUpdateBy(SecurityUtils.getUsername());
+                    plan1.setCreateTime(DateUtils.getNowDate());
+                    plan1.setDescription(tMonitoringRetrievalPlan.getDescription());
+                    plan1.setCreateType(1);
+                    plan1.setParentId(tMonitoringRetrievalPlan.getId());
+                    plan1.setIsDistribute("1");
+                    if (!tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString()) &&
+                            tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE)) {
+                        plan1.setStartTime(new Date());
+                        int amount = 0;
+                        LocalDate lastDayOfMonth;
+                        switch (tMonitoringRetrievalPlan.getPlanCycle()) {
+                            case "1":
+                                amount = 1;
+                                break;
+                            case "2":
+                                amount = 7;
+                                break;
+                            case "3":
+                                LocalDate currentDate = LocalDate.now();
+                                lastDayOfMonth = currentDate.withDayOfMonth(currentDate.lengthOfMonth());
+                                amount = lastDayOfMonth.getDayOfMonth() - currentDate.getDayOfMonth();
+                                break;
+                            case "4":
+                                amount = getDayNum(3);
+                                break;
+                            case "5":
+                                amount = getDayNum(6);
+                                break;
+                            case "6":
+                                amount = getDayNum(12);
+                                break;
+                        }
+                        Calendar cal = Calendar.getInstance();
+                        cal.setTime(new Date());
+                        cal.add(Calendar.DATE, amount);
+                        Date time = cal.getTime();
+                        plan1.setEndTime(time);
+                    }
+                    tMonitoringRetrievalPlans.add(plan1);
+                }
+                if ((tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE) || tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString())) && CollectionUtils.isNotEmpty(tMonitoringRetrievalPlans)) {
+                    try {
+                        iCoreMonitoringRetrievalTaskService.noCycleTask(tMonitoringRetrievalPlans);
+                    } catch (Exception e) {
+                        throw new ServiceException("下发任务异常,请联系管理员");
+                    }
+                }
+            }
+
         } catch (Exception e) {
             e.getMessage();
         }

+ 1 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/controller/ApiPlanController.java

@@ -172,7 +172,7 @@ public class ApiPlanController {
         appPlanService.cheHui(id);
         return AjaxResult.success();
     }
-    @ApiOperation(value = "撤回")
+    @ApiOperation(value = "撤回后下发")
     @GetMapping(value = "/distributeCheHui/{id}")
 //    @RequiresPermissions("core:plan:findById")
     public AjaxResult distributeCheHui(@PathVariable Long id) {

+ 9 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/controller/CoreMonitoringRetrievalTaskController.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDate;
@@ -47,7 +48,7 @@ public class CoreMonitoringRetrievalTaskController extends BaseController {
      * 查询监控调阅任务列表app
      */
     @ApiOperation(value = "app查询调阅任务列表")
-  //  @RequiresPermissions("core:task:list")
+    //  @RequiresPermissions("core:task:list")
     @GetMapping("/selectListApp")
     public TableDataInfo<CoreMonitoringRetrievalTask> selectListApp(CoreMonitoringTaskRegistrationDTO coreMonitoringTaskRegistrationDTO) {
         return coreMonitoringRetrievalTaskService.selectListApp(coreMonitoringTaskRegistrationDTO);
@@ -75,6 +76,13 @@ public class CoreMonitoringRetrievalTaskController extends BaseController {
         return success(coreMonitoringRetrievalTaskService.selectCoreMonitoringRetrievalTaskOneVoById(id));
     }
 
+    @ApiOperation(value = "手动初始化")
+    @RequiresPermissions("core:task:edit")
+    @GetMapping(value = "initialization/{id}")
+    public AjaxResult initialization(@PathVariable("id") Long id) {
+        return success(coreMonitoringRetrievalTaskService.initializationTask(id));
+    }
+
     /**
      * 新增监控调阅任务
      */

+ 7 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/mapper/CoreMonitoringRetrievalTaskMapper.java

@@ -87,19 +87,25 @@ public interface CoreMonitoringRetrievalTaskMapper extends BaseMapper<CoreMonito
 
     /**
      * 初始化任务
+     *
      * @param dateTime
      */
     void initializationTask(String dateTime);
 
+    int initializationTaskByHand(Long id);
+
     /**
      * 查询当天未完成任务
+     *
      * @param dateTime
      * @return
      */
-    List<Long>selectTaskByTime(String dateTime);
+    List<Long> selectTaskByTime(String dateTime);
+
     void deleteTaskByPlanId(@Param("planId") Long planId);
 
     List<CoreMonitoringRetrievalTask> selectCompleteByPlanId(Long planId);
+
     void deleteWaitTaskByPlanId(@Param("planId") Long planId);
 
     void updateDeleteTaskByPlanId(@Param("planId") Long planId, @Param("isDeleted") Integer isDeleted);

+ 5 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/ICoreMonitoringRetrievalTaskService.java

@@ -34,10 +34,12 @@ public interface ICoreMonitoringRetrievalTaskService extends IService<CoreMonito
 
     /**
      * 根据计划id查询已完成任务
+     *
      * @param planId
      * @return
      */
-    public List<CoreMonitoringRetrievalTask>selectComplete(Long planId);
+    public List<CoreMonitoringRetrievalTask> selectComplete(Long planId);
+
     /**
      * 查询监控调阅任务列表
      *
@@ -102,6 +104,8 @@ public interface ICoreMonitoringRetrievalTaskService extends IService<CoreMonito
 
     void initializationTask();
 
+    int initializationTask(Long id);
+
     void deleteTaskByPlanId(Long planId);
 
     void deleteWaitTaskByPlanId(Long planId);

+ 11 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/impl/CoreMonitoringRetrievalTaskServiceImpl.java

@@ -375,6 +375,14 @@ public class CoreMonitoringRetrievalTaskServiceImpl extends ServiceImpl<CoreMoni
     }
 
     @Override
+    public int initializationTask(Long id) {
+        int i = 0;
+        i = coreMonitoringRetrievalTaskMapper.initializationTaskByHand(id);
+        i = coreMonitoringTaskRegistrationMapper.deleteByTaskId(id);
+        return i;
+    }
+
+    @Override
     public void deleteTaskByPlanId(Long planId) {
         coreMonitoringRetrievalTaskMapper.deleteTaskByPlanId(planId);
     }
@@ -502,10 +510,10 @@ public class CoreMonitoringRetrievalTaskServiceImpl extends ServiceImpl<CoreMoni
         }*/
         CoreMonitoringRetrievalTask task = new CoreMonitoringRetrievalTask();
         task.setId(IdWorker.getId());
-        if (frequency>1){
+        if (frequency > 1) {
             task.setTaskName(plan.getPlanName() + "第" + frequency + "次调阅");
-        }else {
-            task.setTaskName(plan.getPlanName() +"调阅任务");
+        } else {
+            task.setTaskName(plan.getPlanName() + "调阅任务");
         }
         task.setCycle(plan.getPlanCycle());
         task.setOrgId(sysOrg.getId());

+ 13 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafecheckPlanController.java

@@ -45,7 +45,19 @@ public class CoreSafecheckPlanController extends BaseController {
     @Autowired
     private SafetyCheckJobBusiness jobBusiness;
 
-
+    @ApiOperation(value = "撤回")
+    @GetMapping(value = "/cheHui/{id}")
+//    @RequiresPermissions("core:plan:findById")
+    public AjaxResult cheHui(@PathVariable Long id) {
+        coreSafecheckPlanService.cheHui(id);
+        return AjaxResult.success();
+    }
+    @ApiOperation(value = "撤回后下发")
+    @GetMapping(value = "/distributeCheHui/{id}")
+//    @RequiresPermissions("core:plan:findById")
+    public AjaxResult distributeCheHui(@PathVariable Long id) {
+        return AjaxResult.success(coreSafecheckPlanService.distributeCheHui(id));
+    }
     /**
      * 查询常规安全检查计划列表
      */

+ 4 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafecheckPlanService.java

@@ -74,4 +74,8 @@ public interface ICoreSafecheckPlanService extends IService<CoreSafecheckPlan> {
     List<String> selectItemIdsByPlanId(Long id);
 
     void distributeToOrg(DistributeDto dto);
+
+    void cheHui(Long id);
+
+    int distributeCheHui(Long id);
 }

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

@@ -164,9 +164,49 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
         CoreSafecheckPlan coreSafecheckPlan = new CoreSafecheckPlan();
         coreSafecheckPlan.setId(dto.getId());
         coreSafecheckPlan.setDistribute("1");
+        coreSafecheckPlan.setPlanStatus(1L);
         coreSafecheckPlanMapper.updateById(coreSafecheckPlan);
     }
 
+    @Override
+    public void cheHui(Long id) {
+        CoreSafecheckPlan plan = baseMapper.selectById(id);
+        //修改所有子计划
+        List<CoreSafecheckPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlan>().eq(CoreSafecheckPlan::getParentId, id));
+        for (CoreSafecheckPlan ap :
+                appPlans) {
+//修改计划状态为停用
+            ap.setPlanStatus(2L);
+            baseMapper.updateById(ap);
+        }
+        //设置下发状态为未下发
+        plan.setDistribute("0");
+        plan.setPlanStatus(0L);
+        baseMapper.updateById(plan);
+    }
+
+    @Override
+    public int distributeCheHui(Long id) {
+        CoreSafecheckPlan plan = baseMapper.selectById(id);
+        //修改所有子计划
+        List<CoreSafecheckPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlan>().eq(CoreSafecheckPlan::getParentId, id));
+        //如果不存在子计划直接返回
+        if(appPlans==null||appPlans.size()==0){
+            return 0;
+        }
+        for (CoreSafecheckPlan ap :
+                appPlans) {
+//修改计划状态为停用
+            ap.setPlanStatus(1L);
+            baseMapper.updateById(ap);
+        }
+        //设置下发状态为下发
+        plan.setDistribute("1");
+        plan.setPlanStatus(1L);
+        baseMapper.updateById(plan);
+        return 1;
+    }
+
 
     /**
      * 查询常规安全检查计划
@@ -209,11 +249,13 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             coreSafecheckPlan.setIsDeleted("0");
             coreSafecheckPlan.setCreateTime(DateUtils.getNowDate());
             coreSafecheckPlan.setModifiedBy(SecurityUtils.getUserId());
+            coreSafecheckPlan.setDistribute("0");
             coreSafecheckPlanMapper.insert(coreSafecheckPlan);
 
         } else {
             coreSafecheckPlan.setUpdateTime(DateUtils.getNowDate());
             coreSafecheckPlan.setModifiedBy(SecurityUtils.getUserId());
+            coreSafecheckPlan.setPlanStatus(null);
             coreSafecheckPlanMapper.updateById(coreSafecheckPlan);
         }
 

+ 7 - 1
soc-modules/soc-modules-core/src/main/resources/mapper/retrieval/CoreMonitoringRetrievalTaskMapper.xml

@@ -145,7 +145,9 @@
         <if test="request.moth !=null">
             and ymd_date like concat('%', #{request.moth}, '%')
         </if>
-        ORDER BY create_time DESC ,status
+        ORDER BY
+        `status` desc,
+        create_time DESC
     </select>
     <select id="selectTaskDataVoListByRetrievalTaskId"
             resultType="com.xunmei.common.core.domain.retrieval.vo.TaskDataVo">
@@ -425,6 +427,7 @@
           and status in (0, 3)
     </delete>
 
+
     <update id="updateDeleteTaskByPlanId">
         update core_monitoring_retrieval_task
         set is_deleted = #{isDeleted}
@@ -433,6 +436,9 @@
     <update id="initializationTask">
         update core_monitoring_retrieval_task SET `status`=0, start_time=null WHERE `status`=1 AND start_time LIKE  concat(#{dateTime}, '%')
     </update>
+    <update id="initializationTaskByHand">
+        update core_monitoring_retrieval_task SET `status`=0, start_time=null WHERE `status`=1 AND id=#{id}
+    </update>
 
     <select id="selectCurUserTaskList" resultType="com.xunmei.common.core.domain.panel.vo.PanelListVo">
      select distinct t.id as id, task_name as taskName,t.plan_start_time as startTime,t.plan_end_time as endTime,t.status

+ 3 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -677,6 +677,9 @@
         <if test="info.name != null and info.name != ''">
             AND u.name like concat('%', #{info.name}, '%')
         </if>
+        <if test="info.roleId != null and info.roleId != ''">
+            AND sr.id =#{info.roleId}
+        </if>
         <if test="info.params.beginTime != null and info.params.beginTime != ''">
             <!-- 开始时间检索 -->
             AND date_format(u.create_time,'%y%m%d') &gt;= date_format(#{info.params.beginTime},'%y%m%d')