Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
jfV5lcyq
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
管理员
jfV5lcyq
Commits
9bc06c27
Commit
9bc06c27
authored
6 years ago
by
罗绍泽
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
流程引擎简单回退功能实现
parent
32302264
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
511 additions
and
167 deletions
+511
-167
procinstanceTabHistory.js
...t/process/pages/procinstance/js/procinstanceTabHistory.js
+12
-4
proctaskTab.js
WebContent/process/pages/proctask/js/proctaskTab.js
+7
-0
NodeJumpTaskCmd.java
src_process/com/gaowj/activiti/cmd/NodeJumpTaskCmd.java
+69
-0
AssignmentTaskListener.java
...s/com/gaowj/activiti/listener/AssignmentTaskListener.java
+1
-3
ProcinstanceBusinessImpl.java
...gaowj/business/procinstance/ProcinstanceBusinessImpl.java
+5
-9
ProctaskBusinessImpl.java
...ess/com/gaowj/business/proctask/ProctaskBusinessImpl.java
+10
-141
ActivitiTools.java
src_process/com/gaowj/business/utils/ActivitiTools.java
+312
-4
ActivitiOptEnum.java
...ocess/com/gaowj/business/utils/model/ActivitiOptEnum.java
+77
-0
ActivitiResultEnum.java
...ss/com/gaowj/business/utils/model/ActivitiResultEnum.java
+5
-1
dataAction.java
src_process/com/gaowj/procinstance/action/dataAction.java
+4
-4
actAction.java
src_process/com/gaowj/proctask/action/actAction.java
+9
-1
No files found.
WebContent/process/pages/procinstance/js/procinstanceTabHistory.js
View file @
9bc06c27
...
...
@@ -15,22 +15,30 @@ $(function(){
field
:
'ACTIVITY_NAME'
,
title
:
'环节名称'
,
width
:
200
,
align
:
'center'
,
align
:
'center'
},
{
field
:
'ASSIGNEE'
,
title
:
'办理人'
,
width
:
200
,
align
:
'center'
,
align
:
'center'
// }, {
// field : 'IS_BACK',
// title : '特殊',
// width : 250,
// align : 'center',
// formatter:function(value,row,index){
// return value==1?"回退":"正常";
// }
},
{
field
:
'START_TIME'
,
title
:
'开始时间'
,
width
:
250
,
align
:
'center'
,
align
:
'center'
},
{
field
:
'END_TIME'
,
title
:
'结束时间'
,
width
:
250
,
align
:
'center'
,
align
:
'center'
}
]
],
onLoadSuccess
:
function
()
{
if
(
is_opetipmenuwidth
==
null
){
...
...
This diff is collapsed.
Click to expand it.
WebContent/process/pages/proctask/js/proctaskTab.js
View file @
9bc06c27
...
...
@@ -178,6 +178,13 @@ function updateDataToNext(is_entity){
return
v_result
;
}
//退回按钮执行事件
function
backProc
(
is_entity
){
v_result
=
proctaskModule
.
act
.
back
(
is_entity
);
$
(
'#list'
).
datagrid
(
'reload'
);
return
v_result
;
}
/****/
/**
...
...
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/activiti/cmd/NodeJumpTaskCmd.java
0 → 100644
View file @
9bc06c27
package
com
.
gaowj
.
activiti
.
cmd
;
import
java.util.Iterator
;
import
java.util.Map
;
import
org.activiti.engine.impl.interceptor.Command
;
import
org.activiti.engine.impl.interceptor.CommandContext
;
import
org.activiti.engine.impl.persistence.entity.ExecutionEntity
;
import
org.activiti.engine.impl.persistence.entity.ExecutionEntityManager
;
import
org.activiti.engine.impl.persistence.entity.TaskEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
public
class
NodeJumpTaskCmd
implements
Command
<
Void
>
{
protected
String
executionId
;
// 执行ID
protected
ActivityImpl
desActivity
;
// 目标引擎对象
protected
Map
<
String
,
Object
>
paramvar
;
// 变量
protected
ActivityImpl
currentActivity
;
// 当前引擎对象
protected
String
deleteReason
=
"completed"
;
/**
* 构造参数 可以根据自己的业务需要添加更多的字段
*
* @param executionId
* @param desActivity
* @param paramvar
* @param currentActivity
*/
public
NodeJumpTaskCmd
(
String
executionId
,
ActivityImpl
desActivity
,
Map
<
String
,
Object
>
paramvar
,
ActivityImpl
currentActivity
)
{
this
.
executionId
=
executionId
;
this
.
desActivity
=
desActivity
;
this
.
paramvar
=
paramvar
;
this
.
currentActivity
=
currentActivity
;
}
public
NodeJumpTaskCmd
(
String
executionId
,
ActivityImpl
desActivity
,
Map
<
String
,
Object
>
paramvar
,
ActivityImpl
currentActivity
,
String
deleteReason
)
{
this
.
executionId
=
executionId
;
this
.
desActivity
=
desActivity
;
this
.
paramvar
=
paramvar
;
this
.
currentActivity
=
currentActivity
;
this
.
deleteReason
=
deleteReason
;
}
/**
* 获取执行实体管理 获取当前的任务执行对象 设置对应的值 获取当前的任务 删除 执行目标工作流
*/
@Override
public
Void
execute
(
CommandContext
commandContext
)
{
// 获取执行实体管理
ExecutionEntityManager
executionEntityManager
=
commandContext
.
getExecutionEntityManager
();
// 根据ExecutionID 查找执行实体 获取当前流程的executionId,因为在并发的情况下executionId是唯一的。
ExecutionEntity
executionEntity
=
executionEntityManager
.
findExecutionById
(
executionId
);
executionEntity
.
setVariables
(
paramvar
);
executionEntity
.
setEventSource
(
this
.
currentActivity
);
executionEntity
.
setActivity
(
this
.
currentActivity
);
// 获取当前ExecutionID的任务 根据executionId 获取Task
Iterator
<
TaskEntity
>
localIterator
=
commandContext
.
getTaskEntityManager
().
findTasksByExecutionId
(
this
.
executionId
).
iterator
();
while
(
localIterator
.
hasNext
())
{
TaskEntity
taskEntity
=
(
TaskEntity
)
localIterator
.
next
();
// 触发任务监听
taskEntity
.
fireEvent
(
"complete"
);
// 删除任务的原因
commandContext
.
getTaskEntityManager
().
deleteTask
(
taskEntity
,
this
.
deleteReason
,
false
);
}
executionEntity
.
executeActivity
(
this
.
desActivity
);
System
.
out
.
println
();
return
null
;
}
}
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/activiti/listener/AssignmentTaskListener.java
View file @
9bc06c27
...
...
@@ -9,13 +9,11 @@ import org.activiti.engine.HistoryService;
import
org.activiti.engine.delegate.DelegateTask
;
import
org.activiti.engine.delegate.TaskListener
;
import
org.activiti.engine.history.HistoricActivityInstance
;
import
org.activiti.engine.task.IdentityLink
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.web.context.ContextLoaderListener
;
import
org.springframework.web.context.support.WebApplicationContextUtils
;
import
com.gaowj.business.ProcdefiChooseUserBusiness
;
import
com.gaowj.business.ProcinstanceBusiness
;
import
com.gaowj.business.comp.BusinessManager
;
import
com.gaowj.business.util.SessionUtil
;
/**
...
...
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/business/procinstance/ProcinstanceBusinessImpl.java
View file @
9bc06c27
...
...
@@ -20,6 +20,7 @@ import org.activiti.engine.TaskService;
import
org.activiti.engine.history.HistoricActivityInstance
;
import
org.activiti.engine.history.HistoricProcessInstance
;
import
org.activiti.engine.repository.ProcessDefinition
;
import
org.activiti.engine.task.Task
;
import
org.activiti.image.impl.DefaultProcessDiagramGenerator
;
import
org.apache.ibatis.session.RowBounds
;
...
...
@@ -32,6 +33,7 @@ import com.gaowj.business.system.SystemBackDAO;
import
com.gaowj.business.util.Page
;
import
com.gaowj.business.util.SessionUtil
;
import
com.gaowj.business.utils.ActivitiTools
;
import
com.gaowj.business.utils.model.ActivitiOptEnum
;
import
com.gaowj.business.utils.model.ActivitiResultEnum
;
public
class
ProcinstanceBusinessImpl
implements
ProcinstanceBusiness
{
...
...
@@ -157,7 +159,7 @@ public class ProcinstanceBusinessImpl implements ProcinstanceBusiness {
@Override
public
Map
<
String
,
Object
>
update_proc_instance
(
Map
<
String
,
Object
>
entity
)
throws
ActivitiException
,
BusinessException
{
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
false
);
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
ActivitiOptEnum
.
SAVE
);
switch
(
activitiResultEnum
)
{
case
OK:
break
;
...
...
@@ -169,7 +171,7 @@ public class ProcinstanceBusinessImpl implements ProcinstanceBusiness {
@Override
public
Map
<
String
,
Object
>
update_proc_instance_next
(
Map
<
String
,
Object
>
entity
)
throws
ActivitiException
,
BusinessException
{
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
true
);
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
ActivitiOptEnum
.
SAVE_AND_NEXT
);
switch
(
activitiResultEnum
)
{
case
OK:
break
;
...
...
@@ -289,13 +291,7 @@ public class ProcinstanceBusinessImpl implements ProcinstanceBusiness {
// 只显示userTask类型
continue
;
}
/*
* if(hai.getActivityName()==null){ continue; }
*/
/*
* if(hai.getAssignee()==null&&hai.getEndTime()!=null){
* //如果没有办理人,但是有结束时间,任务该环节是开始环节,默认剔除 continue; }
*/
if
(
hai
.
getAssignee
()
!=
null
)
{
listAssignee
.
add
(
hai
.
getAssignee
());
}
...
...
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/business/proctask/ProctaskBusinessImpl.java
View file @
9bc06c27
...
...
@@ -32,6 +32,7 @@ import com.gaowj.business.procinstance.procinstanceDAO;
import
com.gaowj.business.util.Page
;
import
com.gaowj.business.util.SessionUtil
;
import
com.gaowj.business.utils.ActivitiTools
;
import
com.gaowj.business.utils.model.ActivitiOptEnum
;
import
com.gaowj.business.utils.model.ActivitiResultEnum
;
public
class
ProctaskBusinessImpl
implements
ProctaskBusiness
{
...
...
@@ -232,7 +233,7 @@ public class ProctaskBusinessImpl implements ProctaskBusiness {
@Override
public
Map
<
String
,
Object
>
update
(
Map
<
String
,
Object
>
entity
)
throws
ActivitiException
,
BusinessException
{
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
false
);
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
ActivitiOptEnum
.
SAVE
);
switch
(
activitiResultEnum
)
{
case
OK:
break
;
...
...
@@ -244,7 +245,7 @@ public class ProctaskBusinessImpl implements ProctaskBusiness {
@Override
public
Map
<
String
,
Object
>
updateToNext
(
Map
<
String
,
Object
>
entity
)
throws
ActivitiException
,
BusinessException
{
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
true
);
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
ActivitiOptEnum
.
SAVE_AND_NEXT
);
switch
(
activitiResultEnum
)
{
case
OK:
break
;
...
...
@@ -256,147 +257,15 @@ public class ProctaskBusinessImpl implements ProctaskBusiness {
@Override
public
Map
<
String
,
Object
>
back
(
Map
<
String
,
Object
>
entity
)
throws
BusinessException
{
// 存储自定义表单的业务数据
update_custom_business
(
entity
.
get
(
"TABLE_ID_SYSTEM"
).
toString
(),
entity
);
// 通过任务id获取流程id
String
taskId
=
entity
.
get
(
"TASK_ID_SYSTEM"
).
toString
();
// 退回当前任务
taskRollBack
(
taskId
);
return
entity
;
}
private
void
update_proc_instance
(
Map
<
String
,
Object
>
entity
)
{
Map
<
String
,
Object
>
entity2
=
new
HashMap
<
String
,
Object
>();
entity2
.
put
(
"UUID"
,
entity
.
get
(
"UUID"
));
if
(
entity
.
keySet
()
!=
null
)
{
List
<
Map
<
String
,
Object
>>
info
=
new
ArrayList
<
Map
<
String
,
Object
>>();
entity2
.
put
(
"info"
,
info
);
Set
<
String
>
key
=
entity
.
keySet
();
for
(
String
str
:
key
)
{
if
(
"UUID"
.
equals
(
str
))
{
continue
;
}
Map
<
String
,
Object
>
colum
=
new
HashMap
<
String
,
Object
>();
colum
.
put
(
"key"
,
str
);
colum
.
put
(
"value"
,
entity
.
get
(
str
));
info
.
add
(
colum
);
}
}
procinstanceDAO
.
update_proc_instance
(
entity2
);
}
private
String
update_custom_business
(
String
tableId
,
Map
<
String
,
Object
>
entity
)
{
entity
.
remove
(
"TABLE_ID_SYSTEM"
);
if
(
entity
.
get
(
"UUID"
)
==
null
)
{
entity
.
put
(
"UUID"
,
java
.
util
.
UUID
.
randomUUID
().
toString
());
}
if
(
entity
.
get
(
"CREATE_TIME"
)
==
null
)
{
entity
.
put
(
"CREATE_TIME"
,
new
Date
());
}
if
(
entity
.
get
(
"CREATE_ID"
)
==
null
)
{
entity
.
put
(
"CREATE_ID"
,
SessionUtil
.
getCode
());
}
if
(
entity
.
get
(
"UPDATE_ID"
)
==
null
)
{
entity
.
put
(
"UPDATE_ID"
,
SessionUtil
.
getCode
());
}
if
(
entity
.
get
(
"UPDATE_TIME"
)
==
null
)
{
entity
.
put
(
"UPDATE_TIME"
,
new
Date
());
ActivitiResultEnum
activitiResultEnum
=
ActivitiTools
.
save
(
entity
,
ActivitiOptEnum
.
SAVE_AND_RALLBACK
);
switch
(
activitiResultEnum
)
{
case
OK:
break
;
default
:
throw
new
ActivitiException
(
activitiResultEnum
.
getMsg
());
}
Map
<
String
,
Object
>
query
=
new
HashMap
<
String
,
Object
>();
query
.
put
(
"UUID"
,
tableId
);
// 动态传值插入
List
<
Map
<
String
,
Object
>>
infoList
=
new
ArrayList
<
Map
<
String
,
Object
>>();
// List<String> infoListKey = new ArrayList<String>();
if
(
entity
.
keySet
()
!=
null
)
{
Set
<
String
>
key
=
entity
.
keySet
();
// 将map集合中的key和value 取出来分别放到list集合里
for
(
String
str
:
key
)
{
// UUID不需要加进去
if
(
"UUID"
.
equals
(
str
))
{
continue
;
}
Map
<
String
,
Object
>
kv
=
new
HashMap
<
String
,
Object
>();
kv
.
put
(
"value"
,
entity
.
get
(
str
));
kv
.
put
(
"key"
,
str
);
infoList
.
add
(
kv
);
}
entity
.
put
(
"infoList"
,
infoList
);
}
/*
* List<Object> infoList = new ArrayList<Object>(); if (entity.keySet()
* != null) { Set<String> key = entity.keySet(); // 将map集合中的key和value
* 取出来分别放到list集合里 for (String str : key) {
* infoList.add(entity.get(str)); infoListKey.add(str); }
* entity.put("infoListKey", infoListKey); entity.put("infoList",
* infoList); }
*/
// 设置表名
String
tableName
=
formtableDAO
.
list_form_table
(
query
).
get
(
0
).
get
(
"TABLE_NAME"
).
toString
();
entity
.
put
(
"tableName"
,
tableName
);
entity
.
put
(
"uuid"
,
entity
.
get
(
"UUID"
));
procdefinitionDAO
.
update_custom_business
(
entity
);
return
entity
.
get
(
"UUID"
).
toString
();
return
entity
;
}
private
void
taskRollBack
(
String
taskId
)
{
try
{
Map
<
String
,
Object
>
variables
;
// 取得当前任务
HistoricTaskInstance
currTask
=
historyService
.
createHistoricTaskInstanceQuery
().
taskId
(
taskId
).
singleResult
();
// 取得流程实例
ProcessInstance
instance
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
currTask
.
getProcessInstanceId
()).
singleResult
();
if
(
instance
==
null
)
{
// 流程结束
}
variables
=
instance
.
getProcessVariables
();
// 取得流程定义
ProcessDefinitionEntity
definition
=
(
ProcessDefinitionEntity
)
(
repositoryService
.
getProcessDefinition
(
currTask
.
getProcessDefinitionId
()));
if
(
definition
==
null
)
{
// log.error("流程定义未找到");
return
;
}
// 取得上一步活动
ActivityImpl
currActivity
=
((
ProcessDefinitionImpl
)
definition
).
findActivity
(
currTask
.
getTaskDefinitionKey
());
List
<
PvmTransition
>
nextTransitionList
=
currActivity
.
getIncomingTransitions
();
// 清除当前活动的出口
List
<
PvmTransition
>
oriPvmTransitionList
=
new
ArrayList
<
PvmTransition
>();
List
<
PvmTransition
>
pvmTransitionList
=
currActivity
.
getOutgoingTransitions
();
for
(
PvmTransition
pvmTransition
:
pvmTransitionList
)
{
oriPvmTransitionList
.
add
(
pvmTransition
);
}
pvmTransitionList
.
clear
();
// 建立新出口
List
<
TransitionImpl
>
newTransitions
=
new
ArrayList
<
TransitionImpl
>();
for
(
PvmTransition
nextTransition
:
nextTransitionList
)
{
PvmActivity
nextActivity
=
nextTransition
.
getSource
();
ActivityImpl
nextActivityImpl
=
((
ProcessDefinitionImpl
)
definition
).
findActivity
(
nextActivity
.
getId
());
TransitionImpl
newTransition
=
currActivity
.
createOutgoingTransition
();
newTransition
.
setDestination
(
nextActivityImpl
);
newTransitions
.
add
(
newTransition
);
}
// 完成任务
List
<
Task
>
tasks
=
taskService
.
createTaskQuery
().
processInstanceId
(
instance
.
getId
()).
taskDefinitionKey
(
currTask
.
getTaskDefinitionKey
()).
list
();
for
(
Task
task
:
tasks
)
{
taskService
.
complete
(
task
.
getId
(),
variables
);
historyService
.
deleteHistoricTaskInstance
(
task
.
getId
());
}
// 恢复方向
for
(
TransitionImpl
transitionImpl
:
newTransitions
)
{
currActivity
.
getOutgoingTransitions
().
remove
(
transitionImpl
);
}
for
(
PvmTransition
pvmTransition
:
oriPvmTransitionList
)
{
pvmTransitionList
.
add
(
pvmTransition
);
}
return
;
}
catch
(
Exception
e
)
{
return
;
}
}
}
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/business/utils/ActivitiTools.java
View file @
9bc06c27
...
...
@@ -8,17 +8,32 @@ import java.util.Map;
import
java.util.Set
;
import
org.activiti.engine.HistoryService
;
import
org.activiti.engine.ManagementService
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.RuntimeService
;
import
org.activiti.engine.TaskService
;
import
org.activiti.engine.history.HistoricActivityInstance
;
import
org.activiti.engine.history.HistoricIdentityLink
;
import
org.activiti.engine.history.HistoricTaskInstance
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.PvmActivity
;
import
org.activiti.engine.impl.pvm.PvmTransition
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl
;
import
org.activiti.engine.impl.pvm.process.TransitionImpl
;
import
org.activiti.engine.runtime.Execution
;
import
org.activiti.engine.runtime.ProcessInstance
;
import
org.activiti.engine.task.Task
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.web.context.ContextLoaderListener
;
import
com.gaowj.activiti.cmd.NodeJumpTaskCmd
;
import
com.gaowj.business.ProcdefiChooseUserBusiness
;
import
com.gaowj.business.formtable.formtableDAO
;
import
com.gaowj.business.procdefinition.procdefinitionDAO
;
import
com.gaowj.business.procinstance.procinstanceDAO
;
import
com.gaowj.business.util.SessionUtil
;
import
com.gaowj.business.utils.model.ActivitiOptEnum
;
import
com.gaowj.business.utils.model.ActivitiResultEnum
;
/**
...
...
@@ -31,18 +46,24 @@ public class ActivitiTools {
private
static
HistoryService
historyService
;
private
static
TaskService
taskService
;
private
static
RuntimeService
runtimeService
;
private
static
RepositoryService
repositoryService
;
private
static
ManagementService
managementService
;
private
static
procdefinitionDAO
procdefinitionDAO
;
private
static
formtableDAO
formtableDAO
;
private
static
procinstanceDAO
procinstanceDAO
;
private
static
ProcdefiChooseUserBusiness
procdefiChooseUserBusiness
;
static
{
ApplicationContext
context
=
ContextLoaderListener
.
getCurrentWebApplicationContext
();
historyService
=
(
HistoryService
)
context
.
getBean
(
"historyService"
);
taskService
=
(
TaskService
)
context
.
getBean
(
"taskService"
);
runtimeService
=
(
RuntimeService
)
context
.
getBean
(
"runtimeService"
);
repositoryService
=
(
RepositoryService
)
context
.
getBean
(
"repositoryService"
);
managementService
=
(
ManagementService
)
context
.
getBean
(
"managementService"
);
procdefinitionDAO
=
(
procdefinitionDAO
)
context
.
getBean
(
"procdefinitionDAO"
);
formtableDAO
=
(
formtableDAO
)
context
.
getBean
(
"formtableDAO"
);
procinstanceDAO
=
(
procinstanceDAO
)
context
.
getBean
(
"procinstanceDAO"
);
procdefiChooseUserBusiness
=
(
ProcdefiChooseUserBusiness
)
context
.
getBean
(
"ProcdefiChooseUserBusiness"
);
}
/**
...
...
@@ -132,23 +153,33 @@ public class ActivitiTools {
}
/**
* 保存
*
* @param entity
* @param isNext
* 业务数据
* @param opt
* 具体执行的操作(保存,下一步,回退等)
* @return
*/
public
static
ActivitiResultEnum
save
(
Map
<
String
,
Object
>
entity
,
boolean
isNext
)
{
public
static
ActivitiResultEnum
save
(
Map
<
String
,
Object
>
entity
,
ActivitiOptEnum
opt
)
{
// 去除不必要属性
entity
.
remove
(
"OPETYPE"
);
Map
<
String
,
Object
>
procInstance
=
findProcInstanceByBusinessId
(
entity
.
get
(
"UUID"
).
toString
());
// 验证是否有权限修改
if
(!
checkPowerByInstance
(
procInstance
))
{
return
ActivitiResultEnum
.
NO_POWER
;
}
// 更新业务数据
if
(
opt
.
isSave
())
{
String
procDefId
=
procInstance
.
get
(
"PROC_DEFINITION_ID"
).
toString
();
String
tableId
=
findProcdeFinitionByUuid
(
procDefId
).
get
(
"TABLE_ID"
).
toString
();
updateCustomBusiness
(
tableId
,
entity
);
}
if
(
isNext
)
{
// 执行下一步
if
(
opt
.
isNext
())
{
if
(
procInstance
.
get
(
"INSTANCE_ID"
)
==
null
||
""
.
equals
(
procInstance
.
get
(
"INSTANCE_ID"
)))
{
// 如果未启动,则通过流程定义id启动流程
String
deploymentKey
=
findProcdeFinitionByUuid
(
procInstance
.
get
(
"PROC_DEFINITION_ID"
).
toString
()).
get
(
"DEPLOYMENT_KEY"
).
toString
();
...
...
@@ -161,14 +192,291 @@ public class ActivitiTools {
updateProcInstanceData
(
procInstanceUpdate
);
}
// 完成当前登录人任务
Task
task
=
taskService
.
createTaskQuery
().
processInstanceId
(
procInstance
.
get
(
"INSTANCE_ID"
).
toString
()).
taskCandidateUser
(
SessionUtil
.
getCode
()).
singleResult
();
List
<
Task
>
listTask
=
taskService
.
createTaskQuery
().
processInstanceId
(
procInstance
.
get
(
"INSTANCE_ID"
).
toString
()).
taskCandidateUser
(
SessionUtil
.
getCode
()).
list
();
for
(
Task
task:
listTask
){
taskService
.
complete
(
task
.
getId
());
}
}
// 执行回退
if
(
opt
.
isRallback
())
{
Task
task
=
taskService
.
createTaskQuery
().
processInstanceId
(
procInstance
.
get
(
"INSTANCE_ID"
).
toString
()).
taskCandidateUser
(
SessionUtil
.
getCode
()).
singleResult
();
try
{
rollBackByTaskId
(
task
.
getId
());
}
catch
(
Exception
e
)
{
return
ActivitiResultEnum
.
ROLLBACK_ERROR
;
}
}
return
ActivitiResultEnum
.
OK
;
}
/**
* 回退
*
* @param executionId
* 执行id
* @param currentActivity
* 当前节点
* @param destinationActivity
* 目标节点
* @param vars
* 参数
*/
private
static
void
rollBack
(
String
executionId
,
ActivityImpl
currentActivity
,
ActivityImpl
destinationActivity
,
Map
<
String
,
Object
>
vars
)
{
managementService
.
executeCommand
(
new
NodeJumpTaskCmd
(
executionId
,
destinationActivity
,
vars
,
currentActivity
));
}
private
static
void
rollBack
(
String
executionId
,
ActivityImpl
currentActivity
,
ActivityImpl
destinationActivity
)
{
managementService
.
executeCommand
(
new
NodeJumpTaskCmd
(
executionId
,
destinationActivity
,
new
HashMap
<
String
,
Object
>(),
currentActivity
));
}
/**
* 根据任务id进行退回操作
*
* @param taskId
* 任务id
* @throws Exception
*/
private
static
void
rollBackByTaskId
(
String
taskId
)
throws
Exception
{
HistoricTaskInstance
currTask
=
null
;
ActivityImpl
currActivity
=
null
;
List
<
TransitionImpl
>
newTransitions
=
null
;
List
<
PvmTransition
>
oriPvmTransitionList
=
null
;
List
<
PvmTransition
>
pvmTransitionList
=
null
;
try
{
// 取得当前任务
currTask
=
historyService
.
createHistoricTaskInstanceQuery
().
taskId
(
taskId
).
singleResult
();
// 取得流程实例
ProcessInstance
instance
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
currTask
.
getProcessInstanceId
()).
singleResult
();
if
(
instance
==
null
)
{
// 流程结束
}
// 获取该流程实例,当前所有的任务
List
<
Task
>
listNowAllTask
=
taskService
.
createTaskQuery
().
processInstanceId
(
instance
.
getId
()).
list
();
// 取得流程定义
ProcessDefinitionEntity
definition
=
(
ProcessDefinitionEntity
)
(
repositoryService
.
getProcessDefinition
(
currTask
.
getProcessDefinitionId
()));
if
(
definition
==
null
)
{
// log.error("流程定义未找到");
return
;
}
// 取得上一步活动
currActivity
=
((
ProcessDefinitionImpl
)
definition
).
findActivity
(
currTask
.
getTaskDefinitionKey
());
List
<
PvmTransition
>
nextTransitionList
=
findIncomingTransitionsWithoutGateway
(
definition
,
instance
.
getId
(),
currActivity
);
// 是否使用修改流程定义的方式进行回退
boolean
useChangeProcessDefinition
=
true
;
if
(!
useChangeProcessDefinition
)
{
if
(
nextTransitionList
.
size
()
>
0
)
{
// 如果有多个源头,只获取第一个
PvmTransition
nextTransition
=
nextTransitionList
.
get
(
0
);
PvmActivity
nextActivity
=
nextTransition
.
getSource
();
ActivityImpl
nextActivityImpl
=
((
ProcessDefinitionImpl
)
definition
).
findActivity
(
nextActivity
.
getId
());
rollBack
(
currTask
.
getExecutionId
(),
currActivity
,
nextActivityImpl
);
}
}
else
{
// 清除当前活动的出口
oriPvmTransitionList
=
new
ArrayList
<
PvmTransition
>();
pvmTransitionList
=
currActivity
.
getOutgoingTransitions
();
for
(
PvmTransition
pvmTransition
:
pvmTransitionList
)
{
oriPvmTransitionList
.
add
(
pvmTransition
);
}
pvmTransitionList
.
clear
();
// 建立新出口
newTransitions
=
new
ArrayList
<
TransitionImpl
>();
for
(
PvmTransition
nextTransition
:
nextTransitionList
)
{
PvmActivity
nextActivity
=
nextTransition
.
getSource
();
ActivityImpl
nextActivityImpl
=
((
ProcessDefinitionImpl
)
definition
).
findActivity
(
nextActivity
.
getId
());
TransitionImpl
newTransition
=
currActivity
.
createOutgoingTransition
();
newTransition
.
setDestination
(
nextActivityImpl
);
newTransitions
.
add
(
newTransition
);
}
// 完成任务
List
<
Task
>
tasks
=
taskService
.
createTaskQuery
().
processInstanceId
(
instance
.
getId
()).
taskDefinitionKey
(
currTask
.
getTaskDefinitionKey
()).
list
();
for
(
Task
task
:
tasks
)
{
taskService
.
complete
(
task
.
getId
());
}
}
// 获取新的当前任务
List
<
Task
>
listNewTask
=
taskService
.
createTaskQuery
().
processInstanceId
(
instance
.
getId
()).
list
();
// 为当前任务添加对应的环节人员
outer:
for
(
Task
newTask
:
listNewTask
)
{
for
(
Task
nowTask
:
listNowAllTask
)
{
if
(
newTask
.
getId
().
equals
(
nowTask
.
getId
()))
{
// 如果是回退前就有的任务不进行处理
continue
outer
;
}
}
if
(
checkTaskIsFirst
(
newTask
))
{
// 如果是第一个环节,则插入该实例创建人
taskService
.
addCandidateUser
(
newTask
.
getId
(),
findCreateUserByInstanceId
(
instance
.
getId
()));
}
else
{
List
<
Map
<
String
,
Object
>>
listUsers
=
findUsersByTaskDefinitionKey
(
newTask
.
getTaskDefinitionKey
());
for
(
Map
<
String
,
Object
>
u
:
listUsers
)
{
taskService
.
addCandidateUser
(
newTask
.
getId
(),
u
.
get
(
"CODE"
).
toString
());
}
}
}
return
;
}
catch
(
Exception
e
)
{
throw
e
;
}
finally
{
// 恢复方向
if
(
newTransitions
!=
null
)
{
for
(
TransitionImpl
transitionImpl
:
newTransitions
)
{
currActivity
.
getOutgoingTransitions
().
remove
(
transitionImpl
);
}
}
if
(
oriPvmTransitionList
!=
null
)
{
for
(
PvmTransition
pvmTransition
:
oriPvmTransitionList
)
{
pvmTransitionList
.
add
(
pvmTransition
);
}
}
}
}
/**
* 获取来源任务(除去网关)
*
* @param currActivity
* 任务对象
* @return
*/
private
static
List
<
PvmTransition
>
findIncomingTransitionsWithoutGateway
(
List
<
HistoricActivityInstance
>
listGateway
,
ProcessDefinitionImpl
definition
,
String
instanceId
,
ActivityImpl
currActivity
)
{
List
<
PvmTransition
>
listResult
=
new
ArrayList
<
PvmTransition
>();
List
<
PvmTransition
>
list
=
currActivity
.
getIncomingTransitions
();
for
(
PvmTransition
p
:
list
)
{
PvmActivity
prevActivity
=
p
.
getSource
();
ActivityImpl
prevActivityImpl
=
definition
.
findActivity
(
prevActivity
.
getId
());
boolean
isGateway
=
false
;
for
(
HistoricActivityInstance
gateway
:
listGateway
)
{
if
(
prevActivityImpl
.
getId
().
equals
(
gateway
.
getActivityId
()))
{
isGateway
=
true
;
break
;
}
}
if
(
isGateway
)
{
// 如果当前环节是网关,则需要继续向前查询环节
listResult
.
addAll
(
findIncomingTransitionsWithoutGateway
(
listGateway
,
definition
,
instanceId
,
prevActivityImpl
));
}
else
{
listResult
.
add
(
p
);
}
}
return
listResult
;
}
/**
* 获取来源任务(除去网关)
*
* @param definition
* 流程定义对象
* @param instanceId
* 流程实例id
* @param currActivity
* 任务对象
* @return
*/
private
static
List
<
PvmTransition
>
findIncomingTransitionsWithoutGateway
(
ProcessDefinitionImpl
definition
,
String
instanceId
,
ActivityImpl
currActivity
)
{
// 获取该流程实例所有的网关
List
<
HistoricActivityInstance
>
listGateway
=
getHistoricActivityInstance
(
instanceId
,
"parallelGateway"
);
return
findIncomingTransitionsWithoutGateway
(
listGateway
,
definition
,
instanceId
,
currActivity
);
}
/**
* 根据流程实例id获取该实例的新建人
*
* @param instanceId
* 流程实例id
* @return 新建人UUID
*/
private
static
String
findCreateUserByInstanceId
(
String
instanceId
)
{
Map
<
String
,
Object
>
query
=
new
HashMap
<
String
,
Object
>();
query
.
put
(
"INSTANCE_ID"
,
instanceId
);
return
procinstanceDAO
.
list_proc_instance_all
(
query
).
get
(
0
).
get
(
"CREATE_ID"
).
toString
();
}
/**
* 获取某一类型的任务
*
* @param instanceId
* 实例id
* @param type
* 类型字符串
* @return 任务列表
*/
private
static
List
<
HistoricActivityInstance
>
getHistoricActivityInstance
(
String
instanceId
,
String
type
)
{
List
<
HistoricActivityInstance
>
listHistoricActivityInstance
=
historyService
// 历史相关Service
.
createHistoricActivityInstanceQuery
()
// 创建历史活动实例查询
.
processInstanceId
(
instanceId
)
// 执行流程实例id
.
finished
().
list
();
List
<
HistoricActivityInstance
>
listResult
=
new
ArrayList
<
HistoricActivityInstance
>();
for
(
HistoricActivityInstance
hai
:
listHistoricActivityInstance
)
{
if
(
type
.
equals
(
hai
.
getActivityType
()))
{
listResult
.
add
(
hai
);
}
}
return
listResult
;
}
/**
* 验证任务环节是否为第一个环节
*
* @param task
* 任务实例
* @return true:是第一个环节;false:不是第一个环节
*/
private
static
boolean
checkTaskIsFirst
(
Task
task
)
{
// 获取开始节点的TaskDefinitionKey
String
startEventTaskDefinitionKey
=
null
;
List
<
HistoricActivityInstance
>
listHistoricActivityInstance
=
historyService
// 历史相关Service
.
createHistoricActivityInstanceQuery
()
// 创建历史活动实例查询
.
processInstanceId
(
task
.
getProcessInstanceId
())
// 执行流程实例id
.
finished
().
list
();
for
(
HistoricActivityInstance
hai
:
listHistoricActivityInstance
)
{
if
(
"startEvent"
.
equals
(
hai
.
getActivityType
()))
{
startEventTaskDefinitionKey
=
hai
.
getActivityId
();
break
;
}
}
// 取得流程定义
ProcessDefinitionEntity
definition
=
(
ProcessDefinitionEntity
)
(
repositoryService
.
getProcessDefinition
(
task
.
getProcessDefinitionId
()));
ActivityImpl
currActivity
=
((
ProcessDefinitionImpl
)
definition
).
findActivity
(
task
.
getTaskDefinitionKey
());
List
<
PvmTransition
>
nextTransitionList
=
currActivity
.
getIncomingTransitions
();
for
(
PvmTransition
pvmTransition
:
nextTransitionList
)
{
String
sourceStr
=
pvmTransition
.
getSource
().
toString
();
if
(
sourceStr
.
indexOf
(
startEventTaskDefinitionKey
)
!=
-
1
)
{
// 如果存在开始节点的TaskDefinitionKey,表示是第一个环节
return
true
;
}
}
return
false
;
}
public
static
List
<
Map
<
String
,
Object
>>
findUsersByTaskDefinitionKey
(
String
taskDefinitionKey
)
{
Map
<
String
,
Object
>
query
=
new
HashMap
<
String
,
Object
>();
query
.
put
(
"LINK_KEY"
,
taskDefinitionKey
);
return
procdefiChooseUserBusiness
.
list_procdefi_chooseUser
(
query
);
}
/**
* 根据主键id修改流程实例表
*
* @param entity
* 流程实例表对象
*/
private
static
void
updateProcInstanceData
(
Map
<
String
,
Object
>
entity
)
{
procinstanceDAO
.
update_proc_instance
(
machiningUpdateEntity
(
entity
,
"UUID"
));
...
...
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/business/utils/model/ActivitiOptEnum.java
0 → 100644
View file @
9bc06c27
package
com
.
gaowj
.
business
.
utils
.
model
;
/**
* activiti操作枚举类
*
* @author luosz
*
*/
public
enum
ActivitiOptEnum
{
/**
* 保存
*/
SAVE
(
true
,
false
,
false
),
/**
* 保存并且下一步
*/
SAVE_AND_NEXT
(
true
,
true
,
false
),
/**
* 下一步
*/
NEXT
(
false
,
true
,
false
),
/**
* 回退
*/
RALLBACK
(
false
,
false
,
true
),
/**
* 保存并回退
*/
SAVE_AND_RALLBACK
(
true
,
false
,
true
);
private
boolean
isNextSign
=
false
;
private
boolean
isSaveSign
=
false
;
private
boolean
isRallbackSign
=
false
;
/**
* 操作规则制定
*
* @param isSaveSign
* 是否执行保存
* @param isNextSign
* 是否执行下一步
* @param isRallbackSign
* 是否执行回退
*/
private
ActivitiOptEnum
(
boolean
isSaveSign
,
boolean
isNextSign
,
boolean
isRallbackSign
)
{
this
.
isSaveSign
=
isSaveSign
;
this
.
isNextSign
=
isNextSign
;
this
.
isRallbackSign
=
isRallbackSign
;
}
/**
* 是否执行下一步
*
* @return
*/
public
boolean
isNext
()
{
return
isNextSign
;
}
/**
* 是否执行保存
*
* @return
*/
public
boolean
isSave
()
{
return
isSaveSign
;
}
/**
* 是否执行回退
*
* @return
*/
public
boolean
isRallback
()
{
return
isRallbackSign
;
}
}
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/business/utils/model/ActivitiResultEnum.java
View file @
9bc06c27
...
...
@@ -14,7 +14,11 @@ public enum ActivitiResultEnum {
/**
* 无权限
*/
NO_POWER
(-
1
,
"您不是当前环节操作人,无权限修改该内容!"
);
NO_POWER
(-
1
,
"您不是当前环节操作人,无权限修改该内容!"
),
/**
* 退回异常
*/
ROLLBACK_ERROR
(-
2
,
"回退异常!"
);
private
ActivitiResult
activitiResult
;
private
ActivitiResultEnum
(
int
code
,
String
msg
)
{
...
...
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/procinstance/action/dataAction.java
View file @
9bc06c27
...
...
@@ -62,12 +62,12 @@ public class dataAction extends BasicAction{
Map
<
String
,
Object
>
query
=
RequestUtils
.
getUpdateFieldMap
(
request
,
RequestUtils
.
UPDATEDATAFIELDPREFIX
);
try
{
query
=
QueryParamUtil
.
StringToDate
(
query
);
Page
<
Map
<
String
,
Object
>>
pageRows
=
business
.
list_proc_instance
(
page
No
,
pageSize
,
query
);
setPageCount
((
pageRows
.
getCount
()
-
1
)
/
pageSize
+
1
);
Page
<
Map
<
String
,
Object
>>
pageRows
=
business
.
list_proc_instance
(
page
,
rows
,
query
);
setPageCount
((
pageRows
.
getCount
()
-
1
)
/
rows
+
1
);
Map
<
String
,
Object
>
data
=
new
HashMap
<
String
,
Object
>();
data
.
put
(
"rowSet"
,
QueryParamUtil
.
DateTimeToString
(
pageRows
.
getItems
()));
data
.
put
(
"pageNo"
,
page
No
);
data
.
put
(
"pageSize"
,
pageSize
);
data
.
put
(
"pageNo"
,
page
);
data
.
put
(
"pageSize"
,
rows
);
data
.
put
(
"pageCount"
,
pageCount
);
data
.
put
(
"rows"
,
data
.
get
(
"rowSet"
));
data
.
put
(
"total"
,
pageRows
.
getCount
());
...
...
This diff is collapsed.
Click to expand it.
src_process/com/gaowj/proctask/action/actAction.java
View file @
9bc06c27
...
...
@@ -92,8 +92,16 @@ public class actAction extends BasicAction {
jsonObject
=
new
JSONObject
();
try
{
entity
=
QueryParamUtil
.
StringToDate
(
entity
);
// business.list_proc_task(pageNo, pageSize, query)
Map
<
String
,
Object
>
procinstance
=
business
.
back
(
entity
);
// 操作日志
SystemOpeBusiness
sysbusiness
=
BusinessManager
.
getBusiness
(
SystemOpeBusiness
.
class
);
sysbusiness
.
insert_logBusiness
(
"backInfo"
,
""
+
procinstance
,
"回退流程实例数据"
,
(
String
)
entity
.
get
(
"UUID"
),
(
String
)
entity
.
get
(
"CONTENT"
),
"procinstance"
);
jsonObject
.
putAll
(
Status
.
getStatusSuccessMessage
(
"保存成功"
));
}
catch
(
ActivitiException
e
)
{
jsonObject
.
putAll
(
Status
.
getStatusErrorMessage
(
e
.
getMessage
()));
e
.
printStackTrace
();
}
catch
(
Exception
e
)
{
jsonObject
.
putAll
(
Status
.
getStatusErrorMessage
(
e
.
getMessage
()));
e
.
printStackTrace
();
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment