Browse Source

修改公告通知bug

ouyang 2 năm trước cách đây
mục cha
commit
f7346879b1

+ 1 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/RetrievalTaskCycle.java

@@ -9,7 +9,7 @@ public enum RetrievalTaskCycle
 {
     NOCYCLE(0, "无周期"),
     DAYCYCLE(1, "每日"),
-    WEEKCYCLE(2, "每"),
+    WEEKCYCLE(2, "每"),
     MONTHCYCLE(3, "每月"),
     QUARTERCYCLE(4, "每季度"),
     HALFYEARCYCLE(5, "每半年"),

+ 208 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/impl/CoreMonitoringRetrievalTaskServiceImpl.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.DateRange;
@@ -23,11 +24,14 @@ import com.xunmei.common.core.domain.retrieval.vo.CoreMonitoringRetrievalTaskOne
 import com.xunmei.common.core.domain.retrieval.vo.CoreMonitoringRetrievalTaskVo;
 import com.xunmei.common.core.domain.retrieval.vo.TaskDataVo;
 import com.xunmei.common.core.domain.safetyindex.domain.CoreSafetyExceptionData;
+import com.xunmei.common.core.domain.worktime.dto.WorkTimeDto;
+import com.xunmei.common.core.enums.CycleCommonEnum;
 import com.xunmei.common.core.enums.EduTrainingPlanCycleEnum;
 import com.xunmei.common.core.enums.RetrievalTaskCycle;
 import com.xunmei.common.core.event.WorkTimeChangeEvent;
 import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.core.utils.KeyValue;
 import com.xunmei.common.core.utils.Ymd;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
@@ -43,6 +47,7 @@ import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.RemoteWorkTimeService;
 import com.xunmei.system.api.domain.SysDictData;
 import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.domain.SysWorkTime;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import com.xunmei.system.api.model.LoginUser;
 import io.swagger.models.auth.In;
@@ -51,14 +56,13 @@ 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 javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.ZoneId;
+import java.time.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -586,10 +590,201 @@ public class CoreMonitoringRetrievalTaskServiceImpl extends ServiceImpl<CoreMoni
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void taskChangeForTimeWorkChange(WorkTimeChangeEvent event) {
+        //修改的作息的日期
+        Date ymdDate  =  event.getYmdDate();
+
+        //受影响的机构
+        List<Long> orgIds = event.getOrgIds();
+        //判断ymdDate是否是当天
+        Date today = new Date();
+        //要删除的任务
+        List<CoreMonitoringRetrievalTask> deleteTaskList = new ArrayList<>();
+        //要重新生成任务的机构和计划
+        List<KeyValue> keyValues = new ArrayList<>();
+        //判断ymdDate 月today是否是同一日期
+        if(DateUtil.isSameDay(ymdDate,today)){
+           //获取当天的调阅任务
+            Map<String,Object> dayObjectMap = this.deleteTaskList(ymdDate,orgIds,RetrievalTaskCycle.DAYCYCLE.getCode());
+            List<CoreMonitoringRetrievalTask> list = (List<CoreMonitoringRetrievalTask>) dayObjectMap.get("deleteTaskList");
+            if(CollectionUtil.isNotEmpty(list)){
+                deleteTaskList.addAll(list);
+            }
+            List<KeyValue> keyValueList = (List<KeyValue>) dayObjectMap.get("keyValues");
+            if(CollectionUtil.isNotEmpty(keyValueList)){
+                keyValues.addAll(keyValueList);
+            }
+        }else{
+            //周
+            Map<String,Object> weekObjectMap = this.deleteTaskList(ymdDate,orgIds,RetrievalTaskCycle.WEEKCYCLE.getCode());
+            List<CoreMonitoringRetrievalTask> listweek = (List<CoreMonitoringRetrievalTask>) weekObjectMap.get("deleteTaskList");
+            if(CollectionUtil.isNotEmpty(listweek)){
+                deleteTaskList.addAll(listweek);
+            }
+            List<KeyValue> keyValueListweek = (List<KeyValue>) weekObjectMap.get("keyValues");
+            if(CollectionUtil.isNotEmpty(keyValueListweek)){
+                keyValues.addAll(keyValueListweek);
+            }
+            //月
+            Map<String,Object> monthObjectMap = this.deleteTaskList(ymdDate,orgIds,RetrievalTaskCycle.MONTHCYCLE.getCode());
+            List<CoreMonitoringRetrievalTask> listmonth = (List<CoreMonitoringRetrievalTask>) monthObjectMap.get("deleteTaskList");
+            if(CollectionUtil.isNotEmpty(listmonth)){
+                deleteTaskList.addAll(listmonth);
+            }
+            List<KeyValue> keyValueListmonth = (List<KeyValue>) monthObjectMap.get("keyValues");
+            if(CollectionUtil.isNotEmpty(keyValueListmonth)){
+                keyValues.addAll(keyValueListmonth);
+            }
+            //季度
+            Map<String,Object> quarterObjectMap = this.deleteTaskList(ymdDate,orgIds,RetrievalTaskCycle.QUARTERCYCLE.getCode());
+            List<CoreMonitoringRetrievalTask> listquarter = (List<CoreMonitoringRetrievalTask>) quarterObjectMap.get("deleteTaskList");
+            if(CollectionUtil.isNotEmpty(listquarter)){
+                deleteTaskList.addAll(listquarter);
+            }
+            List<KeyValue> keyValueListquarter = (List<KeyValue>) quarterObjectMap.get("keyValues");
+            if(CollectionUtil.isNotEmpty(keyValueListquarter)){
+                keyValues.addAll(keyValueListquarter);
+            }
+            //半年
+            Map<String,Object> halfYearObjectMap = this.deleteTaskList(ymdDate,orgIds,RetrievalTaskCycle.HALFYEARCYCLE.getCode());
+            List<CoreMonitoringRetrievalTask> listhalfYear = (List<CoreMonitoringRetrievalTask>) halfYearObjectMap.get("deleteTaskList");
+            if(CollectionUtil.isNotEmpty(listhalfYear)){
+                deleteTaskList.addAll(listhalfYear);
+            }
+            List<KeyValue> keyValueListhalfYear = (List<KeyValue>) halfYearObjectMap.get("keyValues");
+            if(CollectionUtil.isNotEmpty(keyValueListhalfYear)){
+                keyValues.addAll(keyValueListhalfYear);
+            }
+            //年
+            Map<String,Object> yearObjectMap = this.deleteTaskList(ymdDate,orgIds,RetrievalTaskCycle.YEARCYCLE.getCode());
+            List<CoreMonitoringRetrievalTask> listYear = (List<CoreMonitoringRetrievalTask>) yearObjectMap.get("deleteTaskList");
+            if(CollectionUtil.isNotEmpty(listYear)){
+                deleteTaskList.addAll(listYear);
+            }
+            List<KeyValue> keyValueListYear = (List<KeyValue>) yearObjectMap.get("keyValues");
+            if(CollectionUtil.isNotEmpty(keyValueListYear)){
+                keyValues.addAll(keyValueListYear);
+            }
+        }
+        //删除任务
+        if(CollectionUtil.isNotEmpty(deleteTaskList)){
+            this.removeBatchByIds(deleteTaskList);
+        }
+        //生成新的任务
+        if(CollectionUtil.isNotEmpty(keyValues)){
+           this.createNewtask(keyValues,ymdDate);
+        }
 
     }
 
+    private void createNewtask(List<KeyValue> keyValues,Date taskTime) {
+        List<CoreMonitoringRetrievalTask> taskList = new ArrayList<>();
+        Set<Long>  planId = new HashSet<>();
+        for(KeyValue keyValue:keyValues){
+            planId.add((Long) keyValue.getValue());
+        }
+        QueryWrapper<TMonitoringRetrievalPlan> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().in(TMonitoringRetrievalPlan::getId, planId);
+        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<>();
+        //获取所有机构
+        List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        for(TMonitoringRetrievalPlan p:plans){
+            List<KeyValue> keyValuesa = keyValues.stream().filter(r->r.getValue().toString().equals(p.getId().toString())).collect(Collectors.toList());
+            List<SysOrg> orgs = orgList.stream().filter(r->keyValuesa.stream().anyMatch(s->s.getKey().toString().equals(r.getId().toString()))).collect(Collectors.toList());
+            for (SysOrg s : orgs) {
+                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()+1));
+            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)) {
+                    taskList.addAll(list);
+                }
+            }
+        }
+        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+1);
+            datetime = dateRange.getStartTime();
+        }
+        queryWrapper.lambda().eq(CoreMonitoringRetrievalTask::getYmdDate,datetime);
+        //公共条件
+        queryWrapper.lambda().in(CoreMonitoringRetrievalTask::getOrgId,orgIds);
+        queryWrapper.lambda().eq(CoreMonitoringRetrievalTask::getCycle,cycle);
+        List<CoreMonitoringRetrievalTask> taskList = this.list(queryWrapper);
+        List<CoreMonitoringRetrievalTask> deleteTaskList = new ArrayList<>();
+        List<KeyValue> 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);
+                        Long planId = taskList2.get(0).getPlanId();
+                        KeyValue keyValue = new KeyValue();
+                        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"));
@@ -602,4 +797,14 @@ public class CoreMonitoringRetrievalTaskServiceImpl extends ServiceImpl<CoreMoni
             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);
+    }
 }