Browse Source

履职计划实现检查内容生效日期;编辑 后重新生成

jiawuxian 1 year ago
parent
commit
360c540b2d

+ 2 - 2
project_data/sql/0.0.3/soc/soc.sql

@@ -598,8 +598,8 @@ END IF;
                     AND table_name = 'core_resumption_plan_to_point'
                     AND column_name = 'validate_date') THEN
 		ALTER TABLE `soc`.`core_resumption_plan_to_point` 
-			ADD COLUMN `validate_date` date NULL COMMENT '生效日期。不为null';
-		UPDATE core_resumption_plan_to_point set validate_date='2000-01-01';
+			ADD COLUMN `effective_date` date NULL COMMENT '生效日期。不为null';
+		UPDATE core_resumption_plan_to_point set effective_date='2000-01-01';
     END IF;
 	
 

+ 33 - 101
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/controller/ApiPlanController.java

@@ -1,8 +1,12 @@
 package com.xunmei.core.resumption.controller;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xunmei.common.core.domain.DateRange;
+import com.xunmei.common.core.enums.CycleCommonEnum;
+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.annotation.RequiresPermissions;
@@ -15,7 +19,6 @@ import com.xunmei.core.resumption.task.ResumptionTaskBusiness;
 import com.xunmei.core.resumption.vo.appPlan.AppPlanVo;
 import com.xunmei.core.resumption.vo.appPlan.RuleItemVo;
 import com.xunmei.core.resumption.vo.appPlan.RuleRequestVo;
