flowableUI源码分析(二)

比眉伴天荒 2023-10-01 21:44 53阅读 0赞

3.编辑BPM流程图

保存接口参照2.1

3.1前端框架生成流程图数据

保存流程图后,前端框架生成json_xml数据传递给后端。

在这里插入图片描述

3.2任务节点节点解析

BPM流程图关联两张表单。

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uvceg5cW-1650786151879)(..\\mark\\img\\flowable\\form\_two\_bpm.png)\]

3.3.JSON数据解析
  • resourceId,任务节点ID
  • outgoing,流转下一个节点ID
  • bounds,BPM图中,定位坐标
  • properties,属性,其中“formreference”关联表单属性

    {

    1. "resourceId": "5423e83a-c397-11ec-a0fb-005056c00008",
    2. "properties": {
    3. "overrideid": "",
    4. "name": "第一次请假表单申请",
    5. "documentation": "",
    6. "asynchronousdefinition": "false",
    7. "exclusivedefinition": "false",
    8. "executionlisteners": "",
    9. "multiinstance_type": "None",
    10. "multiinstance_variableaggregations": "",
    11. "multiinstance_cardinality": "",
    12. "multiinstance_collection": "",
    13. "multiinstance_variable": "",
    14. "multiinstance_condition": "",
    15. "isforcompensation": "false",
    16. "usertaskassignment": "",
    17. "formkeydefinition": "",
    18. "formreference": {
    19. "id": "b6d3a70a-bb04-11ec-82e1-005056c00008",
    20. "name": "请假申请流程单",
    21. "key": "holiday-form"
    22. },
    23. "formfieldvalidation": true,
    24. "duedatedefinition": "",
    25. "prioritydefinition": "",
    26. "formproperties": "",
    27. "tasklisteners": "",
    28. "skipexpression": "",
    29. "categorydefinition": "",
    30. "taskidvariablename": ""
    31. },
    32. "stencil": {
    33. "id": "UserTask"
    34. },
    35. "childShapes": [],
    36. "outgoing": [{
    37. "resourceId": "sid-25AD7465-7395-434A-81B0-1B3D7FED1B00"
    38. }],
    39. "bounds": {
    40. "lowerRight": {
    41. "x": 371,
    42. "y": 198
    43. },
    44. "upperLeft": {
    45. "x": 271,
    46. "y": 118
    47. }
    48. },
    49. "dockers": []
    50. },

保存BPM图过程中, 2.处理表单关联关系

  1. if ((model.getModelType() == null || model.getModelType().intValue() == Model.MODEL_TYPE_BPMN)) {
  2. // 1.创建缩略图
  3. byte[] thumbnail = modelImageService.generateThumbnailImage(model, jsonNode);
  4. if (thumbnail != null) {
  5. model.setThumbnail(thumbnail);
  6. }
  7. modelRepository.save(model);
  8. // 2.处理表单关联关系
  9. handleBpmnProcessFormModelRelations(model, jsonNode);
  10. handleBpmnProcessDecisionTaskModelRelations(model, jsonNode);
  11. }
3.4入库处理

BPM流程ID为,5423e83a-c397-11ec-a0fb-005056c00008

表单1的ID,b6d3a70a-bb04-11ec-82e1-005056c00008

表单2的ID,da810f33-c394-11ec-a0fb-005056c00008

  1. INSERT INTO `project_flowable`.`act_de_model_relation` (`id`, `parent_model_id`, `model_id`, `relation_type`) VALUES ('22cf0d8b-c399-11ec-a0fb-005056c00008', '5423e83a-c397-11ec-a0fb-005056c00008', 'da810f33-c394-11ec-a0fb-005056c00008', 'form-model');
  2. INSERT INTO `project_flowable`.`act_de_model_relation` (`id`, `parent_model_id`, `model_id`, `relation_type`) VALUES ('232bac7c-c399-11ec-a0fb-005056c00008', '5423e83a-c397-11ec-a0fb-005056c00008', 'b6d3a70a-bb04-11ec-82e1-005056c00008', 'form-model');
  3. /**
  4. * 维护form和bpm图的关系,入库act_de_model_relation表操作
  5. * Generic handling of model relations: deleting/adding where needed.
  6. */
  7. protected void handleModelRelations(AbstractModel bpmnProcessModel, Set<String> idsReferencedInJson,
  8. String relationshipType) {
  9. // Find existing persisted relations
  10. List<ModelRelation> persistedModelRelations =
  11. modelRelationRepository.findByParentModelIdAndType(bpmnProcessModel.getId(), relationshipType);
  12. // if no ids referenced now, just delete them all
  13. if (idsReferencedInJson == null || idsReferencedInJson.size() == 0) {
  14. for (ModelRelation modelRelation : persistedModelRelations) {
  15. modelRelationRepository.delete(modelRelation);
  16. }
  17. return;
  18. }
  19. Set<String> alreadyPersistedModelIds = new HashSet<>(persistedModelRelations.size());
  20. for (ModelRelation persistedModelRelation : persistedModelRelations) {
  21. if (!idsReferencedInJson.contains(persistedModelRelation.getModelId())) {
  22. // model used to be referenced, but not anymore. Delete it.
  23. modelRelationRepository.delete(persistedModelRelation);
  24. } else {
  25. alreadyPersistedModelIds.add(persistedModelRelation.getModelId());
  26. }
  27. }
  28. // 表单管理关系入库处理
  29. // Loop over all referenced ids and see which one are new
  30. for (String idReferencedInJson : idsReferencedInJson) {
  31. // if model is referenced, but it is not yet persisted = create it
  32. if (!alreadyPersistedModelIds.contains(idReferencedInJson)) {
  33. // Check if model actually still exists. Don't create the relationship if it doesn't exist. The client
  34. // UI will have cope with this too.
  35. if (modelRepository.get(idReferencedInJson) != null) {
  36. modelRelationRepository.save(new ModelRelation(bpmnProcessModel.getId(), idReferencedInJson, relationshipType));
  37. }
  38. }
  39. }
  40. }

3 . 创建与更新应用

模型表中modelType =3 为app应用。该模型属于为发布应用。

在flowableAdmin的“应用程序”界面创建应用程序

首先在flowableAdmin的“应用程序”界面创建应用程序(流程定义创建不能添加bpm关系,只能在编辑界面关联),然后在编辑界面绑定bpm流程图。

3.1 创建应用模型

创建应用JSON数据

  1. {
  2. "name": "创建流程定义1",
  3. "key": "creat_1",
  4. "description": "111",
  5. "modelType": 3
  6. }
  7. /**
  8. * 创建流程定义、BPM流程图
  9. *
  10. * @param modelRepresentation
  11. * @return
  12. */
  13. @PostMapping(value = "/rest/models", produces = "application/json")
  14. public ModelRepresentation createModel(@RequestBody ModelRepresentation modelRepresentation) {
  15. modelRepresentation.setKey(modelRepresentation.getKey().replaceAll(" ", ""));
  16. checkForDuplicateKey(modelRepresentation);
  17. String json = modelService.createModelJson(modelRepresentation);
  18. Model newModel = modelService.createModel(modelRepresentation, json, SecurityUtils.getCurrentUserId());
  19. return new ModelRepresentation(newModel);
  20. }
3.2 更新接口
  1. /**
  2. * 更新流程定义
  3. *
  4. * @param modelId
  5. * @param updatedModel
  6. * @return
  7. */
  8. @PutMapping(value = "/rest/app-definitions/{modelId}", produces = "application/json")
  9. public AppDefinitionUpdateResultRepresentation updateAppDefinition(@PathVariable("modelId") String modelId,
  10. @RequestBody AppDefinitionSaveRepresentation updatedModel) {
  11. AppDefinitionUpdateResultRepresentation resultRepresentation = null;
  12. try {
  13. resultRepresentation = appDefinitionService.updateAppDefinition(modelId, updatedModel);
  14. } catch (Exception ex) {
  15. resultRepresentation = new AppDefinitionUpdateResultRepresentation();
  16. resultRepresentation.setError(true);
  17. resultRepresentation.setErrorDescription(ex.getMessage());
  18. }
  19. return resultRepresentation;
  20. }

传递关键JSON数据

ID,5423e83a-c397-11ec-a0fb-005056c00008。为act_de_model表中 app模型。

ID,5423e83a-c397-11ec-a0fb-005056c00008。为act_de_model表中 流程图模型。

  1. {
  2. "id": "5423e83a-c397-11ec-a0fb-005056c0000",
  3. "name": "创建流程定义1",
  4. "key": "creat_1",
  5. "description": "111",
  6. "version": 1,
  7. "created": 1650785164627,
  8. "definition": {
  9. "theme": "theme-1",
  10. "icon": "glyphicon-asterisk",
  11. "models": [
  12. {
  13. "id": "5423e83a-c397-11ec-a0fb-005056c00008",
  14. "name": "t流程2",
  15. "version": 1,
  16. "modelType": 0,
  17. "description": "2",
  18. "createdBy": "xiaoming",
  19. "lastUpdatedBy": "xiaoming",
  20. "lastUpdated": 1650781946792
  21. }
  22. ]
  23. }
  24. }
3.2 持久化关系

act_de_model表更新MODEL_TYPE_APP = 3的数据

因为关联了BPM流程图

  • act_de_model更新model模型
  • act_de_model_relation关系表新增BPM模型和流程定义之间的关系

调用1.1 持久化业务代码逻辑

  1. // 持久化代码
  2. else if (model.getModelType().intValue() == Model.MODEL_TYPE_APP) {
  3. // act_de_model更新
  4. modelRepository.save(model);
  5. // act_de_model_relation更新
  6. handleAppModelProcessRelations(model, jsonNode);
  7. }

4. 小结

对于flowableUI,把bpm流程图、app应用、form表单,都装载到act_de_model表中维护记录。

  • bpm流程图与form表单在act_de_model_relation关联维护,用relation_type=form-model维护
  • app应用与把bpm流程图在act_de_model_relation关联维护,用relation_type=process-model维护

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读