-- Desc: 减少锁定库存，增加销量 -用于订单支付成功
--订单支付成功，增加销量
local params = {}
-- 用于批量获取sku库存信息的key集合
local mgetSkuKeys = {}

-- skuId列表 去重后的sku数据
local skuIdSet = {}

local result = ""
local skuCheck = {}
-- 检验库存信息 这里的key是
-- 入参 KEYS 订单id_仓库id_skuId_lockNum   订单id_仓库id_skuId_lockNum...
for index,paramStr in ipairs(KEYS) do
    local param = {}

    for value in string.gmatch(paramStr, "%d+") do
        table.insert(param, value)
    end
    table.insert(params, param)
    -- key 仓库id_skuId
    local key = "tmerclub_product:sku_sock:".. param[2].."_"..param[3]
    if skuCheck[param[3]] == nil then
        table.insert(mgetSkuKeys, key)
        table.insert(skuIdSet, param[3])
        skuCheck[param[3]] = true
        --result = result.."sku:"..param[3]..","
    end
end
skuCheck = nil

-- 下面通过mget获取所有key的值，call后面是可变长参数，unpack是将数组变成可变长参数
local skuStr = redis.call('mget', unpack(mgetSkuKeys));
-- 用于批量设置sku库存信息的key和value集合
local skuMap = {}
for i = 1,#skuIdSet do
    local skuId = skuIdSet[i]
    local skuNum = {}
    local skuData = tostring(skuStr[i])
    --result = result.."skuId:"..skuId..tostring(skuData)..","
    if skuData ~= 'false' and skuData ~= 'nil' and skuData ~= '' then
        for data in string.gmatch(skuData, "%d+") do
            table.insert(skuNum, data)
        end
        skuMap[skuId] = skuNum
    end
end
skuIdSet = nil

local msetSkuKV = {}
--按照订单来计算sku解锁的数据
for i = 1,#params do
    -- 订单id_仓库id_skuId_lockNum
    local param = params[i]

    -- 删除锁定标记
    -- key-订单id_仓库id_skuId
    local isDelete = redis.call('del',"tmerclub_product:order_sku_lock:"..param[1].."_"..param[2].."_"..param[3])
    -- 删除锁定标记成功再添加销量，让方法幂等
    if isDelete ~= 0 then
        -- 扣除sku的锁定库存，增加可售库存 ----- 可售数量_锁定数量_已售数量
        local skuNum = skuMap[param[3]]
        local lockNum = tonumber(param[4])
        -- 修改sku库存记录
        -- 增加销量
        skuNum[3] = tonumber(skuNum[3]) + lockNum
        -- 减少锁定
        skuNum[2] = tonumber(skuNum[2]) - lockNum
        skuMap[param[3]] = skuNum
    end
end

-- sku库存数据计算完成后，拼接mset更新的key和value
for skuId,skuNum in pairs(skuMap) do
    -- mset key 目前的仓库id都是0，所以这个可以直接写死，后面有多个仓库时，把key替换为:skuId+仓库id 的方式即可
    table.insert(msetSkuKV, "tmerclub_product:sku_sock:".."0".."_"..skuId)
    -- mset value 可售数量_锁定数量_已售数量
    table.insert(msetSkuKV, skuNum[1].."_"..skuNum[2].."_"..skuNum[3].."_"..skuNum[4])

    -- skuId_当前sku库存_仓库id_销量,skuId_当前sku库存_仓库id_销量...
    result = result..skuId.."_"..skuNum[1].."_"..skuNum[2].."_"..skuNum[3]..","
end

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

return result
