1、流程保存的时候检测开始节点是否有form设置,有就是直接进行流程表单的关联处理,默认就是开始节点的form作为流程关联form。
@SuppressWarnings("null")
@ApiOperation(value = "保存流程设计器内的xml文件")
@PostMapping("/save")
public Result save(@RequestBody FlowSaveXmlVo vo) {
InputStream in = null;
BpmnModel bpmnModel = FlowableUtils.getBpmnModel(vo.getXml());
if (ObjectUtil.isEmpty(bpmnModel)) {
throw new RuntimeException("获取模型设计失败!");
}
String processName = bpmnModel.getMainProcess().getName();
// 获取开始节点
StartEvent startEvent = FlowableUtils.getStartEvent(bpmnModel);
if (ObjectUtil.isNull(startEvent)) {
throw new RuntimeException("开始节点不存在,请检查流程设计是否有误!");
}
try {
in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8));
String deployId = flowDefinitionService.importFile(vo.getName(), vo.getCategory(), in);
// 导入成功,保存流程实例节点的表单关联信息
flowDefinitionService.saveDeployForm(deployId, bpmnModel);
} catch (Exception e) {
log.error("导入失败:", e);
return Result.error(e.getMessage());
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
log.error("关闭输入流出错", e);
}
}
return Result.OK("导入成功");
}
/**
* 新增流程实例关联表单
*
* @param deployId,bpmnModel 流程实例关联表单
* @return boolean
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveDeployForm(String deployId, BpmnModel bpmnModel) {
List<SysDeployForm> deployFormList = new ArrayList<>();
// 获取开始节点
StartEvent startEvent = FlowableUtils.getStartEvent(bpmnModel);
if (ObjectUtil.isNull(startEvent)) {
throw new RuntimeException("开始节点不存在,请检查流程设计是否有误!");
}
// 保存开始节点表单信息
SysDeployForm startDeployForm = buildDeployForm(deployId, startEvent);
if (ObjectUtil.isNotNull(startDeployForm)) {
deployFormList.add(startDeployForm);
}
// 保存用户节点表单信息
Collection<UserTask> userTasks = FlowableUtils.getAllUserTaskEvent(bpmnModel);
if (CollUtil.isNotEmpty(userTasks)) {
for (UserTask userTask : userTasks) {
SysDeployForm userTaskDeployForm = buildDeployForm(deployId, userTask);
if (ObjectUtil.isNotNull(userTaskDeployForm)) {
deployFormList.add(userTaskDeployForm);
}
}
}
// 批量新增部署流程和表单关联信息
return sysDeployFormService.insertBatch(deployFormList);
}
/**
* 构建发布表单关联信息对象
* @param deployId 部署ID
* @param node 节点信息
* @return 发布表单关联对象。若无表单信息(formKey),则返回null
*/
private SysDeployForm buildDeployForm(String deployId, FlowNode node) {
String formKey = null;
SysDeployForm deployForm = new SysDeployForm();
if (node instanceof StartEvent) {
formKey = ((StartEvent) node).getFormKey();
deployForm.setFormFlag("1"); //作为开始form表单标志
} else if (node instanceof UserTask) {
formKey = ((UserTask) node).getFormKey();
}
if (StringUtils.isEmpty(formKey)) {
return null;
}
SysForm sysForm = sysFormMapper.selectSysFormById(formKey);
if (ObjectUtil.isNull(sysForm)) {
throw new RuntimeException("表单信息查询错误");
}
deployForm.setDeployId(deployId);
deployForm.setNodeKey(node.getId());
deployForm.setNodeName(node.getName());
deployForm.setFormId(formKey);
return deployForm;
}
由于考虑到要支持其它各种类型的流程,包括钉钉等等,所以也容许用户进行表单自己手工绑定,不限制只能在流程里进行表单的绑定,目前还只支持在线formdesigner的表单绑定,还不支持online在线表单的绑定,后续考虑集成。