提交
This commit is contained in:
+2
-1
@@ -99,7 +99,8 @@ public class PlatformWarehouseController {
|
||||
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Platform access required / 需要平台端权限")
|
||||
})
|
||||
@GetMapping
|
||||
@PreAuthorize("hasAuthority('" + OverseasWarehousePermissions.WAREHOUSE_LIST + "')")
|
||||
@PreAuthorize("hasAnyAuthority('" + OverseasWarehousePermissions.WAREHOUSE_LIST + "', '"
|
||||
+ OverseasWarehousePermissions.PALLET_LIST + "', '" + OverseasWarehousePermissions.LOCATION_LIST + "')")
|
||||
public ApiResponse<PageResult<WarehouseEntity>> page(
|
||||
@AuthenticationPrincipal AuthenticatedUser user,
|
||||
@Valid WarehouseRequests.QueryRequest request) {
|
||||
|
||||
+7
-1
@@ -22,8 +22,14 @@ public final class PalletRequests {
|
||||
@NotNull @DecimalMin("0.00") BigDecimal unitPrice,
|
||||
@NotBlank String status,
|
||||
Long locationId,
|
||||
@Size(max = 500) String remark
|
||||
@Size(max = 500) String remark,
|
||||
@Size(max = 128) String fbaWarehouseCode
|
||||
) {
|
||||
public SaveRequest(String palletCode, String palletType, BigDecimal capacityCbm,
|
||||
BigDecimal unitPrice, String status, Long locationId, String remark) {
|
||||
this(palletCode, palletType, capacityCbm, unitPrice, status, locationId, remark, null);
|
||||
}
|
||||
|
||||
public SaveRequest {
|
||||
if (capacityCbm == null) capacityCbm = DEFAULT_CAPACITY;
|
||||
}
|
||||
|
||||
+1
@@ -24,4 +24,5 @@ public class WarehousePalletEntity extends BaseEntity {
|
||||
private BigDecimal unitPrice;
|
||||
private String status;
|
||||
private String remark;
|
||||
private String fbaWarehouseCode;
|
||||
}
|
||||
|
||||
+1
@@ -276,6 +276,7 @@ public class WarehouseResourceService {
|
||||
entity.setUnitPrice(request.unitPrice());
|
||||
entity.setStatus(request.status());
|
||||
entity.setRemark(request.remark());
|
||||
entity.setFbaWarehouseCode(request.fbaWarehouseCode());
|
||||
return entity;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS wh_pallet (
|
||||
unit_price DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '托盘单价',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'IDLE' COMMENT '托盘状态:IDLE闲置、OCCUPIED占用、SCRAPPED废弃',
|
||||
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
||||
fba_warehouse_code VARCHAR(128) DEFAULT NULL COMMENT '所属FBA仓编码',
|
||||
created_by BIGINT UNSIGNED DEFAULT NULL COMMENT '创建人ID',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||||
updated_by BIGINT UNSIGNED DEFAULT NULL COMMENT '最后修改人ID',
|
||||
@@ -49,6 +50,14 @@ CREATE TABLE IF NOT EXISTS wh_pallet (
|
||||
KEY idx_pallet_location (customer_id, warehouse_id, location_id, deleted)
|
||||
) ENGINE=InnoDB COMMENT='仓库托盘表:按租户和仓库维护托盘、容量、单价及状态';
|
||||
|
||||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
|
||||
AND table_name='wh_pallet' AND column_name='fba_warehouse_code'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE wh_pallet ADD COLUMN fba_warehouse_code VARCHAR(128) NULL COMMENT ''所属FBA仓编码'' AFTER remark'));
|
||||
PREPARE pallet_fba_warehouse_stmt FROM @ddl;
|
||||
EXECUTE pallet_fba_warehouse_stmt;
|
||||
DEALLOCATE PREPARE pallet_fba_warehouse_stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS wh_resource_lock (
|
||||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID',
|
||||
customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户租户ID',
|
||||
@@ -193,6 +202,7 @@ ALTER TABLE wh_pallet
|
||||
MODIFY COLUMN unit_price DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '托盘单价',
|
||||
MODIFY COLUMN status VARCHAR(20) NOT NULL DEFAULT 'IDLE' COMMENT '托盘状态:IDLE闲置、OCCUPIED占用、SCRAPPED废弃',
|
||||
MODIFY COLUMN remark VARCHAR(500) NULL COMMENT '备注',
|
||||
MODIFY COLUMN fba_warehouse_code VARCHAR(128) NULL COMMENT '所属FBA仓编码',
|
||||
MODIFY COLUMN created_by BIGINT UNSIGNED NULL COMMENT '创建人ID',
|
||||
MODIFY COLUMN created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||||
MODIFY COLUMN updated_by BIGINT UNSIGNED NULL COMMENT '最后修改人ID',
|
||||
|
||||
+14
@@ -3,8 +3,10 @@ package com.baiyue.warehouse.controller;
|
||||
import com.baiyue.common.core.api.PageResult;
|
||||
import com.baiyue.common.security.AuthenticatedUser;
|
||||
import com.baiyue.warehouse.dto.WarehouseRequests;
|
||||
import com.baiyue.warehouse.security.OverseasWarehousePermissions;
|
||||
import com.baiyue.warehouse.service.WarehouseApplicationService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
|
||||
import java.util.List;
|
||||
@@ -13,8 +15,20 @@ import java.util.Set;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
class PlatformWarehouseControllerTest {
|
||||
@Test
|
||||
void platformPageAllowsWarehousePalletAndLocationListAuthorities() throws Exception {
|
||||
PreAuthorize preAuthorize = PlatformWarehouseController.class
|
||||
.getMethod("page", AuthenticatedUser.class, WarehouseRequests.QueryRequest.class)
|
||||
.getAnnotation(PreAuthorize.class);
|
||||
|
||||
assertEquals("hasAnyAuthority('" + OverseasWarehousePermissions.WAREHOUSE_LIST + "', '"
|
||||
+ OverseasWarehousePermissions.PALLET_LIST + "', '" + OverseasWarehousePermissions.LOCATION_LIST + "')",
|
||||
preAuthorize.value());
|
||||
}
|
||||
|
||||
@Test
|
||||
void platformPageQueriesAllWarehousesWithoutCustomerId() {
|
||||
WarehouseApplicationService service = mock(WarehouseApplicationService.class);
|
||||
|
||||
+38
@@ -267,6 +267,44 @@ class WarehouseResourceServiceTest {
|
||||
.hasMessageContaining("cannot be reused");
|
||||
}
|
||||
|
||||
@Test
|
||||
void updatePalletChangesCodeAndFbaWarehouseCode() {
|
||||
when(repository.warehouseOwned(TENANT, WAREHOUSE)).thenReturn(true);
|
||||
WarehousePalletEntity existing = new WarehousePalletEntity();
|
||||
existing.setId(40003L);
|
||||
existing.setPalletCode("PLT-OLD");
|
||||
existing.setStatus("IDLE");
|
||||
when(repository.findPallet(TENANT, WAREHOUSE, 40003L)).thenReturn(existing);
|
||||
|
||||
service.updatePallet(TENANT, WAREHOUSE, 40003L,
|
||||
new PalletRequests.SaveRequest("PLT-NEW", "WOOD", new BigDecimal("2.5000"),
|
||||
new BigDecimal("25.00"), "IDLE", null, "updated", "ONT8"));
|
||||
|
||||
ArgumentCaptor<WarehousePalletEntity> captor = ArgumentCaptor.forClass(WarehousePalletEntity.class);
|
||||
verify(repository).palletCodeExists(TENANT, WAREHOUSE, "PLT-NEW", 40003L);
|
||||
verify(repository).updatePallet(captor.capture());
|
||||
assertThat(captor.getValue().getPalletCode()).isEqualTo("PLT-NEW");
|
||||
assertThat(captor.getValue().getFbaWarehouseCode()).isEqualTo("ONT8");
|
||||
}
|
||||
|
||||
@Test
|
||||
void updatePalletRejectsDuplicateCodeInSameWarehouse() {
|
||||
when(repository.warehouseOwned(TENANT, WAREHOUSE)).thenReturn(true);
|
||||
WarehousePalletEntity existing = new WarehousePalletEntity();
|
||||
existing.setId(40004L);
|
||||
existing.setPalletCode("PLT-OLD");
|
||||
existing.setStatus("IDLE");
|
||||
when(repository.findPallet(TENANT, WAREHOUSE, 40004L)).thenReturn(existing);
|
||||
when(repository.palletCodeExists(TENANT, WAREHOUSE, "PLT-DUP", 40004L)).thenReturn(true);
|
||||
|
||||
assertThatThrownBy(() -> service.updatePallet(TENANT, WAREHOUSE, 40004L,
|
||||
new PalletRequests.SaveRequest("PLT-DUP", "WOOD", BigDecimal.ONE,
|
||||
BigDecimal.ONE, "IDLE", null, null, "ONT8")))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("托盘编码已存在");
|
||||
verify(repository, never()).updatePallet(org.mockito.ArgumentMatchers.any());
|
||||
}
|
||||
|
||||
private static WarehouseEntity warehouse() {
|
||||
WarehouseEntity warehouse = new WarehouseEntity();
|
||||
warehouse.setId(WAREHOUSE);
|
||||
|
||||
Reference in New Issue
Block a user