Browse Source

安全检查状态变更调试

jiawuxian 1 year ago
parent
commit
38f19eca91
13 changed files with 271 additions and 170 deletions
  1. 3 3
      project_data/sql/0.0.5/soc/soc.sql
  2. 4 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java
  3. 2 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java
  4. 3 16
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafecheckPlanController.java
  5. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/SafetyCheckRuleItemController.java
  6. 0 15
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/domain/CoreSafecheckPlan.java
  7. 41 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/enums/SafetyPlanCycle.java
  8. 29 21
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java
  9. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/mapper/CoreSafecheckPlanMapper.java
  10. 9 3
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafecheckPlanService.java
  11. 170 101
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java
  12. 4 6
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/SafetyCheckRegisterSericeImpl.java
  13. 1 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysRoleController.java

+ 3 - 3
project_data/sql/0.0.5/soc/soc.sql

@@ -16,9 +16,9 @@ DROP PROCEDURE
 				ADD COLUMN `publish_time` datetime NULL COMMENT '最后一次下发时间' AFTER `task_has_completed`,
 				ADD COLUMN `withdraw_time` datetime NULL COMMENT '最后一次撤回时间' AFTER `publish_time`,
 				ADD COLUMN `effective_time` datetime NULL COMMENT '计划生效时间' AFTER `withdraw_time`;
-				update core_safecheck_plan set publish_time =update_time WHERE publish_time is null and plan_status=1;
-				update core_safecheck_plan set withdraw_time =update_time WHERE withdraw_time is null and plan_status=2;
-				update core_safecheck_plan set effective_time =update_time WHERE effective_time is null and plan_status=1;
+				update core_safecheck_plan set publish_time =create_time WHERE publish_time is null and plan_status=1;
+				update core_safecheck_plan set withdraw_time =create_time WHERE withdraw_time is null and plan_status=2;
+				update core_safecheck_plan set effective_time =create_time WHERE effective_time is null and (plan_status=1 or plan_status=2);
     END IF;
 END ??
 DELIMITER;

+ 4 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java

