瀏覽代碼

BPM:新增流程分类表,替代现有的 `bpm_category` 数据字典

YunaiV 11 月之前
父節點
當前提交
ed83b912e4
共有 47 個文件被更改,包括 1073 次插入509 次删除
  1. 7 2
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
  2. 11 1
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java
  3. 4 0
      yudao-module-bpm/yudao-module-bpm-biz/pom.xml
  4. 86 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmCategoryController.java
  5. 55 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java
  6. 54 12
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java
  7. 36 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/category/BpmCategoryPageReqVO.java
  8. 33 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/category/BpmCategoryRespVO.java
  9. 34 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/category/BpmCategorySaveReqVO.java
  10. 0 40
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java
  11. 0 48
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java
  12. 3 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageReqVO.java
  13. 39 8
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java
  14. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java
  15. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java
  16. 0 18
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java
  17. 0 22
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java
  18. 10 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java
  19. 7 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
  20. 3 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java
  21. 5 5
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java
  22. 5 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java
  23. 1 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java
  24. 49 41
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java
  25. 39 46
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java
  26. 6 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
  27. 53 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmCategoryDO.java
  28. 4 5
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java
  29. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java
  30. 46 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/category/BpmCategoryMapper.java
  31. 0 22
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java
  32. 21 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java
  33. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java
  34. 85 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmCategoryService.java
  35. 113 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmCategoryServiceImpl.java
  36. 3 8
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java
  37. 5 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java
  38. 11 10
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java
  39. 41 64
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
  40. 17 23
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java
  41. 29 101
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
  42. 0 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java
  43. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java
  44. 2 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java
  45. 0 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
  46. 12 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/category/BpmCategoryMapper.xml
  47. 137 0
      yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/category/BpmCategoryServiceImplTest.java

+ 7 - 2
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java

@@ -65,7 +65,12 @@ public interface ErrorCodeConstants {
     ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表单项({}) 和 ({}) 使用了相同的字段名({})");
 
     // ========== 用户组模块 1-009-011-000 ==========
-    ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1_009_011_000, "用户组不存在");
-    ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1_009_011_001, "名字为【{}】的用户组已被禁用");
+    ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1_009_011_000, "用户分组不存在");
+    ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1_009_011_001, "名字为【{}】的用户分组已被禁用");
+
+    // ========== 用户组模块 1-009-012-000 ==========
+    ErrorCode CATEGORY_NOT_EXISTS = new ErrorCode(1_009_012_000, "流程分类不存在");
+    ErrorCode CATEGORY_NAME_DUPLICATE = new ErrorCode(1_009_012_001, "流程分类名字【{}】重复");
+    ErrorCode CATEGORY_CODE_DUPLICATE = new ErrorCode(1_009_012_002, "流程分类编码【{}】重复");
 
 }

+ 11 - 1
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java

@@ -1,8 +1,11 @@
 package cn.iocoder.yudao.module.bpm.enums.task;
 
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.Arrays;
+
 /**
  * 流程实例 ProcessInstance 的状态
  *
@@ -10,13 +13,15 @@ import lombok.Getter;
  */
 @Getter
 @AllArgsConstructor
