QTRCALC.sql 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. DROP PROCEDURE IF EXISTS `QTRCALC`;
  2. delimiter ;;
  3. CREATE PROCEDURE `QTRCALC`(IN `PCPID` INT)
  4. LABEL: BEGIN
  5. -- DECLARE QTRSTARTPID, QTRSTARTMONTH, THISYEAR, THISMONTH, MISMONTH INT;
  6. DECLARE TBONUS,BONUSPERU DECIMAL; -- 奖金总额,每份奖金
  7. DECLARE QTRSTARTMONTH, THISYEAR, THISMONTH, MISMONTH INT; -- 这个月
  8. -- DECLARE OCROWN1NUM,OCROWN2NUM,OCROWN3NUM,OCROWN4NUM,OCROWN5NUM,OCROWN6NUM,OCROWN7NUM INT; -- 各星级的人数,原始不加权
  9. -- DECLARE CROWN1U, CROWN2U, CROWN3U, CROWN4U, CROWN5U, CROWN6U, CROWN7U INT; -- 各星级的人数(加权)
  10. DECLARE TOTALU INT; -- 加权的总份数
  11. DECLARE MAXID, USERTBID INT;
  12. DECLARE Q, R INT;
  13. START TRANSACTION;
  14. -- 日志;
  15. DELETE FROM AR_QTR_CALC_RECORD ;
  16. CALL QTRCALCRECORD(-1,'开始',PCPID,NOW());
  17. COMMIT;
  18. CALL QTRCLEAN(PCPID);
  19. CALL QTRCALCRECORD(1,'清除数据',PCPID,NOW());
  20. COMMIT;
  21. SELECT
  22. CALC_YEAR, CALC_MONTH, IS_MONTH INTO THISYEAR, THISMONTH, MISMONTH FROM AR_PERIOD WHERE PERIOD_NUM = PCPID;
  23. CALL QTRCALCRECORD(2,'初始化',PCPID,NOW());
  24. COMMIT;
  25. -- 查看是否季度结
  26. IF(THISMONTH!=3 AND THISMONTH!=6 AND THISMONTH!=9 AND THISMONTH!=12) OR MISMONTH!=1 THEN
  27. CALL QTRCALCRECORD(12,'非季结,结束',PCPID,NOW());
  28. COMMIT;
  29. LEAVE LABEL;
  30. END IF;
  31. CALL QTRCALCRECORD(3,'计算总奖金',PCPID,NOW());
  32. COMMIT;
  33. -- 按照条件,查询当前季度所有月的总PV,计算总奖金
  34. SET QTRSTARTMONTH = THISMONTH - 2;
  35. SELECT
  36. SUM(PV_PCS) * 0.02
  37. INTO TBONUS
  38. FROM AR_PERF_MONTH
  39. WHERE CALC_MONTH >= CONCAT(THISYEAR, lpad(QTRSTARTMONTH,2,0)) AND CALC_MONTH <= CONCAT(THISYEAR, lpad(THISMONTH,2,0));
  40. CALL QTRCALCRECORD(4,'计算总人数及加权',PCPID,NOW());
  41. COMMIT;
  42. -- 查找,所有星级用户
  43. INSERT INTO AR_QTR_CALC_WEIGHT
  44. SELECT
  45. NULL AS ID,
  46. QY.USER_ID,
  47. MAX(CL.SORT) AS MAX_SORT,
  48. (MAX(CL.SORT) - 1)/2 + 1 AS WEIGHT,
  49. PERIOD_NUM,
  50. CALC_MONTH,
  51. CALC_YEAR
  52. FROM
  53. AR_CALC_BONUS_QY AS QY
  54. INNER JOIN
  55. AR_CROWN_LEVEL AS CL
  56. ON QY.LAST_CROWN_LV = CL.ID
  57. INNER JOIN
  58. AR_USER AS U
  59. ON QY.USER_ID = U.ID
  60. WHERE
  61. QY.LAST_CROWN_LV != (SELECT ID FROM AR_CROWN_LEVEL WHERE SORT = 0)
  62. AND U.DEC_LV = '67ABCE0ECE705575E055736AECE8644D'
  63. AND QY.CALC_MONTH >= CONCAT(THISYEAR, lpad(QTRSTARTMONTH,2,0))
  64. AND QY.CALC_MONTH <= CONCAT(THISYEAR, lpad(THISMONTH,2,0))
  65. GROUP BY USER_ID, CALC_MONTH;
  66. COMMIT;
  67. INSERT INTO AR_QTR_CALC_SCORE
  68. SELECT
  69. NULL AS ID,
  70. USER_ID,
  71. COUNT(*) AS CNT,
  72. SUM(WEIGHT) AS SCORE,
  73. CALC_MONTH,
  74. CALC_YEAR
  75. FROM
  76. AR_QTR_CALC_WEIGHT
  77. GROUP BY USER_ID;
  78. COMMIT;
  79. SELECT SUM(SCORE) INTO TOTALU FROM AR_QTR_CALC_SCORE;
  80. SET BONUSPERU = TBONUS / TOTALU;
  81. CALL QTRCALCRECORD(5,'计算每一份奖金',PCPID,NOW());
  82. COMMIT;
  83. INSERT INTO AR_QTR_CALC_USER
  84. SELECT
  85. NULL AS ID,
  86. SC.USER_ID,
  87. BONUSPERU * SC.SCORE AS AMOUNT,
  88. CALC_YEAR,
  89. CALC_MONTH,
  90. PCPID AS PERIOD_NUM
  91. FROM
  92. AR_QTR_CALC_SCORE AS SC;
  93. CALL QTRCALCRECORD(6,'写入user表',PCPID,NOW());
  94. COMMIT;
  95. INSERT INTO AR_CALC_BONUS_QUARTER
  96. SELECT
  97. NULL AS ID,
  98. AU.USER_ID,
  99. AU.AMOUNT AS ORI_BONUS,
  100. 0 AS MANAGE_TAX,
  101. AU.AMOUNT,
  102. 0 AS RECONSUME_POINTS,
  103. U.DEC_LV,
  104. AU.CALC_MONTH,
  105. AU.PERIOD_NUM,
  106. NOW() AS CREATE_AT
  107. FROM
  108. AR_QTR_CALC_USER AS AU
  109. LEFT JOIN
  110. AR_USER AS U
  111. ON AU.USER_ID = U.ID;
  112. CALL QTRCALCRECORD(20,'写入季度奖金表',PCPID,NOW());
  113. COMMIT;
  114. END
  115. ;;