Browse Source

任务补偿: 履职/安全检查在任务下发一次存在完成任务后撤回并编辑机构再次下发后任务生成重复的问题;解决办法为在生成任务时查询是否存在同一机构下是否存在相同计划相同周期的任务

jingyuanchao 1 year ago
parent
commit
1df78c5077

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/ResumptionService.java

@@ -15,6 +15,7 @@ import com.xunmei.core.resumption.vo.AppRulePointTaskVo;
 import com.xunmei.core.resumption.vo.ResumptionAppVo;
 import com.xunmei.core.resumption.vo.ResumptionTaskNewDto;
 import com.xunmei.core.resumption.vo.WorkChangeResumptionVo;
+import com.xunmei.core.safetyCheck.domain.CoreSafetyTask;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -52,4 +53,6 @@ public interface ResumptionService extends IService<Resumption> {
     void findResumptionList(List<Long> orgIds,DateTime time);
 
     List<SafeScoreResumptionDataVo>  findSource(SafeScoreSourceDto request);
+
+    List<Resumption> selectTaskListByPlanId(Long planId);
 }

+ 10 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ResumptionServiceImpl.java

@@ -376,6 +376,16 @@ public class ResumptionServiceImpl extends ServiceImpl<ResumptionMapper, Resumpt
     }
 
     @Override
+    public List<Resumption> selectTaskListByPlanId(Long planId) {
+        LambdaQueryWrapper<Resumption> wrapper=new LambdaQueryWrapper<>();
+
+        wrapper.eq(Resumption::getPlanId,planId);
+
+
+        return baseMapper.selectList(wrapper);
+    }
+
+    @Override
     public List<SafeScoreResumptionDataVo> findSource(SafeScoreSourceDto request) {
 
 

+ 36 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.R;
@@ -32,6 +33,8 @@ import com.xunmei.core.resumption.mapper.AppPlanToExecOrgMapper;
 import com.xunmei.core.resumption.mapper.ResumptionMapper;
 import com.xunmei.core.resumption.service.IAppRulePointService;
 import com.xunmei.core.resumption.service.ResumptionService;
+import com.xunmei.core.safetyCheck.domain.CoreSafetyTask;
+import com.xunmei.core.safetyCheck.vo.PlanTaskBuildVo;
 import com.xunmei.system.api.Eto.OrgListByTypesConditionEto;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
@@ -474,11 +477,28 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
         return buildResumptions(appPlan, execOrg, planstartTime, planendTime, executedOrders, workTimes);
     }
 
+    //递归查找最早的计划id,任务在多次撤回编辑下发后任务id发生变化,为避免生成重复任务,需要查询到最初的计划来查询是否存在相同周期的任务来去重
+    private Long getReallyPlanId(Long planId, Long copyPlanId) {
+        if (ObjectUtil.equal(planId, copyPlanId)) {
+            return planId;
+        }
+        final AppPlan plan = appPlanMapper.getById(copyPlanId);
+        if (plan == null) {
+            return planId;
+        }
+        return getReallyPlanId(copyPlanId, plan.getSolidId());
+    }
+
     private List<Resumption> buildResumptions(AppPlan appPlan, SysOrg execOrg, Date planStartTime, Date planEndTime, List<Short> executedOrders, Map<Long, List<SysWorkTime>> allWorkTimes) {
         if (ObjectUtil.equal(execOrg.getIsLock(), 1)) {
             return new ArrayList<>();
         }
         Map<Short, DateRange> rangeMap = null;
+        List<Resumption> exitTaskList = new ArrayList<>();
+        if (ObjectUtil.notEqual(appPlan.getId(), appPlan.getSolidId())) {
+            Long planId = getReallyPlanId(appPlan.getId(), appPlan.getSolidId());
+            exitTaskList = resumptionService.selectTaskListByPlanId(planId);
+        }
 
 
         List<Resumption> resumptionList = new ArrayList<>();
@@ -550,6 +570,22 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
             resumption.setPlanEndTime(timeRange.getEndTime());
             resumption.setCreateTime(new Date());
             resumption.setTimes(realOrder);
+            if (!exitTaskList.isEmpty()) {
+                final Optional<Resumption> optional =   exitTaskList.stream().filter(t->{
+                    final String exitST = DateUtil.format(t.getPlanStartTime(), Constants.HMS_FORMAT);
+                    final String exitED = DateUtil.format(t.getPlanEndTime(), Constants.HMS_FORMAT);
+                    final String newST = DateUtil.format(resumption.getStartTime(), Constants.HMS_FORMAT);
+                    final String newED = DateUtil.format(resumption.getEndTime(), Constants.HMS_FORMAT);
+                    if (ObjectUtil.equal(exitST,newST)&&ObjectUtil.equal(exitED,newED)&&ObjectUtil.equal(t.getOrgId(), resumption.getOrgId())){
+                        return true;
+                    }
+                    return false;
+                }).findAny();
+                if (optional.isPresent()){
+                    log.info("安全检查任务生成时,发现计划{}已存在相同周期任务",appPlan.getPlanName());
+                    continue;
+                }
+            }
             resumptionList.add(resumption);
         }
 

