Jelajahi Sumber

演练/培训计划:下发,撤回,删除逻辑变更

jingyuanchao 1 tahun lalu
induk
melakukan
e911e38cf7
16 mengubah file dengan 139 tambahan dan 94 penghapusan
  1. 2 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/drill/vo/CoreDrillPlanDetailVo.java
  2. 2 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/edu/vo/CoreEduTrainingPlanDetailVo.java
  3. 3 3
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/controller/CoreDrillPlanController.java
  4. 2 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/mapper/CoreDrillPlanMapper.java
  5. 2 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/mapper/CoreDrillTaskMapper.java
  6. 1 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/ICoreDrillPlanService.java
  7. 45 26
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillPlanServiceImpl.java
  8. 3 3
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/controller/CoreEduTrainingPlanController.java
  9. 2 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/mapper/CoreEduTrainingPlanMapper.java
  10. 5 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/mapper/CoreEduTrainingTaskMapper.java
  11. 1 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/ICoreEduTrainingPlanService.java
  12. 40 59
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingPlanServiceImpl.java
  13. 7 0
      soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillPlanMapper.xml
  14. 7 1
      soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml
  15. 8 0
      soc-modules/soc-modules-core/src/main/resources/mapper/edu/CoreEduTrainingPlanMapper.xml
  16. 9 0
      soc-modules/soc-modules-core/src/main/resources/mapper/edu/CoreEduTrainingTaskMapper.xml

+ 2 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/drill/vo/CoreDrillPlanDetailVo.java

@@ -69,4 +69,6 @@ public class CoreDrillPlanDetailVo {
 
     @ApiModelProperty(value = "登记簿url")
     private String pdfUrl;
+
+    private Integer done;
 }

+ 2 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/edu/vo/CoreEduTrainingPlanDetailVo.java

@@ -65,4 +65,6 @@ public class CoreEduTrainingPlanDetailVo {
 
     @ApiModelProperty(value = "登记簿url")
     private String pdfUrl;
+
+    private Integer done;
 }

+ 3 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/controller/CoreDrillPlanController.java

@@ -102,9 +102,9 @@ public class CoreDrillPlanController extends BaseController {
 
     @ApiOperation(value = "计划下发")
     @RequiresPermissions("core:drillPlan:publish")
-    @GetMapping("/publish/{planId}")
-    public AjaxResult publishPlan(@PathVariable("planId") Long planId) {
-        coreDrillPlanService.publishPlan(planId);
+    @GetMapping("/publish/{planId}/{status}")
+    public AjaxResult publishPlan(@PathVariable("planId") Long planId, @PathVariable("status")  Integer status) {
+        coreDrillPlanService.publishPlan(planId,status);
         return AjaxResult.success();
     }
 

+ 2 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/mapper/CoreDrillPlanMapper.java

@@ -86,4 +86,6 @@ public interface CoreDrillPlanMapper extends BaseMapper<CoreDrillPlan> {
     void updatePlanStatusByIdList(@Param("list") List<Long> list, @Param("status") int status);
 
     void updatePlanName(@Param("planId") Long planId, @Param("planName") String planName);
+
+    void delByIds(@Param("list")List<Long> list);
 }

+ 2 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/mapper/CoreDrillTaskMapper.java

@@ -56,4 +56,6 @@ public interface CoreDrillTaskMapper extends BaseMapper<CoreDrillTask> {
     void updateTaskNameByParentPlanId(@Param("planId") Long planId, @Param("planName") String planName, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
 
     List<CoreDrillTaskExportVo> selectDrillTaskExportList(@Param("request") CoreDrillTaskPageDto request);
+
+    Integer checkHasTaskIsDoneByPlanIdOrParentId(@Param("planId") Long planId);
 }

+ 1 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/ICoreDrillPlanService.java

@@ -81,7 +81,7 @@ public interface ICoreDrillPlanService extends IService<CoreDrillPlan> {
 
     List<CoreDrillPlanRoleVo> listPlanRole(Long orgId);
 
-    void publishPlan(Long planId);
+    void publishPlan(Long planId, Integer status);
 
     List<IdName<String, String>> planList(Long orgId);
 

+ 45 - 26
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillPlanServiceImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
 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.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -25,10 +26,13 @@ import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanDataVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanDetailVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanPageVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanRoleVo;
+import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingPlan;
+import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingTask;
 import com.xunmei.common.core.enums.OrgTypeEnum;
 import com.xunmei.common.core.enums.drill.DrillDoStatus;
 import com.xunmei.common.core.enums.drill.DrillPlanCycleEnum;
 import com.xunmei.common.core.enums.drill.DrillPlanStatus;
+import com.xunmei.common.core.enums.edu.EduTrainingDoStatus;
 import com.xunmei.common.core.enums.edu.EduTrainingPlanCycleEnum;
 import com.xunmei.common.core.enums.edu.EduTrainingPlanStatus;
 import com.xunmei.common.core.exception.SystemException;
@@ -50,6 +54,7 @@ import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import com.xunmei.system.api.vo.SysOrgVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -160,6 +165,9 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         /*final List<CoreDrillPlanToRole> planToRoles = coreDrillPlanToRoleMapper.selectByMap(MapUtil.of("plan_id", id));
         final List<Long> execRoleIdList = planToRoles.stream().map(CoreDrillPlanToRole::getRoleId).collect(Collectors.toList());
         vo.setPlanRoleId(ObjectUtil.isEmpty(execRoleIdList) ? null : execRoleIdList);*/
+
+        Integer done = coreDrillTaskMapper.checkHasTaskIsDoneByPlanIdOrParentId(plan.getId());
+        vo.setDone(done);
         return vo;
     }
 
@@ -545,19 +553,21 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteCoreDrillPlanByIds(Long id) {
-        CoreDrillPlan plan = getById(id);
-        if (EduTrainingPlanStatus.DRAFT.getCode() == plan.getPlanStatus()) {
-            removeById(id);
-            coreDrillTaskService.delByStartTimeAndEndTimeAndPlanIdList(Arrays.asList(id), null, null);
-        }
-        final Integer done = coreDrillTaskMapper.checkHasTaskIsDoneByPlanParentId(id);
-        if (done != null && done > 0) {
-            throw new RuntimeException("计划有已完成或者已逾期的任务,不能被删除");
-        }
         List<Long> list = baseMapper.selectIdByParentId(id);
+        Integer isExecute = coreDrillTaskMapper.selectCount(new LambdaQueryWrapper<CoreDrillTask>()
+                        .in(CoreDrillTask::getPlanId, list)
+                        .eq(CoreDrillTask::getStatus, DrillDoStatus.DONE.getCode()))
+                .intValue();
         list.add(id);
-        coreDrillTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
-        removeByIds(list);
+        if (ObjectUtil.notEqual(isExecute, 1)) {
+            // 计划下没有已完成:删除所有任务,计划数据做物理删除。
+            coreDrillTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
+            coreDrillPlanMapper.delByIds(list);
+        } else {
+            //计划下有已完成:删除本轮次及以后的所有任务,计划本身做逻辑删除。
+            coreDrillTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, new Date(), null);
+            removeByIds(list);
+        }
     }
 
     /**
@@ -583,7 +593,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void publishPlan(Long planId) {
+    public void publishPlan(Long planId, Integer status) {
         final CoreDrillPlan plan = coreDrillPlanMapper.selectById(planId);
         if (plan == null) {
             throw new SystemException("计划不存在!");
@@ -594,11 +604,9 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         List<CoreDrillPlan> planList = lambdaQuery()
                 .eq(CoreDrillPlan::getParentId, planId)
                 .select(CoreDrillPlan::getId).list();
-        boolean isPublishAgain = false;
         if (planList.isEmpty()) {
             planList = buildPlanData(plan, new ArrayList<>(), true);
         } else {
-            isPublishAgain = true;
             planList.forEach(plan1 -> plan1.setPlanStatus(EduTrainingPlanStatus.USING.getCode()));
             List<Long> collect = planList.stream().map(CoreDrillPlan::getId).collect(Collectors.toList());
             coreDrillPlanMapper.updatePlanStatusByIdList(collect, EduTrainingPlanStatus.USING.getCode());
@@ -607,8 +615,10 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         plan.setPlanStatus(DrillPlanStatus.USING.getCode());
         plan.setIssue(1);
         this.updateById(plan);
-        if (isPublishAgain) {
-            //说明是计划是二次下发,下个周期生效,此处临时set为0,不保存入库,
+        if (ObjectUtil.equal(status, 1)) {
+            //status=1:立即生效  status=0:下周期生效
+            plan.setBuildTaskNow(1);
+        } else {
             plan.setBuildTaskNow(0);
         }
         //事务提交后执行
@@ -644,22 +654,31 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int revocationPlan(Long planId) {
-        CoreDrillPlan plan = getById(planId);
-        plan.setIssue(0);
-        plan.setPlanStatus(EduTrainingPlanStatus.DELETED.getCode());
         List<Long> list = coreDrillPlanMapper.selectIdByParentId(planId);
-
-        //无周期计划撤回,不管任务状态,删除所有任务,撤回后计划停用
-        //有周期计划撤回,如果没有任务已完成,删除所有任务,撤回后计划停用
         Integer isExecute = coreDrillTaskMapper.selectCount(new LambdaQueryWrapper<CoreDrillTask>()
                         .in(CoreDrillTask::getPlanId, list)
                         .eq(CoreDrillTask::getStatus, DrillDoStatus.DONE.getCode()))
                 .intValue();
-        if (ObjectUtil.equal(isExecute, 0) || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())) {
+        //计划下没有已完成:删除所有任务数据和子计划,计划状态回到草稿状态。
+        if (ObjectUtil.notEqual(isExecute, 1)/* || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())*/) {
+            // 删除所有任务数据
             coreDrillTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
+            //删除所有子计划
+            coreDrillPlanMapper.delByIds(list);
+            //计划状态回到草稿状态
+            update(new LambdaUpdateWrapper<CoreDrillPlan>()
+                    .eq(CoreDrillPlan::getId, planId)
+                    .set(CoreDrillPlan::getIssue, 0)
+                    .set(CoreDrillPlan::getPlanStatus, DrillPlanStatus.DRAFT.getCode()));
+            return 1;
+        } else {
+            //计划下有已完成:不删任务,计划状态回到停用。
+            coreDrillPlanMapper.updatePlanStatusByIdOrParentId(planId, EduTrainingPlanStatus.DELETED.getCode());
+            CoreDrillPlan plan = getById(planId);
+            plan.setIssue(0);
+            return coreDrillPlanMapper.updateById(plan);
         }
-        coreDrillPlanMapper.updatePlanStatusByIdOrParentId(planId, EduTrainingPlanStatus.DELETED.getCode());
-        return coreDrillPlanMapper.updateById(plan);
+
     }
 
     @Override
