背景
项目需要使用工作流,选择了Flowable,流程任务需要填写表单,并且需要当前任务查看上一任务填写的表单,还需要实现流程与表单一同部署。所以今天主要说的是:
1.使用Flowable自带的设计器实现部署流程时与流程中的表单一同部署并且关联起来。
2.当前任务可以查看所有之前任务的表单及内容。
前端
直接集成到自己的前端项目就行。
首先选择任务节点点击图中红圈部分选择引用的表单
然后会弹出表单列表
可以选择已有的也可以选择新建,新建跳转到下面页面:
之后直接拖拽设计就好。
后端
官方的Api不知道有没有实现流程与表单同时部署的,这里我自己实现的。直接看代码。
@Test
void goSuccess() {
//部署流程
Model modelData = modelService.getModel("141d6221-7cca-11eb-8cb0-00ff4106d38e");
BpmnModel model = modelService.getBpmnModel(modelData);
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
String processName = modelData.getName() + ".bpmn20.xml";
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.key(modelData.getKey())
.addBytes(processName, bpmnBytes)
.deploy();
//找到流程使用的所有表单
List<Process> processes = model.getProcesses();
ArrayList<UserTask> userTasks = new ArrayList<>();
for (Process process : processes) {
Collection<FlowElement> flowElements = process.getFlowElements();
for (FlowElement flowElement : flowElements) {
try {
UserTask u = (UserTask) flowElement;
if (StringUtils.isNotBlank(u.getFormKey())) {
userTasks.add(u);
}
} catch (Exception x) {
}
}
}
ArrayList<Model> models = new ArrayList<>();
for (UserTask userTask : userTasks) {
ModelKeyRepresentation mkp = modelService.validateModelKey(null, 2, userTask.getFormKey());
models.add(modelService.getModel(mkp.getId()));
}
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
deploymentId(deployment.getId())
.singleResult();
//部署表单
for (Model m : models) {
formRepositoryService.createDeployment()
.name(m.getKey() + ":X:" + m.getId())
.addFormBytes(m.getKey() + "_pro.form", m.getModelEditorJson().getBytes())//必须是.form结尾
.parentDeploymentId(deployment.getId())
.deploy();
}
//启动实例
HashMap<String, Object> map = new HashMap<>();
map.put("creator", "443");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinition.getKey(), map);
//提交任务
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//查询任务表单
FormInfo tf = taskService.getTaskFormModel(task.getId());
//查表单定义
FormDefinition formDefinition = formRepositoryService.createFormDefinitionQuery().formId(tf.getId()).singleResult();
Map<String, Object> formProperties;
formProperties = new HashMap<>();
formProperties.put("name", "张三伐木累");
formProperties.put("time", "2018-12-14");
formProperties.put("dept", "1");
taskService.completeTaskWithForm(task.getId(), formDefinition.getId(), "通过", formProperties);
//第二个任务
Task task2 = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//查询任务表单
FormInfo tf2 = taskService.getTaskFormModel(task.getId());
//查表单定义
FormDefinition formDefinition2 = formRepositoryService.createFormDefinitionQuery().formId(tf2.getId()).singleResult();
Map<String, Object> formProperties2;
formProperties2 = new HashMap<>();
formProperties2.put("bigName", "张飞");
formProperties2.put("myFile", "http://kk.jpg");
formProperties2.put("isEat", "吃了");
taskService.completeTaskWithForm(task2.getId(), formDefinition2.getId(), "通过", formProperties2);
//查询历史
List<HistoricActivityInstance> hisend = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstance.getProcessInstanceId()).activityType("userTask").finished().list();
//得到历史表单
ArrayList<FormModel> formModels = new ArrayList<>();
for (HistoricActivityInstance instance : hisend) {
if (instance.getTaskId() != null) {
FormInfo fm = taskService.getTaskFormModel(instance.getTaskId());
formModels.add(fm.getFormModel());
System.out.println(6);
}
}
System.out.println(666);
}
做个简单记录,有问题或者有更好的方法可以留言。
版权声明:本文为weixin_45362084原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。