+ 51 - 16
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.worktime.domain.SysWorkTime;
@@ -96,7 +97,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      * @throws Exception
      */
     public void createTaskForCycle(DateTime dateTime, Date start, Date end, CoreSafecheckPlan plan, Boolean isNeedSendTodo, Integer sourceType) throws Exception {
-        List<PlanTaskBuildVo> planTask = createPlanTask(plan,new ArrayList<>());
+        List<PlanTaskBuildVo> planTask = createPlanTask(plan, new ArrayList<>());
         //生成具体任务
         buildTask(dateTime, planTask, start, end, isNeedSendTodo, sourceType);
     }
@@ -159,7 +160,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
 
         List<PlanTaskBuildVo> tasks = new ArrayList<>();
         for (CoreSafecheckPlan plan : plans) {
-            List<PlanTaskBuildVo> planTask = createPlanTask(plan,new ArrayList<>());
+            List<PlanTaskBuildVo> planTask = createPlanTask(plan, new ArrayList<>());
             tasks.addAll(planTask);
         }
 
@@ -175,23 +176,22 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      */
     @Async
     public void createTaskByPlans(List<CoreSafecheckPlan> plans) {
-        createTask(plans,null);
+        createTask(plans, null);
     }
 
     @Async
-    public void createTaskByPlans(List<CoreSafecheckPlan> plans,Long parentPlanId) {
-        String redisKey="SafeCheck_Creating_Task" + parentPlanId;
+    public void createTaskByPlans(List<CoreSafecheckPlan> plans, Long parentPlanId) {
+        String redisKey = "SafeCheck_Creating_Task" + parentPlanId;
         RedisUtils.deleteObject(redisKey);
         Boolean hasKey = RedisUtils.hasKey(redisKey);
         if (!hasKey) {
-            RedisUtils.setCacheObject(redisKey, parentPlanId, Duration.ofMillis(1000 * 60*5));
+            RedisUtils.setCacheObject(redisKey, parentPlanId, Duration.ofMillis(1000 * 60 * 5));
         }
-        createTask(plans,null);
+        createTask(plans, null);
         RedisUtils.deleteObject(redisKey);
     }
 
-    public void createTask(List<CoreSafecheckPlan> plans,List<Long> needBuildTaskOrgIds)
-    {
+    public void createTask(List<CoreSafecheckPlan> plans, List<Long> needBuildTaskOrgIds) {
         try {
             if (plans != null && plans.size() > 0) {
                 DateTime datetime = new DateTime();
@@ -207,13 +207,13 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
                     if (ObjectUtil.notEqual(plan.getPlanStatus(), PlanStatus.USING.getCode())) {
                         continue;
                     }
-                    List<PlanTaskBuildVo> planTask = createPlanTask(plan,needBuildTaskOrgIds);
+                    List<PlanTaskBuildVo> planTask = createPlanTask(plan, needBuildTaskOrgIds);
                     tasks.addAll(planTask);
                 }
 
                 String collect = tasks.stream().map(t -> t.getExecOrg().getId()).distinct().map(String::valueOf).collect(Collectors.joining(","));
-                System.out.println("("+collect+")");
-                System.out.println("("+collect.split(",").length+")");
+                System.out.println("(" + collect + ")");
+                System.out.println("(" + collect.split(",").length + ")");
 
                 //生成具体任务
                 buildTask(datetime, tasks, dateRange.getStartTime(), dateRange.getEndTime(), true, 0);
@@ -228,7 +228,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      *
      * @param plan
      */
-    private List<PlanTaskBuildVo> createPlanTask(CoreSafecheckPlan plan,List<Long> needBuildTaskOrgIds) {
+    private List<PlanTaskBuildVo> createPlanTask(CoreSafecheckPlan plan, List<Long> needBuildTaskOrgIds) {
 
         List<PlanTaskBuildVo> list = new ArrayList<>();
         Integer execOrgType = Math.toIntExact(plan.getExecOrgType());
@@ -295,7 +295,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
             checkOrgs = checkOrgs.stream().filter(o -> o.getIsLock() < 1).collect(Collectors.toList());
             if (ObjectUtil.isNotEmpty(needBuildTaskOrgIds)) {
                 //此处是运维接口需要指定生成某个机构的情况下需要过滤
-                checkOrgs=checkOrgs.stream().filter(o->needBuildTaskOrgIds.contains(o.getId())).collect(Collectors.toList());
+                checkOrgs = checkOrgs.stream().filter(o -> needBuildTaskOrgIds.contains(o.getId())).collect(Collectors.toList());
             }
             //构建数据
             List<PlanTaskBuildVo> bs = getBuild(plan, org, checkOrgs, roles);
@@ -405,6 +405,18 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
         return list;
     }
 
+    //递归查找最早的计划id,任务在多次撤回编辑下发后任务id发生变化,为避免生成重复任务,需要查询到最初的计划来查询是否存在相同周期的任务来去重
+    private Long getReallyPlanId(Long planId, Long copyPlanId) {
+        if (ObjectUtil.equal(planId, copyPlanId)) {
+            return planId;
+        }
+        final CoreSafecheckPlan plan = planMapper.get(copyPlanId);
+        if (plan == null) {
+            return planId;
+        }
+        return getReallyPlanId(copyPlanId, plan.getSolidId());
+    }
+
     /**
      * 构建任务所需条件
      *
@@ -415,6 +427,12 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      * @return
      */
     private List<PlanTaskBuildVo> getBuild(CoreSafecheckPlan plan, SysOrg check, List<SysOrg> execOrgList, List<CoreSafecheckPlanToRole> roles) {
+        List<CoreSafetyTask> exitTaskList = new ArrayList<>();
+        if (ObjectUtil.notEqual(plan.getId(), plan.getSolidId())) {
+            Long planId = getReallyPlanId(plan.getId(), plan.getSolidId());
+            exitTaskList = checkTaskService.selectTaskListByPlanId(planId);
+        }
+
 
         List<PlanTaskBuildVo> list = new ArrayList<>();
 
@@ -470,12 +488,29 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
                 vo.setCount((int) i);
                 vo.setPlanCycle(Math.toIntExact(plan.getPlanCycle()));
                 //任务名称去除为1
-                if (rangeMap.size()<=1) {
+                if (rangeMap.size() <= 1) {
                     vo.setPlanName(plan.getPlanName());
                 } else {
                     vo.setPlanName(plan.getPlanName() + "第" + cou + "次");
                 }
                 cou++;
+                if (!exitTaskList.isEmpty()) {
+                    PlanTaskBuildVo finalVo = vo;
+                    final Optional<CoreSafetyTask> optional =   exitTaskList.stream().filter(t->{
+                        final String exitST = DateUtil.format(t.getPlanStartTime(), Constants.HMS_FORMAT);
+                        final String exitED = DateUtil.format(t.getPlanEndTime(), Constants.HMS_FORMAT);
+                        final String newST = DateUtil.format(finalVo.getStartTime(), Constants.HMS_FORMAT);
+                        final String newED = DateUtil.format(finalVo.getEndTime(), Constants.HMS_FORMAT);
+                        if (ObjectUtil.equal(exitST,newST)&&ObjectUtil.equal(exitED,newED)&&ObjectUtil.equal(t.getOrgId(),finalVo.getExecOrg().getId())){
+                            return true;
+                        }
+                        return false;
+                    }).findAny();
+                    if (optional.isPresent()){
+                        log.info("安全检查任务生成时,发现计划{}已存在相同周期任务",plan.getPlanName());
+                        continue;
+                    }
+                }
                 list.add(vo);
             }
 //            for (CoreSafecheckPlanToRole role : roles) {
@@ -642,7 +677,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
     }
 
     public void rebuildTask(List<Long> orgIds, Date startDate, Date endDate, CycleCommonEnum cycle) {
-        DateRange range=DateUtils.getStartAndEnd(startDate,cycle);
+        DateRange range = DateUtils.getStartAndEnd(startDate, cycle);
         Map<Long, Boolean> workingMap = orgWorkTimeStatusMap(range, orgIds);
 //        List<Long> deleteTaskIds = new ArrayList<>();
         Integer planCycle = 0;

+ 1 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafetyTaskService.java

@@ -96,4 +96,5 @@ public interface ICoreSafetyTaskService extends IService<CoreSafetyTask> {
 
     List<String> checkTaskExit(List<String> allSafetyCheckIdList);
 
+    List<CoreSafetyTask> selectTaskListByPlanId(Long planId);
 }

+ 7 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafetyTaskServiceImpl.java

@@ -340,4 +340,11 @@ public class CoreSafetyTaskServiceImpl extends ServiceImpl<CoreSafetyTaskMapper,
         List<CoreSafetyTask> coreSafetyTasks = baseMapper.selectList(queryWrapper);
         return coreSafetyTasks.stream().map(CoreSafetyTask::getId).map(String::valueOf).collect(Collectors.toList());
     }
+
+    @Override
+    public List<CoreSafetyTask> selectTaskListByPlanId(Long planId) {
+        LambdaQueryWrapper<CoreSafetyTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CoreSafetyTask::getPlanId, planId);
+        return baseMapper.selectList(queryWrapper);
+    }
 }