This commit is contained in:
=
2026-08-25 11:34:43 +08:00
parent c043980a08
commit 8d6a4d55c2
@@ -150,7 +150,38 @@ public class BirthdayBlessingServiceImpl extends BaseServiceImpl<Sys_user> 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)) {