1.增加自动开启工作流方法

main
yitonglei 3 years ago
parent df6a9d61eb
commit 665360576a
  1. 8
      lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/client/IRepeatClient.java
  2. 15
      lab-ops/lab-xxljob/src/main/java/org/springblade/job/executor/jobhandler/RepeatXxlJob.java
  3. 45
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/cache/FlowCache.java
  4. 32
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java
  5. 25
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/BladeManMade.java
  6. 2
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RemindTypeEnum.java
  7. 43
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RepeatTypeEnum.java
  8. 26
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/feign/IFlowClient.java
  9. 12
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/mapper/BladeManMadeMapper.java
  10. 5
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/mapper/BladeManMadeMapper.xml
  11. 16
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IBladeManMadeService.java
  12. 2
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IWorkBenchService.java
  13. 47
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/BladeManMadeServiceImpl.java
  14. 181
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java
  15. 22
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindIntervalDayClass.java
  16. 19
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindNoClass.java
  17. 14
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindOperation.java
  18. 40
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RemindTueClass.java
  19. 68
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatMonthClass.java
  20. 16
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatNoClass.java
  21. 13
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatOperation.java
  22. 76
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatQuarterClass.java
  23. 69
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.java
  24. 3
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/IWfProcessService.java
  25. 142
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java

