QTRCALC.sql 3.0 KB

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