-import com.xunmei.system.api.RemoteOrgService;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,30 +74,6 @@ public class ApiPlanController {
                 list.add(plan);
                 List<Object> newlist = new ArrayList<>(list);
                 resumptionTaskBusiness.rebuildCurrentCycleTask(newlist);
-
-//                DateTime datetime = new DateTime();
-//                datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
-//                Integer plancycle = plan.getPlanCycle();
-//                if (plancycle != null) {
-//                    if (plancycle == 2) {
-//                        taskBusiness.syncDay(datetime, plancycle);
-//                    }
-//                    if (plancycle == 3) {
-//                        taskBusiness.syncWeek(datetime, plancycle);
-//                    }
-//                    if (plancycle == 4) {
-//                        taskBusiness.syncMonth(datetime, plancycle);
-//                    }
-//                    if (plancycle == 5) {
-//                        taskBusiness.syncQuarter(datetime, plancycle);
-//                    }
-//                    if (plancycle == 6) {
-//                        taskBusiness.syncHalfYear(datetime, plancycle);
-//                    }
-//                    if (plancycle == 7) {
-//                        taskBusiness.syncYear(datetime, plancycle);
-//                    }
-//                }
             }
             return AjaxResult.success();
         } catch (Exception e) {
@@ -152,24 +131,27 @@ public class ApiPlanController {
             appPlanService.saveOrUpdatePlan(info);
             AppPlan plan = null;
             plan = appPlanService.getById(info.getId());
-            Long planOfOrgType = null;
             if (info.getId() != null) {
-                planOfOrgType = plan.getPlanOfOrgType();
-            }
-            //判断是否是编辑并且计划所属任务不存在已完成或者逾期,需要删除所有任务重新生成
-            boolean isEditAll = info.getHasEdit() == null && info.getId() != null && info.getBuildTaskNow() > 0;
-            //如果计划所属机构类型为行社并且勾选立即执行,新增的时候立即生成任务
-            if (isEditAll) {
-
-                //如果编辑
-                List<AppPlan> list = appPlanService.list(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, plan.getId()).eq(AppPlan::getDeleted, 0));
-                list.add(plan);
-                List<Object> newlist = new ArrayList<>(list);
-//                resumptionTaskBusiness.rebuildCurrentCycleTask(newlist);
-
+                //判断是否是编辑并且计划所属任务不存在已完成或者逾期,需要删除所有任务重新生成
+                //因为找的是子计划,所以是已经下发了
+                //如果是创建日期的周期就编辑,立即生效则生成任务;如果是之后的周期,则生成任务
+                DateRange range = DateUtils.getStartAndEnd(new Date(), CycleCommonEnum.getEnum(plan.getPlanCycle()));
+                Date nextBeginDate = range.getStartTime();
+                Date createDate = DateUtil.beginOfDay(plan.getCreateTime());
+                boolean generateTask = info.getId() != null && (nextBeginDate.after(createDate) || (!nextBeginDate.after(createDate) && plan.getBuildTaskNow() > 0));
+                //如果计划所属机构类型为行社并且勾选立即执行,新增的时候立即生成任务
+                if (generateTask) {
+                    //如果编辑
+                    List<AppPlan> list = appPlanService.list(new LambdaQueryWrapper<AppPlan>()
+                            .eq(AppPlan::getParentId, plan.getId())
+                            .eq(AppPlan::getDeleted, 0)
+                            .eq(AppPlan::getPlanStatus,1));
+                    list.add(plan);
+                    List<Object> newlist = new ArrayList<>(list);
+                    resumptionTaskBusiness.rebuildCurrentCycleTask(newlist);
+                }
             }
 
-
             return AjaxResult.success();
         } catch (Exception e) {
             e.printStackTrace();
@@ -199,34 +181,6 @@ public class ApiPlanController {
 //    @RequiresPermissions("core:plan:findById")
     public AjaxResult cheHui(@PathVariable Long id) {
         appPlanService.cheHui(id);
-//        AppPlan plan = appPlanService.getById(id);
-//        //撤回后的下发如果存在子计划并且勾选立即执行也需要生成任务
-//        if(plan.getBuildTaskNow()==1){
-//            DateTime datetime = new DateTime();
-//            datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
-//            //当有周期存在时保持原有接口不变(doTask),否则按照新的接口创建
-//            Integer plancycle = plan.getPlanCycle();
-//            if (plancycle != null) {
-//                if (plancycle == 2) {
-//                    taskBusiness.syncDay(datetime, plancycle);
-//                }
-//                if (plancycle == 3) {
-//                    taskBusiness.syncWeek(datetime, plancycle);
-//                }
-//                if (plancycle == 4) {
-//                    taskBusiness.syncMonth(datetime, plancycle);
-//                }
-//                if (plancycle == 5) {
-//                    taskBusiness.syncQuarter(datetime, plancycle);
-//                }
-//                if (plancycle == 6) {
-//                    taskBusiness.syncHalfYear(datetime, plancycle);
-//                }
-//                if (plancycle == 7) {
-//                    taskBusiness.syncYear(datetime, plancycle);
-//                }
-//            }
-//        }
         return AjaxResult.success();
     }
 
@@ -235,39 +189,17 @@ public class ApiPlanController {
 //    @RequiresPermissions("core:plan:findById")
     public AjaxResult distributeCheHui(@PathVariable Long id) {
         int i = appPlanService.distributeCheHui(id);
-        AppPlan plan = appPlanService.getById(id);
-        //撤回后的下发如果存在子计划并且勾选立即执行也需要生成任务
-        if (plan.getBuildTaskNow() == 1) {
-//            DateTime datetime = new DateTime();
-//            datetime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
-//            //当有周期存在时保持原有接口不变(doTask),否则按照新的接口创建
-//            Integer plancycle = plan.getPlanCycle();
-//            if (plancycle != null) {
-//                if (plancycle == 2) {
-//                    taskBusiness.syncDay(datetime, plancycle);
-//                }
-//                if (plancycle == 3) {
-//                    taskBusiness.syncWeek(datetime, plancycle);
-//                }
-//                if (plancycle == 4) {
-//                    taskBusiness.syncMonth(datetime, plancycle);
-//                }
-//                if (plancycle == 5) {
-//                    taskBusiness.syncQuarter(datetime, plancycle);
-//                }
-//                if (plancycle == 6) {
-//                    taskBusiness.syncHalfYear(datetime, plancycle);
-//                }
-//                if (plancycle == 7) {
-//                    taskBusiness.syncYear(datetime, plancycle);
-//                }
-//            }
-            List<AppPlan> list = appPlanService.list(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, plan.getId()).eq(AppPlan::getDeleted, 0));
-            list.add(plan);
-            List<Object> newlist = new ArrayList<>(list);
-            resumptionTaskBusiness.rebuildCurrentCycleTask(newlist);
-
-        }
+        //撤回后下发,不重新生成任务
+//        AppPlan plan = appPlanService.getById(id);
+//
+//        //撤回后的下发如果存在子计划并且勾选立即执行也需要生成任务
+//        if (plan.getBuildTaskNow() == 1) {
+//            List<AppPlan> list = appPlanService.list(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, plan.getId()).eq(AppPlan::getDeleted, 0));
+//            list.add(plan);
+//            List<Object> newlist = new ArrayList<>(list);
+//            resumptionTaskBusiness.rebuildCurrentCycleTask(newlist);
+//
+//        }
         return AjaxResult.success(i);
     }
 

+ 6 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/domain/AppPlanToPoint.java

@@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
-
+import java.util.Date;
 /**
  * 计划要点关联表(core_resumption_plan_to_point)实体类
  *
@@ -41,4 +41,9 @@ public class AppPlanToPoint extends Model<AppPlanToPoint> implements Serializabl
      */
     private boolean required;
     private Long ofOrgId;
+
+    /**
+     * 生效日期
+     */
+    private Date effectiveDate;
 }

+ 15 - 5
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/gx/service/ResumptionServiceImpl.java

@@ -3,6 +3,7 @@ package com.xunmei.core.resumption.gx.service;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
 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.toolkit.CollectionUtils;
 import com.xunmei.common.core.constant.SecurityConstants;
@@ -23,8 +24,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.TransactionManager;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 import sun.nio.ch.ThreadPool;
 
+import java.text.ParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -97,9 +101,9 @@ public class ResumptionServiceImpl implements ResumptionService {
         List<ResumptionPlanVo> resumptionPlanVos = new ArrayList<>();
         boolean isExist = false;
         if (status == 1 || status == 4) {
-            //履职中待履职 和已过期的数据是没有保存过数据的只能根据计划获取
+            //待履职 和已过期的数据是没有保存过数据的只能根据计划获取
             Long planId = resumption.getPlanId();
-            resumptionPlanVos = appPlanMapper.selectResumptionPlan(planId);
+            resumptionPlanVos = appPlanMapper.selectResumptionPlan(planId,resumption.getPlanStartTime());
             isExist = false;
         } else {
             resumptionPlanVos = resumptionMapper.selectResumptionPlan(taskDetailVo.getTaskId());
@@ -127,9 +131,6 @@ public class ResumptionServiceImpl implements ResumptionService {
         int quarter = dateTime.getQuarter();
         //获取履职任务
         Resumption sysResumption = resumptionMapper.findOneByTaskIdAndDate(taskId, year, quarter);
-        if (ObjectUtil.equal(taskDetailVo.getSubType(), 2)) {
-            appPlanService.updatePlanCompletedState(sysResumption.getPlanId(),1);
-        }
 
         sysResumption.setUpdateBy(SecurityUtils.getUsername());
         sysResumption.setSubmitorId(SecurityUtils.getUserId());
@@ -235,6 +236,15 @@ public class ResumptionServiceImpl implements ResumptionService {
         }
 
         resumptionMapper.updateById(sysResumption);
+        if (ObjectUtil.equal(taskDetailVo.getSubType(), 2)) {
+//            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+//                @Override
+//                public void afterCommit() {
+                    appPlanService.updatePlanCompletedState(sysResumption.getPlanId(),1);
+//                }
+//            });
+
+        }
     }
 
     /**

+ 6 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/mapper/AppPlanMapper.java

@@ -14,6 +14,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -85,8 +86,12 @@ public interface AppPlanMapper extends BaseMapper<AppPlan> {
 
     /**
      * 根据计划id获取履职内容
+     *
      * @param planId
+     * @param startDate 任务的开始日期
      * @return
      */
-    List<ResumptionPlanVo> selectResumptionPlan(@Param("planId") Long planId);
+    List<ResumptionPlanVo> selectResumptionPlan(@Param("planId") Long planId, @Param("startDate") Date startDate);
+
+    Integer updateParentPlanCompletedState(@Param("planId") Long planId);
 }

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

@@ -1,7 +1,5 @@
 package com.xunmei.core.resumption.service.impl;
 
-import cn.hutool.core.collection.CollectionUtil;
-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.LambdaQueryWrapper;
@@ -14,9 +12,7 @@ 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.R;
-import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingTask;
-import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingTaskToUser;
-import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingTaskDetailVo;
+import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.domain.registerbook.domain.CoreRegisterBookPdf;
 import com.xunmei.common.core.enums.RegisterBookType;
@@ -32,7 +28,6 @@ import com.xunmei.core.resumption.dto.plan.CoreResumptionPlanPageDto;
 import com.xunmei.core.resumption.mapper.*;
 import com.xunmei.core.resumption.service.AppPlanService;
 import com.xunmei.core.resumption.service.IResumptionRecordService;
-import com.xunmei.core.resumption.task.ResumptionTaskBusiness;
 import com.xunmei.core.resumption.vo.appPlan.AppPlanVo;
 import com.xunmei.core.resumption.vo.appPlan.ResumptionPlanPageVo;
 import com.xunmei.core.resumption.vo.appPlan.RuleItemVo;
@@ -44,17 +39,17 @@ import com.xunmei.core.thread.ThreadPoolConfig;
 import com.xunmei.system.api.RemoteFileService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.ResumptionPdf;
-import com.xunmei.system.api.domain.SysDept;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
-import io.netty.util.internal.StringUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.omg.IOP.TransactionService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
@@ -62,8 +57,6 @@ import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
-import static com.xunmei.common.core.constant.ErrorMsgConstants.QUERY_ORG_DATA_ERROR;
-
 /**
  * @author : 高雄
  * @date :2022/4/27 17:44
@@ -223,6 +216,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                         item.setPointScan(ruleItemVo.isPointScan());
                         item.setRequired(ruleItemVo.isRequired());
                         item.setOfOrgId(ruleItemVo.getOfOrgId());
+                        item.setEffectiveDate(ruleItemVo.getEffectiveDate());
                         appPlanToItemMapper.insert(item);
                     }
                 }
@@ -244,25 +238,32 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         AppPlan plan = baseMapper.selectById(id);
         //修改所有子计划
         List<AppPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, id));
+        List<Long> deleteByPlanIds = new ArrayList<>();//如果计划没有已完成 ,则删除该计划所有任务
         for (AppPlan ap :
                 appPlans) {
 //修改计划状态为停用
             ap.setPlanStatus(2);
             baseMapper.updateById(ap);
-            //撤回需要删除本周期所有任务
-            DateRange dateRange = DateUtils.getStartAndEnd(new Date(), plan.getPlanCycle());
-            resumptionMapper.delete(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, ap.getId()).in(Resumption::getStatus, 1, 2).between(Resumption::getYmdDate, dateRange.getStartTime(), dateRange.getEndTime()));
 
+            if (ObjectUtil.notEqual(ap.getTaskHasCompleted(), 1)) {
+                deleteByPlanIds.add(ap.getId());
+            }
         }
         //设置下发状态为未下发
         plan.setDistribute("0");
         plan.setPlanStatus(2);
         baseMapper.updateById(plan);
 
-//撤回需要删除本周期所有任务
-        DateRange dateRange = DateUtils.getStartAndEnd(new Date(), plan.getPlanCycle());
-        resumptionMapper.delete(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, plan.getId()).in(Resumption::getStatus, 1, 2).between(Resumption::getYmdDate, dateRange.getStartTime(), dateRange.getEndTime()));
+        if (ObjectUtil.notEqual(plan.getTaskHasCompleted(), 1)) {
+            deleteByPlanIds.add(plan.getId());
+        }
+
+        deleteTaskByPlanId(deleteByPlanIds);
+    }
 
+    @Async
+    protected void deleteTaskByPlanId(List<Long> planIds) {
+        resumptionMapper.delete(new LambdaQueryWrapper<Resumption>().in(Resumption::getPlanId, planIds));
     }
 
     @Override
@@ -320,6 +321,9 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
     @Transactional(rollbackFor = Exception.class)
     public void saveOrUpdatePlan(AppPlanVo app) throws Exception {
         AppPlan plan = convertToAppPlan(app);
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(2000, 0, 1);
+
         if (app.getId() == null) {
             plan.setParentId(-1L);
             plan.setDeleted(0);
@@ -376,6 +380,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 item.setPointScan(ruleItemVo.isPointScan());
                 item.setRequired(ruleItemVo.isRequired());
                 item.setOfOrgId(ruleItemVo.getOfOrgId());
+                item.setEffectiveDate(calendar.getTime());
                 appPlanToItemMapper.insert(item);
             }
         } else {
@@ -383,10 +388,22 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 app.setRoleList(new ArrayList<>());
             }
 
+            AppPlan existPlan = baseMapper.selectById(app.getId());
+            LambdaQueryWrapper<AppPlanToPoint> pointWrapper = new LambdaQueryWrapper<>();
+            pointWrapper.eq(AppPlanToPoint::getPlanId, app.getId());
+
+
             //修改所有子计划
             List<AppPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, plan.getId()));
             for (AppPlan ap :
                     appPlans) {
+                Map<Long, AppPlanToPoint> planPoints = appPlanToItemMapper.selectList(pointWrapper).stream()
+                        .collect(Collectors.toMap(AppPlanToPoint::getPointId, p -> p));
+                Date defaultEffectiveDate = calendar.getTime();
+                if (ObjectUtil.equal(ap.getTaskHasCompleted(), 1)) {
+                    DateRange range = DateUtils.getStartAndEnd(new Date(), CycleCommonEnum.getEnum(app.getPlanCycle()));
+                    defaultEffectiveDate = DateUtil.beginOfDay(DateUtils.addDays(range.getEndTime(), 1));
+                }
 
                 ap.setPlanType(plan.getPlanType());
                 ap.setPlanCycle(plan.getPlanCycle());
@@ -418,7 +435,9 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
 
 
                 List<RuleItemVo> valitemList = app.getItemList();
-                List<RuleItemVo> itemList = valitemList.stream().filter(e -> e.getOfOrgId().equals(app.getPlanCreateOrgId())).collect(Collectors.toList());
+                List<RuleItemVo> itemList = valitemList.stream()
+                        .filter(e -> e.getOfOrgId().equals(app.getPlanCreateOrgId()))
+                        .collect(Collectors.toList());
 
                 if (valitemList.size() == 0) {
                     throw new RuntimeException("请选择履职要点");
@@ -431,6 +450,12 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                     item.setPointScan(ruleItemVo.isPointScan());
                     item.setRequired(ruleItemVo.isRequired());
                     item.setOfOrgId(ruleItemVo.getOfOrgId());
+                    if (planPoints.containsKey(ruleItemVo.getId())) {
+                        item.setEffectiveDate(planPoints.get(ruleItemVo.getId()).getEffectiveDate());
+                    } else {
+                        item.setEffectiveDate(defaultEffectiveDate);
+                    }
+
                     appPlanToItemMapper.insert(item);
                 }
                 //如果计划是编辑全部,代表不存在已完成或者逾期的任务,需要删除重新生成
@@ -487,6 +512,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 item.setPointScan(ruleItemVo.isPointScan());
                 item.setRequired(ruleItemVo.isRequired());
                 item.setOfOrgId(ruleItemVo.getOfOrgId());
+                item.setEffectiveDate(calendar.getTime());
                 appPlanToItemMapper.insert(item);
             }
 
@@ -511,10 +537,10 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
             plan.setPlanCreateOrgId(null);
             plan.setPlanCreateOrgName(null);
             baseMapper.updateById(plan);
-            //如果计划是编辑全部,代表不存在已完成或者逾期的任务,需要删除重新生成
-            if (app.getHasEdit() == null) {
-                resumptionMapper.delete(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, plan.getId()));
-            }
+//            //如果计划是编辑全部,代表不存在已完成或者逾期的任务,需要删除重新生成
+//            if (ObjectUtil.notEqual(existPlan.getTaskHasCompleted(),1)) {
+//                resumptionMapper.delete(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, plan.getId()));
+//            }
         }
     }
 
@@ -525,25 +551,25 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
 
         AppPlanVo appPlanVo = convertToAppPlanVo(appPlan);
         //查询计划是否存在对应的状态为完成或者逾期的任务
-        List<Integer> status = new ArrayList<>();
-        status.add(3);
-        status.add(4);
-        Long sum = resumptionMapper.selectCount(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, id).in(Resumption::getStatus, status));
-        if (sum > 0) {
-            //如果存在完成或者逾期的任务设置编辑状态为1
-            appPlanVo.setHasEdit(1);
-        }
+//        List<Integer> status = new ArrayList<>();
+//        status.add(3);
+//        status.add(4);
+//        Long sum = resumptionMapper.selectCount(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, id).in(Resumption::getStatus, status));
+//        if (sum > 0) {
+//            //如果存在完成或者逾期的任务设置编辑状态为1
+//            appPlanVo.setHasEdit(1);
+//        }
         //查找子计划是否存在完成或者逾期的任务
-        List<AppPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, id));
-        for (AppPlan p :
-                appPlans) {
-            Long csum = resumptionMapper.selectCount(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, p.getId()).in(Resumption::getStatus, status));
-            if (csum > 0) {
-                //如果存在完成或者逾期的任务设置编辑状态为1
-                appPlanVo.setHasEdit(1);
-                break;
-            }
-        }
+//        List<AppPlan> appPlans = baseMapper.selectList(new LambdaQueryWrapper<AppPlan>().eq(AppPlan::getParentId, id));
+//        for (AppPlan p :
+//                appPlans) {
+//            Long csum = resumptionMapper.selectCount(new LambdaQueryWrapper<Resumption>().eq(Resumption::getPlanId, p.getId()).in(Resumption::getStatus, status));
+//            if (csum > 0) {
+//                //如果存在完成或者逾期的任务设置编辑状态为1
+//                appPlanVo.setHasEdit(1);
+//                break;
+//            }
+//        }
 
         SysOrg org = orgService.selectSysOrgById(appPlan.getPlanCreateOrgId(), SecurityConstants.INNER);
         appPlanVo.setPlanCreateOrgType(org.getType());
@@ -674,6 +700,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         plan.setPlanCreateOrgId(app.getPlanCreateOrgId());
         plan.setPlanOfOrgId(app.getPlanOfOrgId());
         plan.setPlanOfOrgType(app.getPlanOfOrgType());
+        plan.setHasEdit(app.getTaskHasCompleted());
         return plan;
     }
 
@@ -707,6 +734,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         plan.setId(app.getId());
         plan.setNotResumptionOnRest(app.getNotResumptionOnRest());
         plan.setBuildTaskNow(app.getBuildTaskNow());
+
         return plan;
     }
 
@@ -740,6 +768,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         }
         return list;
     }
+
     @Async
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -862,20 +891,24 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
      */
     @Override
     @Async
+    @Transactional
     public void updatePlanCompletedState(Long planId, Integer state) {
         if (ObjectUtil.notEqual(state, 1) && ObjectUtil.notEqual(state, 0) && ObjectUtil.isNotNull(state)) {
             throw new ServiceException("state参数值无效");
         }
 
+        AppPlan plan = baseMapper.selectById(planId);
+        if (ObjectUtil.isNull(plan)) {
+            throw new ServiceException("计划不存在");
+        }
+
         LambdaUpdateWrapper<AppPlan> wrapper = new LambdaUpdateWrapper();
         wrapper.eq(AppPlan::getId, planId)
-                .eq(AppPlan::getTaskHasCompleted, state)
                 .set(AppPlan::getTaskHasCompleted, state);
-        if (ObjectUtil.isNull(state)) {
-            wrapper.isNull(AppPlan::getTaskHasCompleted);
-        } else {
-            wrapper.eq(AppPlan::getTaskHasCompleted, state);
-        }
+
         baseMapper.update(null, wrapper);
+        if (ObjectUtil.isNotNull(plan.getParentId()) && plan.getParentId() > 0) {
+            baseMapper.updateParentPlanCompletedState(plan.getParentId());
+        }
     }
 }

+ 23 - 12
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java

@@ -155,10 +155,11 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
 //    }
 
     /*
-     * 按计划重新生成。为保持通用,参数使用object.只支持同属一个父计划的子计划
+     * 按计划重新生成。为保持通用,参数使用object.只支持同属一个父计划的子计划
      * */
     @Override
     @Transactional
+    @Async
     public void rebuildCurrentCycleTask(List<Object> plans) {
         if (CollectionUtils.isEmpty(plans)) {
             return;
@@ -174,6 +175,10 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
             if (!hsOrgIds.contains(p.getPlanOfOrgId())) {
                 continue;
             }
+            if(ObjectUtil.equal(p.getTaskHasCompleted(),1)){
+                continue;
+            }
+
             appPlans.add(p);
         }
 
@@ -181,18 +186,24 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
             return;
         }
 
-        AppPlan plan = appPlans.get(0);
-        Date workDate = new Date();
-        CycleCommonEnum cycle = CycleCommonEnum.getEnum(plan.getPlanCycle());
-        DateRange range = DateUtils.getStartAndEnd(workDate, cycle);
 
-        List<Resumption> resumptionList = queryTask(range.getStartTime(),range.getEndTime(), cycle, null, appPlans.stream().map(AppPlan::getId).collect(Collectors.toList()));
-        List<Long> deleteIds = resumptionList.stream()
-                .filter(r -> (ObjectUtil.equal(r.getStatus(), 1) || ObjectUtil.equal(r.getStatus(), 2)))
-                .map(Resumption::getId).collect(Collectors.toList());
-        if (CollectionUtils.isNotEmpty(deleteIds)) {
-            baseMapper.deleteBatchIds(deleteIds);
-        }
+        //删除没有已完成计划下的所有任务
+        LambdaUpdateWrapper<Resumption> wrapper=new LambdaUpdateWrapper<>();
+        wrapper.in(Resumption::getPlanId,appPlans.stream().map(p->p.getId()).collect(Collectors.toList()));
+        baseMapper.delete(wrapper);
+
+//        AppPlan plan = appPlans.get(0);
+        Date workDate = new Date();
+//        CycleCommonEnum cycle = CycleCommonEnum.getEnum(plan.getPlanCycle());
+//        DateRange range = DateUtils.getStartAndEnd(workDate, cycle);
+
+//        List<Resumption> resumptionList = queryTask(range.getStartTime(),range.getEndTime(), cycle, null, appPlans.stream().map(AppPlan::getId).collect(Collectors.toList()));
+//        List<Long> deleteIds = resumptionList.stream()
+//                .filter(r -> (ObjectUtil.equal(r.getStatus(), 1) || ObjectUtil.equal(r.getStatus(), 2)))
+//                .map(Resumption::getId).collect(Collectors.toList());
+//        if (CollectionUtils.isNotEmpty(deleteIds)) {
+//            baseMapper.deleteBatchIds(deleteIds);
+//        }
 
         buildTask(null, appPlans, workDate);
     }

