diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysHomeNewsServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysHomeNewsServiceImpl.java index 3272a24..b8b3daf 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysHomeNewsServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysHomeNewsServiceImpl.java @@ -3,6 +3,7 @@ package com.budwk.app.sys.services.impl; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.budwk.app.sys.services.SysHomeNewsService; +import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -23,12 +24,11 @@ public class SysHomeNewsServiceImpl implements SysHomeNewsService { JSONObject root = new JSONObject(); List noticeList = new ArrayList<>(); - Document doc = Jsoup.connect(UNION_HOME_URL) - // 学校官网会过滤部分非浏览器请求,这里补充常规浏览器请求头提高抓取稳定性。 - .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36") - .referrer("https://www.jsahvc.edu.cn/") - .timeout(10000) - .get(); + Document doc = fetchUnionHomeDocument(); + if (doc == null) { + root.set("grassroots", getFallbackNoticeList()); + return root; + } Elements noticeItems = getNoticeItems(doc); for (Element item : noticeItems) { @@ -48,10 +48,72 @@ public class SysHomeNewsServiceImpl implements SysHomeNewsService { noticeList.add(node); } + if (noticeList.isEmpty()) { + noticeList = getFallbackNoticeList(); + } root.set("grassroots", noticeList); return root; } + /** + * 按真实浏览器请求头抓取工会首页;官网防护返回 412 时不抛错,交给调用方使用兜底数据。 + * + * @return 可解析的工会首页文档,抓取失败或被防护拦截时返回 null + */ + private Document fetchUnionHomeDocument() throws IOException { + Connection.Response response = createUnionHomeConnection() + .execute(); + if (response.statusCode() == 200) { + return response.parse(); + } + + response = createUnionHomeConnection() + .header("Sec-Fetch-Dest", "document") + .header("Sec-Fetch-Mode", "navigate") + .header("Sec-Fetch-Site", "same-origin") + .header("Sec-Fetch-User", "?1") + .execute(); + if (response.statusCode() == 200) { + return response.parse(); + } + return null; + } + + /** + * 统一组装学校官网请求参数,避免后续调整请求头时遗漏某一次重试。 + * + * @return Jsoup 请求连接 + */ + private Connection createUnionHomeConnection() { + return Jsoup.connect(UNION_HOME_URL) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36") + .referrer("https://www.jsahvc.edu.cn/") + .timeout(10000) + .followRedirects(true) + .ignoreHttpErrors(true) + .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") + .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") + .header("Cache-Control", "no-cache") + .header("Connection", "keep-alive") + .header("Pragma", "no-cache") + .header("Upgrade-Insecure-Requests", "1"); + } + + /** + * 官网防护拦截或列表结构变化时,返回可点击入口,避免首页通知公告区域空白。 + * + * @return 兜底通知公告列表 + */ + private List getFallbackNoticeList() { + List fallbackNoticeList = new ArrayList<>(); + JSONObject node = new JSONObject(); + node.set("title", "江苏农牧科技职业学院工会通知公告"); + node.set("date", ""); + node.set("url", UNION_HOME_URL); + fallbackNoticeList.add(node); + return fallbackNoticeList; + } + /** * 优先按栏目标题查找通知公告列表,找不到时再使用学校官网历史模板中的栏目位兜底。 * diff --git a/src/main/java/com/budwk/app/task/job/fitnesswalk/FitnessWalkLotteryJob.java b/src/main/java/com/budwk/app/task/job/fitnesswalk/FitnessWalkLotteryJob.java index 5cb22bb..00b6454 100644 --- a/src/main/java/com/budwk/app/task/job/fitnesswalk/FitnessWalkLotteryJob.java +++ b/src/main/java/com/budwk/app/task/job/fitnesswalk/FitnessWalkLotteryJob.java @@ -69,13 +69,13 @@ public class FitnessWalkLotteryJob implements Job { COALESCE(SUM(sub.step), 0) AS total_steps, u.loginname, u.username, - u.unionid, - u.unionname, - u.unitid, - u.unitname, + u.unionId AS unionid, + u.unionName AS unionname, + u.unitId AS unitid, + u.unitName AS unitname, over3k.standardsDays FROM - `user` u + vw_user u LEFT JOIN ( SELECT userId, @@ -111,8 +111,10 @@ public class FitnessWalkLotteryJob implements Job { u.id, u.username, u.loginname, - u.unionname, - u.unitname + u.unionId, + u.unionName, + u.unitId, + u.unitName HAVING $stepHavingSql """); @@ -122,7 +124,7 @@ public class FitnessWalkLotteryJob implements Job { } else { sql.setVar("stepHavingSql", new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationStep))); } - sql.setVar("whereSql", new Static(" where u.loginname not in (select loginName from fitness_walk_award_user where activityId = " + activityId + " ) ")); + sql.setVar("whereSql", new Static(" where u.loginname not in (select loginName from fitness_walk_award_user where activityId = '" + activityId + "' ) ")); sql.setParam("activityId", activityId); sql.setParam("step", lotteryQualificationStep); sql.setParam("startDate", startDate); @@ -134,13 +136,13 @@ public class FitnessWalkLotteryJob implements Job { jws.userId AS id, u.username, u.loginname, - u.unionid, - u.unionname, - u.unitid, - u.unitname + u.unionId AS unionid, + u.unionName AS unionname, + u.unitId AS unitid, + u.unitName AS unitname FROM fitness_walk_step jws - LEFT JOIN `user` u ON u.id = jws.userId + LEFT JOIN vw_user u ON u.id = jws.userId WHERE jws.activityId = @activityId AND jws.step >= @step diff --git a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkActivityManageController.java b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkActivityManageController.java index 251bad6..3dd5415 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkActivityManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkActivityManageController.java @@ -84,9 +84,9 @@ public class FitnessWalkActivityManageController { StringBuilder sql = new StringBuilder("db.collection('activity')"); if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) { - sql.append("where("); + sql.append(".where("); sql.append("_.or(["); - sql.append("{name:{$regex:'").append(searchKeyword).append("',$options:'i'}}"); + sql.append("{name:{$regex:'").append(searchKeyword).append("',$options:'i'}},"); sql.append("{tag:{$regex:'").append(searchKeyword).append("',$options:'i'}}"); sql.append("])"); sql.append(")"); diff --git a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepManageController.java b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepManageController.java index 5ab0b53..ab3b1d3 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepManageController.java @@ -235,10 +235,16 @@ public class FitnessWalkStepManageController { NutMap resultMap = NutMap.NEW(); FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId); + if (activity == null) { + return Result.error("活动不存在"); + } //计步的抽奖模式 everyday custom String lotteryMode = activity.getLotteryMode(); if ("everyday".equals(lotteryMode)) { FitnessWalkActivity.DayLotteryRule dayLotteryRule = activity.getDayLotteryRule(); + if (dayLotteryRule == null || dayLotteryRule.getLotteryQualificationStep() == null || dayLotteryRule.getLotteryQualificationStep() <= 0) { + return Result.success(resultMap); + } //每日抽奖资格步数 Integer lotteryQualificationStep = dayLotteryRule.getLotteryQualificationStep(); @@ -249,7 +255,7 @@ public class FitnessWalkStepManageController { .and("DATE( applyDate )", "=", DateUtil.today()).and("activityId", "=", activityId) .and("step", ">", lotteryQualificationStep)); - Integer thisDayStep = userWalkStep.getStep(); + Integer thisDayStep = userWalkStep == null ? 0 : userWalkStep.getStep(); BigDecimal lotteryQualificationStepBig = new BigDecimal(lotteryQualificationStep); BigDecimal thisDayStepBig = new BigDecimal(thisDayStep); diff --git a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepRankingController.java b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepRankingController.java index 23f37ea..3cbf1f5 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepRankingController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepRankingController.java @@ -174,7 +174,7 @@ public class FitnessWalkStepRankingController { activityId, applyDate ) sub - left join `user` u ON u.id = sub.userId + left join vw_user u ON u.id = sub.userId GROUP BY userId ORDER BY @@ -208,7 +208,7 @@ public class FitnessWalkStepRankingController { activityId, applyDate ) sub - left join `user` u ON u.id = sub.userId + left join vw_user u ON u.id = sub.userId GROUP BY userId ORDER BY @@ -241,11 +241,11 @@ public class FitnessWalkStepRankingController { COALESCE(SUM(fws.step), 0) AS total_steps, u.username, u.loginname, - u.unionname, - u.unitname + u.unionName AS unionname, + u.unitName AS unitname FROM fitness_walk_step fws - LEFT JOIN `user` u ON u.id = fws.userId + LEFT JOIN vw_user u ON u.id = fws.userId $condition """); diff --git a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepStatisticsController.java b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepStatisticsController.java index ff46f55..2382d72 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/controller/FitnessWalkStepStatisticsController.java @@ -69,14 +69,14 @@ public class FitnessWalkStepStatisticsController { SELECT u.loginname, u.username, - u.unionname, - u.unitname, + u.unionName AS unionname, + u.unitName AS unitname, al.applyDate, al.step, date_format(al.applyDate,'%Y-%m-%d') as prizeData FROM `fitness_walk_step` al - LEFT JOIN `user` u ON u.id = al.userId + LEFT JOIN vw_user u ON u.id = al.userId $condition """; } @@ -104,10 +104,10 @@ public class FitnessWalkStepStatisticsController { } cnd.andEX("YEAR(al.applyDate)", "=", year); cnd.andEX("al.activityId", "=", activityId); - cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unionId", "=", unionId); cnd.andEX("u.unitId", "=", unitId); cnd.desc("al.applyDate"); - cnd.desc("u.unioncode"); + cnd.desc("u.unionCode"); cnd.groupBy("al.applyDate", "al.userId"); sql.setCondition(cnd); @@ -134,10 +134,10 @@ public class FitnessWalkStepStatisticsController { cnd.and("date_format(al.applyDate,'%Y-%m-%d')", "<=", activityDate[1]); } cnd.andEX("al.activityId", "=", activityId); - cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unionId", "=", unionId); cnd.andEX("u.unitId", "=", unitId); cnd.desc("al.applyDate"); - cnd.desc("u.unioncode"); + cnd.desc("u.unionCode"); sql.setCondition(cnd); List exportList = baseService.listMap(sql); diff --git a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkCommonServiceImpl.java index 1d275d5..5e0c31c 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkCommonServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkCommonServiceImpl.java @@ -106,6 +106,10 @@ public class FitnessWalkCommonServiceImpl extends BaseServiceImpl JSON.parseObject((String) v, FitnessWalkActivity.class)).findFirst().orElse(null); + // 活动已删除或传入空 id 时直接返回空,避免后续读取图片字段时空指针。 + if (activity == null) { + return null; + } if (Lang.isNotEmpty(activity.getRandomPics())) { List urlStr = new ArrayList<>(); for (String url : activity.getRandomPics()) { @@ -131,6 +135,9 @@ public class FitnessWalkCommonServiceImpl extends BaseServiceImpl",0)); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkStepRaffleServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkStepRaffleServiceImpl.java index 33cb063..7d84b7e 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkStepRaffleServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/fitnesswalk/service/impl/FitnessWalkStepRaffleServiceImpl.java @@ -49,6 +49,8 @@ public class FitnessWalkStepRaffleServiceImpl extends BaseServiceImpl= null 的 SQL。 + Integer effectiveLotteryQualificationSteps = lotteryQualificationSteps == null ? 0 : lotteryQualificationSteps; Date startDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"), "yyyy-MM-dd"); Date endDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"), "yyyy-MM-dd"); @@ -59,13 +61,13 @@ public class FitnessWalkStepRaffleServiceImpl extends BaseServiceImpl= '%s' ".formatted(lotteryQualificationSteps))); - cnd.having(cnd.and(new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays)))); + sql.setVar("lotteryQualificationDaySql", new Static(" AND step >= '%s' ".formatted(effectiveLotteryQualificationSteps))); + cnd.having(Cnd.NEW().and(new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays)))); // sql.setVar("stepHavingSql", new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays))); - } else { - cnd.having(cnd.and(new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationSteps)))); + } else if (lotteryQualificationSteps != null) { + cnd.having(Cnd.NEW().and(new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(effectiveLotteryQualificationSteps)))); // sql.setVar("stepHavingSql", new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationSteps))); + } else { + cnd.having(Cnd.NEW().and(new Static(" COALESCE(SUM(sub.step), 0) > 0 "))); } sql.setParam("activityId", activityId); - sql.setParam("step", lotteryQualificationSteps); + sql.setParam("step", effectiveLotteryQualificationSteps); sql.setParam("startDate", startDate); sql.setParam("endDate", endDate); @@ -126,7 +130,7 @@ public class FitnessWalkStepRaffleServiceImpl extends BaseServiceImpl--> - +