CALC20.sql 3.9 KB

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