@@ -715,7 +734,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         final SysOrgVO planCreateOrg = all.stream().filter(org -> org.getId().equals(plan.getCreateOrgId())).findFirst().get();
         final long count = all.stream()
                 .filter(org -> ObjectUtil.isNotEmpty(org.getPath()))
-                .filter(org -> ObjectUtil.notEqual(org.getId(),plan.getCreateOrgId()))
+                .filter(org -> ObjectUtil.notEqual(org.getId(), plan.getCreateOrgId()))
                 .filter(org -> org.getPath().startsWith(planCreateOrg.getPath()))
                 .filter(org -> OrgTypeEnum.HANG_SHE.getCode().equals(org.getType()))
                 .count();

+ 3 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/controller/CoreEduTrainingPlanController.java

@@ -99,9 +99,9 @@ public class CoreEduTrainingPlanController extends BaseController {
 
     @ApiOperation(value = "计划下发")
     @RequiresPermissions("core:plan:edit")
-    @GetMapping("/publish/{planId}")
-    public AjaxResult publishPlan(@PathVariable("planId") Long planId) {
-        coreEduTrainingPlanService.publishPlan(planId);
+    @GetMapping("/publish/{planId}/{status}")
+    public AjaxResult publishPlan(@PathVariable("planId") Long planId, @PathVariable("status")  Integer status) {
+        coreEduTrainingPlanService.publishPlan(planId,status);
         return AjaxResult.success();
     }
 

+ 2 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/mapper/CoreEduTrainingPlanMapper.java

@@ -87,4 +87,6 @@ public interface CoreEduTrainingPlanMapper extends BaseMapper<CoreEduTrainingPla
     void updatePlanStatusByIdList(@Param("list") List<Long> list, @Param("status") int status);
 
     void updatePlanName(@Param("planId") Long planId, @Param("planName") String planName);
+
+    Integer delByIds(@Param("list") List<Long> list);
 }

+ 5 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/mapper/CoreEduTrainingTaskMapper.java

@@ -50,4 +50,9 @@ public interface CoreEduTrainingTaskMapper extends BaseMapper<CoreEduTrainingTas
     List<CoreEduTrainingTaskExportVo> selectCoreEduTrainingTaskPage(@Param("request") CoreEduTrainingTaskPageDto request);
 
     Integer checkHasTaskByStatusAndPlanId(@Param("planIdList") List<Long> planIdList, @Param("taskStatusList") List<Integer> taskStatusList);
+
+    Integer checkHasTaskIsDoneByPlanIdOrParentId(@Param("planId") Long planId);
+
+
+
 }