@ -4,16 +4,16 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @Description 调用提醒模式接口类
* @Description 调用自动创建流程
* @Author ytl
* @Date 2023/2/18 0018 18:04
*/
@FeignClient(
value = "blade-workflow"
)
public interface IRemindClient {
String API_PREFIX = "/workBench/remind";
public interface IRepeatClient {
String API_PREFIX = "/workBench/repeat";
@GetMapping(API_PREFIX)
void remind();
void repeat();
}

@ -2,10 +2,9 @@ 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.springblade.job.executor.client.IRepeatClient;
import org.springframework.stereotype.Component;
/**
@ -14,16 +13,16 @@ import org.springframework.stereotype.Component;
* @Date 2023/2/18 0018 18:10
*/
@Component("remindXxlJob")
@Component("repeatXxlJob")
@AllArgsConstructor
@Slf4j
public class RemindXxlJob {
private final IRemindClient remindClient;
public class RepeatXxlJob {
private final IRepeatClient remindClient;
@XxlJob("remindToComplateJob")
public ReturnT<String> remindToComplateJob(String param) throws Exception {
@XxlJob("repeatToStartProcessJob")
public ReturnT<String> repeatToStartProcessJob(String param) throws Exception {
log.info("执行工作流提醒任务。。。。");
remindClient.remind();
remindClient.repeat();
return ReturnT.SUCCESS;
}

@ -0,0 +1,45 @@
package org.springblade.plugin.workbench.cache;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.plugin.workbench.entity.BladeManMade;
import org.springblade.plugin.workbench.feign.IFlowClient;
import org.springblade.system.entity.Menu;
import org.springblade.system.feign.ISysClient;
import java.util.List;
import java.util.Map;
import static org.springblade.core.cache.constant.CacheConstant.FLOW_CACHE;
import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
/**
* @Description
* @Author ytl
* @Date 2023/2/21 0021 14:30
*/
public class FlowCache {
private static IFlowClient flowClient;
private static IFlowClient getFlowClient() {
if (flowClient == null) {
flowClient = SpringUtil.getBean(IFlowClient.class);
}
return flowClient;
}
public static List<Map<String,Object>> getProcessInstanceVariable() {
return CacheUtil.get(FLOW_CACHE, "processinstancevariable:cache", "all", () -> {
R<List<Map<String,Object>>> result = getFlowClient().bladeManMadeVariabList();
return result.getData();
});
}
public static void clearBladeManMadeCache() {
CacheUtil.clear(FLOW_CACHE);
}
}

@ -6,11 +6,17 @@ 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.core.tool.api.R;
import org.springblade.plugin.workbench.entity.BladeManMade;
import org.springblade.plugin.workbench.service.IBladeManMadeService;
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;
import java.util.List;
import java.util.Map;
/**
* @Description 工作台
* @Author ytl
@ -24,13 +30,29 @@ import org.springframework.web.bind.annotation.RestController;
@Api(value = "工作台", tags = "工作台")
public class WorkBenchController extends BladeController {
private final IWorkBenchService workBenchService;
private final IBladeManMadeService bladeManMadeService;
@GetMapping("/remind")
@GetMapping("/repeat")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "调用提醒任务", notes = "调用提醒任务")
public void remind(){
System.out.println("执行工作台调度任务。。。。。。");
workBenchService.getTaskToRemind();
@ApiOperation(value = "重复开启工作流", notes = "重复开启工作流")
public void repeat(){
System.out.println("执行工作台调度任务重复开启工作流。。。。。。");
workBenchService.getTaskToRepeat();
}
@GetMapping("/bladeManMadeVariabList")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "bladeManMadeVariabList", notes = "bladeManMadeVariabList")
public R<List<Map<String, Object>>> bladeManMadeVariabList(){
List<Map<String, Object>> maps = bladeManMadeService.bladeManMadeVariabList();
return R.data(maps);
}
@GetMapping("/bladeManMadebList")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "bladeManMadebList", notes = "bladeManMadebList")
public R<List<Map<String, Object>>> bladeManMadebList(){
List<Map<String, Object>> maps = bladeManMadeService.bladeManMadeVariabList();
return R.data(maps);
}
}

@ -0,0 +1,25 @@
package org.springblade.plugin.workbench.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
import org.springblade.core.tool.utils.DateUtil;
/**
* @Description
* @Author ytl
* @Date 2023/2/20 0020 15:25
*/
@Data
@TableName("blade_flow_man_made")
@EqualsAndHashCode(callSuper = true)
public class BladeManMade extends TenantEntity {
private static final long serialVersionUID = 1L;
private String procInstId;
private Long processSeconds;
}

@ -18,7 +18,7 @@ public enum RemindTypeEnum {
//表dict_biz中code = reminde_mode 的id
private String code;
//表dict_biz中code = reminde_mode 的dict_value
//表dict_biz中code = reminde_mode 的
private String name;
RemindTypeEnum(String code, String name){

@ -0,0 +1,43 @@
package org.springblade.plugin.workbench.enumutil;
import java.util.HashMap;
import java.util.Map;
/**
* @Description
* @Author ytl
* @Date 2023/2/20 0020 17:38
*/
public enum RepeatTypeEnum {
不重复("1627589799957266433","repeatNoClass"),
每周("1627589960532000769","repeatWeekClass"),
每月("1627590001325801474", "repeatMonthClass"),
每季度("1627590044137062402", "repeatQuarterClass");
//表dict_biz中code = repeat_mode 的id
private String code;
//表dict_biz中code = repeat_mode 的id
private String name;
RepeatTypeEnum(String code, String name){
this.name = name;
this.code = code;
}
public String getCode(){
return code;
}
public String getName(){
return name;
}
public static Map<String,String> getAllToMap() {
Map<String,String> re = new HashMap<>();
RepeatTypeEnum[] values = values();
for(RepeatTypeEnum r:values){
re.put(r.getCode(), r.getName());
}
return re;
}
}

@ -0,0 +1,26 @@
package org.springblade.plugin.workbench.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springblade.system.feign.ISysClientFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author ytl
* @Date 2023/2/21 0021 15:09
*/
@FeignClient(
value = "blade-workflow"
)
public interface IFlowClient {
String API_PREFIX = "/workBench";
String API_PREFIX_INSTANCE_VARIABLE = API_PREFIX + "/bladeManMadeVariabList";
@GetMapping(API_PREFIX_INSTANCE_VARIABLE)
R<List<Map<String, Object>>> bladeManMadeVariabList();
}

@ -0,0 +1,12 @@
package org.springblade.plugin.workbench.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.plugin.workbench.entity.BladeManMade;
/**
* @Description
* @Author ytl
* @Date 2023/2/20 0020 15:23
*/
public interface BladeManMadeMapper extends BaseMapper<BladeManMade> {
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.plugin.workbench.mapper.BladeManMadeMapper">
</mapper>

@ -0,0 +1,16 @@
package org.springblade.plugin.workbench.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.plugin.workbench.entity.BladeManMade;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author ytl
* @Date 2023/2/20 0020 15:36
*/
public interface IBladeManMadeService extends IService<BladeManMade> {
List<Map<String,Object>> bladeManMadeVariabList();
}

@ -7,5 +7,5 @@ package org.springblade.plugin.workbench.service;
*/
public interface IWorkBenchService {
void getTaskToRemind();
void getTaskToRepeat();
}

@ -0,0 +1,47 @@
package org.springblade.plugin.workbench.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.plugin.workbench.entity.BladeManMade;
import org.springblade.plugin.workbench.mapper.BladeManMadeMapper;
import org.springblade.plugin.workbench.service.IBladeManMadeService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author ytl
* @Date 2023/2/20 0020 15:38
*/
@Service
@AllArgsConstructor
public class BladeManMadeServiceImpl extends BaseServiceImpl<BladeManMadeMapper, BladeManMade> implements IBladeManMadeService {
private final HistoryService historyService;
@Override
public List<Map<String, Object>> bladeManMadeVariabList() {
List<BladeManMade> bladeManMades = baseMapper.selectList(Wrappers.lambdaQuery());
List<Map<String,Object>> maps = new ArrayList<>();
if(bladeManMades.size() > 0){
bladeManMades.forEach(bl ->{
List<HistoricVariableInstance> variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcInstId()).list();
Map<String,Object> variable = new HashMap<>();
variableList.forEach(va ->{
variable.put(va.getVariableName(),va.getValue());
});
maps.add(variable);
});
}
return maps;
}
}

@ -1,25 +1,26 @@
package org.springblade.plugin.workbench.service.impl;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
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.flowable.engine.history.HistoricProcessInstance;
import org.flowable.variable.api.history.HistoricVariableInstance;
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.entity.BladeManMade;
import org.springblade.plugin.workbench.enumutil.RepeatTypeEnum;
import org.springblade.plugin.workbench.service.IBladeManMadeService;
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.plugin.workbench.util.RepeatOperation;
import org.springblade.system.cache.DictBizCache;
import org.springblade.system.entity.DictBiz;
import org.springblade.system.user.cache.UserCache;
import org.springblade.system.user.entity.User;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description
@ -34,65 +35,129 @@ public class WorkBenchServiceImpl implements IWorkBenchService {
private final RuntimeService runtimeService;
private final IBladeManMadeService bladeManMadeService;
private final HistoryService historyService;
// @Override
// public void getTaskToRemind(){
// List<Task> 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<String,List<Task>> taskRemindMap = new HashMap<>();
//
// //筛选出到期的任务
// List<Task> collect = list.stream().filter(ts -> {
//
// Map<String, Object> 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;
// }
// }else{
// return false;
// }
// }).collect(Collectors.toList());
//
// List<DictBiz> reminde_mode = DictBizCache.getList("reminde_mode");
// Map<String,List<Task>> map = new HashMap<>();
// //将到期任务按照提醒类型分类
// collect.forEach(cl ->{
// Map<String, Object> 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<Task> tasks;
// if(map.get(tixingmoshi.getDictValue()) == null){
// tasks = new ArrayList<Task>();
// }else{
// tasks = map.get(tixingmoshi.getDictValue());
// }
// tasks.add(cl);
// map.put(tixingmoshi.getDictValue(), tasks);
// }
// });
//
// //遍历map并根据具体的操作类去执行提醒
// Iterator<Map.Entry<String, List<Task>>> iterator = map.entrySet().iterator();
// while(iterator.hasNext()){
// Map.Entry<String, List<Task>> next = iterator.next();
// List<Task> tasks = next.getValue();
// String key = next.getKey();
//
// RemindOperation bean = SpringUtil.getContext().getBean(RemindTypeEnum.valueOf(key).getName(), RemindOperation.class);
// bean.remind(tasks);
// }
// }
@Override
public void getTaskToRemind(){
List<Task> 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();
}
public void getTaskToRepeat(){
List<BladeManMade> list = bladeManMadeService.list();
Map<String,List<Map<String,Object>>> maps = new HashMap<>();
if(list.size() > 0){
for(BladeManMade bl : list){
//历史流程变量
Map<String,Object> processVariables = new HashMap<>();
List<HistoricVariableInstance> list1 = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcInstId()).list();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(bl.getProcInstId()).singleResult();
list1.forEach(l ->{
processVariables.put(l.getVariableName(),l.getValue());
});
if(Func.isNotEmpty(processVariables)){
//获取流程定义id key
processVariables.put("defid",historicProcessInstance.getProcessDefinitionId());
processVariables.put("defkey",historicProcessInstance.getProcessDefinitionKey());
//将当前BladeManMade表的processinstanceid和repeatnum传入
processVariables.put("processinstanceid",historicProcessInstance.getId());
User applyUser = UserCache.getUser(Long.parseLong(processVariables.get("applyUser").toString()));
Map<String,List<Task>> taskRemindMap = new HashMap<>();
processVariables.put("createRoleName",applyUser.getRealName());
//筛选出到期的任务
List<Task> collect = list.stream().filter(ts -> {
//设置期望完成时间
processVariables.put("qiwangwanchengshijian", DateUtil.plusSeconds(DateUtil.now(),bl.getProcessSeconds()));
Map<String, Object> 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;
Object chongfumoshi = processVariables.get("chongfumoshi");
if(Func.isNotEmpty(chongfumoshi)){
DictBiz chongfuDic = DictBizCache.getById(Long.valueOf(chongfumoshi.toString()));
if(Func.isNotEmpty(chongfuDic)){
if(Func.isNotEmpty(maps.get(chongfuDic.getDictValue()))){
List<Map<String, Object>> variableList = maps.get(chongfuDic.getDictValue());
variableList.add(processVariables);
maps.put(chongfuDic.getDictValue(),variableList);
}else{
List<Map<String, Object>> variableList01 = new ArrayList<>();
variableList01.add(processVariables);
maps.put(chongfuDic.getDictValue(),variableList01);
}
}
}
}else{
return false;
}
}else{
return false;
}
}).collect(Collectors.toList());
List<DictBiz> reminde_mode = DictBizCache.getList("reminde_mode");
Map<String,List<Task>> map = new HashMap<>();
//将到期任务按照提醒类型分类
collect.forEach(cl ->{
Map<String, Object> 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<Task> tasks;
if(map.get(tixingmoshi.getDictValue()) == null){
tasks = new ArrayList<Task>();
}else{
tasks = map.get(tixingmoshi.getDictValue());
}
tasks.add(cl);
map.put(tixingmoshi.getDictValue(), tasks);
}
});
//遍历map并根据具体的操作类去执行提醒
Iterator<Map.Entry<String, List<Task>>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, List<Task>> next = iterator.next();
List<Task> tasks = next.getValue();
String key = next.getKey();
}
RemindOperation bean = SpringUtil.getContext().getBean(RemindTypeEnum.valueOf(key).getName(), RemindOperation.class);
bean.remind(tasks);
//遍历maps,调用具体的重复模式去执行重复新建工作流
if(Func.isNotEmpty(maps)){
Iterator<Map.Entry<String, List<Map<String, Object>>>> iterator = maps.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, List<Map<String, Object>>> next = iterator.next();
RepeatOperation repeatType = SpringUtil.getContext().getBean(RepeatTypeEnum.valueOf(next.getKey()).getName(), RepeatOperation.class);
repeatType.repeat(next.getValue());
}
}
}
}

@ -1,22 +0,0 @@
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<Task> list) {
}
}

@ -1,19 +0,0 @@
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<Task> list) {
System.out.println("不执行提醒");
}
}

