feat(fleet): enforce reviewed trips and original fee coverage for dispatch

This commit is contained in:
2026-10-03 04:18:52 +08:00
parent c50e9f97d1
commit 5e683da3b9
162 changed files with 9642 additions and 218 deletions
@@ -4,6 +4,7 @@ import com.baiyue.lastleg.masterdata.vehicle.application.VehicleApplicationServi
import com.baiyue.lastleg.masterdata.vehicle.application.VehicleApplicationService.VehicleFailure;
import com.baiyue.lastleg.masterdata.vehicle.application.model.VehicleModels;
import com.baiyue.lastleg.masterdata.vehicle.application.port.out.VehicleRepository;
import com.baiyue.lastleg.masterdata.vehicle.application.port.out.VehicleAssignmentGuard;
import com.baiyue.lastleg.masterdata.vehicle.application.port.out.VehicleRepository.VehicleSnapshot;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -23,7 +24,7 @@ class VehicleApplicationServiceTest {
@BeforeEach
void setUp() {
repository = mock(VehicleRepository.class);
service = new VehicleApplicationService(repository);
service = new VehicleApplicationService(repository, mock(VehicleAssignmentGuard.class));
}
@Test
@@ -52,13 +53,30 @@ class VehicleApplicationServiceTest {
failure -> assertThat(failure.kind()).isEqualTo(FailureKind.BAD_REQUEST));
}
@Test void rejectsPartialOrNonPositiveCapacityWithoutGuessingFromModel() {
var partial = new VehicleModels.Create("ABC-001", "大车30托", new BigDecimal("12.50"), 1000L,
null, null, "OVERSEAS", "OWNED", "IN_SERVICE", null, 30, null, new BigDecimal("90"));
assertThatThrownBy(() -> service.create("9", partial)).hasMessageContaining("同时填写");
var zero = new VehicleModels.Create("ABC-001", "大车30托", new BigDecimal("12.50"), 1000L,
null, null, "OVERSEAS", "OWNED", "IN_SERVICE", null, 30, BigDecimal.ZERO, new BigDecimal("90"));
assertThatThrownBy(() -> service.create("9", zero)).hasMessageContaining("大于零");
org.mockito.Mockito.verify(repository, org.mockito.Mockito.never()).create(org.mockito.ArgumentMatchers.any());
}
@Test void exportUsesPlateAsBusinessIdentifierAndIncludesAllCapacityDimensions() {
when(repository.list(org.mockito.ArgumentMatchers.any())).thenReturn(java.util.List.of(vehicle(3, 1000)));
String csv = new String(service.exportCsv(new VehicleModels.Query(1, 20, null, null, null, null)), java.nio.charset.StandardCharsets.UTF_8);
assertThat(csv).contains("最大托位,最大载重(kg),可用容积(m³)").contains("\"30\",\"18000\",\"90\"")
.doesNotContain("车辆ID");
}
private static VehicleModels.Update update(long version, long mileage) {
return new VehicleModels.Update(version, "ABC-001", "Box Truck", new BigDecimal("12.50"), mileage,
"Driver", "123", "OVERSEAS", "OWNED", null);
"Driver", "123", "OVERSEAS", "OWNED", null, 30, new BigDecimal("18000"), new BigDecimal("90"));
}
private static VehicleSnapshot vehicle(long version, long mileage) {
return new VehicleSnapshot(1L, "ABC-001", "Box Truck", new BigDecimal("12.50"), mileage,
"Driver", "123", "OVERSEAS", "OWNED", "IN_SERVICE", null, version, "9", null);
"Driver", "123", "OVERSEAS", "OWNED", "IN_SERVICE", null, version, "9", null, 30, new BigDecimal("18000"), new BigDecimal("90"));
}
}