+ 1 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/ICoreEduTrainingPlanService.java

@@ -80,7 +80,7 @@ public interface ICoreEduTrainingPlanService extends IService<CoreEduTrainingPla
 
     List<CoreEduTrainingPlanRoleVo> listPlanRole(Long orgId);
 
-    void publishPlan(Long planId);
+    void publishPlan(Long planId,Integer status);
 
 
 

+ 40 - 59
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingPlanServiceImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
 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.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -157,6 +158,8 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         final List<CoreEduTrainingPlanToRole> planToRoles = coreEduTrainingPlanToRoleMapper.selectByMap(MapUtil.of("plan_id", id));
         final List<Long> execRoleIdList = planToRoles.stream().map(CoreEduTrainingPlanToRole::getRoleId).collect(Collectors.toList());
         vo.setPlanRoleId(ObjectUtil.isEmpty(execRoleIdList) ? null : execRoleIdList);
+        Integer done = coreEduTrainingTaskMapper.checkHasTaskIsDoneByPlanIdOrParentId(id);
+        vo.setDone(done);
         return vo;
     }
 
@@ -537,51 +540,21 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteCoreEduTrainingPlanByIds(Long id) {
-        CoreEduTrainingPlan plan = getById(id);
-        if (EduTrainingPlanStatus.DRAFT.getCode() == plan.getPlanStatus()) {
-            removeById(id);
-            coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(Arrays.asList(id), null, null);
-        }
-        final Integer done = coreEduTrainingTaskMapper.checkHasTaskIsDoneByPlanParentId(id);
-        if (done != null && done > 0) {
-            throw new RuntimeException("计划有已完成或者已逾期的任务,不能被删除");
-        }
         List<Long> list = baseMapper.selectIdByParentId(id);
+        Integer isExecute = coreEduTrainingTaskMapper.selectCount(new LambdaQueryWrapper<CoreEduTrainingTask>()
+                        .in(CoreEduTrainingTask::getPlanId, list)
+                        .eq(CoreEduTrainingTask::getStatus, EduTrainingDoStatus.DONE.getCode()))
+                .intValue();
         list.add(id);
-        coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
-        removeByIds(list);
-
-       /* Integer count = coreEduTrainingTaskMapper.checkHasTaskIsDone(Collections.singletonList(id));
-        if (count != null && count > 0) {
-            throw new RuntimeException("已有任务完成,无法删除");
-        }
-
-
-        if (plan.getStandard() == 0) {
-            //自建计划
-            final List<CoreEduTrainingTask> coreEduTrainingTasks = coreEduTrainingTaskMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingTask>()
-                    .eq(CoreEduTrainingTask::getPlanId, id)
-                    .select(CoreEduTrainingTask::getId));
-            final List<Long> taskIdList = coreEduTrainingTasks.stream().map(CoreEduTrainingTask::getId).collect(Collectors.toList());
-            //删除任务相关
-            coreEduTrainingTaskService.delTaskByIdList(taskIdList);
-            //删除计划
-            return coreEduTrainingPlanMapper.deleteBatchIds(Collections.singletonList((id)));
+        if (ObjectUtil.notEqual(isExecute, 1)) {
+            // 计划下没有已完成:删除所有任务,计划数据做物理删除。
+            coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
+            coreEduTrainingPlanMapper.delByIds(list);
         } else {
-            //标准计划
-            List<Long> planIdList = coreEduTrainingPlanMapper.selectIdByParentId(id);
-            if (ObjectUtil.isNotEmpty(planIdList)) {
-                //删除任务相关
-                final List<CoreEduTrainingTask> trainingTaskList = coreEduTrainingTaskMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingTask>()
-                        .in(CoreEduTrainingTask::getPlanId, planIdList)
-                        .select(CoreEduTrainingTask::getId));
-                final List<Long> taskIdList = trainingTaskList.stream().map(CoreEduTrainingTask::getId).collect(Collectors.toList());
-                coreEduTrainingTaskService.delTaskByIdList(taskIdList);
-            }
-            //删除计划
-            planIdList.add(id);
-            return coreEduTrainingPlanMapper.deleteBatchIds(planIdList);
-        }*/
+            //计划下有已完成:删除本轮次及以后的所有任务,计划本身做逻辑删除。
+            coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, new Date(), null);
+            removeByIds(list);
+        }
     }
 
     /**
@@ -627,18 +600,16 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 
     @Override
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
-    public void publishPlan(Long planId) {
+    public void publishPlan(Long planId, Integer status) {
         final CoreEduTrainingPlan plan = coreEduTrainingPlanMapper.selectById(planId);
         AssertUtil.isNotEmpty(plan, "计划不存在!");
         AssertUtil.equal(plan.getIssue(), 0, "计划已完成下发!");
         List<CoreEduTrainingPlan> planList = lambdaQuery()
                 .eq(CoreEduTrainingPlan::getParentId, planId)
                 .select(CoreEduTrainingPlan::getId).list();
-        boolean isPublishAgain = false;
         if (planList.isEmpty()) {
             planList = buildPlanData(plan, new ArrayList<>(), true);
         } else {
-            isPublishAgain = true;
             planList.forEach(plan1 -> plan1.setPlanStatus(EduTrainingPlanStatus.USING.getCode()));
             List<Long> collect = planList.stream().map(CoreEduTrainingPlan::getId).collect(Collectors.toList());
             coreEduTrainingPlanMapper.updatePlanStatusByIdList(collect, EduTrainingPlanStatus.USING.getCode());
@@ -647,8 +618,10 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         plan.setPlanStatus(EduTrainingPlanStatus.USING.getCode());
         plan.setIssue(1);
         this.updateById(plan);
-        if (isPublishAgain) {
-            //说明是计划是二次下发,下个周期生效,此处临时set为0,不保存入库,
+        if (ObjectUtil.equal(status, 1)) {
+            //status=1:立即生效  status=0:下周期生效
+            plan.setBuildTaskNow(1);
+        } else {
             plan.setBuildTaskNow(0);
         }
         //事务提交后执行
@@ -697,7 +670,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         final SysOrgVO planCreateOrg = all.stream().filter(org -> org.getId().equals(plan.getCreateOrgId())).findFirst().get();
         final long count = all.stream()
                 .filter(org -> ObjectUtil.isNotEmpty(org.getPath()))
-                .filter(org -> ObjectUtil.notEqual(org.getId(),plan.getCreateOrgId()))
+                .filter(org -> ObjectUtil.notEqual(org.getId(), plan.getCreateOrgId()))
                 .filter(org -> org.getPath().startsWith(planCreateOrg.getPath()))
                 .filter(org -> OrgTypeEnum.HANG_SHE.getCode().equals(org.getType()))
                 .count();
@@ -770,23 +743,31 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer revocationPlan(Long planId) {
-        CoreEduTrainingPlan plan = getById(planId);
-        plan.setIssue(0);
-        plan.setPlanStatus(EduTrainingPlanStatus.DELETED.getCode());
-        List<Long> list = coreEduTrainingPlanMapper.selectIdByParentId(planId);
 
-        //无周期计划撤回,不管任务状态,删除所有任务,撤回后计划停用
-        //有周期计划撤回,如果没有任务已完成,删除所有任务,撤回后计划停用
+        List<Long> list = coreEduTrainingPlanMapper.selectIdByParentId(planId);
         Integer isExecute = coreEduTrainingTaskMapper.selectCount(new LambdaQueryWrapper<CoreEduTrainingTask>()
                         .in(CoreEduTrainingTask::getPlanId, list)
                         .eq(CoreEduTrainingTask::getStatus, EduTrainingDoStatus.DONE.getCode()))
                 .intValue();
-        if (ObjectUtil.equal(isExecute, 0) || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())) {
-            coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
+        //计划下没有已完成:删除所有任务数据和子计划,计划状态回到草稿状态。
+        if (ObjectUtil.notEqual(isExecute, 1)/* || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())*/) {
+            // 删除所有任务数据
+            coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list,null,null);
+            //删除所有子计划
+            coreEduTrainingPlanMapper.delByIds(list);
+            //计划状态回到草稿状态
+            update(new LambdaUpdateWrapper<CoreEduTrainingPlan>()
+                    .eq(CoreEduTrainingPlan::getId,planId)
+                    .set(CoreEduTrainingPlan::getIssue,0)
+                    .set(CoreEduTrainingPlan::getPlanStatus,EduTrainingPlanStatus.DRAFT.getCode()));
+          return 1;
+        } else {
+            //计划下有已完成:不删任务,计划状态回到停用。
+            coreEduTrainingPlanMapper.updatePlanStatusByIdOrParentId(planId, EduTrainingPlanStatus.DELETED.getCode());
+            CoreEduTrainingPlan plan = getById(planId);
+            plan.setIssue(0);
+            return coreEduTrainingPlanMapper.updateById(plan);
         }
