|  | @@ -22,6 +22,7 @@ import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingPlanDataVo;
 | 
	
		
			
				|  |  |  import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingPlanDetailVo;
 | 
	
		
			
				|  |  |  import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingPlanPageVo;
 | 
	
		
			
				|  |  |  import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingPlanRoleVo;
 | 
	
		
			
				|  |  | +import com.xunmei.common.core.enums.EduTrainingPlanCycleEnum;
 | 
	
		
			
				|  |  |  import com.xunmei.common.core.enums.OrgTypeEnum;
 | 
	
		
			
				|  |  |  import com.xunmei.common.core.enums.edu.EduTrainingPlanStatus;
 | 
	
		
			
				|  |  |  import com.xunmei.common.core.utils.AssertUtil;
 | 
	
	
		
			
				|  | @@ -242,149 +243,95 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |      public int updateCoreEduTrainingPlan(CoreEduTrainingPlanEditDto request) {
 | 
	
		
			
				|  |  |          final CoreEduTrainingPlan plan = getById(request.getId());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (plan.getPlanStatus()==EduTrainingPlanStatus.DRAFT.getCode()) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("当前计划已被删除,无法修改!");
 | 
	
		
			
				|  |  | +        if (plan.getPlanStatus() == EduTrainingPlanStatus.DRAFT.getCode()) {
 | 
	
		
			
				|  |  | +            //草稿状态 可以修改计划
 | 
	
		
			
				|  |  | +            doUpdatePlan(plan, request);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //此处判断能否修改,如果可以 需要删除任务,且还需要判断是否需要生成任务
 | 
	
		
			
				|  |  | -        Boolean can = checkCanUpdate(request, plan);
 | 
	
		
			
				|  |  | -        if (!can) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("当前任务已生成且存在已执行情况,无法修改培训机构类型,具体培训机构,培训角色,培训周期,状态等信息!");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        //可以修改计划
 | 
	
		
			
				|  |  | -        BeanUtils.copyProperties(request, plan);
 | 
	
		
			
				|  |  | -        plan.setUpdateTime(DateUtils.getNowDate());
 | 
	
		
			
				|  |  | -        plan.setFileList(ObjectUtil.isNotEmpty(request.getFileList()) ? JSON.toJSONString(request.getFileList()) : null);
 | 
	
		
			
				|  |  | -        plan.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getId().toString());
 | 
	
		
			
				|  |  | -        coreEduTrainingPlanToRoleMapper.deleteByMap(MapUtil.of("plan_id", plan.getId()));
 | 
	
		
			
				|  |  | -        //List<CoreEduTrainingPlanToRole> trainingPlanToRoleList = batchSavePlanToRole(request.getPlanRoleId(), plan.getId());
 | 
	
		
			
				|  |  | -        coreEduTrainingPlanToExecOrgMapper.deleteByMap(MapUtil.of("plan_id", plan.getId()));
 | 
	
		
			
				|  |  | -        batchSavePlanToExecOrg(request.getPlanExecOrgIdList(), plan.getId());
 | 
	
		
			
				|  |  | -        final int i = coreEduTrainingPlanMapper.updateById(plan);
 | 
	
		
			
				|  |  |          if (plan.getStandard() == 1) {
 | 
	
		
			
				|  |  | -            //如果标准计划可以修改,那么需要删除所有计划与任务,重新创建计划任务
 | 
	
		
			
				|  |  | -            updateStandardPlan(plan, null);//移除角色属性
 | 
	
		
			
				|  |  | +            //标准计划
 | 
	
		
			
				|  |  | +            updateStandardPlan(plan, request);
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  | -            //普通计划
 | 
	
		
			
				|  |  | -            updateCommonPlan(plan);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return i;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private void updateStandardPlan(CoreEduTrainingPlan plan, List<CoreEduTrainingPlanToRole> trainingPlanToRoleList) {
 | 
	
		
			
				|  |  | -        //没下发的就不管
 | 
	
		
			
				|  |  | -        if (0 == plan.getIssue()) {
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        Long planId = plan.getId();
 | 
	
		
			
				|  |  | -        deletePlanAndTaskByParentPlanId(planId);
 | 
	
		
			
				|  |  | -        List<CoreEduTrainingPlan> planList = buildPlanData(plan, trainingPlanToRoleList, false);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (plan.getPlanStatus() == EduTrainingPlanStatus.DELETED.getCode()) {
 | 
	
		
			
				|  |  | -            log.info("计划已被修改为" + EduTrainingPlanStatus.DELETED.getDesc() + ",不再生成任务!");
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | +            //标准计划
 | 
	
		
			
				|  |  | +            updateCommonPlan(plan, request);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        for (CoreEduTrainingPlan trainingPlan : planList) {
 | 
	
		
			
				|  |  | -            CoreEduTrainingPlanDataVo dataVo = getCoreEduTrainingPlanDataVo(trainingPlan.getId());
 | 
	
		
			
				|  |  | -            CompletableFuture.runAsync(() -> {
 | 
	
		
			
				|  |  | -                //说明有任务并且都没执行过,需要重新生成任务
 | 
	
		
			
				|  |  | -                coreEduTrainingTaskService.createTaskForNow(dataVo, plan.getStartDate(), plan.getEndDate());
 | 
	
		
			
				|  |  | -            }, threadPoolTaskExecutor);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        return 1;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void deletePlanAndTaskByParentPlanId(Long planId) {
 | 
	
		
			
				|  |  | -        //删除原有数据, 然后重新生成计划,任务
 | 
	
		
			
				|  |  | -        List<Long> planIdList = coreEduTrainingPlanMapper.selectAllIdByParentId(planId);
 | 
	
		
			
				|  |  | -        if (ObjectUtil.isEmpty(planIdList)) {
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | +    private void updateCommonPlan(CoreEduTrainingPlan plan, CoreEduTrainingPlanEditDto request) {
 | 
	
		
			
				|  |  | +        //使用中的普通计划
 | 
	
		
			
				|  |  | +        if (plan.getExecTimes() > request.getExecTimes()) {
 | 
	
		
			
				|  |  | +            throw new RuntimeException("执行次数不能小于基准计划执行次数!");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (ObjectUtil.isNotEmpty(planIdList)) {
 | 
	
		
			
				|  |  | -            coreEduTrainingPlanMapper.deleteBatchIds(planIdList);
 | 
	
		
			
				|  |  | -            coreEduTrainingPlanToExecOrgMapper.delete(new LambdaQueryWrapper<CoreEduTrainingPlanToExecOrg>().in(CoreEduTrainingPlanToExecOrg::getPlanId, planIdList));
 | 
	
		
			
				|  |  | -            coreEduTrainingPlanToRoleMapper.delete(new LambdaQueryWrapper<CoreEduTrainingPlanToRole>().in(CoreEduTrainingPlanToRole::getPlanId, planIdList));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        List<CoreEduTrainingTask> taskIdList = coreEduTrainingTaskMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingTask>().in(CoreEduTrainingTask::getPlanId, planIdList).select(CoreEduTrainingTask::getId));
 | 
	
		
			
				|  |  | -        List<Long> collect = taskIdList.stream().map(CoreEduTrainingTask::getId).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -        if (ObjectUtil.isNotEmpty(collect)) {
 | 
	
		
			
				|  |  | -            coreEduTrainingTaskMapper.deleteBatchIds(collect);
 | 
	
		
			
				|  |  | -            coreEduTrainingTaskToRoleMapper.delete(new LambdaQueryWrapper<CoreEduTrainingTaskToRole>().in(CoreEduTrainingTaskToRole::getEduTrainingTaskId, collect));
 | 
	
		
			
				|  |  | +        String errorMsg = "子计划仅允许修改培训频次!";
 | 
	
		
			
				|  |  | +        validatePlanForStandard(request, plan, errorMsg, 0);
 | 
	
		
			
				|  |  | +        doUpdatePlan(plan, request);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void updateCommonPlan(CoreEduTrainingPlan plan) {
 | 
	
		
			
				|  |  | -        /*
 | 
	
		
			
				|  |  | -                   判断能否修改: 如果上面返回了true; 说明两种情况
 | 
	
		
			
				|  |  | -                   1:计划生成了任务,但是未执行:  此时需要删除所有任务,修改计划数据后重新创建任务
 | 
	
		
			
				|  |  | -                   2:计划生成了任务且执行了,但是没有修改到关键信息,此时则不能删除任务,只允许修改计划信息
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -         */
 | 
	
		
			
				|  |  | -        final Integer done = coreEduTrainingTaskMapper.checkHasTaskIsDone(Arrays.asList(plan.getId()));
 | 
	
		
			
				|  |  | -        if (ObjectUtil.equal(1, done)) {
 | 
	
		
			
				|  |  | -            //此为情况二, 计划生成了任务且执行 不能删除任务,只允许修改计划信息,所以直接返回
 | 
	
		
			
				|  |  | -            //TODO 考虑是否同步修改已生成的任务的名称
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if (plan.getPlanStatus() == EduTrainingPlanStatus.DELETED.getCode()) {
 | 
	
		
			
				|  |  | -            log.info("计划已被修改为" + EduTrainingPlanStatus.DELETED.getDesc() + ",不再生成任务!");
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        //此为情况一,计划没有生成任务或者生成了任务但未执行
 | 
	
		
			
				|  |  | -        final CoreEduTrainingPlanDataVo dataVo = getCoreEduTrainingPlanDataVo(plan.getId());
 | 
	
		
			
				|  |  | -        if (ObjectUtil.equal(1, plan.getBuildTaskNow()) && ObjectUtil.equal(0, plan.getPlanStatus())) {
 | 
	
		
			
				|  |  | -            coreEduTrainingTaskMapper.deleteByMap(MapUtil.of("plan_id", plan.getId()));
 | 
	
		
			
				|  |  | -            coreEduTrainingTaskToRoleMapper.delete(new LambdaQueryWrapper<CoreEduTrainingTaskToRole>().eq(CoreEduTrainingTaskToRole::getEduTrainingTaskId, plan.getId()));
 | 
	
		
			
				|  |  | -            CompletableFuture.runAsync(() -> {
 | 
	
		
			
				|  |  | -                //说明有任务并且都没执行过,需要重新生成任务
 | 
	
		
			
				|  |  | -                coreEduTrainingTaskService.createTaskForNow(dataVo, plan.getStartDate(), plan.getEndDate());
 | 
	
		
			
				|  |  | -            }, threadPoolTaskExecutor);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    private void doUpdatePlan(CoreEduTrainingPlan plan, CoreEduTrainingPlanEditDto request) {
 | 
	
		
			
				|  |  | +        BeanUtils.copyProperties(request, plan);
 | 
	
		
			
				|  |  | +        plan.setUpdateTime(DateUtils.getNowDate());
 | 
	
		
			
				|  |  | +        plan.setFileList(ObjectUtil.isNotEmpty(request.getFileList()) ? JSON.toJSONString(request.getFileList()) : null);
 | 
	
		
			
				|  |  | +        plan.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getId().toString());
 | 
	
		
			
				|  |  | +        coreEduTrainingPlanToRoleMapper.deleteByMap(MapUtil.of("plan_id", plan.getId()));
 | 
	
		
			
				|  |  | +        //List<CoreEduTrainingPlanToRole> trainingPlanToRoleList = batchSavePlanToRole(request.getPlanRoleId(), plan.getId());
 | 
	
		
			
				|  |  | +        coreEduTrainingPlanToExecOrgMapper.deleteByMap(MapUtil.of("plan_id", plan.getId()));
 | 
	
		
			
				|  |  | +        batchSavePlanToExecOrg(request.getPlanExecOrgIdList(), plan.getId());
 | 
	
		
			
				|  |  | +        coreEduTrainingPlanMapper.updateById(plan);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private Boolean checkCanUpdate(CoreEduTrainingPlanEditDto request, CoreEduTrainingPlan plan) {
 | 
	
		
			
				|  |  | -        if (ObjectUtil.isAllEmpty(request.getExecOrgType(), request.getPlanExecOrgIdList())) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("培训机构类型和执行机构不能同时为空!");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 如果是下发的计划,执行频次不应低于省联社下发时设定的次数
 | 
	
		
			
				|  |  | -        if (ObjectUtil.equal(plan.getStandard(), 0)) {
 | 
	
		
			
				|  |  | -            validatePlanForStandard(request, plan);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        final Long planId = plan.getId();
 | 
	
		
			
				|  |  | -        boolean flag = true;
 | 
	
		
			
				|  |  | +    private void updateStandardPlan(CoreEduTrainingPlan plan, CoreEduTrainingPlanEditDto request) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        // 判断计划是否有任务已经执行过
 | 
	
		
			
				|  |  | -        Integer done = coreEduTrainingTaskMapper.checkHasTaskIsDone(Arrays.asList(planId));
 | 
	
		
			
				|  |  | +        //使用中的标准计划
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        Long planId = plan.getId();
 | 
	
		
			
				|  |  |          // 判断标准计划能否修改:存在下发的计划生成了任务且任务存在已执行
 | 
	
		
			
				|  |  |          Integer standardPlanHasDone = coreEduTrainingTaskMapper.checkHasTaskIsDoneByPlanParentId(planId);
 | 
	
		
			
				|  |  | -        if (standardPlanHasDone != null) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("该计划下存在任务已执行的情况,无法修改!");
 | 
	
		
			
				|  |  | +        if (standardPlanHasDone == 1) {
 | 
	
		
			
				|  |  | +            //验证修改的字段是否符合要求
 | 
	
		
			
				|  |  | +            String errorMsg = "有任务已执行或已过期,仅允许修改培训主题!";
 | 
	
		
			
				|  |  | +            validatePlanForStandard(request, plan, errorMsg, 1);
 | 
	
		
			
				|  |  | +            doUpdatePlan(plan, request);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            doUpdatePlan(plan, request);
 | 
	
		
			
				|  |  | +            List<CoreEduTrainingPlan> list = lambdaQuery().eq(CoreEduTrainingPlan::getParentId, planId).select(CoreEduTrainingPlan::getId).list();
 | 
	
		
			
				|  |  | +            List<Long> collect = list.stream().map(CoreEduTrainingPlan::getId).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +            coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(collect, null, null);
 | 
	
		
			
				|  |  | +            for (CoreEduTrainingPlan trainingPlan : list) {
 | 
	
		
			
				|  |  | +                CompletableFuture.runAsync(() -> {
 | 
	
		
			
				|  |  | +                    //如果不是省联社或者办事处,状态启用,并且是无周期或者立即生效
 | 
	
		
			
				|  |  | +                    if ((ObjectUtil.equal(EduTrainingPlanStatus.USING.getCode(), plan.getPlanStatus())
 | 
	
		
			
				|  |  | +                            && (ObjectUtil.equal(EduTrainingPlanCycleEnum.NONE, plan.getPlanCycle()) || ObjectUtil.equal(1, plan.getBuildTaskNow())))) {
 | 
	
		
			
				|  |  | +                        CoreEduTrainingPlanDataVo detailPlanData = getCoreEduTrainingPlanDataVo(trainingPlan.getId());
 | 
	
		
			
				|  |  | +                        coreEduTrainingTaskService.createTaskForNow(detailPlanData, plan.getStartDate(), plan.getEndDate());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }, threadPoolTaskExecutor);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        // 验证计划
 | 
	
		
			
				|  |  | -        flag = validatePlan(request, plan, planId, true);
 | 
	
		
			
				|  |  | +        //TODO 修改任务名称
 | 
	
		
			
				|  |  | +        //coreEduTrainingTaskMapper.updateTaskNameByPlanId(planId, planName, plan.getStartDate(), plan.getEndDate());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return null == done || flag;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void validatePlanForStandard(CoreEduTrainingPlanEditDto request, CoreEduTrainingPlan plan) {
 | 
	
		
			
				|  |  | -        if (request.getExecTimes() < plan.getExecTimes()) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("培训次数不应低于基准次数!");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        validateFieldForStandard(request.getPlanStatus(), plan.getPlanStatus(), "下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  | -        validateFieldForStandard(request.getPlanCycle(), plan.getPlanCycle(), "下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  | -        validateFieldForStandard(request.getExecOrgType(), plan.getExecOrgType(), "下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  | -        validateFieldForStandard(request.getPlanName(), plan.getPlanName(), "下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  | -        validateFieldForStandard(request.getRemark(), plan.getRemark(), "下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        validateRoleAndOrgForStandard(request, plan);
 | 
	
		
			
				|  |  | +    private void validatePlanForStandard(CoreEduTrainingPlanEditDto request, CoreEduTrainingPlan plan, String errorMsg, Integer type) {
 | 
	
		
			
				|  |  | +        validateFieldForStandard(request.getPlanCycle(), plan.getPlanCycle(), errorMsg);
 | 
	
		
			
				|  |  | +        validateFieldForStandard(request.getExecOrgType(), plan.getExecOrgType(), errorMsg);
 | 
	
		
			
				|  |  | +        List<Long> execOrgIdList = coreEduTrainingPlanToExecOrgMapper.selectOrgIdByPlanId(plan.getId());
 | 
	
		
			
				|  |  | +        validateListForStandard(execOrgIdList, request.getPlanExecOrgIdList(), errorMsg);
 | 
	
		
			
				|  |  | +        validateFieldForStandard(request.getRemark(), plan.getRemark(), errorMsg);
 | 
	
		
			
				|  |  | +        validateFieldForStandard(JSON.toJSONString(request.getFileList()), plan.getFileList(), errorMsg);
 | 
	
		
			
				|  |  | +        if (type == 0) {
 | 
	
		
			
				|  |  | +            //标准计划可以修改名称
 | 
	
		
			
				|  |  | +            validateFieldForStandard(request.getPlanName(), plan.getPlanName(), errorMsg);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (type != 0) {
 | 
	
		
			
				|  |  | +            //子计划可以修改执行次数,但只能增加不能减少
 | 
	
		
			
				|  |  | +            validateFieldForStandard(request.getExecTimes(), plan.getExecTimes(), errorMsg);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void validateFieldForStandard(Object requestValue, Object planValue, String errorMessage) {
 | 
	
	
		
			
				|  | @@ -393,53 +340,12 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private void validateRoleAndOrgForStandard(CoreEduTrainingPlanEditDto request, CoreEduTrainingPlan plan) {
 | 
	
		
			
				|  |  | -        // 执行角色
 | 
	
		
			
				|  |  | -       /* List<Long> roleIdLit = coreEduTrainingPlanToRoleMapper.selectRoleIdByPlanId(plan.getId());
 | 
	
		
			
				|  |  | -        List<Long> planRoleId = request.getPlanRoleId();
 | 
	
		
			
				|  |  | -        if (ObjectUtil.isEmpty(planRoleId)) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        validateListForStandard(roleIdLit, planRoleId, "下发计划仅允许修改培训次数!");*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 执行机构
 | 
	
		
			
				|  |  | -        List<Long> execOrgIdList = coreEduTrainingPlanToExecOrgMapper.selectOrgIdByPlanId(plan.getId());
 | 
	
		
			
				|  |  | -        List<Long> planExecOrgIdList = request.getPlanExecOrgIdList();
 | 
	
		
			
				|  |  | -        validateListForStandard(execOrgIdList, planExecOrgIdList, "下发计划仅允许修改培训次数!");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      private void validateListForStandard(List<Long> planList, List<Long> requestList, String errorMessage) {
 | 
	
		
			
				|  |  |          if (planList.size() != requestList.size() || !planList.containsAll(requestList)) {
 | 
	
		
			
				|  |  |              throw new RuntimeException(errorMessage);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private boolean validatePlan(CoreEduTrainingPlanEditDto request, CoreEduTrainingPlan plan, Long planId, boolean flag) {
 | 
	
		
			
				|  |  | -        flag = flag && validateField(request.getPlanStatus(), plan.getPlanStatus());
 | 
	
		
			
				|  |  | -        flag = flag && validateField(request.getPlanCycle(), plan.getPlanCycle());
 | 
	
		
			
				|  |  | -        flag = flag && validateField(request.getExecOrgType(), plan.getExecOrgType());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 执行角色
 | 
	
		
			
				|  |  | -        List<Long> roleIdLit = coreEduTrainingPlanToRoleMapper.selectRoleIdByPlanId(planId);
 | 
	
		
			
				|  |  | -        List<Long> planRoleId = request.getPlanRoleId();
 | 
	
		
			
				|  |  | -        flag = flag && !ObjectUtil.isEmpty(planRoleId) && roleIdLit.containsAll(planRoleId);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 执行机构
 | 
	
		
			
				|  |  | -        List<Long> execOrgIdList = coreEduTrainingPlanToExecOrgMapper.selectOrgIdByPlanId(planId);
 | 
	
		
			
				|  |  | -        List<Long> planExecOrgIdList = request.getPlanExecOrgIdList();
 | 
	
		
			
				|  |  | -        flag = flag && validateList(execOrgIdList, planExecOrgIdList);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return flag;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private boolean validateField(Object requestValue, Object planValue) {
 | 
	
		
			
				|  |  | -        return ObjectUtil.equal(requestValue, planValue);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private boolean validateList(List<Long> planList, List<Long> requestList) {
 | 
	
		
			
				|  |  | -        return planList.size() == requestList.size() && planList.containsAll(requestList);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public CoreEduTrainingPlanDataVo getCoreEduTrainingPlanDataVo(Long id) {
 | 
	
		
			
				|  |  |          final CoreEduTrainingPlanDataVo dataVo = coreEduTrainingPlanMapper.getDetailPlanData(id);
 | 
	
	
		
			
				|  | @@ -461,7 +367,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |          return planRoleList;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public List<CoreEduTrainingPlanToExecOrg> batchSavePlanToExecOrg(List<Long> orgIdList, Long planId) {
 | 
	
		
			
				|  |  | +    public void batchSavePlanToExecOrg(List<Long> orgIdList, Long planId) {
 | 
	
		
			
				|  |  |          List<CoreEduTrainingPlanToExecOrg> planOrgList = new ArrayList<CoreEduTrainingPlanToExecOrg>();
 | 
	
		
			
				|  |  |          for (Long orgId : orgIdList) {
 | 
	
		
			
				|  |  |              CoreEduTrainingPlanToExecOrg org = new CoreEduTrainingPlanToExecOrg();
 | 
	
	
		
			
				|  | @@ -473,7 +379,6 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |              coreEduTrainingPlanToExecOrgService.saveBatch(planOrgList);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return planOrgList;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -485,15 +390,25 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      public int deleteCoreEduTrainingPlanByIds(Long id) {
 | 
	
		
			
				|  |  | -        Integer count = coreEduTrainingTaskMapper.checkHasTaskIsDone(Collections.singletonList(id));
 | 
	
		
			
				|  |  | -        if (count != null && count > 0) {
 | 
	
		
			
				|  |  | -            throw new RuntimeException("已有任务完成,无法删除");
 | 
	
		
			
				|  |  | +        CoreEduTrainingPlan plan = getById(id);
 | 
	
		
			
				|  |  | +        if (EduTrainingPlanStatus.DRAFT.getCode() == plan.getPlanStatus()) {
 | 
	
		
			
				|  |  | +            removeById(id);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          final Integer done = coreEduTrainingTaskMapper.checkHasTaskIsDoneByPlanParentId(id);
 | 
	
		
			
				|  |  |          if (done != null && done > 0) {
 | 
	
		
			
				|  |  | +            throw new RuntimeException("计划有已完成或者已逾期的任务,不能被删除");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<Long> list = baseMapper.selectIdByParentId(id);
 | 
	
		
			
				|  |  | +        list.add(id);
 | 
	
		
			
				|  |  | +        coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Integer count = coreEduTrainingTaskMapper.checkHasTaskIsDone(Collections.singletonList(id));
 | 
	
		
			
				|  |  | +        if (count != null && count > 0) {
 | 
	
		
			
				|  |  |              throw new RuntimeException("已有任务完成,无法删除");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        final CoreEduTrainingPlan plan = getById(id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          if (plan.getStandard() == 0) {
 | 
	
		
			
				|  |  |              //自建计划
 | 
	
		
			
				|  |  |              final List<CoreEduTrainingTask> coreEduTrainingTasks = coreEduTrainingTaskMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingTask>()
 | 
	
	
		
			
				|  | @@ -576,16 +491,24 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |          final CoreEduTrainingPlan plan = coreEduTrainingPlanMapper.selectById(planId);
 | 
	
		
			
				|  |  |          AssertUtil.isNotEmpty(plan, "计划不存在!");
 | 
	
		
			
				|  |  |          AssertUtil.equal(plan.getIssue(), 0, "计划已完成下发!");
 | 
	
		
			
				|  |  | -        List<CoreEduTrainingPlan> list = buildPlanData(plan, new ArrayList<>(), true);
 | 
	
		
			
				|  |  | +        List<CoreEduTrainingPlan> planList = lambdaQuery().eq(CoreEduTrainingPlan::getParentId, planId).select(CoreEduTrainingPlan::getId).list();
 | 
	
		
			
				|  |  | +        if (planList.isEmpty()){
 | 
	
		
			
				|  |  | +            planList = buildPlanData(plan, new ArrayList<>(), true);
 | 
	
		
			
				|  |  | +        }else {
 | 
	
		
			
				|  |  | +            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());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          //下发后修改为使用中
 | 
	
		
			
				|  |  |          plan.setPlanStatus(EduTrainingPlanStatus.USING.getCode());
 | 
	
		
			
				|  |  |          plan.setIssue(1);
 | 
	
		
			
				|  |  |          this.updateById(plan);
 | 
	
		
			
				|  |  |          //事务提交后执行
 | 
	
		
			
				|  |  | +        List<CoreEduTrainingPlan> finalPlanList = planList;
 | 
	
		
			
				|  |  |          TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
 | 
	
		
			
				|  |  |              @Override
 | 
	
		
			
				|  |  |              public void afterCommit() {
 | 
	
		
			
				|  |  | -                for (CoreEduTrainingPlan trainingPlan : list) {
 | 
	
		
			
				|  |  | +                for (CoreEduTrainingPlan trainingPlan : finalPlanList) {
 | 
	
		
			
				|  |  |                      CompletableFuture.runAsync(() -> {
 | 
	
		
			
				|  |  |                          //如果不是省联社或者办事处,状态启用,并且是无周期或者立即生效
 | 
	
		
			
				|  |  |                          if ((ObjectUtil.equal(EduTrainingPlanStatus.USING.getCode(), plan.getPlanStatus())
 | 
	
	
		
			
				|  | @@ -682,7 +605,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 | 
	
		
			
				|  |  |          DateRange range = DateUtils.getStartAndEnd(new Date(), plan.getPlanCycle());
 | 
	
		
			
				|  |  |          List<Long> list = coreEduTrainingPlanMapper.selectIdByParentId(planId);
 | 
	
		
			
				|  |  |          coreEduTrainingPlanMapper.updatePlanStatusByIdOrParentId(planId, EduTrainingPlanStatus.DELETED.getCode());
 | 
	
		
			
				|  |  | -        coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list,range.getStartTime(),range.getEndTime());
 | 
	
		
			
				|  |  | +        coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, range.getStartTime(), range.getEndTime());
 | 
	
		
			
				|  |  |          return coreEduTrainingPlanMapper.updateById(plan);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |