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
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