Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Skyeye云
Skyeye
提交
63754b25
S
Skyeye
项目概览
Skyeye云
/
Skyeye
通知
1431
Star
162
Fork
130
代码
文件
提交
分支
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看板
提交
63754b25
编写于
12月 15, 2021
作者:
Skyeye云
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
代码修改
上级
4561f525
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
85 addition
and
15 deletion
+85
-15
skyeye-activiti/src/main/java/com/skyeye/activiti/service/ActivitiTaskService.java
...java/com/skyeye/activiti/service/ActivitiTaskService.java
+8
-0
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/ActivitiTaskServiceImpl.java
...skyeye/activiti/service/impl/ActivitiTaskServiceImpl.java
+31
-0
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java
.../skyeye/activiti/service/impl/CounterSignServiceImpl.java
+40
-15
skyeye-activiti/src/main/resources/reqmapping/mapping/activiti.xml
...tiviti/src/main/resources/reqmapping/mapping/activiti.xml
+6
-0
未找到文件。
skyeye-activiti/src/main/java/com/skyeye/activiti/service/ActivitiTaskService.java
浏览文件 @
63754b25
...
...
@@ -65,4 +65,12 @@ public interface ActivitiTaskService {
*/
ActivityImpl
getCurrentActivityNode
(
String
processInstanceId
);
/**
* 根据任务节点id判断该节点是否为会签节点
*
* @param taskId 任务节点id
* @return true:是会签节点;false:不是会签节点
*/
boolean
isMultiInstance
(
String
taskId
);
}
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/ActivitiTaskServiceImpl.java
浏览文件 @
63754b25
...
...
@@ -32,6 +32,7 @@ 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.bpmn.behavior.ParallelMultiInstanceBehavior
;
import
org.activiti.engine.impl.persistence.entity.ExecutionEntity
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
...
...
@@ -136,6 +137,7 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
}
return
null
;
},
RedisConstants
.
TEN_DAY_SECONDS
);
bean
.
put
(
"isMultiInstance"
,
this
.
isMultiInstance
(
task
.
getId
()));
rows
.
add
(
bean
);
}
outputObject
.
setBeans
(
rows
);
...
...
@@ -725,6 +727,7 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
}
}
@Override
public
UserTask
getCurrentUserTaskByTaskId
(
String
taskId
){
Task
task
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
BpmnModel
bpmnModel
=
repositoryService
.
getBpmnModel
(
task
.
getProcessDefinitionId
());
...
...
@@ -734,6 +737,7 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
return
currentUserTask
;
}
@Override
public
ActivityImpl
getCurrentActivityNode
(
String
processInstanceId
){
// 获取流程发布Id信息
String
definitionId
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
().
getProcessDefinitionId
();
...
...
@@ -754,4 +758,31 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
return
null
;
}
@Override
public
boolean
isMultiInstance
(
String
taskId
)
{
UserTask
currentTaskNode
=
this
.
getCurrentUserTaskByTaskId
(
taskId
);
// 1.判断任务节点是否是用户手动转的会签节点
if
(
currentTaskNode
.
getLoopCharacteristics
()
!=
null
)
{
return
true
;
}
// 2.判断工作流模型中的这个节点是否是会签节点
Task
task
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
if
(
task
!=
null
)
{
// 获取流程定义id
ProcessDefinitionEntity
processDefinitionEntity
=
(
ProcessDefinitionEntity
)
repositoryService
.
getProcessDefinition
(
task
.
getProcessDefinitionId
());
// 根据活动id获取活动实例
ActivityImpl
activityImpl
=
processDefinitionEntity
.
findActivity
(
task
.
getTaskDefinitionKey
());
if
(
activityImpl
.
getActivityBehavior
()
instanceof
ParallelMultiInstanceBehavior
)
{
ParallelMultiInstanceBehavior
behavior
=
(
ParallelMultiInstanceBehavior
)
activityImpl
.
getActivityBehavior
();
if
(
behavior
!=
null
&&
behavior
.
getCollectionExpression
()
!=
null
)
{
return
true
;
}
}
}
return
false
;
}
}
skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java
浏览文件 @
63754b25
...
...
@@ -4,16 +4,22 @@
package
com.skyeye.activiti.service.impl
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Map
;
import
com.skyeye.activiti.service.ActivitiModelService
;
import
com.skyeye.activiti.service.ActivitiTaskService
;
import
com.skyeye.activiti.service.CounterSignService
;
import
com.skyeye.annotation.transaction.ActivitiAndBaseTransaction
;
import
com.skyeye.common.constans.ActivitiConstants
;
import
com.skyeye.common.object.InputObject
;
import
com.skyeye.common.object.OutputObject
;
import
net.sf.json.JSONArray
;
import
org.activiti.bpmn.model.ActivitiListener
;
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.delegate.ExecutionListener
;
import
org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior
;
import
org.activiti.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior
;
import
org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior
;
...
...
@@ -24,14 +30,10 @@ import org.activiti.engine.impl.pvm.process.ActivityImpl;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
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
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @ClassName: CounterSignServiceImpl
...
...
@@ -59,6 +61,9 @@ public class CounterSignServiceImpl implements CounterSignService {
@Autowired
private
ActivitiTaskService
activitiTaskService
;
@Autowired
private
ActivitiModelService
activitiModelService
;
/**
* 将 普通节点转换成为会签 任务
*
...
...
@@ -67,12 +72,14 @@ public class CounterSignServiceImpl implements CounterSignService {
* @throws Exception
*/
@Override
@ActivitiAndBaseTransaction
(
value
=
{
"activitiTransactionManager"
,
"transactionManager"
})
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
());
this
.
covertToMultiInstance
(
taskId
,
sequential
,
userIds
);
activitiModelService
.
queryProHighLighted
(
params
.
get
(
"processInstanceId"
).
toString
());
}
/**
...
...
@@ -93,7 +100,7 @@ public class CounterSignServiceImpl implements CounterSignService {
// 迭代集合
multiInstanceLoopCharacteristics
.
setElementVariable
(
assignee
);
// 完成条件 已完成数等于实例数${nrOfActiveInstances == nrOfInstances}
multiInstanceLoopCharacteristics
.
setCompletionCondition
(
""
);
multiInstanceLoopCharacteristics
.
setCompletionCondition
(
"
${nrOfActiveInstances == nrOfInstances}
"
);
return
multiInstanceLoopCharacteristics
;
}
...
...
@@ -194,8 +201,26 @@ public class CounterSignServiceImpl implements CounterSignService {
// 这里需要注意一下,当用户节点设置了多实例属性后,设置监听器时是设置executionListeners而不是taskListeners。
// 类要实现ExecutionListener或者JavaDelegate,普通用户节点实现TaskListener。
// 还有多实例属性中loopCardinality和inputDataItem两个必须设置一个,这个在部署流程似有校验
currentTaskNode
.
setExecutionListeners
(
Arrays
.
asList
(
new
MultiInstanceloopListener
()
));
currentTaskNode
.
setExecutionListeners
(
this
.
getActivitiListener
(
));
// 设置审批人
currentTaskNode
.
setCandidateUsers
(
userIds
);
}
private
List
<
ActivitiListener
>
getActivitiListener
(){
List
<
ActivitiListener
>
activitiListener
=
new
ArrayList
<>();
Map
<
String
,
String
>
listeners
=
new
HashMap
<>();
// 完成时回调
listeners
.
put
(
ExecutionListener
.
EVENTNAME_TAKE
,
"com.skyeye.activiti.listener.MultiInstanceloopListener"
);
for
(
String
key:
listeners
.
keySet
())
{
ActivitiListener
listener
=
new
ActivitiListener
();
listener
.
setEvent
(
key
);
// Spring配置以变量形式调用无法写入,只能通过继承TaskListener方法,
listener
.
setImplementationType
(
"class"
);
listener
.
setImplementation
(
listeners
.
get
(
key
));
activitiListener
.
add
(
listener
);
}
return
activitiListener
;
}
}
skyeye-activiti/src/main/resources/reqmapping/mapping/activiti.xml
浏览文件 @
63754b25
...
...
@@ -63,6 +63,12 @@
<url
id=
"activitiProcess002"
path=
"/post/ActivitiProcessController/nextPrcessApproverByProcessDefinitionKey"
val=
"根据processDefinitionKey获取流程下一个用户节点的审批人"
allUse=
"2"
method=
"POST"
groupName=
"工作流流程相关操作"
>
<property
id=
"pageUrl"
name=
"pageUrl"
ref=
"required"
var=
"流程实例的page_url参数"
/>
</url>
<url
id=
"activitiProcess003"
path=
"/post/CounterSignController/covertToMultiInstance"
val=
"将 普通节点转换成为会签 任务"
allUse=
"2"
method=
"POST"
groupName=
"工作流流程相关操作"
>
<property
id=
"processInstanceId"
name=
"processInstanceId"
ref=
"required"
var=
"流程id"
/>
<property
id=
"taskId"
name=
"taskId"
ref=
"required"
var=
"任务id"
/>
<property
id=
"sequential"
name=
"sequential"
ref=
"required"
var=
"会签节点是否串行"
/>
<property
id=
"userIds"
name=
"userIds"
ref=
"required,json"
var=
"会签人员id"
/>
</url>
<!-- 工作流流程相关操作结束 -->
<!-- 工作流用户任务相关操作开始 -->
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录