longz
2026-06-29 9d4cbff7464ebfd7803c2ce53ded49d0f73fe011
backend/src/main/java/com/sinata/appointment/service/ApprovalEngineService.java
@@ -17,6 +17,7 @@
import com.sinata.appointment.entity.MpPassLocalUnitMember;
import com.sinata.appointment.entity.MpStaffGroupMember;
import com.sinata.appointment.entity.MpUser;
import com.sinata.appointment.entity.SysDept;
import com.sinata.appointment.exception.BizException;
import com.sinata.appointment.mapper.ApprovalInstanceMapper;
import com.sinata.appointment.mapper.ApprovalTaskMapper;
@@ -25,6 +26,7 @@
import com.sinata.appointment.mapper.MpPassLocalUnitMemberMapper;
import com.sinata.appointment.mapper.MpStaffGroupMemberMapper;
import com.sinata.appointment.mapper.MpUserMapper;
import com.sinata.appointment.mapper.SysDeptMapper;
import com.sinata.appointment.constants.BizErrorCode;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -54,6 +56,7 @@
    private final ApprovalInstanceMapper approvalInstanceMapper;
    private final ApprovalTaskMapper approvalTaskMapper;
    private final MpUserMapper mpUserMapper;
    private final SysDeptMapper sysDeptMapper;
    private final MpPassLocalUnitMapper mpPassLocalUnitMapper;
    private final MpPassLocalUnitMemberMapper mpPassLocalUnitMemberMapper;
    private final MpStaffGroupMemberMapper mpStaffGroupMemberMapper;
@@ -119,7 +122,7 @@
        }
        if (ApprovalNodeCode.LEVEL2_DEPT_LEADER.equals(nodeCode)) {
            Long deptId = resolveVisitedDeptId(order);
            return listEmployeeIdsByDeptAndLeaderFlag(deptId, true);
            return getDeptLeaderIds(deptId);
        }
        if (ApprovalNodeCode.LEVEL4_VISIT_DEPT.equals(nodeCode)) {
            Long competentDeptId = getVisitCompetentDeptId();
@@ -127,7 +130,7 @@
        }
        if (ApprovalNodeCode.LEVEL5_VISIT_DEPT_LEADER.equals(nodeCode)) {
            Long competentDeptId = getVisitCompetentDeptId();
            return listEmployeeIdsByDeptAndLeaderFlag(competentDeptId, true);
            return getDeptLeaderIds(competentDeptId);
        }
        if (ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER.equals(nodeCode)) {
            return List.of();
@@ -162,19 +165,56 @@
        }
    }
    private List<Long> listEmployeeIdsByDeptAndLeaderFlag(Long deptId, boolean leaderFlag) {
    private List<Long> getDeptLeaderIds(Long deptId) {
        if (deptId == null || deptId <= 0) {
            return List.of();
        }
        List<MpUser> users =
        SysDept dept = sysDeptMapper.selectById(deptId);
        if (dept == null || dept.getDelFlag() != null && dept.getDelFlag() == 1) {
            return List.of();
        }
        List<Long> leaderIds = parseDeptLeaderIds(dept);
        if (leaderIds.isEmpty()) {
            return List.of();
        }
        List<MpUser> leaders =
                mpUserMapper.selectList(
                        new LambdaQueryWrapper<MpUser>()
                                .eq(MpUser::getDelFlag, 0)
                                .eq(MpUser::getStatus, 1)
                                .eq(MpUser::getUserType, MiniUserType.EMPLOYEE)
                                .eq(MpUser::getDeptId, deptId)
                                .eq(MpUser::getDeptLeaderFlag, leaderFlag));
        return users.stream().map(MpUser::getId).filter(Objects::nonNull).toList();
                                .in(MpUser::getId, leaderIds));
        Map<Long, MpUser> leaderMap = new LinkedHashMap<>();
        for (MpUser leader : leaders) {
            leaderMap.put(leader.getId(), leader);
        }
        List<Long> result = new ArrayList<>();
        for (Long id : leaderIds) {
            if (leaderMap.containsKey(id)) {
                result.add(id);
            }
        }
        return result;
    }
    private List<Long> parseDeptLeaderIds(SysDept dept) {
        List<Long> ids = new ArrayList<>();
        Set<Long> seen = new LinkedHashSet<>();
        if (StringUtils.hasText(dept.getLeaderIds())) {
            for (String part : dept.getLeaderIds().split(",")) {
                if (!StringUtils.hasText(part)) {
                    continue;
                }
                try {
                    Long id = Long.parseLong(part.trim());
                    if (id > 0 && seen.add(id)) {
                        ids.add(id);
                    }
                } catch (NumberFormatException ignored) {
                }
            }
        }
        return ids;
    }
    private List<Long> listAllActiveEmployeeIdsByDept(Long deptId) {
@@ -192,11 +232,7 @@
    }
    private List<Long> listEmployeeIdsByDeptWithLeaderFallback(Long deptId) {
        List<Long> normalEmployees = listEmployeeIdsByDeptAndLeaderFlag(deptId, false);
        if (normalEmployees != null && !normalEmployees.isEmpty()) {
            return normalEmployees;
        }
        return listEmployeeIdsByDeptAndLeaderFlag(deptId, true);
        return listAllActiveEmployeeIdsByDept(deptId);
    }
    @Transactional(rollbackFor = Exception.class)