package com.iailab.module.bpm.controller.admin.definition; import cn.hutool.core.collection.CollUtil; import com.iailab.framework.common.pojo.CommonResult; import com.iailab.module.bpm.controller.admin.definition.vo.model.*; import com.iailab.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import com.iailab.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelUpdateReqVO; import com.iailab.module.bpm.convert.definition.BpmModelConvert; import com.iailab.module.bpm.dal.dataobject.definition.BpmCategoryDO; import com.iailab.module.bpm.dal.dataobject.definition.BpmFormDO; import com.iailab.module.bpm.service.definition.BpmCategoryService; import com.iailab.module.bpm.service.definition.BpmFormService; import com.iailab.module.bpm.service.definition.BpmModelService; import com.iailab.module.bpm.service.definition.BpmProcessDefinitionService; import com.iailab.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; import com.iailab.module.system.api.user.AdminUserApi; import com.iailab.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ProcessDefinition; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.*; import java.util.stream.Stream; import static com.iailab.framework.common.pojo.CommonResult.success; import static com.iailab.framework.common.util.collection.CollectionUtils.*; import static com.iailab.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 流程模型") @RestController @RequestMapping("/bpm/model") @Validated public class BpmModelController { @Resource private BpmModelService modelService; @Resource private BpmFormService formService; @Resource private BpmCategoryService categoryService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private AdminUserApi adminUserApi; @GetMapping("/list") @Operation(summary = "获得模型分页") @Parameter(name = "name", description = "模型名称", example = "芋艿") public CommonResult> getModelPage(@RequestParam(value = "name", required = false) String name) { List list = modelService.getModelList(name); if (CollUtil.isEmpty(list)) { return success(Collections.emptyList()); } // 获得 Form 表单 Set formIds = convertSet(list, model -> { BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); return metaInfo != null ? metaInfo.getFormId() : null; }); Map formMap = formService.getFormMap(formIds); // 获得 Category Map Map categoryMap = categoryService.getCategoryMap( convertSet(list, Model::getCategory)); // 获得 Deployment Map Map deploymentMap = processDefinitionService.getDeploymentMap( convertSet(list, Model::getDeploymentId)); // 获得 ProcessDefinition Map List processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds( deploymentMap.keySet()); Map processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId); // 获得 User Map Set userIds = convertSetByFlatMap(list, model -> { BpmModelMetaInfoVO metaInfo = BpmModelConvert.INSTANCE.parseMetaInfo(model); return metaInfo != null ? metaInfo.getStartUserIds().stream() : Stream.empty(); }); Map userMap = adminUserApi.getUserMap(userIds); return success(BpmModelConvert.INSTANCE.buildModelList(list, formMap, categoryMap, deploymentMap, processDefinitionMap, userMap)); } @GetMapping("/get") @Operation(summary = "获得模型") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('bpm:model:query')") public CommonResult getModel(@RequestParam("id") String id) { Model model = modelService.getModel(id); if (model == null) { return null; } byte[] bpmnBytes = modelService.getModelBpmnXML(id); return success(BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes)); } @PostMapping("/create") @Operation(summary = "新建模型") @PreAuthorize("@ss.hasPermission('bpm:model:create')") public CommonResult createModel(@Valid @RequestBody BpmModelSaveReqVO createRetVO) { return success(modelService.createModel(createRetVO)); } @PutMapping("/update") @Operation(summary = "修改模型") @PreAuthorize("@ss.hasPermission('bpm:model:update')") public CommonResult updateModel(@Valid @RequestBody BpmModelSaveReqVO modelVO) { modelService.updateModel(getLoginUserId(), modelVO); return success(true); } @PutMapping("/update-sort-batch") @Operation(summary = "批量修改模型排序") @Parameter(name = "ids", description = "编号数组", required = true, example = "1,2,3") public CommonResult updateModelSortBatch(@RequestParam("ids") List ids) { modelService.updateModelSortBatch(getLoginUserId(), ids); return success(true); } @PostMapping("/deploy") @Operation(summary = "部署模型") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('bpm:model:deploy')") public CommonResult deployModel(@RequestParam("id") String id) { modelService.deployModel(getLoginUserId(), id); return success(true); } @PutMapping("/update-state") @Operation(summary = "修改模型的状态", description = "实际更新的部署的流程定义的状态") @PreAuthorize("@ss.hasPermission('bpm:model:update')") public CommonResult updateModelState(@Valid @RequestBody BpmModelUpdateStateReqVO reqVO) { modelService.updateModelState(getLoginUserId(), reqVO.getId(), reqVO.getState()); return success(true); } @PutMapping("/update-bpmn") @Operation(summary = "修改模型的 BPMN") @PreAuthorize("@ss.hasPermission('bpm:model:update')") public CommonResult updateModelBpmn(@Valid @RequestBody BpmModeUpdateBpmnReqVO reqVO) { modelService.updateModelBpmnXml(reqVO.getId(), reqVO.getBpmnXml()); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除模型") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('bpm:model:delete')") public CommonResult deleteModel(@RequestParam("id") String id) { modelService.deleteModel(getLoginUserId(), id); return success(true); } // ========== 仿钉钉/飞书的精简模型 ========= @GetMapping("/simple/get") @Operation(summary = "获得仿钉钉流程设计模型") @Parameter(name = "modelId", description = "流程模型编号", required = true, example = "a2c5eee0-eb6c-11ee-abf4-0c37967c420a") public CommonResult getSimpleModel(@RequestParam("id") String modelId){ return success(modelService.getSimpleModel(modelId)); } @PostMapping("/simple/update") @Operation(summary = "保存仿钉钉流程设计模型") @PreAuthorize("@ss.hasPermission('bpm:model:update')") public CommonResult updateSimpleModel(@Valid @RequestBody BpmSimpleModelUpdateReqVO reqVO) { modelService.updateSimpleModel(getLoginUserId(), reqVO); return success(Boolean.TRUE); } }