@ -1,14 +0,0 @@
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<Task> list);
}

@ -1,40 +0,0 @@
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<Task> 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(), "");
});
}
}
}

@ -0,0 +1,68 @@
package org.springblade.plugin.workbench.util;
import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.flowable.engine.IdentityService;
import org.springblade.core.tool.utils.Func;
import org.springblade.plugin.workflow.core.constant.WfProcessConstant;
import org.springblade.plugin.workflow.process.service.IWfProcessService;
import org.springframework.stereotype.Component;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @Description 每月执行,每月的第一天执行
* @Author ytl
* @Date 2023/2/21 0021 14:14
*/
@Component(value = "repeatMonthClass")
@AllArgsConstructor
public class RepeatMonthClass implements RepeatOperation{
private final IdentityService identityService;
private final IWfProcessService wfProcessService;
@Override
public void repeat(List<Map<String, Object>> list) {
LocalDateTime localDateTime = LocalDateTime.now();
int dayOfMonth = localDateTime.getDayOfMonth();
if(dayOfMonth == 1){ //如果是每月第一天才执行
list.forEach(map ->{
//
identityService.setAuthenticatedUserId(map.get("applyUser").toString());
//开始时间
String start = map.get("start").toString();
//definitationid
String processDefId = map.get("defid").toString();
//defnationkey
String defKey = map.get("defkey").toString();
//重复次数
Integer repeatNum = Integer.parseInt(map.get("repeatnum").toString());
//实例id
String processinstanceId = map.get("processinstanceid").toString();
//角色名称
String createRoleName = map.get("createRoleName").toString();
map.remove("defid");
map.remove("defkey");
map.remove("repeatnum");
map.remove("processinstanceid");
//如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(map.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
map.put("assignee",map.get("yunweigongsi"));
}
wfProcessService.autoStartProcessInstanceById(processDefId,defKey,map);
});
}
}
}

