Browse Source

异步生成任务时 新增一个标识, 删除、撤回时判断标识是否存在,存在则提示不允许操作

zhulu 1 year ago
parent
commit
ebaab97c31

+ 16 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java

@@ -19,7 +19,9 @@ import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.StringUtils;
 
+import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.access.domain.CoreMonitoringTaskRegistration;
 import com.xunmei.core.access.domain.TMonitoringRetrievalPlan;
@@ -53,6 +55,7 @@ import javax.annotation.Resource;
 import java.io.File;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.util.*;
 
@@ -513,7 +516,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
         }
         if ((tMonitoringRetrievalPlan.getImmediately().equals(Boolean.TRUE) || tMonitoringRetrievalPlan.getPlanCycle().equals(ZERO.toString())) && CollectionUtils.isNotEmpty(tMonitoringRetrievalPlans)) {
             try {
-                coreMonitoringRetrievalTaskBuilderService.noCycleTask(tMonitoringRetrievalPlans);
+                coreMonitoringRetrievalTaskBuilderService.noCycleTask(tMonitoringRetrievalPlans,tMonitoringRetrievalPlan.getId());
             } catch (Exception e) {
                 throw new ServiceException("下发任务异常,请联系管理员");
             }
@@ -521,9 +524,19 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
         return i;
     }
 
