diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java index 60916a7..58f699c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/remommend/JobRecommendUtil.java @@ -37,6 +37,22 @@ public class JobRecommendUtil { public static final Float EXP_MATCH_LOW1 = 2F; public static final Float EXP_MATCH_LOWER = 1F; + private static final Map CHINA_NUM_MAP; + + static { + CHINA_NUM_MAP = new HashMap<>(); + CHINA_NUM_MAP.put('零', '0'); + CHINA_NUM_MAP.put('一', '1'); + CHINA_NUM_MAP.put('二', '2'); + CHINA_NUM_MAP.put('三', '3'); + CHINA_NUM_MAP.put('四', '4'); + CHINA_NUM_MAP.put('五', '5'); + CHINA_NUM_MAP.put('六', '6'); + CHINA_NUM_MAP.put('七', '7'); + CHINA_NUM_MAP.put('八', '8'); + CHINA_NUM_MAP.put('九', '9'); + } + // =====================基础计算方法===================== /** @@ -48,17 +64,62 @@ public class JobRecommendUtil { if (StrUtil.isBlank(startDateStr)) { return 0; } - LocalDate start = LocalDate.parse(startDateStr + "-01"); + LocalDate start = parseToFirstDayOfMonth(startDateStr); LocalDate end; if (StrUtil.isBlank(endDateStr)) { end = LocalDate.now(); } else { - end = LocalDate.parse(endDateStr + "-01"); + end = parseToFirstDayOfMonth(endDateStr); } Period period = Period.between(start, end); return period.getYears() * 12 + period.getMonths(); } + /** + * 兼容两种格式:yyyy-MM / yyyy-MM-dd,返回当月1号 + */ + private static LocalDate parseToFirstDayOfMonth(String dateStr) { + try { + String source = dateStr.trim(); + //中文年份转阿拉伯数字:二零一六 → 2016 + source = convertChinaYearToNum(source); + + LocalDate date; + if (source.matches("^\\d{4}$")) { + // 仅年份 2016 → 2016-01-01 + date = LocalDate.parse(source + "-01-01"); + } else if (source.matches("^\\d{4}-\\d{2}$")) { + // yyyy-MM + date = LocalDate.parse(source + "-01"); + } else if (source.matches("^\\d{4}-\\d{2}-\\d{2}$")) { + // yyyy-MM-dd + date = LocalDate.parse(source); + } else { + throw new IllegalArgumentException("无法识别日期格式:" + dateStr); + } + return date.withDayOfMonth(1); + } catch (Exception e) { + throw new IllegalArgumentException("日期解析失败,原始值:" + dateStr + + ",支持格式:2016、2016-09、2016-09-09、二零一六", e); + } + } + + /** + * 中文年份字符串转数字年份 + * 例:二零一六 → 2016;二零二五-03 保留后面横杠 + */ + private static String convertChinaYearToNum(String str) { + StringBuilder sb = new StringBuilder(); + for (char c : str.toCharArray()) { + if (CHINA_NUM_MAP.containsKey(c)) { + sb.append(CHINA_NUM_MAP.get(c)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + /** * 计算全部工作经历总月数(简单累加,不处理时间重叠) */