Commit a207412e8cdabe8a04eb517896f484d12d07adef
1 parent
9c452ee6
工作流 Flowable 流程模型接口 部分实现
Showing
5 changed files
with
180 additions
and
35 deletions
yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelCommonService.java
| 1 | package cn.iocoder.yudao.module.bpm.service.definition; | 1 | package cn.iocoder.yudao.module.bpm.service.definition; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO; | ||
| 5 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO; | 4 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; |
| 5 | + | ||
| 6 | +import javax.validation.Valid; | ||
| 6 | 7 | ||
| 7 | /** | 8 | /** |
| 8 | * 流程模型通用接口 | 9 | * 流程模型通用接口 |
| @@ -19,4 +20,28 @@ public interface BpmModelCommonService { | @@ -19,4 +20,28 @@ public interface BpmModelCommonService { | ||
| 19 | * @return 流程模型分页 | 20 | * @return 流程模型分页 |
| 20 | */ | 21 | */ |
| 21 | PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO); | 22 | PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO); |
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * 创建流程模型 | ||
| 26 | + * | ||
| 27 | + * @param modelVO 创建信息 | ||
| 28 | + * @param bpmnXml BPMN XML | ||
| 29 | + * @return 创建的流程模型的编号 | ||
| 30 | + */ | ||
| 31 | + String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml); | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * 获得流程模块 | ||
| 35 | + * | ||
| 36 | + * @param id 编号 | ||
| 37 | + * @return 流程模型 | ||
| 38 | + */ | ||
| 39 | + BpmModelRespVO getModel(String id); | ||
| 40 | + | ||
| 41 | + /** | ||
| 42 | + * 修改流程模型 | ||
| 43 | + * | ||
| 44 | + * @param updateReqVO 更新信息 | ||
| 45 | + */ | ||
| 46 | + void updateModel(@Valid BpmModelUpdateReqVO updateReqVO); | ||
| 22 | } | 47 | } |
yudao-module-bpm/yudao-module-bpm-impl-activiti/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java
| @@ -13,29 +13,6 @@ import javax.validation.Valid; | @@ -13,29 +13,6 @@ import javax.validation.Valid; | ||
| 13 | */ | 13 | */ |
| 14 | public interface BpmModelService extends BpmModelCommonService { | 14 | public interface BpmModelService extends BpmModelCommonService { |
| 15 | 15 | ||
| 16 | - /** | ||
| 17 | - * 获得流程模块 | ||
| 18 | - * | ||
| 19 | - * @param id 编号 | ||
| 20 | - * @return 流程模型 | ||
| 21 | - */ | ||
| 22 | - BpmModelRespVO getModel(String id); | ||
| 23 | - | ||
| 24 | - /** | ||
| 25 | - * 创建流程模型 | ||
| 26 | - * | ||
| 27 | - * @param modelVO 创建信息 | ||
| 28 | - * @param bpmnXml BPMN XML | ||
| 29 | - * @return 创建的流程模型的编号 | ||
| 30 | - */ | ||
| 31 | - String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml); | ||
| 32 | - | ||
| 33 | - /** | ||
| 34 | - * 修改流程模型 | ||
| 35 | - * | ||
| 36 | - * @param updateReqVO 更新信息 | ||
| 37 | - */ | ||
| 38 | - void updateModel(@Valid BpmModelUpdateReqVO updateReqVO); | ||
| 39 | 16 | ||
| 40 | /** | 17 | /** |
| 41 | * 将流程模型,部署成一个流程定义 | 18 | * 将流程模型,部署成一个流程定义 |
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/FlowableModelController.java
| @@ -2,17 +2,21 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition; | @@ -2,17 +2,21 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO; | ||
| 6 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO; | 5 | +import cn.iocoder.yudao.framework.common.util.io.IoUtils; |
| 6 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; | ||
| 7 | +import cn.iocoder.yudao.module.bpm.convert.definition.ModelConvert; | ||
| 7 | import cn.iocoder.yudao.module.bpm.service.definition.FlowableModelService; | 8 | import cn.iocoder.yudao.module.bpm.service.definition.FlowableModelService; |
| 8 | import io.swagger.annotations.Api; | 9 | import io.swagger.annotations.Api; |
| 10 | +import io.swagger.annotations.ApiImplicitParam; | ||
| 9 | import io.swagger.annotations.ApiOperation; | 11 | import io.swagger.annotations.ApiOperation; |
| 12 | +import org.springframework.security.access.prepost.PreAuthorize; | ||
| 10 | import org.springframework.validation.annotation.Validated; | 13 | import org.springframework.validation.annotation.Validated; |
| 11 | -import org.springframework.web.bind.annotation.GetMapping; | ||
| 12 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
| 13 | -import org.springframework.web.bind.annotation.RestController; | 14 | +import org.springframework.web.bind.annotation.*; |
| 14 | 15 | ||
| 15 | import javax.annotation.Resource; | 16 | import javax.annotation.Resource; |
| 17 | +import javax.validation.Valid; | ||
| 18 | + | ||
| 19 | +import java.io.IOException; | ||
| 16 | 20 | ||
| 17 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 18 | 22 | ||
| @@ -30,4 +34,37 @@ public class FlowableModelController { | @@ -30,4 +34,37 @@ public class FlowableModelController { | ||
| 30 | public CommonResult<PageResult<BpmModelPageItemRespVO>> getModelPage(BpmModelPageReqVO pageVO) { | 34 | public CommonResult<PageResult<BpmModelPageItemRespVO>> getModelPage(BpmModelPageReqVO pageVO) { |
| 31 | return success(modelService.getModelPage(pageVO)); | 35 | return success(modelService.getModelPage(pageVO)); |
| 32 | } | 36 | } |
| 37 | + | ||
| 38 | + @GetMapping("/get") | ||
| 39 | + @ApiOperation("获得模型") | ||
| 40 | + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class) | ||
| 41 | + @PreAuthorize("@ss.hasPermission('bpm:model:query')") | ||
| 42 | + public CommonResult<BpmModelRespVO> getModel(@RequestParam("id") String id) { | ||
| 43 | + BpmModelRespVO model = modelService.getModel(id); | ||
| 44 | + return success(model); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + @PostMapping("/create") | ||
| 48 | + @ApiOperation(value = "新建模型") | ||
| 49 | + @PreAuthorize("@ss.hasPermission('bpm:model:create')") | ||
| 50 | + public CommonResult<String> createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) { | ||
| 51 | + return success(modelService.createModel(createRetVO, null)); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + @PutMapping("/update") | ||
| 55 | + @ApiOperation(value = "修改模型") | ||
| 56 | + @PreAuthorize("@ss.hasPermission('bpm:model:update')") | ||
| 57 | + public CommonResult<Boolean> updateModel(@Valid @RequestBody BpmModelUpdateReqVO modelVO) { | ||
| 58 | + modelService.updateModel(modelVO); | ||
| 59 | + return success(true); | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + @PostMapping("/import") | ||
| 63 | + @ApiOperation(value = "导入模型") | ||
| 64 | + public CommonResult<String> importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException { | ||
| 65 | + BpmModelCreateReqVO createReqVO = ModelConvert.INSTANCE.convert(importReqVO); | ||
| 66 | + // 读取文件 | ||
| 67 | + String bpmnXml = IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false); | ||
| 68 | + return success(modelService.createModel(createReqVO, bpmnXml)); | ||
| 69 | + } | ||
| 33 | } | 70 | } |
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/ModelConvert.java
| 1 | package cn.iocoder.yudao.module.bpm.convert.definition; | 1 | package cn.iocoder.yudao.module.bpm.convert.definition; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.StrUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 4 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 5 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 5 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelBaseVO; | ||
| 6 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO; | ||
| 7 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelRespVO; | 6 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; |
| 8 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; | 7 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; |
| 9 | import cn.iocoder.yudao.module.bpm.service.definition.dto.ModelMetaInfoRespDTO; | 8 | import cn.iocoder.yudao.module.bpm.service.definition.dto.ModelMetaInfoRespDTO; |
| 10 | import org.flowable.common.engine.impl.db.SuspensionState; | 9 | import org.flowable.common.engine.impl.db.SuspensionState; |
| @@ -17,6 +16,7 @@ import org.mapstruct.factory.Mappers; | @@ -17,6 +16,7 @@ import org.mapstruct.factory.Mappers; | ||
| 17 | 16 | ||
| 18 | import java.util.List; | 17 | import java.util.List; |
| 19 | import java.util.Map; | 18 | import java.util.Map; |
| 19 | +import java.util.Objects; | ||
| 20 | 20 | ||
| 21 | /** | 21 | /** |
| 22 | * 流程模型 Convert | 22 | * 流程模型 Convert |
| @@ -78,8 +78,42 @@ public interface ModelConvert { | @@ -78,8 +78,42 @@ public interface ModelConvert { | ||
| 78 | ModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), ModelMetaInfoRespDTO.class); | 78 | ModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), ModelMetaInfoRespDTO.class); |
| 79 | copyTo(metaInfo, to); | 79 | copyTo(metaInfo, to); |
| 80 | } | 80 | } |
| 81 | + BpmModelCreateReqVO convert(BpmModeImportReqVO bean); | ||
| 81 | 82 | ||
| 82 | void copyTo(ModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); | 83 | void copyTo(ModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); |
| 83 | 84 | ||
| 84 | BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean); | 85 | BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean); |
| 86 | + | ||
| 87 | + default void copy(Model model, BpmModelCreateReqVO bean) { | ||
| 88 | + model.setName(bean.getName()); | ||
| 89 | + model.setKey(bean.getKey()); | ||
| 90 | + model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null, | ||
| 91 | + null, null)); | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + default void copy(Model model, BpmModelUpdateReqVO bean) { | ||
| 95 | + model.setName(bean.getName()); | ||
| 96 | + model.setCategory(bean.getCategory()); | ||
| 97 | + model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), ModelMetaInfoRespDTO.class), | ||
| 98 | + bean.getDescription(), bean.getFormType(), bean.getFormId(), | ||
| 99 | + bean.getFormCustomCreatePath(), bean.getFormCustomViewPath())); | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + default String buildMetaInfoStr(ModelMetaInfoRespDTO metaInfo, String description, Integer formType, | ||
| 103 | + Long formId, String formCustomCreatePath, String formCustomViewPath) { | ||
| 104 | + if (metaInfo == null) { | ||
| 105 | + metaInfo = new ModelMetaInfoRespDTO(); | ||
| 106 | + } | ||
| 107 | + // 只有非空,才进行设置,避免更新时的覆盖 | ||
| 108 | + if (StrUtil.isNotEmpty(description)) { | ||
| 109 | + metaInfo.setDescription(description); | ||
| 110 | + } | ||
| 111 | + if (Objects.nonNull(formType)) { | ||
| 112 | + metaInfo.setFormType(formType); | ||
| 113 | + metaInfo.setFormId(formId); | ||
| 114 | + metaInfo.setFormCustomCreatePath(formCustomCreatePath); | ||
| 115 | + metaInfo.setFormCustomViewPath(formCustomViewPath); | ||
| 116 | + } | ||
| 117 | + return JsonUtils.toJsonString(metaInfo); | ||
| 118 | + } | ||
| 85 | } | 119 | } |
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/FlowableModelServiceImpl.java
| @@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -5,8 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 6 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 6 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 7 | import cn.iocoder.yudao.framework.common.util.object.PageUtils; | 7 | import cn.iocoder.yudao.framework.common.util.object.PageUtils; |
| 8 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO; | ||
| 9 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO; | 8 | +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; |
| 9 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; | ||
| 10 | import cn.iocoder.yudao.module.bpm.convert.definition.ModelConvert; | 10 | import cn.iocoder.yudao.module.bpm.convert.definition.ModelConvert; |
| 11 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; | 11 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; |
| 12 | import cn.iocoder.yudao.module.bpm.service.definition.dto.ModelMetaInfoRespDTO; | 12 | import cn.iocoder.yudao.module.bpm.service.definition.dto.ModelMetaInfoRespDTO; |
| @@ -17,21 +17,27 @@ import org.flowable.engine.repository.Model; | @@ -17,21 +17,27 @@ import org.flowable.engine.repository.Model; | ||
| 17 | import org.flowable.engine.repository.ModelQuery; | 17 | import org.flowable.engine.repository.ModelQuery; |
| 18 | import org.flowable.engine.repository.ProcessDefinition; | 18 | import org.flowable.engine.repository.ProcessDefinition; |
| 19 | import org.springframework.stereotype.Service; | 19 | import org.springframework.stereotype.Service; |
| 20 | +import org.springframework.transaction.annotation.Transactional; | ||
| 20 | import org.springframework.validation.annotation.Validated; | 21 | import org.springframework.validation.annotation.Validated; |
| 21 | 22 | ||
| 22 | import javax.annotation.Resource; | 23 | import javax.annotation.Resource; |
| 24 | +import javax.validation.Valid; | ||
| 23 | import java.util.HashSet; | 25 | import java.util.HashSet; |
| 24 | import java.util.List; | 26 | import java.util.List; |
| 25 | import java.util.Map; | 27 | import java.util.Map; |
| 26 | import java.util.Set; | 28 | import java.util.Set; |
| 27 | 29 | ||
| 30 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 28 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | 31 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| 32 | +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; | ||
| 33 | + | ||
| 29 | /** | 34 | /** |
| 30 | * Flowable流程模型实现 | 35 | * Flowable流程模型实现 |
| 31 | * 主要进行 Flowable {@link Model} 的维护 | 36 | * 主要进行 Flowable {@link Model} 的维护 |
| 32 | * | 37 | * |
| 33 | * @author yunlongn | 38 | * @author yunlongn |
| 34 | * @author 芋道源码 | 39 | * @author 芋道源码 |
| 40 | + * @author jason | ||
| 35 | */ | 41 | */ |
| 36 | @Service | 42 | @Service |
| 37 | @Validated | 43 | @Validated |
| @@ -80,4 +86,70 @@ public class FlowableModelServiceImpl implements FlowableModelService { | @@ -80,4 +86,70 @@ public class FlowableModelServiceImpl implements FlowableModelService { | ||
| 80 | long modelCount = modelQuery.count(); | 86 | long modelCount = modelQuery.count(); |
| 81 | return new PageResult<>(ModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount); | 87 | return new PageResult<>(ModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount); |
| 82 | } | 88 | } |
| 89 | + | ||
| 90 | + @Override | ||
| 91 | + @Transactional(rollbackFor = Exception.class) | ||
| 92 | + public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) { | ||
| 93 | + checkKeyNCName(createReqVO.getKey()); | ||
| 94 | + // 校验流程标识已经存在 | ||
| 95 | + Model keyModel = this.getModelByKey(createReqVO.getKey()); | ||
| 96 | + if (keyModel != null) { | ||
| 97 | + throw exception(MODEL_KEY_EXISTS, createReqVO.getKey()); | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + // 创建流程定义 | ||
| 101 | + Model model = repositoryService.newModel(); | ||
| 102 | + ModelConvert.INSTANCE.copy(model, createReqVO); | ||
| 103 | + // 保存流程定义 | ||
| 104 | + repositoryService.saveModel(model); | ||
| 105 | + // 保存 BPMN XML | ||
| 106 | + saveModelBpmnXml(model, bpmnXml); | ||
| 107 | + return model.getId(); | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + @Override | ||
| 111 | + public BpmModelRespVO getModel(String id) { | ||
| 112 | + Model model = repositoryService.getModel(id); | ||
| 113 | + if (model == null) { | ||
| 114 | + return null; | ||
| 115 | + } | ||
| 116 | + BpmModelRespVO modelRespVO = ModelConvert.INSTANCE.convert(model); | ||
| 117 | + // 拼接 bpmn XML | ||
| 118 | + byte[] bpmnBytes = repositoryService.getModelEditorSource(id); | ||
| 119 | + modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes)); | ||
| 120 | + return modelRespVO; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + @Override | ||
| 124 | + public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) { | ||
| 125 | + // 校验流程模型存在 | ||
| 126 | + Model model = repositoryService.getModel(updateReqVO.getId()); | ||
| 127 | + if (model == null) { | ||
| 128 | + throw exception(MODEL_NOT_EXISTS); | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + // 修改流程定义 | ||
| 132 | + ModelConvert.INSTANCE.copy(model, updateReqVO); | ||
| 133 | + // 更新模型 | ||
| 134 | + repositoryService.saveModel(model); | ||
| 135 | + // 更新 BPMN XML | ||
| 136 | + saveModelBpmnXml(model, updateReqVO.getBpmnXml()); | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + private Model getModelByKey(String key) { | ||
| 140 | + return repositoryService.createModelQuery().modelKey(key).singleResult(); | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + private void checkKeyNCName(String key) { | ||
| 144 | + if (!ValidationUtils.isXmlNCName(key)) { | ||
| 145 | + throw exception(MODEL_KEY_VALID); | ||
| 146 | + } | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + private void saveModelBpmnXml(Model model, String bpmnXml) { | ||
| 150 | + if (StrUtil.isEmpty(bpmnXml)) { | ||
| 151 | + return; | ||
| 152 | + } | ||
| 153 | + repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(bpmnXml)); | ||
| 154 | + } | ||
| 83 | } | 155 | } |