fix
longz
2026-05-26 cb44316d3975af52a3a9af824094b844dd7df874
backend/src/test/java/com/sinata/appointment/service/ApprovalEngineServiceTest.java
@@ -2,11 +2,17 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.sinata.appointment.constants.ApprovalNodeCode;
import com.sinata.appointment.constants.ApprovalInstanceStatus;
import com.sinata.appointment.constants.ApprovalTaskStatus;
import com.sinata.appointment.constants.LocalUnitApproverType;
import com.sinata.appointment.entity.AppointmentOrder;
import com.sinata.appointment.entity.MpPassLocalUnit;
import com.sinata.appointment.entity.MpUser;
import com.sinata.appointment.entity.ApprovalInstance;
import com.sinata.appointment.entity.ApprovalTask;
import com.sinata.appointment.mapper.ApprovalInstanceMapper;
@@ -23,6 +29,7 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
@ExtendWith(MockitoExtension.class)
class ApprovalEngineServiceTest {
@@ -85,4 +92,63 @@
        assertEquals(ApprovalTaskStatus.CANCELLED, updatedTasks.get(1).getTaskStatus());
        assertEquals("预约人取消", updatedTasks.get(1).getComment());
    }
    @Test
    void createTasksForLocalUnitNodeStrictShouldMergeDeptApproversIntoOneUnitGroup() {
        ApprovalEngineService approvalEngineService =
                new ApprovalEngineService(
                        bizApprovalNodeConfigMapper,
                        approvalInstanceMapper,
                        approvalTaskMapper,
                        mpUserMapper,
                        mpPassLocalUnitMapper,
                        mpPassLocalUnitMemberMapper,
                        mpStaffGroupMemberMapper,
                        sysBizSettingCacheService,
                        new ObjectMapper());
        AppointmentOrder order = new AppointmentOrder();
        order.setInvolveOtherLocalUnit(true);
        order.setPassLocalUnitIds("[11]");
        MpPassLocalUnit unit = new MpPassLocalUnit();
        unit.setId(11L);
        unit.setApproverType(LocalUnitApproverType.DEPT);
        unit.setApproverDeptIds("[100,101]");
        MpUser deptUser1 = new MpUser();
        deptUser1.setId(1L);
        MpUser deptUser2 = new MpUser();
        deptUser2.setId(2L);
        MpUser deptUser3 = new MpUser();
        deptUser3.setId(3L);
        when(mpPassLocalUnitMapper.selectList(any())).thenReturn(List.of(unit));
        when(mpUserMapper.selectList(any()))
                .thenReturn(List.of(deptUser1, deptUser2), List.of(deptUser2, deptUser3));
        int created =
                (int)
                        ReflectionTestUtils.invokeMethod(
                                approvalEngineService,
                                "createTasksForLocalUnitNodeStrict",
                                99L,
                                order,
                                ApprovalTaskStatus.PENDING);
        assertEquals(3, created);
        ArgumentCaptor<ApprovalTask> taskCaptor = ArgumentCaptor.forClass(ApprovalTask.class);
        verify(approvalTaskMapper, times(3)).insert(taskCaptor.capture());
        List<ApprovalTask> insertedTasks = taskCaptor.getAllValues();
        assertEquals(
                List.of(1L, 2L, 3L),
                insertedTasks.stream().map(ApprovalTask::getAssigneeUserId).toList());
        assertEquals(
                List.of(
                        ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER + ":UNIT:11",
                        ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER + ":UNIT:11",
                        ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER + ":UNIT:11"),
                insertedTasks.stream().map(ApprovalTask::getGroupKey).toList());
    }
}