| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- ---
- --- 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
|