-
-        coreEduTrainingPlanMapper.updatePlanStatusByIdOrParentId(planId, EduTrainingPlanStatus.DELETED.getCode());
-        return coreEduTrainingPlanMapper.updateById(plan);
     }
 
     @Override

+ 7 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillPlanMapper.xml

@@ -673,4 +673,11 @@
         where id = #{planId}
            or parent_id = #{planId}
     </update>
+
+    <delete id="delByIds">
+        delete from core_drill_plan where id in
+        <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </delete>
 </mapper>

+ 7 - 1
soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml

@@ -369,6 +369,12 @@
         </where>
         order by t.update_time desc
     </select>
-
+    <select id="checkHasTaskIsDoneByPlanIdOrParentId" resultType="java.lang.Integer">
+        select 1
+        from core_drill_task t
+        where t.status = 2
+          and (t.plan_id = #{planId} or plan_id in (select id from core_drill_plan where parent_id = #{planId}))
+        limit 1
+    </select>
 
 </mapper>

+ 8 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/edu/CoreEduTrainingPlanMapper.xml

@@ -615,4 +615,12 @@
         where id = #{planId}
            or parent_id = #{planId}
     </update>
+
+
+    <delete id="delByIds">
+        delete from core_edu_training_plan where id in
+        <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </delete>
 </mapper>

+ 9 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/edu/CoreEduTrainingTaskMapper.xml

@@ -273,4 +273,13 @@
         </foreach>
         limit 1
     </select>
+
+    <select id="checkHasTaskIsDoneByPlanIdOrParentId" resultType="java.lang.Integer">
+        select 1
+        from core_edu_training_task t
+        where t.status = 2
+          and (t.plan_id = #{planId} or plan_id in (select id from core_edu_training_plan where parent_id = #{planId}))
+        limit 1
+    </select>
+
 </mapper>