Forráskód Böngészése

工作流 Flowable 流程模型接口 部分实现

jason 3 éve
szülő
commit
a207412e8c

+ 27 - 2
yudao-module-bpm/yudao-module-bpm-base/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelCommonService.java

@@ -1,8 +1,9 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
+
+import javax.validation.Valid;
 
 /**
  * 流程模型通用接口
@@ -19,4 +20,28 @@ public interface BpmModelCommonService {
      * @return 流程模型分页
      */
     PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO);
+
+    /**
+     * 创建流程模型
+     *
+     * @param modelVO 创建信息
+     * @param bpmnXml BPMN XML
+     * @return 创建的流程模型的编号
+     */
+    String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml);
+
+    /**
+     * 获得流程模块
+     *
+     * @param id 编号
+     * @return 流程模型
+     */
+    BpmModelRespVO getModel(String id);
+
+    /**
+     * 修改流程模型
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateModel(@Valid BpmModelUpdateReqVO updateReqVO);
 }

+ 0 - 23
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;
  */
 public interface BpmModelService extends BpmModelCommonService {
 
-    /**
-     * 获得流程模块
-     *
-     * @param id 编号
-     * @return 流程模型
-     */
-    BpmModelRespVO getModel(String id);
-
-    /**
-     * 创建流程模型
-     *
-     * @param modelVO 创建信息
-     * @param bpmnXml BPMN XML
-     * @return 创建的流程模型的编号
-     */
-    String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml);
-
-    /**
-     * 修改流程模型
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateModel(@Valid BpmModelUpdateReqVO updateReqVO);
 
     /**
      * 将流程模型,部署成一个流程定义

+ 42 - 5
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;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO;
+import cn.iocoder.yudao.framework.common.util.io.IoUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
+import cn.iocoder.yudao.module.bpm.convert.definition.ModelConvert;
 import cn.iocoder.yudao.module.bpm.service.definition.FlowableModelService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import java.io.IOException;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
@@ -30,4 +34,37 @@ public class FlowableModelController {
     public CommonResult<PageResult<BpmModelPageItemRespVO>> getModelPage(BpmModelPageReqVO pageVO) {
         return success(modelService.getModelPage(pageVO));
     }
+
+    @GetMapping("/get")
+    @ApiOperation("获得模型")
+    @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = String.class)
+    @PreAuthorize("@ss.hasPermission('bpm:model:query')")
+    public CommonResult<BpmModelRespVO> getModel(@RequestParam("id") String id) {
+        BpmModelRespVO model = modelService.getModel(id);
+        return success(model);
+    }
+
+    @PostMapping("/create")
+    @ApiOperation(value = "新建模型")
+    @PreAuthorize("@ss.hasPermission('bpm:model:create')")
+    public CommonResult<String> createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) {
+        return success(modelService.createModel(createRetVO, null));
+    }
+
+    @PutMapping("/update")
+    @ApiOperation(value = "修改模型")
+    @PreAuthorize("@ss.hasPermission('bpm:model:update')")
+    public CommonResult<Boolean> updateModel(@Valid @RequestBody BpmModelUpdateReqVO modelVO) {
+        modelService.updateModel(modelVO);
+        return success(true);
+    }
+
+    @PostMapping("/import")
+    @ApiOperation(value = "导入模型")
+    public CommonResult<String> importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException {
+        BpmModelCreateReqVO createReqVO = ModelConvert.INSTANCE.convert(importReqVO);
+        // 读取文件
+        String bpmnXml = IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false);
+        return success(modelService.createModel(createReqVO, bpmnXml));
+    }
 }

+ 37 - 3
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/ModelConvert.java

@@ -1,10 +1,9 @@
 package cn.iocoder.yudao.module.bpm.convert.definition;
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelBaseVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.ModelMetaInfoRespDTO;
 import org.flowable.common.engine.impl.db.SuspensionState;
@@ -17,6 +16,7 @@ import org.mapstruct.factory.Mappers;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 流程模型 Convert
@@ -78,8 +78,42 @@ public interface ModelConvert {
         ModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), ModelMetaInfoRespDTO.class);
         copyTo(metaInfo, to);
     }
+    BpmModelCreateReqVO convert(BpmModeImportReqVO bean);
 
     void copyTo(ModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to);
 
     BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean);
+
+    default void copy(Model model, BpmModelCreateReqVO bean) {
+        model.setName(bean.getName());
+        model.setKey(bean.getKey());
+        model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null,
+                null, null));
+    }
+
+    default void copy(Model model, BpmModelUpdateReqVO bean) {
+        model.setName(bean.getName());
+        model.setCategory(bean.getCategory());
+        model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), ModelMetaInfoRespDTO.class),
+                bean.getDescription(), bean.getFormType(), bean.getFormId(),
+                bean.getFormCustomCreatePath(), bean.getFormCustomViewPath()));
+    }
+
+    default String buildMetaInfoStr(ModelMetaInfoRespDTO metaInfo, String description, Integer formType,
+                                    Long formId, String formCustomCreatePath, String formCustomViewPath) {
+        if (metaInfo == null) {
+            metaInfo = new ModelMetaInfoRespDTO();
+        }
+        // 只有非空,才进行设置,避免更新时的覆盖
+        if (StrUtil.isNotEmpty(description)) {
+            metaInfo.setDescription(description);
+        }
+        if (Objects.nonNull(formType)) {
+            metaInfo.setFormType(formType);
+            metaInfo.setFormId(formId);
+            metaInfo.setFormCustomCreatePath(formCustomCreatePath);
+            metaInfo.setFormCustomViewPath(formCustomViewPath);
+        }
+        return JsonUtils.toJsonString(metaInfo);
+    }
 }

+ 74 - 2
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;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageItemRespVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO;
+import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
 import cn.iocoder.yudao.module.bpm.convert.definition.ModelConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.ModelMetaInfoRespDTO;
@@ -17,21 +17,27 @@ import org.flowable.engine.repository.Model;
 import org.flowable.engine.repository.ModelQuery;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+
 /**
  * Flowable流程模型实现
  * 主要进行 Flowable {@link Model} 的维护
  *
  * @author yunlongn
  * @author 芋道源码
+ * @author jason
  */
 @Service
 @Validated
