|
|
|
|
@ -50,10 +50,9 @@ import org.springblade.wms.pojo.entity.StGoods; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
import java.time.Instant; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
|
import java.time.ZoneId; |
|
|
|
|
import java.time.*; |
|
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
|
import java.time.temporal.TemporalAdjusters; |
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -106,6 +105,8 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap |
|
|
|
|
@Resource |
|
|
|
|
private IUserClient iUserClient; |
|
|
|
|
|
|
|
|
|
private static final DateTimeFormatter MM_DD_FORMATTER = DateTimeFormatter.ofPattern("MMdd"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public IPage<LiquidTankTaskVO> selectLiquidTankTaskPage(IPage<LiquidTankTaskVO> page, |
|
|
|
|
@ -429,6 +430,7 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap |
|
|
|
|
* |
|
|
|
|
* @return 所有生成的任务 |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public void generateAuto() { |
|
|
|
|
log.info("####定时生成任务####"); |
|
|
|
|
// 如果是节假日,则跳过生成。 todo:
|
|
|
|
|
@ -437,7 +439,7 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 查询所有的槽液。
|
|
|
|
|
List<LiquidTank> ltList = liquidTankService.list(); |
|
|
|
|
List<LiquidTank> ltList = liquidTankService.list(new LambdaQueryWrapper<LiquidTank>().eq(LiquidTank::getTestElement,"test001")); |
|
|
|
|
// 遍历插入槽液任务。
|
|
|
|
|
for (LiquidTank lt : ltList) { |
|
|
|
|
// 如果所在作业槽关闭。则跳过。
|
|
|
|
|
@ -449,6 +451,10 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap |
|
|
|
|
if (!checkCycleConfig(lt)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// 未命中周期跳过
|
|
|
|
|
if (!matchCycle(lt.getJobType(), lt.getIsPutOff(), lt.getJobTypeWeekValue(), lt.getJobTypeMonthValue(), lt.getJobTypeYearValue())) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// 如果有未处理任务,则跳过不生成新任务。
|
|
|
|
|
QueryWrapper<LiquidTankTask> qw = new QueryWrapper<LiquidTankTask>() |
|
|
|
|
.eq(LiquidTankTask.COL_LIQUID_TANK_ID, lt.getId()) |
|
|
|
|
@ -458,30 +464,193 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap |
|
|
|
|
log.info("槽液{}存在未处理的槽液任务", lt.getId()); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
LiquidTankTask task = buildLiquidTankTask(lt, LiquidTankTaskConst.FROM_TYPE_PERIODIC, null); |
|
|
|
|
LiquidTankTask task = buildLiquidTankTask(lt, LiquidTankTaskConst.FROM_TYPE_PERIODIC, lt.getTestUserId()); |
|
|
|
|
save(task); |
|
|
|
|
} |
|
|
|
|
log.info("####定时生成任务####"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean checkCycleConfig(LiquidTank lt) { |
|
|
|
|
if (lt == null) { |
|
|
|
|
private boolean matchCycle(Integer jobType, Long isPutOff, String weekValue, String monthValue, String yearValue) { |
|
|
|
|
LocalDate today = LocalDate.now(); |
|
|
|
|
if (jobType == 1) { |
|
|
|
|
// 按周:周一=1,周日=7
|
|
|
|
|
DayOfWeek week = today.getDayOfWeek(); |
|
|
|
|
int weekNum = week.getValue(); |
|
|
|
|
Set<String> weekSet = splitToSet(weekValue); |
|
|
|
|
return weekSet.contains(String.valueOf(weekNum)); |
|
|
|
|
} else if (jobType == 2) { |
|
|
|
|
// 按月:日补零两位 01~31
|
|
|
|
|
String dayStr = String.format("%02d", today.getDayOfMonth()); |
|
|
|
|
Set<String> monthSet = splitToSet(monthValue); |
|
|
|
|
boolean contains = monthSet.contains(dayStr); |
|
|
|
|
if (isPutOff == 0L) { |
|
|
|
|
return contains; |
|
|
|
|
} else if (isPutOff == 1L) { |
|
|
|
|
DayOfWeek week = today.getDayOfWeek(); |
|
|
|
|
int weekNum = week.getValue(); |
|
|
|
|
if (weekNum == 6 || weekNum == 7) { |
|
|
|
|
return false; |
|
|
|
|
} else if (weekNum == 1) { |
|
|
|
|
return contains || isMonthMatchWeekend(monthSet) || isNeedRunMonthTask(monthSet); |
|
|
|
|
} else { |
|
|
|
|
return contains; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} else if (jobType == 3) { |
|
|
|
|
// 按年:MMdd 四位字符串
|
|
|
|
|
String mmdd = today.format(MM_DD_FORMATTER); |
|
|
|
|
Set<String> yearSet = splitToSet(yearValue); |
|
|
|
|
boolean contains = yearSet.contains(mmdd); |
|
|
|
|
if (isPutOff == 0L) { |
|
|
|
|
return contains; |
|
|
|
|
} else if (isPutOff == 1) { |
|
|
|
|
DayOfWeek week = today.getDayOfWeek(); |
|
|
|
|
int weekNum = week.getValue(); |
|
|
|
|
if (weekNum == 6 || weekNum == 7) { |
|
|
|
|
return false; |
|
|
|
|
} else if (weekNum == 1) { |
|
|
|
|
return contains || isYearMatchWeekend(yearSet) || isNeedRunYearTask(yearSet); |
|
|
|
|
} else { |
|
|
|
|
return contains; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断每月配置上周末是否需要执行 |
|
|
|
|
* |
|
|
|
|
* @param configMonthSet |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean isMonthMatchWeekend(Set<String> configMonthSet) { |
|
|
|
|
LocalDate today = LocalDate.now(); |
|
|
|
|
LocalDate lastSat = today.minusDays(2); |
|
|
|
|
LocalDate lastSun = today.minusDays(1); |
|
|
|
|
String lastSatDayStr = String.format("%02d", lastSat.getDayOfMonth()); |
|
|
|
|
String lastSunDayStr = String.format("%02d", lastSun.getDayOfMonth()); |
|
|
|
|
return configMonthSet.contains(lastSatDayStr) || configMonthSet.contains(lastSunDayStr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断每年配置上周末是否需要执行 |
|
|
|
|
* |
|
|
|
|
* @param configYearSet |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean isYearMatchWeekend(Set<String> configYearSet) { |
|
|
|
|
LocalDate today = LocalDate.now(); |
|
|
|
|
LocalDate lastSat = today.minusDays(2); |
|
|
|
|
LocalDate lastSun = today.minusDays(1); |
|
|
|
|
String lastSatmmdd = lastSat.format(MM_DD_FORMATTER); |
|
|
|
|
String lastSunmmdd = lastSun.format(MM_DD_FORMATTER); |
|
|
|
|
return configYearSet.contains(lastSatmmdd) || configYearSet.contains(lastSunmmdd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断每年配置上个月是否超出最大天数,本月第一个周一执行 |
|
|
|
|
* |
|
|
|
|
* @param configYearSet |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean isNeedRunYearTask(Set<String> configYearSet) { |
|
|
|
|
LocalDate today = LocalDate.now(); |
|
|
|
|
// 1. 判断今天是不是本月第一个周一
|
|
|
|
|
if (!isFirstMondayOfMonth(today)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
JobExt je = new JobExt(); |
|
|
|
|
je.setJobType(lt.getJobType()); |
|
|
|
|
je.setJobTypeWeekValue(lt.getJobTypeWeekValue()); |
|
|
|
|
je.setJobTypeMonthValue(lt.getJobTypeMonthValue()); |
|
|
|
|
je.setJobTypeYearValue(lt.getJobTypeYearValue()); |
|
|
|
|
String checkFailMsg = JobExtUtil.check(je); |
|
|
|
|
if (StringUtils.isNotBlank(checkFailMsg)) { |
|
|
|
|
log.warn("不生成 lt id = {}. checkStr = {}", lt.getId(), checkFailMsg); |
|
|
|
|
// 2. 获取上个月年月
|
|
|
|
|
YearMonth lastYearMonth = YearMonth.from(today).minusMonths(1); |
|
|
|
|
int lastMaxDay = lastYearMonth.lengthOfMonth(); |
|
|
|
|
int lastMonthNum = lastYearMonth.getMonthValue(); |
|
|
|
|
|
|
|
|
|
// 3. 遍历所有配置,检查是否存在上月月份、且配置日大于上月最大天数
|
|
|
|
|
for (String mmdd : configYearSet) { |
|
|
|
|
// 拆分MM、dd
|
|
|
|
|
int configMonth = Integer.parseInt(mmdd.substring(0, 2)); |
|
|
|
|
int configDay = Integer.parseInt(mmdd.substring(2)); |
|
|
|
|
// 匹配上月的配置
|
|
|
|
|
if (configMonth == lastMonthNum) { |
|
|
|
|
if (configDay > lastMaxDay) { |
|
|
|
|
// 存在需要顺延的配置,满足执行条件
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 无需要顺延的配置,不执行
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断每月配置上个月是否超过最大天数,本月第一个周一执行 |
|
|
|
|
* |
|
|
|
|
* @param configMonthSet |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean isNeedRunMonthTask(Set<String> configMonthSet) { |
|
|
|
|
LocalDate today = LocalDate.now(); |
|
|
|
|
// 1. 判断今天是不是本月第一个周一
|
|
|
|
|
if (!isFirstMondayOfMonth(today)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (lt.getAnalysisCycle() < 0) { |
|
|
|
|
int maxRuleDay = configMonthSet.stream() |
|
|
|
|
.map(Integer::parseInt) |
|
|
|
|
.mapToInt(Integer::intValue) |
|
|
|
|
.max() |
|
|
|
|
.orElse(0); |
|
|
|
|
LocalDate lastMonthEnd = today.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()); |
|
|
|
|
int lastMonthMaxDay = lastMonthEnd.getDayOfMonth(); |
|
|
|
|
return maxRuleDay > lastMonthMaxDay; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static boolean isFirstMondayOfMonth(LocalDate today) { |
|
|
|
|
// 获取本月第一个周一
|
|
|
|
|
LocalDate firstMonday = today.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); |
|
|
|
|
// 日期相等就是当月第一个周一
|
|
|
|
|
return today.isEqual(firstMonday); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 逗号分割字符串转无重复集合 |
|
|
|
|
*/ |
|
|
|
|
private static Set<String> splitToSet(String str) { |
|
|
|
|
if (str == null || str.isBlank()) { |
|
|
|
|
return new HashSet<>(); |
|
|
|
|
} |
|
|
|
|
String[] arr = str.split(","); |
|
|
|
|
return new HashSet<>(Arrays.asList(arr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean checkCycleConfig(LiquidTank lt) { |
|
|
|
|
try { |
|
|
|
|
if (lt == null) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
JobExt je = new JobExt(); |
|
|
|
|
je.setJobType(lt.getJobType()); |
|
|
|
|
je.setJobTypeWeekValue(lt.getJobTypeWeekValue()); |
|
|
|
|
je.setJobTypeMonthValue(lt.getJobTypeMonthValue()); |
|
|
|
|
je.setJobTypeYearValue(lt.getJobTypeYearValue()); |
|
|
|
|
String checkFailMsg = JobExtUtil.check(je); |
|
|
|
|
if (StringUtils.isNotBlank(checkFailMsg)) { |
|
|
|
|
log.warn("不生成 lt id = {}. checkStr = {}", lt.getId(), checkFailMsg); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (lt.getAnalysisCycle() < 0) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.warn("不生成 lt id = {}. message = {}", lt.getId(), e.getMessage()); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|