diff --git a/lab-common/src/main/java/org/springblade/common/constant/TenantConstant.java b/lab-common/src/main/java/org/springblade/common/constant/TenantConstant.java index c05a5b6..dd5a9e6 100644 --- a/lab-common/src/main/java/org/springblade/common/constant/TenantConstant.java +++ b/lab-common/src/main/java/org/springblade/common/constant/TenantConstant.java @@ -48,4 +48,9 @@ public interface TenantConstant { "desk", "flow", "work", "monitor", "resource", "role", "user", "dept", "dictbiz", "topmenu" ); + /** + * 默认租户id + */ + String DEFAULT_TENANT_ID = "000000"; + } diff --git a/lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/client/IRemindClient.java b/lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/client/IRemindClient.java new file mode 100644 index 0000000..5b3d193 --- /dev/null +++ b/lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/client/IRemindClient.java @@ -0,0 +1,19 @@ +package org.springblade.job.executor.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * @Description 调用提醒模式接口类 + * @Author ytl + * @Date 2023/2/18 0018 18:04 + */ +@FeignClient( + value = "blade-workflow" +) +public interface IRemindClient { + String API_PREFIX = "/workBench/remind"; + + @GetMapping(API_PREFIX) + void remind(); +} diff --git a/lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/jobhandler/RemindXxlJob.java b/lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/jobhandler/RemindXxlJob.java new file mode 100644 index 0000000..a87b57d --- /dev/null +++ b/lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/jobhandler/RemindXxlJob.java @@ -0,0 +1,30 @@ +package org.springblade.job.executor.jobhandler; + +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import com.xxl.job.core.log.XxlJobLogger; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.job.executor.client.IRemindClient; +import org.springframework.stereotype.Component; + +/** + * @Description + * @Author ytl + * @Date 2023/2/18 0018 18:10 + */ + +@Component("remindXxlJob") +@AllArgsConstructor +@Slf4j +public class RemindXxlJob { + private final IRemindClient remindClient; + + @XxlJob("remindToComplateJob") + public ReturnT remindToComplateJob(String param) throws Exception { + log.info("执行工作流提醒任务。。。。"); + remindClient.remind(); + return ReturnT.SUCCESS; + } + +} diff --git a/lab-plugin/lab-workflow/pom.xml b/lab-plugin/lab-workflow/pom.xml index b096649..42c4e6c 100644 --- a/lab-plugin/lab-workflow/pom.xml +++ b/lab-plugin/lab-workflow/pom.xml @@ -70,6 +70,12 @@ flowable-json-converter ${flowable.version} + + org.springblade + lab-resource-api + 2.8.1.RELEASE + compile + diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/controller/HomePageController.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/controller/HomePageController.java index 366851b..4d815c2 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/controller/HomePageController.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/controller/HomePageController.java @@ -54,7 +54,7 @@ public class HomePageController extends BladeController { result.put("todayFinishNum", todayFinishNum.get()); return R.data(result); - // return homePageService.aboutMy(); +// return homePageService.aboutMy(); } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/enumutil/TaskTypeColorEnum.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/enumutil/TaskTypeColorEnum.java index ad6cf66..a6410a1 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/enumutil/TaskTypeColorEnum.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/enumutil/TaskTypeColorEnum.java @@ -38,7 +38,7 @@ public enum TaskTypeColorEnum { Map re = new HashMap<>(); TaskTypeColorEnum[] values = values(); for(TaskTypeColorEnum r:values){ - re.put(r.code, r.getValue()); + re.put(r.getCode(), r.getValue()); } return re; } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/service/impl/HomePageServiceImpl.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/service/impl/HomePageServiceImpl.java index f204503..85e0d6c 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/service/impl/HomePageServiceImpl.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/homepage/service/impl/HomePageServiceImpl.java @@ -167,7 +167,8 @@ public class HomePageServiceImpl implements IHomePageService { .taskTenantId(WfTaskUtil.getTenantId()) .active(); taskQuery.taskCandidateOrAssigned(taskUser) - .taskCandidateGroupIn(Func.toStrList(taskGroup)); + //.taskCandidateGroupIn(Func.toStrList(taskGroup)) + ; List listNeedDo = taskQuery.list(); @@ -206,7 +207,8 @@ public class HomePageServiceImpl implements IHomePageService { .taskTenantId(WfTaskUtil.getTenantId()) .active(); taskQuery.taskCandidateOrAssigned(taskUser) - .taskCandidateGroupIn(Func.toStrList(taskGroup)); + //.taskCandidateGroupIn(Func.toStrList(taskGroup)) + ; List listNeedDo = taskQuery.list(); return new AsyncResult<>(listNeedDo.size()); @@ -215,8 +217,7 @@ public class HomePageServiceImpl implements IHomePageService { @Async @Override public Future todayAddNum(){ - String taskUser = WfTaskUtil.getTaskUser(); - String taskGroup = WfTaskUtil.getCandidateGroup(); + //当前获取登录人deptid String deptId = AuthUtil.getDeptId(); List nowUserDepts = Func.toLongList(deptId); @@ -252,8 +253,7 @@ public class HomePageServiceImpl implements IHomePageService { @Async @Override public Future todayFinishNum(){ - String taskUser = WfTaskUtil.getTaskUser(); - String taskGroup = WfTaskUtil.getCandidateGroup(); + //当前获取登录人deptid String deptId = AuthUtil.getDeptId(); List nowUserDepts = Func.toLongList(deptId); diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java index f1d405c..a315d08 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java @@ -1,9 +1,13 @@ package org.springblade.plugin.workbench.controller; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.tenant.annotation.NonDS; +import org.springblade.plugin.workbench.service.IWorkBenchService; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -19,6 +23,14 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/workBench") @Api(value = "工作台", tags = "工作台") public class WorkBenchController extends BladeController { + private final IWorkBenchService workBenchService; + @GetMapping("/remind") + @ApiOperationSupport(order = 1) + @ApiOperation(value = "调用提醒任务", notes = "调用提醒任务") + public void remind(){ + System.out.println("执行工作台调度任务。。。。。。"); + workBenchService.getTaskToRemind(); + } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RemindTypeEnum.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RemindTypeEnum.java new file mode 100644 index 0000000..f8cfc20 --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RemindTypeEnum.java @@ -0,0 +1,45 @@ +package org.springblade.plugin.workbench.enumutil; + +import org.springblade.plugin.homepage.enumutil.TaskTypeColorEnum; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description 提醒模式 + * @Author ytl + * @Date 2023/2/18 0018 17:28 + */ +public enum RemindTypeEnum { + 不提醒("1624975489913384962","remindNoClass"), + 每周一("1624975573531029506","remindTueClass"), + 每隔一天("1624975644792254466", "remindIntervalDayClass"), + 到期前2天("1624975688895361025", "remindBeforeTwoDayClass"); + + //表dict_biz中code = reminde_mode 的id + private String code; + //表dict_biz中code = reminde_mode 的dict_value + private String name; + + RemindTypeEnum(String code, String name){ + this.name = name; + this.code = code; + } + + public String getCode(){ + return code; + } + + public String getName(){ + return name; + } + + public static Map getAllToMap() { + Map re = new HashMap<>(); + RemindTypeEnum[] values = values(); + for(RemindTypeEnum r:values){ + re.put(r.getCode(), r.getName()); + } + return re; + } +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IWorkBenchService.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IWorkBenchService.java index e38dd1d..4a9c186 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IWorkBenchService.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IWorkBenchService.java @@ -7,5 +7,5 @@ package org.springblade.plugin.workbench.service; */ public interface IWorkBenchService { - + void getTaskToRemind(); } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java index 62631b4..de878da 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java @@ -1,18 +1,24 @@ package org.springblade.plugin.workbench.service.impl; import lombok.AllArgsConstructor; +import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; +import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; +import org.springblade.common.constant.CommonConstant; +import org.springblade.common.constant.TenantConstant; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.SpringUtil; +import org.springblade.plugin.workbench.enumutil.RemindTypeEnum; import org.springblade.plugin.workbench.service.IWorkBenchService; +import org.springblade.plugin.workbench.util.RemindOperation; import org.springblade.plugin.workflow.core.utils.WfTaskUtil; +import org.springblade.system.cache.DictBizCache; +import org.springblade.system.entity.DictBiz; import org.springframework.stereotype.Service; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -26,19 +32,32 @@ public class WorkBenchServiceImpl implements IWorkBenchService { private final TaskService taskService; - public void getTask(){ - //获取正在运行的任务 - List list = taskService.createTaskQuery().taskTenantId(WfTaskUtil.getTenantId()).list(); + private final RuntimeService runtimeService; + + + @Override + public void getTaskToRemind(){ + List list = new ArrayList<>(); + //获取正在运行的任务 WfTaskUtil.getTenantId() + String tenantId = WfTaskUtil.getTenantId(); + if(Func.isEmpty(tenantId) || Func.isBlank(tenantId)){ + list = taskService.createTaskQuery().taskTenantId(TenantConstant.DEFAULT_TENANT_ID).list(); + } Map> taskRemindMap = new HashMap<>(); //筛选出到期的任务 List collect = list.stream().filter(ts -> { - Map variableMap = ts.getProcessVariables(); - if(Func.isNotEmpty(variableMap.get("qiwangwanchengshijian")) && Func.isNotBlank(variableMap.get("qiwangwanchengshijian").toString())){ - Date qiwangwanchengshijian = DateUtil.parse(variableMap.get("qiwangwanchengshijian").toString(), "yyyy-MM-dd HH:mm:ss"); - if(DateUtil.between(DateUtil.now(), qiwangwanchengshijian).isNegative()){ - return true; + + Map variableMap = runtimeService.getVariables(ts.getProcessInstanceId()); + if(Func.isNotEmpty(variableMap)){ + if(Func.isNotEmpty(variableMap.get("qiwangwanchengshijian")) && Func.isNotBlank(variableMap.get("qiwangwanchengshijian").toString())){ + Date qiwangwanchengshijian = DateUtil.parse(variableMap.get("qiwangwanchengshijian").toString(), "yyyy-MM-dd HH:mm:ss"); + if(DateUtil.between(DateUtil.now(), qiwangwanchengshijian).isNegative()){ + return true; + }else{ + return false; + } }else{ return false; } @@ -47,14 +66,33 @@ public class WorkBenchServiceImpl implements IWorkBenchService { } }).collect(Collectors.toList()); + List reminde_mode = DictBizCache.getList("reminde_mode"); + Map> map = new HashMap<>(); + //将到期任务按照提醒类型分类 + collect.forEach(cl ->{ + Map variableMap = runtimeService.getVariables(cl.getProcessInstanceId()); + if(Func.isNotEmpty(variableMap.get("tixingmoshi")) && Func.isNotBlank(variableMap.get("tixingmoshi").toString())){ + DictBiz tixingmoshi = DictBizCache.getById(Long.parseLong(variableMap.get("tixingmoshi").toString())); + List tasks; + if(map.get(tixingmoshi.getDictValue()) == null){ + tasks = new ArrayList(); + }else{ + tasks = map.get(tixingmoshi.getDictValue()); + } + tasks.add(cl); + map.put(tixingmoshi.getDictValue(), tasks); + } + }); + //遍历map并根据具体的操作类去执行提醒 + Iterator>> iterator = map.entrySet().iterator(); + while(iterator.hasNext()){ + Map.Entry> next = iterator.next(); + List tasks = next.getValue(); + String key = next.getKey(); -// //将到期任务按照提醒类型分类 -// collect.forEach(cl ->{ -// Map variableMap = cl.getProcessVariables(); -// if(Func.isNotEmpty(variableMap.get("tixingmoshi")) && Func.isNotBlank(variableMap.get("tixingmoshi").toString())){ -// -// } -// }); + RemindOperation bean = SpringUtil.getContext().getBean(RemindTypeEnum.valueOf(key).getName(), RemindOperation.class); + bean.remind(tasks); + } } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindIntervalDayClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindIntervalDayClass.java new file mode 100644 index 0000000..329bcdd --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindIntervalDayClass.java @@ -0,0 +1,22 @@ +package org.springblade.plugin.workbench.util; + +import lombok.AllArgsConstructor; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Description + * @Author ytl + * @Date 2023/2/20 0020 13:10 + */ +@Component(value = "remindTueClass") +@AllArgsConstructor +public class RemindIntervalDayClass implements RemindOperation{ + + @Override + public void remind(List list) { + + } +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindNoClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindNoClass.java new file mode 100644 index 0000000..e953808 --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindNoClass.java @@ -0,0 +1,19 @@ +package org.springblade.plugin.workbench.util; + +import org.flowable.task.api.Task; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Description + * @Author ytl + * @Date 2023/2/18 0018 17:54 + */ +@Component(value = "remindNoClass") +public class RemindNoClass implements RemindOperation{ + @Override + public void remind(List list) { + System.out.println("不执行提醒"); + } +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindOperation.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindOperation.java new file mode 100644 index 0000000..9630075 --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindOperation.java @@ -0,0 +1,14 @@ +package org.springblade.plugin.workbench.util; + +import org.flowable.task.api.Task; + +import java.util.List; + +/** + * @Description 提醒操作 + * @Author ytl + * @Date 2023/2/18 0018 17:51 + */ +public interface RemindOperation { + public void remind(List list); +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindTueClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindTueClass.java new file mode 100644 index 0000000..7aa044f --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindTueClass.java @@ -0,0 +1,40 @@ +package org.springblade.plugin.workbench.util; + +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.flowable.task.api.Task; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.resource.enums.SysTypeEnum; +import org.springblade.resource.feign.IMessageClient; +import org.springframework.stereotype.Component; + +import java.time.DayOfWeek; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @Description + * @Author ytl + * @Date 2023/2/18 0018 17:55 + */ +@Component(value = "remindTueClass") +@AllArgsConstructor +public class RemindTueClass implements RemindOperation { + + private final IMessageClient messageClient; + + @Override + public void remind(List list) { + System.out.println("每周一提醒"); + String s = DateUtil.fromDate(DateUtil.now()).getDayOfWeek().toString(); + if(StringUtils.isNotBlank(s) && StringUtils.equals("MONDAY",s)){ + list.forEach(task ->{ + // 发送提示消息 + messageClient.event(SysTypeEnum.INFORM.getValue(), "任务", + "你有新的任务(审批),请及时处理", 1, 5, task.getAssignee() == null ? "" : task.getAssignee(), ""); + }); + } + + } +}