update 优化请假天数工具类,删除缓存,加锁处理,可以采用外部传参的形式处理redis部分

This commit is contained in:
AprilWind 2024-12-04 17:25:58 +08:00
parent 1387769f26
commit 4e2090c5f4
2 changed files with 18 additions and 39 deletions

View File

@ -8,6 +8,7 @@ import org.dromara.common.core.domain.dto.DeptDTO;
import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.domain.model.TaskAssigneeBody; import org.dromara.common.core.domain.model.TaskAssigneeBody;
import org.dromara.common.core.enums.FormatsType;
import org.dromara.common.core.enums.TaskAssigneeEnum; import org.dromara.common.core.enums.TaskAssigneeEnum;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DeptService; import org.dromara.common.core.service.DeptService;
@ -119,7 +120,7 @@ public class WfTaskAssigneeServiceImpl implements IWfTaskAssigneeService, Handle
Optional.ofNullable(assignee.getGroupName()) Optional.ofNullable(assignee.getGroupName())
.map(deptService::selectDeptNameByIds) .map(deptService::selectDeptNameByIds)
.orElse(DEFAULT_GROUP_NAME), DEFAULT_GROUP_NAME)) .orElse(DEFAULT_GROUP_NAME), DEFAULT_GROUP_NAME))
.setCreateTime(assignee -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime())); .setCreateTime(assignee -> DateUtils.parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime()));
} }
/** /**

View File

@ -1,19 +1,10 @@
package org.dromara.workflow.utils; package org.dromara.workflow.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.redis.utils.RedisUtils;
import java.util.Calendar; import java.util.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/** /**
* 工作日工具类 * 工作日工具类
@ -23,11 +14,16 @@ import java.util.List;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class WorkDaysUtils { public class WorkDaysUtils {
private static final String DAYS_IN_YEARS_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "DAYS_IN_YEARS:"; private static final Map<Integer, Integer[]> DAYS_IN_YEARS = new HashMap<>();
private static final LockTemplate LOCK_TEMPLATE = SpringUtils.getBean(LockTemplate.class);
//工作日 /**
* 工作日
*/
public static final int WORKDAY = 0; public static final int WORKDAY = 0;
//休息日
/**
* 休息日
*/
public static final int RESTDAY = 1; public static final int RESTDAY = 1;
/** /**
@ -130,13 +126,6 @@ public class WorkDaysUtils {
return workDays; return workDays;
} }
/**
* 删除指定年份的数据
*/
public static void clearData(Integer year) {
RedisUtils.deleteObject(DAYS_IN_YEARS_KEY + year);
}
/** /**
* 计算指定年份的工作日数组标记个人的加班和调休日期 * 计算指定年份的工作日数组标记个人的加班和调休日期
* *
@ -162,29 +151,18 @@ public class WorkDaysUtils {
* @return 表示一年中每一天的状态数组0 表示工作日1 表示周末 * @return 表示一年中每一天的状态数组0 表示工作日1 表示周末
*/ */
private static Integer[] daysInYear(Integer year) { private static Integer[] daysInYear(Integer year) {
String key = DAYS_IN_YEARS_KEY + year; if (DAYS_IN_YEARS.containsKey(year)) {
Integer[] daysInYears = RedisUtils.getCacheObject(key); return DAYS_IN_YEARS.get(year);
if (ArrayUtil.isNotEmpty(daysInYears)) { } else {
return daysInYears;
}
LockInfo lock = LOCK_TEMPLATE.lock(key);
try {
// 再次检查缓存防止缓存穿透
daysInYears = RedisUtils.getCacheObject(key);
if (ArrayUtil.isNotEmpty(daysInYears)) {
return daysInYears;
}
// 如果年份数据不存在则生成指定年份的数据 // 如果年份数据不存在则生成指定年份的数据
Integer[] daysArray = generateDaysArray(year); Integer[] daysArray = generateDaysArray(year);
RedisUtils.setCacheObject(key, daysArray); DAYS_IN_YEARS.put(year, daysArray);
return daysArray; return daysArray;
} finally {
LOCK_TEMPLATE.releaseLock(lock);
} }
} }
/** /**
* 根据指定年份生成天数数组其中工作日用 0 表示周末用 1 表示 * 根据指定年份生成天数数组
* *
* @param year 指定年份 * @param year 指定年份
* @return 表示一年中每一天的状态数组 * @return 表示一年中每一天的状态数组
@ -216,7 +194,7 @@ public class WorkDaysUtils {
* @param valueToSet 休息日用 1工作日用 0 * @param valueToSet 休息日用 1工作日用 0
*/ */
private static void updateDaysArray(Integer[] daysArray, List<Date> days, int valueToSet) { private static void updateDaysArray(Integer[] daysArray, List<Date> days, int valueToSet) {
if (CollUtil.isEmpty(days)) { if (ArrayUtil.isEmpty(days)) {
return; return;
} }