@ -0,0 +1,16 @@
package org.springblade.plugin.workbench.util;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author ytl
* @Date 2023/2/20 0020 17:06
*/
public class RepeatNoClass implements RepeatOperation{
@Override
public void repeat(List<Map<String,Object>> list) {
}
}

@ -0,0 +1,13 @@
package org.springblade.plugin.workbench.util;
import java.util.List;
import java.util.Map;
/**
* @Description 重复开启工作流
* @Author ytl
* @Date 2023/2/20 0020 17:00
*/
public interface RepeatOperation {
public void repeat(List<Map<String,Object>> list);
}

@ -0,0 +1,76 @@
package org.springblade.plugin.workbench.util;
import lombok.AllArgsConstructor;
import org.flowable.engine.IdentityService;
import org.springblade.core.tool.utils.Func;
import org.springblade.plugin.workflow.core.constant.WfProcessConstant;
import org.springblade.plugin.workflow.process.service.IWfProcessService;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
/**
* @Description 每季度第一天执行
* @Author ytl
* @Date 2023/2/21 0021 17:18
*/
@Component(value = "repeatQuarterClass")
@AllArgsConstructor
public class RepeatQuarterClass implements RepeatOperation{
private final IdentityService identityService;
private final IWfProcessService wfProcessService;
@Override
public void repeat(List<Map<String, Object>> list) {
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfMonth(1);
int month = now.getMonth().getValue();
if (1 <= month && month <= 3) {
localDate = localDate.withMonth(1);
} else if (4 <= month && month <= 6) {
localDate = localDate.withMonth(4);
} else if (7 <= month && month <= 9) {
localDate = localDate.withMonth(7);
} else {
localDate = localDate.withMonth(10);
}
if(now.equals(localDate)){
list.forEach(map ->{
//
identityService.setAuthenticatedUserId(map.get("applyUser").toString());
//开始时间
String start = map.get("start").toString();
//definitationid
String processDefId = map.get("defid").toString();
//defnationkey
String defKey = map.get("defkey").toString();
//重复次数
Integer repeatNum = Integer.parseInt(map.get("repeatnum").toString());
//实例id
String processinstanceId = map.get("processinstanceid").toString();
//角色名称
String createRoleName = map.get("createRoleName").toString();
map.remove("defid");
map.remove("defkey");
map.remove("repeatnum");
map.remove("processinstanceid");
//如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(map.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
map.put("assignee",map.get("yunweigongsi"));
}
wfProcessService.autoStartProcessInstanceById(processDefId,defKey,map);
});
}
}
}

@ -0,0 +1,69 @@
package org.springblade.plugin.workbench.util;
import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.flowable.engine.IdentityService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.runtime.ProcessInstance;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.plugin.workflow.core.constant.WfProcessConstant;
import org.springblade.plugin.workflow.process.service.IWfProcessService;
import org.springframework.stereotype.Component;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @Description 每周执行,每周的第一天执行
* @Author ytl
* @Date 2023/2/20 0020 17:07
*/
@Component(value = "repeatWeekClass")
@AllArgsConstructor
public class RepeatWeekClass implements RepeatOperation{
private final IdentityService identityService;
private final IWfProcessService wfProcessService;
@Override
public void repeat(List<Map<String,Object>> list) {
LocalDateTime localDateTime = LocalDateTime.now();
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
//MONDAY
if(StringUtils.equals(dayOfWeek.name(),"MONDAY")){ //如果是周一才执行
list.forEach(map ->{
identityService.setAuthenticatedUserId(map.get("applyUser").toString());
//definitationid
String processDefId = map.get("defid").toString();
//defnationkey
String defKey = map.get("defkey").toString();
//实例id
String processinstanceId = map.get("processinstanceid").toString();
//角色名称
String createRoleName = map.get("createRoleName").toString();
map.remove("defid");
map.remove("defkey");
map.remove("repeatnum");
map.remove("processinstanceid");
//如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(map.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
map.put("assignee",map.get("yunweigongsi"));
}
wfProcessService.autoStartProcessInstanceById(processDefId,defKey,map);
});
}
}
}

