longz
2026-04-27 25df88d0ab9d7444ed1d162b9efa1259ac2f6f66
backend/src/main/java/com/sinata/appointment/service/ApprovalEngineService.java
@@ -267,6 +267,26 @@
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public void cancelInstance(ApprovalInstance inst, String reason) {
        inst.setStatus(ApprovalInstanceStatus.CANCELLED);
        inst.setFinishedAt(LocalDateTime.now());
        approvalInstanceMapper.updateById(inst);
        List<ApprovalTask> pending =
                approvalTaskMapper.selectList(
                        new LambdaQueryWrapper<ApprovalTask>()
                                .eq(ApprovalTask::getInstanceId, inst.getId())
                                .in(
                                        ApprovalTask::getTaskStatus,
                                        ApprovalTaskStatus.PENDING,
                                        ApprovalTaskStatus.WAITING));
        for (ApprovalTask t : pending) {
            t.setTaskStatus(ApprovalTaskStatus.CANCELLED);
            t.setComment(reason);
            approvalTaskMapper.updateById(t);
        }
    }
    private String resolveFirstNodeWithAssignees(List<String> chain, AppointmentOrder order) {
        for (String nodeCode : chain) {
            List<Long> assignees = resolveAssignees(nodeCode, order);
@@ -457,7 +477,9 @@
        List<Long> assignees = resolveAssignees(nodeCode, order);
        int created = createTasksWithGroupKey(inst.getId(), nodeCode, nodeCode, assignees, initialStatus);
        if (created <= 0) {
            throw new BizException(BizErrorCode.CONFIG_NOT_FOUND, "节点无审批人: " + nodeCode);
            throw new BizException(
                    BizErrorCode.CONFIG_NOT_FOUND,
                    "节点无审批人: " + resolveNodeName(nodeCode));
        }
        return created;
    }
@@ -468,7 +490,7 @@
        if (!Boolean.TRUE.equals(order.getInvolveOtherLocalUnit()) || localUnitIds.isEmpty()) {
            throw new BizException(
                    BizErrorCode.CONFIG_NOT_FOUND,
                    "节点无审批人: " + ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER);
                    "节点无审批人: " + resolveNodeName(ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER));
        }
        List<MpPassLocalUnit> units =
@@ -592,11 +614,25 @@
        if (total <= 0) {
            throw new BizException(
                    BizErrorCode.CONFIG_NOT_FOUND,
                    "节点无审批人: " + ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER);
                    "节点无审批人: " + resolveNodeName(ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER));
        }
        return total;
    }
    private String resolveNodeName(String nodeCode) {
        if (!StringUtils.hasText(nodeCode)) {
            return "未知节点";
        }
        return switch (nodeCode) {
            case ApprovalNodeCode.LEVEL1_HANDLER -> "经办人(一级)";
            case ApprovalNodeCode.LEVEL2_DEPT_LEADER -> "部门负责人(二级)";
            case ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER -> "属地管理部门领导(三级)";
            case ApprovalNodeCode.LEVEL4_VISIT_DEPT -> "访客主管部门(四级)";
            case ApprovalNodeCode.LEVEL5_VISIT_DEPT_LEADER -> "访客主管部门领导(五级)";
            default -> nodeCode;
        };
    }
    private int createTasksWithGroupKey(
            Long instanceId, String nodeCode, String groupKey, List<Long> assignees, String initialStatus) {
        Set<Long> unique = new LinkedHashSet<>(assignees == null ? List.of() : assignees);