| | |
| | | import static org.junit.jupiter.api.Assertions.assertNull; |
| | | import static org.junit.jupiter.api.Assertions.assertTrue; |
| | | import static org.mockito.ArgumentMatchers.any; |
| | | import static org.mockito.Mockito.never; |
| | | import static org.mockito.Mockito.verify; |
| | | import static org.mockito.Mockito.when; |
| | | |
| | |
| | | assertStatusFilterCoversFinished(captor.getValue()); |
| | | } |
| | | |
| | | @Test |
| | | void getChargingDetailsPrefersActiveVinOrderOverFinishedNormalOrder() { |
| | | // 同一把枪:普通订单已完成(5),随后 VIN 码订单充电中(3)。 |
| | | // 充电页必须拿到未结束的 VIN 订单,否则会误入「充电完成」弹窗、用户无法停止充电 |
| | | LoginUserApplet loginUser = new LoginUserApplet(); |
| | | loginUser.setUserId(88L); |
| | | when(tokenService.getLoginUserApplet()).thenReturn(loginUser); |
| | | TChargingOrder finishedNormalOrder = new TChargingOrder(); |
| | | finishedNormalOrder.setId(3003L); |
| | | finishedNormalOrder.setAppUserId(88L); |
| | | finishedNormalOrder.setChargingGunId(5); |
| | | finishedNormalOrder.setStatus(5); |
| | | finishedNormalOrder.setCode("CH20261014001"); |
| | | finishedNormalOrder.setResidualAmount(new BigDecimal("2.06")); |
| | | finishedNormalOrder.setCreateTime(LocalDateTime.of(2026, 10, 14, 14, 22, 49)); |
| | | when(mapper.selectOne(any())).thenReturn(finishedNormalOrder); |
| | | TVinChargingOrder activeVinOrder = new TVinChargingOrder(); |
| | | activeVinOrder.setId(2002L); |
| | | activeVinOrder.setAppUserId(88L); |
| | | activeVinOrder.setChargingGunId(5); |
| | | activeVinOrder.setStatus(3); |
| | | activeVinOrder.setCode("VD20261014002"); |
| | | activeVinOrder.setResidualAmount(new BigDecimal("3.44")); |
| | | activeVinOrder.setCreateTime(LocalDateTime.of(2026, 10, 14, 14, 38, 30)); |
| | | when(vinChargingOrderMapper.selectOne(any())).thenReturn(activeVinOrder); |
| | | stubGunPileAndSite(); |
| | | when(uploadRealTimeMonitoringDataService.getLastDataById("VD20261014002")).thenReturn(null); |
| | | |
| | | ChargingDetails details = service.getChargingDetails(5); |
| | | |
| | | assertNotNull(details, "普通订单已结束时不应定格完成态,应返回充电中的 VIN 订单"); |
| | | assertEquals("2002", details.getId()); |
| | | assertEquals(Integer.valueOf(3), details.getStatus()); |
| | | assertEquals("VD20261014002", details.getCode()); |
| | | assertEquals(0, new BigDecimal("3.44").compareTo(details.getChargingCost())); |
| | | } |
| | | |
| | | @Test |
| | | void getChargingDetailsKeepsActiveNormalOrderWithoutQueryingVinOrder() { |
| | | // 普通订单充电中(3)时走原快路径直接返回,不再查询 VIN 订单表 |
| | | LoginUserApplet loginUser = new LoginUserApplet(); |
| | | loginUser.setUserId(88L); |
| | | when(tokenService.getLoginUserApplet()).thenReturn(loginUser); |
| | | TChargingOrder activeNormalOrder = new TChargingOrder(); |
| | | activeNormalOrder.setId(3004L); |
| | | activeNormalOrder.setAppUserId(88L); |
| | | activeNormalOrder.setChargingGunId(5); |
| | | activeNormalOrder.setStatus(3); |
| | | activeNormalOrder.setCode("CH20261014002"); |
| | | activeNormalOrder.setResidualAmount(new BigDecimal("8.80")); |
| | | activeNormalOrder.setCreateTime(LocalDateTime.of(2026, 10, 14, 15, 0)); |
| | | when(mapper.selectOne(any())).thenReturn(activeNormalOrder); |
| | | stubGunPileAndSite(); |
| | | when(uploadRealTimeMonitoringDataService.getLastDataById("CH20261014002")).thenReturn(null); |
| | | |
| | | ChargingDetails details = service.getChargingDetails(5); |
| | | |
| | | assertNotNull(details); |
| | | assertEquals("3004", details.getId()); |
| | | assertEquals(Integer.valueOf(3), details.getStatus()); |
| | | assertEquals("CH20261014002", details.getCode()); |
| | | verify(vinChargingOrderMapper, never()).selectOne(any()); |
| | | } |
| | | |
| | | @Test |
| | | void getChargingDetailsPrefersNewerFinishedOrderWhenBothFinished() { |
| | | // 两笔均已结束(5)时取创建时间更近的一笔:VIN 订单结束后完成页应展示 VIN 订单,而非更早的普通订单 |
| | | LoginUserApplet loginUser = new LoginUserApplet(); |
| | | loginUser.setUserId(88L); |
| | | when(tokenService.getLoginUserApplet()).thenReturn(loginUser); |
| | | TChargingOrder finishedNormalOrder = new TChargingOrder(); |
| | | finishedNormalOrder.setId(3003L); |
| | | finishedNormalOrder.setAppUserId(88L); |
| | | finishedNormalOrder.setChargingGunId(5); |
| | | finishedNormalOrder.setStatus(5); |
| | | finishedNormalOrder.setCode("CH20261014001"); |
| | | finishedNormalOrder.setResidualAmount(new BigDecimal("2.06")); |
| | | finishedNormalOrder.setCreateTime(LocalDateTime.of(2026, 10, 14, 14, 22, 49)); |
| | | when(mapper.selectOne(any())).thenReturn(finishedNormalOrder); |
| | | TVinChargingOrder finishedVinOrder = new TVinChargingOrder(); |
| | | finishedVinOrder.setId(2003L); |
| | | finishedVinOrder.setAppUserId(88L); |
| | | finishedVinOrder.setChargingGunId(5); |
| | | finishedVinOrder.setStatus(5); |
| | | finishedVinOrder.setCode("VD20261014003"); |
| | | finishedVinOrder.setResidualAmount(new BigDecimal("5.20")); |
| | | finishedVinOrder.setCreateTime(LocalDateTime.of(2026, 10, 14, 14, 42, 26)); |
| | | when(vinChargingOrderMapper.selectOne(any())).thenReturn(finishedVinOrder); |
| | | stubGunPileAndSite(); |
| | | when(uploadRealTimeMonitoringDataService.getLastDataById("VD20261014003")).thenReturn(null); |
| | | |
| | | ChargingDetails details = service.getChargingDetails(5); |
| | | |
| | | assertNotNull(details); |
| | | assertEquals("2003", details.getId()); |
| | | assertEquals(Integer.valueOf(5), details.getStatus()); |
| | | assertEquals("VD20261014003", details.getCode()); |
| | | assertEquals(0, new BigDecimal("5.20").compareTo(details.getChargingCost())); |
| | | } |
| | | |
| | | /** getChargingDetails 组装链路依赖的充电枪/充电桩/站点远程调用 stub */ |
| | | private void stubGunPileAndSite() { |
| | | TChargingGun gun = new TChargingGun(); |