概述
在做电商项目的时候,会涉及到库存扣减的问题,稍微复杂的情况是,多仓库库存扣减,比如说:
仓库warehouse1有4件商品,warehouse2有3件商品,这个时候用户需要买7件商品,这样无论哪个仓库都不够扣减,
这种情况下,会使用多仓库库存扣减的逻辑,warehouse1和warehouse2两个仓库的库存之和是3+4=7,是足够扣减6件的。
好了,当使用多仓扣减的时候,用户突然不想买6件了,只想买3件,这个时候需要释放3件库存,这里也需要一个简单的多仓库库存释放的算法.
简单代码
public class StockHold {
private Long holdId;
/**
* 对应的库存id
*/
private Long stockId;
/**
* 占用的库存 数量
*/
private Integer holdNum;
public Long getHoldId() {
return holdId;
}
public void setHoldId(Long holdId) {
this.holdId = holdId;
}
public Long getStockId() {
return stockId;
}
public void setStockId(Long stockId) {
this.stockId = stockId;
}
public Integer getHoldNum() {
return holdNum;
}
public void setHoldNum(Integer holdNum) {
this.holdNum = holdNum;
}
}
public class InvReleaseTest {
public static void main(String[] args) {
List<StockHold> holdList = new ArrayList<>();
StockHold hold1 = new StockHold();
hold1.setHoldId(1L);
hold1.setStockId(1L);
hold1.setHoldNum(4);
StockHold hold2 = new StockHold();
hold2.setHoldId(2L);
hold2.setStockId(2L);
hold2.setHoldNum(2);
holdList.add(hold1);
holdList.add(hold2);
LinkedHashMap<Long, Integer> holdIdNumMap = new LinkedHashMap<>();
int needReleaseSumNum = 3;
for (StockHold hold : holdList) {
if (needReleaseSumNum <= 0) {
break;
}
int releaseNum = Math.min(needReleaseSumNum,hold.getHoldNum());
needReleaseSumNum -= releaseNum;
holdIdNumMap.put(hold.getHoldId(), releaseNum);
}
System.out.println(JSON.toJSONString(holdIdNumMap));
}
}
释放的逻辑需要考虑哪个仓库足够释放,如果两个仓库都不足够释放,还得考虑两个仓一起释放库存,上面的逻辑也考虑了这一点.
StockHold表示用户原来的库存占用情况.