Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
government-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
government-platform
Commits
9663fa30
Commit
9663fa30
authored
Jul 30, 2021
by
赵啸非
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加工作流feign接口
parent
2e9bc04b
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
407 additions
and
5 deletions
+407
-5
common-lib/pom.xml
common-lib/pom.xml
+5
-0
common-lib/src/main/java/com/mortals/xhx/common/pdu/api/ApiReqPdu.java
...c/main/java/com/mortals/xhx/common/pdu/api/ApiReqPdu.java
+2
-4
government-flowable/src/main/java/com/mortals/xhx/flowable/controller/ApiFlowImpl.java
...java/com/mortals/xhx/flowable/controller/ApiFlowImpl.java
+283
-0
government-flowable/src/main/java/com/mortals/xhx/flowable/listener/MyListener.java
...in/java/com/mortals/xhx/flowable/listener/MyListener.java
+2
-0
government-flowable/src/main/resources/static/index.html
government-flowable/src/main/resources/static/index.html
+1
-1
government-manager/pom.xml
government-manager/pom.xml
+1
-0
government-manager/src/main/java/com/mortals/xhx/daemon/demo/RequestDispatchController.http
...om/mortals/xhx/daemon/demo/RequestDispatchController.http
+12
-0
government-manager/src/main/java/com/mortals/xhx/daemon/demo/RequestDispatchController.java
...om/mortals/xhx/daemon/demo/RequestDispatchController.java
+101
-0
No files found.
common-lib/pom.xml
View file @
9663fa30
...
...
@@ -43,6 +43,11 @@
<artifactId>
spring-boot-configuration-processor
</artifactId>
<optional>
true
</optional>
</dependency>
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
</dependency>
<dependency>
<groupId>
com.google.guava
</groupId>
<artifactId>
guava
</artifactId>
...
...
common-lib/src/main/java/com/mortals/xhx/common/pdu/api/ApiReqPdu.java
View file @
9663fa30
...
...
@@ -7,10 +7,8 @@ import lombok.Data;
*/
@Data
public
class
ApiReqPdu
<
T
>
{
/**
* 会员编号
*/
private
Member
member
;
private
String
seq
;
/**
* 透传数据
...
...
government-flowable/src/main/java/com/mortals/xhx/flowable/controller/ApiFlowImpl.java
0 → 100644
View file @
9663fa30
package
com.mortals.xhx.flowable.controller
;
import
cn.hutool.core.codec.Base64
;
import
com.alibaba.fastjson.JSON
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.xhx.common.code.YesNoEnum
;
import
com.mortals.xhx.common.pdu.api.ApiRespPdu
;
import
com.mortals.xhx.feign.flowable.IApiFlowFeign
;
import
lombok.extern.apachecommons.CommonsLog
;
import
org.flowable.bpmn.converter.BpmnXMLConverter
;
import
org.flowable.bpmn.model.BpmnModel
;
import
org.flowable.engine.*
;
import
org.flowable.engine.history.HistoricActivityInstance
;
import
org.flowable.engine.history.HistoricProcessInstance
;
import
org.flowable.engine.runtime.ProcessInstance
;
import
org.flowable.image.ProcessDiagramGenerator
;
import
org.flowable.task.api.Task
;
import
org.flowable.ui.modeler.domain.Model
;
import
org.flowable.ui.modeler.serviceapi.ModelService
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author: finegirl
* @date: 2021/7/29 14:00
* @description: 工作流外部调用
**/
@RestController
@CommonsLog
public
class
ApiFlowImpl
implements
IApiFlowFeign
{
// 流程引擎
@Resource
private
ProcessEngine
processEngine
;
// 部署服务
@Resource
private
RepositoryService
repositoryService
;
// 流程节点任务服务
@Resource
private
TaskService
taskService
;
// 模型服务
@Resource
private
ModelService
modelService
;
// 用户以及组管理服务
@Resource
private
IdentityService
identityService
;
// 流程实例服务
@Resource
private
RuntimeService
runtimeService
;
// 历史数据服务
@Resource
private
HistoryService
historyService
;
@Override
public
ApiRespPdu
<
String
>
deploy
(
String
modelId
)
throws
AppException
{
log
.
info
(
"流程部署!modelId:"
+
modelId
);
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
// 根据模型 ID 获取模型
Model
modelData
=
modelService
.
getModel
(
modelId
);
byte
[]
bytes
=
modelService
.
getBpmnXML
(
modelData
);
if
(
bytes
==
null
)
{
log
.
error
(
"模型数据为空,请先设计流程并成功保存,再进行发布"
);
rsp
.
setCode
(
YesNoEnum
.
NO
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
NO
.
getDesc
());
rsp
.
setData
(
"模型数据为空,请先设计流程并成功保存,再进行发布!"
);
}
BpmnModel
model
=
modelService
.
getBpmnModel
(
modelData
);
if
(
model
.
getProcesses
().
size
()
==
0
)
{
log
.
error
(
"数据模型不符要求,请至少设计一条主线流程"
);
rsp
.
setCode
(
YesNoEnum
.
NO
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
NO
.
getDesc
());
rsp
.
setData
(
"数据模型不符要求,请至少设计一条主线流程!"
);
}
byte
[]
bpmnBytes
=
new
BpmnXMLConverter
().
convertToXML
(
model
);
String
processName
=
modelData
.
getName
()
+
".bpmn20.xml"
;
// 部署流程
repositoryService
.
createDeployment
()
.
name
(
modelData
.
getName
())
.
addBytes
(
processName
,
bpmnBytes
)
.
deploy
();
log
.
info
(
"流程部署成功:"
+
modelId
+
" "
+
new
Date
());
rsp
.
setData
(
"流程部署成功:"
+
modelId
+
" "
+
new
Date
());
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
start
(
String
deployId
,
String
userId
,
String
dataKey
)
throws
AppException
{
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
// 设置发起人
identityService
.
setAuthenticatedUserId
(
userId
);
// 根据流程 ID 启动流程
ProcessInstance
processInstance
=
runtimeService
.
startProcessInstanceById
(
deployId
,
dataKey
);
log
.
info
(
"流程启动成功:"
+
deployId
+
" processInstance:"
+
JSON
.
toJSONString
(
processInstance
));
rsp
.
setData
(
JSON
.
toJSONString
(
processInstance
));
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
taskByAssignee
(
String
taskId
,
String
assignee
,
Map
<
String
,
Object
>
map
)
{
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
// 设置审核人
taskService
.
setAssignee
(
taskId
,
assignee
);
// 设置任务参数,也可不设置:key value,只是示例
// 带 Local 为局部参数,只适用于本任务,不带 Local 为全局任务,可在其他任务调用参数
taskService
.
setVariableLocal
(
taskId
,
"status"
,
true
);
// 完成任务
taskService
.
complete
(
taskId
,
map
);
log
.
info
(
"任务完成:"
+
taskId
+
" "
+
new
Date
());
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
deleteProcess
(
String
processId
)
{
return
null
;
}
@Override
public
ApiRespPdu
<
List
<
String
>>
getRuntimeDataId
()
{
return
null
;
}
@Override
public
ApiRespPdu
<
List
<
Map
<
String
,
Object
>>>
getRuntimeBusinessKeyByUser
(
String
userId
)
{
return
null
;
}
@Override
public
ApiRespPdu
<
List
<
Map
<
String
,
Object
>>>
getRuntimeBusinessKeyByGroup
(
List
<
String
>
groupIds
)
{
return
null
;
}
@Override
public
ApiRespPdu
<
List
<
Map
<
String
,
Object
>>>
getHistoryByUser
(
String
userId
)
{
return
null
;
}
@Override
public
ApiRespPdu
<
Boolean
>
checkProcessInstanceFinish
(
String
processInstanceId
)
{
return
null
;
}
@Override
public
ApiRespPdu
<
String
>
setVariables
(
String
taskId
,
Map
<
String
,
Object
>
map
)
{
log
.
info
(
"设置任务参数:"
+
taskId
+
" map:"
+
JSON
.
toJSONString
(
map
));
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
String
processInstanceId
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
().
getProcessInstanceId
();
runtimeService
.
setVariables
(
processInstanceId
,
map
);
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
setVariable
(
String
taskId
,
String
key
,
Object
value
)
{
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
String
processInstanceId
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
().
getProcessInstanceId
();
runtimeService
.
setVariable
(
processInstanceId
,
key
,
value
);
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
setListVariable
(
String
taskId
,
String
key
,
List
<
String
>
list
)
{
log
.
info
(
String
.
format
(
"设置任务参数:%s ,key:%s,list:%s"
,
taskId
,
key
,
JSON
.
toJSONString
(
list
)));
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
String
processInstanceId
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
().
getProcessInstanceId
();
runtimeService
.
setVariable
(
processInstanceId
,
key
,
list
);
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
task
(
String
taskId
)
{
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
Boolean
isSuspended
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
().
isSuspended
();
if
(
isSuspended
)
{
log
.
info
(
"任务已挂起,无法完成"
);
rsp
.
setCode
(
YesNoEnum
.
NO
.
getValue
());
rsp
.
setData
(
"任务已挂起,无法完成"
);
return
rsp
;
}
// 设置任务参数,也可不设置:key value
// 带 Local 为局部参数,只适用于本任务,不带 Local 为全局任务,可在其他任务调用参数
taskService
.
setVariableLocal
(
taskId
,
"status"
,
true
);
// 完成任务
taskService
.
complete
(
taskId
);
log
.
info
(
"任务完成:"
+
taskId
+
" "
+
new
Date
());
return
rsp
;
}
@Override
public
ApiRespPdu
<
String
>
getTaskInfo
(
String
taskId
)
{
ApiRespPdu
<
String
>
rsp
=
new
ApiRespPdu
<>();
rsp
.
setCode
(
YesNoEnum
.
YES
.
getValue
());
rsp
.
setMsg
(
YesNoEnum
.
YES
.
getDesc
());
Task
task
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
rsp
.
setData
(
task
.
getProcessInstanceId
());
return
rsp
;
}
@Override
public
String
getProcessDiagram
(
String
processInstanceId
)
throws
AppException
{
// 流程定义 ID
String
processDefinitionId
;
// 查看完成的进程中是否存在此进程
long
count
=
historyService
.
createHistoricProcessInstanceQuery
().
finished
().
processInstanceId
(
processInstanceId
).
count
();
if
(
count
>
0
)
{
// 如果流程已经结束,则得到结束节点
log
.
info
(
"流程已经结束,则得到结束节点!"
);
HistoricProcessInstance
pi
=
historyService
.
createHistoricProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
();
processDefinitionId
=
pi
.
getProcessDefinitionId
();
}
else
{
// 如果流程没有结束,则取当前活动节点
log
.
info
(
"流程没有结束,则取当前活动节点!"
);
// 根据流程实例ID获得当前处于活动状态的ActivityId合集
ProcessInstance
pi
=
runtimeService
.
createProcessInstanceQuery
().
processInstanceId
(
processInstanceId
).
singleResult
();
processDefinitionId
=
pi
.
getProcessDefinitionId
();
}
List
<
String
>
highLightedActivitis
=
new
ArrayList
<>();
// 获得活动的节点
List
<
HistoricActivityInstance
>
highLightedActivitList
=
historyService
.
createHistoricActivityInstanceQuery
().
processInstanceId
(
processInstanceId
).
orderByHistoricActivityInstanceStartTime
().
asc
().
list
();
for
(
HistoricActivityInstance
tempActivity
:
highLightedActivitList
)
{
String
activityId
=
tempActivity
.
getActivityId
();
highLightedActivitis
.
add
(
activityId
);
}
List
<
String
>
flows
=
new
ArrayList
<>();
// 获取流程图
BpmnModel
bpmnModel
=
repositoryService
.
getBpmnModel
(
processDefinitionId
);
ProcessEngineConfiguration
processEngineConfig
=
processEngine
.
getProcessEngineConfiguration
();
ProcessDiagramGenerator
diagramGenerator
=
processEngineConfig
.
getProcessDiagramGenerator
();
InputStream
in
=
diagramGenerator
.
generateDiagram
(
bpmnModel
,
"bmp"
,
highLightedActivitis
,
flows
,
processEngineConfig
.
getActivityFontName
(),
processEngineConfig
.
getLabelFontName
(),
processEngineConfig
.
getAnnotationFontName
(),
processEngineConfig
.
getClassLoader
(),
1.0
,
true
);
//通过流生成图片并转化为base64
return
Base64
.
encode
(
in
);
}
@Override
public
ApiRespPdu
<
String
>
getTaskProcessDiagram
(
String
taskId
)
{
return
null
;
}
}
government-flowable/src/main/java/com/mortals/xhx/flowable/listener/MyListener.java
View file @
9663fa30
package
com.mortals.xhx.flowable.listener
;
import
lombok.extern.apachecommons.CommonsLog
;
import
org.flowable.engine.RuntimeService
;
import
org.flowable.engine.delegate.DelegateExecution
;
import
org.flowable.engine.delegate.ExecutionListener
;
...
...
@@ -14,6 +15,7 @@ import javax.annotation.PostConstruct;
* 会签监听器示例
*/
@Component
@CommonsLog
public
class
MyListener
implements
ExecutionListener
{
// 页面配置参数注入
...
...
government-flowable/src/main/resources/static/index.html
View file @
9663fa30
...
...
@@ -27,7 +27,7 @@
<link
rel=
"Stylesheet"
href=
"libs/handsontable_0.31.2/handsontable.full.min.css"
type=
"text/css"
/>
<!-- build:css styles/3thparty.css -->
<link
rel=
"stylesheet"
href=
"libs/bootstrap_3.1.1/css/bootstrap.css"
/>
<link
rel=
"stylesheet"
href=
"libs/bootstrap_3.1.1/css/bootstrap.
min.
css"
/>
<link
rel=
"stylesheet"
href=
"libs/bootstrap-tour_0.9.1/bootstrap-tour.min.css"
/>
<link
rel=
"stylesheet"
href=
"libs/angular-spectrum-colorpicker_1.0.13/spectrum.css"
/>
<!-- endbuild -->
...
...
government-manager/pom.xml
View file @
9663fa30
...
...
@@ -25,6 +25,7 @@
</dependency>
<!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
...
...
government-manager/src/main/java/com/mortals/xhx/daemon/demo/RequestDispatchController.http
0 → 100644
View file @
9663fa30
###流程查询
POST {{baseUrl}}/m/test/task/acceptor
Content-Type: application/json
{"seq":"123456","transmission":{"processInstanceId":"11111"}}
###流程部署
POST {{baseUrl}}/m/test/task/deploy
Content-Type: application/json
{"seq":"123456","transmission":{"processInstanceId":"11111","modelId":"f589444d-efa8-11eb-99ca-c25bd865180b"}}
\ No newline at end of file
government-manager/src/main/java/com/mortals/xhx/daemon/demo/RequestDispatchController.java
0 → 100644
View file @
9663fa30
package
com.mortals.xhx.daemon.demo
;
import
com.alibaba.fastjson.JSON
;
import
com.mortals.xhx.common.model.RequestTaskReq
;
import
com.mortals.xhx.common.pdu.api.ApiReqPdu
;
import
com.mortals.xhx.common.pdu.api.ApiRespPdu
;
import
com.mortals.xhx.feign.flowable.IApiFlowFeign
;
import
lombok.extern.apachecommons.CommonsLog
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.HashMap
;
/**
* @author karlhoo
*/
@CommonsLog
@RestController
@RequestMapping
(
"test"
)
public
class
RequestDispatchController
{
@Autowired
private
IApiFlowFeign
apiFlowFeign
;
@PostMapping
(
"task/acceptor"
)
public
ApiRespPdu
taskAcceptor
(
@RequestBody
ApiReqPdu
<
RequestTaskReq
>
req
)
{
log
.
info
(
"receive api request:"
+
JSON
.
toJSONString
(
req
));
String
processDiagram
=
apiFlowFeign
.
getProcessDiagram
(
req
.
getTransmission
().
getProcessInstanceId
());
log
.
info
(
"receive api base64 receive:"
+
processDiagram
);
ApiRespPdu
<
String
>
respPdu
=
new
ApiRespPdu
<>();
respPdu
.
setData
(
processDiagram
);
return
respPdu
;
}
@PostMapping
(
"task/deploy"
)
public
ApiRespPdu
deploy
(
@RequestBody
ApiReqPdu
<
RequestTaskReq
>
req
)
{
log
.
info
(
"receive api request:"
+
JSON
.
toJSONString
(
req
));
ApiRespPdu
<
String
>
deploy
=
apiFlowFeign
.
deploy
(
req
.
getTransmission
().
getModelId
());
log
.
info
(
"receive api base64 receive:"
+
JSON
.
toJSONString
(
deploy
));
ApiRespPdu
<
String
>
respPdu
=
new
ApiRespPdu
<>();
respPdu
.
setData
(
JSON
.
toJSONString
(
deploy
));
return
respPdu
;
}
@PostMapping
(
"task/start"
)
public
ApiRespPdu
start
(
@RequestBody
ApiReqPdu
<
RequestTaskReq
>
req
)
{
log
.
info
(
"receive api request:"
+
JSON
.
toJSONString
(
req
));
ApiRespPdu
<
String
>
start
=
apiFlowFeign
.
start
(
req
.
getTransmission
().
getDeployId
(),
req
.
getTransmission
().
getUserId
(),
req
.
getTransmission
().
getDataKey
());
log
.
info
(
"receive api start receive:"
+
JSON
.
toJSONString
(
start
));
ApiRespPdu
<
String
>
respPdu
=
new
ApiRespPdu
<>();
respPdu
.
setData
(
JSON
.
toJSONString
(
start
));
return
respPdu
;
}
@PostMapping
(
"task/complete"
)
public
ApiRespPdu
taskComplete
(
@RequestBody
ApiReqPdu
<
RequestTaskReq
>
req
)
{
log
.
info
(
"receive api request:"
+
JSON
.
toJSONString
(
req
));
//任务完成,设置审核人,完成当前任务
HashMap
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"test"
,
"1111"
);
apiFlowFeign
.
taskByAssignee
(
req
.
getTransmission
().
getTaskId
(),
req
.
getTransmission
().
getAssignee
(),
map
);
ApiRespPdu
<
String
>
start
=
apiFlowFeign
.
start
(
req
.
getTransmission
().
getDeployId
(),
req
.
getTransmission
().
getUserId
(),
req
.
getTransmission
().
getDataKey
());
log
.
info
(
"receive api complete receive:"
+
JSON
.
toJSONString
(
start
));
ApiRespPdu
<
String
>
respPdu
=
new
ApiRespPdu
<>();
respPdu
.
setData
(
JSON
.
toJSONString
(
start
));
return
respPdu
;
}
public
static
void
main
(
String
[]
args
)
{
RequestTaskReq
requestTaskReq
=
new
RequestTaskReq
();
requestTaskReq
.
setProcessInstanceId
(
"11111"
);
requestTaskReq
.
setDeployId
(
"1"
);
requestTaskReq
.
setUserId
(
"admin"
);
requestTaskReq
.
setDataKey
(
"data"
);
ApiReqPdu
<
RequestTaskReq
>
requestTaskReqApiReqPdu
=
new
ApiReqPdu
<>();
requestTaskReqApiReqPdu
.
setTransmission
(
requestTaskReq
);
requestTaskReqApiReqPdu
.
setSeq
(
"123456"
);
System
.
out
.
println
(
JSON
.
toJSONString
(
requestTaskReqApiReqPdu
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment