feat: gate overseas receiving and harden phase4 workflows

This commit is contained in:
2026-08-25 10:31:04 +08:00
parent cb78bc6b41
commit 52b9fc382f
93 changed files with 2779 additions and 201 deletions
@@ -5,6 +5,7 @@ import com.baiyue.warehouse.dto.WarehouseResourceLockRequests;
import com.baiyue.warehouse.dto.WarehouseResourceLockResponse;
import com.baiyue.warehouse.dto.WarehousePalletScrapResponse;
import com.baiyue.warehouse.dto.SharedWarehouseReference;
import com.baiyue.warehouse.dto.WarehouseLocationResolveResponse;
import com.baiyue.warehouse.entity.WarehouseLocationEntity;
import com.baiyue.warehouse.security.InternalServiceTokenGuard;
import com.baiyue.warehouse.service.WarehouseResourceLockService;
@@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -79,4 +81,20 @@ public class InternalWarehouseResourceLockController {
tokenGuard.verify(token);
return ApiResponse.success(warehouses.activeSharedReference(warehouseId));
}
@GetMapping("/locations/resolve/{locationCode}")
public ApiResponse<WarehouseLocationResolveResponse> resolveLocation(
@RequestHeader(value = "X-Internal-Service-Token", required = false) String token,
@RequestParam long warehouseId, @PathVariable String locationCode) {
tokenGuard.verify(token);
return ApiResponse.success(resourceService.resolvePublicLocation(warehouseId, locationCode));
}
@GetMapping("/locations/{locationId}")
public ApiResponse<WarehouseLocationResolveResponse> location(
@RequestHeader(value = "X-Internal-Service-Token", required = false) String token,
@RequestParam long warehouseId, @PathVariable long locationId) {
tokenGuard.verify(token);
return ApiResponse.success(resourceService.resolvePublicLocation(warehouseId, locationId));
}
}
@@ -0,0 +1,6 @@
package com.baiyue.warehouse.dto;
import java.math.BigDecimal;
public record WarehouseLocationResolveResponse(long locationId, String locationCode, String locationType,
BigDecimal maxLoadKg, String status) { }
@@ -6,6 +6,7 @@ import com.baiyue.common.core.exception.BizException;
import com.baiyue.warehouse.dto.LocationRequests;
import com.baiyue.warehouse.dto.PalletRequests;
import com.baiyue.warehouse.dto.WarehousePalletResolveResponse;
import com.baiyue.warehouse.dto.WarehouseLocationResolveResponse;
import com.baiyue.warehouse.entity.WarehouseLocationEntity;
import com.baiyue.warehouse.entity.WarehousePalletEntity;
import com.baiyue.warehouse.entity.WarehouseEntity;
@@ -191,6 +192,25 @@ public class WarehouseResourceService {
pallet.getVersion() == null ? 0 : pallet.getVersion());
}
public WarehouseLocationResolveResponse resolvePublicLocation(long warehouseId, String locationCode) {
if (!StringUtils.hasText(locationCode)) throw new BizException(ResultCode.BAD_REQUEST, "库位码不能为空");
WarehouseLocationEntity location = repository.findLocationByCode(PUBLIC_RESOURCE_SCOPE, warehouseId,
locationCode.trim());
if (location == null) throw new BizException(ResultCode.NOT_FOUND, "库位码不存在或不属于当前仓库");
return locationReference(location);
}
public WarehouseLocationResolveResponse resolvePublicLocation(long warehouseId, long locationId) {
WarehouseLocationEntity location = repository.findLocation(PUBLIC_RESOURCE_SCOPE, warehouseId, locationId);
if (location == null) throw new BizException(ResultCode.NOT_FOUND, "库位不存在或不属于当前仓库");
return locationReference(location);
}
private static WarehouseLocationResolveResponse locationReference(WarehouseLocationEntity location) {
return new WarehouseLocationResolveResponse(location.getId(), location.getLocationCode(),
location.getLocationType(), location.getMaxLoadKg(), location.getStatus());
}
public PageResult<WarehousePalletEntity> pallets(long customerId, long warehouseId,
PalletRequests.QueryRequest query) {
requireWarehouse(customerId, warehouseId);