Selaa lähdekoodia

修改节假日迁移逻辑

小车车 3 kuukautta sitten
vanhempi
sitoutus
d98145cc24

+ 94 - 7
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/sop/SopExecutionPlanServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.sop.vo.*;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.holiday.HolidayDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.sop.SopDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.sop.SopExecutionPlanDO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.sop.SopExecutionPlanMapper;
@@ -14,12 +15,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
 import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * SOP计划执行 Service 实现类
@@ -96,7 +101,7 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
         // 年
         if (frequencyUnit.equals(0)) {
             // 处理年的数据
-            String yyyymmdd = StringUtils.isBlank(effectiveTime) ?  SuperDateUtils.getYYYYMMDD() : effectiveTime;
+            String yyyymmdd = StringUtils.isBlank(effectiveTime) ? SuperDateUtils.getYYYYMMDD() : effectiveTime;
             List<String> adjacentDatesYearDay = SuperDateUtils.getAdjacentDatesYearDay(
                     yyyymmdd,
                     "9999-12-31",
@@ -108,7 +113,7 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
         // 月
         if (frequencyUnit.equals(1)) {
             // 处理月的数据
-            String yyyymmdd = StringUtils.isBlank(effectiveTime) ?  SuperDateUtils.getYYYYMMDD() : effectiveTime;
+            String yyyymmdd = StringUtils.isBlank(effectiveTime) ? SuperDateUtils.getYYYYMMDD() : effectiveTime;
             List<String> adjacentDatesMonthDay = SuperDateUtils.getAdjacentDatesMonthDay(
                     yyyymmdd,
                     "9999-12-31",
@@ -120,7 +125,7 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
         // 周
         if (frequencyUnit.equals(2)) {
             // 处理周的数据
-            String yyyymmdd = StringUtils.isBlank(effectiveTime) ?  SuperDateUtils.getYYYYMMDD() : effectiveTime;
+            String yyyymmdd = StringUtils.isBlank(effectiveTime) ? SuperDateUtils.getYYYYMMDD() : effectiveTime;
             List<String> adjacentDatesByWeekday = SuperDateUtils.getAdjacentDatesByWeekday(
                     yyyymmdd,
                     "9999-12-31",
@@ -132,7 +137,7 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
         // 天
         if (frequencyUnit.equals(3)) {
             // 处理天的数据
-            String yyyymmdd = StringUtils.isBlank(effectiveTime) ?  SuperDateUtils.getYYYYMMDD() : effectiveTime;
+            String yyyymmdd = StringUtils.isBlank(effectiveTime) ? SuperDateUtils.getYYYYMMDD() : effectiveTime;
             List<String> adjacentDatesByDay = SuperDateUtils.getAdjacentDatesByDay(
                     yyyymmdd,
                     "9999-12-31",
@@ -215,10 +220,10 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
                     bean.getFrequency(),
                     count);
         }
-        // 3.去除日历里面安排的休息日
-        List<String> workDaysFromDays = holidayService.getWorkDaysFromDays(days);
+        // 3.开始处理有效时间
+        List<String> workDaysFromDays = handleNonWork(days, sopExecutionPlanDO.getNonWorkDay(), sopExecutionPlanDO.getNonWorkMoveDay());
         // 4.获取有效天数的模拟数据
-        if (!workDaysFromDays.isEmpty()) {
+        if (workDaysFromDays != null && !workDaysFromDays.isEmpty()) {
             for (String s : workDaysFromDays) {
                 SopPreviewDataVO sopPreviewDataVO = new SopPreviewDataVO();
                 sopPreviewDataVO.setPlanDay(s);
@@ -234,6 +239,88 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
         return bean;
     }
 
+    /**
+     * 处理非工作日的数据
+     *
+     * @param days           生成的日期,未作非工作日处理
+     * @param nonWorkDay     非工作日(0-照常执行 1-不执行 2-向前顺延 3-向后顺延 )
+     * @param nonWorkMoveDay 延长天数
+     */
+    private List<String> handleNonWork(List<String> days, Integer nonWorkDay, Integer nonWorkMoveDay) {
+        if (days.isEmpty() || nonWorkDay == null) {
+            return days;
+        }
+        // 1.照常执行
+        if (nonWorkDay.equals(0)) {
+            return days;
+        }
+        // 2.不执行
+        if (nonWorkDay.equals(1)) {
+            List<String> workDaysFromDays = holidayService.getWorkDaysFromDays(days);
+            return workDaysFromDays;
+        }
+        // 3.向前顺延
+        if (nonWorkDay.equals(2) && nonWorkMoveDay != null && nonWorkMoveDay > 0) {
+            Set<String> workDaysFromDays = new HashSet<>();
+            // 属于假日的日期
+            List<HolidayDO> holidayDOS = holidayService.list(Wrappers.<HolidayDO>lambdaQuery()
+                    .in(HolidayDO::getTheDay, days)
+                    .eq(HolidayDO::getHolidayType, "HOLIDAY"));
+            // 循环,把假日的日期往前顺延
+            for (String day : days) {
+                boolean b = false;
+                for (HolidayDO holidayDO : holidayDOS) {
+                    if (holidayDO.getTheDay().equals(day)) {
+                        b = true;
+                        break;
+                    }
+                }
+                if (b) {
+                    // 节假日,开始顺延变更数据
+                    LocalDate parse = LocalDate.parse(day);
+                    LocalDate localDate = parse.minusDays(nonWorkMoveDay);
+                    String string = localDate.toString();
+                    workDaysFromDays.add(string);
+                } else {
+                    // 工作日,不做处理
+                    workDaysFromDays.add(day);
+                }
+            }
+            return workDaysFromDays.stream().sorted().toList();
+        }
+        // 4.向后顺延
+        if (nonWorkDay.equals(2) && nonWorkMoveDay != null && nonWorkMoveDay > 0) {
+            Set<String> workDaysFromDays = new HashSet<>();
+            // 属于假日的日期
+            List<HolidayDO> holidayDOS = holidayService.list(Wrappers.<HolidayDO>lambdaQuery()
+                    .in(HolidayDO::getTheDay, days)
+                    .eq(HolidayDO::getHolidayType, "HOLIDAY"));
+            // 循环,把假日的日期往前顺延
+            for (String day : days) {
+                boolean b = false;
+                for (HolidayDO holidayDO : holidayDOS) {
+                    if (holidayDO.getTheDay().equals(day)) {
+                        b = true;
+                        break;
+                    }
+                }
+                if (b) {
+                    // 节假日,开始顺延变更数据
+                    LocalDate parse = LocalDate.parse(day);
+                    LocalDate localDate = parse.plusDays(nonWorkMoveDay);
+                    String string = localDate.toString();
+                    workDaysFromDays.add(string);
+                } else {
+                    // 工作日,不做处理
+                    workDaysFromDays.add(day);
+                }
+            }
+            return workDaysFromDays.stream().sorted().toList();
+        }
+        return days;
+    }
+
+
     @Override
     public SopExecutionPlanRespVO selectSopExecutionPlanBySopId(Long sopId) {
         SopExecutionPlanDO sopExecutionPlanDO = getOne(Wrappers.<SopExecutionPlanDO>lambdaQuery()