@@ -191,7 +191,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 } else {
                     AppPlan plan = new AppPlan();
                     BeanUtils.copyProperties(oldPlan, plan);
-                    if (immediateEffect) {
+                    if (immediateEffect && d.getStatus()==1) {
                         hsPlans.add(plan);
                     }
                     plan.setSolidId(IDHelper.id());
@@ -205,6 +205,9 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                     if (ObjectUtil.equal(d.getStatus(), 1)) {
                         plan.setPublishTime(now);
                         plan.setEffectiveTime(effectiveTime);
+                    }else{
+                        plan.setPublishTime(null);
+                        plan.setEffectiveTime(null);
                     }
                     plan.setCreateTime(new Date());
                     plan.setId(null);

+ 2 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java

@@ -14,6 +14,7 @@ import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.worktime.domain.SysWorkTime;
 import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.enums.ExecTimeCommonEnum;
+import com.xunmei.common.core.enums.PlanStatus;
 import com.xunmei.common.core.enums.resumption.ResumptionTaskStatus;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.StringUtils;
@@ -177,7 +178,7 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
 //            if (ObjectUtil.equal(p.getTaskHasCompleted(), 1)) {
 //                continue;
 //            }
-            if (ObjectUtil.isNull(p.getPlanStatus()) || ObjectUtil.equal(p.getPlanStatus(), 0)) {
+            if (ObjectUtil.notEqual(p.getPlanStatus(), PlanStatus.USING.getCode())) {
                 continue;
             }
             appPlans.add(p);

+ 3 - 16
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/CoreSafecheckPlanController.java

@@ -1,20 +1,8 @@
 package com.xunmei.core.safetyCheck.controller;
 
-import java.util.*;
-import java.io.IOException;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-
-import cn.hutool.core.date.DateTime;
-import com.alibaba.nacos.shaded.com.google.gson.Gson;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.xunmei.common.core.event.WorkTimeChangeEvent;
-import com.xunmei.common.core.utils.DateHelper;
-import com.xunmei.common.security.annotation.InnerAuth;
 import com.xunmei.core.listener.WorkTimeChangeEventListener;
 import com.xunmei.core.resumption.dto.DistributeDto;
 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;
@@ -32,7 +20,6 @@ import com.xunmei.common.core.web.controller.BaseController;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.web.page.TableDataInfo;
 
 /**
@@ -59,10 +46,10 @@ public class CoreSafecheckPlanController extends BaseController {
     }
 
     @ApiOperation(value = "所属机构为行社的任务下发")
-    @GetMapping(value = "/distributehs/{id}/{immediateEffect}")
+    @GetMapping(value = "/distributesingle/{id}/{immediateEffect}")
 //    @RequiresPermissions("core:plan:findById")
-    public AjaxResult distributeHS(@PathVariable Long id, @PathVariable Boolean immediateEffect) throws Exception {
-        int i = coreSafecheckPlanService.distributeHS(id,immediateEffect);
+    public AjaxResult distributeSingle(@PathVariable Long id, @PathVariable Boolean immediateEffect) throws Exception {
+        int i = coreSafecheckPlanService.distributeSingle(id,immediateEffect);
 //        CoreSafecheckPlan plan = coreSafecheckPlanService.getById(id);
 //        //撤回后的下发如果是无周期或者勾选立即执行也需要生成任务
 //        if (plan.isBuildTaskNow() || plan.getPlanCycle() == 6) {

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/controller/SafetyCheckRuleItemController.java

@@ -75,8 +75,8 @@ public class SafetyCheckRuleItemController extends BaseController {
      *
      * @return
      */
-    @GetMapping("pointSelectionPage")
-    public TableDataInfo pointSelectionPage(SafetyCheckRulePointSelectPageDto dto) {
+    @RequestMapping("pointSelectionPage")
+    public TableDataInfo pointSelectionPage(@RequestBody SafetyCheckRulePointSelectPageDto dto) {
         TableDataInfo data = safetyCheckRuleItemService.pointSelectionPage(dto);
         return data;
     }

+ 0 - 15
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/domain/CoreSafecheckPlan.java

@@ -5,10 +5,6 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.xunmei.core.safetyCheck.vo.ruleItem.SafetyCheckRulePointSelectVo;
 import com.xunmei.core.safetyCheck.vo.ruleItem.SafetyCheckRulePointVo;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysRole;
@@ -41,14 +37,9 @@ public class CoreSafecheckPlan extends BaseEntity {
      * 主键
      */
     @TableId(value = "id")
-    @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
     @TableField(exist = false)
-    @JsonSerialize(using = ToStringSerializer.class)
     private Long orgId;
-//    @TableField(exist = false)
-//    @JsonSerialize(using = ToStringSerializer.class)
-//    private Long index;
     /**
      * 固定的id,用于识别多个副本是否属于同一个计划
      */
@@ -109,7 +100,6 @@ public class CoreSafecheckPlan extends BaseEntity {
      * 计划周期:每日,每周,每月,每季度,每半年,每年 ,无周期
      */
     @ApiModelProperty(value = "计划周期:每日,每周,每月,每季度,每半年,每年 ,无周期")
-    @JsonSerialize(using = ToStringSerializer.class)
     private Integer planCycle;
     /**
      * 计划创建机构名称
@@ -119,12 +109,10 @@ public class CoreSafecheckPlan extends BaseEntity {
     /**
      * 计划创建机构id
      */
-    @JsonSerialize(using = ToStringSerializer.class)
     private Long planCreateOrgId;
     /**
      * 检查类型
      */
-    @JsonSerialize(using = ToStringSerializer.class)
     private Long checkType;
     /**
      * 计划所属机构名称
@@ -134,7 +122,6 @@ public class CoreSafecheckPlan extends BaseEntity {
     /**
      * 计划所属机构id
      */
-    @JsonSerialize(using = ToStringSerializer.class)
     private Long planOfOrgId;
     private Long parentId;
     @TableField(exist = false)
@@ -145,7 +132,6 @@ public class CoreSafecheckPlan extends BaseEntity {
      * 检查机构类型
      */
     @ApiModelProperty(value = "检查机构类型")
-    @JsonSerialize(using = ToStringSerializer.class)
     private Integer execOrgType;
     @ApiModelProperty(value = "检查机构")
     private String execOrg;
@@ -168,7 +154,6 @@ public class CoreSafecheckPlan extends BaseEntity {
      * 计划状态:0:启用,1禁用
      */
     @ApiModelProperty(value = "计划状态:0:启用,1禁用")
-    @JsonSerialize(using = ToStringSerializer.class)
     private Integer planStatus;
 
     /**

+ 41 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/enums/SafetyPlanCycle.java

@@ -0,0 +1,41 @@
+package com.xunmei.core.safetyCheck.enums;
+
+import com.xunmei.common.core.enums.CycleCommonEnum;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+import org.apache.commons.lang3.NotImplementedException;
+
+@Getter
+@AllArgsConstructor
+//安全检查周期枚举
+public enum SafetyPlanCycle {
+    NONE(6, "无周期"),
+
+    WEEKLY(1, "每周"),
+    MONTHLY(2, "每月"),
+    QUARTERLY(3, "每季度"),
+    HALF_YEARLY(4, "每半年"),
+    YEARLY(5, "每年");
+    private final Integer code;
+    private final String desc;
+
+    public static CycleCommonEnum toCommon(int safetyPlanCycle){
+        switch (safetyPlanCycle){
+            case 1:
+                return CycleCommonEnum.WEEKLY;
+            case 2:
+                return CycleCommonEnum.MONTHLY;
+            case 3:
+                return CycleCommonEnum.QUARTERLY;
+            case 4:
+                return CycleCommonEnum.HALF_YEARLY;
+            case 5:
+                return CycleCommonEnum.YEARLY;
+            case 6:
+                return CycleCommonEnum.NONE;
+            default:
+                throw  new NotImplementedException();
+        }
+    }
+}

+ 29 - 21
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java

@@ -13,6 +13,7 @@ import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.worktime.domain.SysWorkTime;
 import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.enums.OrgTypeEnum;
+import com.xunmei.common.core.enums.PlanStatus;
 import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.IDHelper;
@@ -176,26 +177,33 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      * @throws Exception
      */
     @Async
-    public void createTaskByPlans(List<CoreSafecheckPlan> plans) throws Exception {
-        if (plans != null && plans.size() > 0) {
-            DateTime datetime = new DateTime();
-            datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
-            CycleCommonEnum code = CycleCommonEnum.getEnum(0);
-            DateRange dateRange = new DateRange(plans.get(0).getStartDate(), plans.get(0).getEndDate());
-            if (plans.get(0).getPlanCycle() != 6) {
-                code = CycleCommonEnum.getEnum(Math.toIntExact(plans.get(0).getPlanCycle()) + 2);
-                dateRange = DateUtils.getStartAndEnd(new Date(), code);
-            }
-            List<PlanTaskBuildVo> tasks = new ArrayList<>();
-            for (CoreSafecheckPlan plan : plans) {
-                List<PlanTaskBuildVo> planTask = createPlanTask(plan);
-                tasks.addAll(planTask);
-            }
+    public void createTaskByPlans(List<CoreSafecheckPlan> plans) {
+        try {
+            if (plans != null && plans.size() > 0) {
+                DateTime datetime = new DateTime();
+                datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+                CycleCommonEnum code = CycleCommonEnum.getEnum(0);
+                DateRange dateRange = new DateRange(plans.get(0).getStartDate(), plans.get(0).getEndDate());
+                if (plans.get(0).getPlanCycle() != 6) {
+                    code = CycleCommonEnum.getEnum(Math.toIntExact(plans.get(0).getPlanCycle()) + 2);
+                    dateRange = DateUtils.getStartAndEnd(new Date(), code);
+                }
+                List<PlanTaskBuildVo> tasks = new ArrayList<>();
+                for (CoreSafecheckPlan plan : plans) {
+                    if (ObjectUtil.notEqual(plan.getPlanStatus(), PlanStatus.USING.getCode())) {
+                        continue;
+                    }
+                    List<PlanTaskBuildVo> planTask = createPlanTask(plan);
+                    tasks.addAll(planTask);
+                }
 
-            //生成具体任务
-            buildTask(datetime, tasks, dateRange.getStartTime(), dateRange.getEndTime(), true, 0);
-        }
 
+                //生成具体任务
+                buildTask(datetime, tasks, dateRange.getStartTime(), dateRange.getEndTime(), true, 0);
+            }
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+        }
     }
 
     /**
@@ -243,7 +251,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
 //        execOrgs = execOrgs.stream().filter(o -> ObjectUtil.equal(o.getIsLock(), false)).collect(Collectors.toList());
         //此处循环所有执行检查的机构
         Set<Integer> cts = new HashSet<>();
-        if(ObjectUtil.isNotEmpty(checkOrgTypes)){
+        if (ObjectUtil.isNotEmpty(checkOrgTypes)) {
             cts.addAll(checkOrgTypes);
         }
         for (SysOrg org : execOrgs) {
@@ -452,7 +460,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
                 vo.setCount((int) i);
                 vo.setPlanCycle(Math.toIntExact(plan.getPlanCycle()));
                 //任务名称去除为1
-                if (coun == 1) {
+                if (rangeMap.size()<=1) {
                     vo.setPlanName(plan.getPlanName());
                 } else {
                     vo.setPlanName(plan.getPlanName() + "第" + cou + "次");
@@ -685,7 +693,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
                         while (iterator.hasNext()) {
                             CoreSafecheckPlan p = iterator.next();
                             List<Integer> checkOrgTypes = coreSafecheckPlanToCheckOrgTypeMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrgType>().eq(CoreSafecheckPlanToCheckOrgType::getPlanId, p.getId())).stream().map(CoreSafecheckPlanToCheckOrgType::getTypeId).collect(Collectors.toList());
-                            if(ObjectUtil.isNotEmpty(checkOrgTypes)){
+                            if (ObjectUtil.isNotEmpty(checkOrgTypes)) {
                                 Set<Integer> acts = new HashSet<>(checkOrgTypes);
                                 if (!acts.contains(worg.getType())) {
                                     iterator.remove();

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/mapper/CoreSafecheckPlanMapper.java

@@ -21,6 +21,9 @@ public interface CoreSafecheckPlanMapper extends BaseMapper<CoreSafecheckPlan> {
      * @return 常规安全检查计划
      */
     CoreSafecheckPlan selectCoreSafecheckPlanById(Long id);
+
+    CoreSafecheckPlan get(Long id);
+
     List<CoreSafecheckPlan> selectByCycle(Long cycle);
     /**
      * 查询常规安全检查计划列表

+ 9 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafecheckPlanService.java

@@ -5,10 +5,8 @@ import java.util.List;
 import com.xunmei.core.resumption.dto.DistributeDto;
 import com.xunmei.core.safetyCheck.domain.CoreSafecheckPlan;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.core.safetyCheck.domain.CoreSafetyTask;
-import com.xunmei.core.safetyCheck.vo.PointDto;
 
 /**
  * 常规安全检查计划Service接口
@@ -80,6 +78,14 @@ public interface ICoreSafecheckPlanService extends IService<CoreSafecheckPlan> {
 
     void cheHui(Long id);
 
-    int distributeHS(Long id, Boolean immediateEffect);
+    int distributeSingle(Long id, Boolean immediateEffect);
     String createSafetyCheckRegisterBookPdf(CoreSafetyTask appSafetyCheckTask);
+
+
+    /**
+     * 更新计划及父计划的任务是否有已完成标志。
+     * @param planId
+     * @param state
+     */
+    void updatePlanCompletedState(Long planId,Integer state);
 }

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

@@ -11,6 +11,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.util.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
@@ -20,16 +21,19 @@ import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.enums.OrgTypeEnum;
 import com.xunmei.common.core.enums.PlanStatus;
 import com.xunmei.common.core.enums.RegisterBookType;
+import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
+import com.xunmei.core.resumption.domain.AppPlan;
 import com.xunmei.core.resumption.dto.DistributeDto;
 import com.xunmei.core.resumption.dto.DistributeStatusDto;
 import com.xunmei.core.resumption.mapper.AppPlanMapper;
 import com.xunmei.core.resumption.vo.appPlan.ResumptionPlanPageVo;
 import com.xunmei.core.safetyCheck.domain.*;
+import com.xunmei.core.safetyCheck.enums.SafetyPlanCycle;
 import com.xunmei.core.safetyCheck.job.SafetyCheckJobBusiness;
 import com.xunmei.core.safetyCheck.mapper.*;
 import com.xunmei.core.safetyCheck.service.ICoreSafecheckPlanService;
@@ -146,17 +150,16 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     @Override
     public void distributeToOrg(DistributeDto dto, Boolean immediateEffect) {
         CoreSafecheckPlan oldPlan = baseMapper.selectById(dto.getId());
+        throwIfNoCycleOverdue(oldPlan);
         Long parentId = IdWorker.getId(oldPlan);
         Date now = new Date();
-        List<Object> hsPlans = new ArrayList<>();
-        Date effectiveTime = new Date();
-        if (!immediateEffect) {
-            effectiveTime = DateUtil.offset(DateUtil.beginOfDay(DateUtils.getStartAndEnd(now, oldPlan.getPlanCycle()).getEndTime()), DateField.DAY_OF_YEAR, 1);
-        }
-        CoreSafecheckPlan byId = baseMapper.selectById(dto.getId());
+        List<CoreSafecheckPlan> hsPlans = new ArrayList<>();
+        Date effectiveTime = getEffectiveTime(oldPlan, immediateEffect);
         for (DistributeStatusDto d :
                 dto.getOrgAndStatus()) {
-            CoreSafecheckPlan plan = baseMapper.selectOne(new LambdaQueryWrapper<CoreSafecheckPlan>().eq(CoreSafecheckPlan::getPlanOfOrgId, d.getOrgId()).eq(CoreSafecheckPlan::getParentId, dto.getId()));
+            CoreSafecheckPlan plan = baseMapper.selectOne(new LambdaQueryWrapper<CoreSafecheckPlan>()
+                    .eq(CoreSafecheckPlan::getPlanOfOrgId, d.getOrgId())
+                    .eq(CoreSafecheckPlan::getParentId, dto.getId()));
             //如果子计划已存在
             if (plan != null) {
                 //从停用状态下发,才会有已存在的子计划;
@@ -169,10 +172,8 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
                     plan.setPublishTime(null);
                     plan.setEffectiveTime(null);
                 }
-                plan.setPlanStatus(d.getStatus() > 0 ? 1 : 2);
                 plan.setDistributePlanStatus(d.getStatus().toString());
                 plan.setDistributeStatus("1");
-                plan.setPlanCreateOrgId(null);
                 if (!immediateEffect) {
                     //停用状态下发,逻辑删除旧的计划,并生成一份副本
                     baseMapper.updateById(plan);
@@ -180,32 +181,34 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
 
                     Long hsPlanId = IdWorker.getId(plan);
                     copyChildPlan(plan.getId(), hsPlanId, parentId);
-
-//                        AppPlan newPlan = baseMapper.selectById(hsPlanId);
                 } else {
                     baseMapper.updateById(plan);
                 }
-                baseMapper.updateById(plan);
             } else {
                 CoreSafecheckPlan coreSafecheckPlan = new CoreSafecheckPlan();
                 BeanUtils.copyProperties(oldPlan, coreSafecheckPlan);
                 if (immediateEffect) {
-                    hsPlans.add(plan);
+                    hsPlans.add(coreSafecheckPlan);
                 }
-                coreSafecheckPlan.setSolidId(IdWorker.getId(coreSafecheckPlan));
+                Long childPlanId = IdWorker.getId(coreSafecheckPlan);
+                coreSafecheckPlan.setId(childPlanId);
+                coreSafecheckPlan.setSolidId(childPlanId);
                 coreSafecheckPlan.setParentSolidId(oldPlan.getSolidId());
                 coreSafecheckPlan.setDistributeStatus("1");
                 coreSafecheckPlan.setPlanOfOrgId(d.getOrgId());
-                coreSafecheckPlan.setPlanStatus(d.getStatus() > 0 ? 1 : 2);
+                coreSafecheckPlan.setPlanStatus(d.getStatus() > 0 ? 1 : 0);
                 coreSafecheckPlan.setDistributePlanStatus(d.getStatus().toString());
                 coreSafecheckPlan.setCreateTime(new Date());
                 if (ObjectUtil.equal(d.getStatus(), 1)) {
                     coreSafecheckPlan.setPublishTime(now);
                     coreSafecheckPlan.setEffectiveTime(effectiveTime);
+                } else {
+                    coreSafecheckPlan.setPublishTime(null);
+                    coreSafecheckPlan.setEffectiveTime(null);
                 }
                 //下发所属机构类型
                 coreSafecheckPlan.setPlanOfOrgType(orgService.selectSysOrgById(coreSafecheckPlan.getPlanOfOrgId(), SecurityConstants.INNER).getType());
-                coreSafecheckPlan.setId(null);
+
 //            if (coreSafecheckPlan.getPlanCycle()==6){
 //                coreSafecheckPlan.setStartDate();
 //            }
@@ -214,28 +217,29 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
                 coreSafecheckPlan.setParentId(dto.getId());
                 baseMapper.insert(coreSafecheckPlan);
 
-                List<CoreSafecheckPlanToRole> roleList = coreSafecheckPlanToRoleMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToRole>().eq(CoreSafecheckPlanToRole::getPlanId, dto.getId()));
+                List<CoreSafecheckPlanToRole> roleList = coreSafecheckPlanToRoleMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToRole>()
+                        .eq(CoreSafecheckPlanToRole::getPlanId, dto.getId()));
                 //再处理角色关系
                 if (roleList != null) {
                     coreSafecheckPlanToRoleMapper.deleteCoreSafecheckPlanToRoleByPlanId(coreSafecheckPlan.getId());
                     for (CoreSafecheckPlanToRole r :
                             roleList) {
                         coreSafecheckPlanToRoleMapper.insert(new CoreSafecheckPlanToRole(coreSafecheckPlan.getId(), r.getRoleId()));
-
                     }
                 }
                 //再处理检查机构关系
-                List<CoreSafecheckPlanToExecOrg> execOrgList = coreSafecheckPlanToExecOrgMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToExecOrg>().eq(CoreSafecheckPlanToExecOrg::getPlanId, dto.getId()));
+                List<CoreSafecheckPlanToExecOrg> execOrgList = coreSafecheckPlanToExecOrgMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToExecOrg>()
+                        .eq(CoreSafecheckPlanToExecOrg::getPlanId, dto.getId()));
                 if (execOrgList != null) {
                     coreSafecheckPlanToExecOrgMapper.deleteCoreSafecheckPlanToExecOrgByPlanId(coreSafecheckPlan.getId());
                     for (CoreSafecheckPlanToExecOrg org :
                             execOrgList) {
                         coreSafecheckPlanToExecOrgMapper.insert(new CoreSafecheckPlanToExecOrg(coreSafecheckPlan.getId(), org.getOrgId()));
-
                     }
                 }
                 //再处理受检机构关系
-                List<CoreSafecheckPlanToCheckOrg> checkOrgList = coreSafecheckPlanToCheckOrgMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrg>().eq(CoreSafecheckPlanToCheckOrg::getPlanId, dto.getId()));
+                List<CoreSafecheckPlanToCheckOrg> checkOrgList = coreSafecheckPlanToCheckOrgMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrg>()
+                        .eq(CoreSafecheckPlanToCheckOrg::getPlanId, dto.getId()));
                 if (checkOrgList != null) {
                     coreSafecheckPlanToCheckOrgMapper.deleteCoreSafecheckPlanToCheckOrgByPlanId(coreSafecheckPlan.getId());
                     for (CoreSafecheckPlanToCheckOrg org :
@@ -245,10 +249,12 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
                     }
                 }
                 //再处理受检机构类型
-                List<CoreSafecheckPlanToCheckOrgType> checkOrgTypes = coreSafecheckPlanToCheckOrgTypeMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrgType>().eq(CoreSafecheckPlanToCheckOrgType::getPlanId, dto.getId()));
+                List<CoreSafecheckPlanToCheckOrgType> checkOrgTypes = coreSafecheckPlanToCheckOrgTypeMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrgType>()
+                        .eq(CoreSafecheckPlanToCheckOrgType::getPlanId, dto.getId()));
                 if (checkOrgTypes != null) {
                     //删除当前计划的受检机构类型
-                    coreSafecheckPlanToCheckOrgTypeMapper.delete(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrgType>().eq(CoreSafecheckPlanToCheckOrgType::getPlanId, coreSafecheckPlan.getId()));
+                    coreSafecheckPlanToCheckOrgTypeMapper.delete(new LambdaQueryWrapper<CoreSafecheckPlanToCheckOrgType>()
+                            .eq(CoreSafecheckPlanToCheckOrgType::getPlanId, coreSafecheckPlan.getId()));
                     for (CoreSafecheckPlanToCheckOrgType type :
                             checkOrgTypes) {
                         coreSafecheckPlanToCheckOrgTypeMapper.insert(new CoreSafecheckPlanToCheckOrgType(coreSafecheckPlan.getId(), type.getTypeId()));
@@ -257,15 +263,16 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
                 //再处理检查要点关系
 
                 //查询父计划的所有检查要点
-                List<CoreSafecheckPlanToPoint> rpList = coreSafecheckPlanToPointMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToPoint>().eq(CoreSafecheckPlanToPoint::getPlanId, dto.getId()).eq(CoreSafecheckPlanToPoint::getOfOrgId, byId.getPlanOfOrgId()));
+                List<CoreSafecheckPlanToPoint> rpList = coreSafecheckPlanToPointMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlanToPoint>()
+                        .eq(CoreSafecheckPlanToPoint::getPlanId, dto.getId()));
                 if (rpList != null) {
                     //删除父计划创建的检查要点
-                    coreSafecheckPlanToPointMapper.delete(new LambdaQueryWrapper<CoreSafecheckPlanToPoint>().eq(CoreSafecheckPlanToPoint::getPlanId, coreSafecheckPlan.getId()).eq(CoreSafecheckPlanToPoint::getOfOrgId, byId.getPlanOfOrgId()));
+                    coreSafecheckPlanToPointMapper.delete(new LambdaQueryWrapper<CoreSafecheckPlanToPoint>()
+                            .eq(CoreSafecheckPlanToPoint::getPlanId, coreSafecheckPlan.getId()));
                     for (CoreSafecheckPlanToPoint s :
                             rpList) {
                         //插入父计划的所有检查要点
                         coreSafecheckPlanToPointMapper.insert(new CoreSafecheckPlanToPoint(coreSafecheckPlan.getId(), s.getPointId(), s.isPointScan(), s.isRequired(), s.getOfOrgId()));
-
                     }
                 }
             }
@@ -275,32 +282,60 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
         coreSafecheckPlan.setId(dto.getId());
         coreSafecheckPlan.setDistribute("1");
         coreSafecheckPlan.setPlanStatus(1);
+        coreSafecheckPlan.setPublishTime(now);
+        coreSafecheckPlan.setEffectiveTime(effectiveTime);
+        baseMapper.updateById(coreSafecheckPlan);
 //        coreSafecheckPlan.setBuildTaskNow(coreSafecheckPlanMapper.selectById(dto.getId()).isBuildTaskNow());
         if (ObjectUtil.equal(oldPlan.getPlanStatus(), PlanStatus.DELETED.getCode())) {
             //停用时下发且立即生效,逻辑删除旧计划并生成新计划
-            copySelfPlan(oldPlan.getId(), parentId);
             baseMapper.deleteById(coreSafecheckPlan);
+            copySelfPlan(oldPlan.getId(), parentId);
         }
 
         if (immediateEffect) {
-            safetyCheckJobBusiness.rebuildCurrentCycleTask(hsPlans);
+            safetyCheckJobBusiness.createTaskByPlans(hsPlans);
         }
-        coreSafecheckPlanMapper.updateById(coreSafecheckPlan);
     }
 
