Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
JeeSpringCloud
Commits
05beecd0
"vscode:/vscode.git/clone" did not exist on "693cf5cd3f70c6d36cd5f7c11246af8f60bd06e3"
Commit
05beecd0
authored
Nov 12, 2018
by
Huang
Browse files
no commit message
parent
bc5dd330
Changes
368
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 368+
files are displayed.
Plain diff
Email patch
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/rest/editor/model/ModelSaveRestResource.java
0 → 100644
View file @
05beecd0
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeespring.modules.act.rest.editor.model
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.InputStream
;
import
org.activiti.editor.constants.ModelDataJsonConstants
;
import
org.activiti.engine.ActivitiException
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.repository.Model
;
import
org.apache.batik.transcoder.TranscoderInput
;
import
org.apache.batik.transcoder.TranscoderOutput
;
import
org.apache.batik.transcoder.image.PNGTranscoder
;
import
org.apache.log4j.Logger
;
import
org.apache.shiro.authz.annotation.RequiresPermissions
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.util.LinkedMultiValueMap
;
import
org.springframework.util.MultiValueMap
;
import
org.springframework.web.bind.annotation.*
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.node.ObjectNode
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
/**
* @author Tijs Rademakers
*/
@RestController
public
class
ModelSaveRestResource
implements
ModelDataJsonConstants
{
protected
static
final
Logger
LOGGER
=
Logger
.
getLogger
(
ModelSaveRestResource
.
class
);
@Autowired
private
RepositoryService
repositoryService
;
// @Autowired
// private ObjectMapper objectMapper;
protected
ObjectMapper
objectMapper
=
new
ObjectMapper
();
@RequiresPermissions
(
"act:model:edit"
)
@RequestMapping
(
value
=
"/act/service/model/{modelId}/save"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
,
RequestMethod
.
PUT
})
@ResponseStatus
(
value
=
HttpStatus
.
OK
)
// @RequestBody MultiValueMap<String, String> values,MultiValueMap<String, String> valuesa
public
void
saveModel
(
@PathVariable
String
modelId
,
HttpServletRequest
request
,
HttpServletResponse
response
)
{
try
{
MultiValueMap
<
String
,
String
>
values
=
new
LinkedMultiValueMap
<>();;
Model
model
=
repositoryService
.
getModel
(
modelId
);
String
name
=
""
,
description
=
""
,
json_xml
=
""
,
svg_xml
=
""
;
values
.
add
(
"name"
,
request
.
getParameter
(
"name"
));
values
.
add
(
"description"
,
request
.
getParameter
(
"description"
));
values
.
add
(
"json_xml"
,
request
.
getParameter
(
"json_xml"
));
values
.
add
(
"svg_xml"
,
request
.
getParameter
(
"svg_xml"
));
ObjectNode
modelJson
=
(
ObjectNode
)
objectMapper
.
readTree
(
model
.
getMetaInfo
());
modelJson
.
put
(
MODEL_NAME
,
values
.
getFirst
(
"name"
));
modelJson
.
put
(
MODEL_DESCRIPTION
,
values
.
getFirst
(
"description"
));
model
.
setMetaInfo
(
modelJson
.
toString
());
model
.
setName
(
values
.
getFirst
(
"name"
));
repositoryService
.
saveModel
(
model
);
repositoryService
.
addModelEditorSource
(
model
.
getId
(),
values
.
getFirst
(
"json_xml"
).
getBytes
(
"utf-8"
));
InputStream
svgStream
=
new
ByteArrayInputStream
(
values
.
getFirst
(
"svg_xml"
).
getBytes
(
"utf-8"
));
TranscoderInput
input
=
new
TranscoderInput
(
svgStream
);
PNGTranscoder
transcoder
=
new
PNGTranscoder
();
// Setup output
ByteArrayOutputStream
outStream
=
new
ByteArrayOutputStream
();
TranscoderOutput
output
=
new
TranscoderOutput
(
outStream
);
// Do the transformation
transcoder
.
transcode
(
input
,
output
);
final
byte
[]
result
=
outStream
.
toByteArray
();
repositoryService
.
addModelEditorSourceExtra
(
model
.
getId
(),
result
);
outStream
.
close
();
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"Error saving model"
,
e
);
throw
new
ActivitiException
(
"Error saving model"
,
e
);
}
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/rest/servlet/FilterServletOutputStream.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.rest.servlet
;
import
java.io.DataOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
javax.servlet.ServletOutputStream
;
import
javax.servlet.WriteListener
;
public
class
FilterServletOutputStream
extends
ServletOutputStream
{
private
DataOutputStream
stream
;
public
FilterServletOutputStream
(
OutputStream
output
)
{
stream
=
new
DataOutputStream
(
output
);
}
@Override
public
void
write
(
int
b
)
throws
IOException
{
stream
.
write
(
b
);
}
@Override
public
void
write
(
byte
[]
b
)
throws
IOException
{
stream
.
write
(
b
);
}
@Override
public
void
write
(
byte
[]
b
,
int
off
,
int
len
)
throws
IOException
{
stream
.
write
(
b
,
off
,
len
);
}
@Override
public
boolean
isReady
()
{
return
false
;
}
@Override
public
void
setWriteListener
(
WriteListener
writeListener
)
{
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/rest/servlet/GenericResponseWrapper.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.rest.servlet
;
import
java.io.ByteArrayOutputStream
;
import
java.io.PrintWriter
;
import
javax.servlet.ServletOutputStream
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponseWrapper
;
public
class
GenericResponseWrapper
extends
HttpServletResponseWrapper
{
private
ByteArrayOutputStream
output
;
private
int
contentLength
;
private
String
contentType
;
public
GenericResponseWrapper
(
HttpServletResponse
response
)
{
super
(
response
);
output
=
new
ByteArrayOutputStream
();
}
public
byte
[]
getData
()
{
return
output
.
toByteArray
();
}
@Override
public
ServletOutputStream
getOutputStream
()
{
return
new
FilterServletOutputStream
(
output
);
}
@Override
public
PrintWriter
getWriter
()
{
return
new
PrintWriter
(
getOutputStream
(),
true
);
}
@Override
public
void
setContentLength
(
int
length
)
{
this
.
contentLength
=
length
;
super
.
setContentLength
(
length
);
}
public
int
getContentLength
()
{
return
contentLength
;
}
@Override
public
void
setContentType
(
String
type
)
{
this
.
contentType
=
type
;
super
.
setContentType
(
type
);
}
@Override
public
String
getContentType
()
{
return
contentType
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/rest/servlet/JsonpCallbackFilter.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.rest.servlet
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.util.Map
;
import
javax.servlet.Filter
;
import
javax.servlet.FilterChain
;
import
javax.servlet.FilterConfig
;
import
javax.servlet.ServletException
;
import
javax.servlet.ServletRequest
;
import
javax.servlet.ServletResponse
;
import
javax.servlet.annotation.WebFilter
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
@WebFilter
(
urlPatterns
={
"/act/service/*"
})
public
class
JsonpCallbackFilter
implements
Filter
{
private
static
Logger
log
=
LoggerFactory
.
getLogger
(
JsonpCallbackFilter
.
class
);
@Override
public
void
init
(
FilterConfig
fConfig
)
throws
ServletException
{}
@Override
public
void
doFilter
(
ServletRequest
request
,
ServletResponse
response
,
FilterChain
chain
)
throws
IOException
,
ServletException
{
HttpServletRequest
httpRequest
=
(
HttpServletRequest
)
request
;
HttpServletResponse
httpResponse
=
(
HttpServletResponse
)
response
;
@SuppressWarnings
(
"unchecked"
)
Map
<
String
,
String
[]>
parms
=
httpRequest
.
getParameterMap
();
if
(
parms
.
containsKey
(
"callback"
))
{
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"Wrapping response with JSONP callback '"
+
parms
.
get
(
"callback"
)[
0
]
+
"'"
);
}
OutputStream
out
=
httpResponse
.
getOutputStream
();
GenericResponseWrapper
wrapper
=
new
GenericResponseWrapper
(
httpResponse
);
chain
.
doFilter
(
request
,
wrapper
);
//handles the content-size truncation
ByteArrayOutputStream
outputStream
=
new
ByteArrayOutputStream
();
outputStream
.
write
(
new
String
(
parms
.
get
(
"callback"
)[
0
]
+
"("
).
getBytes
());
outputStream
.
write
(
wrapper
.
getData
());
outputStream
.
write
(
new
String
(
");"
).
getBytes
());
byte
[]
jsonpResponse
=
outputStream
.
toByteArray
();
wrapper
.
setContentType
(
"text/javascript;charset=UTF-8"
);
wrapper
.
setContentLength
(
jsonpResponse
.
length
);
out
.
write
(
jsonpResponse
);
out
.
close
();
}
else
{
chain
.
doFilter
(
request
,
response
);
}
}
@Override
public
void
destroy
()
{}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/ActModelService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://gitee.com/JeeHuangBingGui/jeeSpringCloud">JeeSpring</a> All rights reserved.
*/
package
com.jeespring.modules.act.service
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.UnsupportedEncodingException
;
import
java.util.List
;
import
javax.servlet.http.HttpServletResponse
;
import
org.activiti.bpmn.converter.BpmnXMLConverter
;
import
org.activiti.bpmn.model.BpmnModel
;
import
org.activiti.editor.constants.ModelDataJsonConstants
;
import
org.activiti.editor.language.json.converter.BpmnJsonConverter
;
import
org.activiti.engine.ActivitiException
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.repository.Deployment
;
import
org.activiti.engine.repository.Model
;
import
org.activiti.engine.repository.ModelQuery
;
import
org.activiti.engine.repository.ProcessDefinition
;
import
org.apache.commons.io.IOUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.node.ObjectNode
;
import
com.jeespring.common.persistence.Page
;
import
com.jeespring.common.service.AbstractService
;
/**
* 流程模型相关Controller
* @author JeeSpring
* @version 2013-11-03
*/
@Service
@Transactional
(
readOnly
=
true
)
public
class
ActModelService
extends
AbstractService
{
@Autowired
private
RepositoryService
repositoryService
;
// @Autowired
// private ObjectMapper objectMapper;
protected
ObjectMapper
objectMapper
=
new
ObjectMapper
();
/**
* 流程模型列表
*/
public
Page
<
Model
>
modelList
(
Page
<
Model
>
page
,
String
category
)
{
ModelQuery
modelQuery
=
repositoryService
.
createModelQuery
().
latestVersion
().
orderByLastUpdateTime
().
desc
();
if
(
StringUtils
.
isNotEmpty
(
category
)){
modelQuery
.
modelCategory
(
category
);
}
page
.
setCount
(
modelQuery
.
count
());
page
.
setList
(
modelQuery
.
listPage
(
page
.
getFirstResult
(),
page
.
getMaxResults
()));
return
page
;
}
/**
* 创建模型
* @throws UnsupportedEncodingException
*/
@Transactional
(
readOnly
=
false
)
public
Model
create
(
String
name
,
String
key
,
String
description
,
String
category
)
throws
UnsupportedEncodingException
{
ObjectNode
editorNode
=
objectMapper
.
createObjectNode
();
editorNode
.
put
(
"id"
,
"canvas"
);
editorNode
.
put
(
"resourceId"
,
"canvas"
);
ObjectNode
properties
=
objectMapper
.
createObjectNode
();
properties
.
put
(
"process_author"
,
"jeesite"
);
editorNode
.
put
(
"properties"
,
properties
);
ObjectNode
stencilset
=
objectMapper
.
createObjectNode
();
stencilset
.
put
(
"namespace"
,
"http://b3mn.org/stencilset/bpmn2.0#"
);
editorNode
.
put
(
"stencilset"
,
stencilset
);
Model
modelData
=
repositoryService
.
newModel
();
description
=
StringUtils
.
defaultString
(
description
);
modelData
.
setKey
(
StringUtils
.
defaultString
(
key
));
modelData
.
setName
(
name
);
modelData
.
setCategory
(
category
);
modelData
.
setVersion
(
Integer
.
parseInt
(
String
.
valueOf
(
repositoryService
.
createModelQuery
().
modelKey
(
modelData
.
getKey
()).
count
()+
1
)));
ObjectNode
modelObjectNode
=
objectMapper
.
createObjectNode
();
modelObjectNode
.
put
(
ModelDataJsonConstants
.
MODEL_NAME
,
name
);
modelObjectNode
.
put
(
ModelDataJsonConstants
.
MODEL_REVISION
,
modelData
.
getVersion
());
modelObjectNode
.
put
(
ModelDataJsonConstants
.
MODEL_DESCRIPTION
,
description
);
modelData
.
setMetaInfo
(
modelObjectNode
.
toString
());
repositoryService
.
saveModel
(
modelData
);
repositoryService
.
addModelEditorSource
(
modelData
.
getId
(),
editorNode
.
toString
().
getBytes
(
"utf-8"
));
return
modelData
;
}
/**
* 根据Model部署流程
*/
@Transactional
(
readOnly
=
false
)
public
String
deploy
(
String
id
)
{
String
message
=
""
;
try
{
Model
modelData
=
repositoryService
.
getModel
(
id
);
BpmnJsonConverter
jsonConverter
=
new
BpmnJsonConverter
();
JsonNode
editorNode
=
new
ObjectMapper
().
readTree
(
repositoryService
.
getModelEditorSource
(
modelData
.
getId
()));
BpmnModel
bpmnModel
=
jsonConverter
.
convertToBpmnModel
(
editorNode
);
BpmnXMLConverter
xmlConverter
=
new
BpmnXMLConverter
();
byte
[]
bpmnBytes
=
xmlConverter
.
convertToXML
(
bpmnModel
);
String
processName
=
modelData
.
getName
();
if
(!
StringUtils
.
endsWith
(
processName
,
".bpmn20.xml"
)){
processName
+=
".bpmn20.xml"
;
}
// System.out.println("========="+processName+"============"+modelData.getName());
ByteArrayInputStream
in
=
new
ByteArrayInputStream
(
bpmnBytes
);
Deployment
deployment
=
repositoryService
.
createDeployment
().
name
(
modelData
.
getName
())
.
addInputStream
(
processName
,
in
).
deploy
();
// .addString(processName, new String(bpmnBytes)).deploy();
// 设置流程分类
List
<
ProcessDefinition
>
list
=
repositoryService
.
createProcessDefinitionQuery
().
deploymentId
(
deployment
.
getId
()).
list
();
for
(
ProcessDefinition
processDefinition
:
list
)
{
repositoryService
.
setProcessDefinitionCategory
(
processDefinition
.
getId
(),
modelData
.
getCategory
());
message
=
"部署成功,流程ID="
+
processDefinition
.
getId
();
}
if
(
list
.
size
()
==
0
){
message
=
"部署失败,没有流程。"
;
}
}
catch
(
Exception
e
)
{
throw
new
ActivitiException
(
"设计模型图不正确,检查模型正确性,模型ID="
+
id
,
e
);
}
return
message
;
}
/**
* 导出model的xml文件
* @throws IOException
* @throws JsonProcessingException
*/
public
void
export
(
String
id
,
HttpServletResponse
response
)
{
try
{
Model
modelData
=
repositoryService
.
getModel
(
id
);
BpmnJsonConverter
jsonConverter
=
new
BpmnJsonConverter
();
JsonNode
editorNode
=
new
ObjectMapper
().
readTree
(
repositoryService
.
getModelEditorSource
(
modelData
.
getId
()));
BpmnModel
bpmnModel
=
jsonConverter
.
convertToBpmnModel
(
editorNode
);
BpmnXMLConverter
xmlConverter
=
new
BpmnXMLConverter
();
byte
[]
bpmnBytes
=
xmlConverter
.
convertToXML
(
bpmnModel
);
ByteArrayInputStream
in
=
new
ByteArrayInputStream
(
bpmnBytes
);
IOUtils
.
copy
(
in
,
response
.
getOutputStream
());
String
filename
=
bpmnModel
.
getMainProcess
().
getId
()
+
".bpmn20.xml"
;
response
.
setHeader
(
"Content-Disposition"
,
"attachment; filename="
+
filename
);
response
.
flushBuffer
();
}
catch
(
Exception
e
)
{
throw
new
ActivitiException
(
"导出model的xml文件失败,模型ID="
+
id
,
e
);
}
}
/**
* 更新Model分类
*/
@Transactional
(
readOnly
=
false
)
public
void
updateCategory
(
String
id
,
String
category
)
{
Model
modelData
=
repositoryService
.
getModel
(
id
);
modelData
.
setCategory
(
category
);
repositoryService
.
saveModel
(
modelData
);
}
/**
* 删除模型
* @param id
* @return
*/
@Transactional
(
readOnly
=
false
)
public
void
delete
(
String
id
)
{
repositoryService
.
deleteModel
(
id
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/ActProcessService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://gitee.com/JeeHuangBingGui/jeeSpringCloud">JeeSpring</a> All rights reserved.
*/
package
com.jeespring.modules.act.service
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.UnsupportedEncodingException
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.zip.ZipInputStream
;
import
javax.xml.stream.XMLInputFactory
;
import
javax.xml.stream.XMLStreamException
;
import
javax.xml.stream.XMLStreamReader
;
import
org.activiti.bpmn.converter.BpmnXMLConverter
;
import
org.activiti.bpmn.model.BpmnModel
;
import
org.activiti.editor.constants.ModelDataJsonConstants
;
import
org.activiti.editor.language.json.converter.BpmnJsonConverter
;
import
org.activiti.engine.ActivitiException
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.RuntimeService
;
import
org.activiti.engine.repository.Deployment
;
import
org.activiti.engine.repository.ProcessDefinition
;
import
org.activiti.engine.repository.ProcessDefinitionQuery
;
import
org.activiti.engine.runtime.ProcessInstance
;
import
org.activiti.engine.runtime.ProcessInstanceQuery
;
import
org.apache.commons.io.FileUtils
;
import
org.apache.commons.io.FilenameUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.multipart.MultipartFile
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.node.ObjectNode
;
import
com.jeespring.common.persistence.Page
;
import
com.jeespring.common.service.AbstractService
;
import
com.jeespring.common.utils.StringUtils
;
/**
* 流程定义相关Controller
* @author JeeSpring
* @version 2013-11-03
*/
@Service
@Transactional
(
readOnly
=
true
)
public
class
ActProcessService
extends
AbstractService
{
@Autowired
private
RepositoryService
repositoryService
;
@Autowired
private
RuntimeService
runtimeService
;
/**
* 流程定义列表
*/
public
Page
<
Object
[]>
processList
(
Page
<
Object
[]>
page
,
String
category
)
{
ProcessDefinitionQuery
processDefinitionQuery
=
repositoryService
.
createProcessDefinitionQuery
()
.
latestVersion
().
orderByProcessDefinitionKey
().
asc
();
if
(
StringUtils
.
isNotEmpty
(
category
)){
processDefinitionQuery
.
processDefinitionCategory
(
category
);
}
page
.
setCount
(
processDefinitionQuery
.
count
());
List
<
ProcessDefinition
>
processDefinitionList
=
processDefinitionQuery
.
listPage
(
page
.
getFirstResult
(),
page
.
getMaxResults
());
for
(
ProcessDefinition
processDefinition
:
processDefinitionList
)
{
String
deploymentId
=
processDefinition
.
getDeploymentId
();
Deployment
deployment
=
repositoryService
.
createDeploymentQuery
().
deploymentId
(
deploymentId
).
singleResult
();
page
.
getList
().
add
(
new
Object
[]{
processDefinition
,
deployment
});
}
return
page
;
}
/**
* 流程定义列表
*/
public
Page
<
ProcessInstance
>
runningList
(
Page
<
ProcessInstance
>
page
,
String
procInsId
,
String
procDefKey
)
{
ProcessInstanceQuery
processInstanceQuery
=
runtimeService
.
createProcessInstanceQuery
();
if
(
StringUtils
.
isNotBlank
(
procInsId
)){
processInstanceQuery
.
processInstanceId
(
procInsId
);
}
if
(
StringUtils
.
isNotBlank
(
procDefKey
)){
processInstanceQuery
.
processDefinitionKey
(
procDefKey
);
}
page
.
setCount
(
processInstanceQuery
.
count
());
page
.
setList
(
processInstanceQuery
.
listPage
(
page
.
getFirstResult
(),
page
.
getMaxResults
()));
return
page
;
}
/**
* 读取资源,通过部署ID
* @param processDefinitionId 流程定义ID
* @param processInstanceId 流程实例ID
* @param resourceType 资源类型(xml|image)
*/
public
InputStream
resourceRead
(
String
procDefId
,
String
proInsId
,
String
resType
)
throws
Exception
{
if
(
StringUtils
.
isBlank
(
procDefId
)){
ProcessInstance
processInstance
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
proInsId
).
singleResult
();
procDefId
=
processInstance
.
getProcessDefinitionId
();
}
ProcessDefinition
processDefinition
=
repositoryService
.
createProcessDefinitionQuery
().
processDefinitionId
(
procDefId
).
singleResult
();
String
resourceName
=
""
;
if
(
"image"
.
equals
(
resType
))
{
resourceName
=
processDefinition
.
getDiagramResourceName
();
}
else
if
(
"xml"
.
equals
(
resType
))
{
resourceName
=
processDefinition
.
getResourceName
();
}
InputStream
resourceAsStream
=
repositoryService
.
getResourceAsStream
(
processDefinition
.
getDeploymentId
(),
resourceName
);
return
resourceAsStream
;
}
/**
* 部署流程 - 保存
* @param file
* @return
*/
@Transactional
(
readOnly
=
false
)
public
String
deploy
(
String
exportDir
,
String
category
,
MultipartFile
file
)
{
String
message
=
""
;
String
fileName
=
file
.
getOriginalFilename
();
try
{
InputStream
fileInputStream
=
file
.
getInputStream
();
Deployment
deployment
;
String
extension
=
FilenameUtils
.
getExtension
(
fileName
);
if
(
"zip"
.
equals
(
extension
)
||
"bar"
.
equals
(
extension
))
{
ZipInputStream
zip
=
new
ZipInputStream
(
fileInputStream
);
deployment
=
repositoryService
.
createDeployment
().
addZipInputStream
(
zip
).
deploy
();
}
else
if
(
"png"
.
equals
(
extension
))
{
deployment
=
repositoryService
.
createDeployment
().
addInputStream
(
fileName
,
fileInputStream
).
deploy
();
}
else
if
(
fileName
.
indexOf
(
"bpmn20.xml"
)
!=
-
1
)
{
deployment
=
repositoryService
.
createDeployment
().
addInputStream
(
fileName
,
fileInputStream
).
deploy
();
}
else
if
(
"bpmn"
.
equals
(
extension
))
{
// bpmn扩展名特殊处理,转换为bpmn20.xml
String
baseName
=
FilenameUtils
.
getBaseName
(
fileName
);
deployment
=
repositoryService
.
createDeployment
().
addInputStream
(
baseName
+
".bpmn20.xml"
,
fileInputStream
).
deploy
();
}
else
{
message
=
"不支持的文件类型:"
+
extension
;
return
message
;
}
List
<
ProcessDefinition
>
list
=
repositoryService
.
createProcessDefinitionQuery
().
deploymentId
(
deployment
.
getId
()).
list
();
// 设置流程分类
for
(
ProcessDefinition
processDefinition
:
list
)
{
// ActUtils.exportDiagramToFile(repositoryService, processDefinition, exportDir);
repositoryService
.
setProcessDefinitionCategory
(
processDefinition
.
getId
(),
category
);
message
+=
"部署成功,流程ID="
+
processDefinition
.
getId
()
+
"<br/>"
;
}
if
(
list
.
size
()
==
0
){
message
=
"部署失败,没有流程。"
;
}
}
catch
(
Exception
e
)
{
throw
new
ActivitiException
(
"部署失败!"
,
e
);
}
return
message
;
}
/**
* 设置流程分类
*/
@Transactional
(
readOnly
=
false
)
public
void
updateCategory
(
String
procDefId
,
String
category
)
{
repositoryService
.
setProcessDefinitionCategory
(
procDefId
,
category
);
}
/**
* 挂起、激活流程实例
*/
@Transactional
(
readOnly
=
false
)
public
String
updateState
(
String
state
,
String
procDefId
)
{
if
(
"active"
.
equals
(
state
))
{
repositoryService
.
activateProcessDefinitionById
(
procDefId
,
true
,
null
);
return
"已激活ID为["
+
procDefId
+
"]的流程定义。"
;
}
else
if
(
"suspend"
.
equals
(
state
))
{
repositoryService
.
suspendProcessDefinitionById
(
procDefId
,
true
,
null
);
return
"已挂起ID为["
+
procDefId
+
"]的流程定义。"
;
}
return
"无操作"
;
}
/**
* 将部署的流程转换为模型
* @param procDefId
* @throws UnsupportedEncodingException
* @throws XMLStreamException
*/
@Transactional
(
readOnly
=
false
)
public
org
.
activiti
.
engine
.
repository
.
Model
convertToModel
(
String
procDefId
)
throws
UnsupportedEncodingException
,
XMLStreamException
{
ProcessDefinition
processDefinition
=
repositoryService
.
createProcessDefinitionQuery
().
processDefinitionId
(
procDefId
).
singleResult
();
InputStream
bpmnStream
=
repositoryService
.
getResourceAsStream
(
processDefinition
.
getDeploymentId
(),
processDefinition
.
getResourceName
());
XMLInputFactory
xif
=
XMLInputFactory
.
newInstance
();
InputStreamReader
in
=
new
InputStreamReader
(
bpmnStream
,
"UTF-8"
);
XMLStreamReader
xtr
=
xif
.
createXMLStreamReader
(
in
);
BpmnModel
bpmnModel
=
new
BpmnXMLConverter
().
convertToBpmnModel
(
xtr
);
BpmnJsonConverter
converter
=
new
BpmnJsonConverter
();
ObjectNode
modelNode
=
converter
.
convertToJson
(
bpmnModel
);
org
.
activiti
.
engine
.
repository
.
Model
modelData
=
repositoryService
.
newModel
();
modelData
.
setKey
(
processDefinition
.
getKey
());
modelData
.
setName
(
processDefinition
.
getResourceName
());
modelData
.
setCategory
(
processDefinition
.
getCategory
());
//.getDeploymentId());
modelData
.
setDeploymentId
(
processDefinition
.
getDeploymentId
());
modelData
.
setVersion
(
Integer
.
parseInt
(
String
.
valueOf
(
repositoryService
.
createModelQuery
().
modelKey
(
modelData
.
getKey
()).
count
()+
1
)));
ObjectNode
modelObjectNode
=
new
ObjectMapper
().
createObjectNode
();
modelObjectNode
.
put
(
ModelDataJsonConstants
.
MODEL_NAME
,
processDefinition
.
getName
());
modelObjectNode
.
put
(
ModelDataJsonConstants
.
MODEL_REVISION
,
modelData
.
getVersion
());
modelObjectNode
.
put
(
ModelDataJsonConstants
.
MODEL_DESCRIPTION
,
processDefinition
.
getDescription
());
modelData
.
setMetaInfo
(
modelObjectNode
.
toString
());
repositoryService
.
saveModel
(
modelData
);
repositoryService
.
addModelEditorSource
(
modelData
.
getId
(),
modelNode
.
toString
().
getBytes
(
"utf-8"
));
return
modelData
;
}
/**
* 导出图片文件到硬盘
*/
public
List
<
String
>
exportDiagrams
(
String
exportDir
)
throws
IOException
{
List
<
String
>
files
=
new
ArrayList
<
String
>();
List
<
ProcessDefinition
>
list
=
repositoryService
.
createProcessDefinitionQuery
().
list
();
for
(
ProcessDefinition
processDefinition
:
list
)
{
String
diagramResourceName
=
processDefinition
.
getDiagramResourceName
();
String
key
=
processDefinition
.
getKey
();
int
version
=
processDefinition
.
getVersion
();
String
diagramPath
=
""
;
InputStream
resourceAsStream
=
repositoryService
.
getResourceAsStream
(
processDefinition
.
getDeploymentId
(),
diagramResourceName
);
byte
[]
b
=
new
byte
[
resourceAsStream
.
available
()];
@SuppressWarnings
(
"unused"
)
int
len
=
-
1
;
resourceAsStream
.
read
(
b
,
0
,
b
.
length
);
// create file if not exist
String
diagramDir
=
exportDir
+
"/"
+
key
+
"/"
+
version
;
File
diagramDirFile
=
new
File
(
diagramDir
);
if
(!
diagramDirFile
.
exists
())
{
diagramDirFile
.
mkdirs
();
}
diagramPath
=
diagramDir
+
"/"
+
diagramResourceName
;
File
file
=
new
File
(
diagramPath
);
// 文件存在退出
if
(
file
.
exists
())
{
// 文件大小相同时直接返回否则重新创建文件(可能损坏)
logger
.
debug
(
"diagram exist, ignore... : {}"
,
diagramPath
);
files
.
add
(
diagramPath
);
}
else
{
file
.
createNewFile
();
logger
.
debug
(
"export diagram to : {}"
,
diagramPath
);
// wirte bytes to file
FileUtils
.
writeByteArrayToFile
(
file
,
b
,
true
);
files
.
add
(
diagramPath
);
}
}
return
files
;
}
/**
* 删除部署的流程,级联删除流程实例
* @param deploymentId 流程部署ID
*/
@Transactional
(
readOnly
=
false
)
public
void
deleteDeployment
(
String
deploymentId
)
{
repositoryService
.
deleteDeployment
(
deploymentId
,
true
);
}
/**
* 删除部署的流程实例
* @param procInsId 流程实例ID
* @param deleteReason 删除原因,可为空
*/
@Transactional
(
readOnly
=
false
)
public
void
deleteProcIns
(
String
procInsId
,
String
deleteReason
)
{
runtimeService
.
deleteProcessInstance
(
procInsId
,
deleteReason
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/ActTaskService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://gitee.com/JeeHuangBingGui/jeeSpringCloud">JeeSpring</a> All rights reserved.
*/
package
com.jeespring.modules.act.service
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
org.activiti.bpmn.model.BpmnModel
;
import
org.activiti.engine.FormService
;
import
org.activiti.engine.HistoryService
;
import
org.activiti.engine.IdentityService
;
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.Expression
;
import
org.activiti.engine.history.HistoricActivityInstance
;
import
org.activiti.engine.history.HistoricProcessInstance
;
import
org.activiti.engine.history.HistoricTaskInstance
;
import
org.activiti.engine.history.HistoricTaskInstanceQuery
;
import
org.activiti.engine.impl.RepositoryServiceImpl
;
import
org.activiti.engine.impl.RuntimeServiceImpl
;
import
org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior
;
import
org.activiti.engine.impl.context.Context
;
import
org.activiti.engine.impl.identity.Authentication
;
import
org.activiti.engine.impl.interceptor.CommandExecutor
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.persistence.entity.TaskEntity
;
import
org.activiti.engine.impl.pvm.delegate.ActivityBehavior
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.impl.task.TaskDefinition
;
import
org.activiti.engine.repository.Deployment
;
import
org.activiti.engine.repository.ProcessDefinition
;
import
org.activiti.engine.repository.ProcessDefinitionQuery
;
import
org.activiti.engine.runtime.Execution
;
import
org.activiti.engine.runtime.ProcessInstance
;
import
org.activiti.engine.task.Comment
;
import
org.activiti.engine.task.Task
;
import
org.activiti.engine.task.TaskQuery
;
import
org.activiti.spring.ProcessEngineFactoryBean
;
import
org.apache.commons.beanutils.PropertyUtils
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.jeespring.common.persistence.Page
;
import
com.jeespring.common.service.AbstractService
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.modules.act.dao.ActDao
;
import
com.jeespring.modules.act.entity.Act
;
import
com.jeespring.modules.act.service.cmd.CreateAndTakeTransitionCmd
;
import
com.jeespring.modules.act.service.cmd.JumpTaskCmd
;
import
com.jeespring.modules.act.service.creator.ChainedActivitiesCreator
;
import
com.jeespring.modules.act.service.creator.MultiInstanceActivityCreator
;
import
com.jeespring.modules.act.service.creator.RuntimeActivityDefinitionEntityIntepreter
;
import
com.jeespring.modules.act.service.creator.SimpleRuntimeActivityDefinitionEntity
;
import
com.jeespring.modules.act.utils.ActUtils
;
import
com.jeespring.modules.act.utils.ProcessDefCache
;
import
com.jeespring.modules.act.utils.ProcessDefUtils
;
import
com.jeespring.modules.sys.entity.User
;
import
com.jeespring.modules.sys.utils.UserUtils
;
/**
* 流程定义相关Service
* @author JeeSpring
* @version 2013-11-03
*/
@Service
@Transactional
(
readOnly
=
true
)
public
class
ActTaskService
extends
AbstractService
{
@Autowired
private
ActDao
actDao
;
@Autowired
private
ProcessEngineFactoryBean
processEngineFactory
;
@Autowired
private
ProcessEngine
processEngine
;
@Autowired
private
RuntimeService
runtimeService
;
@Autowired
private
TaskService
taskService
;
@Autowired
private
FormService
formService
;
@Autowired
private
HistoryService
historyService
;
@Autowired
private
RepositoryService
repositoryService
;
@Autowired
private
IdentityService
identityService
;
/**
* 获取待办列表
* @param procDefKey 流程定义标识
* @return
*/
public
List
<
Act
>
todoList
(
Act
act
){
String
userId
=
UserUtils
.
getUser
().
getLoginName
();
//ObjectUtils.toString(UserUtils.getUser().getId());
List
<
Act
>
result
=
new
ArrayList
<
Act
>();
// =============== 已经签收的任务 ===============
TaskQuery
todoTaskQuery
=
taskService
.
createTaskQuery
().
taskAssignee
(
userId
).
active
()
.
includeProcessVariables
().
orderByTaskCreateTime
().
desc
();
// 设置查询条件
if
(
StringUtils
.
isNotBlank
(
act
.
getProcDefKey
())){
todoTaskQuery
.
processDefinitionKey
(
act
.
getProcDefKey
());
}
if
(
act
.
getBeginDate
()
!=
null
){
todoTaskQuery
.
taskCreatedAfter
(
act
.
getBeginDate
());
}
if
(
act
.
getEndDate
()
!=
null
){
todoTaskQuery
.
taskCreatedBefore
(
act
.
getEndDate
());
}
// 查询列表
List
<
Task
>
todoList
=
todoTaskQuery
.
list
();
for
(
Task
task
:
todoList
)
{
Act
e
=
new
Act
();
e
.
setTask
(
task
);
e
.
setVars
(
task
.
getProcessVariables
());
// e.setTaskVars(task.getTaskLocalVariables());
// System.out.println(task.getId()+" = "+task.getProcessVariables() + " ========== " + task.getTaskLocalVariables());
e
.
setProcDef
(
ProcessDefCache
.
get
(
task
.
getProcessDefinitionId
()));
// e.setProcIns(runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult());
// e.setProcExecUrl(ActUtils.getProcExeUrl(task.getProcessDefinitionId()));
e
.
setStatus
(
"todo"
);
result
.
add
(
e
);
}
// =============== 等待签收的任务 ===============
TaskQuery
toClaimQuery
=
taskService
.
createTaskQuery
().
taskCandidateUser
(
userId
)
.
includeProcessVariables
().
active
().
orderByTaskCreateTime
().
desc
();
// 设置查询条件
if
(
StringUtils
.
isNotBlank
(
act
.
getProcDefKey
())){
toClaimQuery
.
processDefinitionKey
(
act
.
getProcDefKey
());
}
if
(
act
.
getBeginDate
()
!=
null
){
toClaimQuery
.
taskCreatedAfter
(
act
.
getBeginDate
());
}
if
(
act
.
getEndDate
()
!=
null
){
toClaimQuery
.
taskCreatedBefore
(
act
.
getEndDate
());
}
// 查询列表
List
<
Task
>
toClaimList
=
toClaimQuery
.
list
();
for
(
Task
task
:
toClaimList
)
{
Act
e
=
new
Act
();
e
.
setTask
(
task
);
e
.
setVars
(
task
.
getProcessVariables
());
// e.setTaskVars(task.getTaskLocalVariables());
// System.out.println(task.getId()+" = "+task.getProcessVariables() + " ========== " + task.getTaskLocalVariables());
e
.
setProcDef
(
ProcessDefCache
.
get
(
task
.
getProcessDefinitionId
()));
// e.setProcIns(runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult());
// e.setProcExecUrl(ActUtils.getProcExeUrl(task.getProcessDefinitionId()));
e
.
setStatus
(
"claim"
);
result
.
add
(
e
);
}
return
result
;
}
/**
* 获取已办任务
* @param page
* @param procDefKey 流程定义标识
* @return
*/
public
Page
<
Act
>
historicList
(
Page
<
Act
>
page
,
Act
act
){
String
userId
=
UserUtils
.
getUser
().
getLoginName
();
//ObjectUtils.toString(UserUtils.getUser().getId());
HistoricTaskInstanceQuery
histTaskQuery
=
historyService
.
createHistoricTaskInstanceQuery
().
taskAssignee
(
userId
).
finished
()
.
includeProcessVariables
().
orderByHistoricTaskInstanceEndTime
().
desc
();
// 设置查询条件
if
(
StringUtils
.
isNotBlank
(
act
.
getProcDefKey
())){
histTaskQuery
.
processDefinitionKey
(
act
.
getProcDefKey
());
}
if
(
act
.
getBeginDate
()
!=
null
){
histTaskQuery
.
taskCompletedAfter
(
act
.
getBeginDate
());
}
if
(
act
.
getEndDate
()
!=
null
){
histTaskQuery
.
taskCompletedBefore
(
act
.
getEndDate
());
}
// 查询总数
page
.
setCount
(
histTaskQuery
.
count
());
// 查询列表
List
<
HistoricTaskInstance
>
histList
=
histTaskQuery
.
listPage
(
page
.
getFirstResult
(),
page
.
getMaxResults
());
//处理分页问题
List
<
Act
>
actList
=
Lists
.
newArrayList
();
for
(
HistoricTaskInstance
histTask
:
histList
)
{
Act
e
=
new
Act
();
e
.
setHistTask
(
histTask
);
e
.
setVars
(
histTask
.
getProcessVariables
());
// e.setTaskVars(histTask.getTaskLocalVariables());
// System.out.println(histTask.getId()+" = "+histTask.getProcessVariables() + " ========== " + histTask.getTaskLocalVariables());
e
.
setProcDef
(
ProcessDefCache
.
get
(
histTask
.
getProcessDefinitionId
()));
// e.setProcIns(runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult());
// e.setProcExecUrl(ActUtils.getProcExeUrl(task.getProcessDefinitionId()));
e
.
setStatus
(
"finish"
);
actList
.
add
(
e
);
//page.getList().add(e);
}
page
.
setList
(
actList
);
return
page
;
}
/**
* 获取流转历史列表
* @param procInsId 流程实例
* @param startAct 开始活动节点名称
* @param endAct 结束活动节点名称
*/
public
List
<
Act
>
histoicFlowList
(
String
procInsId
,
String
startAct
,
String
endAct
){
List
<
Act
>
actList
=
Lists
.
newArrayList
();
List
<
HistoricActivityInstance
>
list
=
historyService
.
createHistoricActivityInstanceQuery
().
processInstanceId
(
procInsId
)
.
orderByHistoricActivityInstanceStartTime
().
asc
().
orderByHistoricActivityInstanceEndTime
().
asc
().
list
();
boolean
start
=
false
;
Map
<
String
,
Integer
>
actMap
=
Maps
.
newHashMap
();
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++){
HistoricActivityInstance
histIns
=
list
.
get
(
i
);
// 过滤开始节点前的节点
if
(
StringUtils
.
isNotBlank
(
startAct
)
&&
startAct
.
equals
(
histIns
.
getActivityId
())){
start
=
true
;
}
if
(
StringUtils
.
isNotBlank
(
startAct
)
&&
!
start
){
continue
;
}
// 只显示开始节点和结束节点,并且执行人不为空的任务
if
(
StringUtils
.
isNotBlank
(
histIns
.
getAssignee
())
||
"startEvent"
.
equals
(
histIns
.
getActivityType
())
||
"endEvent"
.
equals
(
histIns
.
getActivityType
())){
// 给节点增加一个序号
Integer
actNum
=
actMap
.
get
(
histIns
.
getActivityId
());
if
(
actNum
==
null
){
actMap
.
put
(
histIns
.
getActivityId
(),
actMap
.
size
());
}
Act
e
=
new
Act
();
e
.
setHistIns
(
histIns
);
// 获取流程发起人名称
if
(
"startEvent"
.
equals
(
histIns
.
getActivityType
())){
List
<
HistoricProcessInstance
>
il
=
historyService
.
createHistoricProcessInstanceQuery
().
processInstanceId
(
procInsId
).
orderByProcessInstanceStartTime
().
asc
().
list
();
// List<HistoricIdentityLink> il = historyService.getHistoricIdentityLinksForProcessInstance(procInsId);
if
(
il
.
size
()
>
0
){
if
(
StringUtils
.
isNotBlank
(
il
.
get
(
0
).
getStartUserId
())){
User
user
=
UserUtils
.
getByLoginName
(
il
.
get
(
0
).
getStartUserId
());
if
(
user
!=
null
){
e
.
setAssignee
(
histIns
.
getAssignee
());
e
.
setAssigneeName
(
user
.
getName
());
}
}
}
}
// 获取任务执行人名称
if
(
StringUtils
.
isNotEmpty
(
histIns
.
getAssignee
())){
User
user
=
UserUtils
.
getByLoginName
(
histIns
.
getAssignee
());
if
(
user
!=
null
){
e
.
setAssignee
(
histIns
.
getAssignee
());
e
.
setAssigneeName
(
user
.
getName
());
}
}
// 获取意见评论内容
if
(
StringUtils
.
isNotBlank
(
histIns
.
getTaskId
())){
List
<
Comment
>
commentList
=
taskService
.
getTaskComments
(
histIns
.
getTaskId
());
if
(
commentList
.
size
()>
0
){
e
.
setComment
(
commentList
.
get
(
0
).
getFullMessage
());
}
}
actList
.
add
(
e
);
}
// 过滤结束节点后的节点
if
(
StringUtils
.
isNotBlank
(
endAct
)
&&
endAct
.
equals
(
histIns
.
getActivityId
())){
boolean
bl
=
false
;
Integer
actNum
=
actMap
.
get
(
histIns
.
getActivityId
());
// 该活动节点,后续节点是否在结束节点之前,在后续节点中是否存在
for
(
int
j
=
i
+
1
;
j
<
list
.
size
();
j
++){
HistoricActivityInstance
hi
=
list
.
get
(
j
);
Integer
actNumA
=
actMap
.
get
(
hi
.
getActivityId
());
if
((
actNumA
!=
null
&&
actNumA
<
actNum
)
||
StringUtils
.
equals
(
hi
.
getActivityId
(),
histIns
.
getActivityId
())){
bl
=
true
;
}
}
if
(!
bl
){
break
;
}
}
}
return
actList
;
}
/**
* 获取流程列表
* @param category 流程分类
*/
public
Page
<
Object
[]>
processList
(
Page
<
Object
[]>
page
,
String
category
)
{
/*
* 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
*/
ProcessDefinitionQuery
processDefinitionQuery
=
repositoryService
.
createProcessDefinitionQuery
()
.
latestVersion
().
active
().
orderByProcessDefinitionKey
().
asc
();
if
(
StringUtils
.
isNotEmpty
(
category
)){
processDefinitionQuery
.
processDefinitionCategory
(
category
);
}
page
.
setCount
(
processDefinitionQuery
.
count
());
List
<
ProcessDefinition
>
processDefinitionList
=
processDefinitionQuery
.
listPage
(
page
.
getFirstResult
(),
page
.
getMaxResults
());
for
(
ProcessDefinition
processDefinition
:
processDefinitionList
)
{
String
deploymentId
=
processDefinition
.
getDeploymentId
();
Deployment
deployment
=
repositoryService
.
createDeploymentQuery
().
deploymentId
(
deploymentId
).
singleResult
();
page
.
getList
().
add
(
new
Object
[]{
processDefinition
,
deployment
});
}
return
page
;
}
/**
* 获取流程表单(首先获取任务节点表单KEY,如果没有则取流程开始节点表单KEY)
* @return
*/
public
String
getFormKey
(
String
procDefId
,
String
taskDefKey
){
String
formKey
=
""
;
if
(
StringUtils
.
isNotBlank
(
procDefId
)){
if
(
StringUtils
.
isNotBlank
(
taskDefKey
)){
try
{
formKey
=
formService
.
getTaskFormKey
(
procDefId
,
taskDefKey
);
}
catch
(
Exception
e
)
{
formKey
=
""
;
}
}
if
(
StringUtils
.
isBlank
(
formKey
)){
formKey
=
formService
.
getStartFormKey
(
procDefId
);
}
if
(
StringUtils
.
isBlank
(
formKey
)){
formKey
=
"/404"
;
}
}
logger
.
debug
(
"getFormKey: {}"
,
formKey
);
return
formKey
;
}
/**
* 获取流程实例对象
* @param procInsId
* @return
*/
@Transactional
(
readOnly
=
false
)
public
ProcessInstance
getProcIns
(
String
procInsId
)
{
return
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
procInsId
).
singleResult
();
}
/**
* 启动流程
* @param procDefKey 流程定义KEY
* @param businessTable 业务表表名
* @param businessId 业务表编号
* @return 流程实例ID
*/
@Transactional
(
readOnly
=
false
)
public
String
startProcess
(
String
procDefKey
,
String
businessTable
,
String
businessId
)
{
return
startProcess
(
procDefKey
,
businessTable
,
businessId
,
""
);
}
/**
* 启动流程
* @param procDefKey 流程定义KEY
* @param businessTable 业务表表名
* @param businessId 业务表编号
* @param title 流程标题,显示在待办任务标题
* @return 流程实例ID
*/
@Transactional
(
readOnly
=
false
)
public
String
startProcess
(
String
procDefKey
,
String
businessTable
,
String
businessId
,
String
title
)
{
Map
<
String
,
Object
>
vars
=
Maps
.
newHashMap
();
return
startProcess
(
procDefKey
,
businessTable
,
businessId
,
title
,
vars
);
}
/**
* 启动流程
* @param procDefKey 流程定义KEY
* @param businessTable 业务表表名
* @param businessId 业务表编号
* @param title 流程标题,显示在待办任务标题
* @param vars 流程变量
* @return 流程实例ID
*/
@Transactional
(
readOnly
=
false
)
public
String
startProcess
(
String
procDefKey
,
String
businessTable
,
String
businessId
,
String
title
,
Map
<
String
,
Object
>
vars
)
{
String
userId
=
UserUtils
.
getUser
().
getLoginName
();
//ObjectUtils.toString(UserUtils.getUser().getId())
// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
identityService
.
setAuthenticatedUserId
(
userId
);
// 设置流程变量
if
(
vars
==
null
){
vars
=
Maps
.
newHashMap
();
}
// 设置流程标题
if
(
StringUtils
.
isNotBlank
(
title
)){
vars
.
put
(
"title"
,
title
);
}
// 启动流程
ProcessInstance
procIns
=
runtimeService
.
startProcessInstanceByKey
(
procDefKey
,
businessTable
+
":"
+
businessId
,
vars
);
// 更新业务表流程实例ID
Act
act
=
new
Act
();
act
.
setBusinessTable
(
businessTable
);
// 业务表名
act
.
setBusinessId
(
businessId
);
// 业务表ID
act
.
setProcInsId
(
procIns
.
getId
());
actDao
.
updateProcInsIdByBusinessId
(
act
);
return
act
.
getProcInsId
();
}
/**
* 获取任务
* @param taskId 任务ID
*/
public
Task
getTask
(
String
taskId
){
return
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
}
/**
* 删除任务
* @param taskId 任务ID
* @param deleteReason 删除原因
*/
@Transactional
(
readOnly
=
false
)
public
void
deleteTask
(
String
taskId
,
String
deleteReason
){
taskService
.
deleteTask
(
taskId
,
deleteReason
);
}
/**
* 签收任务
* @param taskId 任务ID
* @param userId 签收用户ID(用户登录名)
*/
@Transactional
(
readOnly
=
false
)
public
void
claim
(
String
taskId
,
String
userId
){
taskService
.
claim
(
taskId
,
userId
);
}
/**
* 提交任务, 并保存意见
* @param taskId 任务ID
* @param procInsId 流程实例ID,如果为空,则不保存任务提交意见
* @param comment 任务提交意见的内容
* @param vars 任务变量
*/
@Transactional
(
readOnly
=
false
)
public
void
complete
(
String
taskId
,
String
procInsId
,
String
comment
,
Map
<
String
,
Object
>
vars
){
complete
(
taskId
,
procInsId
,
comment
,
""
,
vars
);
}
/**
* 提交任务, 并保存意见
* @param taskId 任务ID
* @param procInsId 流程实例ID,如果为空,则不保存任务提交意见
* @param comment 任务提交意见的内容
* @param title 流程标题,显示在待办任务标题
* @param vars 任务变量
*/
@Transactional
(
readOnly
=
false
)
public
void
complete
(
String
taskId
,
String
procInsId
,
String
comment
,
String
title
,
Map
<
String
,
Object
>
vars
){
// 添加意见
if
(
StringUtils
.
isNotBlank
(
procInsId
)
&&
StringUtils
.
isNotBlank
(
comment
)){
taskService
.
addComment
(
taskId
,
procInsId
,
comment
);
}
// 设置流程变量
if
(
vars
==
null
){
vars
=
Maps
.
newHashMap
();
}
// 设置流程标题
if
(
StringUtils
.
isNotBlank
(
title
)){
vars
.
put
(
"title"
,
title
);
}
// 提交任务
taskService
.
complete
(
taskId
,
vars
);
}
/**
* 完成第一个任务
* @param procInsId
*/
@Transactional
(
readOnly
=
false
)
public
void
completeFirstTask
(
String
procInsId
){
completeFirstTask
(
procInsId
,
null
,
null
,
null
);
}
/**
* 完成第一个任务
* @param procInsId
* @param comment
* @param title
* @param vars
*/
@Transactional
(
readOnly
=
false
)
public
void
completeFirstTask
(
String
procInsId
,
String
comment
,
String
title
,
Map
<
String
,
Object
>
vars
){
String
userId
=
UserUtils
.
getUser
().
getLoginName
();
Task
task
=
taskService
.
createTaskQuery
().
taskAssignee
(
userId
).
processInstanceId
(
procInsId
).
active
().
singleResult
();
if
(
task
!=
null
){
complete
(
task
.
getId
(),
procInsId
,
comment
,
title
,
vars
);
}
}
// /**
// * 委派任务
// * @param taskId 任务ID
// * @param userId 被委派人
// */
// public void delegateTask(String taskId, String userId){
// taskService.delegateTask(taskId, userId);
// }
//
// /**
// * 被委派人完成任务
// * @param taskId 任务ID
// */
// public void resolveTask(String taskId){
// taskService.resolveTask(taskId);
// }
//
// /**
// * 回退任务
// * @param taskId
// */
// public void backTask(String taskId){
// taskService.
// }
/**
* 添加任务意见
*/
public
void
addTaskComment
(
String
taskId
,
String
procInsId
,
String
comment
){
taskService
.
addComment
(
taskId
,
procInsId
,
comment
);
}
////////////////// 回退、前进、跳转、前加签、后加签、分裂 移植 https://github.com/bluejoe2008/openwebflow //////////////////////////////////////////////////
/**
* 任务后退一步
*/
public
void
taskBack
(
String
procInsId
,
Map
<
String
,
Object
>
variables
)
{
taskBack
(
getCurrentTask
(
procInsId
),
variables
);
}
/**
* 任务后退至指定活动
*/
public
void
taskBack
(
TaskEntity
currentTaskEntity
,
Map
<
String
,
Object
>
variables
)
{
ActivityImpl
activity
=
(
ActivityImpl
)
ProcessDefUtils
.
getActivity
(
processEngine
,
currentTaskEntity
.
getProcessDefinitionId
(),
currentTaskEntity
.
getTaskDefinitionKey
())
.
getIncomingTransitions
().
get
(
0
).
getSource
();
jumpTask
(
currentTaskEntity
,
activity
,
variables
);
}
/**
* 任务前进一步
*/
public
void
taskForward
(
String
procInsId
,
Map
<
String
,
Object
>
variables
)
{
taskForward
(
getCurrentTask
(
procInsId
),
variables
);
}
/**
* 任务前进至指定活动
*/
public
void
taskForward
(
TaskEntity
currentTaskEntity
,
Map
<
String
,
Object
>
variables
)
{
ActivityImpl
activity
=
(
ActivityImpl
)
ProcessDefUtils
.
getActivity
(
processEngine
,
currentTaskEntity
.
getProcessDefinitionId
(),
currentTaskEntity
.
getTaskDefinitionKey
())
.
getOutgoingTransitions
().
get
(
0
).
getDestination
();
jumpTask
(
currentTaskEntity
,
activity
,
variables
);
}
/**
* 跳转(包括回退和向前)至指定活动节点
*/
public
void
jumpTask
(
String
procInsId
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
)
{
jumpTask
(
getCurrentTask
(
procInsId
),
targetTaskDefinitionKey
,
variables
);
}
/**
* 跳转(包括回退和向前)至指定活动节点
*/
public
void
jumpTask
(
String
procInsId
,
String
currentTaskId
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
)
{
jumpTask
(
getTaskEntity
(
currentTaskId
),
targetTaskDefinitionKey
,
variables
);
}
/**
* 跳转(包括回退和向前)至指定活动节点
* @param currentTaskEntity 当前任务节点
* @param targetTaskDefinitionKey 目标任务节点(在模型定义里面的节点名称)
* @throws Exception
*/
public
void
jumpTask
(
TaskEntity
currentTaskEntity
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
)
{
ActivityImpl
activity
=
ProcessDefUtils
.
getActivity
(
processEngine
,
currentTaskEntity
.
getProcessDefinitionId
(),
targetTaskDefinitionKey
);
jumpTask
(
currentTaskEntity
,
activity
,
variables
);
}
/**
* 跳转(包括回退和向前)至指定活动节点
* @param currentTaskEntity 当前任务节点
* @param targetActivity 目标任务节点(在模型定义里面的节点名称)
* @throws Exception
*/
private
void
jumpTask
(
TaskEntity
currentTaskEntity
,
ActivityImpl
targetActivity
,
Map
<
String
,
Object
>
variables
)
{
CommandExecutor
commandExecutor
=
((
RuntimeServiceImpl
)
runtimeService
).
getCommandExecutor
();
commandExecutor
.
execute
(
new
JumpTaskCmd
(
currentTaskEntity
,
targetActivity
,
variables
));
}
/**
* 后加签
*/
@SuppressWarnings
(
"unchecked"
)
public
ActivityImpl
[]
insertTasksAfter
(
String
procDefId
,
String
procInsId
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
,
String
...
assignees
)
{
List
<
String
>
assigneeList
=
new
ArrayList
<
String
>();
assigneeList
.
add
(
Authentication
.
getAuthenticatedUserId
());
assigneeList
.
addAll
(
CollectionUtils
.
arrayToList
(
assignees
));
String
[]
newAssignees
=
assigneeList
.
toArray
(
new
String
[
0
]);
ProcessDefinitionEntity
processDefinition
=
(
ProcessDefinitionEntity
)
repositoryService
.
getProcessDefinition
(
procDefId
);
ActivityImpl
prototypeActivity
=
ProcessDefUtils
.
getActivity
(
processEngine
,
processDefinition
.
getId
(),
targetTaskDefinitionKey
);
return
cloneAndMakeChain
(
processDefinition
,
procInsId
,
targetTaskDefinitionKey
,
prototypeActivity
.
getOutgoingTransitions
().
get
(
0
).
getDestination
().
getId
(),
variables
,
newAssignees
);
}
/**
* 前加签
*/
public
ActivityImpl
[]
insertTasksBefore
(
String
procDefId
,
String
procInsId
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
,
String
...
assignees
)
{
ProcessDefinitionEntity
procDef
=
(
ProcessDefinitionEntity
)
repositoryService
.
getProcessDefinition
(
procDefId
);
return
cloneAndMakeChain
(
procDef
,
procInsId
,
targetTaskDefinitionKey
,
targetTaskDefinitionKey
,
variables
,
assignees
);
}
/**
* 分裂某节点为多实例节点
*/
public
ActivityImpl
splitTask
(
String
procDefId
,
String
procInsId
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
,
String
...
assignee
)
{
return
splitTask
(
procDefId
,
procInsId
,
targetTaskDefinitionKey
,
variables
,
true
,
assignee
);
}
/**
* 分裂某节点为多实例节点
*/
@SuppressWarnings
(
"unchecked"
)
public
ActivityImpl
splitTask
(
String
procDefId
,
String
procInsId
,
String
targetTaskDefinitionKey
,
Map
<
String
,
Object
>
variables
,
boolean
isSequential
,
String
...
assignees
)
{
SimpleRuntimeActivityDefinitionEntity
info
=
new
SimpleRuntimeActivityDefinitionEntity
();
info
.
setProcessDefinitionId
(
procDefId
);
info
.
setProcessInstanceId
(
procInsId
);
RuntimeActivityDefinitionEntityIntepreter
radei
=
new
RuntimeActivityDefinitionEntityIntepreter
(
info
);
radei
.
setPrototypeActivityId
(
targetTaskDefinitionKey
);
radei
.
setAssignees
(
CollectionUtils
.
arrayToList
(
assignees
));
radei
.
setSequential
(
isSequential
);
ProcessDefinitionEntity
processDefinition
=
(
ProcessDefinitionEntity
)
repositoryService
.
getProcessDefinition
(
procDefId
);
ActivityImpl
clone
=
new
MultiInstanceActivityCreator
().
createActivities
(
processEngine
,
processDefinition
,
info
)[
0
];
TaskEntity
currentTaskEntity
=
this
.
getCurrentTask
(
procInsId
);
CommandExecutor
commandExecutor
=
((
RuntimeServiceImpl
)
runtimeService
).
getCommandExecutor
();
commandExecutor
.
execute
(
new
CreateAndTakeTransitionCmd
(
currentTaskEntity
,
clone
,
variables
));
// recordActivitiesCreation(info);
return
clone
;
}
private
TaskEntity
getCurrentTask
(
String
procInsId
)
{
return
(
TaskEntity
)
taskService
.
createTaskQuery
().
processInstanceId
(
procInsId
).
active
().
singleResult
();
}
private
TaskEntity
getTaskEntity
(
String
taskId
)
{
return
(
TaskEntity
)
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
}
@SuppressWarnings
(
"unchecked"
)
private
ActivityImpl
[]
cloneAndMakeChain
(
ProcessDefinitionEntity
procDef
,
String
procInsId
,
String
prototypeActivityId
,
String
nextActivityId
,
Map
<
String
,
Object
>
variables
,
String
...
assignees
)
{
SimpleRuntimeActivityDefinitionEntity
info
=
new
SimpleRuntimeActivityDefinitionEntity
();
info
.
setProcessDefinitionId
(
procDef
.
getId
());
info
.
setProcessInstanceId
(
procInsId
);
RuntimeActivityDefinitionEntityIntepreter
radei
=
new
RuntimeActivityDefinitionEntityIntepreter
(
info
);
radei
.
setPrototypeActivityId
(
prototypeActivityId
);
radei
.
setAssignees
(
CollectionUtils
.
arrayToList
(
assignees
));
radei
.
setNextActivityId
(
nextActivityId
);
ActivityImpl
[]
activities
=
new
ChainedActivitiesCreator
().
createActivities
(
processEngine
,
procDef
,
info
);
jumpTask
(
procInsId
,
activities
[
0
].
getId
(),
variables
);
// recordActivitiesCreation(info);
return
activities
;
}
// private void recordActivitiesCreation(SimpleRuntimeActivityDefinitionEntity info) {
// info.serializeProperties();
// _activitiesCreationStore.save(info);
// }
////////////////////////////////////////////////////////////////////
// private void recordActivitiesCreation(SimpleRuntimeActivityDefinitionEntity info) throws Exception {
// info.serializeProperties();
// _activitiesCreationStore.save(info);
// }
//
// /**
// * 分裂某节点为多实例节点
// *
// * @param targetTaskDefinitionKey
// * @param assignee
// * @throws IOException
// * @throws IllegalAccessException
// * @throws IllegalArgumentException
// */
// public ActivityImpl split(String targetTaskDefinitionKey, boolean isSequential, String... assignees) throws Exception {
// SimpleRuntimeActivityDefinitionEntity info = new SimpleRuntimeActivityDefinitionEntity();
// info.setProcessDefinitionId(processDefinition.getId());
// info.setProcessInstanceId(_processInstanceId);
//
// RuntimeActivityDefinitionEntityIntepreter radei = new RuntimeActivityDefinitionEntityIntepreter(info);
//
// radei.setPrototypeActivityId(targetTaskDefinitionKey);
// radei.setAssignees(CollectionUtils.arrayToList(assignees));
// radei.setSequential(isSequential);
//
// ActivityImpl clone = new MultiInstanceActivityCreator().createActivities(_processEngine, processDefinition, info)[0];
//
// TaskEntity currentTaskEntity = getCurrentTask();
// executeCommand(new CreateAndTakeTransitionCmd(currentTaskEntity.getExecutionId(), clone));
// executeCommand(new DeleteRunningTaskCmd(currentTaskEntity));
//
// recordActivitiesCreation(info);
// return clone;
// }
//
// public ActivityImpl split(String targetTaskDefinitionKey, String... assignee) throws Exception {
// return split(targetTaskDefinitionKey, true, assignee);
// }
////////////////////////////////////////////////////////////////////
/**
* 读取带跟踪的图片
* @param executionId 环节ID
* @return 封装了各种节点信息
*/
public
InputStream
tracePhoto
(
String
processDefinitionId
,
String
executionId
)
{
// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(executionId).singleResult();
BpmnModel
bpmnModel
=
repositoryService
.
getBpmnModel
(
processDefinitionId
);
List
<
String
>
activeActivityIds
=
Lists
.
newArrayList
();
if
(
runtimeService
.
createExecutionQuery
().
executionId
(
executionId
).
count
()
>
0
){
activeActivityIds
=
runtimeService
.
getActiveActivityIds
(
executionId
);
}
// 不使用spring请使用下面的两行代码
// ProcessEngineImpl defaultProcessEngine = (ProcessEngineImpl)ProcessEngines.getDefaultProcessEngine();
// Context.setProcessEngineConfiguration(defaultProcessEngine.getProcessEngineConfiguration());
// 使用spring注入引擎请使用下面的这行代码
Context
.
setProcessEngineConfiguration
(
processEngineFactory
.
getProcessEngineConfiguration
());
// return ProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
return
processEngine
.
getProcessEngineConfiguration
().
getProcessDiagramGenerator
()
.
generateDiagram
(
bpmnModel
,
"png"
,
activeActivityIds
);
}
/**
* 流程跟踪图信息
* @param processInstanceId 流程实例ID
* @return 封装了各种节点信息
*/
public
List
<
Map
<
String
,
Object
>>
traceProcess
(
String
processInstanceId
)
throws
Exception
{
Execution
execution
=
runtimeService
.
createExecutionQuery
().
executionId
(
processInstanceId
).
singleResult
();
//执行实例
Object
property
=
PropertyUtils
.
getProperty
(
execution
,
"activityId"
);
String
activityId
=
""
;
if
(
property
!=
null
)
{
activityId
=
property
.
toString
();
}
ProcessInstance
processInstance
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
)
.
singleResult
();
ProcessDefinitionEntity
processDefinition
=
(
ProcessDefinitionEntity
)
((
RepositoryServiceImpl
)
repositoryService
)
.
getDeployedProcessDefinition
(
processInstance
.
getProcessDefinitionId
());
List
<
ActivityImpl
>
activitiList
=
processDefinition
.
getActivities
();
//获得当前任务的所有节点
List
<
Map
<
String
,
Object
>>
activityInfos
=
new
ArrayList
<
Map
<
String
,
Object
>>();
for
(
ActivityImpl
activity
:
activitiList
)
{
boolean
currentActiviti
=
false
;
String
id
=
activity
.
getId
();
// 当前节点
if
(
id
.
equals
(
activityId
))
{
currentActiviti
=
true
;
}
Map
<
String
,
Object
>
activityImageInfo
=
packageSingleActivitiInfo
(
activity
,
processInstance
,
currentActiviti
);
activityInfos
.
add
(
activityImageInfo
);
}
return
activityInfos
;
}
/**
* 封装输出信息,包括:当前节点的X、Y坐标、变量信息、任务类型、任务描述
* @param activity
* @param processInstance
* @param currentActiviti
* @return
*/
private
Map
<
String
,
Object
>
packageSingleActivitiInfo
(
ActivityImpl
activity
,
ProcessInstance
processInstance
,
boolean
currentActiviti
)
throws
Exception
{
Map
<
String
,
Object
>
vars
=
new
HashMap
<
String
,
Object
>();
Map
<
String
,
Object
>
activityInfo
=
new
HashMap
<
String
,
Object
>();
activityInfo
.
put
(
"currentActiviti"
,
currentActiviti
);
setPosition
(
activity
,
activityInfo
);
setWidthAndHeight
(
activity
,
activityInfo
);
Map
<
String
,
Object
>
properties
=
activity
.
getProperties
();
vars
.
put
(
"节点名称"
,
properties
.
get
(
"name"
));
vars
.
put
(
"任务类型"
,
ActUtils
.
parseToZhType
(
properties
.
get
(
"type"
).
toString
()));
ActivityBehavior
activityBehavior
=
activity
.
getActivityBehavior
();
logger
.
debug
(
"activityBehavior={}"
,
activityBehavior
);
if
(
activityBehavior
instanceof
UserTaskActivityBehavior
)
{
Task
currentTask
=
null
;
// 当前节点的task
if
(
currentActiviti
)
{
currentTask
=
getCurrentTaskInfo
(
processInstance
);
}
// 当前任务的分配角色
UserTaskActivityBehavior
userTaskActivityBehavior
=
(
UserTaskActivityBehavior
)
activityBehavior
;
TaskDefinition
taskDefinition
=
userTaskActivityBehavior
.
getTaskDefinition
();
Set
<
Expression
>
candidateGroupIdExpressions
=
taskDefinition
.
getCandidateGroupIdExpressions
();
if
(!
candidateGroupIdExpressions
.
isEmpty
())
{
// 任务的处理角色
setTaskGroup
(
vars
,
candidateGroupIdExpressions
);
// 当前处理人
if
(
currentTask
!=
null
)
{
setCurrentTaskAssignee
(
vars
,
currentTask
);
}
}
}
vars
.
put
(
"节点说明"
,
properties
.
get
(
"documentation"
));
String
description
=
activity
.
getProcessDefinition
().
getDescription
();
vars
.
put
(
"描述"
,
description
);
logger
.
debug
(
"trace variables: {}"
,
vars
);
activityInfo
.
put
(
"vars"
,
vars
);
return
activityInfo
;
}
/**
* 设置任务组
* @param vars
* @param candidateGroupIdExpressions
*/
private
void
setTaskGroup
(
Map
<
String
,
Object
>
vars
,
Set
<
Expression
>
candidateGroupIdExpressions
)
{
String
roles
=
""
;
for
(
Expression
expression
:
candidateGroupIdExpressions
)
{
String
expressionText
=
expression
.
getExpressionText
();
String
roleName
=
identityService
.
createGroupQuery
().
groupId
(
expressionText
).
singleResult
().
getName
();
roles
+=
roleName
;
}
vars
.
put
(
"任务所属角色"
,
roles
);
}
/**
* 设置当前处理人信息
* @param vars
* @param currentTask
*/
private
void
setCurrentTaskAssignee
(
Map
<
String
,
Object
>
vars
,
Task
currentTask
)
{
String
assignee
=
currentTask
.
getAssignee
();
if
(
assignee
!=
null
)
{
org
.
activiti
.
engine
.
identity
.
User
assigneeUser
=
identityService
.
createUserQuery
().
userId
(
assignee
).
singleResult
();
String
userInfo
=
assigneeUser
.
getFirstName
()
+
" "
+
assigneeUser
.
getLastName
();
vars
.
put
(
"当前处理人"
,
userInfo
);
}
}
/**
* 获取当前节点信息
* @param processInstance
* @return
*/
private
Task
getCurrentTaskInfo
(
ProcessInstance
processInstance
)
{
Task
currentTask
=
null
;
try
{
String
activitiId
=
(
String
)
PropertyUtils
.
getProperty
(
processInstance
,
"activityId"
);
logger
.
debug
(
"current activity id: {}"
,
activitiId
);
currentTask
=
taskService
.
createTaskQuery
().
processInstanceId
(
processInstance
.
getId
()).
taskDefinitionKey
(
activitiId
)
.
singleResult
();
logger
.
debug
(
"current task for processInstance: {}"
,
ToStringBuilder
.
reflectionToString
(
currentTask
));
}
catch
(
Exception
e
)
{
logger
.
error
(
"can not get property activityId from processInstance: {}"
,
processInstance
);
}
return
currentTask
;
}
/**
* 设置宽度、高度属性
* @param activity
* @param activityInfo
*/
private
void
setWidthAndHeight
(
ActivityImpl
activity
,
Map
<
String
,
Object
>
activityInfo
)
{
activityInfo
.
put
(
"width"
,
activity
.
getWidth
());
activityInfo
.
put
(
"height"
,
activity
.
getHeight
());
}
/**
* 设置坐标位置
* @param activity
* @param activityInfo
*/
private
void
setPosition
(
ActivityImpl
activity
,
Map
<
String
,
Object
>
activityInfo
)
{
activityInfo
.
put
(
"x"
,
activity
.
getX
());
activityInfo
.
put
(
"y"
,
activity
.
getY
());
}
public
ProcessEngine
getProcessEngine
()
{
return
processEngine
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/cmd/CreateAndTakeTransitionCmd.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.cmd
;
import
java.util.Map
;
import
org.activiti.engine.impl.context.Context
;
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.TaskEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.impl.pvm.runtime.AtomicOperation
;
public
class
CreateAndTakeTransitionCmd
implements
Command
<
Void
>
{
private
TaskEntity
currentTaskEntity
;
private
ActivityImpl
activity
;
protected
Map
<
String
,
Object
>
variables
;
public
CreateAndTakeTransitionCmd
(
TaskEntity
currentTaskEntity
,
ActivityImpl
activity
,
Map
<
String
,
Object
>
variables
)
{
this
.
currentTaskEntity
=
currentTaskEntity
;
this
.
activity
=
activity
;
this
.
variables
=
variables
;
}
@Override
public
Void
execute
(
CommandContext
commandContext
)
{
if
(
currentTaskEntity
!=
null
)
{
ExecutionEntity
execution
=
commandContext
.
getExecutionEntityManager
().
findExecutionById
(
currentTaskEntity
.
getExecutionId
());
execution
.
setActivity
(
activity
);
execution
.
performOperation
(
AtomicOperation
.
TRANSITION_CREATE_SCOPE
);
if
(
variables
!=
null
)
{
if
(
currentTaskEntity
.
getExecutionId
()
!=
null
)
{
currentTaskEntity
.
setExecutionVariables
(
variables
);
}
else
{
currentTaskEntity
.
setVariables
(
variables
);
}
}
//删除当前的任务,不能删除当前正在执行的任务,所以要先清除掉关联
Context
.
getCommandContext
().
getTaskEntityManager
().
deleteTask
(
currentTaskEntity
,
TaskEntity
.
DELETE_REASON_DELETED
,
false
);
}
return
null
;
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/cmd/JumpTaskCmd.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.cmd
;
import
java.util.Map
;
import
org.activiti.engine.impl.context.Context
;
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.TaskEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.impl.pvm.runtime.AtomicOperation
;
public
class
JumpTaskCmd
implements
Command
<
Void
>
{
private
TaskEntity
taskEntity
;
private
ActivityImpl
targetActivity
;
protected
Map
<
String
,
Object
>
variables
;
public
JumpTaskCmd
(
TaskEntity
taskEntity
,
ActivityImpl
targetActivity
,
Map
<
String
,
Object
>
variables
)
{
this
.
taskEntity
=
taskEntity
;
this
.
targetActivity
=
targetActivity
;
this
.
variables
=
variables
;
}
@Override
public
Void
execute
(
CommandContext
commandContext
)
{
if
(
taskEntity
!=
null
)
{
//删除当前的任务,不能删除当前正在执行的任务,所以要先清除掉关联
if
(
variables
!=
null
)
{
if
(
taskEntity
.
getExecutionId
()
!=
null
)
{
taskEntity
.
setExecutionVariables
(
variables
);
}
else
{
taskEntity
.
setVariables
(
variables
);
}
}
// // 完成活动历史
// Context.getCommandContext().getHistoryManager()
// .recordActivityEnd((ExecutionEntity) taskEntity.getExecution());
// 完成待办任务
Context
.
getCommandContext
().
getTaskEntityManager
().
deleteTask
(
taskEntity
,
TaskEntity
.
DELETE_REASON_COMPLETED
,
false
);
// DELETE_REASON_DELETED DELETE_REASON_COMPLETED
// 跳转任务
ExecutionEntity
execution
=
taskEntity
.
getExecution
();
execution
.
setActivity
(
targetActivity
);
execution
.
performOperation
(
AtomicOperation
.
ACTIVITY_START
);
}
return
null
;
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/cmd/ModelDeployProcessDefinitionCmd.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.cmd
;
import
java.io.ByteArrayInputStream
;
import
org.activiti.bpmn.converter.BpmnXMLConverter
;
import
org.activiti.bpmn.model.BpmnModel
;
import
org.activiti.editor.language.json.converter.BpmnJsonConverter
;
import
org.activiti.engine.ActivitiException
;
import
org.activiti.engine.RepositoryService
;
import
org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl
;
import
org.activiti.engine.impl.context.Context
;
import
org.activiti.engine.impl.db.DbSqlSession
;
import
org.activiti.engine.impl.interceptor.Command
;
import
org.activiti.engine.impl.interceptor.CommandContext
;
import
org.activiti.engine.impl.persistence.entity.DeploymentEntity
;
import
org.activiti.engine.impl.persistence.entity.ResourceEntity
;
import
org.activiti.engine.impl.persistence.entity.ResourceEntityManager
;
import
org.activiti.engine.impl.util.IoUtil
;
import
org.activiti.engine.repository.ProcessDefinition
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
/**
* 模型部署或更新到流程定义
* @author JeeSpring
* @version 2016年8月2日
*/
public
class
ModelDeployProcessDefinitionCmd
implements
Command
<
Void
>
{
private
String
modelId
;
private
String
procDefKey
;
private
String
procDefName
;
public
ModelDeployProcessDefinitionCmd
(
String
modelId
,
String
procDefKey
,
String
procDefName
)
{
this
.
modelId
=
modelId
;
this
.
procDefKey
=
procDefKey
;
this
.
procDefName
=
procDefName
;
}
@Override
public
Void
execute
(
CommandContext
commandContext
)
{
RepositoryService
repositoryService
=
Context
.
getProcessEngineConfiguration
()
.
getRepositoryService
();
try
{
// 生成部署名称和数据 JeeSpring
JsonNode
editorNode
=
new
ObjectMapper
().
readTree
(
repositoryService
.
getModelEditorSource
(
modelId
));
BpmnModel
bpmnModel
=
new
BpmnJsonConverter
().
convertToBpmnModel
(
editorNode
);
byte
[]
bpmnBytes
=
new
BpmnXMLConverter
().
convertToXML
(
bpmnModel
);
// 查询流程定义是否已经存在了 JeeSpring
ProcessDefinition
processDefinition
=
Context
.
getProcessEngineConfiguration
()
.
getRepositoryService
().
createProcessDefinitionQuery
()
.
processDefinitionKey
(
procDefKey
).
latestVersion
().
singleResult
();
if
(
processDefinition
!=
null
){
ResourceEntityManager
resourceEntityManager
=
commandContext
.
getResourceEntityManager
();
DeploymentEntity
deployment
=
(
DeploymentEntity
)
repositoryService
.
createDeploymentQuery
()
.
deploymentId
(
processDefinition
.
getDeploymentId
()).
singleResult
();
// 删除原资源
resourceEntityManager
.
deleteResourcesByDeploymentId
(
deployment
.
getId
());
Context
.
getCommandContext
().
getSession
(
DbSqlSession
.
class
).
flush
();
// 插入新资源
ResourceEntity
resource
=
new
ResourceEntity
();
resource
.
setDeploymentId
(
deployment
.
getId
());
resource
.
setName
(
procDefName
+
".bpmn20.xml"
);
resource
.
setBytes
(
bpmnBytes
);
deployment
.
addResource
(
resource
);
resourceEntityManager
.
insertResource
(
resource
);
// 插入资源图片
ProcessEngineConfigurationImpl
processEngineConfiguration
=
Context
.
getProcessEngineConfiguration
();
byte
[]
diagramBytes
=
IoUtil
.
readInputStream
(
processEngineConfiguration
.
getProcessDiagramGenerator
().
generateDiagram
(
bpmnModel
,
"png"
,
processEngineConfiguration
.
getActivityFontName
(),
processEngineConfiguration
.
getLabelFontName
(),
processEngineConfiguration
.
getAnnotationFontName
(),
processEngineConfiguration
.
getClassLoader
()),
null
);
ResourceEntity
diagramResource
=
new
ResourceEntity
();
diagramResource
.
setDeploymentId
(
deployment
.
getId
());
diagramResource
.
setName
(
procDefName
+
"."
+
processDefinition
.
getKey
()
+
".png"
);
diagramResource
.
setBytes
(
diagramBytes
);
deployment
.
addResource
(
diagramResource
);
resourceEntityManager
.
insertResource
(
diagramResource
);
}
// 不存在部署一个新的流程 JeeSpring
else
{
repositoryService
.
createDeployment
().
name
(
procDefName
).
addInputStream
(
procDefName
+
".bpmn20.xml"
,
new
ByteArrayInputStream
(
bpmnBytes
)).
deploy
();
}
}
catch
(
Exception
e
){
throw
new
ActivitiException
(
"模型部署到流程定义错误"
,
e
);
}
return
null
;
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/ChainedActivitiesCreator.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.activiti.engine.ProcessEngine
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.springframework.util.CollectionUtils
;
import
com.jeespring.modules.act.utils.ProcessDefUtils
;
public
class
ChainedActivitiesCreator
extends
RuntimeActivityCreatorSupport
implements
RuntimeActivityCreator
{
@Override
@SuppressWarnings
(
"unchecked"
)
public
ActivityImpl
[]
createActivities
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
RuntimeActivityDefinitionEntity
info
)
{
info
.
setFactoryName
(
ChainedActivitiesCreator
.
class
.
getName
());
RuntimeActivityDefinitionEntityIntepreter
radei
=
new
RuntimeActivityDefinitionEntityIntepreter
(
info
);
if
(
radei
.
getCloneActivityIds
()
==
null
)
{
radei
.
setCloneActivityIds
(
CollectionUtils
.
arrayToList
(
new
String
[
radei
.
getAssignees
().
size
()]));
}
return
createActivities
(
processEngine
,
processDefinition
,
info
.
getProcessInstanceId
(),
radei
.
getPrototypeActivityId
(),
radei
.
getNextActivityId
(),
radei
.
getAssignees
(),
radei
.
getCloneActivityIds
());
}
private
ActivityImpl
[]
createActivities
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
String
processInstanceId
,
String
prototypeActivityId
,
String
nextActivityId
,
List
<
String
>
assignees
,
List
<
String
>
activityIds
)
{
ActivityImpl
prototypeActivity
=
ProcessDefUtils
.
getActivity
(
processEngine
,
processDefinition
.
getId
(),
prototypeActivityId
);
List
<
ActivityImpl
>
activities
=
new
ArrayList
<
ActivityImpl
>();
for
(
int
i
=
0
;
i
<
assignees
.
size
();
i
++)
{
if
(
activityIds
.
get
(
i
)
==
null
)
{
String
activityId
=
createUniqueActivityId
(
processInstanceId
,
prototypeActivityId
);
activityIds
.
set
(
i
,
activityId
);
}
ActivityImpl
clone
=
createActivity
(
processEngine
,
processDefinition
,
prototypeActivity
,
activityIds
.
get
(
i
),
assignees
.
get
(
i
));
activities
.
add
(
clone
);
}
ActivityImpl
nextActivity
=
ProcessDefUtils
.
getActivity
(
processEngine
,
processDefinition
.
getId
(),
nextActivityId
);
createActivityChain
(
activities
,
nextActivity
);
return
activities
.
toArray
(
new
ActivityImpl
[
0
]);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/MultiInstanceActivityCreator.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.util.List
;
import
org.activiti.engine.ProcessEngine
;
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.TaskActivityBehavior
;
import
org.activiti.engine.impl.el.FixedValue
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.PvmTransition
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
com.jeespring.modules.act.utils.ProcessDefUtils
;
public
class
MultiInstanceActivityCreator
extends
RuntimeActivityCreatorSupport
implements
RuntimeActivityCreator
{
@Override
public
ActivityImpl
[]
createActivities
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
RuntimeActivityDefinitionEntity
info
)
{
info
.
setFactoryName
(
MultiInstanceActivityCreator
.
class
.
getName
());
RuntimeActivityDefinitionEntityIntepreter
radei
=
new
RuntimeActivityDefinitionEntityIntepreter
(
info
);
if
(
radei
.
getCloneActivityId
()
==
null
)
{
String
cloneActivityId
=
createUniqueActivityId
(
info
.
getProcessInstanceId
(),
radei
.
getPrototypeActivityId
());
radei
.
setCloneActivityId
(
cloneActivityId
);
}
return
new
ActivityImpl
[]
{
createMultiInstanceActivity
(
processEngine
,
processDefinition
,
info
.
getProcessInstanceId
(),
radei
.
getPrototypeActivityId
(),
radei
.
getCloneActivityId
(),
radei
.
getSequential
(),
radei
.
getAssignees
())
};
}
private
ActivityImpl
createMultiInstanceActivity
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
String
processInstanceId
,
String
prototypeActivityId
,
String
cloneActivityId
,
boolean
isSequential
,
List
<
String
>
assignees
)
{
ActivityImpl
prototypeActivity
=
ProcessDefUtils
.
getActivity
(
processEngine
,
processDefinition
.
getId
(),
prototypeActivityId
);
//拷贝listener,executionListeners会激活历史记录的保存
ActivityImpl
clone
=
cloneActivity
(
processDefinition
,
prototypeActivity
,
cloneActivityId
,
"executionListeners"
,
"properties"
);
//拷贝所有后向链接
for
(
PvmTransition
trans
:
prototypeActivity
.
getOutgoingTransitions
())
{
clone
.
createOutgoingTransition
(
trans
.
getId
()).
setDestination
((
ActivityImpl
)
trans
.
getDestination
());
}
MultiInstanceActivityBehavior
multiInstanceBehavior
=
isSequential
?
new
SequentialMultiInstanceBehavior
(
clone
,
(
TaskActivityBehavior
)
prototypeActivity
.
getActivityBehavior
())
:
new
ParallelMultiInstanceBehavior
(
clone
,
(
TaskActivityBehavior
)
prototypeActivity
.
getActivityBehavior
());
clone
.
setActivityBehavior
(
multiInstanceBehavior
);
clone
.
setScope
(
true
);
clone
.
setProperty
(
"multiInstance"
,
isSequential
?
"sequential"
:
"parallel"
);
//设置多实例节点属性
multiInstanceBehavior
.
setLoopCardinalityExpression
(
new
FixedValue
(
assignees
.
size
()));
multiInstanceBehavior
.
setCollectionExpression
(
new
FixedValue
(
assignees
));
return
clone
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/RuntimeActivityCreator.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
org.activiti.engine.ProcessEngine
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
public
interface
RuntimeActivityCreator
{
public
ActivityImpl
[]
createActivities
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
RuntimeActivityDefinitionEntity
info
);
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/RuntimeActivityCreatorSupport.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.lang.reflect.Field
;
import
java.util.List
;
import
org.activiti.engine.ProcessEngine
;
import
org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior
;
import
org.activiti.engine.impl.el.FixedValue
;
import
org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity
;
import
org.activiti.engine.impl.pvm.process.ActivityImpl
;
import
org.activiti.engine.impl.task.TaskDefinition
;
import
org.apache.commons.lang3.reflect.FieldUtils
;
import
org.junit.Assert
;
import
org.springframework.beans.BeanUtils
;
import
com.jeespring.modules.act.utils.ProcessDefUtils
;
public
abstract
class
RuntimeActivityCreatorSupport
{
private
static
int
SEQUNCE_NUMBER
=
0
;
protected
ActivityImpl
cloneActivity
(
ProcessDefinitionEntity
processDefinition
,
ActivityImpl
prototypeActivity
,
String
newActivityId
,
String
...
fieldNames
)
{
ActivityImpl
clone
=
processDefinition
.
createActivity
(
newActivityId
);
copyFields
(
prototypeActivity
,
clone
,
fieldNames
);
return
clone
;
}
protected
TaskDefinition
cloneTaskDefinition
(
TaskDefinition
taskDefinition
)
{
TaskDefinition
newTaskDefinition
=
new
TaskDefinition
(
taskDefinition
.
getTaskFormHandler
());
BeanUtils
.
copyProperties
(
taskDefinition
,
newTaskDefinition
);
return
newTaskDefinition
;
}
protected
ActivityImpl
createActivity
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
ActivityImpl
prototypeActivity
,
String
cloneActivityId
,
String
assignee
)
{
ActivityImpl
clone
=
cloneActivity
(
processDefinition
,
prototypeActivity
,
cloneActivityId
,
"executionListeners"
,
"properties"
);
//设置assignee
UserTaskActivityBehavior
activityBehavior
=
(
UserTaskActivityBehavior
)
(
prototypeActivity
.
getActivityBehavior
());
TaskDefinition
taskDefinition
=
cloneTaskDefinition
(
activityBehavior
.
getTaskDefinition
());
taskDefinition
.
setKey
(
cloneActivityId
);
if
(
assignee
!=
null
)
{
taskDefinition
.
setAssigneeExpression
(
new
FixedValue
(
assignee
));
}
UserTaskActivityBehavior
cloneActivityBehavior
=
new
UserTaskActivityBehavior
(
null
,
taskDefinition
);
clone
.
setActivityBehavior
(
cloneActivityBehavior
);
return
clone
;
}
protected
ActivityImpl
createActivity
(
ProcessEngine
processEngine
,
ProcessDefinitionEntity
processDefinition
,
String
prototypeActivityId
,
String
cloneActivityId
,
String
assignee
)
{
ActivityImpl
prototypeActivity
=
ProcessDefUtils
.
getActivity
(
processEngine
,
processDefinition
.
getId
(),
prototypeActivityId
);
return
createActivity
(
processEngine
,
processDefinition
,
prototypeActivity
,
cloneActivityId
,
assignee
);
}
protected
void
createActivityChain
(
List
<
ActivityImpl
>
activities
,
ActivityImpl
nextActivity
)
{
for
(
int
i
=
0
;
i
<
activities
.
size
();
i
++)
{
//设置各活动的下线
activities
.
get
(
i
).
getOutgoingTransitions
().
clear
();
activities
.
get
(
i
).
createOutgoingTransition
(
"flow"
+
(
i
+
1
))
.
setDestination
(
i
==
activities
.
size
()
-
1
?
nextActivity
:
activities
.
get
(
i
+
1
));
}
}
protected
String
createUniqueActivityId
(
String
processInstanceId
,
String
prototypeActivityId
)
{
return
processInstanceId
+
":"
+
prototypeActivityId
+
":"
+
System
.
currentTimeMillis
()
+
"-"
+
(
SEQUNCE_NUMBER
++);
}
private
static
void
copyFields
(
Object
source
,
Object
target
,
String
...
fieldNames
)
{
Assert
.
assertNotNull
(
source
);
Assert
.
assertNotNull
(
target
);
Assert
.
assertSame
(
source
.
getClass
(),
target
.
getClass
());
for
(
String
fieldName
:
fieldNames
)
{
try
{
Field
field
=
FieldUtils
.
getField
(
source
.
getClass
(),
fieldName
,
true
);
field
.
setAccessible
(
true
);
field
.
set
(
target
,
field
.
get
(
source
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/RuntimeActivityDefinitionEntity.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.io.IOException
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
public
interface
RuntimeActivityDefinitionEntity
{
/**
* 反序列化PropertiesText到Map
*/
void
deserializeProperties
()
throws
IOException
;
/**
* 获取工厂名
*/
String
getFactoryName
();
/**
* 获取流程定义的ID
*/
String
getProcessDefinitionId
();
/**
* 获取流程实例的ID
*/
String
getProcessInstanceId
();
/**
* 获取PropertiesText,它是一个JSON字符串
*/
String
getPropertiesText
();
/**
* 获取指定的属性值
*/
<
T
>
T
getProperty
(
String
name
);
/**
* 序列化Map至PropertiesText
*/
void
serializeProperties
()
throws
JsonProcessingException
;
/**
* 设置工厂名
*/
void
setFactoryName
(
String
factoryName
);
/**
* 设置流程定义ID
*/
void
setProcessDefinitionId
(
String
processDefinitionId
);
/**
* 设置流程实例ID
*/
void
setProcessInstanceId
(
String
processInstanceId
);
/**
* 设置PropertiesText
*/
void
setPropertiesText
(
String
propertiesText
);
<
T
>
void
setProperty
(
String
name
,
T
value
);
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/RuntimeActivityDefinitionEntityIntepreter.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.util.List
;
/**
* RuntimeActivityDefinitionEntity的解释类(代理类)
* 主要用以解释properties字段的值,如为get("name")提供getName()方法
*
* @author bluejoe2008@gmail.com
*
*/
public
class
RuntimeActivityDefinitionEntityIntepreter
{
RuntimeActivityDefinitionEntity
_entity
;
public
RuntimeActivityDefinitionEntityIntepreter
(
RuntimeActivityDefinitionEntity
entity
)
{
super
();
_entity
=
entity
;
}
public
List
<
String
>
getAssignees
()
{
return
_entity
.
getProperty
(
"assignees"
);
}
public
String
getCloneActivityId
()
{
return
_entity
.
getProperty
(
"cloneActivityId"
);
}
public
List
<
String
>
getCloneActivityIds
()
{
return
_entity
.
getProperty
(
"cloneActivityIds"
);
}
public
String
getNextActivityId
()
{
return
_entity
.
getProperty
(
"nextActivityId"
);
}
public
String
getPrototypeActivityId
()
{
return
_entity
.
getProperty
(
"prototypeActivityId"
);
}
public
boolean
getSequential
()
{
return
(
Boolean
)
_entity
.
getProperty
(
"sequential"
);
}
public
void
setAssignees
(
List
<
String
>
assignees
)
{
_entity
.
setProperty
(
"assignees"
,
assignees
);
}
public
void
setCloneActivityId
(
String
cloneActivityId
)
{
_entity
.
setProperty
(
"cloneActivityId"
,
cloneActivityId
);
}
public
void
setCloneActivityIds
(
List
<
String
>
cloneActivityIds
)
{
_entity
.
setProperty
(
"cloneActivityIds"
,
cloneActivityIds
);
}
public
void
setNextActivityId
(
String
nextActivityId
)
{
_entity
.
setProperty
(
"nextActivityId"
,
nextActivityId
);
}
public
void
setPrototypeActivityId
(
String
prototypeActivityId
)
{
_entity
.
setProperty
(
"prototypeActivityId"
,
prototypeActivityId
);
}
public
void
setSequential
(
boolean
sequential
)
{
_entity
.
setProperty
(
"sequential"
,
sequential
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/RuntimeActivityDefinitionManager.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.util.List
;
public
interface
RuntimeActivityDefinitionManager
{
/**
* 获取所有的活动定义信息,引擎会在启动的时候加载这些活动定义并进行注册
*/
List
<
RuntimeActivityDefinitionEntity
>
list
()
throws
Exception
;
/**
* 删除所有活动定义
*/
void
removeAll
()
throws
Exception
;
/**
* 新增一条活动定义的信息
*/
void
save
(
RuntimeActivityDefinitionEntity
entity
)
throws
Exception
;
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/creator/SimpleRuntimeActivityDefinitionEntity.java
0 → 100644
View file @
05beecd0
package
com.jeespring.modules.act.service.creator
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Map
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
public
class
SimpleRuntimeActivityDefinitionEntity
implements
RuntimeActivityDefinitionEntity
{
String
_factoryName
;
String
_processDefinitionId
;
public
Map
<
String
,
Object
>
getProperties
()
{
return
_properties
;
}
public
void
setProperties
(
Map
<
String
,
Object
>
properties
)
{
_properties
=
properties
;
}
@Override
public
void
setFactoryName
(
String
factoryName
)
{
_factoryName
=
factoryName
;
}
@Override
public
void
setProcessDefinitionId
(
String
processDefinitionId
)
{
_processDefinitionId
=
processDefinitionId
;
}
@Override
public
void
setProcessInstanceId
(
String
processInstanceId
)
{
_processInstanceId
=
processInstanceId
;
}
@Override
public
void
setPropertiesText
(
String
propertiesText
)
{
_propertiesText
=
propertiesText
;
}
String
_processInstanceId
;
Map
<
String
,
Object
>
_properties
=
new
HashMap
<
String
,
Object
>();
String
_propertiesText
;
@Override
public
void
deserializeProperties
()
throws
IOException
{
ObjectMapper
objectMapper
=
new
ObjectMapper
();
_properties
=
objectMapper
.
readValue
(
_propertiesText
,
Map
.
class
);
}
@Override
public
String
getFactoryName
()
{
return
_factoryName
;
}
@Override
public
String
getProcessDefinitionId
()
{
return
_processDefinitionId
;
}
@Override
public
String
getProcessInstanceId
()
{
return
_processInstanceId
;
}
@Override
public
String
getPropertiesText
()
{
return
_propertiesText
;
}
@Override
public
<
T
>
T
getProperty
(
String
name
)
{
return
(
T
)
_properties
.
get
(
name
);
}
@Override
public
void
serializeProperties
()
throws
JsonProcessingException
{
ObjectMapper
objectMapper
=
new
ObjectMapper
();
_propertiesText
=
objectMapper
.
writeValueAsString
(
_properties
);
}
@Override
public
<
T
>
void
setProperty
(
String
name
,
T
value
)
{
_properties
.
put
(
name
,
value
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/ext/ActGroupEntityService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://gitee.com/JeeHuangBingGui/jeeSpringCloud">JeeSpring</a> All rights reserved.
*/
package
com.jeespring.modules.act.service.ext
;
import
java.util.List
;
import
java.util.Map
;
import
org.activiti.engine.identity.Group
;
import
org.activiti.engine.identity.GroupQuery
;
import
org.activiti.engine.impl.GroupQueryImpl
;
import
org.activiti.engine.impl.Page
;
import
org.activiti.engine.impl.persistence.entity.GroupEntity
;
import
org.activiti.engine.impl.persistence.entity.GroupEntityManager
;
import
org.springframework.stereotype.Service
;
import
com.google.common.collect.Lists
;
import
com.jeespring.common.utils.SpringContextHolder
;
import
com.jeespring.modules.act.utils.ActUtils
;
import
com.jeespring.modules.sys.entity.Role
;
import
com.jeespring.modules.sys.entity.User
;
import
com.jeespring.modules.sys.service.SystemService
;
/**
* Activiti Group Entity Service
* @author JeeSpring
* @version 2013-12-05
*/
@Service
public
class
ActGroupEntityService
extends
GroupEntityManager
{
private
SystemService
systemService
;
public
SystemService
getSystemService
()
{
if
(
systemService
==
null
){
systemService
=
SpringContextHolder
.
getBean
(
SystemService
.
class
);
}
return
systemService
;
}
@Override
public
Group
createNewGroup
(
String
groupId
)
{
return
new
GroupEntity
(
groupId
);
}
@Override
public
void
insertGroup
(
Group
group
)
{
// getDbSqlSession().insert((PersistentObject) group);
throw
new
RuntimeException
(
"not implement method."
);
}
public
void
updateGroup
(
GroupEntity
updatedGroup
)
{
// CommandContext commandContext = Context.getCommandContext();
// DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
// dbSqlSession.update(updatedGroup);
throw
new
RuntimeException
(
"not implement method."
);
}
@Override
public
void
deleteGroup
(
String
groupId
)
{
// GroupEntity group = getDbSqlSession().selectById(GroupEntity.class, groupId);
// getDbSqlSession().delete("deleteMembershipsByGroupId", groupId);
// getDbSqlSession().delete(group);
throw
new
RuntimeException
(
"not implement method."
);
}
@Override
public
GroupQuery
createNewGroupQuery
()
{
// return new GroupQueryImpl(Context.getProcessEngineConfiguration().getCommandExecutorTxRequired());
throw
new
RuntimeException
(
"not implement method."
);
}
// @SuppressWarnings("unchecked")
@Override
public
List
<
Group
>
findGroupByQueryCriteria
(
GroupQueryImpl
query
,
Page
page
)
{
// return getDbSqlSession().selectList("selectGroupByQueryCriteria", query, page);
throw
new
RuntimeException
(
"not implement method."
);
}
@Override
public
long
findGroupCountByQueryCriteria
(
GroupQueryImpl
query
)
{
// return (Long) getDbSqlSession().selectOne("selectGroupCountByQueryCriteria", query);
throw
new
RuntimeException
(
"not implement method."
);
}
@Override
public
List
<
Group
>
findGroupsByUser
(
String
userId
)
{
// return getDbSqlSession().selectList("selectGroupsByUserId", userId);
List
<
Group
>
list
=
Lists
.
newArrayList
();
User
user
=
getSystemService
().
getUserByLoginName
(
userId
);
if
(
user
!=
null
&&
user
.
getRoleList
()
!=
null
){
for
(
Role
role
:
user
.
getRoleList
()){
list
.
add
(
ActUtils
.
toActivitiGroup
(
role
));
}
}
return
list
;
}
@Override
public
List
<
Group
>
findGroupsByNativeQuery
(
Map
<
String
,
Object
>
parameterMap
,
int
firstResult
,
int
maxResults
)
{
// return getDbSqlSession().selectListWithRawParameter("selectGroupByNativeQuery", parameterMap, firstResult, maxResults);
throw
new
RuntimeException
(
"not implement method."
);
}
@Override
public
long
findGroupCountByNativeQuery
(
Map
<
String
,
Object
>
parameterMap
)
{
// return (Long) getDbSqlSession().selectOne("selectGroupCountByNativeQuery", parameterMap);
throw
new
RuntimeException
(
"not implement method."
);
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/modules/act/service/ext/ActGroupEntityServiceFactory.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://gitee.com/JeeHuangBingGui/jeeSpringCloud">JeeSpring</a> All rights reserved.
*/
package
com.jeespring.modules.act.service.ext
;
import
org.activiti.engine.impl.interceptor.Session
;
import
org.activiti.engine.impl.interceptor.SessionFactory
;
import
org.activiti.engine.impl.persistence.entity.GroupIdentityManager
;
import
org.springframework.beans.factory.annotation.Autowired
;
/**
* Activiti Group Entity Factory
* @author JeeSpring
* @version 2013-11-03
*/
public
class
ActGroupEntityServiceFactory
implements
SessionFactory
{
@Autowired
private
ActGroupEntityService
actGroupEntityService
;
@Override
public
Class
<?>
getSessionType
()
{
// 返回原始的GroupIdentityManager类型
return
GroupIdentityManager
.
class
;
}
@Override
public
Session
openSession
()
{
// 返回自定义的GroupEntityManager实例
return
actGroupEntityService
;
}
}
Prev
1
…
5
6
7
8
9
10
11
12
13
…
19
Next
Write
Preview
Supports
Markdown
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