package com.sinata.appointment.service; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.sinata.appointment.constants.ApprovalInstanceStatus; import com.sinata.appointment.constants.QrcodeTicketStatus; import com.sinata.appointment.entity.AppointmentOrder; import com.sinata.appointment.entity.AppointmentVisitor; import com.sinata.appointment.entity.ApprovalInstance; import com.sinata.appointment.entity.MpUser; import com.sinata.appointment.entity.MpVisitor; import com.sinata.appointment.entity.QrcodeTicket; import com.sinata.appointment.mapper.AppointmentOrderMapper; import com.sinata.appointment.mapper.AppointmentVisitorMapper; import com.sinata.appointment.mapper.ApprovalInstanceMapper; import com.sinata.appointment.mapper.BizVisitReasonMapper; import com.sinata.appointment.mapper.MpUserMapper; import com.sinata.appointment.mapper.MpVisitorMapper; import com.sinata.appointment.mapper.QrcodeTicketMapper; import java.time.LocalDate; import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) class PostApprovalOrchestrationServiceTest { @Mock private IntegrationHikvisionService integrationHikvisionService; @Mock private IntegrationWechatService integrationWechatService; @Mock private QrcodeTicketMapper qrcodeTicketMapper; @Mock private AppointmentOrderMapper appointmentOrderMapper; @Mock private ApprovalInstanceMapper approvalInstanceMapper; @Mock private AppointmentVisitorMapper appointmentVisitorMapper; @Mock private MpVisitorMapper mpVisitorMapper; @Mock private MpUserMapper mpUserMapper; @Mock private BizVisitReasonMapper bizVisitReasonMapper; @Mock private SysBizSettingCacheService sysBizSettingCacheService; @InjectMocks private PostApprovalOrchestrationService postApprovalOrchestrationService; @Test void onOrderFullyApprovedBatchesProfilesAndReusesExistingTickets() { AppointmentOrder order = new AppointmentOrder(); order.setId(1L); order.setVisitedUserId(8L); order.setVisitStartDate(LocalDate.now().plusDays(1)); ApprovalInstance instance = new ApprovalInstance(); instance.setStatus(ApprovalInstanceStatus.APPROVED); AppointmentVisitor reusedVisitor = new AppointmentVisitor(); reusedVisitor.setOrderId(1L); reusedVisitor.setMpVisitorId(11L); reusedVisitor.setName("张三"); AppointmentVisitor newVisitor = new AppointmentVisitor(); newVisitor.setOrderId(1L); newVisitor.setMpVisitorId(12L); newVisitor.setName("李四"); QrcodeTicket reusedTicket = new QrcodeTicket(); reusedTicket.setId(1001L); reusedTicket.setOrderId(1L); reusedTicket.setMpVisitorId(11L); reusedTicket.setTicketStatus(QrcodeTicketStatus.UNUSED); MpVisitor profile1 = new MpVisitor(); profile1.setId(11L); profile1.setVisitorName("张三"); MpVisitor profile2 = new MpVisitor(); profile2.setId(12L); profile2.setVisitorName("李四"); MpUser visitedUser = new MpUser(); visitedUser.setId(8L); visitedUser.setNickName("员工A"); when(approvalInstanceMapper.selectOne(any())).thenReturn(instance); when(appointmentVisitorMapper.selectList(any())).thenReturn(List.of(reusedVisitor, newVisitor)); when(mpVisitorMapper.selectList(any())).thenReturn(List.of(profile1, profile2)); when(qrcodeTicketMapper.selectList(any())).thenReturn(List.of(reusedTicket)); when(sysBizSettingCacheService.getValue(any())).thenReturn("7"); when(mpUserMapper.selectOne(any())).thenReturn(visitedUser); when(integrationHikvisionService.requestQrcodePayload( eq(order), eq(newVisitor), eq(profile2), eq(visitedUser), any(), any(), any(), any(), eq(7 * 24 * 60), any(), any())) .thenReturn("payload-2"); postApprovalOrchestrationService.onOrderFullyApproved(order); verify(appointmentOrderMapper).updateById(order); verify(mpVisitorMapper, times(1)).selectList(any()); verify(qrcodeTicketMapper, times(1)).selectList(any()); verify(qrcodeTicketMapper, times(1)).insert(any(QrcodeTicket.class)); verify(integrationHikvisionService, times(1)) .requestQrcodePayload( eq(order), eq(newVisitor), eq(profile2), eq(visitedUser), any(), any(), any(), any(), eq(7 * 24 * 60), any(), any()); verify(integrationWechatService).notifyApprovalFinalResult(order, true); } @Test void onOrderFullyApprovedSkipsWhenLatestInstanceNotApproved() { AppointmentOrder order = new AppointmentOrder(); order.setId(1L); ApprovalInstance instance = new ApprovalInstance(); instance.setStatus(ApprovalInstanceStatus.IN_PROGRESS); when(approvalInstanceMapper.selectOne(any())).thenReturn(instance); postApprovalOrchestrationService.onOrderFullyApproved(order); verify(appointmentOrderMapper, never()).updateById(any()); verify(appointmentVisitorMapper, never()).selectList(any()); verify(qrcodeTicketMapper, never()).insert(any()); } }