+    /**
+     * 获取生效日期
+     *
+     * @param plan
+     * @param immediateEffect
+     * @return
+     */
+    private Date getEffectiveTime(CoreSafecheckPlan plan, Boolean immediateEffect) {
+        if (ObjectUtil.equal(plan.getPlanCycle(), SafetyPlanCycle.NONE.getCode())) {
+            return DateUtil.beginOfDay(plan.getEndDate());
+        }
+
+        Date effectiveTime = new Date();
+        if (!immediateEffect) {
+            effectiveTime = DateUtil.offset(
+                    DateUtil.beginOfDay(
+                            DateUtils.getStartAndEnd(new Date(), SafetyPlanCycle.toCommon(plan.getPlanCycle())).getEndTime()), DateField.DAY_OF_YEAR, 1);
+        }
+
+        return effectiveTime;
+    }
+
+    /**
+     * 单个任务下发
+     *
+     * @param id
+     * @param immediateEffect
+     * @return
+     */
     @Override
-    public int distributeHS(Long id, Boolean immediateEffect) {
+    public int distributeSingle(Long id, Boolean immediateEffect) {
         CoreSafecheckPlan plan = baseMapper.selectById(id);
-        plan.setPlanStatus(1);
-
         Integer planStatus = plan.getPlanStatus();
+        throwIfNoCycleOverdue(plan);
+        plan.setPlanStatus(1);
         //设置计划状态
         plan.setPlanStatus(1);
         Date now = new Date();
-        Date effectiveTime = new Date();
-        if (!immediateEffect) {
-            effectiveTime = DateUtil.offset(DateUtil.beginOfDay(DateUtils.getStartAndEnd(now, plan.getPlanCycle()).getEndTime()), DateField.DAY_OF_YEAR, 1);
-        }
+        Date effectiveTime = getEffectiveTime(plan, immediateEffect);
         plan.setPublishTime(now);
         plan.setEffectiveTime(effectiveTime);
         //如果是行社撤回需要修改下发状态
@@ -310,10 +345,9 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
         } else {
             plan.setDistribute("0");
         }
-
+        List<CoreSafecheckPlan> newlist = new ArrayList<>();
         //
         if (immediateEffect) {
-            List<Object> newlist = new ArrayList<>();
             if (ObjectUtil.equal(planStatus, PlanStatus.DRAFT.getCode())) {
                 //草稿状态下发,立即生效则生成任务
                 newlist.add(plan);
@@ -328,66 +362,65 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
                 CoreSafecheckPlan newPlan = baseMapper.selectById(newPlanId);
                 newlist.add(newPlan);
             }
-
-            safetyCheckJobBusiness.rebuildCurrentCycleTask(newlist);
         } else {
             baseMapper.updateById(plan);
         }
 
-        baseMapper.updateById(plan);
+        if (ObjectUtil.isNotEmpty(newlist)) {
+            safetyCheckJobBusiness.createTaskByPlans(newlist);
+        }
+
         return 1;
     }
 
+    /**
+     * 无周期,超过结束日期则报错
+     *
+     * @param plan
+     */
+    private void throwIfNoCycleOverdue(CoreSafecheckPlan plan) {
+        Date date = DateUtil.beginOfDay(new Date());
+        if (ObjectUtil.equal(plan.getPlanCycle(), SafetyPlanCycle.NONE.getCode()) && date.after(plan.getEndDate())) {
+            throw new ServiceException("已超过无周期任务的结束时间");
+        }
+    }
 
     @Override
     public void cheHui(Long id) {
+        Date now = new Date();
         CoreSafecheckPlan plan = baseMapper.selectById(id);
-        //修改所有子计划
-        List<CoreSafecheckPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlan>().eq(CoreSafecheckPlan::getParentId, id));
-        List<Long> planIds = appPlans.stream().map(CoreSafecheckPlan::getId).collect(Collectors.toList());
-        planIds.add(id);
-        //拿到父计划和所属子计划是否存在已完成
-        Long hasEdit = coreSafetyTaskMapper.selectCount(new LambdaQueryWrapper<CoreSafetyTask>().in(CoreSafetyTask::getPlanId, planIds).in(CoreSafetyTask::getStatus, 3, 4));
-
-        for (CoreSafecheckPlan ap :
-                appPlans) {
-//修改计划状态为停用
-            ap.setPlanStatus(2);
-            baseMapper.updateById(ap);
-
-            CycleCommonEnum code = CycleCommonEnum.getEnum(0);
-            DateRange dateRange = new DateRange(ap.getStartDate(), ap.getEndDate());
-            if (plan.getPlanCycle() != 6) {
-                code = CycleCommonEnum.getEnum(Math.toIntExact(plan.getPlanCycle()) + 2);
-                dateRange = DateUtils.getStartAndEnd(new Date(), code);
-            }
-            //如果不存在已完成撤回需要删除本周期所有任务
-
-            if (plan.getPlanCycle() == 6) {
-                coreSafetyTaskMapper.delete(new LambdaQueryWrapper<CoreSafetyTask>().eq(CoreSafetyTask::getPlanId, ap.getId()).between(CoreSafetyTask::getYmdDate, dateRange.getStartTime(), dateRange.getEndTime()));
-            } else {
-                if (hasEdit == 0) {
-                    coreSafetyTaskMapper.delete(new LambdaQueryWrapper<CoreSafetyTask>().eq(CoreSafetyTask::getPlanId, ap.getId()).in(CoreSafetyTask::getStatus, 1, 2).between(CoreSafetyTask::getYmdDate, dateRange.getStartTime(), dateRange.getEndTime()));
-                }
-            }
-        }
-        //设置下发状态为未下发
-        plan.setDistribute("0");
-        plan.setPlanStatus(2);
-        baseMapper.updateById(plan);
-
-        CycleCommonEnum code = CycleCommonEnum.getEnum(0);
-        DateRange dateRange = new DateRange(plan.getStartDate(), plan.getEndDate());
-        if (plan.getPlanCycle() != 6) {
-            code = CycleCommonEnum.getEnum(Math.toIntExact(plan.getPlanCycle()) + 2);
-            dateRange = DateUtils.getStartAndEnd(new Date(), code);
-        }
-        if (plan.getPlanCycle() == 6) {
-            coreSafetyTaskMapper.delete(new LambdaQueryWrapper<CoreSafetyTask>().eq(CoreSafetyTask::getPlanId, plan.getId()).between(CoreSafetyTask::getYmdDate, dateRange.getStartTime(), dateRange.getEndTime()));
+        if (ObjectUtil.equal(plan.getTaskHasCompleted(), 1)) {
+            //有已完成时,计划及子计划状态变为停用,不删除任务
+            LambdaUpdateWrapper<CoreSafecheckPlan> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(CoreSafecheckPlan::getPlanStatus, 2)
+                    .set(CoreSafecheckPlan::getWithdrawTime, now)
+                    .eq(CoreSafecheckPlan::getParentId, id);
+
+            baseMapper.update(null, updateWrapper);
+
+            updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(CoreSafecheckPlan::getPlanStatus, 2)
+                    .set(CoreSafecheckPlan::getDistribute, 0)
+                    .set(CoreSafecheckPlan::getWithdrawTime, now)
+                    .eq(CoreSafecheckPlan::getId, id);
+            baseMapper.update(null, updateWrapper);
         } else {
-            if (hasEdit == 0) {
-                coreSafetyTaskMapper.delete(new LambdaQueryWrapper<CoreSafetyTask>().eq(CoreSafetyTask::getPlanId, plan.getId()).in(CoreSafetyTask::getStatus, 1, 2).between(CoreSafetyTask::getYmdDate, dateRange.getStartTime(), dateRange.getEndTime()));
-            }
+            //无已完成时,删除子计划,计划本身变为草稿
+            LambdaUpdateWrapper<CoreSafecheckPlan> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(CoreSafecheckPlan::getPlanStatus, 0)
+                    .set(CoreSafecheckPlan::getDistribute, 0)
+                    .set(CoreSafecheckPlan::getWithdrawTime, now)
+                    .eq(CoreSafecheckPlan::getId, id);
+            baseMapper.update(null, updateWrapper);
+
+            List<CoreSafecheckPlan> childrenPlan = baseMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlan>()
+                    .eq(CoreSafecheckPlan::getParentId, id)
+                    .select(CoreSafecheckPlan::getSolidId, CoreSafecheckPlan::getId));
+            delete(childrenPlan.stream().map(CoreSafecheckPlan::getId).collect(Collectors.toList()));
+
+            List<Long> childrenPlanIds = childrenPlan.stream().map(CoreSafecheckPlan::getSolidId).collect(Collectors.toList());
+            childrenPlanIds.add(plan.getSolidId());
+            deleteAllTaskByPlanId(childrenPlanIds);
         }
     }
 
