From c13f1468144c2018630108fd2b9a1ce2b8b611da Mon Sep 17 00:00:00 2001 From: jinqiming <45981669@qq.com> Date: Mon, 7 Dec 2020 18:31:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysOaLeaveController.java | 71 ++++++--- .../templates/system/leave/reStartTask.html | 126 +++++++++++++++ .../com/snow/common/enums/ProcessStatus.java | 6 +- .../common/{ => constants}/FlowConstants.java | 15 +- .../flowable/common/enums/FlowDefEnum.java | 41 +++++ .../com/snow/flowable/domain/AppForm.java | 41 +++-- .../domain/leave/LeaveFinishTaskDTO.java | 37 +++++ .../flowable/domain/leave/SysOaLeaveForm.java | 57 +++++++ .../listener/AbstartctEventListener.java | 32 ++++ .../listener/AbstractExecutionListener.java | 144 ++++++++++++++++++ .../listener/AbstractTaskListener.java | 122 +++++++++++++++ .../listener/CommonEventListener.java | 58 ------- .../listener/leave/LeaveEndListener.java | 18 +-- .../leave/LeaveManagerTaskListener.java | 24 --- .../listener/leave/LeaveStartListener.java | 41 ++--- .../leave/LeaveStartTaskListener.java | 41 +++++ .../snow/flowable/service/AppFormService.java | 14 ++ .../flowable/service/FlowableService.java | 7 + .../service/impl/AppFormServiceImpl.java | 44 ++++++ .../service/impl/FlowableServiceImpl.java | 24 ++- 20 files changed, 799 insertions(+), 164 deletions(-) create mode 100644 snow-admin/src/main/resources/templates/system/leave/reStartTask.html rename snow-flowable/src/main/java/com/snow/flowable/common/{ => constants}/FlowConstants.java (63%) create mode 100644 snow-flowable/src/main/java/com/snow/flowable/common/enums/FlowDefEnum.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/domain/leave/LeaveFinishTaskDTO.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/domain/leave/SysOaLeaveForm.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/listener/AbstartctEventListener.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/listener/AbstractExecutionListener.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/listener/AbstractTaskListener.java delete mode 100644 snow-flowable/src/main/java/com/snow/flowable/listener/CommonEventListener.java delete mode 100644 snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveManagerTaskListener.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartTaskListener.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/service/AppFormService.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/service/impl/AppFormServiceImpl.java diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java index 7c2aeb7..c51aaf0 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java @@ -4,28 +4,26 @@ import java.util.Date; import java.util.List; import java.util.Map; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.BetweenFormater; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ClassUtil; +import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.snow.common.constant.SequenceContants; import com.snow.common.enums.ProcessStatus; -import com.snow.common.json.JSON; import com.snow.common.utils.StringUtils; -import com.snow.flowable.common.FlowConstants; +import com.snow.flowable.common.constants.FlowConstants; +import com.snow.flowable.common.enums.FlowDefEnum; import com.snow.flowable.domain.*; +import com.snow.flowable.domain.leave.LeaveFinishTaskDTO; +import com.snow.flowable.domain.leave.SysOaLeaveForm; import com.snow.flowable.service.impl.FlowableServiceImpl; import com.snow.framework.util.ShiroUtils; import com.snow.system.domain.SysUser; import com.snow.system.service.ISysSequenceService; -import com.snow.system.service.impl.SysOaLeaveServiceImpl; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -163,25 +161,26 @@ public class SysOaLeaveController extends BaseController public AjaxResult editSave(SysOaLeave sysOaLeave) { SysUser sysUser = ShiroUtils.getSysUser(); - SysOaLeave oldSysOaLeave = sysOaLeaveService.selectSysOaLeaveById(sysOaLeave.getId()); + + sysOaLeave.setApplyPerson(sysUser.getUserName()); + int i = sysOaLeaveService.updateSysOaLeave(sysOaLeave); + SysOaLeave newSysOaLeave = sysOaLeaveService.selectSysOaLeaveById(sysOaLeave.getId()); //发起审批 - StartProcessDTO startProcessDTO=new StartProcessDTO(); - startProcessDTO.setBusinessKey(oldSysOaLeave.getLeaveNo()); - startProcessDTO.setProcessDefinitionKey(FlowConstants.SNOW_OA_LEAVE); - startProcessDTO.setStartUserId(String.valueOf(sysUser.getUserId())); - Map map = BeanUtil.beanToMap(sysOaLeave); - startProcessDTO.setVariables(map); - ProcessInstance processInstance = flowableService.startProcessInstanceByKey(startProcessDTO); + SysOaLeaveForm sysOaLeaveForm=new SysOaLeaveForm(); + BeanUtils.copyProperties(sysOaLeave,sysOaLeaveForm); + sysOaLeaveForm.setBusinessKey(newSysOaLeave.getLeaveNo()); + sysOaLeaveForm.setStartUserId(String.valueOf(sysUser.getUserId())); + sysOaLeaveForm.setClassInfoJson(com.alibaba.fastjson.JSON.toJSONString(newSysOaLeave)); + sysOaLeaveForm.setClassPackName(SysOaLeaveForm.class.getCanonicalName()); + ProcessInstance processInstance = flowableService.startProcessInstanceByAppForm(sysOaLeaveForm); + //提交 CompleteTaskDTO completeTaskDTO=new CompleteTaskDTO(); completeTaskDTO.setUserId(String.valueOf(sysUser.getUserId())); Task task= flowableService.getTaskProcessInstanceById(processInstance.getProcessInstanceId()); completeTaskDTO.setTaskId(task.getId()); + completeTaskDTO.setIsPass(true); flowableService.completeTask(completeTaskDTO); - sysOaLeave.setCreateBy(sysUser.getUserName()); - sysOaLeave.setApplyPerson(sysUser.getUserName()); - BeanUtils.copyProperties(sysOaLeave,oldSysOaLeave); - sysOaLeave.setProcessInstanceId(processInstance.getProcessInstanceId()); - return toAjax(sysOaLeaveService.updateSysOaLeave(sysOaLeave)); + return toAjax(i); } /** @@ -282,4 +281,36 @@ public class SysOaLeaveController extends BaseController int i = sysOaLeaveService.updateSysOaLeaveByLeaveNo(sysOaLeave); return toAjax(i); } + + /** + * 重新发起申请 + */ + @Log(title = "重新发起申请", businessType = BusinessType.UPDATE) + @PostMapping("/reStartTask") + @ResponseBody + public AjaxResult reStartTask(LeaveFinishTaskDTO sysOaLeave) + { + SysUser sysUser = ShiroUtils.getSysUser(); + + sysOaLeave.setApplyPerson(sysUser.getUserName()); + int i = sysOaLeaveService.updateSysOaLeave(sysOaLeave); + SysOaLeave newSysOaLeave = sysOaLeaveService.selectSysOaLeaveById(sysOaLeave.getId()); + String leaveString= JSON.toJSONString(newSysOaLeave); + //提交 + CompleteTaskDTO completeTaskDTO=new CompleteTaskDTO(); + completeTaskDTO.setUserId(String.valueOf(sysUser.getUserId())); + completeTaskDTO.setTaskId(sysOaLeave.getTaskId()); + completeTaskDTO.setComment(sysOaLeave.getSuggestion()); + Integer checkStatus = sysOaLeave.getCheckStatus(); + if(checkStatus==0){ + completeTaskDTO.setIsPass(true); + }else { + completeTaskDTO.setIsPass(false); + } + Map map=Maps.newHashMap(); + map.put(FlowConstants.BUS_VAR,leaveString); + completeTaskDTO.setParamMap(map); + flowableService.completeTask(completeTaskDTO); + return toAjax(i); + } } diff --git a/snow-admin/src/main/resources/templates/system/leave/reStartTask.html b/snow-admin/src/main/resources/templates/system/leave/reStartTask.html new file mode 100644 index 0000000..e3080df --- /dev/null +++ b/snow-admin/src/main/resources/templates/system/leave/reStartTask.html @@ -0,0 +1,126 @@ + + + + + + + + +
+
+
+
+   +   +
+
+
+

请假信息

+ + +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+ +
+
+
+

填写信息

+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+
+ +
+ + + + + + \ No newline at end of file diff --git a/snow-common/src/main/java/com/snow/common/enums/ProcessStatus.java b/snow-common/src/main/java/com/snow/common/enums/ProcessStatus.java index 00bc37e..716f079 100644 --- a/snow-common/src/main/java/com/snow/common/enums/ProcessStatus.java +++ b/snow-common/src/main/java/com/snow/common/enums/ProcessStatus.java @@ -23,5 +23,9 @@ public enum ProcessStatus /** * 审批驳回 */ - REJECT + REJECT, + /** + * 取消 + */ + CANCEL } diff --git a/snow-flowable/src/main/java/com/snow/flowable/common/FlowConstants.java b/snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java similarity index 63% rename from snow-flowable/src/main/java/com/snow/flowable/common/FlowConstants.java rename to snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java index fcd06f0..55135f8 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/common/FlowConstants.java +++ b/snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java @@ -1,4 +1,4 @@ -package com.snow.flowable.common; +package com.snow.flowable.common.constants; /** * @author qimingjin @@ -28,4 +28,17 @@ public class FlowConstants { */ public static final String OPINION="OPINION"; + /** + * 业务参数常量 + */ + public static final String BUS_VAR="bus_var"; + /** + * 当前类的包名 + */ + public static final String CLASS_PACK_NAME="classPackName"; + + /** + * 流程开始用户标识 + */ + public static final String START_USER_ID="startUserId"; } diff --git a/snow-flowable/src/main/java/com/snow/flowable/common/enums/FlowDefEnum.java b/snow-flowable/src/main/java/com/snow/flowable/common/enums/FlowDefEnum.java new file mode 100644 index 0000000..9a8968e --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/common/enums/FlowDefEnum.java @@ -0,0 +1,41 @@ +package com.snow.flowable.common.enums; + +/** + * @author qimingjin + * @Title: 流程定义枚举 + * @Description: + * @date 2020/12/7 15:54 + */ +public enum FlowDefEnum { + SNOW_OA_LEAVE("snow_oa_leave", "请假申请流程"), + + NO_FINISHED("", ""); + + private final String code; + private final String info; + + FlowDefEnum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public static FlowDefEnum getByCode(String code) { + for (FlowDefEnum value : FlowDefEnum.values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java b/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java index 99bacbf..0e8d33a 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java @@ -1,8 +1,12 @@ package com.snow.flowable.domain; +import com.snow.flowable.common.enums.FlowDefEnum; import lombok.Data; +import org.json.JSONObject; +import javax.validation.constraints.NotBlank; import java.io.Serializable; +import java.util.Map; /** * @program: snow @@ -11,21 +15,36 @@ import java.io.Serializable; * @create: 2020-12-05 17:05 **/ @Data -public class AppForm implements Serializable { - - /** - * 流程ID - */ - private String processInstanceId; - - /** - * 业务参数 - */ - private String businessKey; +public abstract class AppForm implements Serializable { /** * 流程发起人 */ + @NotBlank(message = "流程发起人不能为空") private String startUserId; + + /** + * 流程申请单需实现此方法,返回申请单对应的流程定义. + * 一个流程对应一个申请单.(暂时) + * + * @return 流程定义 + */ + public abstract FlowDefEnum getFlowDef(); + + /** + * 业务参数 + */ + @NotBlank(message = "业务参数不能为空") + private String businessKey; + + /** + * 业务数据JSOn + */ + private String classInfoJson; + /** + * 当前类的包名称 + */ + @NotBlank(message = "当前类的包名称不能为空") + private String classPackName; } diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/leave/LeaveFinishTaskDTO.java b/snow-flowable/src/main/java/com/snow/flowable/domain/leave/LeaveFinishTaskDTO.java new file mode 100644 index 0000000..70cca4a --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/leave/LeaveFinishTaskDTO.java @@ -0,0 +1,37 @@ +package com.snow.flowable.domain.leave; + +import com.snow.system.domain.SysOaLeave; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @program: snow + * @description + * @author: 没用的阿吉 + * @create: 2020-11-23 22:13 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LeaveFinishTaskDTO extends SysOaLeave implements Serializable { + + + private String taskId; + + private String suggestion; + + private String suggestionFileUrl; + /** + * 0通过,1--驳回 + */ + private Integer checkStatus; + /** + * 业务参数 + */ + private String businessKey; +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/leave/SysOaLeaveForm.java b/snow-flowable/src/main/java/com/snow/flowable/domain/leave/SysOaLeaveForm.java new file mode 100644 index 0000000..ba858e0 --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/leave/SysOaLeaveForm.java @@ -0,0 +1,57 @@ +package com.snow.flowable.domain.leave; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.snow.flowable.common.enums.FlowDefEnum; +import com.snow.flowable.domain.AppForm; +import lombok.Data; + +import java.util.Date; + +/** + * @author qimingjin + * @Title: + * @Description: + * @date 2020/12/7 11:12 + */ +@Data +public class SysOaLeaveForm extends AppForm { + /** id */ + private Integer id; + + /** 请假名称 */ + private String name; + + /** 请假理由 */ + private String reason; + + /** 开始时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + /** 流程状态(0--待审批,1-审批中,2--审批通过,3--已驳回) */ + private Integer processStatus; + + /** 流程实例ID */ + + private String processInstanceId; + + /** 申请人 */ + + private String applyPerson; + + /** 附件 */ + + private String fileUrl; + /** 请假单号 */ + + private String leaveNo; + + @Override + public FlowDefEnum getFlowDef() { + return FlowDefEnum.SNOW_OA_LEAVE; + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/AbstartctEventListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstartctEventListener.java new file mode 100644 index 0000000..551c0f2 --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstartctEventListener.java @@ -0,0 +1,32 @@ +package com.snow.flowable.listener; + +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; + +/** + * @author qimingjin + * @Title: + * @Description: 全局事件监听 + * @date 2020/12/7 18:13 + */ +public class AbstartctEventListener implements FlowableEventListener { + @Override + public void onEvent(FlowableEvent flowableEvent) { + + } + + @Override + public boolean isFailOnException() { + return false; + } + + @Override + public boolean isFireOnTransactionLifecycleEvent() { + return false; + } + + @Override + public String getOnTransaction() { + return null; + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractExecutionListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractExecutionListener.java new file mode 100644 index 0000000..f05334f --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractExecutionListener.java @@ -0,0 +1,144 @@ +package com.snow.flowable.listener; + +import com.snow.flowable.common.constants.FlowConstants; +import com.snow.flowable.domain.AppForm; +import com.snow.flowable.service.FlowableService; + +import com.snow.flowable.service.impl.AppFormServiceImpl; +import com.snow.system.service.impl.SysUserServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +/** + * @program: snow + * @description 执行监听器 + * @author: 没用的阿吉 + * @create: 2020-12-05 16:59 + **/ +@Slf4j +public abstract class AbstractExecutionListener implements ExecutionListener { + + + private ThreadLocal appFormLocal = new ThreadLocal<>(); + + private ThreadLocal delegateExecutionLocal=new ThreadLocal(); + @Autowired + private FlowableService flowableService; + + @Autowired + private SysUserServiceImpl sysUserService; + + @Autowired + private AppFormServiceImpl appFormService; + + @Override + @Transactional + public void notify(DelegateExecution delegateExecution) { + try { + delegateExecutionLocal.set(delegateExecution); + execute(); + } finally { + //移除threadLocal变量,保证数据唯一 + appFormLocal.remove(); + delegateExecutionLocal.remove(); + } + } + + protected void execute() { + try { + process(); + } catch (RuntimeException e) { + log.error("执行任务异常", e); + throw e; + } + } + + /** + * 抽象需要执行的程序类 + */ + protected abstract void process(); + + protected DelegateExecution getExecution() { + return delegateExecutionLocal.get(); + } + + /** + * 设置流程节点的变量 + * + * @param key 变量名 + * @param value 变量值 + */ + protected void setVariable(String key, Object value) { + getExecution().setVariable(key, value); + } + + /** + * 设置节点本地变量 + * + * @param key 变量名 + * @param value 变量值 + */ + protected void setVariableLocal(String key, Object value) { + getExecution().setVariableLocal(key, value); + } + + /** + * 获取流程变量 + */ + @SuppressWarnings("unchecked") + protected V getVariable(String key) { + return (V) getExecution().getVariable(key); + } + /** + * 获取流程节点本地变量 + */ + protected V getVariableLocal(String key) { + return (V) getExecution().getVariableLocal(key); + } + /** + * 流程对应的业务主键 + */ + protected String getBusinessKey() { + return getExecution().getProcessInstanceBusinessKey(); + } + + /** + * 流程实例ID + */ + protected String getProcessInstanceId() { + return getExecution().getProcessInstanceId(); + } + + /** + * 获取流程开始用户 + * @return + */ + protected String getStartUserName() { + String startUserId =getVariable(FlowConstants.START_USER_ID); + log.info("获取到的开始人startUserId:{}",startUserId); + return Optional.ofNullable(sysUserService.selectUserById(Long.parseLong(startUserId)).getUserName()).orElse(""); + } + + /** + * 获取表单数据 + * @return + */ + public T getAppForms(){ + String busVar = getVariable(FlowConstants.BUS_VAR); + String classPackName = getVariable(FlowConstants.CLASS_PACK_NAME); + T t = appFormLocal.get(); + if(t==null){ + appFormLocal.set(appFormService.getAppFrom(busVar,classPackName)); + t=appFormLocal.get(); + } + return t; + } + +} + + diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractTaskListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractTaskListener.java new file mode 100644 index 0000000..73e782b --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractTaskListener.java @@ -0,0 +1,122 @@ +package com.snow.flowable.listener; + +import com.snow.flowable.common.constants.FlowConstants; +import com.snow.flowable.domain.CompleteTaskDTO; +import com.snow.flowable.service.FlowableService; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author qimingjin + * @Title: + * @Description: + * @date 2020/12/7 16:39 + */ +@Slf4j +public abstract class AbstractTaskListener implements TaskListener { + + @Autowired + private FlowableService flowableService; + + private ThreadLocal threadLocal=new ThreadLocal(); + + private ThreadLocal delegateTaskThreadLocal=new ThreadLocal<>(); + @Override + public void notify(DelegateTask delegateTask) { + try { + delegateTaskThreadLocal.set(delegateTask); + processTask(); + } finally { + delegateTaskThreadLocal.remove(); + } + + } + + protected abstract void processTask(); + /** + * 设置流程节点的变量 + * + * @param key 变量名 + * @param value 变量值 + */ + protected void setVariable(String key, Object value) { + getDelegateTask().setVariable(key, value); + } + + /** + * 设置节点本地变量 + * + * @param key 变量名 + * @param value 变量值 + */ + protected void setVariableLocal(String key, Object value) { + getDelegateTask().setVariableLocal(key, value); + } + /** + * 根据key获取节点本地变量 + * @param key + * @param + * @return + */ + protected V getVariableLocal(String key){ + return (V)getDelegateTask().getVariableLocal(key); + } + + /** + * 获取流程变量 + * @param key + * @param + * @return + */ + protected V getVariable(String key){ + return (V)getDelegateTask().getVariable(key); + } + + protected V getVariable(String key, Class varClass) { + return getDelegateTask().getVariable(key, varClass); + } + + protected DelegateTask getDelegateTask(){ + return delegateTaskThreadLocal.get(); + } + + /** + * 获取审批结果 + * @return + */ + protected Boolean getApprovalResult(){ + return getVariable(FlowConstants.IS_PASS); + } + /** + * 流程实例ID + */ + protected String getProcessInstanceId() { + return getDelegateTask().getProcessInstanceId(); + } + + /** + * 流程对应的业务主键 + */ + protected String getBusinessKey() { + ProcessInstance processInstance = flowableService.getProcessInstanceById(getProcessInstanceId()); + return processInstance.getBusinessKey(); + } + + /** + * 获取流程发起人 + * @return + */ + protected String getStartUserId() { + ProcessInstance processInstance = flowableService.getProcessInstanceById(getProcessInstanceId()); + return processInstance.getStartUserId(); + } + /** + * 获取节点名称 + */ + protected String getTaskName() { + return getDelegateTask().getName(); + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/CommonEventListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/CommonEventListener.java deleted file mode 100644 index d74a248..0000000 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/CommonEventListener.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.snow.flowable.listener; - -import com.snow.flowable.domain.AppForm; -import com.snow.flowable.service.FlowableService; - -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.ExecutionListener; -import org.flowable.engine.history.HistoricProcessInstance; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; - -import java.util.Map; - -/** - * @program: snow - * @description 执行监听器 - * @author: 没用的阿吉 - * @create: 2020-12-05 16:59 - **/ -@Component -@Slf4j -public class CommonEventListener implements ExecutionListener { - - public ThreadLocal threadLocalAppForm=new ThreadLocal(); - - @Autowired - private FlowableService flowableService; - - @Override - public void notify(DelegateExecution delegateExecution) { - - Map variables = delegateExecution.getVariables(); - String processInstanceId = delegateExecution.getProcessInstanceId(); - log.info("===================>{}",processInstanceId); - setAppForms(processInstanceId); - } - - - - - public void setAppForms(String processInstanceId){ - HistoricProcessInstance historicProcessInstance = flowableService.getHistoricProcessInstanceById(processInstanceId); - AppForm appForm=new AppForm(); - appForm.setBusinessKey(historicProcessInstance.getBusinessKey()); - appForm.setProcessInstanceId(historicProcessInstance.getId()); - appForm.setStartUserId(historicProcessInstance.getStartUserId()); - threadLocalAppForm.set(appForm); - } - - - public Object getVariable(String variableName){ - return null; - } -} - - diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveEndListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveEndListener.java index c7d7a11..928a5d1 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveEndListener.java +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveEndListener.java @@ -1,11 +1,11 @@ package com.snow.flowable.listener.leave; import com.snow.common.enums.ProcessStatus; -import com.snow.flowable.domain.AppForm; -import com.snow.flowable.listener.CommonEventListener; +import com.snow.flowable.domain.leave.SysOaLeaveForm; +import com.snow.flowable.listener.AbstractExecutionListener; import com.snow.system.domain.SysOaLeave; import com.snow.system.service.impl.SysOaLeaveServiceImpl; -import org.flowable.engine.delegate.DelegateExecution; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,18 +16,18 @@ import org.springframework.stereotype.Service; * @create: 2020-12-05 17:29 **/ @Service -public class LeaveEndListener extends CommonEventListener { +@Slf4j +public class LeaveEndListener extends AbstractExecutionListener { @Autowired private SysOaLeaveServiceImpl sysOaLeaveService; @Override - public void notify(DelegateExecution delegateExecution) { - AppForm appForm = threadLocalAppForm.get(); + protected void process() { + SysOaLeaveForm appForms = getAppForms(); + String businessKey= getBusinessKey(); SysOaLeave sysOaLeave=new SysOaLeave(); sysOaLeave.setProcessStatus(ProcessStatus.PASS.ordinal()); - sysOaLeave.setApplyPerson(appForm.getStartUserId()); - sysOaLeave.setProcessInstanceId(appForm.getProcessInstanceId()); - sysOaLeave.setLeaveNo(appForm.getBusinessKey()); + sysOaLeave.setLeaveNo(businessKey); sysOaLeaveService.updateSysOaLeaveByLeaveNo(sysOaLeave); } } diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveManagerTaskListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveManagerTaskListener.java deleted file mode 100644 index 2b5bfee..0000000 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveManagerTaskListener.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.snow.flowable.listener.leave; - -import org.flowable.engine.delegate.TaskListener; -import org.flowable.task.service.delegate.DelegateTask; -import org.springframework.stereotype.Service; - -import java.util.Map; - -/** - * @program: snow - * @description - * @author: 没用的阿吉 - * @create: 2020-12-06 12:01 - **/ -@Service("leaveManagerTaskListener") -public class LeaveManagerTaskListener implements TaskListener { - - @Override - public void notify(DelegateTask delegateTask) { - Map variables = delegateTask.getVariables(); - Map variablesLocal = delegateTask.getVariablesLocal(); - String assignee = delegateTask.getAssignee(); - } -} diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartListener.java index ce990a4..3f07e30 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartListener.java +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartListener.java @@ -2,22 +2,14 @@ package com.snow.flowable.listener.leave; import com.snow.common.enums.ProcessStatus; -import com.snow.flowable.domain.AppForm; -import com.snow.flowable.listener.CommonEventListener; -import com.snow.flowable.service.FlowableService; +import com.snow.flowable.domain.leave.SysOaLeaveForm; +import com.snow.flowable.listener.AbstractExecutionListener; import com.snow.system.domain.SysOaLeave; import com.snow.system.service.impl.SysOaLeaveServiceImpl; import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.ExecutionListener; -import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.variable.api.persistence.entity.VariableInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Map; - /** * @program: snow * @description 开始监听器 @@ -26,36 +18,21 @@ import java.util.Map; **/ @Service @Slf4j -public class LeaveStartListener extends CommonEventListener implements ExecutionListener { +public class LeaveStartListener extends AbstractExecutionListener { @Autowired private SysOaLeaveServiceImpl sysOaLeaveService; - @Autowired - private FlowableService flowableService; + protected void process() { - public void notify(DelegateExecution delegateExecution) { - Map variables = delegateExecution.getVariables(); - VariableInstance variableInstance = delegateExecution.getVariableInstance(delegateExecution.getProcessInstanceId()); - String leaveNo = String.valueOf(variables.get("leaveNo")); - String startUserId = String.valueOf(variables.get("startUserId")); - AppForm appForm=new AppForm(); - appForm.setBusinessKey(leaveNo); - appForm.setProcessInstanceId(delegateExecution.getProcessInstanceId()); - appForm.setStartUserId(startUserId); - threadLocalAppForm.set(appForm); - + String processInstanceId = getProcessInstanceId(); + String businessKey= getBusinessKey(); SysOaLeave sysOaLeave=new SysOaLeave(); sysOaLeave.setProcessStatus(ProcessStatus.CHECKING.ordinal()); - sysOaLeave.setApplyPerson(appForm.getStartUserId()); - sysOaLeave.setProcessInstanceId(appForm.getProcessInstanceId()); - sysOaLeave.setLeaveNo(appForm.getBusinessKey()); + sysOaLeave.setApplyPerson(getStartUserName()); + sysOaLeave.setProcessInstanceId(processInstanceId); + sysOaLeave.setLeaveNo(businessKey); sysOaLeaveService.updateSysOaLeaveByLeaveNo(sysOaLeave); } - - public void setAppForms(String processInstanceId){ - - } - } diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartTaskListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartTaskListener.java new file mode 100644 index 0000000..dbee505 --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/LeaveStartTaskListener.java @@ -0,0 +1,41 @@ +package com.snow.flowable.listener.leave; + +import com.snow.common.enums.ProcessStatus; +import com.snow.flowable.listener.AbstractTaskListener; +import com.snow.system.domain.SysOaLeave; +import com.snow.system.service.ISysOaLeaveService; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @program: snow + * @description + * @author: 没用的阿吉 + * @create: 2020-12-06 12:01 + **/ +@Service("leaveStartTaskListener") +@Slf4j +public class LeaveStartTaskListener extends AbstractTaskListener { + + @Autowired + private ISysOaLeaveService sysOaLeaveService; + + @Override + protected void processTask() { + SysOaLeave sysOaLeave=new SysOaLeave(); + Boolean approvalResult = getApprovalResult(); + String businessKey = getBusinessKey(); + sysOaLeave.setLeaveNo(businessKey); + if(!approvalResult){ + sysOaLeave.setProcessStatus(ProcessStatus.CANCEL.ordinal()); + }else { + sysOaLeave.setProcessStatus(ProcessStatus.CHECKING.ordinal()); + } + sysOaLeaveService.updateSysOaLeaveByLeaveNo(sysOaLeave); + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/AppFormService.java b/snow-flowable/src/main/java/com/snow/flowable/service/AppFormService.java new file mode 100644 index 0000000..66a67d1 --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/service/AppFormService.java @@ -0,0 +1,14 @@ +package com.snow.flowable.service; + +import com.snow.flowable.domain.AppForm; + +/** + * @author qimingjin + * @Title: + * @Description: + * @date 2020/12/7 10:19 + */ +public interface AppFormService { + A getAppFrom(String classInfoJson,String className); + A getAppFrom(String classInfoJson,Class className); +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java b/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java index 8fb0107..eb2ab64 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java +++ b/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java @@ -75,6 +75,13 @@ public interface FlowableService { */ ProcessInstance startProcessInstanceByKey(StartProcessDTO startProcessDTO); + /** + * APP开启流程 + * @param appForm + * @return + */ + ProcessInstance startProcessInstanceByAppForm(AppForm appForm); + /** * 根据任务ID获取代办 * @param taskId diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/impl/AppFormServiceImpl.java b/snow-flowable/src/main/java/com/snow/flowable/service/impl/AppFormServiceImpl.java new file mode 100644 index 0000000..e54afb9 --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/service/impl/AppFormServiceImpl.java @@ -0,0 +1,44 @@ +package com.snow.flowable.service.impl; + +import com.alibaba.fastjson.JSON; + +import com.snow.flowable.domain.AppForm; +import com.snow.flowable.service.AppFormService; +import com.snow.system.domain.SysOaLeave; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author qimingjin + * @Title: + * @Description: + * @date 2020/12/7 10:20 + */ +@Service +@Slf4j +public class AppFormServiceImpl implements AppFormService { + + @Override + public A getAppFrom(String classInfoJson,String className) { + return JSON.parseObject(classInfoJson, getFormClass(className)); + } + + @Override + public A getAppFrom(String classInfoJson,Class className) { + return JSON.parseObject(classInfoJson, className); + } + + private Class getFormClass(String className) { + try { + return (Class) Class.forName(className); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) throws Exception{ + Class sysOaLeaveClass = SysOaLeave.class; + Class sysOaLeaveForm = Class.forName("com.snow.flowable.domain.leave.SysOaLeaveForm"); + System.out.println(sysOaLeaveForm); + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java b/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java index 8638952..b6dbd7b 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java +++ b/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java @@ -1,10 +1,10 @@ package com.snow.flowable.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.BetweenFormater; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.Lists; @@ -12,7 +12,7 @@ import com.google.common.collect.Maps; import com.snow.common.core.page.PageModel; import com.snow.common.core.text.Convert; import com.snow.common.exception.BusinessException; -import com.snow.flowable.common.FlowConstants; +import com.snow.flowable.common.constants.FlowConstants; import com.snow.flowable.domain.*; import com.snow.flowable.enums.FlowFinishedStatusEnum; import com.snow.flowable.service.FlowableService; @@ -24,12 +24,10 @@ import com.snow.system.service.ISysRoleService; import com.snow.system.service.impl.SysUserServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.Process; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.util.IoUtil; -import org.flowable.editor.language.json.converter.BpmnJsonConverter; import org.flowable.engine.*; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; @@ -38,16 +36,13 @@ import org.flowable.engine.repository.*; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.task.Attachment; import org.flowable.engine.task.Comment; -import org.flowable.idm.api.User; import org.flowable.image.ProcessDiagramGenerator; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.ui.modeler.domain.Model; -import org.flowable.ui.modeler.repository.ModelRepository; import org.flowable.ui.modeler.service.ModelServiceImpl; -import org.flowable.ui.modeler.serviceapi.ModelService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -272,7 +267,7 @@ public class FlowableServiceImpl implements FlowableService { identityService.setAuthenticatedUserId(startUserId); } Map paramMap =CollectionUtils.isEmpty(startProcessDTO.getVariables())?Maps.newHashMap():startProcessDTO.getVariables(); - paramMap.put("startUserId",startUserId); + paramMap.put(FlowConstants.START_USER_ID,startUserId); if(!CollectionUtils.isEmpty(paramMap)){ processInstance = runtimeService.startProcessInstanceByKey(startProcessDTO.getProcessDefinitionKey(),startProcessDTO.getBusinessKey(),paramMap); @@ -284,7 +279,19 @@ public class FlowableServiceImpl implements FlowableService { return processInstance; } + @Override + public ProcessInstance startProcessInstanceByAppForm(AppForm appForm) { + String startUserId=appForm.getStartUserId(); + //业务参数转成map + Map paramMap = BeanUtil.beanToMap(appForm); + identityService.setAuthenticatedUserId(startUserId); + paramMap.put(FlowConstants.BUS_VAR,appForm.getClassInfoJson()); + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(appForm.getFlowDef().getCode(),appForm.getBusinessKey(),paramMap); + //这个方法最终使用一个ThreadLocal类型的变量进行存储,也就是与当前的线程绑定,所以流程实例启动完毕之后,需要设置为null,防止多线程的时候出问题。 + identityService.setAuthenticatedUserId(null); + return processInstance; + } @Override @@ -389,6 +396,7 @@ public class FlowableServiceImpl implements FlowableService { ); } paramMap.put(CompleteTaskDTO.IS_PASS,completeTaskDTO.getIsPass()); + //claim the task,当任务分配给了某一组人员时,需要该组人员进行抢占。抢到了就将该任务给谁处理,其他人不能处理。认领任务 taskService.claim(task.getId(),completeTaskDTO.getUserId()); taskService.complete(task.getId(),paramMap,true);