提交
This commit is contained in:
+9
@@ -6,6 +6,8 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface InventoryCommandMapper {
|
||||
@Select("SELECT * FROM ll_inventory_position WHERE id=#{positionId} LIMIT 1")
|
||||
@@ -22,4 +24,11 @@ public interface InventoryCommandMapper {
|
||||
@Select("SELECT COALESCE(SUM(available_packages+hold_packages+allocated_packages+picked_packages+receiving_packages),0) " +
|
||||
"FROM ll_inventory_position WHERE customer_id=#{customerId} AND pallet_id=#{palletId}")
|
||||
long palletPackages(@Param("customerId") String customerId, @Param("palletId") Long palletId);
|
||||
|
||||
@Select("SELECT * FROM ll_inventory_balance WHERE customer_id=#{customerId} " +
|
||||
"AND inbound_order_id=#{inboundOrderId} AND inbound_code=#{inboundCode} " +
|
||||
"AND in_transit_packages>0 ORDER BY id FOR UPDATE")
|
||||
List<InventoryBalance> lockInboundTransitBalances(@Param("customerId") String customerId,
|
||||
@Param("inboundOrderId") Long inboundOrderId,
|
||||
@Param("inboundCode") String inboundCode);
|
||||
}
|
||||
|
||||
+32
-2
@@ -27,6 +27,7 @@ import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HexFormat;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class InventoryCommandService {
|
||||
@@ -60,6 +61,8 @@ public class InventoryCommandService {
|
||||
public InventoryCommandResponse stockIn(String customerId, String operatorId,
|
||||
InventoryCommandRequests.StockIn request) {
|
||||
return execute(customerId, operatorId, "STOCK_IN", request.idempotencyKey(), request, operation -> {
|
||||
List<InventoryBalance> transitBalances = commands.lockInboundTransitBalances(customerId,
|
||||
request.inboundOrderId(), request.inboundCode());
|
||||
InventoryBalance balance = balance(customerId, request);
|
||||
InventoryPosition position = position(customerId, balance, request);
|
||||
long before = value(position.getAvailablePackages());
|
||||
@@ -69,8 +72,8 @@ public class InventoryCommandService {
|
||||
position.setUpdatedAt(LocalDateTime.now());
|
||||
positions.updateById(position);
|
||||
|
||||
long transferred = Math.min(value(balance.getInTransitPackages()), request.packages());
|
||||
balance.setInTransitPackages(value(balance.getInTransitPackages()) - transferred);
|
||||
long transferred = transferInTransit(customerId, operatorId, operation.getId(), balance,
|
||||
transitBalances, request);
|
||||
balance.setAvailablePackages(value(balance.getAvailablePackages()) + request.packages());
|
||||
touch(balance);
|
||||
balances.updateById(balance);
|
||||
@@ -83,6 +86,33 @@ public class InventoryCommandService {
|
||||
});
|
||||
}
|
||||
|
||||
private long transferInTransit(String customerId, String operatorId, Long operationId,
|
||||
InventoryBalance target, List<InventoryBalance> sources,
|
||||
InventoryCommandRequests.StockIn request) {
|
||||
long pending = request.packages();
|
||||
long transferred = 0;
|
||||
for (InventoryBalance source : sources) {
|
||||
if (pending == 0) break;
|
||||
boolean targetDimension = source.getId().equals(target.getId());
|
||||
long sourceBefore = value(targetDimension ? target.getInTransitPackages() : source.getInTransitPackages());
|
||||
long moved = Math.min(sourceBefore, pending);
|
||||
if (moved == 0) continue;
|
||||
if (targetDimension) target.setInTransitPackages(sourceBefore - moved);
|
||||
else source.setInTransitPackages(sourceBefore - moved);
|
||||
transferred += moved;
|
||||
pending -= moved;
|
||||
if (targetDimension) continue;
|
||||
touch(source);
|
||||
balances.updateById(source);
|
||||
ledger(customerId, operatorId, operationId, source, null, sku(request.skuCode()),
|
||||
"STOCK_IN_TRANSIT_RELEASE", "IN_TRANSIT", "STOCK_IN", sourceBefore, -moved,
|
||||
sourceBefore - moved, request.businessOrderNo(), request.inboundOrderNo(), null,
|
||||
request.sourceEventId(), request.idempotencyKey() + ":TRANSIT:" + source.getId(),
|
||||
"In-transit inventory transferred to overseas warehouse " + target.getOverseasWarehouseId());
|
||||
}
|
||||
return transferred;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public InventoryCommandResponse hold(String customerId, String operatorId, InventoryCommandRequests.Move request) {
|
||||
return move(customerId, operatorId, "HOLD", Bucket.AVAILABLE, Bucket.HOLD, request);
|
||||
|
||||
Reference in New Issue
Block a user