@@ -476,8 +509,12 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             throw new RuntimeException("未选择检查项!");
         }
 
+        Integer planStatus = null;
+
         if (coreSafecheckPlan.getId() == null) {
-            coreSafecheckPlan.setSolidId(IdWorker.getId(coreSafecheckPlan));
+            Long id = IdWorker.getId(coreSafecheckPlan);
+            coreSafecheckPlan.setId(id);
+            coreSafecheckPlan.setSolidId(id);
             coreSafecheckPlan.setParentSolidId(-1L);
             //先处理检查计划
             coreSafecheckPlan.setPlanOfOrgId(coreSafecheckPlan.getPlanCreateOrgId());
@@ -500,10 +537,14 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             coreSafecheckPlanMapper.insert(coreSafecheckPlan);
             returnId = coreSafecheckPlan.getId();
         } else {
+            CoreSafecheckPlan oldPlan = baseMapper.get(coreSafecheckPlan.getId());
+            planStatus = oldPlan.getPlanStatus();
             //先克隆旧的数据
-            if(needCopyOnEdit(coreSafecheckPlan)){
-                Long newPlanId=IdWorker.getId(coreSafecheckPlan);
-                copySelfPlan(coreSafecheckPlan.getId(),newPlanId);
+            if (needCopyOnEdit(oldPlan)) {
+                baseMapper.deleteById(coreSafecheckPlan.getId());
+
+                Long newPlanId = IdWorker.getId(coreSafecheckPlan);
+                copySelfPlan(coreSafecheckPlan.getId(), newPlanId);
                 coreSafecheckPlan.setId(newPlanId);
             }
 
@@ -550,7 +591,6 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             for (SafetyCheckRulePointVo s :
                     coreSafecheckPlan.getRulePointList()) {
                 coreSafecheckPlanToPointMapper.insert(new CoreSafecheckPlanToPoint(coreSafecheckPlan.getId(), s.getId(), s.isPointScan(), s.isRequired(), s.getOfOrgId()));
-
             }
         }
         //再处理受检机构类型
@@ -563,9 +603,9 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             }
         }
 