@ -143,4 +143,7 @@ public interface IWfProcessService {
* @return
*/
Task selectProcessInstanceId(String processInstanceId, String userCode);
String autoStartProcessInstanceById(String processDefId, String defKey,Map<String, Object> variables);
}

@ -3,6 +3,7 @@ package org.springblade.plugin.workflow.process.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor;
@ -39,6 +40,9 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.plugin.workbench.cache.FlowCache;
import org.springblade.plugin.workbench.entity.BladeManMade;
import org.springblade.plugin.workbench.service.IBladeManMadeService;
import org.springblade.plugin.workflow.core.constant.WfExtendConstant;
import org.springblade.plugin.workflow.core.utils.ObjectUtil;
import org.springblade.plugin.workflow.core.utils.WfModelUtil;
@ -57,11 +61,14 @@ import org.springblade.plugin.workflow.process.service.*;
import org.springblade.system.user.cache.UserCache;
import org.springblade.system.user.entity.User;
import org.springblade.system.user.feign.IUserSearchClient;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nullable;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
@ -86,9 +93,80 @@ public class WfProcessService implements IWfProcessService {
private final IUserSearchClient userSearchService;
private final IBladeManMadeService bladeManMadeService;
private final RedisTemplate redisTemplate;
// private final LimsInvoked limsInvoked;
@Override
public String autoStartProcessInstanceById(String processDefId,String defKey, Map<String, Object> map){
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, defKey, map);
return handleAutoProcessInstance(processInstance, map);
}
private String handleAutoProcessInstance(ProcessInstance processInstance, @Nullable Map<String, Object> variables) {
String userId = WfTaskUtil.getTaskUser();
String processDefId = processInstance.getProcessDefinitionId();
if (variables == null) {
variables = new HashMap<>();
}
// 业务变量
Map<String, Object> customVariables = new HashMap<>();
//User user = UserCache.getUser(Long.parseLong(userId));
customVariables.put(WfProcessConstant.TASK_VARIABLE_APPLY_USER_NAME, variables.get("applyUser").toString());
// 流水号
String sn = wfSerialService.getNextSN(processInstance.getDeploymentId());
if (StringUtil.isNotBlank(sn)) {
customVariables.put(WfProcessConstant.TASK_VARIABLE_SN, sn);
}
runtimeService.setVariables(processInstance.getId(), customVariables);
// 修改流程实例名称,方便查询
try {
runtimeService.setProcessInstanceName(processInstance.getId(), processInstance.getProcessDefinitionName());
} catch (Exception ignore) {
return processInstance.getId();
}
// 自动跳过第一节点
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
String skip = WfModelUtil.getProcessExtensionAttribute(bpmnModel, WfExtendConstant.SKIP_FIRST_NODE);
if (StringUtil.isNotBlank(skip) && "true".equals(skip)) {
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
taskList.forEach(task -> taskService.complete(task.getId()));
}
// 指定下一步审核人
this.handleNextNodeAssignee(processInstance.getId(), variables.get(WfProcessConstant.TASK_VARIABLE_ASSIGNEE), null);
// 消息
wfNoticeService.resolveNoticeInfo(new WfNotice()
.setFromUserId(userId)
.setProcessId(processInstance.getId())
.setType(WfNotice.Type.START));
// 处理抄送
Object copyUser = variables.get(WfProcessConstant.TASK_VARIABLE_COPY_USER);
if (ObjectUtil.isNotEmpty(copyUser)) {
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
if (taskList.size() > 0) {
Task task = taskList.get(0);
WfProcess process = new WfProcess();
process.setAssignee(WfTaskUtil.getTaskUser());
process.setAssigneeName(WfTaskUtil.getNickName());
process.setTaskId(task.getId());
process.setTaskName(processInstance.getProcessDefinitionName() + "-" + task.getName());
process.setProcessInstanceId(processInstance.getId());
process.setCopyUser(copyUser.toString());
wfCopyService.resolveCopyUser(process);
}
}
// 删除草稿箱
wfDraftService.deleteByProcessDefId(processDefId, WfTaskUtil.getTaskUser(), variables.get(WfProcessConstant.TASK_VARIABLE_PLATFORM));
return processInstance.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public String startProcessInstanceById(String processDefId, Map<String, Object> variables) {
ProcessDefinition definition = WfProcessCache.getProcessDefinition(processDefId);
if (definition == null) {
@ -100,17 +178,67 @@ public class WfProcessService implements IWfProcessService {
variables.put(WfProcessConstant.TASK_VARIABLE_APPLY_USER, userId);
variables.put(WfProcessConstant.TASK_CREATE_ROLE, createRoleName);
//如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(variables.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
variables.put("assignee",variables.get("yunweigongsi"));
//判断该手动发起任务是否已经发起过,或者时不重复任务
if(StringUtils.equals(variables.get("$chongfumoshi").toString(),"不重复")){
// 启动流程
identityService.setAuthenticatedUserId(userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables);
return handleProcessInstance(processInstance, variables);
}else if(this.isNewProcess(variables) && Func.isEmpty(variables.get("forcestart"))){
return "类似任务已经发起过,是否要强制发起";
}else{
//如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(variables.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
variables.put("assignee",variables.get("yunweigongsi"));
}
// 启动流程
identityService.setAuthenticatedUserId(userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables);
//将新增的流程实例id保存到blade_flow_man_made
BladeManMade bladeManMade = new BladeManMade();
bladeManMade.setProcInstId(processInstance.getId());
Date startTime = processInstance.getStartTime();
Date qiwangwanchengshijian = DateUtil.parse(variables.get("qiwangwanchengshijian").toString(), "yyyy-MM-dd HH:mm:ss");
Duration between = DateUtil.between(startTime, qiwangwanchengshijian);
bladeManMade.setProcessSeconds(between.getSeconds());
bladeManMadeService.save(bladeManMade);
FlowCache.clearBladeManMadeCache();
return handleProcessInstance(processInstance, variables);
}
// 启动流程
identityService.setAuthenticatedUserId(userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables);
}
//判断该类型的流程是否已经发起过,false:有重复的,true:没重复
private boolean isNewProcess(Map<String, Object> variables){
variables.remove("qiwangwanchengshijian");
boolean b = false;
List<Map<String, Object>> processInstanceVariable = FlowCache.getProcessInstanceVariable();
for(Map<String,Object> hi : processInstanceVariable){
boolean noEqual = this.isNoEqual(variables, hi);
if(noEqual){//有不相等的,直接下一次循环判断
continue;
}else{//没有不相等的,说明有重复的,结束循环,返回b=true
b = true;
break;
}
}
return handleProcessInstance(processInstance, variables);
return b;
}
//判断是否有不相等的,true 有 false没有
private boolean isNoEqual(Map<String,Object> map1, Map<String,Object> map2){
Set<Map.Entry<String, Object>> entries = map1.entrySet();
Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
while(iterator.hasNext()){
Map.Entry<String, Object> next = iterator.next();
if(!Func.equals(next.getValue(),map2.get(next.getKey()))){
return true;
}
}
return false;
}
@Override

Loading…
Cancel
Save