-public enum BpmProcessInstanceStatusEnum {
+public enum BpmProcessInstanceStatusEnum implements IntArrayValuable {
 
     RUNNING(1, "审批中"),
     APPROVE(2, "审批通过"),
     REJECT(3, "审批不通过"),
     CANCEL(4, "已取消");
 
+    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmProcessInstanceStatusEnum::getStatus).toArray();
+
     /**
      * 状态
      */
@@ -26,4 +31,9 @@ public enum BpmProcessInstanceStatusEnum {
      */
     private final String desc;
 
+    @Override
+    public int[] array() {
+        return new int[0];
+    }
+
 }

+ 4 - 0
yudao-module-bpm/yudao-module-bpm-biz/pom.xml

@@ -70,5 +70,9 @@
             <artifactId>yudao-spring-boot-starter-flowable</artifactId>
             <version>${revision}</version>
         </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-excel</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 86 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmCategoryController.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategoryRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Comparator;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+
+@Tag(name = "管理后台 - BPM 流程分类")
+@RestController
+@RequestMapping("/bpm/category")
+@Validated
+public class BpmCategoryController {
+
+    @Resource
+    private BpmCategoryService categoryService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建流程分类")
+    @PreAuthorize("@ss.hasPermission('bpm:category:create')")
+    public CommonResult<Long> createCategory(@Valid @RequestBody BpmCategorySaveReqVO createReqVO) {
+        return success(categoryService.createCategory(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新流程分类")
+    @PreAuthorize("@ss.hasPermission('bpm:category:update')")
+    public CommonResult<Boolean> updateCategory(@Valid @RequestBody BpmCategorySaveReqVO updateReqVO) {
+        categoryService.updateCategory(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除流程分类")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('bpm:category:delete')")
+    public CommonResult<Boolean> deleteCategory(@RequestParam("id") Long id) {
+        categoryService.deleteCategory(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得流程分类")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('bpm:category:query')")
+    public CommonResult<BpmCategoryRespVO> getCategory(@RequestParam("id") Long id) {
+        BpmCategoryDO category = categoryService.getCategory(id);
+        return success(BeanUtils.toBean(category, BpmCategoryRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得流程分类分页")
+    @PreAuthorize("@ss.hasPermission('bpm:category:query')")
+    public CommonResult<PageResult<BpmCategoryRespVO>> getCategoryPage(@Valid BpmCategoryPageReqVO pageReqVO) {
+        PageResult<BpmCategoryDO> pageResult = categoryService.getCategoryPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, BpmCategoryRespVO.class));
+    }
+
+    @GetMapping("/simple-list")
+    @Operation(summary = "获取流程分类的精简信息列表", description = "只包含被开启的分类,主要用于前端的下拉选项")
+    public CommonResult<List<BpmCategoryRespVO>> getCategorySimpleList() {
+        List<BpmCategoryDO> list = categoryService.getCategoryListByStatus(CommonStatusEnum.ENABLE.getStatus());
+        list.sort(Comparator.comparingInt(BpmCategoryDO::getSort));
+        return success(convertList(list, category -> new BpmCategoryRespVO().setId(category.getId())
+                .setName(category.getName()).setCode(category.getCode())));
+    }
+
+}

+ 55 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java

@@ -1,23 +1,41 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.definition;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.io.IoUtils;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
+import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.repository.Model;
+import org.flowable.engine.repository.ProcessDefinition;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 
 @Tag(name = "管理后台 - 流程模型")
 @RestController
@@ -27,11 +45,39 @@ public class BpmModelController {
 
     @Resource
     private BpmModelService modelService;
+    @Resource
+    private BpmFormService formService;
+    @Resource
+    private BpmCategoryService categoryService;
+    @Resource
+    private BpmProcessDefinitionService processDefinitionService;
 
     @GetMapping("/page")
     @Operation(summary = "获得模型分页")
-    public CommonResult<PageResult<BpmModelPageItemRespVO>> getModelPage(BpmModelPageReqVO pageVO) {
-        return success(modelService.getModelPage(pageVO));
+    public CommonResult<PageResult<BpmModelRespVO>> getModelPage(BpmModelPageReqVO pageVO) {
+        PageResult<Model> pageResult = modelService.getModelPage(pageVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
+
+        // 拼接数据
+        // 获得 Form 表单
+        Set<Long> formIds = convertSet(pageResult.getList(), model -> {
+            BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
+            return metaInfo != null ? metaInfo.getFormId() : null;
+        });
+        Map<Long, BpmFormDO> formMap = formService.getFormMap(formIds);
+        // 获得 Category Map
+        Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
+                convertSet(pageResult.getList(), Model::getCategory));
+        // 获得 Deployment Map
+        Set<String> deploymentIds = new HashSet<>();
+        pageResult.getList().forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId()));
+        Map<String, Deployment> deploymentMap = processDefinitionService.getDeploymentMap(deploymentIds);
+        // 获得 ProcessDefinition Map
+        List<ProcessDefinition> processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds(deploymentIds);
+        Map<String, ProcessDefinition> processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId);
+        return success(BpmModelConvert.INSTANCE.buildModelPage(pageResult, formMap, categoryMap, deploymentMap, processDefinitionMap));
     }
 
     @GetMapping("/get")
@@ -39,8 +85,12 @@ public class BpmModelController {
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('bpm:model:query')")
     public CommonResult<BpmModelRespVO> getModel(@RequestParam("id") String id) {
-        BpmModelRespVO model = modelService.getModel(id);
-        return success(model);
+        Model model = modelService.getModel(id);
+        if (model == null) {
+            return null;
+        }
+        byte[] bpmnBytes = modelService.getModelBpmnXML(id);
+        return success(BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes));
     }
 
     @PostMapping("/create")
@@ -93,4 +143,5 @@ public class BpmModelController {
         modelService.deleteModel(id);
         return success(true);
     }
+
 }

+ 54 - 12
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessDefinitionController.java

@@ -1,15 +1,23 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.definition;
 
+import cn.hutool.core.collection.CollUtil;
 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.process.BpmProcessDefinitionListReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
+import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.repository.ProcessDefinition;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -17,11 +25,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import jakarta.annotation.Resource;
-
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 
 @Tag(name = "管理后台 - 流程定义")
 @RestController
@@ -30,22 +39,54 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 public class BpmProcessDefinitionController {
 
     @Resource
-    private BpmProcessDefinitionService bpmDefinitionService;
+    private BpmProcessDefinitionService processDefinitionService;
+    @Resource
+    private BpmFormService formService;
+    @Resource
+    private BpmCategoryService categoryService;
 
     @GetMapping("/page")
     @Operation(summary = "获得流程定义分页")
     @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
-    public CommonResult<PageResult<BpmProcessDefinitionPageItemRespVO>> getProcessDefinitionPage(
+    public CommonResult<PageResult<BpmProcessDefinitionRespVO>> getProcessDefinitionPage(
             BpmProcessDefinitionPageReqVO pageReqVO) {
-        return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO));
+        PageResult<ProcessDefinition> pageResult = processDefinitionService.getProcessDefinitionPage(pageReqVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
+
+        // 获得 Category Map
+        Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
+                convertSet(pageResult.getList(), ProcessDefinition::getCategory));
+        // 获得 Deployment Map
+        Map<String, Deployment> deploymentMap = processDefinitionService.getDeploymentMap(
+                convertSet(pageResult.getList(), ProcessDefinition::getDeploymentId));
+        // 获得 BpmProcessDefinitionInfoDO Map
+        Map<String, BpmProcessDefinitionInfoDO> processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap(
+                convertSet(pageResult.getList(), ProcessDefinition::getId));
+        // 获得 Form Map
+        Map<Long, BpmFormDO> formMap = formService.getFormMap(
+               convertSet(processDefinitionMap.values(), BpmProcessDefinitionInfoDO::getFormId));
+        return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinitionPage(
+                pageResult, deploymentMap, processDefinitionMap, formMap, categoryMap));
     }
 
     @GetMapping ("/list")
     @Operation(summary = "获得流程定义列表")
+    @Parameter(name = "suspensionState", description = "挂起状态", required = true, example = "1") // 参见 Flowable SuspensionState 枚举
     @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
     public CommonResult<List<BpmProcessDefinitionRespVO>> getProcessDefinitionList(
-            BpmProcessDefinitionListReqVO listReqVO) {
-        return success(bpmDefinitionService.getProcessDefinitionList(listReqVO));
+            @RequestParam("suspensionState") Integer suspensionState) {
+        List<ProcessDefinition> list = processDefinitionService.getProcessDefinitionListBySuspensionState(suspensionState);
+        if (CollUtil.isEmpty(list)) {
+            return success(Collections.emptyList());
+        }
+
+        // 获得 BpmProcessDefinitionInfoDO Map
+        Map<String, BpmProcessDefinitionInfoDO> processDefinitionMap = processDefinitionService.getProcessDefinitionInfoMap(
+                convertSet(list, ProcessDefinition::getId));
+        return success(BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinitionList(
+                list, null, processDefinitionMap, null, null));
     }
 
     @GetMapping ("/get-bpmn-xml")
@@ -53,7 +94,8 @@ public class BpmProcessDefinitionController {
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
     public CommonResult<String> getProcessDefinitionBpmnXML(@RequestParam("id") String id) {
-        String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id);
+        String bpmnXML = processDefinitionService.getProcessDefinitionBpmnXML(id);
         return success(bpmnXML);
     }
+
 }

+ 36 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/category/BpmCategoryPageReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - BPM 流程分类分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BpmCategoryPageReqVO extends PageParam {
+
+    @Schema(description = "分类名", example = "王五")
+    private String name;
+
+    @Schema(description = "分类标志", example = "OA")
+    private String code;
+
+    @Schema(description = "分类状态", example = "1")
+    @InEnum(CommonStatusEnum.class)
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 33 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/category/BpmCategoryRespVO.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - BPM 流程分类 Response VO")
+@Data
+public class BpmCategoryRespVO {
+
+    @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
+    private Long id;
+
+    @Schema(description = "分类名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String name;
+
+    @Schema(description = "分类标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "OA")
+    private String code;
+
+    @Schema(description = "分类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
+    private String description;
+
+    @Schema(description = "分类状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer status;
+
+    @Schema(description = "分类排序", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Integer sort;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}

+ 34 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/category/BpmCategorySaveReqVO.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - BPM 流程分类新增/修改 Request VO")
+@Data
+public class BpmCategorySaveReqVO {
+
+    @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
+    private Long id;
+
+    @Schema(description = "分类名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @NotEmpty(message = "分类名不能为空")
+    private String name;
+
+    @Schema(description = "分类标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "OA")
+    @NotEmpty(message = "分类标志不能为空")
+    private String code;
+
+    @Schema(description = "分类状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "分类状态不能为空")
+    @InEnum(CommonStatusEnum.class)
+    private Integer status;
+
+    @Schema(description = "分类排序", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "分类排序不能为空")
+    private Integer sort;
+
+}

+ 0 - 40
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelBaseVO.java

@@ -1,40 +0,0 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import jakarta.validation.constraints.NotEmpty;
-
-/**
-* 流程模型 Base VO,提供给添加、修改、详细的子 VO 使用
-* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
-*/
-@Data
-public class BpmModelBaseVO {
-
-    @Schema(description = "流程标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_yudao")
-    @NotEmpty(message = "流程标识不能为空")
-    private String key;
-
-    @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
-    @NotEmpty(message = "流程名称不能为空")
-    private String name;
-
-    @Schema(description = "流程描述", example = "我是描述")
-    private String description;
-
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
-    @NotEmpty(message = "流程分类不能为空")
-    private String category;
-
-    @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1")
-    private Integer formType;
-    @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024")
-    private Long formId;
-    @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空",
-            example = "/bpm/oa/leave/create")
-    private String formCustomCreatePath;
-    @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空",
-            example = "/bpm/oa/leave/view")
-    private String formCustomViewPath;
-
-}

+ 0 - 48
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageItemRespVO.java

@@ -1,48 +0,0 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 流程模型的分页的每一项 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class BpmModelPageItemRespVO extends BpmModelBaseVO {
-
-    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    private String id;
-
-    @Schema(description = "表单名字", example = "请假表单")
-    private String formName;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime createTime;
-
-    /**
-     * 最新部署的流程定义
-     */
-    private ProcessDefinition processDefinition;
-
-    @Schema(description = "流程定义")
-    @Data
-    public static class ProcessDefinition {
-
-        @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-        private String id;
-
-        @Schema(description = "版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-        private Integer version;
-
-        @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED)
-        private LocalDateTime deploymentTime;
-
-        @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-        private Integer suspensionState;
-
-    }
-
-}

+ 3 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelPageReqVO.java

@@ -13,13 +13,13 @@ import lombok.ToString;
 @ToString(callSuper = true)
 public class BpmModelPageReqVO extends PageParam {
 
-    @Schema(description = "标识-精准匹配", example = "process1641042089407")
+    @Schema(description = "标识精准匹配", example = "process1641042089407")
     private String key;
 
-    @Schema(description = "名字-模糊匹配", example = "芋道")
+    @Schema(description = "名字模糊匹配", example = "芋道")
     private String name;
 
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
+    @Schema(description = "流程分类", example = "1")
     private String category;
 
 }

+ 39 - 8
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelRespVO.java

@@ -1,25 +1,56 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
 
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
 
 import java.time.LocalDateTime;
 
-@Schema(description = "管理后台 - 流程模型的创建 Request VO")
+@Schema(description = "管理后台 - 流程模型 Response VO")
 @Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class BpmModelRespVO extends BpmModelBaseVO {
+public class BpmModelRespVO {
 
     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private String id;
 
-    @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
-    private String bpmnXml;
+    @Schema(description = "流程标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_yudao")
+    private String key;
+
+    @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
+    private String name;
+
+    @Schema(description = "流程描述", example = "我是描述")
+    private String description;
+
+    @Schema(description = "流程分类编码", example = "1")
+    private String category;
+    @Schema(description = "流程分类名字", example = "请假")
+    private String categoryName;
+
+    @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1")
+    private Integer formType;
+
+    @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024")
+    private Long formId;
+    @Schema(description = "表单名字", example = "请假表单")
+    private String formName;
+
+    @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空",
+            example = "/bpm/oa/leave/create")
+    private String formCustomCreatePath;
+    @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空",
+            example = "/bpm/oa/leave/view")
+    private String formCustomViewPath;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     private LocalDateTime createTime;
 
+    @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String bpmnXml;
+
+    /**
+     * 最新部署的流程定义
+     */
+    private BpmProcessDefinitionRespVO processDefinition;
+
 }

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateReqVO.java

@@ -19,7 +19,7 @@ public class BpmModelUpdateReqVO {
     @Schema(description = "流程描述", example = "我是描述")
     private String description;
 
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
+    @Schema(description = "流程分类", example = "1")
     private String category;
 
     @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelUpdateStateReqVO.java

@@ -13,8 +13,8 @@ public class BpmModelUpdateStateReqVO {
     @NotNull(message = "编号不能为空")
     private String id;
 
-    @Schema(description = "状态-见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "状态不能为空")
-    private Integer state;
+    private Integer state; // 参见 Flowable SuspensionState 枚举
 
 }

+ 0 - 18
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionListReqVO.java

@@ -1,18 +0,0 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 流程定义列表 Request VO")
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class BpmProcessDefinitionListReqVO extends PageParam {
-
-    @Schema(description = "中断状态-参见 SuspensionState 枚举", example = "1")
-    private Integer suspensionState;
-
-}

+ 0 - 22
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java

@@ -1,22 +0,0 @@
-package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 流程定义的分页的每一项 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class BpmProcessDefinitionPageItemRespVO extends BpmProcessDefinitionRespVO {
-
-    @Schema(description = "表单名字", example = "请假表单")
-    private String formName;
-
-    @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime deploymentTime;
-
-}

+ 10 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java

@@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import jakarta.validation.constraints.NotEmpty;
+
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Schema(description = "管理后台 - 流程定义 Response VO")
@@ -23,14 +25,17 @@ public class BpmProcessDefinitionRespVO {
     @Schema(description = "流程描述", example = "我是描述")
     private String description;
 
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
-    @NotEmpty(message = "流程分类不能为空")
+    @Schema(description = "流程分类", example = "1")
     private String category;
+    @Schema(description = "流程分类名字", example = "请假")
+    private String categoryName;
 
     @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1")
     private Integer formType;
     @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024")
     private Long formId;
+    @Schema(description = "表单名字", example = "请假表单")
+    private String formName;
     @Schema(description = "表单的配置-JSON 字符串。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
     private String formConf;
     @Schema(description = "表单项的数组-JSON 字符串的数组。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
@@ -45,4 +50,7 @@ public class BpmProcessDefinitionRespVO {
     @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer suspensionState;
 
+    @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取
+
 }

+ 7 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java

@@ -5,6 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
@@ -40,6 +42,8 @@ public class BpmProcessInstanceController {
     private BpmTaskService taskService;
     @Resource
     private BpmProcessDefinitionService processDefinitionService;
+    @Resource
+    private BpmCategoryService categoryService;
 
     @GetMapping("/my-page")
     @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
@@ -56,7 +60,9 @@ public class BpmProcessInstanceController {
                 convertList(pageResult.getList(), HistoricProcessInstance::getId));
         Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
                 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
-        return success(BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, processDefinitionMap, taskMap));
+        Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
+                convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
+        return success(BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, processDefinitionMap, categoryMap, taskMap));
     }
 
     @PostMapping("/create")

+ 3 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceCopyController.java

@@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc.BpmProcessInstanceCopyRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
@@ -44,7 +44,7 @@ public class BpmProcessInstanceCopyController {
     @Resource
     private BpmProcessInstanceService processInstanceService;
     @Resource
-    private BpmTaskService bpmTaskService;
+    private BpmTaskService taskService;
 
     @Resource
     private AdminUserApi adminUserApi;
@@ -61,7 +61,7 @@ public class BpmProcessInstanceCopyController {
         }
 
         // 拼接返回
-        Map<String, String> taskNameMap = bpmTaskService.getTaskNameByTaskIds(
+        Map<String, String> taskNameMap = taskService.getTaskNameByTaskIds(
                 convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId));
         Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
                 convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));

+ 5 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceMyPageReqVO.java

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -23,13 +25,11 @@ public class BpmProcessInstanceMyPageReqVO extends PageParam {
     @Schema(description = "流程定义的编号", example = "2048")
     private String processDefinitionId;
 
-    @Schema(description = "流程实例的状态-参见 bpm_process_instance_status", example = "1")
+    @Schema(description = "流程实例的状态", example = "1")
+    @InEnum(BpmProcessInstanceStatusEnum.class)
     private Integer status;
 
-    @Schema(description = "流程实例的结果-参见 bpm_process_instance_result", example = "2")
-    private Integer result;
-
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
+    @Schema(description = "流程分类", example = "1")
     private String category;
 
     @Schema(description = "创建时间")

+ 5 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import java.time.LocalDateTime;
 import java.util.List;
 
+// TODO @芋艿:是不是要融合?
 @Schema(description = "管理后台 - 流程实例的分页 Item Response VO")
 @Data
 public class BpmProcessInstancePageItemRespVO {
@@ -19,10 +20,12 @@ public class BpmProcessInstancePageItemRespVO {
     @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
     private String processDefinitionId;
 
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private String category;
+    @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
+    private String categoryName;
 
-    @Schema(description = "流程实例的状态-参见 bpm_process_instance_status", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
 
     @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)

+ 1 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java

@@ -17,15 +17,12 @@ public class BpmProcessInstanceRespVO {
     @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
     private String name;
 
-    @Schema(description = "流程分类-参见 bpm_model_category 数据字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private String category;
 
     @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
 
-    @Schema(description = "流程实例的结果-参见 bpm_process_instance_result", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    private Integer result;
-
     @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
     private LocalDateTime createTime;
 

+ 49 - 41
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmModelConvert.java

@@ -1,10 +1,17 @@
 package cn.iocoder.yudao.module.bpm.convert.definition;
 
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModeImportReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelRespVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelUpdateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
@@ -30,57 +37,61 @@ public interface BpmModelConvert {
 
     BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class);
 
-    default List<BpmModelPageItemRespVO> convertList(List<Model> list, Map<Long, BpmFormDO> formMap,
-                                                     Map<String, Deployment> deploymentMap,
-                                                     Map<String, ProcessDefinition> processDefinitionMap) {
-        return CollectionUtils.convertList(list, model -> {
+    default PageResult<BpmModelRespVO> buildModelPage(PageResult<Model> pageResult,
+                                                      Map<Long, BpmFormDO> formMap,
+                                                      Map<String, BpmCategoryDO> categoryMap, Map<String, Deployment> deploymentMap,
+                                                      Map<String, ProcessDefinition> processDefinitionMap) {
+        List<BpmModelRespVO> list = CollectionUtils.convertList(pageResult.getList(), model -> {
             BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
             BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null;
+            BpmCategoryDO category = categoryMap.get(model.getCategory());
             Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null;
             ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null;
-            return convert(model, form, deployment, processDefinition);
+            return buildModel0(model, metaInfo, form, category, deployment, processDefinition);
         });
+        return new PageResult<>(list, pageResult.getTotal());
     }
 
-    default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) {
-        BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO();
-        modelRespVO.setId(model.getId());
-        modelRespVO.setCreateTime(DateUtils.of(model.getCreateTime()));
-        // 通用 copy
-        copyTo(model, modelRespVO);
+    default BpmModelRespVO buildModel(Model model,
+                                     byte[] bpmnBytes) {
+        BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
+        BpmModelRespVO modelVO = buildModel0(model, metaInfo, null, null, null, null);
+        modelVO.setBpmnXml(new String(bpmnBytes));
+        return modelVO;
+    }
+
+    default BpmModelRespVO buildModel0(Model model,
+                                      BpmModelMetaInfoRespDTO metaInfo, BpmFormDO form, BpmCategoryDO category,
+                                      Deployment deployment, ProcessDefinition processDefinition) {
+        BpmModelRespVO modelRespVO = new BpmModelRespVO().setId(model.getId()).setName(model.getName())
+                .setKey(model.getKey()).setCategory(model.getCategory())
+                .setCreateTime(DateUtils.of(model.getCreateTime()));
         // Form
+        if (metaInfo != null) {
+            modelRespVO.setFormType(metaInfo.getFormType()).setFormId(metaInfo.getFormId())
+                    .setFormCustomCreatePath(metaInfo.getFormCustomCreatePath())
+                    .setFormCustomViewPath(metaInfo.getFormCustomViewPath());
+            modelRespVO.setDescription(metaInfo.getDescription());
+        }
         if (form != null) {
-            modelRespVO.setFormId(form.getId());
-            modelRespVO.setFormName(form.getName());
+            modelRespVO.setFormId(form.getId()).setFormName(form.getName());
+        }
+        // Category
+        if (category != null) {
+            modelRespVO.setCategoryName(category.getName());
         }
         // ProcessDefinition
-        modelRespVO.setProcessDefinition(this.convert(processDefinition));
-        if (modelRespVO.getProcessDefinition() != null) {
+        if (processDefinition != null) {
+            modelRespVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
             modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ?
                     SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
-            modelRespVO.getProcessDefinition().setDeploymentTime(DateUtils.of(deployment.getDeploymentTime()));
+            if (deployment != null) {
+                modelRespVO.getProcessDefinition().setDeploymentTime(DateUtils.of(deployment.getDeploymentTime()));
+            }
         }
         return modelRespVO;
     }
 
-    default BpmModelRespVO convert(Model model) {
-        BpmModelRespVO modelRespVO = new BpmModelRespVO();
-        modelRespVO.setId(model.getId());
-        modelRespVO.setCreateTime(DateUtils.of(model.getCreateTime()));
-        // 通用 copy
-        copyTo(model, modelRespVO);
-        return modelRespVO;
-    }
-
-    default void copyTo(Model model, BpmModelBaseVO to) {
-        to.setName(model.getName());
-        to.setKey(model.getKey());
-        to.setCategory(model.getCategory());
-        // metaInfo
-        BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
-        copyTo(metaInfo, to);
-    }
-
     BpmModelCreateReqVO convert(BpmModeImportReqVO bean);
 
     default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) {
@@ -102,18 +113,14 @@ public interface BpmModelConvert {
 
     void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmProcessDefinitionCreateReqDTO to);
 
-    void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to);
-
-    BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean);
-
-    default void copy(Model model, BpmModelCreateReqVO bean) {
+    default void copyToCreateModel(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) {
+    default void copyToUpdateModel(Model model, BpmModelUpdateReqVO bean) {
         model.setName(bean.getName());
         model.setCategory(bean.getCategory());
         model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class),
@@ -138,4 +145,5 @@ public interface BpmModelConvert {
         }
         return JsonUtils.toJsonString(metaInfo);
     }
+
 }

+ 39 - 46
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmProcessDefinitionConvert.java

@@ -1,12 +1,15 @@
 package cn.iocoder.yudao.module.bpm.convert.definition;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
-import cn.iocoder.yudao.framework.common.util.date.DateUtils;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import org.flowable.common.engine.impl.db.SuspensionState;
 import org.flowable.engine.repository.Deployment;
@@ -14,7 +17,6 @@ import org.flowable.engine.repository.ProcessDefinition;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.MappingTarget;
-import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
 
 import java.util.List;
@@ -30,55 +32,46 @@ public interface BpmProcessDefinitionConvert {
 
     BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class);
 
-    BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean);
 
-    BpmProcessDefinitionExtDO convert2(BpmProcessDefinitionCreateReqDTO bean);
-
-    default List<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap,
-                                                                 Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) {
-        return CollectionUtils.convertList(list, definition -> {
-            Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null;
-            BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId());
-            BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null;
-            return convert(definition, deployment, definitionDO, form);
-        });
+    default PageResult<BpmProcessDefinitionRespVO> buildProcessDefinitionPage(PageResult<ProcessDefinition> page,
+                                                                              Map<String, Deployment> deploymentMap,
+                                                                              Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap,
+                                                                              Map<Long, BpmFormDO> formMap,
+                                                                              Map<String, BpmCategoryDO> categoryMap) {
+        List<BpmProcessDefinitionRespVO> list = buildProcessDefinitionList(page.getList(), deploymentMap, processDefinitionInfoMap, formMap, categoryMap);
+        return new PageResult<>(list, page.getTotal());
     }
 
-    default List<BpmProcessDefinitionRespVO> convertList3(List<ProcessDefinition> list,
-                                                          Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap) {
-        return CollectionUtils.convertList(list, processDefinition -> {
-            BpmProcessDefinitionRespVO respVO = convert3(processDefinition);
-            BpmProcessDefinitionExtDO processDefinitionExtDO = processDefinitionDOMap.get(processDefinition.getId());
-            // 复制通用属性
-            copyTo(processDefinitionExtDO, respVO);
+    default List<BpmProcessDefinitionRespVO> buildProcessDefinitionList(List<ProcessDefinition> list,
+                                                                        Map<String, Deployment> deploymentMap,
+                                                                        Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap,
+                                                                        Map<Long, BpmFormDO> formMap,
+                                                                        Map<String, BpmCategoryDO> categoryMap) {
+        return CollectionUtils.convertList(list, definition -> {
+            BpmProcessDefinitionRespVO respVO = BeanUtils.toBean(definition, BpmProcessDefinitionRespVO.class);
+            respVO.setSuspensionState(definition.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
+            // Deployment
+            MapUtils.findAndThen(deploymentMap, definition.getDeploymentId(),
+                    deployment -> respVO.setDeploymentTime(LocalDateTimeUtil.of(deployment.getDeploymentTime())));
+            // BpmProcessDefinitionInfoDO
+            BpmProcessDefinitionInfoDO processDefinitionInfo = MapUtil.get(processDefinitionInfoMap, definition.getId(), BpmProcessDefinitionInfoDO.class);
+            if (processDefinitionInfo != null) {
+                copyTo(processDefinitionInfo, respVO);
+                // Form
+                BpmFormDO form = MapUtil.get(formMap, processDefinitionInfo.getFormId(), BpmFormDO.class);
+                if (form != null) {
+                    respVO.setFormName(form.getName());
+                }
+            }
+            // Category
+            MapUtils.findAndThen(categoryMap, definition.getCategory(), category -> respVO.setCategoryName(category.getName()));
             return respVO;
         });
     }
 
-    @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState")
-    BpmProcessDefinitionRespVO convert3(ProcessDefinition bean);
-
-    @Named("convertSuspendedToSuspensionState")
-    default Integer convertSuspendedToSuspensionState(boolean suspended) {
-        return suspended ? SuspensionState.SUSPENDED.getStateCode() :
-                SuspensionState.ACTIVE.getStateCode();
-    }
-
-    default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment,
-                                                       BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) {
-        BpmProcessDefinitionPageItemRespVO respVO = convert(bean);
-        respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
-        if (deployment != null) {
-            respVO.setDeploymentTime(LocalDateTimeUtil.of(deployment.getDeploymentTime()));
-        }
-        if (form != null) {
-            respVO.setFormName(form.getName());
-        }
-        // 复制通用属性
-        copyTo(processDefinitionExtDO, respVO);
-        return respVO;
-    }
+    BpmProcessDefinitionInfoDO convert2(BpmProcessDefinitionCreateReqDTO bean);
 
     @Mapping(source = "from.id", target = "to.id", ignore = true)
-    void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to);
+    void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to);
+
 }

+ 6 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java

@@ -7,7 +7,8 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
@@ -38,6 +39,7 @@ public interface BpmProcessInstanceConvert {
 
     default PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<HistoricProcessInstance> pageResult,
                                                                      Map<String, ProcessDefinition> processDefinitionMap,
+                                                                     Map<String, BpmCategoryDO> categoryMap,
                                                                      Map<String, List<Task>> taskMap) {
         PageResult<BpmProcessInstancePageItemRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstancePageItemRespVO.class);
         for (int i = 0; i < pageResult.getList().size(); i++) {
@@ -45,13 +47,14 @@ public interface BpmProcessInstanceConvert {
             respVO.setStatus((Integer) pageResult.getList().get(i).getProcessVariables().get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS));
             MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
                     processDefinition -> respVO.setCategory(processDefinition.getCategory()));
+            MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName()));
             respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstancePageItemRespVO.Task.class));
         }
         return vpPageResult;
     }
 
     default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance,
-                                              ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt,
+                                              ProcessDefinition processDefinition, BpmProcessDefinitionInfoDO processDefinitionExt,
                                               String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) {
         BpmProcessInstanceRespVO respVO = convert2(processInstance);
         respVO.setStatus((Integer) processInstance.getProcessVariables().get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS));
@@ -75,7 +78,7 @@ public interface BpmProcessInstanceConvert {
     BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean);
 
     @Mapping(source = "from.id", target = "to.id", ignore = true)
-    void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to);
+    void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to);
 
     BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
 

+ 53 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmCategoryDO.java

@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.bpm.dal.dataobject.definition;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * BPM 流程分类 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("bpm_category")
+@KeySequence("bpm_category_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BpmCategoryDO extends BaseDO {
+
+    /**
+     * 分类编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 分类名
+     */
+    private String name;
+    /**
+     * 分类标志
+     */
+    private String code;
+    /**
+     * 分类描述
+     */
+    private String description;
+    /**
+     * 分类状态
+     *
+     * 枚举 {@link TODO common_status 对应的类}
+     */
+    private Integer status;
+    /**
+     * 分类排序
+     */
+    private Integer sort;
+
+}

+ 4 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java → yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java

@@ -11,19 +11,19 @@ import lombok.*;
 import java.util.List;
 
 /**
- * Bpm 流程定义的拓展表
- * 主要解决 Activiti {@link ProcessDefinition} 不支持拓展字段,所以新建拓展
+ * Bpm 流程定义的拓信息
+ * 主要解决 Flowable {@link org.flowable.engine.repository.ProcessDefinition} 不支持拓展字段,所以新建该
  *
  * @author 芋道源码
  */
-@TableName(value = "bpm_process_definition_ext", autoResultMap = true)
+@TableName(value = "bpm_process_definition_info", autoResultMap = true)
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class BpmProcessDefinitionExtDO extends BaseDO {
+public class BpmProcessDefinitionInfoDO extends BaseDO {
 
     /**
      * 编号
@@ -86,5 +86,4 @@ public class BpmProcessDefinitionExtDO extends BaseDO {
      */
     private String formCustomViewPath;
 
-
 }

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/cc/BpmProcessInstanceCopyDO.java → yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/task/BpmProcessInstanceCopyDO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.bpm.dal.dataobject.cc;
+package cn.iocoder.yudao.module.bpm.dal.dataobject.task;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.TableId;

+ 46 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/category/BpmCategoryMapper.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.category;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * BPM 流程分类 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface BpmCategoryMapper extends BaseMapperX<BpmCategoryDO> {
+
+    default PageResult<BpmCategoryDO> selectPage(BpmCategoryPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<BpmCategoryDO>()
+                .likeIfPresent(BpmCategoryDO::getName, reqVO.getName())
+                .eqIfPresent(BpmCategoryDO::getCode, reqVO.getCode())
+                .eqIfPresent(BpmCategoryDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(BpmCategoryDO::getCreateTime, reqVO.getCreateTime())
+                .orderByAsc(BpmCategoryDO::getSort));
+    }
+
+    default BpmCategoryDO selectByName(String name) {
+        return selectOne(BpmCategoryDO::getName, name);
+    }
+
+    default BpmCategoryDO selectByCode(String code) {
+        return selectOne(BpmCategoryDO::getCode, code);
+    }
+
+    default List<BpmCategoryDO> selectListByCode(Collection<String> codes) {
+        return selectList(BpmCategoryDO::getCode, codes);
+    }
+
+    default List<BpmCategoryDO> selectListByStatus(Integer status) {
+        return selectList(BpmCategoryDO::getStatus, status);
+    }
+
+}

+ 0 - 22
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java

@@ -1,22 +0,0 @@
-package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
-
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
-import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.Collection;
-import java.util.List;
-
-@Mapper
-public interface BpmProcessDefinitionExtMapper extends BaseMapperX<BpmProcessDefinitionExtDO> {
-
-    default List<BpmProcessDefinitionExtDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
-        return selectList("process_definition_id", processDefinitionIds);
-    }
-
-    default BpmProcessDefinitionExtDO selectByProcessDefinitionId(String processDefinitionId) {
-        return selectOne("process_definition_id", processDefinitionId);
-    }
-
-}

+ 21 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessDefinitionInfoMapper.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
+
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.List;
+
+@Mapper
+public interface BpmProcessDefinitionInfoMapper extends BaseMapperX<BpmProcessDefinitionInfoDO> {
+
+    default List<BpmProcessDefinitionInfoDO> selectListByProcessDefinitionIds(Collection<String> processDefinitionIds) {
+        return selectList(BpmProcessDefinitionInfoDO::getProcessDefinitionId, processDefinitionIds);
+    }
+
+    default BpmProcessDefinitionInfoDO selectByProcessDefinitionId(String processDefinitionId) {
+        return selectOne(BpmProcessDefinitionInfoDO::getProcessDefinitionId, processDefinitionId);
+    }
+
+}

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/cc/BpmProcessInstanceCopyMapper.java → yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmProcessInstanceCopyMapper.java

@@ -1,10 +1,10 @@
-package cn.iocoder.yudao.module.bpm.dal.mysql.cc;
+package cn.iocoder.yudao.module.bpm.dal.mysql.task;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

+ 85 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmCategoryService.java

@@ -0,0 +1,85 @@
+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.category.BpmCategoryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import jakarta.validation.Valid;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+
+/**
+ * BPM 流程分类 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface BpmCategoryService {
+
+    /**
+     * 创建流程分类
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createCategory(@Valid BpmCategorySaveReqVO createReqVO);
+
+    /**
+     * 更新流程分类
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateCategory(@Valid BpmCategorySaveReqVO updateReqVO);
+
+    /**
+     * 删除流程分类
+     *
+     * @param id 编号
+     */
+    void deleteCategory(Long id);
+
+    /**
+     * 获得流程分类
+     *
+     * @param id 编号
+     * @return BPM 流程分类
+     */
+    BpmCategoryDO getCategory(Long id);
+
+    /**
+     * 获得流程分类分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 流程分类分页
+     */
+    PageResult<BpmCategoryDO> getCategoryPage(BpmCategoryPageReqVO pageReqVO);
+
+    /**
+     * 获得流程分类 Map,基于指定编码
+     *
+     * @param codes 编号数组
+     * @return 流程分类 Map
+     */
+    default Map<String, BpmCategoryDO> getCategoryMap(Collection<String> codes) {
+        return convertMap(getCategoryListByCode(codes), BpmCategoryDO::getCode);
+    }
+
+    /**
+     * 获得流程分类列表,基于指定编码
+     *
+     * @return 流程分类列表
+     */
+    List<BpmCategoryDO> getCategoryListByCode(Collection<String> codes);
+
+    /**
+     * 获得流程分类列表,基于指定状态
+     *
+     * @param status 状态
+     * @return 流程分类列表
+     */
+    List<BpmCategoryDO> getCategoryListByStatus(Integer status);
+
+}

+ 113 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmCategoryServiceImpl.java

@@ -0,0 +1,113 @@
+package cn.iocoder.yudao.module.bpm.service.definition;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.bpm.dal.mysql.category.BpmCategoryMapper;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+
+/**
+ * BPM 流程分类 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class BpmCategoryServiceImpl implements BpmCategoryService {
+
+    @Resource
+    private BpmCategoryMapper bpmCategoryMapper;
+
+    @Override
+    public Long createCategory(BpmCategorySaveReqVO createReqVO) {
+        // 校验唯一
+        validateCategoryNameUnique(createReqVO);
+        validateCategoryCodeUnique(createReqVO);
+        // 插入
+        BpmCategoryDO category = BeanUtils.toBean(createReqVO, BpmCategoryDO.class);
+        bpmCategoryMapper.insert(category);
+        return category.getId();
+    }
+
+    @Override
+    public void updateCategory(BpmCategorySaveReqVO updateReqVO) {
+        // 校验存在
+        validateCategoryExists(updateReqVO.getId());
+        validateCategoryNameUnique(updateReqVO);
+        validateCategoryCodeUnique(updateReqVO);
+        // 更新
+        BpmCategoryDO updateObj = BeanUtils.toBean(updateReqVO, BpmCategoryDO.class);
+        bpmCategoryMapper.updateById(updateObj);
+    }
+
+    private void validateCategoryNameUnique(BpmCategorySaveReqVO updateReqVO) {
+        BpmCategoryDO category = bpmCategoryMapper.selectByName(updateReqVO.getName());
+        if (category == null
+            || ObjUtil.equal(category.getId(), updateReqVO.getId())) {
+            return;
+        }
+        throw exception(CATEGORY_NAME_DUPLICATE, updateReqVO.getName());
+    }
+
+    private void validateCategoryCodeUnique(BpmCategorySaveReqVO updateReqVO) {
+        BpmCategoryDO category = bpmCategoryMapper.selectByCode(updateReqVO.getCode());
+        if (category == null
+            || ObjUtil.equal(category.getId(), updateReqVO.getId())) {
+            return;
+        }
+        throw exception(CATEGORY_CODE_DUPLICATE, updateReqVO.getCode());
+    }
+
+    @Override
+    public void deleteCategory(Long id) {
+        // 校验存在
+        validateCategoryExists(id);
+        // 删除
+        bpmCategoryMapper.deleteById(id);
+    }
+
+    private void validateCategoryExists(Long id) {
+        if (bpmCategoryMapper.selectById(id) == null) {
+            throw exception(CATEGORY_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public BpmCategoryDO getCategory(Long id) {
+        return bpmCategoryMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<BpmCategoryDO> getCategoryPage(BpmCategoryPageReqVO pageReqVO) {
+        return bpmCategoryMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<BpmCategoryDO> getCategoryListByCode(Collection<String> codes) {
+        if (CollUtil.isEmpty(codes)) {
+            return Collections.emptyList();
+        }
+        return bpmCategoryMapper.selectListByCode(codes);
+    }
+
+    @Override
+    public List<BpmCategoryDO> getCategoryListByStatus(Integer status) {
+        return bpmCategoryMapper.selectListByStatus(status);
+    }
+
+}

+ 3 - 8
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java

@@ -1,16 +1,14 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
-import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
-
 import jakarta.validation.Valid;
+
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -74,9 +72,6 @@ public interface BpmFormService {
      * @return 动态表单 Map
      */
     default Map<Long, BpmFormDO> getFormMap(Collection<Long> ids) {
-        if (CollUtil.isEmpty(ids)) {
-            return Collections.emptyMap();
-        }
         return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId);
     }
 

+ 5 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
@@ -80,6 +81,9 @@ public class BpmFormServiceImpl implements BpmFormService {
 
     @Override
     public List<BpmFormDO> getFormList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
         return formMapper.selectBatchIds(ids);
     }
 
@@ -88,7 +92,7 @@ public class BpmFormServiceImpl implements BpmFormService {
         return formMapper.selectPage(pageReqVO);
     }
 
-
+    // TODO @芋艿:这里没搞完!
     @Override
     public BpmFormDO checkFormConfig(String configStr) {
         BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(configStr, BpmModelMetaInfoRespDTO.class);

+ 11 - 10
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
 import jakarta.validation.Valid;
 import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.engine.repository.Model;
 
 /**
  * Flowable流程模型接口
@@ -18,7 +19,7 @@ public interface BpmModelService {
      * @param pageVO 分页查询
      * @return 流程模型分页
      */
-    PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO);
+    PageResult<Model> getModelPage(BpmModelPageReqVO pageVO);
 
     /**
      * 创建流程模型
@@ -35,7 +36,15 @@ public interface BpmModelService {
      * @param id 编号
      * @return 流程模型
      */
-    BpmModelRespVO getModel(String id);
+    Model getModel(String id);
+
+    /**
+     * 获得流程模型的 BPMN XML
+     *
+     * @param id 编号
+     * @return BPMN XML
+     */
+    byte[] getModelBpmnXML(String id);
 
     /**
      * 修改流程模型
@@ -66,14 +75,6 @@ public interface BpmModelService {
      */
     void updateModelState(String id, Integer state);
 
-    /**
-     * 获得流程模型编号对应的 BPMN Model
-     *
-     * @param id 流程模型编号
-     * @return BPMN Model
-     */
-    BpmnModel getBpmnModel(String id);
-
     /**
      * 获得流程定义编号对应的 BPMN Model
      *

+ 41 - 64
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java

@@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.bpm.service.definition;
 
 import cn.hutool.core.util.StrUtil;
 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.framework.common.util.validation.ValidationUtils;
-import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelUpdateReqVO;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
@@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.common.engine.impl.db.SuspensionState;
 import org.flowable.engine.RepositoryService;
-import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.Model;
 import org.flowable.engine.repository.ModelQuery;
 import org.flowable.engine.repository.ProcessDefinition;
@@ -30,10 +29,10 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 import org.springframework.validation.annotation.Validated;
 
-import java.util.*;
+import java.util.List;
+import java.util.Objects;
 
 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.*;
 
 /**
@@ -60,7 +59,7 @@ public class BpmModelServiceImpl implements BpmModelService {
     private BpmTaskCandidateInvoker taskCandidateInvoker;
 
     @Override
-    public PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO) {
+    public PageResult<Model> getModelPage(BpmModelPageReqVO pageVO) {
         ModelQuery modelQuery = repositoryService.createModelQuery();
         if (StrUtil.isNotBlank(pageVO.getKey())) {
             modelQuery.modelKey(pageVO.getKey());
@@ -72,34 +71,21 @@ public class BpmModelServiceImpl implements BpmModelService {
             modelQuery.modelCategory(pageVO.getCategory());
         }
         // 执行查询
-        List<Model> models = modelQuery.modelTenantId(TenantContextHolder.getTenantIdStr())
+        long count = modelQuery.count();
+        if (count == 0) {
+            return PageResult.empty(count);
+        }
+        List<Model> models = modelQuery
+                .modelTenantId(TenantContextHolder.getTenantIdStr())
                 .orderByCreateTime().desc()
                 .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
-
-        // 获得 Form Map
-        Set<Long> formIds = CollectionUtils.convertSet(models, model -> {
-            BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
-            return metaInfo != null ? metaInfo.getFormId() : null;
-        });
-        Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds);
-
-        // 获得 Deployment Map
-        Set<String> deploymentIds = new HashSet<>();
-        models.forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId()));
-        Map<String, Deployment> deploymentMap = processDefinitionService.getDeploymentMap(deploymentIds);
-        // 获得 ProcessDefinition Map
-        List<ProcessDefinition> processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds(deploymentIds);
-        Map<String, ProcessDefinition> processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId);
-
-        // 拼接结果
-        long modelCount = modelQuery.count();
-        return new PageResult<>(BpmModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount);
+        return new PageResult<>(models, count);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
-        checkKeyNCName(createReqVO.getKey());
+        validateKeyNCName(createReqVO.getKey());
         // 校验流程标识已经存在
         Model keyModel = getModelByKey(createReqVO.getKey());
         if (keyModel != null) {
@@ -108,7 +94,7 @@ public class BpmModelServiceImpl implements BpmModelService {
 
         // 创建流程定义
         Model model = repositoryService.newModel();
-        BpmModelConvert.INSTANCE.copy(model, createReqVO);
+        BpmModelConvert.INSTANCE.copyToCreateModel(model, createReqVO);
         model.setTenantId(TenantContextHolder.getTenantIdStr());
         // 保存流程定义
         repositoryService.saveModel(model);
@@ -117,34 +103,17 @@ public class BpmModelServiceImpl implements BpmModelService {
         return model.getId();
     }
 
-    private Model getModelByKey(String key) {
-        return repositoryService.createModelQuery().modelKey(key).singleResult();
-    }
-
-    @Override
-    public BpmModelRespVO getModel(String id) {
-        Model model = repositoryService.getModel(id);
-        if (model == null) {
-            return null;
-        }
-        BpmModelRespVO modelRespVO = BpmModelConvert.INSTANCE.convert(model);
-        // 拼接 bpmn XML
-        byte[] bpmnBytes = repositoryService.getModelEditorSource(id);
-        modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes));
-        return modelRespVO;
-    }
-
     @Override
     @Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
     public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) {
         // 校验流程模型存在
-        Model model = repositoryService.getModel(updateReqVO.getId());
+        Model model = getModel(updateReqVO.getId());
         if (model == null) {
             throw exception(MODEL_NOT_EXISTS);
         }
 
         // 修改流程定义
-        BpmModelConvert.INSTANCE.copy(model, updateReqVO);
+        BpmModelConvert.INSTANCE.copyToUpdateModel(model, updateReqVO);
         // 更新模型
         repositoryService.saveModel(model);
         // 更新 BPMN XML
@@ -155,18 +124,18 @@ public class BpmModelServiceImpl implements BpmModelService {
     @Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
     public void deployModel(String id) {
         // 1.1 校验流程模型存在
-        Model model = repositoryService.getModel(id);
+        Model model = getModel(id);
         if (ObjectUtils.isEmpty(model)) {
             throw exception(MODEL_NOT_EXISTS);
         }
         // 1.2 校验流程图
         // TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素;
-        byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId());
+        byte[] bpmnBytes = getModelBpmnXML(model.getId());
         if (bpmnBytes == null) {
             throw exception(MODEL_NOT_EXISTS);
         }
         // 1.3 校验表单已配
-        BpmFormDO form = checkFormConfig(model.getMetaInfo());
+        BpmFormDO form = validateFormConfig(model.getMetaInfo());
         // 1.4 校验任务分配规则已配置
         taskCandidateInvoker.validateBpmnConfig(bpmnBytes);
 
@@ -194,7 +163,7 @@ public class BpmModelServiceImpl implements BpmModelService {
     @Transactional(rollbackFor = Exception.class)
     public void deleteModel(String id) {
         // 校验流程模型存在
-        Model model = repositoryService.getModel(id);
+        Model model = getModel(id);
         if (model == null) {
             throw exception(MODEL_NOT_EXISTS);
         }
@@ -206,33 +175,27 @@ public class BpmModelServiceImpl implements BpmModelService {
 
     @Override
     public void updateModelState(String id, Integer state) {
-        // 校验流程模型存在
-        Model model = repositoryService.getModel(id);
+        // 1.1 校验流程模型存在
+        Model model = getModel(id);
         if (model == null) {
             throw exception(MODEL_NOT_EXISTS);
         }
-        // 校验流程定义存在
+        // 1.2 校验流程定义存在
         ProcessDefinition definition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
         if (definition == null) {
             throw exception(PROCESS_DEFINITION_NOT_EXISTS);
         }
 
-        // 更新状态
+        // 2. 更新状态
         processDefinitionService.updateProcessDefinitionState(definition.getId(), state);
     }
 
-    @Override
-    public BpmnModel getBpmnModel(String id) {
-        byte[] bpmnBytes = repositoryService.getModelEditorSource(id);
-        return BpmnModelUtils.getBpmnModel(bpmnBytes);
-    }
-
     @Override
     public BpmnModel getBpmnModelByDefinitionId(String processDefinitionId) {
         return repositoryService.getBpmnModel(processDefinitionId);
     }
 
-    private void checkKeyNCName(String key) {
+    private void validateKeyNCName(String key) {
         if (!ValidationUtils.isXmlNCName(key)) {
             throw exception(MODEL_KEY_VALID);
         }
@@ -244,7 +207,7 @@ public class BpmModelServiceImpl implements BpmModelService {
      * @param metaInfoStr 流程模型 metaInfo 字段
      * @return 流程表单
      */
-    private BpmFormDO checkFormConfig(String  metaInfoStr) {
+    private BpmFormDO validateFormConfig(String  metaInfoStr) {
         BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(metaInfoStr, BpmModelMetaInfoRespDTO.class);
         if (metaInfo == null || metaInfo.getFormType() == null) {
             throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG);
@@ -282,4 +245,18 @@ public class BpmModelServiceImpl implements BpmModelService {
         processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode());
     }
 
+    private Model getModelByKey(String key) {
+        return repositoryService.createModelQuery().modelKey(key).singleResult();
+    }
+
+    @Override
+    public Model getModel(String id) {
+        return repositoryService.getModel(id);
+    }
+
+    @Override
+    public byte[] getModelBpmnXML(String id) {
+        return repositoryService.getModelEditorSource(id);
+    }
+
 }

+ 17 - 23
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionService.java

@@ -1,17 +1,14 @@
 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.process.BpmProcessDefinitionListReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import jakarta.validation.Valid;
-import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.ProcessDefinition;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -33,15 +30,15 @@ public interface BpmProcessDefinitionService {
      * @param pageReqVO 分页入参
      * @return 流程定义 Page
      */
-    PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO);
+    PageResult<ProcessDefinition> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO);
 
     /**
      * 获得流程定义列表
      *
-     * @param listReqVO 列表入参
+     * @param suspensionState 中断状态
      * @return 流程定义列表
      */
-    List<BpmProcessDefinitionRespVO> getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO);
+    List<ProcessDefinition> getProcessDefinitionListBySuspensionState(Integer suspensionState);
 
     /**
      * 创建流程定义
@@ -68,20 +65,24 @@ public interface BpmProcessDefinitionService {
     String getProcessDefinitionBpmnXML(String id);
 
     /**
-     * 获得需要创建的流程定义,是否和当前激活的流程定义相等
+     * 获得流程定义的信息
      *
-     * @param createReqDTO 创建信息
-     * @return 是否相等
+     * @param id 流程定义编号
+     * @return 流程定义信息
      */
-    boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO);
+    BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id);
 
     /**
-     * 获得编号对应的 BpmProcessDefinitionExtDO
+     * 获得流程定义的信息 List
      *
-     * @param id 编号
-     * @return 流程定义拓展
+     * @param ids 流程定义编号数组
+     * @return 流程额定义信息数组
      */
-    BpmProcessDefinitionExtDO getProcessDefinitionExt(String id);
+    List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoList(Collection<String> ids);
+
+    default Map<String, BpmProcessDefinitionInfoDO> getProcessDefinitionInfoMap(Set<String> ids) {
+        return convertMap(getProcessDefinitionInfoList(ids), BpmProcessDefinitionInfoDO::getProcessDefinitionId);
+    }
 
     /**
      * 获得编号对应的 ProcessDefinition
@@ -153,11 +154,4 @@ public interface BpmProcessDefinitionService {
      */
     Deployment getDeployment(String id);
 
-    /**
-     * 获得 Bpmn 模型
-     *
-     * @param processDefinitionId 流程定义的编号
-     * @return Bpmn 模型
-     */
-    BpmnModel getBpmnModel(String processDefinitionId);
 }

+ 29 - 101
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java

@@ -1,21 +1,15 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
-import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
-import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
-import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionInfoMapper;
+import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
@@ -33,7 +27,7 @@ import org.springframework.validation.annotation.Validated;
 import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.addIfNotNull;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
 import static java.util.Collections.emptyList;
@@ -55,10 +49,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
     private RepositoryService repositoryService;
 
     @Resource
-    private BpmProcessDefinitionExtMapper processDefinitionMapper;
-
-    @Resource
-    private BpmFormService formService;
+    private BpmProcessDefinitionInfoMapper processDefinitionMapper;
 
     @Override
     public ProcessDefinition getProcessDefinition(String id) {
@@ -111,11 +102,6 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         return repositoryService.createDeploymentQuery().deploymentId(id).singleResult();
     }
 
-    @Override
-    public BpmnModel getBpmnModel(String processDefinitionId) {
-        return repositoryService.getBpmnModel(processDefinitionId);
-    }
-
     @Override
     public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
         // 创建 Deployment 部署
@@ -141,7 +127,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         }
 
         // 插入拓展表