-        if (needRebuildOnEdit(coreSafecheckPlan)) {
+        if (needRebuildOnEdit(coreSafecheckPlan, planStatus)) {
             CoreSafecheckPlan plan = baseMapper.selectById(coreSafecheckPlan.getId());
-            safetyCheckJobBusiness.rebuildCurrentCycleTask(Arrays.asList(plan));
+            safetyCheckJobBusiness.createTaskByPlans(Arrays.asList(plan));
         }
         return returnId;
     }
@@ -573,7 +613,7 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     @Async
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
-    public void childrenPlan(Long oldPlanId,Long newPlanId) {
+    public void childrenPlan(Long oldPlanId, Long newPlanId) {
         //处理子计划
         //拿到所有子计划
         List<CoreSafecheckPlan> children = baseMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlan>()
@@ -583,21 +623,21 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
 //        Long hasEdit = coreSafetyTaskMapper.selectCount(new LambdaQueryWrapper<CoreSafetyTask>().in(CoreSafetyTask::getPlanId, planIds).in(CoreSafetyTask::getStatus, 3, 4));
 
         CoreSafecheckPlan coreSafecheckPlan = baseMapper.selectById(newPlanId);
-        List<Object> needRebuildPlans = new ArrayList<>();
+        List<CoreSafecheckPlan> needRebuildPlans = new ArrayList<>();
         for (CoreSafecheckPlan p :
                 children) {
             CoreSafecheckPlan child = p;
             if (needCopyOnEdit(coreSafecheckPlan)) {
                 //使用中状态且立即生效,复制副本
                 Long newChildPlanId = IdWorker.getId(p);
-                copyChildPlan(p.getId(),newChildPlanId,newPlanId);
+                copyChildPlan(p.getId(), newChildPlanId, newPlanId);
 
                 baseMapper.updateById(p);
                 baseMapper.deleteById(p.getId());
 
                 child = baseMapper.selectById(newChildPlanId);
             }
-            if (needRebuildOnEdit(p)) {
+            if (needRebuildOnEdit(p, p.getPlanStatus())) {
                 needRebuildPlans.add(child);
             }
             p.setUpdateTime(DateUtils.getNowDate());
@@ -677,8 +717,8 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
 //            }
         }
 
-        if(CollectionUtil.isNotEmpty(needRebuildPlans)){
-            safetyCheckJobBusiness.rebuildCurrentCycleTask(needRebuildPlans);
+        if (CollectionUtil.isNotEmpty(needRebuildPlans)) {
+            safetyCheckJobBusiness.createTaskByPlans(needRebuildPlans);
         }
     }
 
@@ -743,8 +783,8 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
      * @param plan
      * @return
      */
-    private Boolean needRebuildOnEdit(CoreSafecheckPlan plan) {
-        if (ObjectUtil.equal(plan.getPlanStatus(), PlanStatus.USING.getCode())
+    private Boolean needRebuildOnEdit(CoreSafecheckPlan plan, Integer planStatus) {
+        if (ObjectUtil.equal(planStatus, PlanStatus.USING.getCode())
                 && (ObjectUtil.equal(plan.getPlanOfOrgType(), OrgTypeEnum.HANG_SHE.getCode()) || ObjectUtil.equal(plan.getExecOrgType(), OrgTypeEnum.BAN_SHI_CHU.getCode()) || ObjectUtil.equal(plan.getExecOrgType(), OrgTypeEnum.SHEGN_LIAN_SHE.getCode()))
                 && (ObjectUtil.isNull(plan.getTaskHasCompleted()) || ObjectUtil.equal(plan.getPlanStatus(), 0))
                 && !new Date().before(plan.getEffectiveTime())) {
@@ -997,4 +1037,33 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
                 return StringUtil.EMPTY_STRING;
         }
     }
+
+    /**
+     * 更新计划及父计划的任务是否有已完成标志。
+     *
+     * @param planId
+     * @param state
+     */
+    @Override
+    @Async
+    @Transactional
+    public void updatePlanCompletedState(Long planId, Integer state) {
+        if (ObjectUtil.notEqual(state, 1) && ObjectUtil.notEqual(state, 0) && ObjectUtil.isNotNull(state)) {
+            throw new ServiceException("state参数值无效");
+        }
+
+        CoreSafecheckPlan plan = baseMapper.selectById(planId);
+        if (ObjectUtil.isNull(plan)) {
+            throw new ServiceException("计划不存在");
+        }
+
+        LambdaUpdateWrapper<CoreSafecheckPlan> wrapper = new LambdaUpdateWrapper();
+        wrapper.eq(CoreSafecheckPlan::getId, planId)
+                .set(CoreSafecheckPlan::getTaskHasCompleted, state);
+
+        baseMapper.update(null, wrapper);
+        if (ObjectUtil.isNotNull(plan.getParentId()) && plan.getParentId() > 0) {
+            baseMapper.updateParentPlanCompletedState(plan.getParentId());
+        }
+    }
 }

+ 4 - 6
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/SafetyCheckRegisterSericeImpl.java

@@ -29,12 +29,9 @@ import com.xunmei.core.safetyCheck.dto.register.AppPageDto;
 import com.xunmei.core.safetyCheck.dto.register.GrantDto;
 import com.xunmei.core.safetyCheck.enums.SafetyTaskSourceType;
 import com.xunmei.core.safetyCheck.mapper.*;
-import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskDataNfcService;
-import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskDataRemarkimgService;
-import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskDataService;
+import com.xunmei.core.safetyCheck.service.*;
 import com.xunmei.core.safetyCheck.vo.regsiter.AppTaskRegisterPointVo;
 import com.xunmei.core.safetyCheck.enums.SafetyCheckTaskStatus;
-import com.xunmei.core.safetyCheck.service.SafetyCheckRegisterSerice;
 import com.xunmei.core.safetyCheck.vo.regsiter.*;
 import com.xunmei.system.api.Eto.RoleConditionEto;
 import com.xunmei.system.api.RemoteOrgService;
@@ -86,7 +83,7 @@ public class SafetyCheckRegisterSericeImpl extends ServiceImpl<CoreSafetyTaskMap
     @Resource
     RemoteUserService remoteUserService;
     @Resource
-    CoreSafecheckPlanServiceImpl coreSafecheckPlanService;
+    ICoreSafecheckPlanService coreSafecheckPlanService;
 
     @Override
     public TableDataInfo appList(AppPageDto dto) {
@@ -236,7 +233,7 @@ public class SafetyCheckRegisterSericeImpl extends ServiceImpl<CoreSafetyTaskMap
 
         CoreSafecheckPlan plan = null;
         if (ObjectUtil.isNotNull(task.getPlanId())) {
-            plan = coreSafecheckPlanMapper.selectById(task.getPlanId());
+            plan = coreSafecheckPlanMapper.get(task.getPlanId());
         } else {
           throw  new RuntimeException("计划id不存在");
         }
@@ -487,6 +484,7 @@ public class SafetyCheckRegisterSericeImpl extends ServiceImpl<CoreSafetyTaskMap
         }
         if (data.getIsSubmit() > 0) {
             coreSafecheckPlanService.buildPdf(data.getId());
+            coreSafecheckPlanService.updatePlanCompletedState(data.getPlanId(),1);
         }
         return true;
     }

+ 1 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysRoleController.java

@@ -142,7 +142,7 @@ public class SysRoleController extends BaseController {
         return success(roleService.selectRoleAll());
     }
 
-    @RequiresPermissions("system:role:query")
+//    @RequiresPermissions("system:role:query")
     @GetMapping("/allRole")
     public AjaxResult allRole() {
         return success(roleService.allRole());