mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2025-01-31 17:40:05 +08:00
BPM:新增流程分类表,替代现有的 bpm_category
数据字典
This commit is contained in:
parent
d5e28d4c57
commit
ed83b912e4
@ -65,7 +65,12 @@ public interface ErrorCodeConstants {
|
|||||||
ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表单项({}) 和 ({}) 使用了相同的字段名({})");
|
ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表单项({}) 和 ({}) 使用了相同的字段名({})");
|
||||||
|
|
||||||
// ========== 用户组模块 1-009-011-000 ==========
|
// ========== 用户组模块 1-009-011-000 ==========
|
||||||
ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(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_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, "流程分类编码【{}】重复");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.enums.task;
|
package cn.iocoder.yudao.module.bpm.enums.task;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例 ProcessInstance 的状态
|
* 流程实例 ProcessInstance 的状态
|
||||||
*
|
*
|
||||||
@ -10,13 +13,15 @@ import lombok.Getter;
|
|||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum BpmProcessInstanceStatusEnum {
|
public enum BpmProcessInstanceStatusEnum implements IntArrayValuable {
|
||||||
|
|
||||||
RUNNING(1, "审批中"),
|
RUNNING(1, "审批中"),
|
||||||
APPROVE(2, "审批通过"),
|
APPROVE(2, "审批通过"),
|
||||||
REJECT(3, "审批不通过"),
|
REJECT(3, "审批不通过"),
|
||||||
CANCEL(4, "已取消");
|
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;
|
private final String desc;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] array() {
|
||||||
|
return new int[0];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,5 +70,9 @@
|
|||||||
<artifactId>yudao-spring-boot-starter-flowable</artifactId>
|
<artifactId>yudao-spring-boot-starter-flowable</artifactId>
|
||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
|
<artifactId>yudao-spring-boot-starter-excel</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@ -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())));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,23 +1,41 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.controller.admin.definition;
|
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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.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.controller.admin.definition.vo.model.*;
|
||||||
import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
|
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.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.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
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.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.io.IOException;
|
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.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 = "管理后台 - 流程模型")
|
@Tag(name = "管理后台 - 流程模型")
|
||||||
@RestController
|
@RestController
|
||||||
@ -27,11 +45,39 @@ public class BpmModelController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private BpmModelService modelService;
|
private BpmModelService modelService;
|
||||||
|
@Resource
|
||||||
|
private BpmFormService formService;
|
||||||
|
@Resource
|
||||||
|
private BpmCategoryService categoryService;
|
||||||
|
@Resource
|
||||||
|
private BpmProcessDefinitionService processDefinitionService;
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得模型分页")
|
@Operation(summary = "获得模型分页")
|
||||||
public CommonResult<PageResult<BpmModelPageItemRespVO>> getModelPage(BpmModelPageReqVO pageVO) {
|
public CommonResult<PageResult<BpmModelRespVO>> getModelPage(BpmModelPageReqVO pageVO) {
|
||||||
return success(modelService.getModelPage(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")
|
@GetMapping("/get")
|
||||||
@ -39,8 +85,12 @@ public class BpmModelController {
|
|||||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
@PreAuthorize("@ss.hasPermission('bpm:model:query')")
|
@PreAuthorize("@ss.hasPermission('bpm:model:query')")
|
||||||
public CommonResult<BpmModelRespVO> getModel(@RequestParam("id") String id) {
|
public CommonResult<BpmModelRespVO> getModel(@RequestParam("id") String id) {
|
||||||
BpmModelRespVO model = modelService.getModel(id);
|
Model model = modelService.getModel(id);
|
||||||
return success(model);
|
if (model == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] bpmnBytes = modelService.getModelBpmnXML(id);
|
||||||
|
return success(BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
@ -93,4 +143,5 @@ public class BpmModelController {
|
|||||||
modelService.deleteModel(id);
|
modelService.deleteModel(id);
|
||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,23 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.controller.admin.definition;
|
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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.BpmProcessDefinitionPageReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
|
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 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.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.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
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.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import java.util.Collections;
|
||||||
|
|
||||||
import java.util.List;
|
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.pojo.CommonResult.success;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
|
|
||||||
@Tag(name = "管理后台 - 流程定义")
|
@Tag(name = "管理后台 - 流程定义")
|
||||||
@RestController
|
@RestController
|
||||||
@ -30,22 +39,54 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
|||||||
public class BpmProcessDefinitionController {
|
public class BpmProcessDefinitionController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private BpmProcessDefinitionService bpmDefinitionService;
|
private BpmProcessDefinitionService processDefinitionService;
|
||||||
|
@Resource
|
||||||
|
private BpmFormService formService;
|
||||||
|
@Resource
|
||||||
|
private BpmCategoryService categoryService;
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得流程定义分页")
|
@Operation(summary = "获得流程定义分页")
|
||||||
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
||||||
public CommonResult<PageResult<BpmProcessDefinitionPageItemRespVO>> getProcessDefinitionPage(
|
public CommonResult<PageResult<BpmProcessDefinitionRespVO>> getProcessDefinitionPage(
|
||||||
BpmProcessDefinitionPageReqVO pageReqVO) {
|
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")
|
@GetMapping ("/list")
|
||||||
@Operation(summary = "获得流程定义列表")
|
@Operation(summary = "获得流程定义列表")
|
||||||
|
@Parameter(name = "suspensionState", description = "挂起状态", required = true, example = "1") // 参见 Flowable SuspensionState 枚举
|
||||||
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
||||||
public CommonResult<List<BpmProcessDefinitionRespVO>> getProcessDefinitionList(
|
public CommonResult<List<BpmProcessDefinitionRespVO>> getProcessDefinitionList(
|
||||||
BpmProcessDefinitionListReqVO listReqVO) {
|
@RequestParam("suspensionState") Integer suspensionState) {
|
||||||
return success(bpmDefinitionService.getProcessDefinitionList(listReqVO));
|
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")
|
@GetMapping ("/get-bpmn-xml")
|
||||||
@ -53,7 +94,8 @@ public class BpmProcessDefinitionController {
|
|||||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
@PreAuthorize("@ss.hasPermission('bpm:process-definition:query')")
|
||||||
public CommonResult<String> getProcessDefinitionBpmnXML(@RequestParam("id") String id) {
|
public CommonResult<String> getProcessDefinitionBpmnXML(@RequestParam("id") String id) {
|
||||||
String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id);
|
String bpmnXML = processDefinitionService.getProcessDefinitionBpmnXML(id);
|
||||||
return success(bpmnXML);
|
return success(bpmnXML);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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;
|
|
||||||
|
|
||||||
}
|
|
@ -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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -13,13 +13,13 @@ import lombok.ToString;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class BpmModelPageReqVO extends PageParam {
|
public class BpmModelPageReqVO extends PageParam {
|
||||||
|
|
||||||
@Schema(description = "标识-精准匹配", example = "process1641042089407")
|
@Schema(description = "标识,精准匹配", example = "process1641042089407")
|
||||||
private String key;
|
private String key;
|
||||||
|
|
||||||
@Schema(description = "名字-模糊匹配", example = "芋道")
|
@Schema(description = "名字,模糊匹配", example = "芋道")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
|
@Schema(description = "流程分类", example = "1")
|
||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,25 +1,56 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 流程模型的创建 Request VO")
|
@Schema(description = "管理后台 - 流程模型 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
public class BpmModelRespVO {
|
||||||
@ToString(callSuper = true)
|
|
||||||
public class BpmModelRespVO extends BpmModelBaseVO {
|
|
||||||
|
|
||||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "流程标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_yudao")
|
||||||
private String bpmnXml;
|
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)
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String bpmnXml;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最新部署的流程定义
|
||||||
|
*/
|
||||||
|
private BpmProcessDefinitionRespVO processDefinition;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ public class BpmModelUpdateReqVO {
|
|||||||
@Schema(description = "流程描述", example = "我是描述")
|
@Schema(description = "流程描述", example = "我是描述")
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
@Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
|
@Schema(description = "流程分类", example = "1")
|
||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
@Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@ -13,8 +13,8 @@ public class BpmModelUpdateStateReqVO {
|
|||||||
@NotNull(message = "编号不能为空")
|
@NotNull(message = "编号不能为空")
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Schema(description = "状态-见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
@NotNull(message = "状态不能为空")
|
@NotNull(message = "状态不能为空")
|
||||||
private Integer state;
|
private Integer state; // 参见 Flowable SuspensionState 枚举
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
}
|
|
@ -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;
|
|
||||||
|
|
||||||
}
|
|
@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 流程定义 Response VO")
|
@Schema(description = "管理后台 - 流程定义 Response VO")
|
||||||
@ -23,14 +25,17 @@ public class BpmProcessDefinitionRespVO {
|
|||||||
@Schema(description = "流程描述", example = "我是描述")
|
@Schema(description = "流程描述", example = "我是描述")
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
@Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
|
@Schema(description = "流程分类", example = "1")
|
||||||
@NotEmpty(message = "流程分类不能为空")
|
|
||||||
private String category;
|
private String category;
|
||||||
|
@Schema(description = "流程分类名字", example = "请假")
|
||||||
|
private String categoryName;
|
||||||
|
|
||||||
@Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1")
|
@Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1")
|
||||||
private Integer formType;
|
private Integer formType;
|
||||||
@Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024")
|
@Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024")
|
||||||
private Long formId;
|
private Long formId;
|
||||||
|
@Schema(description = "表单名字", example = "请假表单")
|
||||||
|
private String formName;
|
||||||
@Schema(description = "表单的配置-JSON 字符串。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "表单的配置-JSON 字符串。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private String formConf;
|
private String formConf;
|
||||||
@Schema(description = "表单项的数组-JSON 字符串的数组。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
|
@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")
|
@Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
private Integer suspensionState;
|
private Integer suspensionState;
|
||||||
|
|
||||||
|
@Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.controller.admin.task.vo.instance.*;
|
||||||
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
|
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.definition.BpmProcessDefinitionService;
|
||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||||
@ -40,6 +42,8 @@ public class BpmProcessInstanceController {
|
|||||||
private BpmTaskService taskService;
|
private BpmTaskService taskService;
|
||||||
@Resource
|
@Resource
|
||||||
private BpmProcessDefinitionService processDefinitionService;
|
private BpmProcessDefinitionService processDefinitionService;
|
||||||
|
@Resource
|
||||||
|
private BpmCategoryService categoryService;
|
||||||
|
|
||||||
@GetMapping("/my-page")
|
@GetMapping("/my-page")
|
||||||
@Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
|
@Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
|
||||||
@ -56,7 +60,9 @@ public class BpmProcessInstanceController {
|
|||||||
convertList(pageResult.getList(), HistoricProcessInstance::getId));
|
convertList(pageResult.getList(), HistoricProcessInstance::getId));
|
||||||
Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
|
Map<String, ProcessDefinition> processDefinitionMap = processDefinitionService.getProcessDefinitionMap(
|
||||||
convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
|
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")
|
@PostMapping("/create")
|
||||||
|
@ -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.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.cc.BpmProcessInstanceCopyRespVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
|
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.BpmProcessInstanceCopyService;
|
||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||||
@ -44,7 +44,7 @@ public class BpmProcessInstanceCopyController {
|
|||||||
@Resource
|
@Resource
|
||||||
private BpmProcessInstanceService processInstanceService;
|
private BpmProcessInstanceService processInstanceService;
|
||||||
@Resource
|
@Resource
|
||||||
private BpmTaskService bpmTaskService;
|
private BpmTaskService taskService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private AdminUserApi adminUserApi;
|
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));
|
convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId));
|
||||||
Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
|
Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
|
||||||
convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
|
convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
|
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.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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@ -23,13 +25,11 @@ public class BpmProcessInstanceMyPageReqVO extends PageParam {
|
|||||||
@Schema(description = "流程定义的编号", example = "2048")
|
@Schema(description = "流程定义的编号", example = "2048")
|
||||||
private String processDefinitionId;
|
private String processDefinitionId;
|
||||||
|
|
||||||
@Schema(description = "流程实例的状态-参见 bpm_process_instance_status", example = "1")
|
@Schema(description = "流程实例的状态", example = "1")
|
||||||
|
@InEnum(BpmProcessInstanceStatusEnum.class)
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "流程实例的结果-参见 bpm_process_instance_result", example = "2")
|
@Schema(description = "流程分类", example = "1")
|
||||||
private Integer result;
|
|
||||||
|
|
||||||
@Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1")
|
|
||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
|
@ -6,6 +6,7 @@ import lombok.Data;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
// TODO @芋艿:是不是要融合?
|
||||||
@Schema(description = "管理后台 - 流程实例的分页 Item Response VO")
|
@Schema(description = "管理后台 - 流程实例的分页 Item Response VO")
|
||||||
@Data
|
@Data
|
||||||
public class BpmProcessInstancePageItemRespVO {
|
public class BpmProcessInstancePageItemRespVO {
|
||||||
@ -19,10 +20,12 @@ public class BpmProcessInstancePageItemRespVO {
|
|||||||
@Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
|
@Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
|
||||||
private String processDefinitionId;
|
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;
|
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 枚举
|
private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
|
||||||
|
|
||||||
@Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@ -17,15 +17,12 @@ public class BpmProcessInstanceRespVO {
|
|||||||
@Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
|
@Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
|
||||||
private String name;
|
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;
|
private String category;
|
||||||
|
|
||||||
@Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
|
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)
|
@Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@ -1,10 +1,17 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.convert.definition;
|
package cn.iocoder.yudao.module.bpm.convert.definition;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
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.collection.CollectionUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
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.dal.dataobject.definition.BpmFormDO;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
|
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
||||||
@ -30,57 +37,61 @@ public interface BpmModelConvert {
|
|||||||
|
|
||||||
BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class);
|
BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class);
|
||||||
|
|
||||||
default List<BpmModelPageItemRespVO> convertList(List<Model> list, Map<Long, BpmFormDO> formMap,
|
default PageResult<BpmModelRespVO> buildModelPage(PageResult<Model> pageResult,
|
||||||
Map<String, Deployment> deploymentMap,
|
Map<Long, BpmFormDO> formMap,
|
||||||
|
Map<String, BpmCategoryDO> categoryMap, Map<String, Deployment> deploymentMap,
|
||||||
Map<String, ProcessDefinition> processDefinitionMap) {
|
Map<String, ProcessDefinition> processDefinitionMap) {
|
||||||
return CollectionUtils.convertList(list, model -> {
|
List<BpmModelRespVO> list = CollectionUtils.convertList(pageResult.getList(), model -> {
|
||||||
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
|
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
|
||||||
BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null;
|
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;
|
Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null;
|
||||||
ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.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) {
|
default BpmModelRespVO buildModel(Model model,
|
||||||
BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO();
|
byte[] bpmnBytes) {
|
||||||
modelRespVO.setId(model.getId());
|
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
|
||||||
modelRespVO.setCreateTime(DateUtils.of(model.getCreateTime()));
|
BpmModelRespVO modelVO = buildModel0(model, metaInfo, null, null, null, null);
|
||||||
// 通用 copy
|
modelVO.setBpmnXml(new String(bpmnBytes));
|
||||||
copyTo(model, modelRespVO);
|
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
|
// Form
|
||||||
|
if (metaInfo != null) {
|
||||||
|
modelRespVO.setFormType(metaInfo.getFormType()).setFormId(metaInfo.getFormId())
|
||||||
|
.setFormCustomCreatePath(metaInfo.getFormCustomCreatePath())
|
||||||
|
.setFormCustomViewPath(metaInfo.getFormCustomViewPath());
|
||||||
|
modelRespVO.setDescription(metaInfo.getDescription());
|
||||||
|
}
|
||||||
if (form != null) {
|
if (form != null) {
|
||||||
modelRespVO.setFormId(form.getId());
|
modelRespVO.setFormId(form.getId()).setFormName(form.getName());
|
||||||
modelRespVO.setFormName(form.getName());
|
}
|
||||||
|
// Category
|
||||||
|
if (category != null) {
|
||||||
|
modelRespVO.setCategoryName(category.getName());
|
||||||
}
|
}
|
||||||
// ProcessDefinition
|
// ProcessDefinition
|
||||||
modelRespVO.setProcessDefinition(this.convert(processDefinition));
|
if (processDefinition != null) {
|
||||||
if (modelRespVO.getProcessDefinition() != null) {
|
modelRespVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
|
||||||
modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ?
|
modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ?
|
||||||
SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
|
SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
|
||||||
|
if (deployment != null) {
|
||||||
modelRespVO.getProcessDefinition().setDeploymentTime(DateUtils.of(deployment.getDeploymentTime()));
|
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;
|
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);
|
BpmModelCreateReqVO convert(BpmModeImportReqVO bean);
|
||||||
|
|
||||||
default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) {
|
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 BpmProcessDefinitionCreateReqDTO to);
|
||||||
|
|
||||||
void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to);
|
default void copyToCreateModel(Model model, BpmModelCreateReqVO bean) {
|
||||||
|
|
||||||
BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean);
|
|
||||||
|
|
||||||
default void copy(Model model, BpmModelCreateReqVO bean) {
|
|
||||||
model.setName(bean.getName());
|
model.setName(bean.getName());
|
||||||
model.setKey(bean.getKey());
|
model.setKey(bean.getKey());
|
||||||
model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null,
|
model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null,
|
||||||
null, null));
|
null, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
default void copy(Model model, BpmModelUpdateReqVO bean) {
|
default void copyToUpdateModel(Model model, BpmModelUpdateReqVO bean) {
|
||||||
model.setName(bean.getName());
|
model.setName(bean.getName());
|
||||||
model.setCategory(bean.getCategory());
|
model.setCategory(bean.getCategory());
|
||||||
model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class),
|
model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class),
|
||||||
@ -138,4 +145,5 @@ public interface BpmModelConvert {
|
|||||||
}
|
}
|
||||||
return JsonUtils.toJsonString(metaInfo);
|
return JsonUtils.toJsonString(metaInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.convert.definition;
|
package cn.iocoder.yudao.module.bpm.convert.definition;
|
||||||
|
|
||||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
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.collection.CollectionUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
|
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.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.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 cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
||||||
import org.flowable.common.engine.impl.db.SuspensionState;
|
import org.flowable.common.engine.impl.db.SuspensionState;
|
||||||
import org.flowable.engine.repository.Deployment;
|
import org.flowable.engine.repository.Deployment;
|
||||||
@ -14,7 +17,6 @@ import org.flowable.engine.repository.ProcessDefinition;
|
|||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mapping;
|
import org.mapstruct.Mapping;
|
||||||
import org.mapstruct.MappingTarget;
|
import org.mapstruct.MappingTarget;
|
||||||
import org.mapstruct.Named;
|
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -30,55 +32,46 @@ public interface BpmProcessDefinitionConvert {
|
|||||||
|
|
||||||
BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class);
|
BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class);
|
||||||
|
|
||||||
BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean);
|
|
||||||
|
|
||||||
BpmProcessDefinitionExtDO convert2(BpmProcessDefinitionCreateReqDTO bean);
|
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<BpmProcessDefinitionPageItemRespVO> convertList(List<ProcessDefinition> list, Map<String, Deployment> deploymentMap,
|
default List<BpmProcessDefinitionRespVO> buildProcessDefinitionList(List<ProcessDefinition> list,
|
||||||
Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap, Map<Long, BpmFormDO> formMap) {
|
Map<String, Deployment> deploymentMap,
|
||||||
|
Map<String, BpmProcessDefinitionInfoDO> processDefinitionInfoMap,
|
||||||
|
Map<Long, BpmFormDO> formMap,
|
||||||
|
Map<String, BpmCategoryDO> categoryMap) {
|
||||||
return CollectionUtils.convertList(list, definition -> {
|
return CollectionUtils.convertList(list, definition -> {
|
||||||
Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null;
|
BpmProcessDefinitionRespVO respVO = BeanUtils.toBean(definition, BpmProcessDefinitionRespVO.class);
|
||||||
BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId());
|
respVO.setSuspensionState(definition.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
|
||||||
BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null;
|
// Deployment
|
||||||
return convert(definition, deployment, definitionDO, form);
|
MapUtils.findAndThen(deploymentMap, definition.getDeploymentId(),
|
||||||
});
|
deployment -> respVO.setDeploymentTime(LocalDateTimeUtil.of(deployment.getDeploymentTime())));
|
||||||
}
|
// BpmProcessDefinitionInfoDO
|
||||||
|
BpmProcessDefinitionInfoDO processDefinitionInfo = MapUtil.get(processDefinitionInfoMap, definition.getId(), BpmProcessDefinitionInfoDO.class);
|
||||||
default List<BpmProcessDefinitionRespVO> convertList3(List<ProcessDefinition> list,
|
if (processDefinitionInfo != null) {
|
||||||
Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap) {
|
copyTo(processDefinitionInfo, respVO);
|
||||||
return CollectionUtils.convertList(list, processDefinition -> {
|
// Form
|
||||||
BpmProcessDefinitionRespVO respVO = convert3(processDefinition);
|
BpmFormDO form = MapUtil.get(formMap, processDefinitionInfo.getFormId(), BpmFormDO.class);
|
||||||
BpmProcessDefinitionExtDO processDefinitionExtDO = processDefinitionDOMap.get(processDefinition.getId());
|
|
||||||
// 复制通用属性
|
|
||||||
copyTo(processDefinitionExtDO, respVO);
|
|
||||||
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) {
|
if (form != null) {
|
||||||
respVO.setFormName(form.getName());
|
respVO.setFormName(form.getName());
|
||||||
}
|
}
|
||||||
// 复制通用属性
|
}
|
||||||
copyTo(processDefinitionExtDO, respVO);
|
// Category
|
||||||
|
MapUtils.findAndThen(categoryMap, definition.getCategory(), category -> respVO.setCategoryName(category.getName()));
|
||||||
return respVO;
|
return respVO;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BpmProcessDefinitionInfoDO convert2(BpmProcessDefinitionCreateReqDTO bean);
|
||||||
|
|
||||||
@Mapping(source = "from.id", target = "to.id", ignore = true)
|
@Mapping(source = "from.id", target = "to.id", ignore = true)
|
||||||
void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to);
|
void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.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.BpmProcessInstancePageItemRespVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
|
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.event.BpmProcessInstanceResultEvent;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
|
||||||
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
|
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
|
||||||
@ -38,6 +39,7 @@ public interface BpmProcessInstanceConvert {
|
|||||||
|
|
||||||
default PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<HistoricProcessInstance> pageResult,
|
default PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<HistoricProcessInstance> pageResult,
|
||||||
Map<String, ProcessDefinition> processDefinitionMap,
|
Map<String, ProcessDefinition> processDefinitionMap,
|
||||||
|
Map<String, BpmCategoryDO> categoryMap,
|
||||||
Map<String, List<Task>> taskMap) {
|
Map<String, List<Task>> taskMap) {
|
||||||
PageResult<BpmProcessInstancePageItemRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstancePageItemRespVO.class);
|
PageResult<BpmProcessInstancePageItemRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstancePageItemRespVO.class);
|
||||||
for (int i = 0; i < pageResult.getList().size(); i++) {
|
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));
|
respVO.setStatus((Integer) pageResult.getList().get(i).getProcessVariables().get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS));
|
||||||
MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
|
MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
|
||||||
processDefinition -> respVO.setCategory(processDefinition.getCategory()));
|
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));
|
respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstancePageItemRespVO.Task.class));
|
||||||
}
|
}
|
||||||
return vpPageResult;
|
return vpPageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance,
|
default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance,
|
||||||
ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt,
|
ProcessDefinition processDefinition, BpmProcessDefinitionInfoDO processDefinitionExt,
|
||||||
String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) {
|
String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) {
|
||||||
BpmProcessInstanceRespVO respVO = convert2(processInstance);
|
BpmProcessInstanceRespVO respVO = convert2(processInstance);
|
||||||
respVO.setStatus((Integer) processInstance.getProcessVariables().get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS));
|
respVO.setStatus((Integer) processInstance.getProcessVariables().get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS));
|
||||||
@ -75,7 +78,7 @@ public interface BpmProcessInstanceConvert {
|
|||||||
BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean);
|
BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean);
|
||||||
|
|
||||||
@Mapping(source = "from.id", target = "to.id", ignore = true)
|
@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);
|
BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -11,19 +11,19 @@ import lombok.*;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bpm 流程定义的拓展表
|
* Bpm 流程定义的拓信息
|
||||||
* 主要解决 Activiti {@link ProcessDefinition} 不支持拓展字段,所以新建拓展表
|
* 主要解决 Flowable {@link org.flowable.engine.repository.ProcessDefinition} 不支持拓展字段,所以新建该表
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@TableName(value = "bpm_process_definition_ext", autoResultMap = true)
|
@TableName(value = "bpm_process_definition_info", autoResultMap = true)
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class BpmProcessDefinitionExtDO extends BaseDO {
|
public class BpmProcessDefinitionInfoDO extends BaseDO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 编号
|
* 编号
|
||||||
@ -86,5 +86,4 @@ public class BpmProcessDefinitionExtDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private String formCustomViewPath;
|
private String formCustomViewPath;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -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 cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
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.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;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
@ -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);
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,16 +1,14 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.service.definition;
|
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.BpmFormCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
|
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.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
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 jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -74,9 +72,6 @@ public interface BpmFormService {
|
|||||||
* @return 动态表单 Map
|
* @return 动态表单 Map
|
||||||
*/
|
*/
|
||||||
default Map<Long, BpmFormDO> getFormMap(Collection<Long> ids) {
|
default Map<Long, BpmFormDO> getFormMap(Collection<Long> ids) {
|
||||||
if (CollUtil.isEmpty(ids)) {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId);
|
return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.service.definition;
|
package cn.iocoder.yudao.module.bpm.service.definition;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
@ -80,6 +81,9 @@ public class BpmFormServiceImpl implements BpmFormService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BpmFormDO> getFormList(Collection<Long> ids) {
|
public List<BpmFormDO> getFormList(Collection<Long> ids) {
|
||||||
|
if (CollUtil.isEmpty(ids)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
return formMapper.selectBatchIds(ids);
|
return formMapper.selectBatchIds(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +92,7 @@ public class BpmFormServiceImpl implements BpmFormService {
|
|||||||
return formMapper.selectPage(pageReqVO);
|
return formMapper.selectPage(pageReqVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @芋艿:这里没搞完!
|
||||||
@Override
|
@Override
|
||||||
public BpmFormDO checkFormConfig(String configStr) {
|
public BpmFormDO checkFormConfig(String configStr) {
|
||||||
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(configStr, BpmModelMetaInfoRespDTO.class);
|
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(configStr, BpmModelMetaInfoRespDTO.class);
|
||||||
|
@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
|
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import org.flowable.bpmn.model.BpmnModel;
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
|
import org.flowable.engine.repository.Model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flowable流程模型接口
|
* Flowable流程模型接口
|
||||||
@ -18,7 +19,7 @@ public interface BpmModelService {
|
|||||||
* @param pageVO 分页查询
|
* @param pageVO 分页查询
|
||||||
* @return 流程模型分页
|
* @return 流程模型分页
|
||||||
*/
|
*/
|
||||||
PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO);
|
PageResult<Model> getModelPage(BpmModelPageReqVO pageVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建流程模型
|
* 创建流程模型
|
||||||
@ -35,7 +36,15 @@ public interface BpmModelService {
|
|||||||
* @param id 编号
|
* @param id 编号
|
||||||
* @return 流程模型
|
* @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);
|
void updateModelState(String id, Integer state);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得流程模型编号对应的 BPMN Model
|
|
||||||
*
|
|
||||||
* @param id 流程模型编号
|
|
||||||
* @return BPMN Model
|
|
||||||
*/
|
|
||||||
BpmnModel getBpmnModel(String id);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得流程定义编号对应的 BPMN Model
|
* 获得流程定义编号对应的 BPMN Model
|
||||||
*
|
*
|
||||||
|
@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.bpm.service.definition;
|
|||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
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.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.convert.definition.BpmModelConvert;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
||||||
import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
|
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.bpmn.model.BpmnModel;
|
||||||
import org.flowable.common.engine.impl.db.SuspensionState;
|
import org.flowable.common.engine.impl.db.SuspensionState;
|
||||||
import org.flowable.engine.RepositoryService;
|
import org.flowable.engine.RepositoryService;
|
||||||
import org.flowable.engine.repository.Deployment;
|
|
||||||
import org.flowable.engine.repository.Model;
|
import org.flowable.engine.repository.Model;
|
||||||
import org.flowable.engine.repository.ModelQuery;
|
import org.flowable.engine.repository.ModelQuery;
|
||||||
import org.flowable.engine.repository.ProcessDefinition;
|
import org.flowable.engine.repository.ProcessDefinition;
|
||||||
@ -30,10 +29,10 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
import org.springframework.validation.annotation.Validated;
|
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.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
|
||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,7 +59,7 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
private BpmTaskCandidateInvoker taskCandidateInvoker;
|
private BpmTaskCandidateInvoker taskCandidateInvoker;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<BpmModelPageItemRespVO> getModelPage(BpmModelPageReqVO pageVO) {
|
public PageResult<Model> getModelPage(BpmModelPageReqVO pageVO) {
|
||||||
ModelQuery modelQuery = repositoryService.createModelQuery();
|
ModelQuery modelQuery = repositoryService.createModelQuery();
|
||||||
if (StrUtil.isNotBlank(pageVO.getKey())) {
|
if (StrUtil.isNotBlank(pageVO.getKey())) {
|
||||||
modelQuery.modelKey(pageVO.getKey());
|
modelQuery.modelKey(pageVO.getKey());
|
||||||
@ -72,34 +71,21 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
modelQuery.modelCategory(pageVO.getCategory());
|
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()
|
.orderByCreateTime().desc()
|
||||||
.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
|
.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
|
||||||
|
return new PageResult<>(models, count);
|
||||||
// 获得 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
|
public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
|
||||||
checkKeyNCName(createReqVO.getKey());
|
validateKeyNCName(createReqVO.getKey());
|
||||||
// 校验流程标识已经存在
|
// 校验流程标识已经存在
|
||||||
Model keyModel = getModelByKey(createReqVO.getKey());
|
Model keyModel = getModelByKey(createReqVO.getKey());
|
||||||
if (keyModel != null) {
|
if (keyModel != null) {
|
||||||
@ -108,7 +94,7 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
|
|
||||||
// 创建流程定义
|
// 创建流程定义
|
||||||
Model model = repositoryService.newModel();
|
Model model = repositoryService.newModel();
|
||||||
BpmModelConvert.INSTANCE.copy(model, createReqVO);
|
BpmModelConvert.INSTANCE.copyToCreateModel(model, createReqVO);
|
||||||
model.setTenantId(TenantContextHolder.getTenantIdStr());
|
model.setTenantId(TenantContextHolder.getTenantIdStr());
|
||||||
// 保存流程定义
|
// 保存流程定义
|
||||||
repositoryService.saveModel(model);
|
repositoryService.saveModel(model);
|
||||||
@ -117,34 +103,17 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
return model.getId();
|
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
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
|
@Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
|
||||||
public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) {
|
public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) {
|
||||||
// 校验流程模型存在
|
// 校验流程模型存在
|
||||||
Model model = repositoryService.getModel(updateReqVO.getId());
|
Model model = getModel(updateReqVO.getId());
|
||||||
if (model == null) {
|
if (model == null) {
|
||||||
throw exception(MODEL_NOT_EXISTS);
|
throw exception(MODEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改流程定义
|
// 修改流程定义
|
||||||
BpmModelConvert.INSTANCE.copy(model, updateReqVO);
|
BpmModelConvert.INSTANCE.copyToUpdateModel(model, updateReqVO);
|
||||||
// 更新模型
|
// 更新模型
|
||||||
repositoryService.saveModel(model);
|
repositoryService.saveModel(model);
|
||||||
// 更新 BPMN XML
|
// 更新 BPMN XML
|
||||||
@ -155,18 +124,18 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
@Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
|
@Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务
|
||||||
public void deployModel(String id) {
|
public void deployModel(String id) {
|
||||||
// 1.1 校验流程模型存在
|
// 1.1 校验流程模型存在
|
||||||
Model model = repositoryService.getModel(id);
|
Model model = getModel(id);
|
||||||
if (ObjectUtils.isEmpty(model)) {
|
if (ObjectUtils.isEmpty(model)) {
|
||||||
throw exception(MODEL_NOT_EXISTS);
|
throw exception(MODEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
// 1.2 校验流程图
|
// 1.2 校验流程图
|
||||||
// TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素;
|
// TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素;
|
||||||
byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId());
|
byte[] bpmnBytes = getModelBpmnXML(model.getId());
|
||||||
if (bpmnBytes == null) {
|
if (bpmnBytes == null) {
|
||||||
throw exception(MODEL_NOT_EXISTS);
|
throw exception(MODEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
// 1.3 校验表单已配
|
// 1.3 校验表单已配
|
||||||
BpmFormDO form = checkFormConfig(model.getMetaInfo());
|
BpmFormDO form = validateFormConfig(model.getMetaInfo());
|
||||||
// 1.4 校验任务分配规则已配置
|
// 1.4 校验任务分配规则已配置
|
||||||
taskCandidateInvoker.validateBpmnConfig(bpmnBytes);
|
taskCandidateInvoker.validateBpmnConfig(bpmnBytes);
|
||||||
|
|
||||||
@ -194,7 +163,7 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void deleteModel(String id) {
|
public void deleteModel(String id) {
|
||||||
// 校验流程模型存在
|
// 校验流程模型存在
|
||||||
Model model = repositoryService.getModel(id);
|
Model model = getModel(id);
|
||||||
if (model == null) {
|
if (model == null) {
|
||||||
throw exception(MODEL_NOT_EXISTS);
|
throw exception(MODEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
@ -206,33 +175,27 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateModelState(String id, Integer state) {
|
public void updateModelState(String id, Integer state) {
|
||||||
// 校验流程模型存在
|
// 1.1 校验流程模型存在
|
||||||
Model model = repositoryService.getModel(id);
|
Model model = getModel(id);
|
||||||
if (model == null) {
|
if (model == null) {
|
||||||
throw exception(MODEL_NOT_EXISTS);
|
throw exception(MODEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
// 校验流程定义存在
|
// 1.2 校验流程定义存在
|
||||||
ProcessDefinition definition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
|
ProcessDefinition definition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId());
|
||||||
if (definition == null) {
|
if (definition == null) {
|
||||||
throw exception(PROCESS_DEFINITION_NOT_EXISTS);
|
throw exception(PROCESS_DEFINITION_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新状态
|
// 2. 更新状态
|
||||||
processDefinitionService.updateProcessDefinitionState(definition.getId(), state);
|
processDefinitionService.updateProcessDefinitionState(definition.getId(), state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BpmnModel getBpmnModel(String id) {
|
|
||||||
byte[] bpmnBytes = repositoryService.getModelEditorSource(id);
|
|
||||||
return BpmnModelUtils.getBpmnModel(bpmnBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BpmnModel getBpmnModelByDefinitionId(String processDefinitionId) {
|
public BpmnModel getBpmnModelByDefinitionId(String processDefinitionId) {
|
||||||
return repositoryService.getBpmnModel(processDefinitionId);
|
return repositoryService.getBpmnModel(processDefinitionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkKeyNCName(String key) {
|
private void validateKeyNCName(String key) {
|
||||||
if (!ValidationUtils.isXmlNCName(key)) {
|
if (!ValidationUtils.isXmlNCName(key)) {
|
||||||
throw exception(MODEL_KEY_VALID);
|
throw exception(MODEL_KEY_VALID);
|
||||||
}
|
}
|
||||||
@ -244,7 +207,7 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
* @param metaInfoStr 流程模型 metaInfo 字段
|
* @param metaInfoStr 流程模型 metaInfo 字段
|
||||||
* @return 流程表单
|
* @return 流程表单
|
||||||
*/
|
*/
|
||||||
private BpmFormDO checkFormConfig(String metaInfoStr) {
|
private BpmFormDO validateFormConfig(String metaInfoStr) {
|
||||||
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(metaInfoStr, BpmModelMetaInfoRespDTO.class);
|
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(metaInfoStr, BpmModelMetaInfoRespDTO.class);
|
||||||
if (metaInfo == null || metaInfo.getFormType() == null) {
|
if (metaInfo == null || metaInfo.getFormType() == null) {
|
||||||
throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG);
|
throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG);
|
||||||
@ -282,4 +245,18 @@ public class BpmModelServiceImpl implements BpmModelService {
|
|||||||
processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode());
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,14 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.service.definition;
|
package cn.iocoder.yudao.module.bpm.service.definition;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.BpmProcessDefinitionPageReqVO;
|
||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import org.flowable.bpmn.model.BpmnModel;
|
|
||||||
import org.flowable.engine.repository.Deployment;
|
import org.flowable.engine.repository.Deployment;
|
||||||
import org.flowable.engine.repository.ProcessDefinition;
|
import org.flowable.engine.repository.ProcessDefinition;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -33,15 +30,15 @@ public interface BpmProcessDefinitionService {
|
|||||||
* @param pageReqVO 分页入参
|
* @param pageReqVO 分页入参
|
||||||
* @return 流程定义 Page
|
* @return 流程定义 Page
|
||||||
*/
|
*/
|
||||||
PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO);
|
PageResult<ProcessDefinition> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得流程定义列表
|
* 获得流程定义列表
|
||||||
*
|
*
|
||||||
* @param listReqVO 列表入参
|
* @param suspensionState 中断状态
|
||||||
* @return 流程定义列表
|
* @return 流程定义列表
|
||||||
*/
|
*/
|
||||||
List<BpmProcessDefinitionRespVO> getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO);
|
List<ProcessDefinition> getProcessDefinitionListBySuspensionState(Integer suspensionState);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建流程定义
|
* 创建流程定义
|
||||||
@ -68,20 +65,24 @@ public interface BpmProcessDefinitionService {
|
|||||||
String getProcessDefinitionBpmnXML(String id);
|
String getProcessDefinitionBpmnXML(String id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得需要创建的流程定义,是否和当前激活的流程定义相等
|
* 获得流程定义的信息
|
||||||
*
|
*
|
||||||
* @param createReqDTO 创建信息
|
* @param id 流程定义编号
|
||||||
* @return 是否相等
|
* @return 流程定义信息
|
||||||
*/
|
*/
|
||||||
boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO);
|
BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得编号对应的 BpmProcessDefinitionExtDO
|
* 获得流程定义的信息 List
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param ids 流程定义编号数组
|
||||||
* @return 流程定义拓展
|
* @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
|
* 获得编号对应的 ProcessDefinition
|
||||||
@ -153,11 +154,4 @@ public interface BpmProcessDefinitionService {
|
|||||||
*/
|
*/
|
||||||
Deployment getDeployment(String id);
|
Deployment getDeployment(String id);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得 Bpmn 模型
|
|
||||||
*
|
|
||||||
* @param processDefinitionId 流程定义的编号
|
|
||||||
* @return Bpmn 模型
|
|
||||||
*/
|
|
||||||
BpmnModel getBpmnModel(String processDefinitionId);
|
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,15 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.service.definition;
|
package cn.iocoder.yudao.module.bpm.service.definition;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
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.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.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.convert.definition.BpmProcessDefinitionConvert;
|
||||||
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.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionInfoMapper;
|
||||||
import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
@ -33,7 +27,7 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
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_KEY_NOT_MATCH;
|
||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
|
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH;
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
@ -55,10 +49,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|||||||
private RepositoryService repositoryService;
|
private RepositoryService repositoryService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private BpmProcessDefinitionExtMapper processDefinitionMapper;
|
private BpmProcessDefinitionInfoMapper processDefinitionMapper;
|
||||||
|
|
||||||
@Resource
|
|
||||||
private BpmFormService formService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProcessDefinition getProcessDefinition(String id) {
|
public ProcessDefinition getProcessDefinition(String id) {
|
||||||
@ -111,11 +102,6 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|||||||
return repositoryService.createDeploymentQuery().deploymentId(id).singleResult();
|
return repositoryService.createDeploymentQuery().deploymentId(id).singleResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BpmnModel getBpmnModel(String processDefinitionId) {
|
|
||||||
return repositoryService.getBpmnModel(processDefinitionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
||||||
// 创建 Deployment 部署
|
// 创建 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());
|
.setProcessDefinitionId(definition.getId());
|
||||||
processDefinitionMapper.insert(definitionDO);
|
processDefinitionMapper.insert(definitionDO);
|
||||||
return definition.getId();
|
return definition.getId();
|
||||||
@ -175,101 +161,43 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
public BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id) {
|
||||||
// 校验 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) {
|
|
||||||
return processDefinitionMapper.selectByProcessDefinitionId(id);
|
return processDefinitionMapper.selectByProcessDefinitionId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BpmProcessDefinitionRespVO> getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO) {
|
public List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoList(Collection<String> ids) {
|
||||||
// 拼接查询条件
|
return processDefinitionMapper.selectListByProcessDefinitionIds(ids);
|
||||||
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();
|
|
||||||
}
|
|
||||||
// 执行查询
|
|
||||||
definitionQuery.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
|
|
||||||
List<ProcessDefinition> processDefinitions = definitionQuery.list();
|
|
||||||
if (CollUtil.isEmpty(processDefinitions)) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获得 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<BpmProcessDefinitionPageItemRespVO> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
|
public PageResult<ProcessDefinition> getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) {
|
||||||
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
|
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
|
||||||
if (StrUtil.isNotBlank(pageVO.getKey())) {
|
if (StrUtil.isNotBlank(pageVO.getKey())) {
|
||||||
definitionQuery.processDefinitionKey(pageVO.getKey());
|
query.processDefinitionKey(pageVO.getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行查询
|
// 执行查询
|
||||||
List<ProcessDefinition> processDefinitions = definitionQuery.orderByProcessDefinitionVersion().desc()
|
long count = query.count();
|
||||||
.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
|
if (count == 0) {
|
||||||
|
return PageResult.empty(count);
|
||||||
if (CollUtil.isEmpty(processDefinitions)) {
|
}
|
||||||
return new PageResult<>(emptyList(), definitionQuery.count());
|
List<ProcessDefinition> list = query.orderByProcessDefinitionVersion().desc()
|
||||||
|
.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
|
||||||
|
return new PageResult<>(list, count);
|
||||||
}
|
}
|
||||||
// 获得 Deployment Map
|
|
||||||
Set<String> deploymentIds = new HashSet<>();
|
|
||||||
processDefinitions.forEach(definition -> addIfNotNull(deploymentIds, definition.getDeploymentId()));
|
|
||||||
Map<String, Deployment> deploymentMap = getDeploymentMap(deploymentIds);
|
|
||||||
|
|
||||||
// 获得 BpmProcessDefinitionDO Map
|
@Override
|
||||||
List<BpmProcessDefinitionExtDO> processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds(
|
public List<ProcessDefinition> getProcessDefinitionListBySuspensionState(Integer suspensionState) {
|
||||||
convertList(processDefinitions, ProcessDefinition::getId));
|
// 拼接查询条件
|
||||||
Map<String, BpmProcessDefinitionExtDO> processDefinitionDOMap = convertMap(processDefinitionDOs,
|
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
|
||||||
BpmProcessDefinitionExtDO::getProcessDefinitionId);
|
if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), suspensionState)) {
|
||||||
|
query.suspended();
|
||||||
// 获得 Form Map
|
} else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), suspensionState)) {
|
||||||
Set<Long> formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId);
|
query.active();
|
||||||
Map<Long, BpmFormDO> formMap = formService.getFormMap(formIds);
|
}
|
||||||
|
// 执行查询
|
||||||
// 拼接结果
|
query.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
|
||||||
long definitionCount = definitionQuery.count();
|
return query.list();
|
||||||
return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap,
|
|
||||||
processDefinitionDOMap, formMap), definitionCount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,6 @@ public class BpmProcessDefinitionCreateReqDTO {
|
|||||||
private String description;
|
private String description;
|
||||||
/**
|
/**
|
||||||
* 流程分类
|
* 流程分类
|
||||||
* 参见 bpm_model_category 数据字典
|
|
||||||
*/
|
*/
|
||||||
@NotEmpty(message = "流程分类不能为空")
|
@NotEmpty(message = "流程分类不能为空")
|
||||||
private String category;
|
private String category;
|
||||||
|
@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.bpm.service.task;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.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;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.bpm.service.task;
|
|||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.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.dal.mysql.cc.BpmProcessInstanceCopyMapper;
|
import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceCopyMapper;
|
||||||
import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
|
import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
|
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
File diff suppressed because one or more lines are too long
@ -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>
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user