-        BpmProcessDefinitionExtDO definitionDO = BpmProcessDefinitionConvert.INSTANCE.convert2(createReqDTO)
+        BpmProcessDefinitionInfoDO definitionDO = BpmProcessDefinitionConvert.INSTANCE.convert2(createReqDTO)
                 .setProcessDefinitionId(definition.getId());
         processDefinitionMapper.insert(definitionDO);
         return definition.getId();
@@ -175,101 +161,43 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
     }
 
     @Override
-    public boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
-        // 校验 name、description 是否更新
-        ProcessDefinition oldProcessDefinition = getActiveProcessDefinition(createReqDTO.getKey());
-        if (oldProcessDefinition == null) {
-            return false;
-        }
-        BpmProcessDefinitionExtDO oldProcessDefinitionExt = getProcessDefinitionExt(oldProcessDefinition.getId());
-        if (!StrUtil.equals(createReqDTO.getName(), oldProcessDefinition.getName())
-                || !StrUtil.equals(createReqDTO.getDescription(), oldProcessDefinitionExt.getDescription())
-                || !StrUtil.equals(createReqDTO.getCategory(), oldProcessDefinition.getCategory())) {
-            return false;
-        }
-        // 校验 form 信息是否更新
-        if (!ObjectUtil.equal(createReqDTO.getFormType(), oldProcessDefinitionExt.getFormType())
-                || !ObjectUtil.equal(createReqDTO.getFormId(), oldProcessDefinitionExt.getFormId())
-                || !ObjectUtil.equal(createReqDTO.getFormConf(), oldProcessDefinitionExt.getFormConf())
-                || !ObjectUtil.equal(createReqDTO.getFormFields(), oldProcessDefinitionExt.getFormFields())
-                || !ObjectUtil.equal(createReqDTO.getFormCustomCreatePath(), oldProcessDefinitionExt.getFormCustomCreatePath())
-                || !ObjectUtil.equal(createReqDTO.getFormCustomViewPath(), oldProcessDefinitionExt.getFormCustomViewPath())) {
-            return false;
-        }
-        // 校验 BPMN XML 信息
-        BpmnModel newModel = BpmnModelUtils.getBpmnModel(createReqDTO.getBpmnBytes());
-        BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId());
-        // 对比字节变化
-        if (!BpmnModelUtils.equals(oldModel, newModel)) {
-            return false;
-        }
-        // 最终发现都一致,则返回 true
-        return true;
+    public BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id) {
+        return processDefinitionMapper.selectByProcessDefinitionId(id);
     }
 
     @Override
