qty_stock_virtual.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. ---
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by 81460.
  4. --- DateTime: 2020-12-09 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[1]
  33. local material = cjson.decode(jsonData)
  34. local result = {}
  35. result['error'] = 0
  36. result['errorMsg'] = ''
  37. --- 检查能否减少数量
  38. for k, v in pairs(material) do
  39. local numName = v['numName']
  40. local numKey = v['numKey']
  41. local numVirtualKey = v['numVirtualKey']
  42. local numField = v['numField']
  43. local nowVirtualNum = tonumber(redis.call('HGET', numVirtualKey, numField))
  44. local nowQtyNum = tonumber(redis.call('HGET', numKey, numField))
  45. if (nowVirtualNum == nil) then
  46. nowVirtualNum = 0;
  47. end
  48. if (nowQtyNum == nil) then
  49. nowQtyNum = 0;
  50. end
  51. local incrNum = v['incrNum']
  52. --- 判断虚拟库存
  53. if (incrNum > 0) then
  54. if (nowVirtualNum + incrNum) > nowQtyNum then
  55. result['error'] = 1
  56. result['errorMsg'] = numName .. '数量不足'
  57. break ;
  58. end
  59. end
  60. end
  61. local currIndex2 = 1
  62. local stock = {}
  63. if (result['error'] == 0) then
  64. --数量都够,可以操作
  65. for k, v in pairs(material) do
  66. local numVirtualKey = v['numVirtualKey']
  67. local numField = v['numField']
  68. local incrNum = v['incrNum']
  69. ---local storeKey = v['storeKey']
  70. ---local storeField = v['storeField']
  71. stock[currIndex2] = {}
  72. stock[currIndex2]['idCompany'] = v['idCompany'];
  73. stock[currIndex2]['idToCompany'] = v['idToCompany'];
  74. stock[currIndex2]['idMaterial'] = v['idMaterial'];
  75. stock[currIndex2]['materialFlag'] = v['materialFlag'];
  76. stock[currIndex2]['qtyPrecise'] = v['qtyPrecise'];
  77. stock[currIndex2]['idStockRoom'] = v['idStockRoom'];
  78. local iExists = redis.call("HEXISTS", numVirtualKey, numField);
  79. if (iExists == 0) then
  80. stock[currIndex2]['insert'] = 1
  81. else
  82. stock[currIndex2]['insert'] = 0
  83. end
  84. local afterNum = redis.call("HINCRBY", numVirtualKey, numField, incrNum)
  85. stock[currIndex2]['beforeStock'] = afterNum - incrNum
  86. stock[currIndex2]['afterStock'] = afterNum
  87. stock[currIndex2]['stockNum'] = incrNum
  88. stock[currIndex2]['companyInsert'] = -1
  89. ---stock[currIndex2]['insert'] = redis.call("HSET", storeKey, storeField, afterNum)
  90. currIndex2 = currIndex2 + 1
  91. end
  92. end
  93. local time = redis.call('TIME')
  94. result['time'] = time[1]
  95. result['microseconds'] = time[2]
  96. result['stockList'] = stock
  97. local re = cjson.encode(result);
  98. return re