balance_account_moneys.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. ---
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by jlutt.
  4. --- DateTime: 2020-09-07 16:26
  5. --- 批量操作科目余额
  6. --- 科目erp中允许负值
  7. --- 传进来的数据明细对象为RedisAccountCalcItem,输出对象为RedisAccountCalcInfo
  8. local key = KEYS[1]
  9. local jsonData = ARGV[1]
  10. local material = cjson.decode(jsonData)
  11. local result = {}
  12. result['error'] = 0
  13. result['errorMsg'] = ''
  14. --- 检查能否减少数量
  15. --[[
  16. for k, v in pairs(material) do
  17. local numName = v['numName']
  18. local numKey = v['numKey']
  19. local numField = v['numField']
  20. local nowNum = tonumber(redis.call('HGET', numKey, numField))
  21. if (nowNum == nil) then
  22. nowNum = 0;
  23. end
  24. local incrNum = v['incrNum']
  25. if ((nowNum == nil or nowNum <= 0) and (incrNum < 0)) then
  26. result['error'] = 1
  27. result['errorMsg'] = numName .. '余额不足'
  28. break ;
  29. end
  30. if (nowNum + incrNum) < 0 then
  31. result['error'] = 1
  32. result['errorMsg'] = numName .. '余额不足'
  33. break ;
  34. end
  35. local idToAccount = v['idToAccount']
  36. if (idToAccount > 0) then
  37. --- 判断目标库存
  38. local numToField = v['numToField']
  39. local numToName = v['numToName']
  40. local nowToNum = tonumber(redis.call('HGET', numKey, numToField))
  41. if (nowToNum == nil) then
  42. nowToNum = 0;
  43. end
  44. local incrToNum = v['incrToNum']
  45. if ((nowToNum == nil or nowToNum <= 0) and (incrToNum < 0)) then
  46. result['error'] = 1
  47. result['errorMsg'] = numToName .. '余额不足'
  48. break ;
  49. end
  50. if (nowToNum + incrToNum) < 0 then
  51. result['error'] = 1
  52. result['errorMsg'] = numToName .. '余额不足'
  53. break ;
  54. end
  55. end
  56. end
  57. ]]
  58. local currIndex2 = 1
  59. local stock = {}
  60. if (result['error'] == 0) then
  61. --数量都够,可以操作
  62. for k, v in pairs(material) do
  63. local numKey = v['numKey']
  64. local numField = v['numField']
  65. local incrNum = v['incrNum']
  66. stock[currIndex2] = {}
  67. stock[currIndex2]['idAccount'] = v['idAccount'];
  68. local iExists = redis.call("HEXISTS", numKey, numField);
  69. if (iExists == 0) then
  70. stock[currIndex2]['insert'] = 1
  71. else
  72. stock[currIndex2]['insert'] = 0
  73. end
  74. local afterNum = redis.call("HINCRBY", numKey, numField, incrNum)
  75. stock[currIndex2]['beforeNum'] = afterNum - incrNum
  76. stock[currIndex2]['afterNum'] = afterNum
  77. stock[currIndex2]['calcNum'] = incrNum
  78. local idToAccount = v['idToAccount']
  79. if (idToAccount > 0) then
  80. local numToField = v['numToField']
  81. local incrToNum = v['incrToNum']
  82. stock[currIndex2]['idToAccount'] = v['idToAccount'];
  83. local iToExists = redis.call("HEXISTS", numKey, numToField);
  84. if (iToExists == 0) then
  85. stock[currIndex2]['toInsert'] = 1
  86. else
  87. stock[currIndex2]['toInsert'] = 0
  88. end
  89. local afterToNum = redis.call("HINCRBY", numKey, numToField, incrToNum)
  90. stock[currIndex2]['toBeforeNum'] = afterToNum - incrToNum
  91. stock[currIndex2]['toAfterNum'] = afterToNum
  92. stock[currIndex2]['toCalcNum'] = incrToNum
  93. end
  94. stock[currIndex2]['calcMemo'] = v['numMemo']
  95. stock[currIndex2]['internalFlag'] = v['internalFlag']
  96. ---stock[currIndex2]['insert'] = redis.call("HSET", storeKey, storeField, afterNum)
  97. currIndex2 = currIndex2 + 1
  98. end
  99. end
  100. local time = redis.call('TIME')
  101. result['time'] = time[1]
  102. result['microseconds'] = time[2]
  103. result['accountList'] = stock
  104. local re = cjson.encode(result);
  105. return re