-    public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) {
-        return processDefinitionMapper.selectByProcessDefinitionId(id);
+    public List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoList(Collection<String> ids) {
+        return processDefinitionMapper.selectListByProcessDefinitionIds(ids);
     }
 
     @Override
-    public List<BpmProcessDefinitionRespVO> getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO) {
-        // 拼接查询条件
-        ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
-        if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), listReqVO.getSuspensionState())) {
-            definitionQuery.suspended();
-        } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), listReqVO.getSuspensionState())) {
-            definitionQuery.active();
+    public PageResult<ProcessDefinition> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
+        ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
+        if (StrUtil.isNotBlank(pageVO.getKey())) {
+            query.processDefinitionKey(pageVO.getKey());
         }
         // 执行查询
-        definitionQuery.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
-        List<ProcessDefinition> processDefinitions = definitionQuery.list();
-        if (CollUtil.isEmpty(processDefinitions)) {
-            return Collections.emptyList();
+        long count = query.count();
+        if (count == 0) {
+            return PageResult.empty(count);
         }
-
-        // 获得 BpmProcessDefinitionDO Map
-        List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
-                convertList(processDefinitions, ProcessDefinition::getId));
-        Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = convertMap(processDefinitionDOs,
-                BpmProcessDefinitionExtDO::getProcessDefinitionId);
-        // 执行查询,并返回
-        return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap);
+        List<ProcessDefinition> list = query.orderByProcessDefinitionVersion().desc()
+                .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
+        return new PageResult<>(list, count);
     }
 
     @Override
