-- Desc: 减少销量，增加可售库存 -用于订单退款还原库存
-- 传入的数据格式,对于redis来说,lua是原子性的,有事务的
local params = {}
-- 用于批量获取sku库存信息的key集合
local mgetSkuKeys = {}
-- sku键数组
local skuKey = {}

-- 步骤一    入参 KEYS skuId_退款数量_库存id   订单id_仓库id_skuId_lockNum...
for index, paramStr in ipairs(KEYS) do
    -- {skuId, 退款数量, 库存id}
    local param = {}
    for value in string.gmatch(paramStr, "%d+") do
        table.insert(param, value)
    end
    table.insert(params, param)

    -- 避免一个sku同时进行多个操作时，查询和计算的库存数据操作，所以这里要对区域库存和总库存的key去重
    local key = param[1].."_"..param[3]
    local skuId = tonumber(param[1])
    local notExistsKey = true
    local notExistsSku = true
    for index, value in ipairs(skuKey) do
        if not notExistsKey and not notExistsSku then break end
        if key == value then
            notExistsKey = false
        elseif skuId == value then
            notExistsSku = false
        end
    end
    -- 数组没有的sku数组再添加到数组，skuKey用于批量查询后的sku数据绑定
    if notExistsKey then
        -- sku区域库存key格式： key名称:skuId_仓库id
        table.insert(mgetSkuKeys, "tmerclub_product:sku_sock:"..key)
        table.insert(skuKey, key)
        --总库存去重
        if notExistsSku then
            -- sku总库存key格式： key名称:skuId
            table.insert(mgetSkuKeys, "tmerclub_product:sku_sock:"..param[1])
            -- 用数字类型区分总库存
            table.insert(skuKey, skuId)
        end
    end
end

-- 下面通过mget获取所有key的值，call后面是可变长参数，unpack是将数组变成可变长参数
local skuStr = redis.call('mget', unpack(mgetSkuKeys));

-- 拆分mget中获取到的sku库存信息。  skuStocks： map<skukey, sku库存数据>   skukey：区域库存=skuId_仓库id; 总库存=skuId
local skuStocks = {}
for index, key in ipairs(skuKey) do
    -- {可售库存数量, 锁定库存数量, 销量, sku库存状态}
    local skuStock = {}
    for value in string.gmatch(skuStr[index], "%d+") do
        table.insert(skuStock, tonumber(value))
    end
    -- sku库存列表
    skuStocks[key] = skuStock
end

local result = ""
--按照订单来还原库存
for i = 1,#params do
    -- skuId_refundNum(退货数量)_库存id
    local param = params[i]

    -- 可售库存数量_锁定库存数量_销量_sku库存状态
    local skuPointStock = skuStocks[param[1].."_"..param[3]]
    local skuStock = skuStocks[tonumber(param[1])]


    local refundNum = tonumber(param[2])
    --修改sku库存记录
    -- 减少销量数量
    skuPointStock[3] = tonumber(skuPointStock[3]) - refundNum
    skuStock[3] = tonumber(skuStock[3]) - refundNum
    -- 增加可售数量
    skuPointStock[1] = tonumber(skuPointStock[1]) + refundNum
    skuStock[1] = tonumber(skuStock[1]) + refundNum

    -- skuId_仓库id_可售库存_当前销量...
    result = result..param[1].."_"..param[3].."_"..skuPointStock[1].."_"..skuPointStock[3]..","
    result = result..param[1].."_0_"..skuPointStock[1].."_"..skuPointStock[3]..","
end


-- 用于批量设置sku库存信息的key和value集合
local msetSkuKV = {}
for index, key in ipairs(skuKey) do
    -- 库存信息 {可售库存数量, 锁定库存数量, 销量, sku库存状态}
    local skuStock = skuStocks[key]
    -- mset sku库存key   总库存格式：  key名称:skuId； 区域库存格式：  key名称:skuId_仓库id
    table.insert(msetSkuKV, "tmerclub_product:sku_sock:"..key)
    -- mset sku库存value   格式：  可售库存数量_锁定库存数量_销量_sku库存状态
    table.insert(msetSkuKV, skuStock[1].."_"..skuStock[2].."_"..skuStock[3].."_"..skuStock[4])
end

-- 修改回redis
redis.call('mset',unpack(msetSkuKV))


return result
