--- --- Generated by EmmyLua(https://github.com/EmmyLua) --- Created by 81460. --- DateTime: 2020-01-13 16:08 --- 批量操作物料库存数量 --- 前提条件 --- 1、不允许一个进销存单据明细中同一种物料有不同的库房库位,如果需要做不同的库房库位操作,可以先做库存转移,然后在入库或者出库 --- 2、numKey为一个hash表,用于存储所有的物料的 numField的当前数量,numField可以用库房+库位字符串来区分 --- 4、计算逻辑只是简单的先判断传入的每个物料的当前数量是否大于需要增减的数量(减少数量传入负值即可),全部都符合条件则进行增减 --- 5、增减物料数量 --- 6、传进来的数据明细为正常的list转json即可 --- 7、传进来的数据明细对象为RedisStockCalcItem,输出对象为RedisStockCalcInfo ---[ --- --- { --- "name":"Porsche", --- "stock": 11.1 --- }, --- { --- "name":"BMW" --- }, --- { --- "name":"Volvo" --- } ---] ---Result返回对象为json ---Result.error = 0表示无措 ---Result.errorMsg 表示错误信息 --- --- local key = KEYS[1] local jsonData = ARGV[2] local jsonCheckData = ARGV[1] local material = cjson.decode(jsonData) local checkMaterial = cjson.decode(jsonCheckData) local result = {} result['error'] = 0 result['errorMsg'] = '' --- 检查能否减少数量 for k, v in pairs(checkMaterial) do local numName = v['numName'] local numKey = v['numKey'] local numField = v['numField'] local nowNum = tonumber(redis.call('HGET', numKey, numField)) if (nowNum == nil) then nowNum = 0; end local incrNum = v['incrNum'] if ((nowNum == nil or nowNum <= 0) and (incrNum < 0)) then result['error'] = 1 result['errorMsg'] = numName .. '数量不足' break ; end if (nowNum + incrNum) < 0 then result['error'] = 1 result['errorMsg'] = numName .. '数量不足' break ; end local idToStockRoom = v['idToStockRoom'] if (idToStockRoom > 0) then --- 判断目标库存 local numToField = v['numToField'] local numToName = v['numToName'] local nowToNum = tonumber(redis.call('HGET', numKey, numToField)) if (nowToNum == nil) then nowToNum = 0; end local incrToNum = v['incrToNum'] if ((nowToNum == nil or nowToNum <= 0) and (incrToNum < 0)) then result['error'] = 1 result['errorMsg'] = numToName .. '数量不足' break ; end if (nowToNum + incrToNum) < 0 then result['error'] = 1 result['errorMsg'] = numToName .. '数量不足' break ; end end end local currIndex2 = 1 local stock = {} if (result['error'] == 0) then --数量都够,可以操作 for k, v in pairs(material) do local numKey = v['numKey'] local numField = v['numField'] local incrNum = v['incrNum'] ---local storeKey = v['storeKey'] ---local storeField = v['storeField'] stock[currIndex2] = {} stock[currIndex2]['idCompany'] = v['idCompany']; stock[currIndex2]['idToCompany'] = v['idToCompany']; stock[currIndex2]['idMaterial'] = v['idMaterial']; stock[currIndex2]['materialFlag'] = v['materialFlag']; stock[currIndex2]['qtyPrecise'] = v['qtyPrecise']; stock[currIndex2]['idStockRoom'] = v['idStockRoom']; local iExists = redis.call("HEXISTS", numKey, numField); if (iExists == 0) then stock[currIndex2]['insert'] = 1 else stock[currIndex2]['insert'] = 0 end local afterNum = redis.call("HINCRBY", numKey, numField, incrNum) stock[currIndex2]['beforeStock'] = afterNum - incrNum stock[currIndex2]['afterStock'] = afterNum stock[currIndex2]['stockNum'] = incrNum if (v['idCompany'] > 0) then local iCompanyExists = redis.call("HEXISTS", numKey, v['companyField']); if (iCompanyExists == 0) then stock[currIndex2]['companyInsert'] = 1 else stock[currIndex2]['companyInsert'] = 0 end local companyAfterNum = redis.call("HINCRBY", numKey, v['companyField'], incrNum) stock[currIndex2]['companyBeforeStock'] = companyAfterNum - incrNum stock[currIndex2]['companyAfterStock'] = companyAfterNum stock[currIndex2]['companyStockNum'] = incrNum else stock[currIndex2]['companyInsert'] = -1 end local idToStockRoom = v['idToStockRoom'] if (idToStockRoom > 0) then local numToField = v['numToField'] local incrToNum = v['incrToNum'] stock[currIndex2]['idToStockRoom'] = v['idToStockRoom']; local iToExists = redis.call("HEXISTS", numKey, numToField); if (iToExists == 0) then stock[currIndex2]['toInsert'] = 1 else stock[currIndex2]['toInsert'] = 0 end local afterToNum = redis.call("HINCRBY", numKey, numToField, incrToNum) stock[currIndex2]['toBeforeStock'] = afterToNum - incrToNum stock[currIndex2]['toAfterStock'] = afterToNum stock[currIndex2]['toStockNum'] = incrToNum if (v['idToCompany'] > 0) then local iToCompanyExists = redis.call("HEXISTS", numKey, v['companyToField']); if (iToCompanyExists == 0) then stock[currIndex2]['toCompanyInsert'] = 1 else stock[currIndex2]['toCompanyInsert'] = 0 end local toCompanyAfterNum = redis.call("HINCRBY", numKey, v['companyToField'], incrToNum) stock[currIndex2]['toCompanyBeforeStock'] = toCompanyAfterNum - incrToNum stock[currIndex2]['toCompanyAfterStock'] = toCompanyAfterNum stock[currIndex2]['toCompanyStockNum'] = incrToNum else stock[currIndex2]['toCompanyInsert'] = -1 end end ---stock[currIndex2]['insert'] = redis.call("HSET", storeKey, storeField, afterNum) currIndex2 = currIndex2 + 1 end end local time = redis.call('TIME') result['time'] = time[1] result['microseconds'] = time[2] result['stockList'] = stock local re = cjson.encode(result); return re