Просмотр исходного кода

作息变更 培训任务变更bug处理

jingyuanchao 1 год назад
Родитель
Сommit
91cec728d6

+ 3 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/drill/DrillPlanCycleEnum.java

@@ -9,6 +9,9 @@ import com.xunmei.common.core.enums.CycleCommonEnum;
  */
 public enum DrillPlanCycleEnum {
     NONE(0, "无周期"),
+    DAILY(1, "每日"),
+    WEEKLY(2, "每周"),
+    MONTHLY(3, "每月"),
     QUARTERLY(4, "每季度"),
     HALF_YEARLY(5, "每半年"),
     YEARLY(6, "每年");

+ 10 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/controller/CoreDrillTaskController.java

@@ -1,17 +1,20 @@
 package com.xunmei.core.drill.controller;
 
 
+import com.alibaba.nacos.shaded.com.google.gson.Gson;
 import com.xunmei.common.core.domain.drill.domain.CoreDrillTask;
 import com.xunmei.common.core.domain.drill.dto.*;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillTaskPageVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillTaskRecPageVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillTaskRecTaskPageVo;
 import com.xunmei.common.core.domain.edu.dto.CoreEduTrainingTaskPageDto;
+import com.xunmei.common.core.event.WorkTimeChangeEvent;
 import com.xunmei.common.core.web.controller.BaseController;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.log.annotation.Log;
 import com.xunmei.common.log.enums.BusinessType;
+import com.xunmei.common.security.annotation.InnerAuth;
 import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.core.drill.service.ICoreDrillTaskService;
 import io.swagger.annotations.Api;
@@ -155,4 +158,11 @@ public class CoreDrillTaskController extends BaseController {
     public void export(CoreDrillTaskPageDto request, HttpServletResponse response) throws IOException {
         coreDrillTaskService.export(request, response);
     }
+
+    @PostMapping(value = "/change")
+    @InnerAuth
+    void rebuildTask(@RequestBody String event){
+        coreDrillTaskService.taskChangeForTimeWorkChange(new Gson().fromJson(event, WorkTimeChangeEvent.class));
+    }
+
 }

+ 4 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/ICoreDrillTaskService.java

@@ -9,6 +9,7 @@ import com.xunmei.common.core.domain.drill.vo.*;
 import com.xunmei.common.core.domain.edu.dto.CoreEduTrainingTaskPageDto;
 import com.xunmei.common.core.domain.panel.dto.PanelListDto;
 import com.xunmei.common.core.domain.panel.vo.PanelListVo;
+import com.xunmei.common.core.event.WorkTimeChangeEvent;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 
@@ -112,4 +113,7 @@ public interface ICoreDrillTaskService extends IService<CoreDrillTask> {
     List<PanelListVo> selectRecList(PanelListDto panelListDto);
 
     void export(CoreDrillTaskPageDto request, HttpServletResponse response);
+
+    void taskChangeForTimeWorkChange(WorkTimeChangeEvent event);
+
 }

+ 383 - 4
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java

@@ -31,7 +31,10 @@ import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.enums.OrgTypeEnum;
 import com.xunmei.common.core.enums.RegisterBookType;
 import com.xunmei.common.core.enums.drill.*;
+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.event.WorkTimeChangeEvent;
 import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.web.domain.AjaxResult;
@@ -68,13 +71,14 @@ import java.io.File;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLEncoder;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static com.xunmei.core.edu.service.impl.CoreEduTrainingTaskServiceImpl.WORK;
 
 
 /**
@@ -112,7 +116,8 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
 
     @Autowired
     private RemoteDictDataService remoteDictDataService;
-
+    public static final long UN_WORK = 0L;
+    public static final long WORK = 1L;
 
     @Autowired
     @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
@@ -560,8 +565,12 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
         final Map<Long, List<SysWorkTime>> listMap = workTimeList.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
 
         for (SysOrg org : orgList) {
-            final List<SysWorkTime> sysWorkTimes = OrgTypeEnum.YINGYE_WANGDIAN.getCode().equals(org.getType()) ? listMap.get(org.getId()) : null;
-            final Map<Short, DateRange> rangeMap = splitTaskTime(plan.getExecTimes().shortValue(), DrillPlanCycleEnum.toCommonEnum(plan.getPlanCycle()), start, end, sysWorkTimes);
+            final Map<Short, DateRange> rangeMap;
+            if (OrgTypeEnum.YINGYE_WANGDIAN.getCode().equals(org.getType()) && ObjectUtil.isNotEmpty(listMap.get(org.getId()))) {
+                rangeMap = splitTaskTime(plan.getExecTimes().shortValue(), DrillPlanCycleEnum.toCommonEnum(plan.getPlanCycle()), start, end, listMap.get(org.getId()));
+            } else {
+                continue;
+            }
             int x = 0;
             for (Map.Entry<Short, DateRange> rangeEntry : rangeMap.entrySet()) {
                 final Short key = rangeEntry.getKey();
@@ -1108,6 +1117,376 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
     }
 
     @Override
+    public void taskChangeForTimeWorkChange(WorkTimeChangeEvent event) {
+        String date = LocalDate.now().format(DateTimeFormatter.ofPattern(Constants.DAILY_FORMAT));
+        final List<SysWorkTime> dataList = event.getDataList();
+        final List<Date> collect = dataList.stream().map(SysWorkTime::getYmdDate).distinct().collect(Collectors.toList());
+        Date now = new Date();
+        for (EduTrainingPlanCycleEnum value : EduTrainingPlanCycleEnum.values()) {
+            switch (value) {
+                /*case DAILY:
+                    final Optional<SysWorkTime> any = dataList.stream()
+                            .filter(time -> DateUtils.isSameDay(time.getYmdDate(), new Date()))
+                            .findAny();
+                    if (!any.isPresent()) {
+                        continue;
+                    }
+                    List<SysWorkTime> dailyFutureWorkTime = selectWorkTimeList(now, DrillPlanCycleEnum.DAILY, event);
+                    dealTimeWorkChangeForDaily(event, date, dailyFutureWorkTime);
+                    break;
+                case WEEKLY:
+                    List<SysWorkTime> weeklyFutureWorkTime = selectWorkTimeList(now, DrillPlanCycleEnum.WEEKLY, event);
+                    dealTimeWorkChangeForWeekly(event, date, weeklyFutureWorkTime);
+                    break;
+                case MONTHLY:
+                    List<SysWorkTime> monthlyFutureWorkTime = selectWorkTimeList(now, DrillPlanCycleEnum.MONTHLY, event);
+                    dealTimeWorkChangeForMonthly(event, date, monthlyFutureWorkTime);
+                    break;*/
+                case QUARTERLY:
+                    List<SysWorkTime> quarterlyFutureWorkTime = selectWorkTimeList(now, DrillPlanCycleEnum.QUARTERLY, event);
+                    dealTimeWorkChangeForQuarterly(event, date, quarterlyFutureWorkTime);
+                    break;
+                case HALF_YEARLY:
+                    List<SysWorkTime> halfYearlyFutureWorkTime = selectWorkTimeList(now, DrillPlanCycleEnum.HALF_YEARLY, event);
+                    dealTimeWorkChangeForHalfYearly(event, date, halfYearlyFutureWorkTime);
+                    break;
+                case YEARLY:
+                    List<SysWorkTime> yearlyFutureWorkTime = selectWorkTimeList(now, DrillPlanCycleEnum.YEARLY, event);
+                    dealTimeWorkChangeForYearly(event, date, yearlyFutureWorkTime);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+    }
+
+    private void dealTimeWorkChangeForDaily(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
+        DateTime today = DateUtil.parse(todayStr, Constants.DAILY_FORMAT);
+        List<Long> orgIds = event.getOrgIds();
+        //查询机构当天是否存在任务
+        //因为是每日,每日的任务都是在当天凌晨生成,所以这里只考虑今天的任务情况就行
+        List<CoreDrillTask> taskList = lambdaQuery()
+                .in(CoreDrillTask::getPlanCycle, EduTrainingPlanCycleEnum.DAILY.getCode(), EduTrainingPlanCycleEnum.NONE.getCode())
+                .like(CoreDrillTask::getStartDate, todayStr)
+                .in(CoreDrillTask::getOrgId, orgIds)
+                .select(CoreDrillTask::getId, CoreDrillTask::getOrgId,
+                        CoreDrillTask::getPlanCycle, CoreDrillTask::getStatus)
+                .list();
+        //根据营业歇业分组
+        Map<Long, List<SysWorkTime>> listMap = futureWorkTime.stream().collect(Collectors.groupingBy(SysWorkTime::getIsEnable));
+        //歇业的数据
+        List<SysWorkTime> unWorkTimeList = listMap.get(UN_WORK);
+        if (ObjectUtil.isNotEmpty(unWorkTimeList)) {
+            //获取歇业的机构信息
+            List<Long> unWorkOrgIdList = unWorkTimeList.stream().map(SysWorkTime::getOrgId).collect(Collectors.toList());
+            //删除已经歇业且未执行的任务
+            List<Long> delTaskIdList = taskList.stream()
+                    .filter(task -> unWorkOrgIdList.contains(task.getOrgId()))
+                    .filter(task -> task.getStatus().equals(EduTrainingDoStatus.WAIT_RECORDED.getCode()))
+                    .filter(task -> !task.getPlanCycle().equals(EduTrainingPlanCycleEnum.NONE.getCode()))
+                    .map(CoreDrillTask::getId).collect(Collectors.toList());
+            //删除任务
+            delTaskByIdList(delTaskIdList);
+        }
+
+
+        //营业的数据
+        List<SysWorkTime> workTimeList = listMap.get(WORK);
+        if (ObjectUtil.isNotEmpty(workTimeList)) {
+
+            //查询需要生成任务的机构的计划
+            //List<Integer> cycleList = DateUtils.checkDate(today);
+            final List<CoreDrillPlan> cyclePlanList = selectPlanList(workTimeList);
+            //无周期任务补录
+            /*List<CoreDrillPlan> unCyclePlanList = CoreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                    .eq(CoreDrillPlan::getStandard, 0)
+                    .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                    .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.NONE.getCode())
+                    .eq(CoreDrillPlan::getDeleted, 0)
+                    .ge(CoreDrillPlan::getStartDate, today)
+                    .in(CoreDrillPlan::getBelongOrgId, collect)
+                    .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle));*/
+            List<CoreDrillPlan> unCyclePlanList = new ArrayList<>();
+            final List<CoreDrillPlan> list = Stream.of(cyclePlanList, unCyclePlanList).flatMap(Collection::stream).collect(Collectors.toList());
+            //此list中Plan对象仅id与planCycle字段有值,
+            buildTaskByPlan(list, today);
+        }
+
+    }
+
+    private List<CoreDrillPlan> selectPlanList(List<SysWorkTime> workTimeList){
+        //营业的机构id
+        List<Long> workOrgIdList = workTimeList.stream().map(SysWorkTime::getOrgId).collect(Collectors.toList());
+        List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectParentHs(workOrgIdList, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        final List<Long> collect = orgList.stream().map(SysOrg::getId).collect(Collectors.toList());
+        return coreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                // .eq(CoreDrillPlan::getStandard, 0)
+                .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.DAILY.getCode())
+                .eq(CoreDrillPlan::getDeleted, 0)
+                .in(CoreDrillPlan::getBelongOrgId, collect)
+                .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle,CoreDrillPlan::getPlanName));
+    }
+
+    private void dealTimeWorkChangeForWeekly(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
+        List<Long> orgIds = event.getOrgIds();
+        DateTime today = DateUtil.parse(todayStr, Constants.DAILY_FORMAT);
+        DateRange dateRange = DateUtils.getStartAndEnd(today, CycleCommonEnum.WEEKLY);
+        //查询机构当周是否存在任务
+        List<CoreDrillTask> taskList = lambdaQuery()
+                .eq(CoreDrillTask::getPlanCycle, EduTrainingPlanCycleEnum.WEEKLY.getCode())
+                .ge(CoreDrillTask::getStartDate, dateRange.getStartTime())
+                .le(CoreDrillTask::getEndDate, dateRange.getEndTime())
+                .in(CoreDrillTask::getOrgId, orgIds)
+                .select(CoreDrillTask::getId, CoreDrillTask::getOrgId, CoreDrillTask::getStatus)
+                .list();
+        Map<Long, List<SysWorkTime>> orgWorkTimeMap = futureWorkTime.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
+        List<Long> workOrgIdList = new ArrayList<>();
+        //歇业的数据
+        List<Long> unWorkOrgIdList = new ArrayList<>();
+        for (Map.Entry<Long, List<SysWorkTime>> entry : orgWorkTimeMap.entrySet()) {
+            List<SysWorkTime> weeklyWorkTimeList = entry.getValue();
+            //如果有任何一天营业,那么就应该生成该周期的任务
+            boolean match = weeklyWorkTimeList.stream().anyMatch(time -> ObjectUtil.equal(time.getIsEnable(), WORK));
+            if (match) {
+                workOrgIdList.add(entry.getKey());
+                continue;
+            }
+            unWorkOrgIdList.add(entry.getKey());
+        }
+        //删除已经歇业且未执行的任务
+        List<Long> delTaskIdList = taskList.stream()
+                .filter(task -> unWorkOrgIdList.contains(task.getOrgId()))
+                .filter(task -> task.getStatus().equals(EduTrainingDoStatus.WAIT_RECORDED.getCode()))
+                .map(CoreDrillTask::getId).collect(Collectors.toList());
+        //删除任务
+        delTaskByIdList(delTaskIdList);
+
+        List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectParentHs(workOrgIdList, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        final List<Long> collect = orgList.stream().map(SysOrg::getId).collect(Collectors.toList());
+        //查询需要生成任务的机构的计划
+        List<CoreDrillPlan> planList = coreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                //.eq(CoreDrillPlan::getStandard, 0)
+                .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.WEEKLY.getCode())
+                .eq(CoreDrillPlan::getDeleted, 0)
+                .in(CoreDrillPlan::getBelongOrgId, collect)
+                .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle));
+        //此list中Plan对象仅id与planCycle字段有值,
+        buildTaskByPlan(planList, today);
+    }
+
+    private void dealTimeWorkChangeForMonthly(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
+        List<Long> orgIds = event.getOrgIds();
+        DateTime today = DateUtil.parse(todayStr, Constants.DAILY_FORMAT);
+        DateRange dateRange = DateUtils.getStartAndEnd(today, CycleCommonEnum.MONTHLY);
+        //查询机构当周是否存在任务
+        List<CoreDrillTask> taskList = lambdaQuery()
+                .eq(CoreDrillTask::getPlanCycle, EduTrainingPlanCycleEnum.MONTHLY.getCode())
+                .ge(CoreDrillTask::getStartDate, dateRange.getStartTime())
+                .le(CoreDrillTask::getEndDate, dateRange.getEndTime())
+                .in(CoreDrillTask::getOrgId, orgIds)
+                .select(CoreDrillTask::getId, CoreDrillTask::getOrgId, CoreDrillTask::getStatus)
+                .list();
+        Map<Long, List<SysWorkTime>> orgWorkTimeMap = futureWorkTime.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
+        List<Long> workOrgIdList = new ArrayList<>();
+        //歇业的数据
+        List<Long> unWorkOrgIdList = new ArrayList<>();
+        for (Map.Entry<Long, List<SysWorkTime>> entry : orgWorkTimeMap.entrySet()) {
+            List<SysWorkTime> weeklyWorkTimeList = entry.getValue();
+            //如果有任何一天营业,那么就应该生成该周期的任务
+            boolean match = weeklyWorkTimeList.stream().anyMatch(time -> ObjectUtil.equal(time.getIsEnable(), WORK));
+            if (match) {
+                workOrgIdList.add(entry.getKey());
+                continue;
+            }
+            unWorkOrgIdList.add(entry.getKey());
+        }
+        //删除已经歇业且未执行的任务
+        List<Long> delTaskIdList = taskList.stream()
+                .filter(task -> unWorkOrgIdList.contains(task.getOrgId()))
+                .filter(task -> task.getStatus().equals(EduTrainingDoStatus.WAIT_RECORDED.getCode()))
+                .map(CoreDrillTask::getId).collect(Collectors.toList());
+        //删除任务
+        delTaskByIdList(delTaskIdList);
+
+        //查询需要生成任务的机构的计划
+        List<CoreDrillPlan> planList = coreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                //.eq(CoreDrillPlan::getStandard, 0)
+                .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.MONTHLY.getCode())
+                .eq(CoreDrillPlan::getDeleted, 0)
+                .in(CoreDrillPlan::getBelongOrgId, workOrgIdList)
+                .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle));
+        //此list中Plan对象仅id与planCycle字段有值,
+        buildTaskByPlan(planList, today);
+    }
+
+    private void dealTimeWorkChangeForQuarterly(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
+        List<Long> orgIds = event.getOrgIds();
+        DateTime today = DateUtil.parse(todayStr, Constants.DAILY_FORMAT);
+        DateRange dateRange = DateUtils.getStartAndEnd(today, CycleCommonEnum.QUARTERLY);
+        //查询机构当周是否存在任务
+        List<CoreDrillTask> taskList = lambdaQuery()
+                .eq(CoreDrillTask::getPlanCycle, EduTrainingPlanCycleEnum.QUARTERLY.getCode())
+                .ge(CoreDrillTask::getStartDate, dateRange.getStartTime())
+                .le(CoreDrillTask::getEndDate, dateRange.getEndTime())
+                .in(CoreDrillTask::getOrgId, orgIds)
+                .select(CoreDrillTask::getId, CoreDrillTask::getOrgId, CoreDrillTask::getStatus)
+                .list();
+        Map<Long, List<SysWorkTime>> orgWorkTimeMap = futureWorkTime.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
+        List<Long> workOrgIdList = new ArrayList<>();
+        //歇业的数据
+        List<Long> unWorkOrgIdList = new ArrayList<>();
+        for (Map.Entry<Long, List<SysWorkTime>> entry : orgWorkTimeMap.entrySet()) {
+            List<SysWorkTime> weeklyWorkTimeList = entry.getValue();
+            //如果有任何一天营业,那么就应该生成该周期的任务
+            boolean match = weeklyWorkTimeList.stream().anyMatch(time -> ObjectUtil.equal(time.getIsEnable(), WORK));
+            if (match) {
+                workOrgIdList.add(entry.getKey());
+                continue;
+            }
+            unWorkOrgIdList.add(entry.getKey());
+        }
+        //删除已经歇业且未执行的任务
+        List<Long> delTaskIdList = taskList.stream()
+                .filter(task -> unWorkOrgIdList.contains(task.getOrgId()))
+                .filter(task -> task.getStatus().equals(EduTrainingDoStatus.WAIT_RECORDED.getCode()))
+                .map(CoreDrillTask::getId).collect(Collectors.toList());
+        //删除任务
+        delTaskByIdList(delTaskIdList);
+
+        //查询需要生成任务的机构的计划
+        List<CoreDrillPlan> planList = coreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                //.eq(CoreDrillPlan::getStandard, 0)
+                .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.QUARTERLY.getCode())
+                .eq(CoreDrillPlan::getDeleted, 0)
+                .in(CoreDrillPlan::getBelongOrgId, workOrgIdList)
+                .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle));
+        //此list中Plan对象仅id与planCycle字段有值,
+        buildTaskByPlan(planList, today);
+    }
+
+    private void dealTimeWorkChangeForHalfYearly(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
+        List<Long> orgIds = event.getOrgIds();
+        DateTime today = DateUtil.parse(todayStr, Constants.DAILY_FORMAT);
+        DateRange dateRange = DateUtils.getStartAndEnd(today, CycleCommonEnum.HALF_YEARLY);
+        //查询机构当周是否存在任务
+        List<CoreDrillTask> taskList = lambdaQuery()
+                .eq(CoreDrillTask::getPlanCycle, EduTrainingPlanCycleEnum.HALF_YEARLY.getCode())
+                .ge(CoreDrillTask::getStartDate, dateRange.getStartTime())
+                .le(CoreDrillTask::getEndDate, dateRange.getEndTime())
+                .in(CoreDrillTask::getOrgId, orgIds)
+                .select(CoreDrillTask::getId, CoreDrillTask::getOrgId, CoreDrillTask::getStatus)
+                .list();
+        Map<Long, List<SysWorkTime>> orgWorkTimeMap = futureWorkTime.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
+        List<Long> workOrgIdList = new ArrayList<>();
+        //歇业的数据
+        List<Long> unWorkOrgIdList = new ArrayList<>();
+        for (Map.Entry<Long, List<SysWorkTime>> entry : orgWorkTimeMap.entrySet()) {
+            List<SysWorkTime> weeklyWorkTimeList = entry.getValue();
+            //如果有任何一天营业,那么就应该生成该周期的任务
+            boolean match = weeklyWorkTimeList.stream().anyMatch(time -> ObjectUtil.equal(time.getIsEnable(), WORK));
+            if (match) {
+                workOrgIdList.add(entry.getKey());
+                continue;
+            }
+            unWorkOrgIdList.add(entry.getKey());
+        }
+        //删除已经歇业且未执行的任务
+        List<Long> delTaskIdList = taskList.stream()
+                .filter(task -> unWorkOrgIdList.contains(task.getOrgId()))
+                .filter(task -> task.getStatus().equals(EduTrainingDoStatus.WAIT_RECORDED.getCode()))
+                .map(CoreDrillTask::getId).collect(Collectors.toList());
+        //删除任务
+        delTaskByIdList(delTaskIdList);
+
+        //查询需要生成任务的机构的计划
+        List<CoreDrillPlan> planList = coreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                //.eq(CoreDrillPlan::getStandard, 0)
+                .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.HALF_YEARLY.getCode())
+                .eq(CoreDrillPlan::getDeleted, 0)
+                .in(CoreDrillPlan::getBelongOrgId, workOrgIdList)
+                .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle));
+        //此list中Plan对象仅id与planCycle字段有值,
+        buildTaskByPlan(planList, today);
+    }
+
+    private void dealTimeWorkChangeForYearly(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
+        List<Long> orgIds = event.getOrgIds();
+        DateTime today = DateUtil.parse(todayStr, Constants.DAILY_FORMAT);
+        DateRange dateRange = DateUtils.getStartAndEnd(today, CycleCommonEnum.YEARLY);
+        //查询机构当周是否存在任务
+        List<CoreDrillTask> taskList = lambdaQuery()
+                .eq(CoreDrillTask::getPlanCycle, EduTrainingPlanCycleEnum.YEARLY.getCode())
+                .ge(CoreDrillTask::getStartDate, dateRange.getStartTime())
+                .le(CoreDrillTask::getEndDate, dateRange.getEndTime())
+                .in(CoreDrillTask::getOrgId, orgIds)
+                .select(CoreDrillTask::getId, CoreDrillTask::getOrgId, CoreDrillTask::getStatus)
+                .list();
+        Map<Long, List<SysWorkTime>> orgWorkTimeMap = futureWorkTime.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
+        List<Long> workOrgIdList = new ArrayList<>();
+        //歇业的数据
+        List<Long> unWorkOrgIdList = new ArrayList<>();
+        for (Map.Entry<Long, List<SysWorkTime>> entry : orgWorkTimeMap.entrySet()) {
+            List<SysWorkTime> weeklyWorkTimeList = entry.getValue();
+            //如果有任何一天营业,那么就应该生成该周期的任务
+            boolean match = weeklyWorkTimeList.stream().anyMatch(time -> ObjectUtil.equal(time.getIsEnable(), WORK));
+            if (match) {
+                workOrgIdList.add(entry.getKey());
+                continue;
+            }
+            unWorkOrgIdList.add(entry.getKey());
+        }
+        //删除已经歇业且未执行的任务
+        List<Long> delTaskIdList = taskList.stream()
+                .filter(task -> unWorkOrgIdList.contains(task.getOrgId()))
+                .filter(task -> task.getStatus().equals(EduTrainingDoStatus.WAIT_RECORDED.getCode()))
+                .map(CoreDrillTask::getId).collect(Collectors.toList());
+        //删除任务
+        delTaskByIdList(delTaskIdList);
+
+        //查询需要生成任务的机构的计划
+        List<CoreDrillPlan> planList = coreDrillPlanMapper.selectList(new LambdaQueryWrapper<CoreDrillPlan>()
+                //.eq(CoreDrillPlan::getStandard, 0)
+                .eq(CoreDrillPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreDrillPlan::getPlanCycle, EduTrainingPlanCycleEnum.YEARLY.getCode())
+                .eq(CoreDrillPlan::getDeleted, 0)
+                .in(CoreDrillPlan::getBelongOrgId, workOrgIdList)
+                .select(CoreDrillPlan::getId, CoreDrillPlan::getPlanCycle));
+        //此list中Plan对象仅id与planCycle字段有值,
+        buildTaskByPlan(planList, today);
+    }
+
+    private void buildTaskByPlan(List<CoreDrillPlan> planList, DateTime today) {
+        for (CoreDrillPlan plan : planList) {
+            CompletableFuture.runAsync(() -> {
+                //此处因为planService会导致循环依赖
+                final CoreDrillPlanDataVo detailPlanData = coreDrillPlanMapper.getDetailPlanData(plan.getId());
+                detailPlanData.setFileList(ObjectUtil.isNotEmpty(detailPlanData.getFile()) ? JSON.parseArray(detailPlanData.getFile(), String.class) : null);
+                DateRange range = DateUtils.getStartAndEnd(today, plan.getPlanCycle());
+                this.createTaskForNow(detailPlanData, range.getStartTime(), range.getEndTime());
+            }, threadPoolTaskExecutor);
+
+        }
+    }
+
+    private List<SysWorkTime> selectWorkTimeList(Date now, DrillPlanCycleEnum daily, WorkTimeChangeEvent event) {
+        DateRange range = DateUtils.getStartAndEnd(now, daily.getCode());
+        String startTime = DateUtil.format(range.getStartTime(), Constants.DAILY_FORMAT);
+        String endTime = DateUtil.format(range.getEndTime(), Constants.DAILY_FORMAT);
+        WorkTimeDto workTimeDto = new WorkTimeDto();
+        workTimeDto.setOrgIdList(event.getOrgIds());
+        workTimeDto.setStartTime(startTime);
+        workTimeDto.setEndTime(endTime);
+        return workTimeService.findWorkTimeByRange(workTimeDto, SecurityConstants.FROM_SOURCE).getData();
+    }
+
+
+    @Override
     public void export(CoreDrillTaskPageDto request, HttpServletResponse response) {
         dealParam(request);
         List<CoreDrillTaskExportVo> list = coreDrillTaskMapper.selectDrillTaskExportList(request);

+ 27 - 22
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingTaskServiceImpl.java

@@ -42,10 +42,7 @@ import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.security.utils.SecurityUtils;
-import com.xunmei.core.edu.mapper.CoreEduTrainingPlanMapper;
-import com.xunmei.core.edu.mapper.CoreEduTrainingTaskMapper;
-import com.xunmei.core.edu.mapper.CoreEduTrainingTaskToRoleMapper;
-import com.xunmei.core.edu.mapper.CoreEduTrainingTaskToUserMapper;
+import com.xunmei.core.edu.mapper.*;
 import com.xunmei.core.edu.service.ICoreEduTrainingTaskService;
 import com.xunmei.core.edu.service.ICoreEduTrainingTaskToUserService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
@@ -579,8 +576,12 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
         final Map<Long, List<SysWorkTime>> listMap = workTimeList.stream().collect(Collectors.groupingBy(SysWorkTime::getOrgId));
 
         for (SysOrg org : orgList) {
-            final List<SysWorkTime> sysWorkTimes = OrgTypeEnum.YINGYE_WANGDIAN.getCode().equals(org.getType()) ? listMap.get(org.getId()) : null;
-            final Map<Short, DateRange> rangeMap = splitTaskTime(plan.getExecTimes().shortValue(), EduTrainingPlanCycleEnum.toCommonEnum(plan.getPlanCycle()), start, end, sysWorkTimes);
+            final Map<Short, DateRange> rangeMap;
+            if (OrgTypeEnum.YINGYE_WANGDIAN.getCode().equals(org.getType())&&ObjectUtil.isNotEmpty(listMap.get(org.getId()))){
+                rangeMap = splitTaskTime(plan.getExecTimes().shortValue(), EduTrainingPlanCycleEnum.toCommonEnum(plan.getPlanCycle()), start, end, listMap.get(org.getId()));
+            }else {
+                continue;
+            }
             int x = 0;
             for (Map.Entry<Short, DateRange> rangeEntry : rangeMap.entrySet()) {
                 final Short key = rangeEntry.getKey();
@@ -1088,19 +1089,10 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
         //营业的数据
         List<SysWorkTime> workTimeList = listMap.get(WORK);
         if (ObjectUtil.isNotEmpty(workTimeList)) {
-            //营业的机构id
-            List<Long> workOrgIdList = workTimeList.stream().map(SysWorkTime::getOrgId).collect(Collectors.toList());
-            List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectParentHs(workOrgIdList, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
-            final List<Long> collect = orgList.stream().map(SysOrg::getId).collect(Collectors.toList());
+
             //查询需要生成任务的机构的计划
             //List<Integer> cycleList = DateUtils.checkDate(today);
-            List<CoreEduTrainingPlan> cyclePlanList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
-                    .eq(CoreEduTrainingPlan::getStandard, 0)
-                    .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
-                    .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.DAILY.getCode())
-                    .eq(CoreEduTrainingPlan::getDeleted, 0)
-                    .in(CoreEduTrainingPlan::getBelongOrgId, collect)
-                    .select(CoreEduTrainingPlan::getId, CoreEduTrainingPlan::getPlanCycle));
+            final List<CoreEduTrainingPlan> cyclePlanList = selectPlanList(workTimeList);
             //无周期任务补录
             /*List<CoreEduTrainingPlan> unCyclePlanList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
                     .eq(CoreEduTrainingPlan::getStandard, 0)
@@ -1118,6 +1110,19 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
 
     }
 
+    private List<CoreEduTrainingPlan> selectPlanList(List<SysWorkTime> workTimeList){
+        //营业的机构id
+        List<Long> workOrgIdList = workTimeList.stream().map(SysWorkTime::getOrgId).collect(Collectors.toList());
+        List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectParentHs(workOrgIdList, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        final List<Long> collect = orgList.stream().map(SysOrg::getId).collect(Collectors.toList());
+        return coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
+               // .eq(CoreEduTrainingPlan::getStandard, 0)
+                .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
+                .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.DAILY.getCode())
+                .eq(CoreEduTrainingPlan::getDeleted, 0)
+                .in(CoreEduTrainingPlan::getBelongOrgId, collect)
+                .select(CoreEduTrainingPlan::getId, CoreEduTrainingPlan::getPlanCycle,CoreEduTrainingPlan::getPlanName));
+    }
 
     private void dealTimeWorkChangeForWeekly(WorkTimeChangeEvent event, String todayStr, List<SysWorkTime> futureWorkTime) {
         List<Long> orgIds = event.getOrgIds();
@@ -1157,7 +1162,7 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
         final List<Long> collect = orgList.stream().map(SysOrg::getId).collect(Collectors.toList());
         //查询需要生成任务的机构的计划
         List<CoreEduTrainingPlan> planList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
-                .eq(CoreEduTrainingPlan::getStandard, 0)
+                //.eq(CoreEduTrainingPlan::getStandard, 0)
                 .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
                 .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.WEEKLY.getCode())
                 .eq(CoreEduTrainingPlan::getDeleted, 0)
@@ -1203,7 +1208,7 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
 
         //查询需要生成任务的机构的计划
         List<CoreEduTrainingPlan> planList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
-                .eq(CoreEduTrainingPlan::getStandard, 0)
+                //.eq(CoreEduTrainingPlan::getStandard, 0)
                 .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
                 .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.MONTHLY.getCode())
                 .eq(CoreEduTrainingPlan::getDeleted, 0)
@@ -1249,7 +1254,7 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
 
         //查询需要生成任务的机构的计划
         List<CoreEduTrainingPlan> planList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
-                .eq(CoreEduTrainingPlan::getStandard, 0)
+                //.eq(CoreEduTrainingPlan::getStandard, 0)
                 .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
                 .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.QUARTERLY.getCode())
                 .eq(CoreEduTrainingPlan::getDeleted, 0)
@@ -1295,7 +1300,7 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
 
         //查询需要生成任务的机构的计划
         List<CoreEduTrainingPlan> planList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
-                .eq(CoreEduTrainingPlan::getStandard, 0)
+                //.eq(CoreEduTrainingPlan::getStandard, 0)
                 .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
                 .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.HALF_YEARLY.getCode())
                 .eq(CoreEduTrainingPlan::getDeleted, 0)
@@ -1342,7 +1347,7 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
 
         //查询需要生成任务的机构的计划
         List<CoreEduTrainingPlan> planList = coreEduTrainingPlanMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingPlan>()
-                .eq(CoreEduTrainingPlan::getStandard, 0)
+                //.eq(CoreEduTrainingPlan::getStandard, 0)
                 .eq(CoreEduTrainingPlan::getPlanStatus, EduTrainingPlanStatus.USING.getCode())
                 .eq(CoreEduTrainingPlan::getPlanCycle, EduTrainingPlanCycleEnum.YEARLY.getCode())
                 .eq(CoreEduTrainingPlan::getDeleted, 0)