槽液任务

liweidong
maxiangong 1 day ago
parent 3f36a74a3b
commit 1c1a866f24
  1. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java
  2. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/LiquidTankTaskMapper.xml
  3. 181
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.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.Condition;
import org.springblade.core.mp.support.Query; import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser; 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.api.R;
import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.DateUtil;
import org.springblade.desk.basic.constant.BaseCol; import org.springblade.desk.basic.constant.BaseCol;
@ -165,6 +166,8 @@ public class LiquidTankTaskController extends BladeController {
// public R<IPage<LiquidTankTaskVO>> listHandle(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankTask, // public R<IPage<LiquidTankTaskVO>> listHandle(@Parameter(hidden = true) @RequestParam Map<String, Object> liquidTankTask,
// Query query) { // Query query) {
QueryUtils.convertSortField(query); QueryUtils.convertSortField(query);
Long userId = AuthUtil.getUserId();
liquidTankTask.setTestUserId(userId);
IPage<LiquidTankTaskVO> pagesVO = service.selectLiquidTankTaskPageByJoin( IPage<LiquidTankTaskVO> pagesVO = service.selectLiquidTankTaskPageByJoin(
Condition.getPage(query), liquidTankTask Condition.getPage(query), liquidTankTask
); );

@ -172,6 +172,10 @@ TS_NAME
<if test = "task.createTimeEnd != null"> <if test = "task.createTimeEnd != null">
AND task.CREATE_TIME &lt;= #{task.createTimeEnd} AND task.CREATE_TIME &lt;= #{task.createTimeEnd}
</if> </if>
<if test = "task.testUserId != null">
AND task.TEST_USER_ID = #{task.testUserId}
</if>
ORDER BY TRUNC(task.CREATE_TIME) ASC, task.WORK_TANK_ID ASC, task.WORK_CENTER_ID ASC ORDER BY TRUNC(task.CREATE_TIME) ASC, task.WORK_TANK_ID ASC, task.WORK_CENTER_ID ASC
</select> </select>

@ -50,10 +50,9 @@ import org.springblade.wms.pojo.entity.StGoods;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.Instant; import java.time.*;
import java.time.LocalDate; import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters;
import java.time.ZoneId;
import java.util.*; import java.util.*;
/** /**
@ -106,6 +105,8 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
@Resource @Resource
private IUserClient iUserClient; private IUserClient iUserClient;
private static final DateTimeFormatter MM_DD_FORMATTER = DateTimeFormatter.ofPattern("MMdd");
@Override @Override
public IPage<LiquidTankTaskVO> selectLiquidTankTaskPage(IPage<LiquidTankTaskVO> page, public IPage<LiquidTankTaskVO> selectLiquidTankTaskPage(IPage<LiquidTankTaskVO> page,
@ -429,6 +430,7 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
* *
* @return 所有生成的任务 * @return 所有生成的任务
*/ */
@Override
public void generateAuto() { public void generateAuto() {
log.info("####定时生成任务####"); log.info("####定时生成任务####");
// 如果是节假日,则跳过生成。 todo: // 如果是节假日,则跳过生成。 todo:
@ -437,7 +439,7 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
return; return;
} }
// 查询所有的槽液。 // 查询所有的槽液。
List<LiquidTank> ltList = liquidTankService.list(); List<LiquidTank> ltList = liquidTankService.list(new LambdaQueryWrapper<LiquidTank>().eq(LiquidTank::getTestElement,"test001"));
// 遍历插入槽液任务。 // 遍历插入槽液任务。
for (LiquidTank lt : ltList) { for (LiquidTank lt : ltList) {
// 如果所在作业槽关闭。则跳过。 // 如果所在作业槽关闭。则跳过。
@ -449,6 +451,10 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
if (!checkCycleConfig(lt)) { if (!checkCycleConfig(lt)) {
continue; continue;
} }
// 未命中周期跳过
if (!matchCycle(lt.getJobType(), lt.getIsPutOff(), lt.getJobTypeWeekValue(), lt.getJobTypeMonthValue(), lt.getJobTypeYearValue())) {
continue;
}
// 如果有未处理任务,则跳过不生成新任务。 // 如果有未处理任务,则跳过不生成新任务。
QueryWrapper<LiquidTankTask> qw = new QueryWrapper<LiquidTankTask>() QueryWrapper<LiquidTankTask> qw = new QueryWrapper<LiquidTankTask>()
.eq(LiquidTankTask.COL_LIQUID_TANK_ID, lt.getId()) .eq(LiquidTankTask.COL_LIQUID_TANK_ID, lt.getId())
@ -458,13 +464,172 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
log.info("槽液{}存在未处理的槽液任务", lt.getId()); log.info("槽液{}存在未处理的槽液任务", lt.getId());
continue; continue;
} }
LiquidTankTask task = buildLiquidTankTask(lt, LiquidTankTaskConst.FROM_TYPE_PERIODIC, null); LiquidTankTask task = buildLiquidTankTask(lt, LiquidTankTaskConst.FROM_TYPE_PERIODIC, lt.getTestUserId());
save(task); save(task);
} }
log.info("####定时生成任务####"); log.info("####定时生成任务####");
} }
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;
}
// 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;
}
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) { public boolean checkCycleConfig(LiquidTank lt) {
try {
if (lt == null) { if (lt == null) {
return false; return false;
} }
@ -482,6 +647,10 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
return false; return false;
} }
return true; return true;
} catch (Exception e) {
log.warn("不生成 lt id = {}. message = {}", lt.getId(), e.getMessage());
return false;
}
} }
@Override @Override

Loading…
Cancel
Save