-    public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
-        ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
-        if (StrUtil.isNotBlank(pageVO.getKey())) {
-            definitionQuery.processDefinitionKey(pageVO.getKey());
+    public List<ProcessDefinition> getProcessDefinitionListBySuspensionState(Integer suspensionState) {
+        // 拼接查询条件
+        ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
+        if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), suspensionState)) {
+            query.suspended();
+        } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), suspensionState)) {
+            query.active();
         }
-
         // 执行查询
-        List<ProcessDefinition> processDefinitions = definitionQuery.orderByProcessDefinitionVersion().desc()
-                .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
-
-        if (CollUtil.isEmpty(processDefinitions)) {
-            return new PageResult<>(emptyList(), definitionQuery.count());
-        }
-        // 获得 Deployment Map
-        Set<String> deploymentIds = new HashSet<>();
-        processDefinitions.forEach(definition -> addIfNotNull(deploymentIds, definition.getDeploymentId()));
-        Map<String, Deployment> deploymentMap = getDeploymentMap(deploymentIds);
-
-        // 获得 BpmProcessDefinitionDO Map
-        List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
-                convertList(processDefinitions, ProcessDefinition::getId));
-        Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = convertMap(processDefinitionDOs,
-                BpmProcessDefinitionExtDO::getProcessDefinitionId);
-
-        // 获得 Form Map
-        Set<Long> formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId);
-        Map<Long, BpmFormDO> formMap = formService.getFormMap(formIds);
-
-        // 拼接结果
-        long definitionCount = definitionQuery.count();
-        return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap,
-                processDefinitionDOMap, formMap), definitionCount);
+        query.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
+        return query.list();
     }
 
 }

