qty_stock_virtual_can_negative.lua 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. end
  53. local currIndex2 = 1
  54. local stock = {}
  55. if (result['error'] == 0) then
  56. --数量都够,可以操作
  57. for k, v in pairs(material) do
  58. local numVirtualKey = v['numVirtualKey']
  59. local numField = v['numField']
  60. local incrNum = v['incrNum']
  61. ---local storeKey = v['storeKey']
  62. ---local storeField = v['storeField']
  63. stock[currIndex2] = {}
  64. stock[currIndex2]['idCompany'] = v['idCompany'];
  65. stock[currIndex2]['idToCompany'] = v['idToCompany'];
  66. stock[currIndex2]['idMaterial'] = v['idMaterial'];
  67. stock[currIndex2]['materialFlag'] = v['materialFlag'];
  68. stock[currIndex2]['qtyPrecise'] = v['qtyPrecise'];
  69. stock[currIndex2]['idStockRoom'] = v['idStockRoom'];
  70. local iExists = redis.call("HEXISTS", numVirtualKey, numField);
  71. if (iExists == 0) then
  72. stock[currIndex2]['insert'] = 1
  73. else
  74. stock[currIndex2]['insert'] = 0
  75. end
  76. local afterNum = redis.call("HINCRBY", numVirtualKey, numField, incrNum)
  77. stock[currIndex2]['beforeStock'] = afterNum - incrNum
  78. stock[currIndex2]['afterStock'] = afterNum
  79. stock[currIndex2]['stockNum'] = incrNum
  80. stock[currIndex2]['companyInsert'] = -1
  81. ---stock[currIndex2]['insert'] = redis.call("HSET", storeKey, storeField, afterNum)
  82. currIndex2 = currIndex2 + 1
  83. end
  84. end
  85. local time = redis.call('TIME')
  86. result['time'] = time[1]
  87. result['microseconds'] = time[2]
  88. result['stockList'] = stock
  89. local re = cjson.encode(result);
  90. return re