+    private void checkPlanIsCreatingTask(Long planId,String msg)
+    {
+        String redisKey="Monitoring_Creating_Task" + planId;
+        //仅当hashKey不存在时才设置
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (hasKey) {
+            throw new ServiceException("该计划正在生成任务,现在不能被"+msg+",请稍后再试。");
+        }
+    }
 
     @Override
     public int withdraw(Long id) {
+        checkPlanIsCreatingTask(id,"撤回");
         TMonitoringRetrievalPlan plan = baseMapper.selectById(id);
         QueryWrapper queryWrapper = new QueryWrapper();
         queryWrapper.eq(PARENT_ID, id);
@@ -846,6 +859,8 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
     public int deleteTMonitoringRetrievalPlanByIds(Long[] ids) {
         int i = 0;
         for (Long id : ids) {
+            checkPlanIsCreatingTask(id,"删除");
+
             TMonitoringRetrievalPlan tMonitoringRetrievalPlan = new TMonitoringRetrievalPlan();
             tMonitoringRetrievalPlan.setIsDeleted(2L);
             tMonitoringRetrievalPlan.setId(id);

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

@@ -35,6 +35,7 @@ import com.xunmei.common.core.enums.drill.DrillPlanStatus;
 import com.xunmei.common.core.enums.edu.EduTrainingDoStatus;
 import com.xunmei.common.core.enums.edu.EduTrainingPlanCycleEnum;
 import com.xunmei.common.core.enums.edu.EduTrainingPlanStatus;
+import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.util.BeanHelper;
 import com.xunmei.common.core.utils.AssertUtil;
@@ -66,6 +67,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionSynchronizationAdapter;
 import org.springframework.transaction.support.TransactionSynchronizationManager;
 
+import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
@@ -641,6 +643,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteCoreDrillPlanByIds(Long id) {
+        checkPlanIsCreatingTask(id,"删除");
         List<Long> list = baseMapper.selectIdByParentId(id);
         if (ObjectUtil.isEmpty(list)) {
             //说明没有下发,还是草稿状态
@@ -734,12 +737,20 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         }, threadPoolTaskExecutor);
 
         planListFuture.thenAcceptAsync((result) -> {
+            String redisKey="Drill_Creating_Task" + planId;
+            RedisUtils.deleteObject(redisKey);
+            //仅当hashKey不存在时才设置
+            Boolean hasKey = RedisUtils.hasKey(redisKey);
+            if (!hasKey) {
+                RedisUtils.setCacheObject(redisKey, planId, Duration.ofMillis(1000 * 60*5));
+            }
             for (CoreDrillPlan drillPlan : result) {
                 if (checkCanBuildTaskNow(drillPlan)) {
                     final CoreDrillPlanDataVo detailPlanData = getCoreDrillPlanDataVo(drillPlan.getId());
                     coreDrillTaskService.createTaskForNow(detailPlanData, drillPlan.getPlanStartDate(), drillPlan.getPlanEndDate());
                 }
             }
+            RedisUtils.deleteObject(redisKey);
         }, threadPoolTaskExecutor);
 
 
@@ -771,9 +782,19 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
                 || ObjectUtil.equal(orgType, OrgTypeEnum.YINGYE_WANGDIAN.getCode());
     }
 
+    private void checkPlanIsCreatingTask(Long planId,String msg)
+    {
+        String redisKey="Drill_Creating_Task" + planId;
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (hasKey) {
+            throw new ServiceException("该计划正在生成任务,现在不能被"+msg+",请稍后再试。");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int revocationPlan(Long planId) {
+        checkPlanIsCreatingTask(planId,"撤回");
         List<Long> list = coreDrillPlanMapper.selectIdByParentId(planId);
         Integer isExecute = coreDrillTaskMapper.selectCount(new LambdaQueryWrapper<CoreDrillTask>()
                         .in(CoreDrillTask::getPlanId, list)

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

@@ -31,6 +31,7 @@ import com.xunmei.common.core.enums.drill.DrillPlanCycleEnum;
 import com.xunmei.common.core.enums.edu.EduTrainingDoStatus;
 import com.xunmei.common.core.enums.edu.EduTrainingPlanCycleEnum;
 import com.xunmei.common.core.enums.edu.EduTrainingPlanStatus;
+import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.util.BeanHelper;
 import com.xunmei.common.core.utils.AssertUtil;
 import com.xunmei.common.core.utils.DateUtils;
@@ -60,6 +61,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionSynchronizationAdapter;
 import org.springframework.transaction.support.TransactionSynchronizationManager;
 
+import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
@@ -620,6 +622,15 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
 
     }
 
+    private void checkPlanIsCreatingTask(Long planId,String msg)
+    {
+        String redisKey="Edu_Creating_Task" + planId;
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (hasKey) {
+            throw new ServiceException("该计划正在生成任务,现在不能被"+msg+",请稍后再试。");
+        }
+    }
+
     /**
      * 批量删除教育培训计划
      *
@@ -629,6 +640,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteCoreEduTrainingPlanByIds(Long id) {
+        checkPlanIsCreatingTask(id,"删除");
         List<Long> list = baseMapper.selectIdByParentId(id);
         if (ObjectUtil.isEmpty(list)) {
             //说明没有下发,还是草稿状态
@@ -742,12 +754,19 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         }, threadPoolTaskExecutor);
 
         planListFuture.thenAcceptAsync((result) -> {
+            String redisKey="Edu_Creating_Task" + planId;
+            RedisUtils.deleteObject(redisKey);
+            Boolean hasKey = RedisUtils.hasKey(redisKey);
+            if (!hasKey) {
+                RedisUtils.setCacheObject(redisKey, planId, Duration.ofMillis(1000 * 60*5));
+            }
             for (CoreEduTrainingPlan eduPlan : result) {
                 if (checkCanBuildTaskNow(eduPlan)) {
                     CoreEduTrainingPlanDataVo detailPlanData = getCoreEduTrainingPlanDataVo(eduPlan.getId());
                     coreEduTrainingTaskService.createTaskForNow(detailPlanData, eduPlan.getStartDate(), eduPlan.getEndDate());
                 }
             }
+            RedisUtils.deleteObject(redisKey);
         }, threadPoolTaskExecutor);
     }
 
@@ -870,6 +889,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer revocationPlan(Long planId) {
+        checkPlanIsCreatingTask(planId,"撤回");
         List<Long> list = coreEduTrainingPlanMapper.selectIdByParentId(planId);
         Integer isExecute = coreEduTrainingTaskMapper.selectCount(new LambdaQueryWrapper<CoreEduTrainingTask>()
                         .in(CoreEduTrainingTask::getPlanId, list)

+ 13 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java

@@ -30,6 +30,7 @@ import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.IDHelper;
 import com.xunmei.common.core.vo.IdNameVo;
 import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.question.QuestionSrcType;
@@ -308,7 +309,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         }
 
         if (immediateEffect) {
-            resumptionTaskBusiness.rebuildCurrentCycleTask(hsPlans);
+            resumptionTaskBusiness.rebuildCurrentCycleTask(hsPlans,dto.getId());
         }
     }
 
@@ -368,8 +369,18 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         baseMapper.copyPlanOrgs(id, newPlanId);
     }
 
+    private void checkPlanIsCreatingTask(Long planId,String msg)
+    {
+        String redisKey="Resumption_Creating_Task" + planId;
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (hasKey) {
+            throw new ServiceException("该计划正在生成任务,现在不能被"+msg+",请稍后再试。");
+        }
+    }
+
     @Override
     public void cheHui(Long id) {
+        checkPlanIsCreatingTask(id,"撤回");
         Date now = new Date();
         AppPlan plan = baseMapper.selectById(id);
         if (ObjectUtil.equal(plan.getTaskHasCompleted(), 1)) {
@@ -939,6 +950,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleted(Long id) throws Exception {
+        checkPlanIsCreatingTask(id,"删除");
         AppPlan plan = baseMapper.selectById(id);
         if (ObjectUtil.isNull(plan)) {
             throw new ServiceException("任务不存在");

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

@@ -22,6 +22,7 @@ import com.xunmei.common.core.enums.resumption.ResumptionTaskStatus;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.core.utils.Ymd;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.core.TaskCreatingServiceImplBase;
 import com.xunmei.core.resumption.domain.AppPlan;
 import com.xunmei.core.resumption.domain.AppPlanToExecOrg;
@@ -43,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.time.Duration;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -169,6 +171,34 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
     @Transactional
     @Async
     public void rebuildCurrentCycleTask(List<Object> plans) {
+        rebuildCycleTask(plans);
+    }
+
+
+
+    /*
+     * 按计划重新生成。为保持通用,参数使用object.只支持同属一个父计划的子计划。
+     * */
+    @Override
+    @Transactional
+    @Async
+    public void rebuildCurrentCycleTask(List<Object> plans,Long parentPlanId) {
+        if (CollectionUtils.isEmpty(plans)) {
+            return;
+        }
+
+        String redisKey="Resumption_Creating_Task" + parentPlanId;
+        RedisUtils.deleteObject(redisKey);
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (!hasKey) {
+            RedisUtils.setCacheObject(redisKey, parentPlanId, Duration.ofMillis(1000 * 60*5));
+        }
+        rebuildCycleTask(plans);
+        RedisUtils.deleteObject(redisKey);
+    }
+
+    private void rebuildCycleTask(List<Object> plans)
+    {
         if (CollectionUtils.isEmpty(plans)) {
             return;
         }
@@ -214,6 +244,7 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
         buildTask(null, appPlans, workDate);
     }
 
+
     @Override
     public void rebuildDayTask(List<Long> orgIds, SysWorkTime workTime) {
         rebuildTask(orgIds, workTime.getYmdDate(), workTime.getYmdDate(), CycleCommonEnum.DAILY, workTime);

+ 1 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusinessService.java

@@ -4,4 +4,5 @@ import java.util.List;
 
 public interface ResumptionTaskBusinessService {
     void rebuildCurrentCycleTask(List<Object> plans);
+    void rebuildCurrentCycleTask(List<Object> plans,Long parentPlanId);
 }

+ 1 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/ICoreMonitoringRetrievalTaskBuilderService.java

@@ -95,6 +95,7 @@ public interface ICoreMonitoringRetrievalTaskBuilderService extends IService<Cor
 //    TableDataInfo selectListApp(CoreMonitoringTaskRegistrationDTO coreMonitoringTaskRegistrationDTO);
 
     void noCycleTask(List<TMonitoringRetrievalPlan> planList);
+    void noCycleTask(List<TMonitoringRetrievalPlan> planList,Long parentPlanId);
 
     void dayTask(LocalDate taskTime);
 

+ 23 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/impl/CoreMonitoringRetrievalTaskBuilderServiceImpl.java

@@ -22,6 +22,7 @@ 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.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.TaskCreatingServiceImplBase;
 import com.xunmei.core.access.domain.TMonitoringRetrievalPlan;
@@ -77,6 +78,28 @@ public class CoreMonitoringRetrievalTaskBuilderServiceImpl extends ServiceImpl<C
      */
     @Override
     public void noCycleTask(List<TMonitoringRetrievalPlan> planList) {
+        createTask(planList);
+    }
+
+    @Async
+    /**
+     * 无周期任务生成
+     */
+    @Override
+    public void noCycleTask(List<TMonitoringRetrievalPlan> planList,Long parentPlanId) {
+        // 生成任务为异步方法,新增一个任务正在生成的标识,用于删除计划时的判断
+        String redisKey="Monitoring_Creating_Task" + parentPlanId;
+        RedisUtils.deleteObject(redisKey);
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (!hasKey) {
+            RedisUtils.setCacheObject(redisKey, parentPlanId, Duration.ofMillis(1000 * 60*5));
+        }
+        createTask(planList);
+        RedisUtils.deleteObject(redisKey);
+    }
+
+    private void createTask(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();

+ 19 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java

@@ -17,6 +17,7 @@ import com.xunmei.common.core.enums.PlanStatus;
 import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.IDHelper;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.core.TaskCreatingServiceImplBase;
 import com.xunmei.core.resumption.domain.Resumption;
 import com.xunmei.core.safetyCheck.domain.*;
@@ -38,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.lang.reflect.Array;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -178,6 +180,23 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      */
     @Async
     public void createTaskByPlans(List<CoreSafecheckPlan> plans) {
+        createTask(plans);
+    }
+
+    @Async
+    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));
+        }
+        createTask(plans);
+        RedisUtils.deleteObject(redisKey);
+    }
+
+    private void createTask(List<CoreSafecheckPlan> plans)
+    {
         try {
             if (plans != null && plans.size() > 0) {
                 DateTime datetime = new DateTime();

+ 13 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java

@@ -27,6 +27,7 @@ import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.question.QuestionSrcType;
@@ -298,7 +299,7 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
         }
 
         if (immediateEffect) {
-            safetyCheckJobBusiness.createTaskByPlans(hsPlans);
+            safetyCheckJobBusiness.createTaskByPlans(hsPlans,dto.getId());
         }
     }
 
@@ -372,7 +373,7 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
         }
 
         if (ObjectUtil.isNotEmpty(newlist)) {
-            safetyCheckJobBusiness.createTaskByPlans(newlist);
+            safetyCheckJobBusiness.createTaskByPlans(newlist,id);
         }
 
         return 1;
@@ -389,9 +390,17 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             throw new ServiceException("已超过无周期任务的结束时间");
         }
     }
-
+    private void checkPlanIsCreatingTask(Long planId,String msg)
+    {
+        String redisKey="SafeCheck_Creating_Task" + planId;
+        Boolean hasKey = RedisUtils.hasKey(redisKey);
+        if (hasKey) {
+            throw new ServiceException("该计划正在生成任务,现在不能被"+msg+",请稍后再试。");
+        }
+    }
     @Override
     public void cheHui(Long id) {
+        checkPlanIsCreatingTask(id,"撤回");
         Date now = new Date();
         CoreSafecheckPlan plan = baseMapper.selectById(id);
         if (ObjectUtil.equal(plan.getTaskHasCompleted(), 1)) {
@@ -858,6 +867,7 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     @Override
     public int deleteCoreSafecheckPlanByIds(Long[] ids) {
         for (Long id : ids) {
+            checkPlanIsCreatingTask(id,"删除");
             CoreSafecheckPlan plan = baseMapper.selectById(id);
             List<CoreSafecheckPlan> plans = baseMapper.selectList(new LambdaQueryWrapper<CoreSafecheckPlan>()
                     .in(CoreSafecheckPlan::getId, ids).or().in(CoreSafecheckPlan::getParentId, ids)