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