From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master
---
jnpf-flowable/jnpf-flowable-controller/src/main/java/jnpf/flowable/controller/OperatorController.java | 556 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 556 insertions(+), 0 deletions(-)
diff --git a/jnpf-flowable/jnpf-flowable-controller/src/main/java/jnpf/flowable/controller/OperatorController.java b/jnpf-flowable/jnpf-flowable-controller/src/main/java/jnpf/flowable/controller/OperatorController.java
new file mode 100644
index 0000000..d015f76
--- /dev/null
+++ b/jnpf-flowable/jnpf-flowable-controller/src/main/java/jnpf/flowable/controller/OperatorController.java
@@ -0,0 +1,556 @@
+package jnpf.flowable.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.google.common.collect.ImmutableList;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jnpf.base.ActionResult;
+import jnpf.base.Pagination;
+import jnpf.base.controller.SuperController;
+import jnpf.base.vo.ListVO;
+import jnpf.base.vo.PageListVO;
+import jnpf.base.vo.PaginationVO;
+import jnpf.constant.MsgCode;
+import jnpf.exception.WorkFlowException;
+import jnpf.flowable.entity.CirculateEntity;
+import jnpf.flowable.entity.OperatorEntity;
+import jnpf.flowable.entity.RecordEntity;
+import jnpf.flowable.entity.TaskEntity;
+import jnpf.flowable.enums.*;
+import jnpf.flowable.model.candidates.CandidateCheckFo;
+import jnpf.flowable.model.candidates.CandidateCheckVo;
+import jnpf.flowable.model.candidates.CandidateUserVo;
+import jnpf.flowable.model.operator.FlowBatchModel;
+import jnpf.flowable.model.operator.OperatorVo;
+import jnpf.flowable.model.task.AuditModel;
+import jnpf.flowable.model.task.FlowModel;
+import jnpf.flowable.model.task.TaskPagination;
+import jnpf.flowable.model.templatenode.BackNodeModel;
+import jnpf.flowable.model.util.FlowNature;
+import jnpf.flowable.service.CirculateService;
+import jnpf.flowable.service.OperatorService;
+import jnpf.flowable.service.RecordService;
+import jnpf.flowable.service.TaskService;
+import jnpf.flowable.util.*;
+import jnpf.permission.entity.UserEntity;
+import jnpf.util.JsonUtil;
+import jnpf.util.context.RequestContext;
+import jnpf.util.UserProvider;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 绫荤殑鎻忚堪
+ *
+ * @author JNPF@YinMai Info. Co., Ltd
+ * @version 5.0.x
+ * @since 2024/4/25 14:48
+ */
+@Tag(name = "缁忓姙", description = "OperatorController")
+@RestController
+@RequestMapping("/operator")
+@RequiredArgsConstructor
+public class OperatorController extends SuperController<OperatorService, OperatorEntity> {
+
+
+ private final RedisLock redisLock;
+
+ private final ServiceUtil serviceUtil;
+
+ private final OperatorUtil operatorUtil;
+
+ private final TaskService taskService;
+
+ private final RecordService recordService;
+
+ private final OperatorService operatorService;
+
+ private final CirculateService circulateService;
+
+ /**
+ * 鍒ゆ柇鍊欓�変汉
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param fo 鍙傛暟绫�
+ */
+ @Operation(summary = "鍒ゆ柇鍊欓�変汉")
+ @PostMapping("/CandidateNode/{id}")
+ public ActionResult<Object> candidates(@PathVariable("id") String id, @RequestBody CandidateCheckFo fo) throws WorkFlowException {
+ OperatorEntity info = !ObjectUtil.equals(id, FlowNature.PARENT_ID) ? operatorService.getInfo(id) : null;
+ if (info != null) {
+ operatorUtil.checkOperatorPermission(id);
+ }
+ return ActionResult.success(taskService.checkCandidates(id, fo));
+ }
+
+ /**
+ * 鑾峰彇鍊欓�変汉
+ *
+ * @param fo 鍙傛暟绫�
+ */
+ @Operation(summary = "鑾峰彇鍊欓�変汉")
+ @PostMapping("/CandidateUser/{id}")
+ public ActionResult<PageListVO<CandidateUserVo>> candidateUser(@PathVariable("id") String id, @RequestBody CandidateCheckFo fo) throws WorkFlowException {
+ OperatorEntity info = !ObjectUtil.equals(id, FlowNature.PARENT_ID) ? operatorService.getInfo(id) : null;
+ if (info != null) {
+ operatorUtil.checkOperatorPermission(id);
+ }
+ List<CandidateUserVo> candidates = taskService.getCandidateUser(id, fo);
+ PaginationVO paginationVO = JsonUtil.getJsonToBean(fo, PaginationVO.class);
+ return ActionResult.page(candidates, paginationVO);
+ }
+
+ /**
+ * 鍒楄〃
+ *
+ * @param category 鍒楄〃鏍囪瘑
+ * @param pagination 鍙傛暟
+ */
+ @Operation(summary = "鍒楄〃")
+ @GetMapping("/List/{category}")
+ public ActionResult<PageListVO<OperatorVo>> list(@PathVariable("category") String category, TaskPagination pagination) {
+ List<OperatorVo> list = new ArrayList<>();
+ CategoryEnum categoryEnum = CategoryEnum.getType(category);
+ pagination.setCategory(categoryEnum.getType());
+ pagination.setDelegateType(true);
+ pagination.setSystemId(serviceUtil.getSystemCodeById(RequestContext.getAppCode()));
+ switch (categoryEnum) {
+ case SIGN: // 寰呯
+ case TODO: // 寰呭姙
+ case DOING: // 鍦ㄥ姙
+ case BATCH_DOING: // 鎵归噺鍦ㄥ姙
+ list = operatorService.getList(pagination);
+ break;
+ case DONE: // 宸插姙
+ list = recordService.getList(pagination);
+ break;
+ case CIRCULATE: // 鎶勯��
+ list = circulateService.getList(pagination);
+ break;
+ default:
+ break;
+ }
+ List<OperatorVo> vos = new ArrayList<>();
+ List<UserEntity> userList = serviceUtil.getUserName(list.stream().map(OperatorVo::getCreatorUserId).collect(Collectors.toList()));
+ for (OperatorVo operatorVo : list) {
+ OperatorVo vo = JsonUtil.getJsonToBean(operatorVo, OperatorVo.class);
+ UserEntity userEntity = userList.stream().filter(t -> t.getId().equals(vo.getCreatorUserId())).findFirst().orElse(null);
+ vo.setCreatorUser(userEntity != null ? userEntity.getRealName() + "/" + userEntity.getAccount() : "");
+ if (ObjectUtil.equals(operatorVo.getIsProcessing(), FlowNature.PROCESSING) && ObjectUtil.equals(operatorVo.getStatus(), OperatorStateEnum.TRANSFER.getCode())) {
+ vo.setStatus(OperatorStateEnum.TRANSFER_PROCESSING.getCode());
+ }
+ vos.add(vo);
+ }
+ PaginationVO paginationVO = JsonUtil.getJsonToBean(pagination, PaginationVO.class);
+ return ActionResult.page(vos, paginationVO);
+ }
+
+ /**
+ * 绛炬敹鎴栭��绛�
+ *
+ * @param flowModel 鍙傛暟绫伙紝ids 涓婚敭闆嗗悎銆乼ype 0 绛炬敹 1 閫�绛�
+ */
+ @Operation(summary = "绛炬敹鎴栭��绛�")
+ @PostMapping("/Sign")
+ public ActionResult<String> sign(@RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorService.sign(flowModel);
+ return ActionResult.success(MsgCode.SU005.get());
+ }
+
+ /**
+ * 寮�濮嬪姙鐞�
+ *
+ * @param flowModel 鍙傛暟绫伙紝ids 涓婚敭闆嗗悎
+ */
+ @Operation(summary = "寮�濮嬪姙鐞�")
+ @PostMapping("/Transact")
+ public ActionResult<String> startHandle(@RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorService.startHandle(flowModel);
+ return ActionResult.success(MsgCode.SU005.get());
+ }
+
+ /**
+ * 淇濆瓨鑽夌
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "淇濆瓨鑽夌")
+ @PostMapping("/SaveAudit/{id}")
+ public ActionResult<String> saveAudit(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorUtil.checkOperatorPermission(id);
+ operatorService.saveAudit(id, flowModel);
+ return ActionResult.success(MsgCode.SU002.get());
+ }
+
+ /**
+ * 鍚屾剰鎷掔粷
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鍚屾剰鎷掔粷")
+ @PostMapping("/Audit/{id}")
+ public ActionResult<Object> audit(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ OperatorEntity operator = operatorUtil.checkOperator(id);
+ TaskEntity taskEntity = taskService.getInfo(operator.getTaskId());
+ if (null == taskEntity) {
+ throw new WorkFlowException(MsgCode.FA001.get());
+ }
+ operatorUtil.checkOperatorPermission(id);
+ boolean lock = redisLock.lock(taskEntity.getId() + operator.getNodeId(), operator.getId(), 5, TimeUnit.SECONDS);
+ if (!lock) {
+ throw new WorkFlowException("褰撳墠鑺傜偣姝e湪瀹℃壒涓紝璇风◢鍚庡啀璇�");
+ }
+ Integer handleStatus = flowModel.getHandleStatus();
+ try {
+ operatorService.auditWithCheck(id, flowModel);
+ } catch (Exception e) {
+ operatorUtil.compensate(taskEntity);
+ throw e;
+ } finally {
+ redisLock.unlock(taskEntity.getId() + operator.getNodeId(), operator.getId());
+ }
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent();
+ taskEntity = flowModel.getTaskEntity();
+ if (taskEntity.getRejectDataId() == null) {
+ operatorUtil.autoAudit(flowModel);
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent();
+ }
+ operatorUtil.launchTrigger(flowModel);
+ operatorUtil.handleTaskStatus();
+ TaskEntity task = taskService.getById(taskEntity.getId());
+ taskEntity = task == null ? taskEntity : task;
+ AuditModel model = operatorUtil.getAuditModel(taskEntity.getId(), flowModel, operator);
+ String msg = Objects.equals(handleStatus, FlowNature.REJECT_COMPLETION) ? MsgCode.WF065.get() : MsgCode.WF066.get();
+ if (ObjectUtil.equals(operator.getIsProcessing(), FlowNature.PROCESSING)) {
+ msg = MsgCode.WF148.get();
+ }
+ return ActionResult.success(msg, model);
+ }
+
+ /**
+ * 鍔犵
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鍔犵")
+ @PostMapping("/AddSign/{id}")
+ public ActionResult<String> freeApprover(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorUtil.checkOperatorPermission(id);
+ operatorService.addSign(id, flowModel);
+ operatorUtil.autoAudit(flowModel);
+ operatorUtil.launchTrigger(flowModel);
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent();
+ return ActionResult.success(MsgCode.WF004.get());
+ }
+
+
+ /**
+ * 鑾峰彇鍔犵鐨勪汉
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param pagination 鍙傛暟
+ */
+ @Operation(summary = "鑾峰彇鍔犵鐨勪汉")
+ @PostMapping("/AddSignUserIdList/{id}")
+ public ActionResult<PageListVO<CandidateUserVo>> getAddSignUserIdList(@PathVariable("id") String id, @RequestBody Pagination pagination) throws WorkFlowException {
+ List<CandidateUserVo> reduceList = operatorService.getReduceList(id, pagination);
+ PaginationVO paginationVO = JsonUtil.getJsonToBean(pagination, PaginationVO.class);
+ return ActionResult.page(reduceList, paginationVO);
+ }
+
+ /**
+ * 鍑忕
+ *
+ * @param flowModel 鍙傛暟
+ * @param id 璁板綍涓婚敭
+ */
+ @Operation(summary = "鍑忕")
+ @PostMapping("/ReduceApprover/{id}")
+ public ActionResult<String> reduceApprover(@RequestBody FlowModel flowModel, @PathVariable("id") String id) throws WorkFlowException {
+ RecordEntity recordEntity = recordService.getInfo(id);
+ if (null == recordEntity) {
+ throw new WorkFlowException(MsgCode.FA001.get());
+ }
+ if (!Objects.equals(recordEntity.getHandleId(), UserProvider.getLoginUserId())) {
+ throw new WorkFlowException(MsgCode.AD104.get());
+ }
+ operatorService.reduce(id, flowModel);
+ return ActionResult.success(MsgCode.WF069.get());
+ }
+
+ /**
+ * 鑾峰彇閫�鍥炵殑鑺傜偣
+ *
+ * @param id 缁忓姙涓婚敭
+ */
+ @Operation(summary = "鑾峰彇閫�鍥炵殑鑺傜偣")
+ @GetMapping("/SendBackNodeList/{id}")
+ public ActionResult<Object> getFallbacks(@PathVariable("id") String id) throws WorkFlowException {
+ ListVO<BackNodeModel> vo = new ListVO<>();
+ vo.setList(operatorService.getFallbacks(id));
+ return ActionResult.success(vo);
+ }
+
+ /**
+ * 閫�鍥�
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "閫�鍥�")
+ @PostMapping("/SendBack/{id}")
+ public ActionResult<String> reject(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ OperatorEntity operator = operatorUtil.checkOperator(id);
+ TaskEntity taskEntity = taskService.getInfo(operator.getTaskId());
+ if (null == taskEntity) {
+ throw new WorkFlowException(MsgCode.FA001.get());
+ }
+ operatorUtil.checkOperatorPermission(id);
+ try {
+ operatorService.back(id, flowModel);
+ } catch (Exception e) {
+ operatorUtil.compensate(taskEntity);
+ throw e;
+ }
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent();
+ return ActionResult.success(MsgCode.WF002.get());
+ }
+
+ /**
+ * 鎾ゅ洖
+ *
+ * @param id 璁板綍涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鎾ゅ洖")
+ @PostMapping("/Recall/{taskRecordId}")
+ public ActionResult<String> recall(@PathVariable("taskRecordId") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ RecordEntity recordEntity = recordService.getInfo(id);
+ if (null == recordEntity) {
+ throw new WorkFlowException(MsgCode.FA001.get());
+ }
+ if (recordEntity.getStatus().equals(FlowNature.INVALID)) {
+ throw new WorkFlowException(MsgCode.WF005.get());
+ }
+ OperatorEntity operator = operatorService.getInfo(recordEntity.getOperatorId());
+ if (null == operator) {
+ throw new WorkFlowException(MsgCode.FA001.get());
+ }
+ TaskEntity taskEntity = taskService.getInfo(operator.getTaskId());
+ if (null == taskEntity) {
+ throw new WorkFlowException(MsgCode.FA001.get());
+ }
+ flowModel.setRecordEntity(recordEntity);
+ flowModel.setOperatorEntity(operator);
+ try {
+ operatorService.recall(id, flowModel);
+ } catch (Exception e) {
+ operatorUtil.compensate(taskEntity);
+ throw e;
+ }
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent(flowModel, EventEnum.RECALL.getStatus());
+ return ActionResult.success(MsgCode.WF008.get());
+ }
+
+ /**
+ * 杞
+ *
+ * @param id 缁忓姙涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "杞")
+ @PostMapping("/Transfer/{id}")
+ public ActionResult<String> transfer(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorUtil.checkOperatorPermission(id);
+ operatorService.transfer(id, flowModel);
+ operatorUtil.autoAudit(flowModel);
+ operatorUtil.launchTrigger(flowModel);
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent();
+ OperatorEntity operator = operatorService.getById(id);
+ return ActionResult.success(ObjectUtil.equals(operator.getIsProcessing(), FlowNature.PROCESSING) ? MsgCode.WF003.get() : MsgCode.WF152.get());
+ }
+
+ /**
+ * 鍗忓姙
+ *
+ * @param id 涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鍗忓姙")
+ @PostMapping("/Assist/{id}")
+ public ActionResult<String> assist(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorUtil.checkOperatorPermission(id);
+ operatorService.assist(id, flowModel);
+ return ActionResult.success(MsgCode.WF067.get());
+ }
+
+ /**
+ * 鍗忓姙淇濆瓨
+ *
+ * @param id 涓婚敭
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鍗忓姙淇濆瓨")
+ @PostMapping("/AssistSave/{id}")
+ public ActionResult<String> assistSave(@PathVariable("id") String id, @RequestBody FlowModel flowModel) throws WorkFlowException {
+ operatorUtil.checkOperatorPermission(id);
+ operatorService.assistSave(id, flowModel);
+ return ActionResult.success(MsgCode.WF068.get());
+ }
+
+ /**
+ * 鎵归噺瀹℃壒娴佺▼鍒嗙被鍒楄〃
+ */
+ @Operation(summary = "鎵归噺瀹℃壒娴佺▼鍒嗙被鍒楄〃")
+ @GetMapping("/BatchFlowSelector")
+ public ActionResult<List<FlowBatchModel>> batchFlowSelector() {
+ List<FlowBatchModel> list = operatorService.batchFlowSelector();
+ return ActionResult.success(list);
+ }
+
+ /**
+ * 鎵归噺瀹℃壒娴佺▼鐗堟湰鍒楄〃
+ *
+ * @param templateId 娴佺▼瀹氫箟涓婚敭
+ */
+ @Operation(summary = "鎵归噺瀹℃壒娴佺▼鐗堟湰鍒楄〃")
+ @GetMapping("/BatchVersionSelector/{templateId}")
+ public ActionResult<List<FlowBatchModel>> batchVersionSelector(@PathVariable("templateId") String templateId) {
+ List<FlowBatchModel> list = operatorService.batchVersionSelector(templateId);
+ return ActionResult.success(list);
+ }
+
+ /**
+ * 鎵归噺瀹℃壒鑺傜偣鍒楄〃
+ *
+ * @param flowId 瀹氫箟鐗堟湰涓婚敭
+ */
+ @Operation(summary = "鎵归噺瀹℃壒鑺傜偣鍒楄〃")
+ @GetMapping("/BatchNodeSelector/{flowId}")
+ public ActionResult<List<FlowBatchModel>> batchNodeSelector(@PathVariable("flowId") String flowId) {
+ List<FlowBatchModel> list = operatorService.batchNodeSelector(flowId);
+ return ActionResult.success(list);
+ }
+
+ /**
+ * 鎵归噺瀹℃壒鑺傜偣灞炴��
+ *
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鎵归噺瀹℃壒鑺傜偣灞炴��")
+ @GetMapping("/BatchNode")
+ public ActionResult<Object> batchNode(FlowModel flowModel) throws WorkFlowException {
+ Map<String, Object> nodeMap = operatorService.batchNode(flowModel);
+ return ActionResult.success(nodeMap);
+ }
+
+ /**
+ * 鎵归噺鑾峰彇鍊欓�変汉
+ *
+ * @param flowId 鐗堟湰涓婚敭
+ * @param operatorId 缁忓姙涓婚敭
+ * @param batchType 绫诲瀷锛�0.鍚屾剰 1.鎷掔粷
+ */
+ @Operation(summary = "鎵归噺鑾峰彇鍊欓�変汉")
+ @GetMapping("/BatchCandidate")
+ public ActionResult<Object> batchCandidate(String flowId, String operatorId, Integer batchType) throws WorkFlowException {
+ CandidateCheckVo vo = operatorService.batchCandidates(flowId, operatorId, batchType);
+ return ActionResult.success(vo);
+ }
+
+ /**
+ * 鎵归噺瀹℃壒
+ *
+ * @param flowModel 鍙傛暟
+ */
+ @Operation(summary = "鎵归噺瀹℃壒")
+ @PostMapping("/BatchOperation")
+ public ActionResult<Object> batchOperation(@RequestBody FlowModel flowModel) throws WorkFlowException {
+ try {
+ operatorService.batch(flowModel);
+ } catch (Exception e) {
+ List<TaskEntity> taskList = flowModel.getTaskList();
+ if (CollUtil.isNotEmpty(taskList)) {
+ for (TaskEntity taskEntity : taskList) {
+ operatorUtil.compensate(taskEntity);
+ }
+ }
+ throw e;
+ }
+ List<TaskEntity> taskList = flowModel.getTaskList();
+ for (TaskEntity taskEntity : taskList) {
+ FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
+ model.setTaskEntity(taskEntity);
+ operatorUtil.launchTrigger(model);
+ }
+ operatorUtil.handleOperator();
+ operatorUtil.handleTaskStatusThenEvent();
+ return ActionResult.success(MsgCode.WF011.get());
+ }
+
+ /**
+ * 娑堟伅璺宠浆宸ヤ綔娴�
+ *
+ * @param id 缁忓姙鎴栨妱閫佷富閿�
+ */
+ @Operation(summary = "娑堟伅璺宠浆宸ヤ綔娴�")
+ @GetMapping("/{id}/Info")
+ public ActionResult<Object> checkInfo(@PathVariable("id") String id, @RequestParam(value = "opType", required = false) String opType) throws WorkFlowException {
+ Map<String, String> map = new HashMap<>();
+ List<String> list = ImmutableList.of(OpTypeEnum.LAUNCH_DETAIL.getType(), OpTypeEnum.LAUNCH_CREATE.getType());
+ if (list.contains(opType)) {
+ String type = OpTypeEnum.LAUNCH_DETAIL.getType();
+ TaskEntity task = taskService.getById(id);
+ if (null != task) {
+ operatorUtil.checkTemplateHide(task.getTemplateId());
+ if (ObjectUtil.equals(task.getStatus(), TaskStatusEnum.TO_BE_SUBMIT.getCode())) {
+ type = OpTypeEnum.LAUNCH_CREATE.getType();
+ }
+ }
+ map.put("opType", type);
+ return ActionResult.success(map);
+ }
+ String type = taskService.checkInfo(id);
+ map.put("opType", type);
+ return ActionResult.success(map);
+ }
+
+ /**
+ * 鑺傜偣璁板綍鍒楄〃
+ *
+ * @param taskId 浠诲姟涓婚敭
+ * @param nodeId 鑺傜偣id
+ */
+ @Operation(summary = "鑺傜偣璁板綍鍒楄〃")
+ @GetMapping("/RecordList")
+ public ActionResult<Object> getRecordList(@RequestParam("taskId") String taskId, @RequestParam("nodeId") String nodeId) {
+ return ActionResult.success(recordService.getList(taskId, nodeId));
+ }
+
+ /**
+ * 鑺傜偣鎶勯�佸垪琛�
+ *
+ * @param taskId 浠诲姟涓婚敭
+ * @param nodeId 鑺傜偣id
+ */
+ @Operation(summary = "鑺傜偣鎶勯�佸垪琛�")
+ @GetMapping("/CirculateList")
+ public ActionResult<Object> getCirculateList(@RequestParam("taskId") String taskId, @RequestParam("nodeId") String nodeId) {
+ List<CirculateEntity> list = circulateService.getNodeList(taskId, nodeId);
+ return ActionResult.success(operatorUtil.getCirculateList(list));
+ }
+}
--
Gitblit v1.8.0