@@ -80,4 +86,70 @@ public class FlowableModelServiceImpl implements FlowableModelService {
         long modelCount = modelQuery.count();
         return new PageResult<>(ModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
+        checkKeyNCName(createReqVO.getKey());
+        // 校验流程标识已经存在
+        Model keyModel = this.getModelByKey(createReqVO.getKey());
+        if (keyModel != null) {
+            throw exception(MODEL_KEY_EXISTS, createReqVO.getKey());
+        }
+
+        // 创建流程定义
+        Model model = repositoryService.newModel();
+        ModelConvert.INSTANCE.copy(model, createReqVO);
+        // 保存流程定义
+        repositoryService.saveModel(model);
+        // 保存 BPMN XML
+        saveModelBpmnXml(model, bpmnXml);
+        return model.getId();
+    }
+
+    @Override
+    public BpmModelRespVO getModel(String id) {
+        Model model = repositoryService.getModel(id);
+        if (model == null) {
+            return null;
+        }
+        BpmModelRespVO modelRespVO = ModelConvert.INSTANCE.convert(model);
+        // 拼接 bpmn XML
+        byte[] bpmnBytes = repositoryService.getModelEditorSource(id);
+        modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes));
+        return modelRespVO;
+    }
+
+    @Override
+    public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) {
+        // 校验流程模型存在
+        Model model = repositoryService.getModel(updateReqVO.getId());
+        if (model == null) {
+            throw exception(MODEL_NOT_EXISTS);
+        }
+
+        // 修改流程定义
+        ModelConvert.INSTANCE.copy(model, updateReqVO);
+        // 更新模型
+        repositoryService.saveModel(model);
+        // 更新 BPMN XML
+        saveModelBpmnXml(model, updateReqVO.getBpmnXml());
+    }
+
+    private Model getModelByKey(String key) {
+        return repositoryService.createModelQuery().modelKey(key).singleResult();
+    }
+
+    private void checkKeyNCName(String key) {
+        if (!ValidationUtils.isXmlNCName(key)) {
+            throw exception(MODEL_KEY_VALID);
+        }
+    }
+
+    private void saveModelBpmnXml(Model model, String bpmnXml) {
+        if (StrUtil.isEmpty(bpmnXml)) {
+            return;
+        }
+        repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(bpmnXml));
+    }
 }