diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/blessing/service/impl/BirthdayBlessingServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/blessing/service/impl/BirthdayBlessingServiceImpl.java index bf7a84c..3a64526 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/blessing/service/impl/BirthdayBlessingServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/blessing/service/impl/BirthdayBlessingServiceImpl.java @@ -150,7 +150,38 @@ public class BirthdayBlessingServiceImpl extends BaseServiceImpl imple private Sql buildUserSql(String searchKeyword, String unionId, String unitId, String userState, String personType, String preparedBy, String employmentType, String birthdayStart, String birthdayEnd, boolean todayOnly) { - Sql sql = Sqls.create("SELECT u.id, u.loginname, u.username, u.sex, u.birthday, u.mobile, u.unitName, u.unionName, u.userState, u.personType, u.preparedBy, DATEDIFF(CASE WHEN DATE_FORMAT(u.birthday, '%m-%d') >= DATE_FORMAT(CURDATE(), '%m-%d') THEN STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', DATE_FORMAT(u.birthday, '%m-%d')), '%Y-%m-%d') ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()) + 1, '-', DATE_FORMAT(u.birthday, '%m-%d')), '%Y-%m-%d') END, CURDATE()) AS daysUntilBirthday FROM vw_user u $condition"); + // 2 月 29 日仅按下一个实际闰年的 2 月 29 日计算,避免非闰年拼接无效日期导致倒计时为空。 + Sql sql = Sqls.create(""" + SELECT u.id, u.loginname, u.username, u.sex, + DATE_FORMAT(u.birthday, '%Y-%m-%d') AS birthday, + u.mobile, u.unitName, u.unionName, u.userState, u.personType, u.preparedBy, + DATEDIFF( + CASE + WHEN DATE_FORMAT(u.birthday, '%m-%d') = '02-29' THEN + CASE + WHEN (MOD(YEAR(CURDATE()), 400) = 0 OR (MOD(YEAR(CURDATE()), 4) = 0 AND MOD(YEAR(CURDATE()), 100) <> 0)) + AND DATE(CONCAT(YEAR(CURDATE()), '-02-29')) >= CURDATE() + THEN DATE(CONCAT(YEAR(CURDATE()), '-02-29')) + ELSE DATE(CONCAT( + CASE + WHEN MOD(YEAR(CURDATE()) + 1, 400) = 0 OR (MOD(YEAR(CURDATE()) + 1, 4) = 0 AND MOD(YEAR(CURDATE()) + 1, 100) <> 0) THEN YEAR(CURDATE()) + 1 + WHEN MOD(YEAR(CURDATE()) + 2, 400) = 0 OR (MOD(YEAR(CURDATE()) + 2, 4) = 0 AND MOD(YEAR(CURDATE()) + 2, 100) <> 0) THEN YEAR(CURDATE()) + 2 + WHEN MOD(YEAR(CURDATE()) + 3, 400) = 0 OR (MOD(YEAR(CURDATE()) + 3, 4) = 0 AND MOD(YEAR(CURDATE()) + 3, 100) <> 0) THEN YEAR(CURDATE()) + 3 + WHEN MOD(YEAR(CURDATE()) + 4, 400) = 0 OR (MOD(YEAR(CURDATE()) + 4, 4) = 0 AND MOD(YEAR(CURDATE()) + 4, 100) <> 0) THEN YEAR(CURDATE()) + 4 + WHEN MOD(YEAR(CURDATE()) + 5, 400) = 0 OR (MOD(YEAR(CURDATE()) + 5, 4) = 0 AND MOD(YEAR(CURDATE()) + 5, 100) <> 0) THEN YEAR(CURDATE()) + 5 + WHEN MOD(YEAR(CURDATE()) + 6, 400) = 0 OR (MOD(YEAR(CURDATE()) + 6, 4) = 0 AND MOD(YEAR(CURDATE()) + 6, 100) <> 0) THEN YEAR(CURDATE()) + 6 + WHEN MOD(YEAR(CURDATE()) + 7, 400) = 0 OR (MOD(YEAR(CURDATE()) + 7, 4) = 0 AND MOD(YEAR(CURDATE()) + 7, 100) <> 0) THEN YEAR(CURDATE()) + 7 + ELSE YEAR(CURDATE()) + 8 + END, '-02-29')) + END + WHEN DATE_FORMAT(u.birthday, '%m-%d') >= DATE_FORMAT(CURDATE(), '%m-%d') + THEN STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', DATE_FORMAT(u.birthday, '%m-%d')), '%Y-%m-%d') + ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()) + 1, '-', DATE_FORMAT(u.birthday, '%m-%d')), '%Y-%m-%d') + END, + CURDATE() + ) AS daysUntilBirthday + FROM vw_user u $condition + """); Cnd cnd = Cnd.NEW(); cnd.and("u.member", "=", 1).and("u.disabled", "=", 0).and("u.birthday", "is not", null); if (StrUtil.isNotBlank(searchKeyword)) {