CALC20.sql 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. DROP PROCEDURE IF EXISTS `CALC20`;
  2. delimiter ;;
  3. CREATE PROCEDURE `CALC20`(IN `PCPID` INT)
  4. BEGIN
  5. DECLARE
  6. MLAYER,
  7. MMAXLAYER,
  8. MCOUNT INT;
  9. DECLARE
  10. MRATE,
  11. MLIMITPV DECIMAL ( 10, 2 );
  12. START TRANSACTION;-- 第一个级别的限制
  13. SELECT
  14. T.ACHIEVE_PV INTO MLIMITPV
  15. FROM
  16. AR_EMPLOY_LEVEL T
  17. WHERE
  18. T.ID = 'E121497617216708615';-- 第二个级别得奖的比例
  19. SELECT
  20. T.BS_PERCENT / 100 INTO MRATE
  21. FROM
  22. AR_EMPLOY_LEVEL T
  23. WHERE
  24. T.ID = '67BE5FE7857C216AE055736AECE8644D';
  25. SELECT
  26. MAX( LAYER ) INTO MLAYER
  27. FROM
  28. AR_BS_BONUS_103_CALC
  29. WHERE
  30. PV > 0;
  31. SET MMAXLAYER := MLAYER;
  32. WHILE
  33. MLAYER >= 0 DO
  34. IF
  35. ( MLAYER < MMAXLAYER ) THEN-- 向上累计
  36. UPDATE AR_BS_BONUS_103_CALC T1
  37. INNER JOIN (
  38. SELECT
  39. INTRODUCER_ID,
  40. SUM( GPV ) GPV
  41. FROM
  42. AR_BS_BONUS_103_CALC
  43. WHERE
  44. LAYER = MLAYER + 1
  45. AND USER_TYPE = 0
  46. AND GPV > 0
  47. GROUP BY
  48. INTRODUCER_ID
  49. ) T2 ON T1.USER_ID = T2.INTRODUCER_ID
  50. AND T1.LAYER = MLAYER
  51. SET T1.GPV = T2.GPV;-- 没有升级的会员需要将自己的小组业绩清零
  52. UPDATE AR_BS_BONUS_103_CALC T
  53. SET T.GPV = 0
  54. WHERE
  55. T.GPV < T.ACHIEVE_PERF_PV AND T.LAYER = MLAYER + 1 AND GPV > 0;
  56. END IF;
  57. UPDATE AR_BS_BONUS_103_CALC T1
  58. SET T1.GPV = T1.GPV + T1.PV
  59. WHERE
  60. T1.LAYER = MLAYER;-- 是否达标 如果达标
  61. UPDATE AR_BS_BONUS_103_CALC T
  62. SET T.USER_TYPE = 10
  63. WHERE
  64. T.GPV >= T.ACHIEVE_PERF_PV
  65. AND T.LAYER = MLAYER;
  66. SET MLAYER := MLAYER - 1;
  67. END WHILE;
  68. UPDATE AR_BS_BONUS_103_CALC
  69. SET GPV = 0
  70. WHERE
  71. USER_TYPE = 0
  72. AND GPV > 0;
  73. SELECT
  74. MAX( LAYER ) INTO MLAYER
  75. FROM
  76. AR_BS_BONUS_103_CALC
  77. WHERE
  78. USER_TYPE > 0;
  79. SET MMAXLAYER := MLAYER;-- 添加至新网体页面
  80. INSERT INTO AR_BS_BONUS_103_CALC_NET ( USER_ID, INTRODUCER_ID, CALC_PERIOD_ID, USER_TYPE, GPV, DIRECTLY_UNDER, LAYER, TEAM_GPV ) SELECT
  81. USER_ID,
  82. INTRODUCER_ID,
  83. CALC_PERIOD_ID,
  84. USER_TYPE,
  85. GPV,
  86. 0,
  87. LAYER,
  88. 0
  89. FROM
  90. AR_BS_BONUS_103_CALC
  91. WHERE
  92. LAYER <= MLAYER; -- 处理新的网体
  93. DELETE FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = MLAYER AND USER_TYPE = 0; SET MLAYER := MLAYER - 1; WHILE MLAYER >= 0 DO-- 计算直属宽度
  94. UPDATE AR_BS_BONUS_103_CALC_NET T1
  95. INNER JOIN ( SELECT INTRODUCER_ID, COUNT( * ) SONS FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = MLAYER + 1 GROUP BY INTRODUCER_ID ) T2 ON T1.USER_ID = T2.INTRODUCER_ID
  96. AND T1.LAYER = MLAYER
  97. SET T1.DIRECTLY_UNDER = T2.SONS;-- 本人达标并且下属满足一个及以上的达标数升级为第二个级别
  98. UPDATE AR_BS_BONUS_103_CALC_NET T1
  99. SET T1.USER_TYPE = 20
  100. WHERE
  101. T1.LAYER = MLAYER
  102. AND USER_TYPE = 10
  103. AND DIRECTLY_UNDER >= 1;-- 计算本层达标人员
  104. SELECT
  105. COUNT( * ) INTO MCOUNT
  106. FROM
  107. AR_BS_BONUS_103_CALC_NET C
  108. WHERE
  109. C.DIRECTLY_UNDER >= 2
  110. AND C.USER_TYPE = 0
  111. AND LAYER = MLAYER;
  112. IF
  113. ( MCOUNT > 0 ) THEN
  114. CALL CALC20_0 ( MLAYER, PCPID );
  115. END IF;-- 删除未达标人员
  116. CALL CALCDELNET ( MLAYER );
  117. SET MLAYER := MLAYER - 1;
  118. END WHILE;-- 计算GPV_4_CALC,会员级别
  119. UPDATE AR_BS_BONUS_103_CALC C1
  120. INNER JOIN AR_BS_BONUS_103_CALC_NET C2 ON C1.USER_ID = C2.USER_ID
  121. SET C1.GPV_4_CALC = C2.GPV,
  122. C1.USER_TYPE = C2.USER_TYPE;-- 计算见习奖金
  123. UPDATE AR_BS_BONUS_103_CALC C1
  124. INNER JOIN ( SELECT INTRODUCER_ID, SUM( GPV ) ALL_GPV FROM AR_BS_BONUS_103_CALC_NET GROUP BY INTRODUCER_ID ) C2 ON C1.USER_ID = C2.INTRODUCER_ID
  125. AND C1.USER_TYPE = 20
  126. SET C1.BONUS20 = C2.ALL_GPV * MRATE;
  127. COMMIT;
  128. INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, ORI_BONUS, PV, RATE, PERIOD_NUM ) SELECT
  129. C1.USER_ID,
  130. NULL,
  131. 20,
  132. C2.ALL_GPV * MRATE,
  133. C2.ALL_GPV,
  134. MRATE,
  135. PCPID
  136. FROM
  137. AR_BS_BONUS_103_CALC C1
  138. INNER JOIN ( SELECT INTRODUCER_ID, SUM( GPV ) ALL_GPV FROM AR_BS_BONUS_103_CALC_NET GROUP BY INTRODUCER_ID ) C2 ON C1.USER_ID = C2.INTRODUCER_ID
  139. AND C1.USER_TYPE = 20
  140. AND ALL_GPV > 0;
  141. END
  142. ;;