库存仓库和推荐仓库进行匹配简单算法

概述


通常在电商项目的库存项目中,每条库存记录都有一个对应的仓库字段,warehouse,同一个商品可能在多个仓库中都存在的。假设用户添加一个商品sku1到购物车中,这个sku1在warehouse1和warehouse2都存在,这个时候到底要扣减哪个仓库中的库存呢?

这里有个仓库优先级的概念,一般来说,会有专门的系统来决定仓库扣减的优先级。假设这个专门的系统叫SystemB,我们只需要传入一个用户的地址信息进去,SystemB就会给出一个具备优先级顺序的仓库列表,根据这个列表和库存记录中的仓库进行匹配,就可以知道从哪个仓库中扣减了。

仓库一般有大仓库和小仓库之分,一般来说都是从大仓来扣减库存的,但是为了优化配送速度,会在用户所在城市中建立一些小仓库。一个大仓库可以对应多个小仓库。库存记录中一定有来自大仓的,未必有来自小仓的。但是有了小仓的库存记录,一定有与之对应的大仓库存记录的。


仓库匹配算法简单代码


仓库匹配需求大概如下:
1、SystemB没有给出任何仓库信息,则默认扣减大仓中的库存;
2、SystemB给出了错误的仓库信息(也即是没有跟库存的仓库匹配到的),则也是扣减大仓库的;
3、SystemB只是给出小仓信息,而库存中有大小仓,那么当库存不足的时候,可以同时扣减两个仓库的库存;
4、SystemB只是给出了大仓信息,而库存中有大小仓,那么就扣减大仓的库存。

代码如下:

public class Stock {

    /**
     * 库存id
     */
    private Long stockId;

    /**
     * 剩余库存数量
     */
    private Integer leavingNum;

    /**
     * 仓库 
     */
    private String warehouse;

    /**
     * 仓库 标志,用来表示是大仓还是小仓
     */
    private String warehouseFlag;

    public Integer getLeavingNum() {
        return leavingNum;
    }

    public void setLeavingNum(Integer leavingNum) {
        this.leavingNum = leavingNum;
    }

    public Long getStockId() {
        return stockId;
    }

    public void setStockId(Long stockId) {
        this.stockId = stockId;
    }

    public String getWarehouse() {
        return warehouse;
    }

    public void setWarehouse(String warehouse) {
        this.warehouse = warehouse;
    }

    public String getWarehouseFlag() {
        return warehouseFlag;
    }

    public void setWarehouseFlag(String warehouseFlag) {
        this.warehouseFlag = warehouseFlag;
    }
public class WarehouseMatchTest {

    public static void main(String[] args) {
        List systemBWarehouseList = new ArrayList<>();
        //华南大仓库
        String warehouse1 = "HN";
        //广州小仓库
        String warehouse2 = "GZ";

        //先添加warehouse1,表示优先扣减华南大仓库中的库存
        systemBWarehouseList.add(warehouse1);
        systemBWarehouseList.add(warehouse2);

        List stockWarehouseList = new ArrayList<>();
        Stock stock = new Stock();
        //华南大仓库
        stock.setWarehouse("HN");
        stock.setWarehouseFlag("1");

        stockWarehouseList.add(stock);

        List resultList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(systemBWarehouseList) && CollectionUtils.isNotEmpty(systemBWarehouseList)) {
            //优先遍历systemBWarehouseList
            for (String systemWarehouse : systemBWarehouseList) {
                for (Stock ele : stockWarehouseList) {
                    if (StringUtils.isNotBlank(ele.getWarehouse()) && StringUtils.isNotBlank(systemWarehouse)) {
                        if (ele.getWarehouse().equals(systemWarehouse)) {
                            resultList.add(ele.getWarehouse());
                            break;
                        }
                    }
                }
            }
        }

        // 追加大仓
        for (Stock ele : stockWarehouseList) {
            //大仓
            if ("1".equals(ele.getWarehouseFlag())) {
                if (!resultList.contains(ele.getWarehouse())) {
                    resultList.add(ele.getWarehouse());
                }
                break;
            }
        }

        System.out.println(JSON.toJSONString(resultList));
    }
}

你可能感兴趣的:(互联网技术经验累积,#,JAVA)