|
|
@@ -0,0 +1,700 @@
|
|
|
+package com.xunmei.core.retrieval.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.date.DateField;
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.xunmei.common.core.constant.ErrorMsgConstants;
|
|
|
+import com.xunmei.common.core.constant.SecurityConstants;
|
|
|
+import com.xunmei.common.core.domain.DateRange;
|
|
|
+import com.xunmei.common.core.domain.retrieval.domain.CoreMonitoringRetrievalTask;
|
|
|
+import com.xunmei.common.core.domain.retrieval.vo.*;
|
|
|
+import com.xunmei.common.core.enums.RetrievalTaskCycle;
|
|
|
+import com.xunmei.common.core.enums.edu.EduTrainingPlanCycleEnum;
|
|
|
+import com.xunmei.common.core.event.WorkTimeChangeEvent;
|
|
|
+import com.xunmei.common.core.utils.DateUtils;
|
|
|
+import com.xunmei.common.core.utils.Ymd;
|
|
|
+import com.xunmei.common.security.utils.SecurityUtils;
|
|
|
+import com.xunmei.core.access.domain.TMonitoringRetrievalPlan;
|
|
|
+import com.xunmei.core.access.mapper.CoreMonitoringTaskRegistrationMapper;
|
|
|
+import com.xunmei.core.access.service.ITMonitoringRetrievalPlanService;
|
|
|
+import com.xunmei.core.retrieval.mapper.CoreMonitoringRetrievalTaskMapper;
|
|
|
+import com.xunmei.core.retrieval.service.ICoreMonitoringRetrievalTaskBuilderService;
|
|
|
+import com.xunmei.core.safetyindex.mapper.CoreSafetyExceptionDataMapper;
|
|
|
+import com.xunmei.system.api.RemoteOrgService;
|
|
|
+import com.xunmei.system.api.RemoteWorkTimeService;
|
|
|
+import com.xunmei.system.api.domain.SysOrg;
|
|
|
+import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.time.*;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 监控调阅任务Service业务层处理
|
|
|
+ *
|
|
|
+ * @author xunmei
|
|
|
+ * @date 2023-08-25
|
|
|
+ */
|
|
|
+@Lazy
|
|
|
+@Service
|
|
|
+public class CoreMonitoringRetrievalTaskBuilderServiceImpl extends ServiceImpl<CoreMonitoringRetrievalTaskMapper, CoreMonitoringRetrievalTask>
|
|
|
+ implements ICoreMonitoringRetrievalTaskBuilderService {
|
|
|
+ @Resource
|
|
|
+ private CoreMonitoringRetrievalTaskMapper coreMonitoringRetrievalTaskMapper;
|
|
|
+ @Resource
|
|
|
+ private RemoteOrgService orgService;
|
|
|
+ @Resource
|
|
|
+ private ITMonitoringRetrievalPlanService itMonitoringRetrievalPlanService;
|
|
|
+ @Autowired
|
|
|
+ private CoreMonitoringTaskRegistrationMapper coreMonitoringTaskRegistrationMapper;
|
|
|
+ @Autowired
|
|
|
+ RemoteWorkTimeService workTimeService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ CoreSafetyExceptionDataMapper exceptionDataMapper;
|
|
|
+
|
|
|
+ @Async
|
|
|
+ /**
|
|
|
+ * 无周期任务生成
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void noCycleTask(List<TMonitoringRetrievalPlan> planList) {
|
|
|
+ List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList = new ArrayList<>();
|
|
|
+ LocalDate taskTime = planList.get(0).getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
|
|
+ for (TMonitoringRetrievalPlan plan : planList) {
|
|
|
+ //获取计划关联的机构
|
|
|
+ List<SysOrg> listByType = orgList.stream().filter(r -> r.getId().equals(plan.getOrgId()) && r.getDeleted() == 0 && r.getIsLock().equals(0))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isNotEmpty(listByType)) {
|
|
|
+ List<CoreMonitoringRetrievalTask> list = this.buildCoreMonitoringRetrievalTask(plan, taskTime, listByType.get(0));
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ taskList.addAll(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //立即生效的计划要排除截至时间在当前时间之前的数据
|
|
|
+ List<CoreMonitoringRetrievalTask> lista = taskList.stream().filter(r -> r.getPlanEndTime().after(new Date())).collect(Collectors.toList());
|
|
|
+/* if (CollectionUtil.isNotEmpty(lista)) {
|
|
|
+ this.saveBatch(lista);
|
|
|
+ }*/
|
|
|
+ if (CollectionUtil.isNotEmpty(lista)) {
|
|
|
+ List<CoreMonitoringRetrievalTask> listAll = new ArrayList<>();
|
|
|
+ //对list进行重新编号和保存
|
|
|
+ //对lista 按机构进行分组
|
|
|
+ Map<Long, List<CoreMonitoringRetrievalTask>> map = lista.stream().collect(Collectors.groupingBy(CoreMonitoringRetrievalTask::getOrgId));
|
|
|
+ for (Long orgId : map.keySet()) {
|
|
|
+ List<CoreMonitoringRetrievalTask> listb = map.get(orgId);
|
|
|
+ for (int i = 0; i < listb.size(); i++) {
|
|
|
+ listb.get(i).setOrderNum(i + 1);
|
|
|
+ // 第" + frequency + "次调阅
|
|
|
+ String oldName = listb.get(i).getTaskName();
|
|
|
+ String str = "第" + (i + 1) + "次调阅";
|
|
|
+ int index = oldName.lastIndexOf("第");
|
|
|
+ if (index > 0) {
|
|
|
+ listb.get(i).setTaskName(oldName.substring(0, index) + str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ listAll.addAll(listb);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.saveBatch(listAll);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 每天生成日任务 如果当天是周一还需生成周任务
|
|
|
+ *
|
|
|
+ * @param taskTime
|
|
|
+ */
|
|
|
+ @Async
|
|
|
+ @Override
|
|
|
+ public void dayTask(LocalDate taskTime) {
|
|
|
+ if (ObjectUtil.isEmpty(taskTime)) {
|
|
|
+ taskTime = LocalDate.now();
|
|
|
+ }
|
|
|
+
|
|
|
+ List<CoreMonitoringRetrievalTask> list = new ArrayList<>();
|
|
|
+ //获取所有机构
|
|
|
+ List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
|
|
|
+ //是周一生成周任务
|
|
|
+ if (taskTime.getDayOfWeek() == DayOfWeek.MONDAY) {
|
|
|
+ List<CoreMonitoringRetrievalTask> listWeek = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.WEEKCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listWeek)) {
|
|
|
+ list.addAll(listWeek);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //生成每日任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listDay = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.DAYCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listDay)) {
|
|
|
+ list.addAll(listDay);
|
|
|
+ }
|
|
|
+ this.saveBatch(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 1.1生成周期为每月,每季,每半年,每年的任务
|
|
|
+ * 4.1||10.1日生成周期为每月,每季
|
|
|
+ * 7.1日获取执行周期为每月,每季,每半年的
|
|
|
+ * 其他日期生成月任务
|
|
|
+ *
|
|
|
+ * @param taskTime
|
|
|
+ */
|
|
|
+ @Async
|
|
|
+ @Override
|
|
|
+ public void monthTask(LocalDate taskTime) {
|
|
|
+ if (ObjectUtil.isEmpty(taskTime)) {
|
|
|
+ taskTime = LocalDate.now();
|
|
|
+ }
|
|
|
+ List<CoreMonitoringRetrievalTask> list = new ArrayList<>();
|
|
|
+ //获取所有机构
|
|
|
+ List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
|
|
|
+ //判断taskTime不是每月1号将taskTime设置为每月1号
|
|
|
+ if (taskTime.getDayOfMonth() != 1) {
|
|
|
+ taskTime = taskTime.withDayOfMonth(1);
|
|
|
+ }
|
|
|
+ //1.1生成周期为每月,每季,每半年,每年的任务
|
|
|
+ if (taskTime.getMonthValue() == 1) {
|
|
|
+ //季度任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listQuarter = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.QUARTERCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listQuarter)) {
|
|
|
+ list.addAll(listQuarter);
|
|
|
+ }
|
|
|
+ //半年任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listHalfYear = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.HALFYEARCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listHalfYear)) {
|
|
|
+ list.addAll(listHalfYear);
|
|
|
+ }
|
|
|
+ //年任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listYear = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.YEARCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listYear)) {
|
|
|
+ list.addAll(listYear);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //4.1||10.1日生成周期为每月,每季
|
|
|
+ if (taskTime.getMonthValue() == 4 || taskTime.getMonthValue() == 10) {
|
|
|
+ //季度任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listQuarter = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.QUARTERCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listQuarter)) {
|
|
|
+ list.addAll(listQuarter);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //7.1日获取执行周期为每月,每季,每半年的
|
|
|
+ if (taskTime.getMonthValue() == 7) {
|
|
|
+ //季度任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listQuarter = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.QUARTERCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listQuarter)) {
|
|
|
+ list.addAll(listQuarter);
|
|
|
+ }
|
|
|
+ //半年任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listHalfYear = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.HALFYEARCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listHalfYear)) {
|
|
|
+ list.addAll(listHalfYear);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //所有日期都要生成月任务
|
|
|
+ List<CoreMonitoringRetrievalTask> listMonth = this.buildCoreMonitoringRetrievalTask(RetrievalTaskCycle.MONTHCYCLE.getCode(), taskTime, orgList);
|
|
|
+ if (CollectionUtil.isNotEmpty(listMonth)) {
|
|
|
+ list.addAll(listMonth);
|
|
|
+ }
|
|
|
+ this.saveBatch(list);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CoreMonitoringRetrievalTaskOneVo selectCoreMonitoringRetrievalTaskOneVoById(Long id) {
|
|
|
+ CoreMonitoringRetrievalTaskOneVo retrievalTaskOneVo = coreMonitoringRetrievalTaskMapper.selectOneById(id);
|
|
|
+ List<TaskDataVo> taskDataVoList = coreMonitoringRetrievalTaskMapper.selectTaskDataVoListByRetrievalTaskId(id);
|
|
|
+ retrievalTaskOneVo.setTaskDataVoList(taskDataVoList);
|
|
|
+ return retrievalTaskOneVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateTaskStart() {
|
|
|
+ Date dateTimeNew = DateUtil.beginOfDay(new Date());
|
|
|
+ coreMonitoringRetrievalTaskMapper.updateTaskStart(dateTimeNew);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void initializationTask() {
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ LocalDate yesterday = today.minusDays(1);
|
|
|
+ //初始化任务
|
|
|
+ coreMonitoringRetrievalTaskMapper.initializationTask(yesterday.toString());
|
|
|
+ List<Long> longs = coreMonitoringRetrievalTaskMapper.selectTaskByTime(yesterday.toString());
|
|
|
+ //删除关联
|
|
|
+ longs.forEach(l -> {
|
|
|
+ coreMonitoringTaskRegistrationMapper.deleteByTaskId(l);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int initializationTask(Long id) {
|
|
|
+ int i = 0;
|
|
|
+ i = coreMonitoringRetrievalTaskMapper.initializationTaskByHand(id);
|
|
|
+ i = coreMonitoringTaskRegistrationMapper.deleteByTaskId(id);
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteTaskByPlanId(Long planId) {
|
|
|
+ coreMonitoringRetrievalTaskMapper.deleteTaskByPlanId(planId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteAllTaskByPlanId(Long planId) {
|
|
|
+ coreMonitoringRetrievalTaskMapper.deleteAllTaskByPlanId(planId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteAllTaskByPlanIds(List<Long> planId) {
|
|
|
+ Long[] longs = planId.toArray(new Long[planId.size()]);
|
|
|
+ // coreMonitoringRetrievalTaskMapper.deleteAllTaskByPlanIds(longs);
|
|
|
+
|
|
|
+ QueryWrapper queryWrapper = new QueryWrapper();
|
|
|
+ queryWrapper.in("plan_id", longs);
|
|
|
+ coreMonitoringRetrievalTaskMapper.delete(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteDayTaskByPlanId(Long planId, String cycle, LocalDate ymdDate) {
|
|
|
+ String date = null;
|
|
|
+ if (null != ymdDate) {
|
|
|
+ date = ymdDate.toString();
|
|
|
+ }
|
|
|
+ coreMonitoringRetrievalTaskMapper.deleteDayTaskByPlanId(planId, cycle, date);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteDayTaskByTime(Long planId, String cycle, Date startTime, Date endTime) {
|
|
|
+ coreMonitoringRetrievalTaskMapper.deleteDayTaskByTime(planId, cycle, startTime, endTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteDayTaskByTimeAndPlanId(Long planId, String cycle, Date startTime, Date endTime) {
|
|
|
+ coreMonitoringRetrievalTaskMapper.deleteDayTaskByTimeAndPlanId(planId, cycle, startTime, endTime);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteWaitTaskByPlanId(Long planId) {
|
|
|
+ coreMonitoringRetrievalTaskMapper.deleteWaitTaskByPlanId(planId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateDeleteTaskByPlanId(Long planId, Integer isDeleted) {
|
|
|
+ coreMonitoringRetrievalTaskMapper.updateDeleteTaskByPlanId(planId, isDeleted);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param cycle 周期
|
|
|
+ * @param taskTime 日期
|
|
|
+ * @param orgList 机构
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+
|
|
|
+ private List<CoreMonitoringRetrievalTask> buildCoreMonitoringRetrievalTask(Integer cycle, LocalDate taskTime, List<SysOrg> orgList) {
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList = new ArrayList<>();
|
|
|
+ //获取计划
|
|
|
+ QueryWrapper<TMonitoringRetrievalPlan> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getPlanCycle, cycle);
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getPlanStatus, 1);
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getIsDeleted, 0);
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getCreateType, 1);
|
|
|
+ List<TMonitoringRetrievalPlan> plans = itMonitoringRetrievalPlanService.list(queryWrapper);
|
|
|
+ List<TMonitoringRetrievalPlan> planList = new ArrayList<>(16);
|
|
|
+ for (TMonitoringRetrievalPlan p : plans) {
|
|
|
+ /* SysOrg sysOrg = new SysOrg();
|
|
|
+ sysOrg.setPath(p.getOrgPath());
|
|
|
+ sysOrg.setType(Integer.valueOf(p.getOrgType()));
|
|
|
+ List<SysOrg> sysOrgs = remoteOrgService.listByParentIdAndType(sysOrg, SecurityConstants.INNER);*/
|
|
|
+ List<SysOrg> sysOrgs = orgList.stream().
|
|
|
+ filter(s -> s.getPath().contains(p.getOrgPath()) && (s.getType() != null && s.getType().toString().equals(p.getOrgType())))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ for (SysOrg s : sysOrgs) {
|
|
|
+ TMonitoringRetrievalPlan plan = new TMonitoringRetrievalPlan();
|
|
|
+ BeanUtils.copyProperties(p, plan);
|
|
|
+ plan.setPlanName(p.getPlanName());
|
|
|
+ plan.setOrgId(s.getId());
|
|
|
+ plan.setOrgName(s.getShortName());
|
|
|
+ plan.setRoleId(p.getRoleId());
|
|
|
+ plan.setRoleName(p.getRoleName());
|
|
|
+ plan.setOrgPath(s.getPath());
|
|
|
+ plan.setOrgType(p.getOrgType());
|
|
|
+ plan.setPlanCycle(p.getPlanCycle());
|
|
|
+ plan.setPlanFrequency(p.getPlanFrequency());
|
|
|
+ plan.setPlanStatus(0);
|
|
|
+ plan.setCreateBy(SecurityUtils.getUsername());
|
|
|
+ plan.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ plan.setUpdateBy(SecurityUtils.getUsername());
|
|
|
+ plan.setCreateTime(DateUtils.getNowDate());
|
|
|
+ plan.setDescription(p.getDescription());
|
|
|
+ plan.setCreateType(1);
|
|
|
+ plan.setParentId(p.getId());
|
|
|
+ plan.setIsDistribute("1");
|
|
|
+ planList.add(plan);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //按计划生成任务
|
|
|
+ for (TMonitoringRetrievalPlan plan : planList) {
|
|
|
+ //获取计划关联的机构
|
|
|
+ List<SysOrg> listByType = orgList.stream().filter(r -> r.getId().equals(plan.getOrgId()) && r.getDeleted() == 0 && r.getIsLock().equals(0))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isNotEmpty(listByType)) {
|
|
|
+ List<CoreMonitoringRetrievalTask> list = this.buildCoreMonitoringRetrievalTask(plan, taskTime, listByType.get(0));
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ taskList.addAll(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return taskList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param plan 计划
|
|
|
+ * @param taskTime 日期
|
|
|
+ * @param sysOrg 机构
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<CoreMonitoringRetrievalTask> buildCoreMonitoringRetrievalTask(TMonitoringRetrievalPlan plan, LocalDate taskTime, SysOrg sysOrg) {
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList = new ArrayList<>();
|
|
|
+ Long batchNum = IdWorker.getId();
|
|
|
+
|
|
|
+
|
|
|
+ Date dateTime = Date.from(taskTime.atStartOfDay(ZoneId.systemDefault()).toInstant());
|
|
|
+ Ymd ymd = Ymd.of(dateTime);
|
|
|
+ DateRange dateRange = null;
|
|
|
+ if (Integer.parseInt(plan.getPlanCycle()) == RetrievalTaskCycle.NOCYCLE.getCode()) {
|
|
|
+ //无周期任务获取计划时间//重计划中获取
|
|
|
+ dateRange = new DateRange(DateUtil.beginOfDay(plan.getStartTime()).setField(DateField.MILLISECOND, 0), DateUtil.endOfDay(plan.getEndTime()).setField(DateField.MILLISECOND, 0));
|
|
|
+ } else {
|
|
|
+ //周期任务获取计划时间
|
|
|
+ dateRange = DateUtils.getStartAndEnd(dateTime, EduTrainingPlanCycleEnum.toCommmonEnum(Integer.parseInt(plan.getPlanCycle())));
|
|
|
+ }
|
|
|
+ Map<Integer, DateRange> dateRanges = DateUtils.splitDateRange(dateRange.getStartTime(), dateRange.getEndTime(), plan.getPlanFrequency().intValue());
|
|
|
+ //判断作息(无周期排开)
|
|
|
+// if (!plan.getPlanCycle().equals(RetrievalTaskCycle.NOCYCLE.getCode().toString())) {
|
|
|
+ int idx = 1;
|
|
|
+ Map<Integer, DateRange> workingDateRanges = new HashMap<>();
|
|
|
+ for (Integer key : dateRanges.keySet()) {
|
|
|
+ DateRange dateRange1 = dateRanges.get(key);
|
|
|
+ boolean flag = checkWorkTime(dateRange1.getStartTime(), dateRange1.getEndTime(), sysOrg.getId());
|
|
|
+ if (flag == true && dateRange1.getEndTime().after(new Date())) {
|
|
|
+ workingDateRanges.put(idx, dateRange1);
|
|
|
+ idx++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Integer integer : workingDateRanges.keySet()) {
|
|
|
+ DateRange dateRange1 = workingDateRanges.get(integer);
|
|
|
+ CoreMonitoringRetrievalTask task = this.buildCoreMonitoringRetrievalTask(batchNum, integer, plan, sysOrg, dateRange1, ymd, workingDateRanges.size());
|
|
|
+ taskList.add(task);
|
|
|
+ }
|
|
|
+
|
|
|
+ return taskList;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param batchNum 批次
|
|
|
+ * @param frequency 第几次
|
|
|
+ * @param plan 计划
|
|
|
+ * @param sysOrg 机构
|
|
|
+ * @param ymd 日期
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private CoreMonitoringRetrievalTask buildCoreMonitoringRetrievalTask(Long batchNum, int frequency, TMonitoringRetrievalPlan plan, SysOrg sysOrg, DateRange dateRange, Ymd ymd, int totalNumber) {
|
|
|
+/* Date dateTime = Date.from(taskTime.atStartOfDay(ZoneId.systemDefault()).toInstant());
|
|
|
+ Ymd ymd = Ymd.of(dateTime);
|
|
|
+ DateRange dateRange = null;
|
|
|
+ if (Integer.parseInt(plan.getPlanCycle()) == RetrievalTaskCycle.NOCYCLE.getCode()) {
|
|
|
+ //无周期任务获取计划时间//重计划中获取
|
|
|
+ dateRange = new DateRange(DateUtil.beginOfDay(plan.getStartTime()).setField(DateField.MILLISECOND, 0), DateUtil.endOfDay(plan.getEndTime()).setField(DateField.MILLISECOND, 0));
|
|
|
+ } else {
|
|
|
+ //周期任务获取计划时间
|
|
|
+ dateRange = DateUtils.getStartAndEnd(dateTime, Integer.parseInt(plan.getPlanCycle()));
|
|
|
+ }*/
|
|
|
+ CoreMonitoringRetrievalTask task = new CoreMonitoringRetrievalTask();
|
|
|
+ task.setId(IdWorker.getId());
|
|
|
+ if (totalNumber > 1) {
|
|
|
+ task.setTaskName(plan.getPlanName() + "第" + frequency + "次调阅");
|
|
|
+ } else {
|
|
|
+ task.setTaskName(plan.getPlanName() + "调阅任务");
|
|
|
+ }
|
|
|
+ task.setCycle(plan.getPlanCycle());
|
|
|
+ task.setOrgId(sysOrg.getId());
|
|
|
+ task.setOrgPath(sysOrg.getPath());
|
|
|
+ task.setOrgName(sysOrg.getShortName());
|
|
|
+ task.setBatchNum(batchNum);
|
|
|
+ task.setPlanId(plan.getId());
|
|
|
+ task.setOrderNum(frequency);
|
|
|
+ task.setPlanStartTime(DateTime.of(dateRange.getStartTime()).setField(DateField.MILLISECOND, 0));
|
|
|
+ task.setPlanEndTime(DateTime.of(dateRange.getEndTime()).setField(DateField.MILLISECOND, 0));
|
|
|
+ task.setYmdDate(ymd.getDate());
|
|
|
+ task.setYmdYear(ymd.getYear());
|
|
|
+ task.setYmdHalfyear(ymd.getHalfyear());
|
|
|
+ task.setYmdQuarter(ymd.getQuarter());
|
|
|
+ task.setYmdMonth(ymd.getMonth());
|
|
|
+ task.setYmdWeek(ymd.getWeek());
|
|
|
+ task.setYmdDay(ymd.getDay());
|
|
|
+ task.setRoleId(plan.getRoleId());
|
|
|
+ task.setStatus("0");
|
|
|
+ task.setCreateTime(DateTime.now());
|
|
|
+ task.setIsDeleted(0);
|
|
|
+ return task;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void taskChangeForTimeWorkChange(WorkTimeChangeEvent event) {
|
|
|
+ //修改的作息的日期
|
|
|
+ Date ymdDate = event.getDataList().get(0).getYmdDate();
|
|
|
+
|
|
|
+ //受影响的机构
|
|
|
+ List<Long> orgIds = event.getOrgIds();
|
|
|
+ /* //测试用的数据
|
|
|
+ Date ymdDate = new Date();
|
|
|
+ //受影响的机构
|
|
|
+ List<Long> orgIds = new ArrayList<>();
|
|
|
+ orgIds.add(4358025846521957L);
|
|
|
+ orgIds.add(4358025846456575L);*/
|
|
|
+ //判断ymdDate是否是当天
|
|
|
+ Date today = new Date();
|
|
|
+ //要删除的任务
|
|
|
+ List<CoreMonitoringRetrievalTask> deleteTaskList = new ArrayList<>();
|
|
|
+ //要重新生成任务的机构和计划
|
|
|
+ List<KeyValueVo> keyValues = new ArrayList<>();
|
|
|
+
|
|
|
+ Map<String, Object> dayObjectMap = null;
|
|
|
+ Map<String, Object> weekObjectMap = null;
|
|
|
+ Map<String, Object> monthObjectMap = null;
|
|
|
+ Map<String, Object> quarterObjectMap = null;
|
|
|
+ Map<String, Object> halfYearObjectMap = null;
|
|
|
+ Map<String, Object> yearObjectMap = null;
|
|
|
+ //判断ymdDate 月today是否是同一日期
|
|
|
+ if (DateUtil.isSameDay(ymdDate, today)) {
|
|
|
+ //获取当天的调阅任务
|
|
|
+ dayObjectMap = this.deleteTaskList(ymdDate, orgIds, RetrievalTaskCycle.DAYCYCLE.getCode());
|
|
|
+ }
|
|
|
+ weekObjectMap = this.deleteTaskList(ymdDate, orgIds, RetrievalTaskCycle.WEEKCYCLE.getCode());
|
|
|
+ monthObjectMap = this.deleteTaskList(ymdDate, orgIds, RetrievalTaskCycle.MONTHCYCLE.getCode());
|
|
|
+ quarterObjectMap = this.deleteTaskList(ymdDate, orgIds, RetrievalTaskCycle.QUARTERCYCLE.getCode());
|
|
|
+ halfYearObjectMap = this.deleteTaskList(ymdDate, orgIds, RetrievalTaskCycle.HALFYEARCYCLE.getCode());
|
|
|
+ yearObjectMap = this.deleteTaskList(ymdDate, orgIds, RetrievalTaskCycle.YEARCYCLE.getCode());
|
|
|
+
|
|
|
+ Map<String, Object> allMap = this.buildDeleteTaskList(dayObjectMap, weekObjectMap, monthObjectMap, quarterObjectMap, halfYearObjectMap, yearObjectMap);
|
|
|
+ deleteTaskList = (List<CoreMonitoringRetrievalTask>) allMap.get("deleteTaskList");
|
|
|
+ keyValues = (List<KeyValueVo>) allMap.get("keyValues");
|
|
|
+ //删除任务
|
|
|
+ if (CollectionUtil.isNotEmpty(deleteTaskList)) {
|
|
|
+ this.removeBatchByIds(deleteTaskList);
|
|
|
+ }
|
|
|
+ //生成新的任务
|
|
|
+ // if(CollectionUtil.isNotEmpty(keyValues)){
|
|
|
+ this.rebuildtask(keyValues, ymdDate, orgIds);
|
|
|
+ // }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> buildDeleteTaskList(Map<String, Object>... ObjMaps) {
|
|
|
+ Map<String, Object> deleteTaskListMap = new HashMap<>();
|
|
|
+ List<CoreMonitoringRetrievalTask> deleteTaskList = new ArrayList<>();
|
|
|
+ List<KeyValueVo> keyValues = new ArrayList<>();
|
|
|
+ for (Map<String, Object> objMap : ObjMaps) {
|
|
|
+ if (objMap != null && objMap.containsKey("deleteTaskList") && objMap.containsKey("keyValues")) {
|
|
|
+ List<CoreMonitoringRetrievalTask> listTask = (List<CoreMonitoringRetrievalTask>) objMap.get("deleteTaskList");
|
|
|
+ List<KeyValueVo> keyValueList = (List<KeyValueVo>) objMap.get("keyValues");
|
|
|
+ if (CollectionUtil.isNotEmpty(listTask)) {
|
|
|
+ deleteTaskList.addAll(listTask);
|
|
|
+ }
|
|
|
+ if (CollectionUtil.isNotEmpty(keyValueList)) {
|
|
|
+ keyValues.addAll(keyValueList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ deleteTaskListMap.put("deleteTaskList", deleteTaskList);
|
|
|
+ deleteTaskListMap.put("keyValues", keyValues);
|
|
|
+ return deleteTaskListMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void rebuildtask(List<KeyValueVo> keyValues, Date taskTime, List<Long> orgIds) {
|
|
|
+ //获取所有机构
|
|
|
+ List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
|
|
|
+ List<SysOrg> orgs = orgList.stream().filter(r -> orgIds.contains(r.getId())).collect(Collectors.toList());
|
|
|
+ //通过parentId获取orgList中orgs的直属上级
|
|
|
+// List<SysOrg> parentOrgList = orgList.stream().filter(r -> orgs.stream().anyMatch(s -> s.getParentId().equals(r.getId()))).collect(Collectors.toList());
|
|
|
+// List<Long> orgParentIds = parentOrgList.stream().map(r -> r.getId()).collect(Collectors.toList());
|
|
|
+
|
|
|
+ List<SysOrg> hsOrgs = orgService.selectParentHs(orgIds, SecurityConstants.INNER);
|
|
|
+ List<Long> hsOrgIds = hsOrgs.stream().map(SysOrg::getId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //获取计划
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList = new ArrayList<>();
|
|
|
+ QueryWrapper<TMonitoringRetrievalPlan> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().in(TMonitoringRetrievalPlan::getOrgId, hsOrgIds);
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getPlanStatus, 1);
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getIsDeleted, 0);
|
|
|
+ queryWrapper.lambda().eq(TMonitoringRetrievalPlan::getCreateType, 1);
|
|
|
+ //排除无周期的计划
|
|
|
+ queryWrapper.lambda().notIn(TMonitoringRetrievalPlan::getPlanCycle, 0);
|
|
|
+ List<TMonitoringRetrievalPlan> plans = itMonitoringRetrievalPlanService.list(queryWrapper);
|
|
|
+ List<TMonitoringRetrievalPlan> planList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (TMonitoringRetrievalPlan p : plans) {
|
|
|
+ for (SysOrg s : orgs) {
|
|
|
+ if (CollectionUtil.isNotEmpty(keyValues)) {
|
|
|
+ //机构和计划没有同时在排除的范围内的计划不生成任务
|
|
|
+ if (keyValues.stream().filter(r -> r.getValue().equals(p.getId()) && r.getKey().equals(s.getId())).count() > 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Optional<SysOrg> hsOrg = hsOrgs.stream().filter(hs -> s.getPath().startsWith(hs.getPath())).findFirst();
|
|
|
+ if(!hsOrg.isPresent()){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //计划的机构id不是当前机构的直属父机构,不生成任务,计划的机构类型不是当前机构的机构类型不生成任务
|
|
|
+ if (s.getType() != null && !s.getType().toString().equals(p.getOrgType())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ TMonitoringRetrievalPlan plan = new TMonitoringRetrievalPlan();
|
|
|
+ BeanUtils.copyProperties(p, plan);
|
|
|
+ plan.setPlanName(p.getPlanName());
|
|
|
+ plan.setOrgId(s.getId());
|
|
|
+ plan.setOrgName(s.getShortName());
|
|
|
+ plan.setRoleId(p.getRoleId());
|
|
|
+ plan.setRoleName(p.getRoleName());
|
|
|
+ plan.setOrgPath(s.getPath());
|
|
|
+ plan.setOrgType(p.getOrgType());
|
|
|
+ plan.setPlanCycle(p.getPlanCycle());
|
|
|
+ plan.setPlanFrequency(p.getPlanFrequency());
|
|
|
+ plan.setPlanStatus(0);
|
|
|
+ plan.setCreateBy(SecurityUtils.getUsername());
|
|
|
+ plan.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ plan.setUpdateBy(SecurityUtils.getUsername());
|
|
|
+ plan.setCreateTime(DateUtils.getNowDate());
|
|
|
+ plan.setDescription(p.getDescription());
|
|
|
+ plan.setCreateType(1);
|
|
|
+ plan.setParentId(p.getId());
|
|
|
+ plan.setIsDistribute("1");
|
|
|
+ planList.add(plan);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (TMonitoringRetrievalPlan plan : planList) {
|
|
|
+ //任务的开始时间按周期计算用下面的方式
|
|
|
+ DateRange dateRange = DateUtils.getStartAndEnd(taskTime, Integer.valueOf(plan.getPlanCycle()));
|
|
|
+ Instant instant = dateRange.getStartTime().toInstant();
|
|
|
+ // 创建 ZonedDateTime 对象,并指定时区
|
|
|
+ ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
|
|
|
+ // 转换为 LocalDate 对象
|
|
|
+ LocalDate localDate = zdt.toLocalDate();
|
|
|
+
|
|
|
+ //任务整体按周期日期计算,最终结果排除所修改的日期前面的数据
|
|
|
+ List<SysOrg> listByType = orgList.stream().filter(r -> r.getId().equals(plan.getOrgId()) && r.getDeleted() == 0 && r.getIsLock().equals(0)).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isNotEmpty(listByType)) {
|
|
|
+ List<CoreMonitoringRetrievalTask> list = this.buildCoreMonitoringRetrievalTask(plan, localDate, listByType.get(0));
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ if (!plan.getPlanCycle().equals(RetrievalTaskCycle.DAYCYCLE.getCode().toString())) {
|
|
|
+ List<CoreMonitoringRetrievalTask> lista = list.stream().filter(r -> r.getPlanEndTime().after(taskTime)).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isNotEmpty(lista)) {
|
|
|
+ taskList.addAll(lista);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<CoreMonitoringRetrievalTask> lista = list.stream().filter(r -> r.getPlanEndTime().after(new Date())).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isNotEmpty(lista)) {
|
|
|
+ taskList.addAll(lista);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.saveBatch(taskList);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> deleteTaskList(Date ymdDate, List<Long> orgIds, Integer cycle) {
|
|
|
+ Map<String, Object> objectMap = new HashMap<>();
|
|
|
+ QueryWrapper<CoreMonitoringRetrievalTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ //每日条件
|
|
|
+ Date datetime = ymdDate;
|
|
|
+ if (!cycle.equals(RetrievalTaskCycle.DAYCYCLE.getCode())) {
|
|
|
+ //根据ymdDate获取周的第一天的日期
|
|
|
+ DateRange dateRange = DateUtils.getStartAndEnd(ymdDate, cycle);
|
|
|
+ datetime = dateRange.getStartTime();
|
|
|
+ }
|
|
|
+ LocalDate taskTime = DateUtils.toLocalDate(datetime);
|
|
|
+/* queryWrapper.lambda().eq(CoreMonitoringRetrievalTask::getYmdDate,taskTime);
|
|
|
+ //公共条件
|
|
|
+ queryWrapper.lambda().in(CoreMonitoringRetrievalTask::getOrgId,orgIds);
|
|
|
+ queryWrapper.lambda().eq(CoreMonitoringRetrievalTask::getCycle,cycle);
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList = this.list(queryWrapper);*/
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList = baseMapper.selectTaskList(taskTime, orgIds, cycle);
|
|
|
+ List<CoreMonitoringRetrievalTask> deleteTaskList = new ArrayList<>();
|
|
|
+ List<KeyValueVo> keyValues = new ArrayList<>();
|
|
|
+ if (CollectionUtil.isNotEmpty(taskList)) {
|
|
|
+ //将数据按机构分组
|
|
|
+ Map<Long, List<CoreMonitoringRetrievalTask>> taskMap = taskList.stream().collect(Collectors.groupingBy(CoreMonitoringRetrievalTask::getOrgId));
|
|
|
+ for (Long key : taskMap.keySet()) {
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList1 = taskMap.get(key);
|
|
|
+ //将taskList1 按batchNum进行分组
|
|
|
+ Map<Long, List<CoreMonitoringRetrievalTask>> taskMap1 = taskList1.stream().collect(Collectors.groupingBy(CoreMonitoringRetrievalTask::getBatchNum));
|
|
|
+ for (Long key1 : taskMap1.keySet()) {
|
|
|
+ List<CoreMonitoringRetrievalTask> taskList2 = taskMap1.get(key1);
|
|
|
+ int num = (int) taskList2.stream().filter(t -> t.getStatus().equals(2)).count();
|
|
|
+ //没有完成的任务,改批次的任务删除
|
|
|
+ if (num == 0) {
|
|
|
+ deleteTaskList.addAll(taskList2);
|
|
|
+ } else {
|
|
|
+ Long planId = taskList2.get(0).getPlanId();
|
|
|
+ KeyValueVo keyValue = new KeyValueVo();
|
|
|
+ keyValue.setKey(key);
|
|
|
+ keyValue.setValue(planId);
|
|
|
+ keyValues.add(keyValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ objectMap.put("deleteTaskList", deleteTaskList);
|
|
|
+ objectMap.put("keyValues", keyValues);
|
|
|
+ return objectMap;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private boolean checkWorkTime(Date workstartTime, Date workendTime, Long orgId) {
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("workstartTime", DateUtil.format(workstartTime, "yyyy-MM-dd"));
|
|
|
+ map.put("workendTime", DateUtil.format(workendTime, "yyyy-MM-dd"));
|
|
|
+ map.put("orgId", orgId);
|
|
|
+ Integer num = workTimeService.checkWorkTime(map, SecurityConstants.INNER);
|
|
|
+ if (num > 0) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// private List<SysWorkTime> selectWorkTimeList(Date now, CycleCommonEnum cycle, WorkTimeChangeEvent event) {
|
|
|
+// DateRange range = DateUtils.getStartAndEnd(now, cycle);
|
|
|
+// 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();
|
|
|
+// }
|
|
|
+}
|