Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Skyeye云
Skyeye
提交
4561f525
S
Skyeye
项目概览
Skyeye云
/
Skyeye
通知
1283
Star
158
Fork
129
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Skyeye
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
4561f525
编写于
12月 14, 2021
作者:
Skyeye云
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增监听器
上级
1d09d3ac
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
167 addition
and
95 deletion
+167
-95
skyeye-activiti/src/main/java/com/skyeye/activiti/listener/MultiInstanceloopListener.java
...m/skyeye/activiti/listener/MultiInstanceloopListener.java
+26
-0
skyeye-activiti/src/main/java/com/skyeye/activiti/service/ActivitiTaskService.java
...java/com/skyeye/activiti/service/ActivitiTaskService.java
+18
-0
skyeye-activiti/src/main/java/com/skyeye/activiti/service/CounterSignService.java
.../java/com/skyeye/activiti/service/CounterSignService.java
+21
-15
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/ActivitiTaskServiceImpl.java
...skyeye/activiti/service/impl/ActivitiTaskServiceImpl.java
+39
-4
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java
.../skyeye/activiti/service/impl/CounterSignServiceImpl.java
+63
-76
未找到文件。
skyeye-activiti/src/main/java/com/skyeye/activiti/listener/MultiInstanceloopListener.java
0 → 100644
浏览文件 @
4561f525
/*******************************************************************************
* Copyright 卫志强 QQ:598748873@qq.com Inc. All rights reserved. 开源地址:https://gitee.com/doc_wei01/skyeye
******************************************************************************/
package
com.skyeye.activiti.listener
;
import
com.gexin.fastjson.JSON
;
import
org.activiti.engine.delegate.DelegateExecution
;
import
org.activiti.engine.delegate.ExecutionListener
;
/**
* @ClassName: MultiInstanceloopListener
* @Description:
* @author: skyeye云系列--卫志强
* @date: 2021/12/14 22:37
* @Copyright: 2021 https://gitee.com/doc_wei01/skyeye Inc. All rights reserved.
* 注意:本内容仅限购买后使用.禁止私自外泄以及用于其他的商业目的
*/
public
class
MultiInstanceloopListener
implements
ExecutionListener
{
@Override
public
void
notify
(
DelegateExecution
execution
)
throws
Exception
{
System
.
out
.
println
(
JSON
.
toJSONString
(
execution
));
}
}
skyeye-activiti/src/main/java/com/skyeye/activiti/service/ActivitiTaskService.java
浏览文件 @
4561f525
...
...
@@ -6,6 +6,8 @@ package com.skyeye.activiti.service;
import
com.skyeye.common.object.InputObject
;
import
com.skyeye.common.object.OutputObject
;
import
org.activiti.bpmn.model.UserTask
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
java.util.Map
;
...
...
@@ -47,4 +49,20 @@ public interface ActivitiTaskService {
void
setNextUserTaskApproval
(
String
processInstanceId
,
String
approverId
);
/**
* 根据taskId获取UserTask对象
*
* @param taskId 任务id
* @return UserTask对象
*/
UserTask
getCurrentUserTaskByTaskId
(
String
taskId
);
/**
* 根据流程id获取当前节点信息
*
* @param processInstanceId 流程id
* @return 当前节点信息
*/
ActivityImpl
getCurrentActivityNode
(
String
processInstanceId
);
}
skyeye-activiti/src/main/java/com/skyeye/activiti/service/CounterSignService.java
浏览文件 @
4561f525
...
...
@@ -7,9 +7,11 @@ package com.skyeye.activiti.service;
import
com.skyeye.common.object.InputObject
;
import
com.skyeye.common.object.OutputObject
;
import
org.activiti.bpmn.model.MultiInstanceLoopCharacteristics
;
import
org.activiti.bpmn.model.UserTask
;
import
org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
java.util.
Map
;
import
java.util.
List
;
/**
* @ClassName: CounterSignService
...
...
@@ -51,39 +53,43 @@ public interface CounterSignService {
/**
* 创建 多实例 行为解释器
*
* @param processInstanceId
* @param sequential
* @param currentTask 当前任务节点
* @param activityImpl 流程节点信息
* @param sequential 是否串行
* @return
*/
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
String
processInstanceId
,
boolean
sequential
);
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
UserTask
currentTask
,
ActivityImpl
activityImpl
,
boolean
sequential
);
/**
* 创建多实例行为解释器
*
* @param processInstanceId 流程id
* @param currentTask 当前任务节点
* @param activityImpl 流程节点信息
* @param sequential 是否串行
* @param assigneeListExp 用户组表达
* @param assigneeExp 用户标识
* @return
*/
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
String
processInstanceId
,
boolean
sequential
,
String
assigneeListExp
,
String
assigneeExp
);
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
UserTask
currentTask
,
ActivityImpl
activityImpl
,
boolean
sequential
,
String
assigneeListExp
,
String
assigneeExp
);
/**
* 将 普通节点转换成为会签 任务
*
* @param taskId
* @param sequential
* @param
data
* @param taskId
任务id
* @param sequential
是否串行
* @param
userIds 用户id
*/
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
Map
<
String
,
Object
>
data
);
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
List
<
String
>
userIds
);
/**
* 将 普通节点转换成为会签 任务
* @param taskId
* @param sequential
* 将 普通节点转换成为会签 任务
*
* @param taskId 任务id
* @param sequential 是否串行
* @param assigneeExp 任务执行人表达式
* @param
data
* @param
userIds 用户id
*/
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
String
assigneeExp
,
Map
<
String
,
Object
>
data
);
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
String
assigneeExp
,
List
<
String
>
userIds
);
}
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/ActivitiTaskServiceImpl.java
浏览文件 @
4561f525
...
...
@@ -22,13 +22,19 @@ import com.skyeye.eve.dao.ActModleTypeDao;
import
com.skyeye.eve.dao.ActUserProcessInstanceIdDao
;
import
com.skyeye.eve.dao.SysEveUserDao
;
import
com.skyeye.exception.CustomException
;
import
com.skyeye.jedis.JedisClientService
;
import
org.activiti.bpmn.model.BpmnModel
;
import
org.activiti.bpmn.model.UserTask
;
import
org.activiti.engine.HistoryService
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.RuntimeService
;
import
org.activiti.engine.TaskService
;
import
org.activiti.engine.history.HistoricProcessInstance
;
import
org.activiti.engine.history.HistoricTaskInstance
;
import
org.activiti.engine.history.HistoricVariableInstance
;
import
org.activiti.engine.impl.RepositoryServiceImpl
;
import
org.activiti.engine.impl.persistence.entity.ExecutionEntity
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.runtime.ProcessInstance
;
import
org.activiti.engine.task.Task
;
import
org.activiti.engine.task.TaskQuery
;
...
...
@@ -59,9 +65,6 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
@Autowired
private
TaskService
taskService
;
@Autowired
public
JedisClientService
jedisClient
;
@Autowired
private
RuntimeService
runtimeService
;
...
...
@@ -86,6 +89,9 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
@Autowired
private
RedisCache
redisCache
;
@Autowired
protected
RepositoryService
repositoryService
;
/**
* @Title: queryUserAgencyTasksListByUserId
* @Description: 获取用户待办任务
...
...
@@ -719,4 +725,33 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
}
}
public
UserTask
getCurrentUserTaskByTaskId
(
String
taskId
){
Task
task
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
BpmnModel
bpmnModel
=
repositoryService
.
getBpmnModel
(
task
.
getProcessDefinitionId
());
org
.
activiti
.
bpmn
.
model
.
Process
process
=
bpmnModel
.
getProcesses
().
get
(
0
);
// 当前节点
UserTask
currentUserTask
=
(
UserTask
)
process
.
getFlowElement
(
task
.
getTaskDefinitionKey
());
return
currentUserTask
;
}
public
ActivityImpl
getCurrentActivityNode
(
String
processInstanceId
){
// 获取流程发布Id信息
String
definitionId
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
().
getProcessDefinitionId
();
ProcessDefinitionEntity
processDefinitionEntity
=
(
ProcessDefinitionEntity
)
((
RepositoryServiceImpl
)
repositoryService
).
getDeployedProcessDefinition
(
definitionId
);
ExecutionEntity
execution
=
(
ExecutionEntity
)
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
();
// 当前流程节点Id信息
String
activitiId
=
execution
.
getActivityId
();
// 获取流程所有节点信息
List
<
ActivityImpl
>
activitiList
=
processDefinitionEntity
.
getActivities
();
// 遍历所有节点信息
for
(
ActivityImpl
activityImpl
:
activitiList
)
{
String
id
=
activityImpl
.
getId
();
if
(
activitiId
.
equals
(
id
))
{
return
activityImpl
;
}
}
return
null
;
}
}
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java
浏览文件 @
4561f525
...
...
@@ -4,33 +4,34 @@
package
com.skyeye.activiti.service.impl
;
import
com.skyeye.activiti.service.CounterSignService
;
import
com.skyeye.common.constans.ActivitiConstants
;
import
com.skyeye.common.object.InputObject
;
import
com.skyeye.common.object.OutputObject
;
import
org.activiti.bpmn.model.BpmnModel
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Map
;
import
org.activiti.bpmn.model.MultiInstanceLoopCharacteristics
;
import
org.activiti.bpmn.model.UserTask
;
import
org.activiti.engine.ProcessEngine
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.RuntimeService
;
import
org.activiti.engine.TaskService
;
import
org.activiti.engine.impl.RepositoryServiceImpl
;
import
org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior
;
import
org.activiti.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior
;
import
org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior
;
import
org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior
;
import
org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl
;
import
org.activiti.engine.impl.el.ExpressionManager
;
import
org.activiti.engine.impl.persistence.entity.ExecutionEntity
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.task.Task
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Map
;
import
com.skyeye.activiti.listener.MultiInstanceloopListener
;
import
com.skyeye.activiti.service.ActivitiTaskService
;
import
com.skyeye.activiti.service.CounterSignService
;
import
com.skyeye.common.constans.ActivitiConstants
;
import
com.skyeye.common.object.InputObject
;
import
com.skyeye.common.object.OutputObject
;
import
net.sf.json.JSONArray
;
/**
* @ClassName: CounterSignServiceImpl
...
...
@@ -44,17 +45,20 @@ import java.util.Map;
public
class
CounterSignServiceImpl
implements
CounterSignService
{
@Autowired
pr
otected
ProcessEngine
processEngine
;
pr
ivate
ProcessEngine
processEngine
;
@Autowired
pr
otected
TaskService
taskService
;
pr
ivate
TaskService
taskService
;
@Autowired
pr
otected
RepositoryService
repositoryService
;
pr
ivate
RepositoryService
repositoryService
;
@Autowired
private
RuntimeService
runtimeService
;
@Autowired
private
ActivitiTaskService
activitiTaskService
;
/**
* 将 普通节点转换成为会签 任务
*
...
...
@@ -65,6 +69,9 @@ public class CounterSignServiceImpl implements CounterSignService {
@Override
public
void
covertToMultiInstance
(
InputObject
inputObject
,
OutputObject
outputObject
)
throws
Exception
{
Map
<
String
,
Object
>
params
=
inputObject
.
getParams
();
String
taskId
=
params
.
get
(
"taskId"
).
toString
();
boolean
sequential
=
Boolean
.
parseBoolean
(
params
.
get
(
"sequential"
).
toString
());
List
<
String
>
userIds
=
JSONArray
.
fromObject
(
params
.
get
(
"userIds"
).
toString
());
}
...
...
@@ -79,9 +86,14 @@ public class CounterSignServiceImpl implements CounterSignService {
@Override
public
MultiInstanceLoopCharacteristics
createMultiInstanceLoopCharacteristics
(
boolean
isSequential
,
String
assigneeListExp
,
String
assignee
)
{
MultiInstanceLoopCharacteristics
multiInstanceLoopCharacteristics
=
new
MultiInstanceLoopCharacteristics
();
// 是否串行
multiInstanceLoopCharacteristics
.
setSequential
(
isSequential
);
// 审批人集合参数
multiInstanceLoopCharacteristics
.
setInputDataItem
(
assigneeListExp
);
// 迭代集合
multiInstanceLoopCharacteristics
.
setElementVariable
(
assignee
);
// 完成条件 已完成数等于实例数${nrOfActiveInstances == nrOfInstances}
multiInstanceLoopCharacteristics
.
setCompletionCondition
(
""
);
return
multiInstanceLoopCharacteristics
;
}
...
...
@@ -99,43 +111,42 @@ public class CounterSignServiceImpl implements CounterSignService {
/**
* 创建 多实例 行为解释器
*
* @param processInstanceId 流程id
* @param sequential
* @param currentTask 当前任务节点
* @param activityImpl 流程节点信息
* @param sequential 是否串行
* @return
*/
@Override
public
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
String
processInstanceId
,
boolean
sequential
)
{
return
createMultiInstanceBehavior
(
processInstanceId
,
sequential
,
ActivitiConstants
.
DEFAULT_ASSIGNEE_LIST_EXP
,
ActivitiConstants
.
ASSIGNEE_USER
);
public
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
UserTask
currentTask
,
ActivityImpl
activityImpl
,
boolean
sequential
)
{
return
createMultiInstanceBehavior
(
currentTask
,
activityImpl
,
sequential
,
ActivitiConstants
.
DEFAULT_ASSIGNEE_LIST_EXP
,
ActivitiConstants
.
ASSIGNEE_USER
);
}
/**
* 创建多实例行为解释器
*
* @param processInstanceId 流程id
* @param sequential 是否串行
* @param assigneeListExp 用户组表达
* @param assigneeExp 用户标识
* @param currentTask 当前任务节点
* @param activityImpl 流程节点信息
* @param sequential 是否串行
* @param assigneeListExp 用户组表达
* @param assigneeExp 用户标识
* @return
*/
@Override
public
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
String
processInstanceId
,
boolean
sequential
,
String
assigneeListExp
,
String
assigneeExp
)
{
ActivityImpl
activityNode
=
this
.
getCurrentActivityNode
(
processInstanceId
);
if
(
activityNode
==
null
){
return
null
;
}
UserTask
currentNode
=
this
.
getCurrentUserTask
(
processInstanceId
);
public
MultiInstanceActivityBehavior
createMultiInstanceBehavior
(
UserTask
currentTask
,
ActivityImpl
activityImpl
,
boolean
sequential
,
String
assigneeListExp
,
String
assigneeExp
)
{
ProcessEngineConfigurationImpl
processEngineConfiguration
=
(
ProcessEngineConfigurationImpl
)
processEngine
.
getProcessEngineConfiguration
();
/**
* 创建解释器
*/
UserTaskActivityBehavior
userTaskActivityBehavior
=
processEngineConfiguration
.
getActivityBehaviorFactory
()
.
createUserTaskActivityBehavior
(
currentNode
,
((
UserTaskActivityBehavior
)
activityNode
.
getActivityBehavior
()).
getTaskDefinition
());
.
createUserTaskActivityBehavior
(
currentTask
,
((
UserTaskActivityBehavior
)
activityImpl
.
getActivityBehavior
()).
getTaskDefinition
());
MultiInstanceActivityBehavior
behavior
=
null
;
if
(
sequential
)
{
behavior
=
new
SequentialMultiInstanceBehavior
(
activity
Node
,
userTaskActivityBehavior
);
behavior
=
new
SequentialMultiInstanceBehavior
(
activity
Impl
,
userTaskActivityBehavior
);
}
else
{
behavior
=
new
ParallelMultiInstanceBehavior
(
activity
Node
,
userTaskActivityBehavior
);
behavior
=
new
ParallelMultiInstanceBehavior
(
activity
Impl
,
userTaskActivityBehavior
);
}
/**
...
...
@@ -152,63 +163,39 @@ public class CounterSignServiceImpl implements CounterSignService {
return
behavior
;
}
private
UserTask
getCurrentUserTask
(
String
processInstanceId
)
{
Task
cueerntTask
=
taskService
.
createTaskQuery
().
processInstanceId
(
processInstanceId
).
singleResult
();
BpmnModel
bpmnModel
=
repositoryService
.
getBpmnModel
(
cueerntTask
.
getProcessDefinitionId
());
org
.
activiti
.
bpmn
.
model
.
Process
process
=
bpmnModel
.
getProcesses
().
get
(
0
);
// 当前节点
UserTask
currentNode
=
(
UserTask
)
process
.
getFlowElement
(
cueerntTask
.
getTaskDefinitionKey
());
return
currentNode
;
}
/**
* 获取当前的activityImpl节点
*
* @param processInstanceId processInstanceId
* @return
*/
private
ActivityImpl
getCurrentActivityNode
(
String
processInstanceId
){
// 获取流程发布Id信息
String
definitionId
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
().
getProcessDefinitionId
();
ProcessDefinitionEntity
processDefinitionEntity
=
(
ProcessDefinitionEntity
)
((
RepositoryServiceImpl
)
repositoryService
).
getDeployedProcessDefinition
(
definitionId
);
ExecutionEntity
execution
=
(
ExecutionEntity
)
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
();
// 当前流程节点Id信息
String
activitiId
=
execution
.
getActivityId
();
// 获取流程所有节点信息
List
<
ActivityImpl
>
activitiList
=
processDefinitionEntity
.
getActivities
();
// 遍历所有节点信息
for
(
ActivityImpl
activityImpl
:
activitiList
)
{
String
id
=
activityImpl
.
getId
();
if
(
activitiId
.
equals
(
id
))
{
return
activityImpl
;
}
}
return
null
;
}
/**
* 将 普通节点转换成为会签 任务
*
* @param taskId
* @param sequential
* @param
data
* @param taskId
任务id
* @param sequential
是否串行
* @param
userIds 用户id
*/
@Override
public
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
Map
<
String
,
Object
>
data
)
{
public
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
List
<
String
>
userIds
)
{
this
.
covertToMultiInstance
(
taskId
,
sequential
,
ActivitiConstants
.
ASSIGNEE_USER_EXP
,
userIds
);
}
/**
* 将 普通节点转换成为会签 任务
*
* @param taskId
* @param sequential
* @param taskId
任务id
* @param sequential
是否串行
* @param assigneeExp 任务执行人表达式
* @param
data
* @param
userIds 用户id
*/
@Override
public
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
String
assigneeExp
,
Map
<
String
,
Object
>
data
)
{
public
void
covertToMultiInstance
(
String
taskId
,
boolean
sequential
,
String
assigneeExp
,
List
<
String
>
userIds
)
{
UserTask
currentTaskNode
=
activitiTaskService
.
getCurrentUserTaskByTaskId
(
taskId
);
currentTaskNode
.
setAssignee
(
assigneeExp
);
// 设置多实例属性
currentTaskNode
.
setLoopCharacteristics
(
createMultiInstanceLoopCharacteristics
(
sequential
));
currentTaskNode
.
setAssignee
(
ActivitiConstants
.
ASSIGNEE_USER_EXP
);
// 设置监听器
// 这里需要注意一下,当用户节点设置了多实例属性后,设置监听器时是设置executionListeners而不是taskListeners。
// 类要实现ExecutionListener或者JavaDelegate,普通用户节点实现TaskListener。
// 还有多实例属性中loopCardinality和inputDataItem两个必须设置一个,这个在部署流程似有校验
currentTaskNode
.
setExecutionListeners
(
Arrays
.
asList
(
new
MultiInstanceloopListener
()));
// 设置审批人
currentTaskNode
.
setCandidateUsers
(
userIds
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录