qty_stock_materials.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. ---
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by 81460.
  4. --- DateTime: 2020-01-13 16:08
  5. --- 批量操作物料库存数量
  6. --- 前提条件
  7. --- 1、不允许一个进销存单据明细中同一种物料有不同的库房库位,如果需要做不同的库房库位操作,可以先做库存转移,然后在入库或者出库
  8. --- 2、numKey为一个hash表,用于存储所有的物料的 numField的当前数量,numField可以用库房+库位字符串来区分
  9. --- 4、计算逻辑只是简单的先判断传入的每个物料的当前数量是否大于需要增减的数量(减少数量传入负值即可),全部都符合条件则进行增减
  10. --- 5、增减物料数量
  11. --- 6、传进来的数据明细为正常的list转json即可
  12. --- 7、传进来的数据明细对象为RedisStockCalcItem,输出对象为RedisStockCalcInfo
  13. ---[
  14. ---
  15. --- {
  16. --- "name":"Porsche",
  17. --- "stock": 11.1
  18. --- },
  19. --- {
  20. --- "name":"BMW"
  21. --- },
  22. --- {
  23. --- "name":"Volvo"
  24. --- }
  25. ---]
  26. ---Result返回对象为json
  27. ---Result.error = 0表示无措
  28. ---Result.errorMsg 表示错误信息
  29. ---
  30. ---
  31. local key = KEYS[1]
  32. local jsonData = ARGV[2]
  33. local jsonCheckData = ARGV[1]
  34. local material = cjson.decode(jsonData)
  35. local checkMaterial = cjson.decode(jsonCheckData)
  36. local result = {}
  37. result['error'] = 0
  38. result['errorMsg'] = ''
  39. --- 检查能否减少数量
  40. for k, v in pairs(checkMaterial) do
  41. local numName = v['numName']
  42. local numKey = v['numKey']
  43. local numField = v['numField']
  44. local nowNum = tonumber(redis.call('HGET', numKey, numField))
  45. if (nowNum == nil) then
  46. nowNum = 0;
  47. end
  48. local incrNum = v['incrNum']
  49. if ((nowNum == nil or nowNum <= 0) and (incrNum < 0)) then
  50. result['error'] = 1
  51. result['errorMsg'] = numName .. '数量不足'
  52. break ;
  53. end
  54. if (nowNum + incrNum) < 0 then
  55. result['error'] = 1
  56. result['errorMsg'] = numName .. '数量不足'
  57. break ;
  58. end
  59. local idToStockRoom = v['idToStockRoom']
  60. if (idToStockRoom > 0) then
  61. --- 判断目标库存
  62. local numToField = v['numToField']
  63. local numToName = v['numToName']
  64. local nowToNum = tonumber(redis.call('HGET', numKey, numToField))
  65. if (nowToNum == nil) then
  66. nowToNum = 0;
  67. end
  68. local incrToNum = v['incrToNum']
  69. if ((nowToNum == nil or nowToNum <= 0) and (incrToNum < 0)) then
  70. result['error'] = 1
  71. result['errorMsg'] = numToName .. '数量不足'
  72. break ;
  73. end
  74. if (nowToNum + incrToNum) < 0 then
  75. result['error'] = 1
  76. result['errorMsg'] = numToName .. '数量不足'
  77. break ;
  78. end
  79. end
  80. end
  81. local currIndex2 = 1
  82. local stock = {}
  83. if (result['error'] == 0) then
  84. --数量都够,可以操作
  85. for k, v in pairs(material) do
  86. local numKey = v['numKey']
  87. local numField = v['numField']
  88. local incrNum = v['incrNum']
  89. ---local storeKey = v['storeKey']
  90. ---local storeField = v['storeField']
  91. stock[currIndex2] = {}
  92. stock[currIndex2]['idCompany'] = v['idCompany'];
  93. stock[currIndex2]['idToCompany'] = v['idToCompany'];
  94. stock[currIndex2]['idMaterial'] = v['idMaterial'];
  95. stock[currIndex2]['materialFlag'] = v['materialFlag'];
  96. stock[currIndex2]['qtyPrecise'] = v['qtyPrecise'];
  97. stock[currIndex2]['idStockRoom'] = v['idStockRoom'];
  98. local iExists = redis.call("HEXISTS", numKey, numField);
  99. if (iExists == 0) then
  100. stock[currIndex2]['insert'] = 1
  101. else
  102. stock[currIndex2]['insert'] = 0
  103. end
  104. local afterNum = redis.call("HINCRBY", numKey, numField, incrNum)
  105. stock[currIndex2]['beforeStock'] = afterNum - incrNum
  106. stock[currIndex2]['afterStock'] = afterNum
  107. stock[currIndex2]['stockNum'] = incrNum
  108. if (v['idCompany'] > 0) then
  109. local iCompanyExists = redis.call("HEXISTS", numKey, v['companyField']);
  110. if (iCompanyExists == 0) then
  111. stock[currIndex2]['companyInsert'] = 1
  112. else
  113. stock[currIndex2]['companyInsert'] = 0
  114. end
  115. local companyAfterNum = redis.call("HINCRBY", numKey, v['companyField'], incrNum)
  116. stock[currIndex2]['companyBeforeStock'] = companyAfterNum - incrNum
  117. stock[currIndex2]['companyAfterStock'] = companyAfterNum
  118. stock[currIndex2]['companyStockNum'] = incrNum
  119. else
  120. stock[currIndex2]['companyInsert'] = -1
  121. end
  122. local idToStockRoom = v['idToStockRoom']
  123. if (idToStockRoom > 0) then
  124. local numToField = v['numToField']
  125. local incrToNum = v['incrToNum']
  126. stock[currIndex2]['idToStockRoom'] = v['idToStockRoom'];
  127. local iToExists = redis.call("HEXISTS", numKey, numToField);
  128. if (iToExists == 0) then
  129. stock[currIndex2]['toInsert'] = 1
  130. else
  131. stock[currIndex2]['toInsert'] = 0
  132. end
  133. local afterToNum = redis.call("HINCRBY", numKey, numToField, incrToNum)
  134. stock[currIndex2]['toBeforeStock'] = afterToNum - incrToNum
  135. stock[currIndex2]['toAfterStock'] = afterToNum
  136. stock[currIndex2]['toStockNum'] = incrToNum
  137. if (v['idToCompany'] > 0) then
  138. local iToCompanyExists = redis.call("HEXISTS", numKey, v['companyToField']);
  139. if (iToCompanyExists == 0) then
  140. stock[currIndex2]['toCompanyInsert'] = 1
  141. else
  142. stock[currIndex2]['toCompanyInsert'] = 0
  143. end
  144. local toCompanyAfterNum = redis.call("HINCRBY", numKey, v['companyToField'], incrToNum)
  145. stock[currIndex2]['toCompanyBeforeStock'] = toCompanyAfterNum - incrToNum
  146. stock[currIndex2]['toCompanyAfterStock'] = toCompanyAfterNum
  147. stock[currIndex2]['toCompanyStockNum'] = incrToNum
  148. else
  149. stock[currIndex2]['toCompanyInsert'] = -1
  150. end
  151. end
  152. ---stock[currIndex2]['insert'] = redis.call("HSET", storeKey, storeField, afterNum)
  153. currIndex2 = currIndex2 + 1
  154. end
  155. end
  156. local time = redis.call('TIME')
  157. result['time'] = time[1]
  158. result['microseconds'] = time[2]
  159. result['stockList'] = stock
  160. local re = cjson.encode(result);
  161. return re