diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index 3a98ec153..7ee05b49c 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -2,6 +2,7 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,7 +15,6 @@ import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.enums.PushSourceEnum; import org.dromara.common.core.enums.PushTypeEnum; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; @@ -98,7 +98,7 @@ public class AuthController { PushPayloadDTO.of( PushTypeEnum.MESSAGE, PushSourceEnum.BACKEND, - DateUtils.getTodayHour(new Date()) + "好,欢迎登录 RuoYi-Vue-Plus 后台管理系统", + DateUtil.isAM(new Date()) ? "上午" : "下午" + "好,欢迎登录 RuoYi-Vue-Plus 后台管理系统", null ) ); diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java deleted file mode 100644 index 6df247a87..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/FormatsType.java +++ /dev/null @@ -1,152 +0,0 @@ -package org.dromara.common.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.common.core.utils.StringUtils; - -/* - * 日期格式 - * "yyyy":4位数的年份,例如:2023年表示为"2023"。 - * "yy":2位数的年份,例如:2023年表示为"23"。 - * "MM":2位数的月份,取值范围为01到12,例如:7月表示为"07"。 - * "M":不带前导零的月份,取值范围为1到12,例如:7月表示为"7"。 - * "dd":2位数的日期,取值范围为01到31,例如:22日表示为"22"。 - * "d":不带前导零的日期,取值范围为1到31,例如:22日表示为"22"。 - * "EEEE":星期的全名,例如:星期三表示为"Wednesday"。 - * "E":星期的缩写,例如:星期三表示为"Wed"。 - * "DDD" 或 "D":一年中的第几天,取值范围为001到366,例如:第200天表示为"200"。 - * 时间格式 - * "HH":24小时制的小时数,取值范围为00到23,例如:下午5点表示为"17"。 - * "hh":12小时制的小时数,取值范围为01到12,例如:下午5点表示为"05"。 - * "mm":分钟数,取值范围为00到59,例如:30分钟表示为"30"。 - * "ss":秒数,取值范围为00到59,例如:45秒表示为"45"。 - * "SSS":毫秒数,取值范围为000到999,例如:123毫秒表示为"123"。 - */ - -/** - * 日期格式与时间格式枚举 - */ -@Getter -@AllArgsConstructor -public enum FormatsType { - - /** - * 例如:2023年表示为"23" - */ - YY("yy"), - - /** - * 例如:2023年表示为"2023" - */ - YYYY("yyyy"), - - /** - * 例例如,2023年7月可以表示为 "2023-07" - */ - YYYY_MM("yyyy-MM"), - - /** - * 例如,日期 "2023年7月22日" 可以表示为 "2023-07-22" - */ - YYYY_MM_DD("yyyy-MM-dd"), - - /** - * 例如,当前时间如果是 "2023年7月22日下午3点30分",则可以表示为 "2023-07-22 15:30" - */ - YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"), - - /** - * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023-07-22 15:30:45" - */ - YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"), - - /** - * 例如:下午3点30分45秒,表示为 "15:30:45" - */ - HH_MM_SS("HH:mm:ss"), - - /** - * 例例如,2023年7月可以表示为 "2023/07" - */ - YYYY_MM_SLASH("yyyy/MM"), - - /** - * 例如,日期 "2023年7月22日" 可以表示为 "2023/07/22" - */ - YYYY_MM_DD_SLASH("yyyy/MM/dd"), - - /** - * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023/07/22 15:30:45" - */ - YYYY_MM_DD_HH_MM_SLASH("yyyy/MM/dd HH:mm"), - - /** - * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023/07/22 15:30:45" - */ - YYYY_MM_DD_HH_MM_SS_SLASH("yyyy/MM/dd HH:mm:ss"), - - /** - * 例例如,2023年7月可以表示为 "2023.07" - */ - YYYY_MM_DOT("yyyy.MM"), - - /** - * 例如,日期 "2023年7月22日" 可以表示为 "2023.07.22" - */ - YYYY_MM_DD_DOT("yyyy.MM.dd"), - - /** - * 例如,当前时间如果是 "2023年7月22日下午3点30分",则可以表示为 "2023.07.22 15:30" - */ - YYYY_MM_DD_HH_MM_DOT("yyyy.MM.dd HH:mm"), - - /** - * 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023.07.22 15:30:45" - */ - YYYY_MM_DD_HH_MM_SS_DOT("yyyy.MM.dd HH:mm:ss"), - - /** - * 例如,2023年7月可以表示为 "202307" - */ - YYYYMM("yyyyMM"), - - /** - * 例如,2023年7月22日可以表示为 "20230722" - */ - YYYYMMDD("yyyyMMdd"), - - /** - * 例如,2023年7月22日下午3点可以表示为 "2023072215" - */ - YYYYMMDDHH("yyyyMMddHH"), - - /** - * 例如,2023年7月22日下午3点30分可以表示为 "202307221530" - */ - YYYYMMDDHHMM("yyyyMMddHHmm"), - - /** - * 例如,2023年7月22日下午3点30分45秒可以表示为 "20230722153045" - */ - YYYYMMDDHHMMSS("yyyyMMddHHmmss"); - - /** - * 时间格式 - */ - private final String timeFormat; - - /** - * 根据字符串内容匹配时间格式类型。 - * - * @param str 字符串内容 - * @return 时间格式类型 - */ - public static FormatsType getFormatsType(String str) { - for (FormatsType value : values()) { - if (StringUtils.contains(str, value.getTimeFormat())) { - return value; - } - } - throw new RuntimeException("'FormatsType' not found By " + str); - } -} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java deleted file mode 100644 index b349de644..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java +++ /dev/null @@ -1,421 +0,0 @@ -package org.dromara.common.core.utils; - -import cn.hutool.core.date.DateUnit; -import cn.hutool.core.date.DateUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.commons.lang3.time.DateFormatUtils; -import org.dromara.common.core.enums.FormatsType; -import org.dromara.common.core.exception.ServiceException; - -import java.lang.management.ManagementFactory; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -/** - * 时间工具类 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DateUtils extends org.apache.commons.lang3.time.DateUtils { - /** - * 日期解析格式集合。 - */ - private static final String[] PARSE_PATTERNS = { - "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", - "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", - "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM" - }; - - /** - * 获取当前日期和时间 - * - * @return 当前日期和时间的 Date 对象表示 - */ - public static Date getNowDate() { - return new Date(); - } - - /** - * 获取当前日期的字符串表示,格式为YYYY-MM-DD - * - * @return 当前日期的字符串表示 - */ - public static String getDate() { - return dateTimeNow(FormatsType.YYYY_MM_DD); - } - - /** - * 获取当前日期的字符串表示,格式为yyyyMMdd - * - * @return 当前日期的字符串表示 - */ - public static String getCurrentDate() { - return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat()); - } - - /** - * 获取当前日期的路径格式字符串,格式为"yyyy/MM/dd" - * - * @return 当前日期的路径格式字符串 - */ - public static String datePath() { - Date now = new Date(); - return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat()); - } - - /** - * 获取当前时间的字符串表示,格式为YYYY-MM-DD HH:MM:SS - * - * @return 当前时间的字符串表示 - */ - public static String getTime() { - return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS); - } - - /** - * 获取当前时间的字符串表示,格式为 "HH:MM:SS" - * - * @return 当前时间的字符串表示,格式为 "HH:MM:SS" - */ - public static String getTimeWithHourMinuteSecond() { - return dateTimeNow(FormatsType.HH_MM_SS); - } - - /** - * 获取当前日期和时间的字符串表示,格式为YYYYMMDDHHMMSS - * - * @return 当前日期和时间的字符串表示 - */ - public static String dateTimeNow() { - return dateTimeNow(FormatsType.YYYYMMDDHHMMSS); - } - - /** - * 获取当前日期和时间的指定格式的字符串表示 - * - * @param format 日期时间格式,例如"YYYY-MM-DD HH:MM:SS" - * @return 当前日期和时间的字符串表示 - */ - public static String dateTimeNow(final FormatsType format) { - return parseDateToStr(format, new Date()); - } - - /** - * 将指定日期格式化为 YYYY-MM-DD 格式的字符串 - * - * @param date 要格式化的日期对象 - * @return 格式化后的日期字符串 - */ - public static String formatDate(final Date date) { - return parseDateToStr(FormatsType.YYYY_MM_DD, date); - } - - /** - * 将指定日期格式化为 YYYY-MM-DD HH:MM:SS 格式的字符串 - * - * @param date 要格式化的日期对象 - * @return 格式化后的日期时间字符串 - */ - public static String formatDateTime(final Date date) { - return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date); - } - - /** - * 将 LocalDateTime 格式化为 YYYY-MM-DD HH:MM:SS 格式的字符串 - * - * @param dateTime 要格式化的 LocalDateTime 对象 - * @return 格式化后的日期时间字符串 - */ - public static String formatDateTime(final LocalDateTime dateTime) { - return dateTime.format(DateTimeFormatter.ofPattern(FormatsType.YYYY_MM_DD_HH_MM_SS.getTimeFormat())); - } - - /** - * 将指定日期按照指定格式进行格式化 - * - * @param format 要使用的日期时间格式,例如"YYYY-MM-DD HH:MM:SS" - * @param date 要格式化的日期对象 - * @return 格式化后的日期时间字符串 - */ - public static String parseDateToStr(final FormatsType format, final Date date) { - return new SimpleDateFormat(format.getTimeFormat()).format(date); - } - - /** - * 将指定格式的日期时间字符串转换为 Date 对象 - * - * @param format 要解析的日期时间格式,例如"YYYY-MM-DD HH:MM:SS" - * @param ts 要解析的日期时间字符串 - * @return 解析后的 Date 对象 - * @throws RuntimeException 如果解析过程中发生异常 - */ - public static Date parseDateTime(final FormatsType format, final String ts) { - try { - return new SimpleDateFormat(format.getTimeFormat()).parse(ts); - } catch (ParseException e) { - throw new ServiceException("日期时间解析失败:" + ts, e); - } - } - - /** - * 将对象转换为日期对象 - * - * @param str 要转换的对象,通常是字符串 - * @return 转换后的日期对象,如果转换失败或输入为null,则返回null - */ - public static Date parseDate(Object str) { - if (str == null) { - return null; - } - try { - return parseDate(str.toString(), PARSE_PATTERNS); - } catch (ParseException e) { - return null; - } - } - - /** - * 获取服务器启动时间 - * - * @return 服务器启动时间的 Date 对象表示 - */ - public static Date getServerStartDate() { - long time = ManagementFactory.getRuntimeMXBean().getStartTime(); - return new Date(time); - } - - /** - * 计算两个时间之间的时间差,并以指定单位返回(绝对值) - * - * @param start 起始时间 - * @param end 结束时间 - * @param unit 所需返回的时间单位(DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、MICROSECONDS、NANOSECONDS) - * @return 时间差的绝对值,以指定单位表示 - */ - public static long difference(Date start, Date end, TimeUnit unit) { - // 计算时间差,单位为毫秒,取绝对值避免负数 - long diffInMillis = Math.abs(end.getTime() - start.getTime()); - - // 根据目标单位转换时间差 - return switch (unit) { - case DAYS -> diffInMillis / TimeUnit.DAYS.toMillis(1); - case HOURS -> diffInMillis / TimeUnit.HOURS.toMillis(1); - case MINUTES -> diffInMillis / TimeUnit.MINUTES.toMillis(1); - case SECONDS -> diffInMillis / TimeUnit.SECONDS.toMillis(1); - case MILLISECONDS -> diffInMillis; - case MICROSECONDS -> TimeUnit.MILLISECONDS.toMicros(diffInMillis); - case NANOSECONDS -> TimeUnit.MILLISECONDS.toNanos(diffInMillis); - }; - } - - /** - * 计算两个日期之间的时间差,并以天、小时和分钟的格式返回 - * - * @param endDate 结束日期 - * @param nowDate 当前日期 - * @return 表示时间差的字符串,格式为"天 小时 分钟" - */ - public static String getDatePoor(Date endDate, Date nowDate) { - long diffInMillis = endDate.getTime() - nowDate.getTime(); - long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); - long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; - long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; - return String.format("%d天 %d小时 %d分钟", day, hour, min); - } - - /** - * 计算两个时间点的差值(天、小时、分钟、秒),当值为0时不显示该单位 - * - * @param endDate 结束时间 - * @param nowDate 当前时间 - * @return 时间差字符串,格式为 "x天 x小时 x分钟 x秒",若为 0 则不显示 - */ - public static String getTimeDifference(Date endDate, Date nowDate) { - long diffInMillis = endDate.getTime() - nowDate.getTime(); - long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); - long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; - long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; - long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60; - // 构建时间差字符串,条件是值不为0才显示 - StringBuilder result = new StringBuilder(); - if (day > 0) { - result.append(String.format("%d天 ", day)); - } - if (hour > 0) { - result.append(String.format("%d小时 ", hour)); - } - if (min > 0) { - result.append(String.format("%d分钟 ", min)); - } - if (sec > 0) { - result.append(String.format("%d秒", sec)); - } - return !result.isEmpty() ? result.toString().trim() : "0秒"; - } - - /** - * 计算两个 LocalDateTime 时间点的差值(天、小时、分钟、秒),当值为0时不显示该单位 - * - * @param endDate 结束时间 - * @param nowDate 当前时间 - * @return 时间差字符串,格式为 "x天 x小时 x分钟 x秒",若为 0 则不显示 - */ - public static String getTimeDifference(LocalDateTime endDate, LocalDateTime nowDate) { - long diffInMillis = java.time.Duration.between(nowDate, endDate).toMillis(); - long day = TimeUnit.MILLISECONDS.toDays(diffInMillis); - long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24; - long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60; - long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60; - StringBuilder result = new StringBuilder(); - if (day > 0) { - result.append(String.format("%d天 ", day)); - } - if (hour > 0) { - result.append(String.format("%d小时 ", hour)); - } - if (min > 0) { - result.append(String.format("%d分钟 ", min)); - } - if (sec > 0) { - result.append(String.format("%d秒", sec)); - } - return !result.isEmpty() ? result.toString().trim() : "0秒"; - } - - /** - * 将 LocalDateTime 对象转换为 Date 对象 - * - * @param temporalAccessor 要转换的 LocalDateTime 对象 - * @return 转换后的 Date 对象 - */ - public static Date toDate(LocalDateTime temporalAccessor) { - ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); - return Date.from(zdt.toInstant()); - } - - /** - * 将 LocalDate 对象转换为 Date 对象 - * - * @param temporalAccessor 要转换的 LocalDate 对象 - * @return 转换后的 Date 对象 - */ - public static Date toDate(LocalDate temporalAccessor) { - LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); - ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); - return Date.from(zdt.toInstant()); - } - - /** - * 校验日期范围 - * - * @param startDate 开始日期 - * @param endDate 结束日期 - * @param maxValue 最大时间跨度的限制值 - * @param unit 时间跨度的单位,可选择 "DAYS"、"HOURS" 或 "MINUTES" - */ - public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) { - // 校验结束日期不能早于开始日期 - if (endDate.before(startDate)) { - throw new ServiceException("结束日期不能早于开始日期"); - } - - // 计算时间跨度 - long diffInMillis = endDate.getTime() - startDate.getTime(); - - // 根据单位转换时间跨度 - long diff = switch (unit) { - case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis); - case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis); - case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis); - default -> throw new IllegalArgumentException("不支持的时间单位"); - }; - - // 校验时间跨度不超过最大限制 - if (diff > maxValue) { - throw new ServiceException("最大时间跨度为 {} {}", maxValue, unit.toString().toLowerCase()); - } - } - - /** - * 根据指定日期时间获取时间段(凌晨 / 上午 / 中午 / 下午 / 晚上) - * - * @param date 日期时间 - * @return 时间段描述 - */ - public static String getTodayHour(Date date) { - int hour = DateUtil.hour(date, true); - if (hour <= 6) { - return "凌晨"; - } else if (hour < 12) { - return "上午"; - } else if (hour == 12) { - return "中午"; - } else if (hour <= 18) { - return "下午"; - } else { - return "晚上"; - } - } - - /** - * 将日期格式化为仿微信的友好时间 - *

- * 规则说明: - * 1. 未来时间:yyyy-MM-dd HH:mm - * 2. 今天: - * - 1 分钟内:刚刚 - * - 1 小时内:X 分钟前 - * - 超过 1 小时:凌晨/上午/中午/下午/晚上 HH:mm - * 3. 昨天:昨天 HH:mm - * 4. 本周:周X HH:mm - * 5. 今年内:MM-dd HH:mm - * 6. 非今年:yyyy-MM-dd HH:mm - * - * @param date 日期时间 - * @return 格式化后的时间描述 - */ - public static String formatFriendlyTime(Date date) { - if (date == null) { - return ""; - } - Date now = DateUtil.date(); - - // 未来时间或非今年 - if (date.after(now) || DateUtil.year(date) != DateUtil.year(now)) { - return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM, date); - } - - // 今天 - if (DateUtil.isSameDay(date, now)) { - long minutes = DateUtil.between(date, now, DateUnit.MINUTE); - if (minutes < 1) { - return "刚刚"; - } - if (minutes < 60) { - return minutes + "分钟前"; - } - return getTodayHour(date) + " " + DateUtil.format(date, "HH:mm"); - } - - // 昨天 - if (DateUtil.isSameDay(date, DateUtil.yesterday())) { - return "昨天 " + DateUtil.format(date, "HH:mm"); - } - - // 本周 - if (DateUtil.isSameWeek(date, now, true)) { - return DateUtil.dayOfWeekEnum(date).toChinese("周") - + " " + DateUtil.format(date, "HH:mm"); - } - - // 今年内其它时间 - return DateUtil.format(date, "MM-dd HH:mm"); - } - -} diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/client/AbstractOssClientImpl.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/client/AbstractOssClientImpl.java index 0fc385069..1d7d269e6 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/client/AbstractOssClientImpl.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/client/AbstractOssClientImpl.java @@ -1,8 +1,8 @@ package org.dromara.common.oss.client; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.oss.config.OssClientConfig; import org.dromara.common.oss.exception.S3StorageException; @@ -35,10 +35,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.time.Duration; import java.time.ZoneOffset; -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -203,7 +200,7 @@ public abstract class AbstractOssClientImpl implements OssClient { .orElse(""); String mergedPrefix = mergePrefix(defaultPrefix, businessPrefix); String suffix = suffix(fileName); - String datePath = DateUtils.datePath(); + String datePath = DateUtil.format(new Date(), "yyyy/MM/dd"); String uuid = IdUtil.fastSimpleUUID(); String path = mergedPrefix.isEmpty() ? datePath + StringUtils.SLASH + uuid : mergedPrefix + StringUtils.SLASH + datePath + StringUtils.SLASH + uuid; return path + suffix; diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/TemplateEngineUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/TemplateEngineUtils.java index 0d6fa14e0..55252beba 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/TemplateEngineUtils.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/TemplateEngineUtils.java @@ -2,6 +2,7 @@ package org.dromara.gen.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.template.TemplateEngine; @@ -10,7 +11,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; @@ -26,6 +26,7 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import java.io.IOException; +import java.time.LocalDateTime; import java.util.*; import java.util.function.Consumer; @@ -102,7 +103,7 @@ public class TemplateEngineUtils { context.put("basePackage", getPackagePrefix(packageName)); context.put("packageName", packageName); context.put("author", genTable.getFunctionAuthor()); - context.put("datetime", DateUtils.getDate()); + context.put("datetime", DateUtil.formatLocalDateTime(LocalDateTime.now())); context.put("pkColumn", genTable.getPkColumn()); context.put("importList", getImportList(genTable)); context.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java index 8f28c9885..608e83f27 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java @@ -1,16 +1,17 @@ package org.dromara.job.snailjob; +import cn.hutool.core.date.DateUtil; import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; import com.aizuda.snailjob.client.job.core.dto.JobArgs; import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.model.dto.ExecuteResult; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.job.entity.BillDTO; import org.springframework.stereotype.Component; import java.math.BigDecimal; +import java.time.LocalDateTime; /** * DAG工作流任务-模拟支付宝账单任务 @@ -33,7 +34,7 @@ public class AlipayBillTask { // 设置清算日期 String settlementDate = (String) jobArgs.getWfContext().get("settlementDate"); if (StringUtils.equals(settlementDate, "sysdate")) { - settlementDate = DateUtils.getDate(); + settlementDate = DateUtil.formatLocalDateTime(LocalDateTime.now()); } BillDTO billDTO = new BillDTO(23456789L, "alipay", settlementDate, new BigDecimal("2345.67")); // 把billDTO对象放入上下文进行传递 diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java index a162cea90..ff7664bca 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java @@ -1,16 +1,17 @@ package org.dromara.job.snailjob; +import cn.hutool.core.date.DateUtil; import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; import com.aizuda.snailjob.client.job.core.dto.JobArgs; import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.model.dto.ExecuteResult; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.job.entity.BillDTO; import org.springframework.stereotype.Component; import java.math.BigDecimal; +import java.time.LocalDateTime; /** * DAG工作流任务-模拟微信账单任务 @@ -34,7 +35,7 @@ public class WechatBillTask { // 是sysdate设置为当前日期;否则取管理页面设置的值 String settlementDate = (String) jobArgs.getWfContext().get("settlementDate"); if (StringUtils.equals(settlementDate, "sysdate")) { - settlementDate = DateUtils.getDate(); + settlementDate = DateUtil.formatLocalDateTime(LocalDateTime.now()); } BillDTO billDTO = new BillDTO(123456789L, "wechat", settlementDate, new BigDecimal("1234.56")); // 把billDTO对象放入上下文进行传递 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 06a69d4c6..94cb46bfb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -1,7 +1,9 @@ package org.dromara.workflow.domain.vo; +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import lombok.Data; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.warm.flow.core.enums.CooperateType; @@ -10,6 +12,7 @@ import org.dromara.workflow.common.constant.FlowConstant; import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Date; import java.util.List; /** @@ -239,7 +242,10 @@ public class FlowHisTaskVo implements Serializable { private void updateRunDuration() { // 如果创建时间和更新时间均不为空,计算它们之间的时长 if (this.updateTime != null && this.createTime != null) { - this.runDuration = DateUtils.getTimeDifference(this.updateTime, this.createTime); + this.runDuration = DateUtil.formatBetween( + LocalDateTimeUtil.between(this.createTime, this.updateTime).toMillis(), + BetweenFormatter.Level.SECOND + ); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java index c5533c198..dc71d6fe3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwChartExtServiceImpl.java @@ -2,13 +2,16 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.service.DictService; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.system.api.DeptService; @@ -164,11 +167,11 @@ public class FlwChartExtServiceImpl implements ChartExtService { /** * 处理节点的扩展信息,构建用于流程图悬浮提示的内容 * - * @param nodeJson 当前流程节点对象,包含节点基础信息和提示内容容器 - * @param taskList 当前节点关联的历史审批任务列表,用于生成提示信息 - * @param userMap 用户信息映射表,key 为用户ID,value 为用户DTO对象,用于获取审批人信息 + * @param nodeJson 当前流程节点对象,包含节点基础信息和提示内容容器 + * @param taskList 当前节点关联的历史审批任务列表,用于生成提示信息 + * @param userMap 用户信息映射表,key 为用户ID,value 为用户DTO对象,用于获取审批人信息 * @param deptNameMap 部门名称映射表,key 为部门ID,value 为部门名称 - * @param dictType 数据字典映射表,key 为字典项编码,value 为对应显示值,用于翻译审批状态等 + * @param dictType 数据字典映射表,key 为字典项编码,value 为对应显示值,用于翻译审批状态等 */ private void processNodeExtInfo(NodeJson nodeJson, List taskList, Map userMap, Map deptNameMap, Map dictType) { @@ -202,8 +205,15 @@ public class FlwChartExtServiceImpl implements ChartExtService { // 添加具体信息项:账号、耗时、时间 info.add(buildInfoItem("用户账号", userDTO.getUserName())); info.add(buildInfoItem("审批状态", dictType.get(task.getFlowStatus()))); - info.add(buildInfoItem("审批耗时", DateUtils.getTimeDifference(task.getUpdateTime(), task.getCreateTime()))); - info.add(buildInfoItem("办理时间", DateUtils.formatDateTime(task.getUpdateTime()))); + info.add(buildInfoItem("审批耗时", DateUtil.formatBetween( + LocalDateTimeUtil.between( + DateUtil.toLocalDateTime(task.getCreateTime()), + DateUtil.toLocalDateTime(task.getUpdateTime()) + ) + .toMillis(), + BetweenFormatter.Level.SECOND + ))); + info.add(buildInfoItem("办理时间", DateUtil.format(task.getUpdateTime(), DatePattern.NORM_DATETIME_PATTERN))); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index d9ab0ca4e..0e5689656 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java @@ -3,11 +3,11 @@ package org.dromara.workflow.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Pair; import cn.hutool.core.map.MapUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.system.api.*; @@ -189,7 +189,7 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand .setHandlerCode(assignee -> StringUtils.blankToDefault(assignee.getHandlerCode(), "无")) .setHandlerName(assignee -> StringUtils.blankToDefault(assignee.getHandlerName(), "无")) .setGroupName(assignee -> this.getGroupName(type, assignee.getGroupName())) - .setCreateTime(assignee -> DateUtils.formatDateTime(assignee.getCreateTime())); + .setCreateTime(assignee -> DateUtil.formatLocalDateTime(assignee.getCreateTime())); } /**