+ 33 - 31
soc-modules/soc-modules-core/src/main/resources/mapper/resumption/AppPlanMapper.xml

@@ -225,7 +225,7 @@
                b.DESC          AS item_desc,--                b.item_num,
 --                a.safe_type,
                c.`name`           area_name,
-               ch.check_name         as check_name,
+               ch.check_name   as check_name,
                a.NAME          AS point_name,--                a.point_num,
                h.point_scan,
                h.required,
@@ -305,7 +305,8 @@
         select *
         from core_resumption_plan
         where plan_name like CONCAT('%', #{planName}, '%')
-          and deleted = 0 limit 1
+          and deleted = 0
+        limit 1
     </select>
     <select id="selectPlanNameById" resultType="java.lang.String">
         select plan_name
@@ -398,34 +399,35 @@
         </where>
     </select>
     <select id="selectResumptionPlan" resultType="com.xunmei.core.resumption.gx.vo.ResumptionPlanVo">
-        select
-            q.item_id,
-            q.item_name,
-            q.point_id,
-            q.point_name,
-            q.area_id,
-            w.`name` as area_name,
-            q.check_id,
-            q.plan_id,
-            q.point_scan,
-            q.required
-        from
-            (
-                select
-                    c.id as item_id,
-                    c.`name` as item_name,
-                    b.id as point_id,
-                    b.name as point_name,
-                    b.area_id,
-                    b.check_id,
-                    a.plan_id,
-                    a.point_scan,
-					a.required
-                from core_resumption_plan_to_point a
-                         LEFT JOIN core_resumption_rule_point b on a.point_id = b.id
-                         LEFT JOIN core_resumption_rule_item c on b.item_id = c.id
-                where a.plan_id = #{planId}
-            ) q
-                LEFT JOIN sys_area w on q.area_id = w.id
+        select q.item_id,
+               q.item_name,
+               q.point_id,
+               q.point_name,
+               q.area_id,
+               w.`name` as area_name,
+               q.check_id,
+               q.plan_id,
+               q.point_scan,
+               q.required
+        from (select c.id     as item_id,
+                     c.`name` as item_name,
+                     b.id     as point_id,
+                     b.name   as point_name,
+                     b.area_id,
+                     b.check_id,
+                     a.plan_id,
+                     a.point_scan,
+                     a.required
+              from core_resumption_plan_to_point a
+                       LEFT JOIN core_resumption_rule_point b on a.point_id = b.id
+                       LEFT JOIN core_resumption_rule_item c on b.item_id = c.id
+              where a.plan_id = #{planId}
+                and a.effective_date &lt; #{startDate}) q
+                 LEFT JOIN sys_area w on q.area_id = w.id
     </select>
+    <update id="updateParentPlanCompletedState">
+        UPDATE core_resumption_plan
+        SET task_has_completed = (SELECT c from  (SELECT count(0)  as c from core_resumption_plan WHERE parent_id=#{planId} and task_has_completed=1) a)
+        WHERE id=#{planId}
+    </update>
 </mapper>