From 336bea15bc2ea2552b2303cb6ae7dae6bfc06997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=8C=E5=85=88=E8=88=9C?= <2499071264@qq.com> Date: Wed, 11 Nov 2026 09:35:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=99=AE=E6=83=A0=E7=96=97=E4=BC=91?= =?UTF-8?q?=E5=85=BB=E4=BC=98=E5=8C=966?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/sys/controller/SysTaskController.java | 21 +++++++ .../app/task/job/SysUserAllRenewJob.java | 46 ++++++-------- .../task/services/TaskPlatformService.java | 4 ++ .../impl/TaskPlatformServiceImpl.java | 34 +++++++++++ .../assets/platform/css/home-portal.css | 1 + .../views/layouts/v4/home/index.html | 16 ++++- .../views/platform/sys/conf/index.html | 60 +++++++++++++++++-- .../views/platform/sys/task/index.html | 17 ++++++ .../views/platform/zhghh5/sys/home/home.js | 8 ++- 9 files changed, 169 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/budwk/app/sys/controller/SysTaskController.java b/src/main/java/com/budwk/app/sys/controller/SysTaskController.java index d03ab57..be0ecb9 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysTaskController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysTaskController.java @@ -18,6 +18,7 @@ import org.nutz.log.Log; import org.nutz.log.Logs; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletRequest; @@ -145,6 +146,26 @@ public class SysTaskController { } } + @At("/runOnce/?") + @POST + @Ok("json") + @SaCheckPermission("sys.manager.task.edit") + @SLog(tag = "执行任务一次", msg = "任务名:${args[1].getAttribute('name')}") + public Object runOnce(String id, HttpServletRequest req) { + Sys_task task = sysTaskService.fetch(id); + if (task == null) { + return Result.error("任务不存在"); + } + req.setAttribute("name", task.getName()); + try { + taskPlatformService.runOnce(task); + return Result.success("已提交执行"); + } catch (Exception e) { + log.error("提交单次任务失败:" + task.getName(), e); + return Result.error("提交执行失败"); + } + } + @At("/enable/?") @Ok("json") @SaCheckPermission("sys.manager.task.edit") diff --git a/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java b/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java index 6d20f36..f9cbbc0 100644 --- a/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java +++ b/src/main/java/com/budwk/app/task/job/SysUserAllRenewJob.java @@ -1,62 +1,50 @@ package com.budwk.app.task.job; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; import com.budwk.app.base.param.ConditionGroup; import com.budwk.app.sys.enums.SysDataUpdateMode; -import com.budwk.app.sys.models.Sys_user_source; import com.budwk.app.sys.param.SysDataUserUpdateParam; import com.budwk.app.sys.services.SysDataUserPullService; import com.budwk.app.sys.services.SysDataUserUpdateService; import lombok.extern.slf4j.Slf4j; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; +import org.nutz.ioc.Ioc; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; -import org.nutz.lang.util.NutMap; +import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; -import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; -import java.util.Date; - /** * 人员全量更新任务 */ @IocBean @Slf4j +@DisallowConcurrentExecution public class SysUserAllRenewJob implements Job { - @Inject - private Dao dao; + @Inject("refer:$ioc") + private Ioc ioc; @Inject private SysDataUserPullService sysDataUserPullService; - @Inject - private SysDataUserUpdateService sysDataUserUpdateService; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - Date pullTime = sysDataUserPullService.pull(); - JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); - NutMap conditionGroupMap = (NutMap)jobDataMap.get("conditionGroup"); - if(conditionGroupMap == null || conditionGroupMap.isEmpty()){ - log.error("SysUserAllRenewJob定时任务执行中止,原因:conditionGroup为null"); - } - String conditionGroupStr = Json.toJson(conditionGroupMap).replace("@currentDate", DateUtil.today()); - ConditionGroup conditionGroup = null; try { - conditionGroup = Json.fromJson(ConditionGroup.class, conditionGroupStr); + SysDataUserUpdateParam param = new SysDataUserUpdateParam(); + param.setUpdateMode(SysDataUpdateMode.ALL.name()); + Object conditionGroup = jobExecutionContext.getMergedJobDataMap().get("conditionGroup"); + if (conditionGroup != null) { + String conditionGroupJson = Json.toJson(conditionGroup).replace("@currentDate", DateUtil.today()); + param.setConditionGroup(Json.fromJson(ConditionGroup.class, conditionGroupJson)); + } + + param.setPullTime(DateUtil.formatDateTime(sysDataUserPullService.pull())); + SysDataUserUpdateService updateService = (SysDataUserUpdateService) ioc.get(SysDataUpdateMode.ALL.getClazz()); + log.info("人员全量更新任务,拉取批次 {}:{}", param.getPullTime(), updateService.update(param)); } catch (Exception e) { - log.error("SysUserAllRenewJob定时任务执行失败,原因:{}", e.getMessage()); + throw new JobExecutionException("人员拉取及全量更新任务执行失败", e); } - - SysDataUserUpdateParam param = new SysDataUserUpdateParam(); - param.setPullTime(DateUtil.formatDateTime(pullTime)); - param.setUpdateMode(SysDataUpdateMode.ALL.name()); - param.setConditionGroup(conditionGroup); - - // sysDataUserUpdateService.update(param); } } diff --git a/src/main/java/com/budwk/app/task/services/TaskPlatformService.java b/src/main/java/com/budwk/app/task/services/TaskPlatformService.java index 9a05533..2bad0c8 100644 --- a/src/main/java/com/budwk/app/task/services/TaskPlatformService.java +++ b/src/main/java/com/budwk/app/task/services/TaskPlatformService.java @@ -1,5 +1,7 @@ package com.budwk.app.task.services; +import com.budwk.app.sys.models.Sys_task; + import java.util.List; /** @@ -15,6 +17,8 @@ public interface TaskPlatformService { */ boolean isExist(String jobName, String jobGroup); + void runOnce(Sys_task task) throws Exception; + /** * 添加新任务 * diff --git a/src/main/java/com/budwk/app/task/services/impl/TaskPlatformServiceImpl.java b/src/main/java/com/budwk/app/task/services/impl/TaskPlatformServiceImpl.java index d1baeda..0b16bb2 100644 --- a/src/main/java/com/budwk/app/task/services/impl/TaskPlatformServiceImpl.java +++ b/src/main/java/com/budwk/app/task/services/impl/TaskPlatformServiceImpl.java @@ -1,12 +1,22 @@ package com.budwk.app.task.services.impl; +import com.budwk.app.sys.models.Sys_task; import com.budwk.app.task.services.TaskPlatformService; import org.nutz.integration.quartz.QuartzJob; import org.nutz.integration.quartz.QuartzManager; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; import org.quartz.CronExpression; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.TriggerBuilder; import org.quartz.TriggerUtils; import org.quartz.impl.triggers.CronTriggerImpl; @@ -23,6 +33,8 @@ import java.util.List; public class TaskPlatformServiceImpl implements TaskPlatformService { @Inject private QuartzManager quartzManager; + @Inject + private Scheduler scheduler; /** * 判断任务是否存在 @@ -35,6 +47,28 @@ public class TaskPlatformServiceImpl implements TaskPlatformService { return quartzManager.exist(new JobKey(jobName, jobGroup)); } + @Override + public void runOnce(Sys_task task) throws Exception { + JobKey key = JobKey.jobKey(task.getId(), task.getId()); + if (scheduler.checkExists(key)) { + scheduler.triggerJob(key); + return; + } + + Class extends Job> jobClass = Class.forName(task.getJobClass()).asSubclass(Job.class); + JobDataMap data = new JobDataMap(); + if (Strings.isNotBlank(task.getData())) { + NutMap params = Json.fromJson(NutMap.class, task.getData()); + if (params != null) { + data.putAll(params); + } + } + + // 没有注册定时调度时,临时注册一个执行后自动移除的单次任务。 + JobDetail job = JobBuilder.newJob(jobClass).withIdentity(key).usingJobData(data).build(); + scheduler.scheduleJob(job, TriggerBuilder.newTrigger().forJob(key).startNow().build()); + } + /** * 添加新任务 * diff --git a/src/main/resources/static/assets/platform/css/home-portal.css b/src/main/resources/static/assets/platform/css/home-portal.css index dbf281d..8e13fe6 100644 --- a/src/main/resources/static/assets/platform/css/home-portal.css +++ b/src/main/resources/static/assets/platform/css/home-portal.css @@ -12,6 +12,7 @@ #v4-home-app .portal-top { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 18px; max-width: 1720px; margin: auto; padding: 18px 24px 0; } /* 使用完整不透明背景铺满横幅,会员信息独立成卡,不再覆盖校园景观。 */ #v4-home-app .portal-hero { position: relative; min-width: 0; min-height: 260px; overflow: hidden; border-radius: 12px; background: #e8f4ff url('/assets/platform/img/home/service-portal-banner-campus-v4.png') no-repeat right bottom / cover; } +#v4-home-app .portal-hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: right bottom; } #v4-home-app .portal-hero::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: linear-gradient(90deg, #e8f4ff 0%, #e8f4ff 28%, rgba(232,244,255,.92) 39%, rgba(232,244,255,.35) 54%, rgba(232,244,255,0) 68%); } #v4-home-app .portal-hero-inner { position: relative; z-index: 1; display: flex; align-items: center; min-height: 260px; height: 100%; padding: 32px 40px; } #v4-home-app .portal-hero-copy { max-width: 80%; } diff --git a/src/main/resources/views/layouts/v4/home/index.html b/src/main/resources/views/layouts/v4/home/index.html index 8bef12a..0aa80af 100644 --- a/src/main/resources/views/layouts/v4/home/index.html +++ b/src/main/resources/views/layouts/v4/home/index.html @@ -118,12 +118,14 @@ layout("/layouts/v4/baseLayout.html"){ - +
+