优化
This commit is contained in:
+11
-1
@@ -1,6 +1,7 @@
|
||||
package com.baiyue.firstleg.client;
|
||||
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.PageResult;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -16,8 +17,17 @@ import java.util.List;
|
||||
url = "${baiyue.clients.warehouse.url:}", path = "/internal/warehouse/v1")
|
||||
public interface WarehousePalletLocationClient {
|
||||
@GetMapping("/pallets/snapshots")
|
||||
ApiResponse<List<PalletSnapshot>> palletSnapshots(
|
||||
ApiResponse<PageResult<PalletSnapshot>> palletSnapshots(
|
||||
@RequestHeader("X-Internal-Service-Token") String token,
|
||||
@RequestParam("warehouseId") long warehouseId,
|
||||
@RequestParam("page") long page,
|
||||
@RequestParam("size") long size,
|
||||
@RequestParam(value = "keyword", required = false) String keyword);
|
||||
|
||||
@GetMapping("/pallets/{palletId}/snapshot")
|
||||
ApiResponse<PalletSnapshot> palletSnapshot(
|
||||
@RequestHeader("X-Internal-Service-Token") String token,
|
||||
@org.springframework.web.bind.annotation.PathVariable("palletId") long palletId,
|
||||
@RequestParam("warehouseId") long warehouseId);
|
||||
|
||||
@PostMapping("/pallet-locations/reservations")
|
||||
|
||||
+13
-5
@@ -4,6 +4,7 @@ import jakarta.annotation.Resource;
|
||||
|
||||
import com.baiyue.common.audit.BusinessAudit;
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.PageResult;
|
||||
import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.common.security.AuthenticatedUser;
|
||||
@@ -18,8 +19,12 @@ import com.baiyue.firstleg.service.MeasurementSubmissionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.validation.constraints.Max;
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
@@ -33,10 +38,10 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** 平台后台入库测量录入、提交和 OCR 重量结果维护接口。 */
|
||||
@Tag(name = "平台入库测量", description = "维护测量草稿、箱规明细和可追溯 OCR 重量结果。")
|
||||
@Validated
|
||||
@RestController
|
||||
@RequestMapping("/api/platform/v1/first-leg/inbounds/{inboundId}")
|
||||
public class PlatformInboundMeasurementController {
|
||||
@@ -56,16 +61,19 @@ public class PlatformInboundMeasurementController {
|
||||
}
|
||||
|
||||
@Operation(summary = "查询称重可选托盘快照",
|
||||
description = "按入库单所属仓库返回未删除的托盘只读快照,不校验托盘状态或占用资格。")
|
||||
description = "按入库单所属仓库分页返回当前有效托盘候选,支持编码或类型关键词;托盘可复用,不按预占或占用过滤。")
|
||||
@GetMapping("/weight-pallet-options")
|
||||
@PreAuthorize("hasAnyAuthority('platform:firstleg:inbound:measure:view',"
|
||||
+ " 'platform:firstleg:inbound:weight:edit')")
|
||||
public ApiResponse<List<InboundMeasurementResponses.PalletSnapshot>> weightPalletOptions(
|
||||
public ApiResponse<PageResult<InboundMeasurementResponses.PalletSnapshot>> weightPalletOptions(
|
||||
@AuthenticationPrincipal AuthenticatedUser user,
|
||||
@RequestParam long tenantId,
|
||||
@PathVariable long inboundId) {
|
||||
@PathVariable long inboundId,
|
||||
@RequestParam(defaultValue = "1") @Min(1) long page,
|
||||
@RequestParam(defaultValue = "20") @Min(1) @Max(100) long size,
|
||||
@RequestParam(required = false) @Size(max = 50) String keyword) {
|
||||
requirePlatformTenant(user, tenantId);
|
||||
return ApiResponse.success(service.weightPalletOptions(tenantId, inboundId));
|
||||
return ApiResponse.success(service.weightPalletOptions(tenantId, inboundId, page, size, keyword));
|
||||
}
|
||||
|
||||
@BusinessAudit(event = "INBOUND_MEASUREMENT_DRAFT_SAVE", resourceType = "INBOUND",
|
||||
|
||||
@@ -4,6 +4,7 @@ import jakarta.annotation.Resource;
|
||||
|
||||
import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.PageResult;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.firstleg.client.OrderCargoClient;
|
||||
import com.baiyue.firstleg.client.MeasurementImageClient;
|
||||
@@ -73,14 +74,16 @@ public class InboundMeasurementService {
|
||||
return toDetail(inbound, measurement, items, weights, review, declaration);
|
||||
}
|
||||
|
||||
public List<InboundMeasurementResponses.PalletSnapshot> weightPalletOptions(
|
||||
long tenantId, long inboundId) {
|
||||
public PageResult<InboundMeasurementResponses.PalletSnapshot> weightPalletOptions(
|
||||
long tenantId, long inboundId, long page, long size, String keyword) {
|
||||
InboundOrderEntity inbound = requireInbound(tenantId, inboundId);
|
||||
return loadPalletSnapshots(inbound).stream()
|
||||
PageResult<WarehousePalletLocationClient.PalletSnapshot> source =
|
||||
loadPalletSnapshotPage(inbound, page, size, keyword);
|
||||
return new PageResult<>(source.records().stream()
|
||||
.map(snapshot -> new InboundMeasurementResponses.PalletSnapshot(
|
||||
snapshot.palletId(), snapshot.palletCode(), snapshot.palletType(),
|
||||
snapshot.capacityCbm(), snapshot.tareWeightKg()))
|
||||
.toList();
|
||||
.toList(), source.page(), source.size(), source.total(), source.pages());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@@ -175,11 +178,8 @@ public class InboundMeasurementService {
|
||||
if (repository.findWeightByFile(tenantId, inboundId, request.fileId()) != null) {
|
||||
throw new BizException(ResultCode.CONFLICT, "同一称重图片不能重复计重");
|
||||
}
|
||||
WarehousePalletLocationClient.PalletSnapshot pallet = loadPalletSnapshots(inbound).stream()
|
||||
.filter(snapshot -> snapshot.palletId() == request.palletId())
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new BizException(ResultCode.VALIDATION_FAILED,
|
||||
"所选托盘不属于当前入库仓库或已被删除"));
|
||||
WarehousePalletLocationClient.PalletSnapshot pallet = loadPalletSnapshot(
|
||||
inbound, request.palletId());
|
||||
validatePalletSnapshot(pallet);
|
||||
String unit = rawOcrUnit(request.ocrWeightUnit());
|
||||
InboundWeightResultEntity weight = new InboundWeightResultEntity();
|
||||
@@ -527,23 +527,43 @@ public class InboundMeasurementService {
|
||||
weight.getAdjustedAt(), weight.getConfirmedBy(), weight.getConfirmedAt(), weight.getVersion());
|
||||
}
|
||||
|
||||
private List<WarehousePalletLocationClient.PalletSnapshot> loadPalletSnapshots(
|
||||
InboundOrderEntity inbound) {
|
||||
private PageResult<WarehousePalletLocationClient.PalletSnapshot> loadPalletSnapshotPage(
|
||||
InboundOrderEntity inbound, long page, long size, String keyword) {
|
||||
if (inbound.getWarehouseId() == null || inbound.getWarehouseId() <= 0) {
|
||||
throw new BizException(ResultCode.CONFLICT, "入库单未绑定有效仓库,无法选择称重托盘");
|
||||
}
|
||||
try {
|
||||
ApiResponse<List<WarehousePalletLocationClient.PalletSnapshot>> response =
|
||||
warehousePallets.palletSnapshots(internalToken, inbound.getWarehouseId());
|
||||
ApiResponse<PageResult<WarehousePalletLocationClient.PalletSnapshot>> response =
|
||||
warehousePallets.palletSnapshots(internalToken, inbound.getWarehouseId(), page, size, keyword);
|
||||
if (response == null || !response.successful() || response.data() == null) {
|
||||
String message = response == null || !StringUtils.hasText(response.message())
|
||||
? "托盘快照查询失败" : response.message();
|
||||
? "托盘候选查询失败" : response.message();
|
||||
throw new BizException(response == null ? ResultCode.SERVICE_UNAVAILABLE
|
||||
: ResultCode.of(response.code()), message);
|
||||
}
|
||||
return response.data();
|
||||
} catch (FeignException exception) {
|
||||
throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "仓库服务暂不可用,无法查询托盘快照");
|
||||
throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "仓库服务暂不可用,无法查询托盘候选");
|
||||
}
|
||||
}
|
||||
|
||||
private WarehousePalletLocationClient.PalletSnapshot loadPalletSnapshot(
|
||||
InboundOrderEntity inbound, long palletId) {
|
||||
if (inbound.getWarehouseId() == null || inbound.getWarehouseId() <= 0) {
|
||||
throw new BizException(ResultCode.CONFLICT, "入库单未绑定有效仓库,无法选择称重托盘");
|
||||
}
|
||||
try {
|
||||
ApiResponse<WarehousePalletLocationClient.PalletSnapshot> response = warehousePallets.palletSnapshot(
|
||||
internalToken, palletId, inbound.getWarehouseId());
|
||||
if (response == null || !response.successful() || response.data() == null) {
|
||||
String message = response == null || !StringUtils.hasText(response.message())
|
||||
? "所选托盘当前不可用于该入库仓库" : response.message();
|
||||
throw new BizException(response == null ? ResultCode.SERVICE_UNAVAILABLE
|
||||
: ResultCode.of(response.code()), message);
|
||||
}
|
||||
return response.data();
|
||||
} catch (FeignException exception) {
|
||||
throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "仓库服务暂不可用,无法校验托盘资格");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -755,11 +755,14 @@ paths:
|
||||
get:
|
||||
summary: 查询称重可选托盘快照
|
||||
description: >-
|
||||
需要入库测量查看或称重编辑权限。Firstleg 按入库单 warehouseId 查询 Warehouse 公共托盘快照;
|
||||
仅限定同仓且未删除,不校验托盘状态或占用资格,Admin 不需要 platform:pallet:list。
|
||||
需要入库测量查看或称重编辑权限。Firstleg 按入库单 warehouseId 分页查询 Warehouse 当前称重托盘候选;
|
||||
Warehouse 校验平台公共作用域、启用国内仓、同仓归属和当前未删除资格。托盘可复用,不按预占或占用过滤,Admin 不需要 platform:pallet:list。
|
||||
parameters:
|
||||
- {name: tenantId, in: query, required: true, schema: {type: string, pattern: '^[1-9][0-9]*$'}}
|
||||
- {name: inboundId, in: path, required: true, schema: {type: string, pattern: '^[1-9][0-9]*$'}}
|
||||
- {name: page, in: query, required: false, schema: {type: integer, format: int64, minimum: 1, default: 1}}
|
||||
- {name: size, in: query, required: false, schema: {type: integer, format: int64, minimum: 1, maximum: 100, default: 20}}
|
||||
- {name: keyword, in: query, required: false, description: 匹配托盘编码或类型, schema: {type: string, maxLength: 50}}
|
||||
responses:
|
||||
'200':
|
||||
description: 成功或业务失败,按响应体 code 判断
|
||||
@@ -770,7 +773,7 @@ paths:
|
||||
properties:
|
||||
code: {type: string}
|
||||
message: {type: string}
|
||||
data: {type: array, items: {$ref: '#/components/schemas/WeightPalletSnapshot'}}
|
||||
data: {$ref: '#/components/schemas/WeightPalletSnapshotPage'}
|
||||
'403': {description: 无入库测量查看或称重编辑权限}
|
||||
/api/platform/v1/first-leg/inbounds/{inboundId}/weight-results:
|
||||
post:
|
||||
@@ -1294,6 +1297,18 @@ components:
|
||||
palletType: {type: string}
|
||||
capacityCbm: {type: number, format: double, minimum: 0.0001}
|
||||
tareWeightKg: {type: number, format: double, minimum: 0, multipleOf: 0.001}
|
||||
WeightPalletSnapshotPage:
|
||||
type: object
|
||||
required: [records, page, size, total, pages]
|
||||
properties:
|
||||
records:
|
||||
type: array
|
||||
maxItems: 100
|
||||
items: {$ref: '#/components/schemas/WeightPalletSnapshot'}
|
||||
page: {type: integer, format: int64, minimum: 1}
|
||||
size: {type: integer, format: int64, minimum: 1, maximum: 100}
|
||||
total: {type: integer, format: int64, minimum: 0}
|
||||
pages: {type: integer, format: int64, minimum: 0}
|
||||
CreateWeightResultRequest:
|
||||
type: object
|
||||
required: [fileId, palletId]
|
||||
|
||||
+17
-1
@@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
@@ -16,11 +17,26 @@ class WarehousePalletLocationClientContractTest {
|
||||
assertThat(client.path()).isEqualTo("/internal/warehouse/v1");
|
||||
|
||||
Method method = WarehousePalletLocationClient.class.getDeclaredMethod(
|
||||
"palletSnapshots", String.class, long.class);
|
||||
"palletSnapshots", String.class, long.class, long.class, long.class, String.class);
|
||||
assertThat(method.getAnnotation(GetMapping.class).value())
|
||||
.containsExactly("/pallets/snapshots");
|
||||
assertThat(method.getParameters()[1].getAnnotation(RequestParam.class).value())
|
||||
.isEqualTo("warehouseId");
|
||||
assertThat(method.getParameters()[2].getAnnotation(RequestParam.class).value())
|
||||
.isEqualTo("page");
|
||||
assertThat(method.getParameters()[3].getAnnotation(RequestParam.class).value())
|
||||
.isEqualTo("size");
|
||||
assertThat(method.getParameters()[4].getAnnotation(RequestParam.class).value())
|
||||
.isEqualTo("keyword");
|
||||
|
||||
Method exact = WarehousePalletLocationClient.class.getDeclaredMethod(
|
||||
"palletSnapshot", String.class, long.class, long.class);
|
||||
assertThat(exact.getAnnotation(GetMapping.class).value())
|
||||
.containsExactly("/pallets/{palletId}/snapshot");
|
||||
assertThat(exact.getParameters()[1].getAnnotation(PathVariable.class).value())
|
||||
.isEqualTo("palletId");
|
||||
assertThat(exact.getParameters()[2].getAnnotation(RequestParam.class).value())
|
||||
.isEqualTo("warehouseId");
|
||||
|
||||
var snapshot = new WarehousePalletLocationClient.PalletSnapshot(
|
||||
101L, "PLT-101", "STANDARD", new java.math.BigDecimal("2.0000"),
|
||||
|
||||
+17
-1
@@ -6,10 +6,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.RecordComponent;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -17,6 +20,19 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
@DisplayName("平台入库测量接口权限契约")
|
||||
class PlatformInboundMeasurementControllerContractTest {
|
||||
@Test
|
||||
void palletCandidatesArePaginatedAndBoundedInOpenApi() throws IOException {
|
||||
String openapi = new ClassPathResource("openapi/firstleg-v1.yaml")
|
||||
.getContentAsString(StandardCharsets.UTF_8);
|
||||
|
||||
assertThat(openapi)
|
||||
.contains("/api/platform/v1/first-leg/inbounds/{inboundId}/weight-pallet-options:")
|
||||
.contains("name: keyword")
|
||||
.contains("maximum: 100")
|
||||
.contains("maxItems: 100")
|
||||
.contains("data: {$ref: '#/components/schemas/WeightPalletSnapshotPage'}");
|
||||
}
|
||||
|
||||
@Test
|
||||
void draftRequestOnlyAcceptsEditableGoodsNameAndMeasurementItems() {
|
||||
assertThat(Arrays.stream(InboundMeasurementRequests.SaveDraftRequest.class.getRecordComponents())
|
||||
@@ -41,7 +57,7 @@ class PlatformInboundMeasurementControllerContractTest {
|
||||
assertAuthority("weightPalletOptions",
|
||||
"hasAnyAuthority('platform:firstleg:inbound:measure:view',"
|
||||
+ " 'platform:firstleg:inbound:weight:edit')",
|
||||
AuthenticatedUser.class, long.class, long.class);
|
||||
AuthenticatedUser.class, long.class, long.class, long.class, long.class, String.class);
|
||||
assertAuthority("saveDraft", "hasAuthority('platform:firstleg:inbound:measure:edit')",
|
||||
AuthenticatedUser.class, long.class, long.class,
|
||||
InboundMeasurementRequests.SaveDraftRequest.class);
|
||||
|
||||
+38
-6
@@ -2,6 +2,7 @@ package com.baiyue.firstleg.service;
|
||||
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.PageResult;
|
||||
import com.baiyue.firstleg.client.OrderCargoClient;
|
||||
import com.baiyue.firstleg.client.MeasurementImageClient;
|
||||
import com.baiyue.firstleg.client.WarehousePalletLocationClient;
|
||||
@@ -59,8 +60,8 @@ class InboundMeasurementServiceTest {
|
||||
@BeforeEach
|
||||
void stubWarehousePalletSnapshots() {
|
||||
when(repository.updateInboundWeightSummary(any())).thenReturn(true);
|
||||
when(warehousePallets.palletSnapshots("internal-token", 100L)).thenReturn(
|
||||
ApiResponse.success(List.of(palletSnapshot())));
|
||||
when(warehousePallets.palletSnapshot("internal-token", 501L, 100L)).thenReturn(
|
||||
ApiResponse.success(palletSnapshot()));
|
||||
when(orderCargoClient.measurementDeclaration("internal-token", 1L, 80L)).thenReturn(
|
||||
ApiResponse.success(new OrderCargoClient.MeasurementDeclarationSnapshot(
|
||||
"REF-50", new BigDecimal("2000"), new BigDecimal("20"), "123123")));
|
||||
@@ -238,20 +239,28 @@ class InboundMeasurementServiceTest {
|
||||
InboundOrderEntity inbound = inbound("WAIT_MEASURE");
|
||||
when(repository.findInbound(1L, 10L)).thenReturn(inbound);
|
||||
|
||||
List<InboundMeasurementResponses.PalletSnapshot> result =
|
||||
service.weightPalletOptions(1L, 10L);
|
||||
when(warehousePallets.palletSnapshots("internal-token", 100L, 1L, 20L, "TP-5"))
|
||||
.thenReturn(ApiResponse.success(new PageResult<>(List.of(palletSnapshot()), 1, 20, 1000, 50)));
|
||||
|
||||
assertThat(result).singleElement().satisfies(snapshot -> {
|
||||
PageResult<InboundMeasurementResponses.PalletSnapshot> result =
|
||||
service.weightPalletOptions(1L, 10L, 1L, 20L, "TP-5");
|
||||
|
||||
assertThat(result.records()).singleElement().satisfies(snapshot -> {
|
||||
assertThat(snapshot.palletId()).isEqualTo(501L);
|
||||
assertThat(snapshot.tareWeightKg()).isEqualByComparingTo("18.500");
|
||||
});
|
||||
verify(warehousePallets).palletSnapshots("internal-token", 100L);
|
||||
assertThat(result.total()).isEqualTo(1000);
|
||||
assertThat(result.records()).hasSize(1);
|
||||
verify(warehousePallets).palletSnapshots("internal-token", 100L, 1L, 20L, "TP-5");
|
||||
}
|
||||
|
||||
@Test
|
||||
void creatingWeightResultRejectsPalletOutsideTheInboundWarehouse() {
|
||||
InboundOrderEntity inbound = inbound("WAIT_MEASURE");
|
||||
when(repository.findInbound(1L, 10L)).thenReturn(inbound);
|
||||
when(warehousePallets.palletSnapshot("internal-token", 999L, 100L)).thenReturn(
|
||||
ApiResponse.failure(com.baiyue.common.core.api.ResultCode.NOT_FOUND,
|
||||
"所选托盘不属于当前入库仓库或当前不可用", null, null));
|
||||
|
||||
assertThatThrownBy(() -> service.createWeightResult(1L, 10L, 9L,
|
||||
new InboundMeasurementRequests.CreateWeightResultRequest(
|
||||
@@ -263,6 +272,29 @@ class InboundMeasurementServiceTest {
|
||||
verify(repository, never()).insertWeight(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
void detailUsesStoredPalletSnapshotAfterCandidateBecomesUnavailable() {
|
||||
InboundOrderEntity inbound = inbound("WAIT_SPLIT");
|
||||
InboundWeightResultEntity historical = weight(50L, "30.000", "KG", "CONFIRMED", 2);
|
||||
historical.setPalletCode("HISTORICAL-501");
|
||||
historical.setPalletType("LEGACY-STANDARD");
|
||||
historical.setPalletTareWeightKg(new BigDecimal("18.500"));
|
||||
historical.setGrossWeightKg(new BigDecimal("30.000"));
|
||||
historical.setNetWeightKg(new BigDecimal("11.500"));
|
||||
when(repository.findInbound(1L, 10L)).thenReturn(inbound);
|
||||
when(repository.listWeights(1L, 10L)).thenReturn(List.of(historical));
|
||||
|
||||
InboundMeasurementResponses.Detail result = service.detail(1L, 10L);
|
||||
|
||||
assertThat(result.weightResults()).singleElement().satisfies(weight -> {
|
||||
assertThat(weight.palletCode()).isEqualTo("HISTORICAL-501");
|
||||
assertThat(weight.palletType()).isEqualTo("LEGACY-STANDARD");
|
||||
assertThat(weight.palletTareWeightKg()).isEqualByComparingTo("18.500");
|
||||
});
|
||||
verify(warehousePallets, never()).palletSnapshot(any(), anyLong(), anyLong());
|
||||
verify(warehousePallets, never()).palletSnapshots(any(), anyLong(), anyLong(), anyLong(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
void confirmingLbWeightConvertsToKgAndRecalculatesOnlyConfirmedImages() {
|
||||
InboundOrderEntity inbound = inbound("WAIT_MEASURE");
|
||||
|
||||
Reference in New Issue
Block a user