+ 0 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java

@@ -40,7 +40,6 @@ public class BpmProcessDefinitionCreateReqDTO {
     private String description;
     /**
      * 流程分类
-     * 参见 bpm_model_category 数据字典
      */
     @NotEmpty(message = "流程分类不能为空")
     private String category;

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyService.java

@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO;
 
 import java.util.Collection;
 

+ 2 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceCopyServiceImpl.java

@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.bpm.service.task;
 import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
-import cn.iocoder.yudao.module.bpm.dal.dataobject.cc.BpmProcessInstanceCopyDO;
-import cn.iocoder.yudao.module.bpm.dal.mysql.cc.BpmProcessInstanceCopyMapper;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceCopyMapper;
 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 import jakarta.annotation.Resource;

文件差異過大導致無法顯示
+ 0 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


+ 12 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/category/BpmCategoryMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.category.BpmCategoryMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 137 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/category/BpmCategoryServiceImplTest.java

@@ -0,0 +1,137 @@
+package cn.iocoder.yudao.module.bpm.service.category;
+
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategoryPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.category.BpmCategorySaveReqVO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryServiceImpl;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import jakarta.annotation.Resource;
+
+import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.category.BpmCategoryMapper;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+import org.springframework.context.annotation.Import;
+
+import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
+import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
+import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link BpmCategoryServiceImpl} 的单元测试类
+ *
+ * @author 芋道源码
+ */
+@Import(BpmCategoryServiceImpl.class)
+public class BpmCategoryServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private BpmCategoryServiceImpl categoryService;
+
+    @Resource
+    private BpmCategoryMapper categoryMapper;
+
+    @Test
+    public void testCreateCategory_success() {
+        // 准备参数
+        BpmCategorySaveReqVO createReqVO = randomPojo(BpmCategorySaveReqVO.class).setId(null);
+
+        // 调用
+        Long categoryId = categoryService.createCategory(createReqVO);
+        // 断言
+        assertNotNull(categoryId);
+        // 校验记录的属性是否正确
+        BpmCategoryDO category = categoryMapper.selectById(categoryId);
+        assertPojoEquals(createReqVO, category, "id");
+    }
+
+    @Test
+    public void testUpdateCategory_success() {
+        // mock 数据
+        BpmCategoryDO dbCategory = randomPojo(BpmCategoryDO.class);
+        categoryMapper.insert(dbCategory);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        BpmCategorySaveReqVO updateReqVO = randomPojo(BpmCategorySaveReqVO.class, o -> {
+            o.setId(dbCategory.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        categoryService.updateCategory(updateReqVO);
+        // 校验是否更新正确
+        BpmCategoryDO category = categoryMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, category);
+    }
+
+    @Test
+    public void testUpdateCategory_notExists() {
+        // 准备参数
+        BpmCategorySaveReqVO updateReqVO = randomPojo(BpmCategorySaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> categoryService.updateCategory(updateReqVO), CATEGORY_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteCategory_success() {
+        // mock 数据
+        BpmCategoryDO dbCategory = randomPojo(BpmCategoryDO.class);
+        categoryMapper.insert(dbCategory);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbCategory.getId();
+
+        // 调用
+        categoryService.deleteCategory(id);
+       // 校验数据不存在了
+       assertNull(categoryMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteCategory_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> categoryService.deleteCategory(id), CATEGORY_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetCategoryPage() {
+       // mock 数据
+       BpmCategoryDO dbCategory = randomPojo(BpmCategoryDO.class, o -> { // 等会查询到
+           o.setName(null);
+           o.setCode(null);
+           o.setStatus(null);
+           o.setCreateTime(null);
+       });
+       categoryMapper.insert(dbCategory);
+       // 测试 name 不匹配
+       categoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setName(null)));
+       // 测试 code 不匹配
+       categoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setCode(null)));
+       // 测试 status 不匹配
+       categoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setStatus(null)));
+       // 测试 createTime 不匹配
+       categoryMapper.insert(cloneIgnoreId(dbCategory, o -> o.setCreateTime(null)));
+       // 准备参数
+       BpmCategoryPageReqVO reqVO = new BpmCategoryPageReqVO();
+       reqVO.setName(null);
+       reqVO.setCode(null);
+       reqVO.setStatus(null);
+       reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+       // 调用
+       PageResult<BpmCategoryDO> pageResult = categoryService.getCategoryPage(reqVO);
+       // 断言
+       assertEquals(1, pageResult.getTotal());
+       assertEquals(1, pageResult.getList().size());
+       assertPojoEquals(dbCategory, pageResult.getList().get(0));
+    }
+
+}

部分文件因文件數量過多而無法顯示