From 1c1a866f241fadc188d52d0aa9828b7767ed5be6 Mon Sep 17 00:00:00 2001 From: maxiangong <298222784@qq.com> Date: Fri, 26 Jun 2026 16:08:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A7=BD=E6=B6=B2=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LiquidTankTaskController.java | 3 + .../quality/mapper/LiquidTankTaskMapper.xml | 4 + .../impl/LiquidTankTaskServiceImpl.java | 205 ++++++++++++++++-- 3 files changed, 194 insertions(+), 18 deletions(-) diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java index 304898c00..04b9a46d7 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java @@ -21,6 +21,7 @@ import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.desk.basic.constant.BaseCol; @@ -165,6 +166,8 @@ public class LiquidTankTaskController extends BladeController { // public R> listHandle(@Parameter(hidden = true) @RequestParam Map liquidTankTask, // Query query) { QueryUtils.convertSortField(query); + Long userId = AuthUtil.getUserId(); + liquidTankTask.setTestUserId(userId); IPage pagesVO = service.selectLiquidTankTaskPageByJoin( Condition.getPage(query), liquidTankTask ); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/LiquidTankTaskMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/LiquidTankTaskMapper.xml index 1958a0c08..de8377517 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/LiquidTankTaskMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/LiquidTankTaskMapper.xml @@ -172,6 +172,10 @@ TS_NAME AND task.CREATE_TIME <= #{task.createTimeEnd} + + + AND task.TEST_USER_ID = #{task.testUserId} + ORDER BY TRUNC(task.CREATE_TIME) ASC, task.WORK_TANK_ID ASC, task.WORK_CENTER_ID ASC diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.java index 183a2b1ab..e7e25ca79 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.java @@ -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 selectLiquidTankTaskPage(IPage page, @@ -429,6 +430,7 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl ltList = liquidTankService.list(); + List ltList = liquidTankService.list(new LambdaQueryWrapper().eq(LiquidTank::getTestElement,"test001")); // 遍历插入槽液任务。 for (LiquidTank lt : ltList) { // 如果所在作业槽关闭。则跳过。 @@ -449,6 +451,10 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl qw = new QueryWrapper() .eq(LiquidTankTask.COL_LIQUID_TANK_ID, lt.getId()) @@ -458,30 +464,193 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl weekSet = splitToSet(weekValue); + return weekSet.contains(String.valueOf(weekNum)); + } else if (jobType == 2) { + // 按月:日补零两位 01~31 + String dayStr = String.format("%02d", today.getDayOfMonth()); + Set 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 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 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 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 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 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 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