From 41c192e28b610cd42216afb5df6f10baa657d52d Mon Sep 17 00:00:00 2001 From: jinqiming <45981669@qq.com> Date: Wed, 9 Dec 2020 18:08:28 +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 | 2 +- .../common/enums/DingTalkListenerType.java | 2 + .../listener/SyncDingTalkInfoFactory.java | 3 + .../dingtalk/listener/WorkRecodeService.java | 32 +++++ .../dingtalk/service/WorkRecodeService.java | 67 +-------- .../service/impl/WorkRecodeServiceImpl.java | 114 +++++++++++++++ snow-flowable/pom.xml | 2 +- .../common/constants/FlowConstants.java | 2 +- .../snow/flowable/config/FlowIdGenerator.java | 63 +++++++++ .../snow/flowable/config/FlowableConfig.java | 2 + .../com/snow/flowable/domain/AppForm.java | 34 ++--- .../listener/AbstractEventListener.java | 27 +++- .../common/SendMessageEventLister.java | 133 +++++++++++++++--- .../listener/leave/LeaveEndListener.java | 12 +- .../leave/ManagerTaskEventListener.java | 4 +- .../service/impl/FlowableServiceImpl.java | 3 +- 16 files changed, 387 insertions(+), 115 deletions(-) create mode 100644 snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeService.java create mode 100644 snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java create mode 100644 snow-flowable/src/main/java/com/snow/flowable/config/FlowIdGenerator.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 1544191..38e681c 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 @@ -170,7 +170,7 @@ public class SysOaLeaveController extends BaseController BeanUtils.copyProperties(sysOaLeave,sysOaLeaveForm); sysOaLeaveForm.setBusinessKey(newSysOaLeave.getLeaveNo()); sysOaLeaveForm.setStartUserId(String.valueOf(sysUser.getUserId())); - sysOaLeaveForm.setClassInfoJson(com.alibaba.fastjson.JSON.toJSONString(newSysOaLeave)); + sysOaLeaveForm.setBusVarJson(com.alibaba.fastjson.JSON.toJSONString(newSysOaLeave)); sysOaLeaveForm.setClassPackName(SysOaLeaveForm.class.getCanonicalName()); ProcessInstance processInstance = flowableService.startProcessInstanceByAppForm(sysOaLeaveForm); //提交 diff --git a/snow-common/src/main/java/com/snow/common/enums/DingTalkListenerType.java b/snow-common/src/main/java/com/snow/common/enums/DingTalkListenerType.java index e0fa31f..3b5b252 100644 --- a/snow-common/src/main/java/com/snow/common/enums/DingTalkListenerType.java +++ b/snow-common/src/main/java/com/snow/common/enums/DingTalkListenerType.java @@ -24,6 +24,8 @@ public enum DingTalkListenerType { CALL_BACK_DELETE(3,10, "回调删除"), CALL_BACK_FAILED_RESULT(23,10, "获取回调失败结果"), + + WORK_RECODE_CREATE(1,20, "创建待办"), ; diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/SyncDingTalkInfoFactory.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/SyncDingTalkInfoFactory.java index a7a02d0..a052964 100644 --- a/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/SyncDingTalkInfoFactory.java +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/SyncDingTalkInfoFactory.java @@ -28,6 +28,9 @@ public class SyncDingTalkInfoFactory { else if(type.equals(DingTalkListenerType.CALL_BACK_REGISTER.getType())){ return new CallBackService(); } + else if(type.equals(DingTalkListenerType.WORK_RECODE_CREATE.getType())){ + return new WorkRecodeService(); + } else { diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeService.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeService.java new file mode 100644 index 0000000..14e89a6 --- /dev/null +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/listener/WorkRecodeService.java @@ -0,0 +1,32 @@ +package com.snow.dingtalk.listener; + +import com.alibaba.fastjson.JSON; +import com.snow.common.enums.DingTalkListenerType; +import com.snow.common.utils.spring.SpringUtils; +import com.snow.dingtalk.model.WorkrecordAddRequest; +import com.snow.dingtalk.service.impl.WorkRecodeServiceImpl; +import com.snow.system.event.SyncEvent; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author qimingjin + * @Title: + * @Description: + * @date 2020/12/9 15:03 + */ +@Component +@Slf4j +public class WorkRecodeService implements ISyncDingTalkInfo { + private WorkRecodeServiceImpl workRecodeService=SpringUtils.getBean(WorkRecodeServiceImpl.class); + @Override + public void syncDingTalkInfoEvent(SyncEvent syncEvent) { + log.info("调用工作通知传入的原始参数:{}"+JSON.toJSONString(syncEvent)); + DingTalkListenerType eventType =(DingTalkListenerType) syncEvent.getT(); + Integer code = eventType.getCode(); + if(code.equals(DingTalkListenerType.WORK_RECODE_CREATE.getCode())){ + WorkrecordAddRequest workrecordAddRequest=(WorkrecordAddRequest)syncEvent.getSource(); + workRecodeService.create(workrecordAddRequest); + } + } +} diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java index 8a7e798..6fa0762 100644 --- a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/WorkRecodeService.java @@ -26,61 +26,21 @@ import org.springframework.stereotype.Service; * @date 2020/9/21 14:28 */ @Service -public class WorkRecodeService extends BaseService { - @Autowired - private ISysConfigService isysConfigService; +public interface WorkRecodeService { /** * 创建工作待办 * @param workrecordAddRequest * @return */ - public String create(WorkrecordAddRequest workrecordAddRequest){ - DingTalkClient client = new DefaultDingTalkClient(BaseConstantUrl.WORK_RECORD_CREATE); - OapiWorkrecordAddRequest req = new OapiWorkrecordAddRequest(); - BeanUtils.copyProperties(workrecordAddRequest,req); - OapiWorkrecordAddResponse rsp = null; - try { - rsp = client.execute(req, getDingTalkToken()); - if (rsp.getErrcode()==0){ - syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_CREATE,rsp.getMessage(),"WorkRecordAddRequest",JSON.toJSONString(req)); - return rsp.getRecordId(); - }else { - syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_CREATE,rsp.getErrmsg(),"WorkRecordAddRequest",JSON.toJSONString(req)); - } - } catch (ApiException e) { - e.printStackTrace(); - syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_CREATE,e.getMessage(),"WorkRecordAddRequest",JSON.toJSONString(req)); - } - return null; - } + String create(WorkrecordAddRequest workrecordAddRequest); /** * 根据用户ID获取待办 * @param workrecordGetbyuseridRequest * @return */ - public OapiWorkrecordGetbyuseridResponse.PageResult getWorkRecordByUserId(WorkrecordGetbyuseridRequest workrecordGetbyuseridRequest){ - DingTalkClient client = new DefaultDingTalkClient(BaseConstantUrl.GET_WORK_RECORD_USER_ID_); - OapiWorkrecordGetbyuseridRequest req = new OapiWorkrecordGetbyuseridRequest(); - req.setUserid(workrecordGetbyuseridRequest.getUserid()); - req.setOffset(workrecordGetbyuseridRequest.getOffset()); - req.setLimit(workrecordGetbyuseridRequest.getLimit()); - req.setStatus(workrecordGetbyuseridRequest.getStatus()); - try { - OapiWorkrecordGetbyuseridResponse rsp = client.execute(req, getDingTalkToken()); - if(rsp.getErrcode()==0){ - syncDingTalkErrorOperLog(BaseConstantUrl.GET_WORK_RECORD_USER_ID_,rsp.getMessage(),"WorkrecordGetbyuseridRequest",JSON.toJSONString(req)); - return rsp.getRecords(); - }else { - syncDingTalkErrorOperLog(BaseConstantUrl.GET_WORK_RECORD_USER_ID_,rsp.getErrmsg(),"WorkrecordGetbyuseridRequest",JSON.toJSONString(req)); - } - } catch (ApiException e) { - e.printStackTrace(); - syncDingTalkErrorOperLog(BaseConstantUrl.GET_WORK_RECORD_USER_ID_,e.getMessage(),"WorkrecordGetbyuseridRequest",JSON.toJSONString(req)); - } - return null; - } + OapiWorkrecordGetbyuseridResponse.PageResult getWorkRecordByUserId(WorkrecordGetbyuseridRequest workrecordGetbyuseridRequest); /** * 更新待办 @@ -88,24 +48,5 @@ public class WorkRecodeService extends BaseService { * @param recordId * @return */ - public Boolean update(String userId,String recordId){ - DingTalkClient client = new DefaultDingTalkClient(BaseConstantUrl.WORK_RECORD_UPDATE); - OapiWorkrecordUpdateRequest req = new OapiWorkrecordUpdateRequest(); - req.setUserid(userId); - req.setRecordId(recordId); - OapiWorkrecordUpdateResponse rsp = null; - try { - rsp = client.execute(req, getDingTalkToken()); - if(rsp.getErrcode()==0){ - syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_UPDATE,rsp.getMessage(),"WorkrecordUpdateRequest",JSON.toJSONString(req)); - return rsp.getResult(); - }else { - syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_UPDATE,rsp.getErrmsg(),"WorkrecordUpdateRequest",JSON.toJSONString(req)); - } - } catch (ApiException e) { - e.printStackTrace(); - syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_UPDATE,e.getMessage(),"WorkrecordUpdateRequest",JSON.toJSONString(req)); - } - return false; - } + Boolean update(String userId,String recordId); } diff --git a/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java new file mode 100644 index 0000000..7f975fb --- /dev/null +++ b/snow-dingtalk/src/main/java/com/snow/dingtalk/service/impl/WorkRecodeServiceImpl.java @@ -0,0 +1,114 @@ +package com.snow.dingtalk.service.impl; + +import com.alibaba.fastjson.JSON; +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.OapiWorkrecordAddRequest; +import com.dingtalk.api.request.OapiWorkrecordGetbyuseridRequest; +import com.dingtalk.api.request.OapiWorkrecordUpdateRequest; +import com.dingtalk.api.response.OapiWorkrecordAddResponse; +import com.dingtalk.api.response.OapiWorkrecordGetbyuseridResponse; +import com.dingtalk.api.response.OapiWorkrecordUpdateResponse; +import com.snow.common.annotation.SyncLog; +import com.snow.common.enums.DingTalkListenerType; +import com.snow.common.exception.SyncDataException; +import com.snow.dingtalk.common.BaseConstantUrl; +import com.snow.dingtalk.common.BaseService; +import com.snow.dingtalk.model.WorkrecordAddRequest; +import com.snow.dingtalk.model.WorkrecordGetbyuseridRequest; +import com.snow.system.service.ISysConfigService; +import com.taobao.api.ApiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author qimingjin + * @Title: 待办事项 + * @Description: + * @date 2020/12/9 14:53 + */ +@Slf4j +@Service +public class WorkRecodeServiceImpl extends BaseService { + + /** + * 创建工作待办 + * @param workrecordAddRequest + * @return + */ + @SyncLog(dingTalkListenerType = DingTalkListenerType.WORK_RECODE_CREATE,dingTalkUrl=BaseConstantUrl.WORK_RECORD_CREATE) + public String create(WorkrecordAddRequest workrecordAddRequest){ + DingTalkClient client = new DefaultDingTalkClient(BaseConstantUrl.WORK_RECORD_CREATE); + OapiWorkrecordAddRequest req = new OapiWorkrecordAddRequest(); + BeanUtils.copyProperties(workrecordAddRequest,req); + OapiWorkrecordAddResponse rsp = null; + try { + rsp = client.execute(req, getDingTalkToken()); + if (rsp.getErrcode()==0) { + return rsp.getRecordId(); + }else { + throw new SyncDataException(JSON.toJSONString(req),rsp.getErrmsg()); + } + } catch (ApiException e) { + log.error("钉钉workRecordAddRequest异常:{}",e.getErrMsg()); + throw new SyncDataException(JSON.toJSONString(req),e.getErrMsg()); + } + + } + + /** + * 根据用户ID获取待办 + * @param workrecordGetbyuseridRequest + * @return + */ + public OapiWorkrecordGetbyuseridResponse.PageResult getWorkRecordByUserId(WorkrecordGetbyuseridRequest workrecordGetbyuseridRequest){ + DingTalkClient client = new DefaultDingTalkClient(BaseConstantUrl.GET_WORK_RECORD_USER_ID_); + OapiWorkrecordGetbyuseridRequest req = new OapiWorkrecordGetbyuseridRequest(); + req.setUserid(workrecordGetbyuseridRequest.getUserid()); + req.setOffset(workrecordGetbyuseridRequest.getOffset()); + req.setLimit(workrecordGetbyuseridRequest.getLimit()); + req.setStatus(workrecordGetbyuseridRequest.getStatus()); + try { + OapiWorkrecordGetbyuseridResponse rsp = client.execute(req, getDingTalkToken()); + if(rsp.getErrcode()==0){ + syncDingTalkErrorOperLog(BaseConstantUrl.GET_WORK_RECORD_USER_ID_,rsp.getMessage(),"WorkrecordGetbyuseridRequest",JSON.toJSONString(req)); + return rsp.getRecords(); + }else { + syncDingTalkErrorOperLog(BaseConstantUrl.GET_WORK_RECORD_USER_ID_,rsp.getErrmsg(),"WorkrecordGetbyuseridRequest",JSON.toJSONString(req)); + } + } catch (ApiException e) { + e.printStackTrace(); + syncDingTalkErrorOperLog(BaseConstantUrl.GET_WORK_RECORD_USER_ID_,e.getMessage(),"WorkrecordGetbyuseridRequest",JSON.toJSONString(req)); + } + return null; + } + + /** + * 更新待办 + * @param userId + * @param recordId + * @return + */ + public Boolean update(String userId,String recordId){ + DingTalkClient client = new DefaultDingTalkClient(BaseConstantUrl.WORK_RECORD_UPDATE); + OapiWorkrecordUpdateRequest req = new OapiWorkrecordUpdateRequest(); + req.setUserid(userId); + req.setRecordId(recordId); + OapiWorkrecordUpdateResponse rsp = null; + try { + rsp = client.execute(req, getDingTalkToken()); + if(rsp.getErrcode()==0){ + syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_UPDATE,rsp.getMessage(),"WorkrecordUpdateRequest",JSON.toJSONString(req)); + return rsp.getResult(); + }else { + syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_UPDATE,rsp.getErrmsg(),"WorkrecordUpdateRequest",JSON.toJSONString(req)); + } + } catch (ApiException e) { + e.printStackTrace(); + syncDingTalkErrorOperLog(BaseConstantUrl.WORK_RECORD_UPDATE,e.getMessage(),"WorkrecordUpdateRequest",JSON.toJSONString(req)); + } + return false; + } +} diff --git a/snow-flowable/pom.xml b/snow-flowable/pom.xml index 12afb0d..b6c9bb2 100644 --- a/snow-flowable/pom.xml +++ b/snow-flowable/pom.xml @@ -15,7 +15,7 @@ com.snow - snow-framework + snow-dingtalk 4.3.1 diff --git a/snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java b/snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java index 55135f8..562e5c4 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java +++ b/snow-flowable/src/main/java/com/snow/flowable/common/constants/FlowConstants.java @@ -31,7 +31,7 @@ public class FlowConstants { /** * 业务参数常量 */ - public static final String BUS_VAR="bus_var"; + public static final String BUS_VAR="bus_var_json"; /** * 当前类的包名 */ diff --git a/snow-flowable/src/main/java/com/snow/flowable/config/FlowIdGenerator.java b/snow-flowable/src/main/java/com/snow/flowable/config/FlowIdGenerator.java new file mode 100644 index 0000000..913612f --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/config/FlowIdGenerator.java @@ -0,0 +1,63 @@ +package com.snow.flowable.config; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.thread.ConcurrencyTester; +import cn.hutool.core.thread.ExecutorBuilder; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.IdUtil; +import org.flowable.common.engine.impl.cfg.IdGenerator; + +import cn.hutool.core.lang.Console; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @author qimingjin + * @Title: 修改flowAble id 生成器 + * @Description: + * @date 2020/12/9 14:01 + */ +public class FlowIdGenerator implements IdGenerator { + + @Override + public synchronized String getNextId() { + Snowflake snowflake = IdUtil.getSnowflake(2, 1); + long id = snowflake.nextId(); + return String.valueOf(id); + } + + //很多时候,我们需要简单模拟N个线程调用某个业务测试其并发状况,于是Hutool提供了一个简单的并发测试类——ConcurrencyTester。 + public static void main(String[] args) { + + ThreadPoolExecutor executor = ExecutorBuilder.create(). + setCorePoolSize(5). + setMaxPoolSize(10). + setWorkQueue(new LinkedBlockingQueue<>(100)) + .build(); + executor.execute(new Runnable() { + @Override + public void run() { + for (int i = 0; i < 10000; i++) { + Snowflake snowflake = IdUtil.getSnowflake(2, 1); + long id = snowflake.nextId(); + ThreadUtil.sleep(1000); + Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), id); + } + } + }); + executor.shutdown(); + + /* ConcurrencyTester tester = ThreadUtil.concurrencyTest(100, () -> { + // 测试的逻辑内容 + Snowflake snowflake = IdUtil.getSnowflake(2, 1); + long id = snowflake.nextId(); + // ThreadUtil.sleep(1); + Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), id); + }); + + // 获取总的执行时间,单位毫秒 + Console.log(tester.getInterval());*/ + + } +} diff --git a/snow-flowable/src/main/java/com/snow/flowable/config/FlowableConfig.java b/snow-flowable/src/main/java/com/snow/flowable/config/FlowableConfig.java index a359c76..7369545 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/config/FlowableConfig.java +++ b/snow-flowable/src/main/java/com/snow/flowable/config/FlowableConfig.java @@ -36,6 +36,8 @@ public class FlowableConfig { configuration.setTransactionManager(transactionManager); configuration.setDatabaseSchemaUpdate("false"); configuration.setAsyncExecutorActivate(true); + //修改id生成器 + configuration.setIdGenerator(new FlowIdGenerator()); configuration.setCustomPostDeployers(new ArrayList(){ private static final long serialVersionUID = 4041439225480991716L; { 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 0e8d33a..f17a5c4 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 @@ -2,11 +2,9 @@ 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 @@ -24,6 +22,23 @@ public abstract class AppForm implements Serializable { private String startUserId; + /** + * 业务参数 + */ + @NotBlank(message = "业务参数不能为空") + private String businessKey; + + /** + * 业务数据json + */ + private String busVarJson; + /** + * 当前类的包名称 + */ + @NotBlank(message = "当前类的包名称不能为空") + private String classPackName; + + /** * 流程申请单需实现此方法,返回申请单对应的流程定义. * 一个流程对应一个申请单.(暂时) @@ -32,19 +47,4 @@ public abstract class AppForm implements Serializable { */ 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/listener/AbstractEventListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractEventListener.java index 5e550eb..4fb3cb8 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractEventListener.java +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/AbstractEventListener.java @@ -9,6 +9,7 @@ import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.event.*; import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.task.service.delegate.DelegateTask; import org.flowable.variable.api.event.FlowableVariableEvent; import org.springframework.stereotype.Service; @@ -71,7 +72,6 @@ import java.util.Set; @Slf4j @Service public abstract class AbstractEventListener extends AbstractFlowableEventListener { - /** * 需要监听的类型集合 */ @@ -82,6 +82,7 @@ public abstract class AbstractEventListener extends AbstractFlowableEventListen */ protected Set flowDefEnums; + public AbstractEventListener() {} public AbstractEventListener(Set types,Set flowDefEnums) { @@ -258,16 +259,17 @@ public abstract class AbstractEventListener extends AbstractFlowableEventListen //在流程中存在的才监听 if(flowDefEnum.getCode().equals(key)){ initEngineEventType(flowableEngineEvent); - execute(); + //会监听多次 + execute(flowableEngineEvent); } } } } - protected void execute() { + protected void execute(FlowableEngineEvent flowableEngineEvent) { try { - process(); + process(flowableEngineEvent); } catch (RuntimeException e) { log.error("执行监听异常", e); throw e; @@ -277,7 +279,7 @@ public abstract class AbstractEventListener extends AbstractFlowableEventListen /** * 抽象需要执行的程序类 */ - protected abstract void process(); + protected abstract void process(FlowableEngineEvent flowableEngineEvent); @@ -412,6 +414,21 @@ public abstract class AbstractEventListener extends AbstractFlowableEventListen } return null; } + + /** + * 获取流程执行信息 + * @param executionId + * @return + */ + protected DelegateExecution getExecutionById(String executionId) { + if (executionId != null) { + CommandContext commandContext = CommandContextUtil.getCommandContext(); + if (commandContext != null) { + return CommandContextUtil.getExecutionEntityManager(commandContext).findById(executionId); + } + } + return null; + } @Override public boolean isFireOnTransactionLifecycleEvent() { return false; diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java b/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java index e7f1f96..8764408 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/common/SendMessageEventLister.java @@ -1,21 +1,40 @@ package com.snow.flowable.listener.common; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.ExecutorBuilder; import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import com.snow.common.enums.DingTalkListenerType; +import com.snow.dingtalk.model.WorkrecordAddRequest; +import com.snow.flowable.common.SpringContextUtil; import com.snow.flowable.common.enums.FlowDefEnum; import com.snow.flowable.listener.AbstractEventListener; +import com.snow.flowable.service.FlowableService; +import com.snow.system.domain.SysUser; +import com.snow.system.event.SyncEvent; +import com.snow.system.mapper.SysUserMapper; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEvent; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; -import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.ProcessInstance; import org.flowable.identitylink.api.IdentityLink; import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import javax.annotation.Resource; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; /** * @author qimingjin @@ -27,6 +46,9 @@ import java.util.Set; @Service public class SendMessageEventLister extends AbstractEventListener { + @Resource + private ApplicationContext applicationContext; + public SendMessageEventLister() { super( new HashSet<>(Arrays.asList( @@ -38,33 +60,106 @@ public class SendMessageEventLister extends AbstractEventListener { } @Override - protected void process() { - + protected void process(FlowableEngineEvent flowableEngineEvent) { + DelegateExecution execution = getExecution(flowableEngineEvent); + log.info("process========>{}",JSON.toJSONString(execution)); } + + @Override protected void taskCreated(FlowableEngineEntityEvent event) { - TaskEntity entity = (TaskEntity)event.getEntity(); - ProcessDefinitionEntity processDefinition = getProcessDefinition(event); - //根据任务ID获取任务获选人人 - Set candidates = entity.getCandidates(); - if(!CollectionUtils.isEmpty(candidates)){ - candidates.forEach(t->{ - String userId = t.getUserId(); - String groupId = t.getGroupId(); - if(!StringUtils.isEmpty(userId)){ - sendMessage(); - } else if(!StringUtils.isEmpty(groupId)) { - sendMessage(); - } - }); - } //任务创建可发送短信,邮件通知接收人 log.info("ManagerTaskEventListener----taskCreated任务创建监听:{}",JSON.toJSONString(event)); + sendDingTalkMessage(event); } - public void sendMessage(){ + /** + * 发送钉钉工作通知消息 + * @param event + */ + public void sendDingTalkMessage(FlowableEngineEntityEvent event){ + SysUserMapper sysUserMapper = (SysUserMapper)SpringContextUtil.getBean(SysUserMapper.class); + ThreadPoolExecutor executor = ExecutorBuilder.create().setCorePoolSize(5) + .setMaxPoolSize(10) + .setWorkQueue(new LinkedBlockingQueue<>(100)) + .build(); + executor.execute(new Runnable() { + @Override + public void run() { + //根据任务ID获取任务获选人人 + TaskEntity entity = (TaskEntity)event.getEntity(); + Set candidates = entity.getCandidates(); + if(!CollectionUtils.isEmpty(candidates)){ + candidates.forEach(t->{ + String userId = t.getUserId(); + String groupId = t.getGroupId(); + if(!StringUtils.isEmpty(userId)){ + WorkrecordAddRequest workrecordAddRequest = initWorkRecordAddRequest(userId, event); + SyncEvent syncEventGroup = new SyncEvent(workrecordAddRequest, DingTalkListenerType.WORK_RECODE_CREATE); + applicationContext.publishEvent(syncEventGroup); + } + else if(!StringUtils.isEmpty(groupId)) { + List sysUsers = sysUserMapper.selectUserListByRoleId(groupId); + sysUsers.forEach(sysUser->{ + WorkrecordAddRequest workrecordAddRequest = initWorkRecordAddRequest(String.valueOf(sysUser.getUserId()), event); + SyncEvent syncEventGroup = new SyncEvent(workrecordAddRequest, DingTalkListenerType.WORK_RECODE_CREATE); + applicationContext.publishEvent(syncEventGroup); + }); + }else { + log.warn("ManagerTaskEventListener----taskCreated任务创建监听 userId和groupId is all null"); + } + }); + } + } + }); + executor.shutdown(); } + /** + * 组装参数 + * @param userId + * @param event + * @return + */ + public WorkrecordAddRequest initWorkRecordAddRequest(String userId,FlowableEngineEntityEvent event){ + FlowableService flowableService = (FlowableService)SpringContextUtil.getBean(FlowableService.class); + ProcessInstance processInstance = flowableService.getProcessInstanceById(event.getProcessInstanceId()); + TaskEntity entity = (TaskEntity)event.getEntity(); + ProcessDefinition processDefinition = getProcessDefinition(event.getProcessDefinitionId()); + WorkrecordAddRequest workrecordAddRequest=new WorkrecordAddRequest(); + workrecordAddRequest.setUserid(userId); + workrecordAddRequest.setBizId(processInstance.getBusinessKey()); + workrecordAddRequest.setUrl(entity.getFormKey()); + workrecordAddRequest.setPcUrl(entity.getFormKey()); + workrecordAddRequest.setSourceName("DING-FLOW"); + workrecordAddRequest.setPcOpenType(2L); + workrecordAddRequest.setTitle(entity.getName()); + workrecordAddRequest.setCreateTime(entity.getCreateTime().getTime()); + List formItemList=Lists.newArrayList(); + WorkrecordAddRequest.FormItemVo formItemVo = new WorkrecordAddRequest.FormItemVo(); + formItemVo.setTitle("流程名称:"); + formItemVo.setContent(processDefinition.getName()); + formItemList.add(formItemVo); + WorkrecordAddRequest.FormItemVo formItemVo1 = new WorkrecordAddRequest.FormItemVo(); + formItemVo1.setTitle("创建时间:"); + formItemVo1.setContent(DateUtil.format(entity.getCreateTime(),"yyyy-MM-dd HH:mm:ss")); + formItemList.add(formItemVo1); + WorkrecordAddRequest.FormItemVo formItemVo2 = new WorkrecordAddRequest.FormItemVo(); + formItemVo2.setTitle("发起人:"); + formItemVo2.setContent(processInstance.getStartUserId()); + formItemList.add(formItemVo2); + workrecordAddRequest.setFormItemList(formItemList); + return workrecordAddRequest; + } + + protected ProcessDefinition getProcessDefinition(String processDefinitionId) { + RepositoryService repositoryService = (RepositoryService)SpringContextUtil.getBean(RepositoryService.class); + return repositoryService.createProcessDefinitionQuery() + .processDefinitionId(processDefinitionId) + .singleResult(); + } + + } 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 3cf6f5a..8564df4 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 @@ -28,15 +28,15 @@ public class LeaveEndListener extends AbstractExecutionListener SysOaLeaveForm appForms = getAppForms(); log.info("获取到的表单数据:{}",JSON.toJSONString(appForms)); Boolean isPass = getVariable(FlowConstants.IS_PASS); + String businessKey= getBusinessKey(); + SysOaLeave sysOaLeave=new SysOaLeave(); + sysOaLeave.setLeaveNo(businessKey); if(isPass){ - String businessKey= getBusinessKey(); - SysOaLeave sysOaLeave=new SysOaLeave(); sysOaLeave.setProcessStatus(ProcessStatus.PASS.ordinal()); - sysOaLeave.setLeaveNo(businessKey); - sysOaLeaveService.updateSysOaLeaveByLeaveNo(sysOaLeave); }else { - log.info("上个节点的审批结果:{}",isPass); + log.info("说明是重新申请取消的节点,上个节点的审批结果:{}",isPass); + sysOaLeave.setProcessStatus(ProcessStatus.CANCEL.ordinal()); } - + sysOaLeaveService.updateSysOaLeaveByLeaveNo(sysOaLeave); } } diff --git a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/ManagerTaskEventListener.java b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/ManagerTaskEventListener.java index 108cc14..9670181 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/listener/leave/ManagerTaskEventListener.java +++ b/snow-flowable/src/main/java/com/snow/flowable/listener/leave/ManagerTaskEventListener.java @@ -10,6 +10,7 @@ import com.snow.system.domain.SysOaLeave; import com.snow.system.service.impl.SysOaLeaveServiceImpl; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEvent; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity; @@ -43,11 +44,12 @@ public class ManagerTaskEventListener extends AbstractEventListener { } @Override - protected void process() { + protected void process(FlowableEngineEvent flowableEngineEvent) { } + @Override protected void taskAssigned(FlowableEngineEntityEvent event) { 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 b6dbd7b..bc88f12 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 @@ -284,8 +284,9 @@ public class FlowableServiceImpl implements FlowableService { String startUserId=appForm.getStartUserId(); //业务参数转成map Map paramMap = BeanUtil.beanToMap(appForm); + paramMap.remove("busVarJson"); identityService.setAuthenticatedUserId(startUserId); - paramMap.put(FlowConstants.BUS_VAR,appForm.getClassInfoJson()); + paramMap.put(FlowConstants.BUS_VAR,appForm.getBusVarJson()); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(appForm.getFlowDef().getCode(),appForm.getBusinessKey(),paramMap); //这个方法最终使用一个ThreadLocal类型的变量进行存储,也就是与当前的线程绑定,所以流程实例启动完毕之后,需要设置为null,防止多线程的时候出问题。