feat(lastleg): add direct inventory balance detail

This commit is contained in:
2026-09-08 18:47:15 +08:00
parent 6514634dcb
commit d42629d289
7 changed files with 184 additions and 0 deletions
@@ -56,6 +56,16 @@ public class InventoryQueryController {
return ApiResponse.success(service.balances(platformScope(user, customerId), query));
}
@GetMapping(BASE_PATH + "/balances/{balanceId}")
@PreAuthorize("hasAuthority('" + OverseasPermissions.INVENTORY_LIST + "')")
@Operation(summary = "Get one inventory balance", description = "Returns one non-zero inventory balance by ID and optional customer scope. Required authority: " + OverseasPermissions.INVENTORY_LIST)
public ApiResponse<InventoryBalanceView> balance(
@AuthenticationPrincipal AuthenticatedUser user,
@PathVariable long balanceId,
@RequestParam(required = false) String customerId) {
return ApiResponse.success(service.balance(platformScope(user, customerId), balanceId));
}
@GetMapping(BASE_PATH + "/balances/{balanceId}/positions")
@PreAuthorize("hasAuthority('" + OverseasPermissions.INVENTORY_LIST + "')")
@Operation(summary = "List pallet and batch positions for one inbound-order balance", description = "Required authority: " + OverseasPermissions.INVENTORY_LIST)
@@ -111,6 +111,17 @@ public interface InventoryQueryMapper {
@Select("SELECT * FROM ll_inventory_balance WHERE id=#{balanceId} LIMIT 1")
InventoryBalance findBalance(@Param("balanceId") long balanceId);
@Select("SELECT * FROM ll_inventory_balance WHERE customer_id=#{customerId} AND id=#{balanceId} " +
"AND (available_packages+hold_packages+allocated_packages+picked_packages+in_transit_packages+" +
"receiving_packages+procurement_packages)>0 LIMIT 1")
InventoryBalance ownedVisibleBalance(@Param("customerId") String customerId,
@Param("balanceId") long balanceId);
@Select("SELECT * FROM ll_inventory_balance WHERE id=#{balanceId} " +
"AND (available_packages+hold_packages+allocated_packages+picked_packages+in_transit_packages+" +
"receiving_packages+procurement_packages)>0 LIMIT 1")
InventoryBalance visibleBalance(@Param("balanceId") long balanceId);
String LEDGER_FILTER = " WHERE 1=1" +
"<if test='customerId != null and customerId != \"\"'> AND customer_id=#{customerId}</if>" +
"<if test='q.overseasWarehouseId != null and q.overseasWarehouseId != \"\"'> AND overseas_warehouse_id=#{q.overseasWarehouseId}</if>" +
@@ -57,6 +57,16 @@ public class InventoryQueryService {
return page(records, query.page(), query.size(), total);
}
public InventoryBalanceView balance(String customerId, long balanceId) {
InventoryBalance balance = customerId == null
? mapper.visibleBalance(balanceId)
: mapper.ownedVisibleBalance(customerId, balanceId);
if (balance == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Inventory balance not found");
}
return balanceView(balance);
}
public List<InventoryPositionView> positions(String customerId, long balanceId,
InventoryQueryRequests.PositionQuery query) {
validateStatus(query.inventoryStatus(), POSITION_STATUSES);