-- Active: 1688690638810@@127.0.0.1@3306@test_test /* Navicat Premium Data Transfer Source Server : NDS测试数据库 Source Server Type : MySQL Source Server Version : 80028 Source Host : 16.163.228.151:8051 Source Schema : test_test Target Server Type : MySQL Target Server Version : 80028 File Encoding : 65001 Date: 06/07/2023 17:24:33 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Procedure structure for CALC10 -- ---------------------------- DROP PROCEDURE IF EXISTS `CALC10`; delimiter ;; CREATE PROCEDURE `CALC10`(IN `PCPID` INT) BEGIN DECLARE MLAYER, MMAXLAYER INT; DECLARE MRATE, MLIMITPV DECIMAL ( 10, 2 );-- 查询第一个级别的限制以及等奖比例 SELECT T.ACHIEVE_PV, T.BS_PERCENT / 100 INTO MLIMITPV, MRATE FROM AR_EMPLOY_LEVEL T WHERE T.ID = 'E121497617216708615'; UPDATE AR_BS_BONUS_103_CALC SET PV = PV_UP_ZC + PV_FX; SELECT MAX( LAYER ) INTO MLAYER FROM AR_BS_BONUS_103_CALC WHERE PV > 0; SET MMAXLAYER := MLAYER; WHILE MLAYER >= 0 DO IF ( MLAYER < MMAXLAYER ) THEN-- 向上累计 UPDATE AR_BS_BONUS_103_CALC T1 INNER JOIN ( SELECT INTRODUCER_ID, SUM( GPV10 ) GPV10 FROM AR_BS_BONUS_103_CALC WHERE LAYER = MLAYER + 1 AND USER_TYPE10 = 0 AND GPV10 > 0 GROUP BY INTRODUCER_ID ) T2 ON T1.USER_ID = T2.INTRODUCER_ID AND T1.LAYER = MLAYER SET T1.GPV10 = T2.GPV10;-- 没有升级的会员需要将自己的小组业绩清零 UPDATE AR_BS_BONUS_103_CALC T SET T.GPV10 = 0 WHERE T.GPV10 < MLIMITPV AND T.LAYER = MLAYER + 1 AND USER_TYPE10 = 0 AND T.GPV10 > 0; END IF; UPDATE AR_BS_BONUS_103_CALC T1 SET T1.GPV10 = T1.GPV10 + T1.PV WHERE T1.LAYER = MLAYER AND T1.PV > 0;-- 是否达标 如果达标 UPDATE AR_BS_BONUS_103_CALC T SET T.USER_TYPE10 = 10 WHERE T.GPV10 >= MLIMITPV AND T.LAYER = MLAYER AND T.USER_TYPE10 = 0; IF ( MLAYER > 0 ) THEN-- 升级为蓝星A CALL CALCUPGARDE ( MLAYER ); END IF; SET MLAYER := MLAYER - 1; END WHILE; UPDATE AR_BS_BONUS_103_CALC T SET T.BONUS10 = T.GPV10 * MRATE WHERE T.USER_TYPE10 = 10 AND T.GPV10 > 0; UPDATE AR_BS_BONUS_103_CALC SET USER_TYPE = 0; INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, ORI_BONUS, PV, RATE,PERIOD_NUM ) SELECT USER_ID, NULL, 10, GPV10 * MRATE, GPV10, MRATE ,PCPID FROM AR_BS_BONUS_103_CALC WHERE USER_TYPE10 = 10 AND GPV10 > 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALC20 -- ---------------------------- DROP PROCEDURE IF EXISTS `CALC20`; delimiter ;; CREATE PROCEDURE `CALC20`(IN `PCPID` INT) BEGIN DECLARE MLAYER, MMAXLAYER, MCOUNT INT; DECLARE MRATE, MLIMITPV DECIMAL ( 10, 2 ); START TRANSACTION;-- 第一个级别的限制 SELECT T.ACHIEVE_PV INTO MLIMITPV FROM AR_EMPLOY_LEVEL T WHERE T.ID = 'E121497617216708615';-- 第二个级别得奖的比例 SELECT T.BS_PERCENT / 100 INTO MRATE FROM AR_EMPLOY_LEVEL T WHERE T.ID = '67BE5FE7857C216AE055736AECE8644D'; UPDATE AR_BS_BONUS_103_CALC SET PV = PV_ZC + PV_FX; SELECT MAX( LAYER ) INTO MLAYER FROM AR_BS_BONUS_103_CALC WHERE PV > 0; SET MMAXLAYER := MLAYER; WHILE MLAYER >= 0 DO IF ( MLAYER < MMAXLAYER ) THEN-- 向上累计 UPDATE AR_BS_BONUS_103_CALC T1 INNER JOIN ( SELECT INTRODUCER_ID, SUM( GPV ) GPV FROM AR_BS_BONUS_103_CALC WHERE LAYER = MLAYER + 1 AND USER_TYPE = 0 AND GPV > 0 GROUP BY INTRODUCER_ID ) T2 ON T1.USER_ID = T2.INTRODUCER_ID AND T1.LAYER = MLAYER SET T1.GPV = T2.GPV;-- 没有升级的会员需要将自己的小组业绩清零 UPDATE AR_BS_BONUS_103_CALC T SET T.GPV = 0 WHERE T.GPV < MLIMITPV AND T.LAYER = MLAYER + 1 AND GPV > 0; END IF; UPDATE AR_BS_BONUS_103_CALC T1 SET T1.GPV = T1.GPV + T1.PV WHERE T1.LAYER = MLAYER;-- 是否达标 如果达标 UPDATE AR_BS_BONUS_103_CALC T SET T.USER_TYPE = 10 WHERE T.GPV >= MLIMITPV AND T.LAYER = MLAYER; SET MLAYER := MLAYER - 1; END WHILE; UPDATE AR_BS_BONUS_103_CALC SET GPV = 0 WHERE USER_TYPE = 0 AND GPV > 0; SELECT MAX( LAYER ) INTO MLAYER FROM AR_BS_BONUS_103_CALC WHERE USER_TYPE > 0; SET MMAXLAYER := MLAYER;-- 添加至新网体页面 INSERT INTO AR_BS_BONUS_103_CALC_NET ( USER_ID, INTRODUCER_ID, CALC_PERIOD_ID, USER_TYPE, GPV, DIRECTLY_UNDER, LAYER, TEAM_GPV ) SELECT USER_ID, INTRODUCER_ID, CALC_PERIOD_ID, USER_TYPE, GPV, 0, LAYER, 0 FROM AR_BS_BONUS_103_CALC WHERE LAYER <= MLAYER; -- 处理新的网体 DELETE FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = MLAYER AND USER_TYPE = 0; SET MLAYER := MLAYER - 1; WHILE MLAYER >= 0 DO-- 计算直属宽度 UPDATE AR_BS_BONUS_103_CALC_NET T1 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 AND T1.LAYER = MLAYER SET T1.DIRECTLY_UNDER = T2.SONS;-- 本人达标并且下属满足一个及以上的达标数升级为第二个级别 UPDATE AR_BS_BONUS_103_CALC_NET T1 SET T1.USER_TYPE = 20 WHERE T1.LAYER = MLAYER AND USER_TYPE = 10 AND DIRECTLY_UNDER >= 1;-- 计算本层达标人员 SELECT COUNT( * ) INTO MCOUNT FROM AR_BS_BONUS_103_CALC_NET C WHERE C.DIRECTLY_UNDER >= 2 AND C.USER_TYPE = 0 AND LAYER = MLAYER; IF ( MCOUNT > 0 ) THEN CALL CALC20_0 ( MLAYER, PCPID ); END IF;-- 删除未达标人员 CALL CALCDELNET ( MLAYER ); SET MLAYER := MLAYER - 1; END WHILE;-- 计算GPV_4_CALC,会员级别 UPDATE AR_BS_BONUS_103_CALC C1 INNER JOIN AR_BS_BONUS_103_CALC_NET C2 ON C1.USER_ID = C2.USER_ID SET C1.GPV_4_CALC = C2.GPV, C1.USER_TYPE = C2.USER_TYPE;-- 计算见习奖金 UPDATE AR_BS_BONUS_103_CALC C1 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 AND C1.USER_TYPE = 20 SET C1.BONUS20 = C2.ALL_GPV * MRATE; COMMIT; INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, ORI_BONUS, PV, RATE, PERIOD_NUM ) SELECT C1.USER_ID, NULL, 20, C2.ALL_GPV * MRATE, C2.ALL_GPV, MRATE, PCPID FROM AR_BS_BONUS_103_CALC C1 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 AND C1.USER_TYPE = 20 AND ALL_GPV > 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALC20_0 -- ---------------------------- DROP PROCEDURE IF EXISTS `CALC20_0`; delimiter ;; CREATE PROCEDURE `CALC20_0`(IN PLAYER INT,IN `PCPID` INT) BEGIN DECLARE FLAG INT DEFAULT 0; DECLARE MUSERID, MMAXUSERID VARCHAR ( 50 ); DECLARE MGPV DECIMAL ( 10, 2 ); DECLARE MC CURSOR FOR SELECT C.USER_ID FROM AR_BS_BONUS_103_CALC_NET C WHERE C.DIRECTLY_UNDER >= 2 AND C.USER_TYPE = 0 AND LAYER = PLAYER; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG = 1;-- 打开游标 OPEN MC;-- 获取结果 L2 : LOOP FETCH MC INTO MUSERID; IF FLAG = 1 THEN-- 当无法FETCH会触发HANDLER CONTINUE LEAVE L2; END IF;-- 这里是为了显示获取结果 SELECT MIN( GPV ) INTO MGPV FROM AR_BS_BONUS_103_CALC_NET C WHERE C.INTRODUCER_ID = MUSERID AND C.USER_TYPE >= 10; SELECT MAX( USER_ID ) INTO MMAXUSERID FROM AR_BS_BONUS_103_CALC_NET C WHERE C.INTRODUCER_ID = MUSERID AND C.GPV = MGPV; UPDATE AR_BS_BONUS_103_CALC_NET C SET C.USER_TYPE = 20, C.GPV = MGPV WHERE USER_ID = MUSERID; UPDATE AR_BS_BONUS_103_CALC_NET C SET C.GPV = 0 WHERE USER_ID = MMAXUSERID;-- 关闭游标 INSERT INTO AR_CALC_BONUS_BS_DETAIL_GPV(USER_ID,INTRODUCER_ID,GPV,PERIOD_NUM) VALUES(MMAXUSERID,MUSERID,MGPV,PCPID); END LOOP; CLOSE MC; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCBLUE -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCBLUE`; delimiter ;; CREATE PROCEDURE `CALCBLUE`(IN `PCPID` INT) LABEL: BEGIN DECLARE MCALCYEAR INT; DECLARE MISMONTH,MCALCMONTH,MISSENT TINYINT; START TRANSACTION; -- 日志; DELETE FROM AR_BS_BONUS_103_CALC_EVENT ;-- WHERE CALC_PERIOD_ID >= PCPID; CALL CALCRECORD(-1,'开始',PCPID,NOW()); COMMIT; -- SELECT USER_ID INTO MISMONTH FROM ZR_USER; SELECT AP.IS_MONTH,AP.CALC_MONTH,AP.CALC_YEAR,AP.IS_SENT INTO MISMONTH,MCALCMONTH,MCALCYEAR,MISSENT FROM AR_PERIOD AP WHERE AP.PERIOD_NUM = PCPID; -- 查看是否月结 IF(MISMONTH = 0 OR MISSENT = 1)THEN LEAVE LABEL; END IF; -- 清除数据 CALL CALCRECORD(1,'清除数据',PCPID,NOW()); COMMIT; CALL CALCCLEAN(PCPID); COMMIT; -- 初始化 CALL CALCRECORD(2,'初始化',PCPID,NOW()); COMMIT; CALL CALCINIT(PCPID,MCALCMONTH,MCALCYEAR); COMMIT; -- 初始业绩 -- 3.蓝星奖 CALL CALCRECORD(3,'蓝星奖',PCPID,NOW()); COMMIT; CALL CALC10(PCPID); COMMIT; -- 4.新网体 CALL CALCRECORD(4,'新网体',PCPID,NOW()); COMMIT; CALL CALC20(PCPID); COMMIT; -- 5.升级主任 CALL CALCRECORD(5,'升级主任',PCPID,NOW()); COMMIT; CALL CALCUP30; COMMIT; -- 6.计算主任自己第一层的总业绩 CALL CALCRECORD(6,'计算主任自己第一层的总业绩',PCPID,NOW()); COMMIT; CALL CALCTOTALGPV; COMMIT; -- 7.计算平级奖业绩和级别 CALL CALCRECORD(7,'计算平级奖业绩和级别',PCPID,NOW()); COMMIT; CALL CALCLEVEL(PCPID); COMMIT; -- 8.计算平级奖 CALL CALCRECORD(8,'计算平级奖',PCPID,NOW()); COMMIT; CALL CALCPJ(PCPID); COMMIT; -- 9.积分 CALL CALCRECORD(9,'积分',PCPID,NOW()); COMMIT; CALL CALCPOINT; COMMIT; -- 10.汇总 CALL CALCRECORD(10,'汇总',PCPID,NOW()); COMMIT; CALL CALCSUMMARY; COMMIT; -- 11.记录总表 CALL CALCRECORD(11,'记录总表',PCPID,NOW()); COMMIT; CALL CALCKEEP(MCALCYEAR,MCALCMONTH); COMMIT; -- 12.计算拨出比 CALL CALCRECORD(12,'计算拨出比',PCPID,NOW()); COMMIT; CALL CALCSTAT(PCPID); COMMIT; CALL CALCRECORD(13,'结束',PCPID,NOW()); COMMIT; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCCHECKING -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCCHECKING`; delimiter ;; CREATE PROCEDURE `CALCCHECKING`(IN `PCPID` INT) LABEL : BEGIN-- 遍历数据结束标志 DECLARE MCOLUMNNAME, MVALUES, MVALUES0, MVALUES1, MVALUES2 VARCHAR ( 100 );-- 定义预处理SQL语句 DECLARE SQL_FOR_SELECT VARCHAR ( 2000 ); DECLARE MCOUNT INT DEFAULT 0; DECLARE DONE INT DEFAULT FALSE; DECLARE MISMONTH, MISSEND TINYINT;-- 游标 DECLARE CUR_ACCOUNT CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'AR_CALC_BONUS_BS_DETAIL' AND TABLE_SCHEMA = 'aikang_db_28' AND COLUMN_NAME NOT IN ( 'CALC_YEAR', 'CALC_MONTH', 'P_CALC_MONTH', 'CREATED_AT', 'ID', 'LAYER' ) AND DATA_TYPE IN ( 'DECIMAL', 'DOUBLE', 'INT' );-- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE; START TRANSACTION; SELECT AP.IS_MONTH, AP.IS_SENT INTO MISMONTH, MISSEND FROM AR_PERIOD AP WHERE AP.PERIOD_NUM = PCPID;-- 查看是否月结 IF ( MISMONTH = 0 OR MISSEND = 1 ) THEN LEAVE LABEL; END IF;-- 打开游标 DELETE FROM AR_CALC_BONUS_BS_CHECKING WHERE PERIOD_NUM >= PCPID; OPEN CUR_ACCOUNT;-- 遍历 READ_LOOP : LOOP-- 取值 取多个字段 FETCH NEXT FROM CUR_ACCOUNT INTO MCOLUMNNAME; IF DONE THEN LEAVE READ_LOOP; END IF; SET SQL_FOR_SELECT = CONCAT( "SELECT COUNT(*) INTO @MVALUES0 FROM (SELECT IFNULL(A1.USER_ID,'-1') MAIN_ID,IFNULL(A2.USER_ID,'-1') TEST_ID,IFNULL(A1.", MCOLUMNNAME, ",0) NAME1,IFNULL(A2.", MCOLUMNNAME, ",0) NAME2 FROM AR_CALC_BONUS_BS_DETAIL A1 LEFT JOIN AR_CALC_BONUS_BS_DETAIL_CALC A2 ON A1.USER_ID = A2.USER_ID WHERE A1.PERIOD_NUM = ", PCPID, " AND A2.PERIOD_NUM = ", PCPID, " UNION SELECT IFNULL(A2.USER_ID,'-1') MAIN_ID,IFNULL(A1.USER_ID,'-1') TEST_ID,IFNULL(A2.", MCOLUMNNAME, ",0) NAME1,IFNULL(A1.", MCOLUMNNAME, ",0) NAME2 FROM AR_CALC_BONUS_BS_DETAIL_CALC A1 LEFT JOIN AR_CALC_BONUS_BS_DETAIL A2 ON A1.USER_ID = A2.USER_ID WHERE A1.PERIOD_NUM = ", PCPID, " AND A2.PERIOD_NUM = ", PCPID, ") B WHERE B.MAIN_ID != B.TEST_ID OR ABS(B.NAME1-B.NAME2)>0.5" );-- 拼接查询SQL语句 SET @SQL = SQL_FOR_SELECT; PREPARE STMT FROM @SQL;-- 预处理动态SQL语句 EXECUTE STMT;-- 执行SQL语句 DEALLOCATE PREPARE STMT; SET MVALUES0 := @MVALUES0; SET SQL_FOR_SELECT = CONCAT( "SELECT IFNULL(SUM(", MCOLUMNNAME, "),0) INTO @MVALUES1 FROM AR_CALC_BONUS_BS_DETAIL WHERE PERIOD_NUM = '", PCPID, "'" );-- 拼接查询SQL语句 SET @SQL = SQL_FOR_SELECT; PREPARE STMT FROM @SQL;-- 预处理动态SQL语句 EXECUTE STMT;-- 执行SQL语句 DEALLOCATE PREPARE STMT; SET MVALUES1 := @MVALUES1; SET SQL_FOR_SELECT = CONCAT( "SELECT IFNULL(SUM(", MCOLUMNNAME, "),0) INTO @MVALUES2 FROM AR_CALC_BONUS_BS_DETAIL_CALC WHERE USER_ID != '0' AND PERIOD_NUM = '", PCPID, "'" );-- 拼接查询SQL语句 SET @SQL = SQL_FOR_SELECT; PREPARE STMT FROM @SQL;-- 预处理动态SQL语句 EXECUTE STMT;-- 执行SQL语句 DEALLOCATE PREPARE STMT; SET MVALUES2 := @MVALUES2; INSERT INTO AR_CALC_BONUS_BS_CHECKING ( PERIOD_NUM, COLUMN_NAME, DIFF_COUNT, MAIN_SUM, CALC_SUM, DIFF_SUM ) VALUES ( PCPID, MCOLUMNNAME, MVALUES0, MVALUES1, MVALUES2, ABS( CONVERT ( MVALUES1, DECIMAL ( 12, 2 ))- CONVERT ( MVALUES2, DECIMAL ( 12, 2 )))); COMMIT; END LOOP; CLOSE CUR_ACCOUNT; SELECT COUNT(*) INTO MCOUNT FROM AR_CALC_BONUS_BS_CHECKING WHERE ( DIFF_COUNT > 0 OR DIFF_SUM >= 1 ) AND COLUMN_NAME IN ( 'USER_TYPE10', 'USER_TYPE', 'BONUS10', 'BONUS20', 'BONUS30', 'BONUS40', 'BONUS50', 'BONUS60', 'BONUS70', 'BONUS80', 'BONUS90', 'BONUS100', 'BONUS110', 'ORI_BONUS', 'AMOUNT', 'PRODUCT_POINT' ); IF ( MCOUNT = 0 ) THEN UPDATE AR_CALC_BONUS_BS_STAT T SET T.CHECK_STATUS = 1 WHERE T.PERIOD_NUM = PCPID; END IF; COMMIT; END ; ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCCLEAN -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCCLEAN`; delimiter ;; CREATE PROCEDURE `CALCCLEAN`(IN `PCPID` INT) BEGIN-- 删除当期奖金 DELETE FROM AR_BS_BONUS_103_CALC; DELETE FROM AR_BS_BONUS_103_TEST WHERE CALC_PERIOD_ID >= PCPID;-- 使用的奖金表 DELETE FROM AR_CALC_BONUS_BS WHERE PERIOD_NUM >= PCPID; DELETE FROM AR_CALC_BONUS_BS_DETAIL WHERE PERIOD_NUM >= PCPID;-- 删除当期网体 DELETE FROM AR_BS_BONUS_103_CALC_NET; DELETE FROM AR_BS_BONUS_103_TEST_NET WHERE CALC_PERIOD_ID >= PCPID;-- 删除拨出表 DELETE FROM AR_CALC_BONUS_BS_STAT WHERE PERIOD_NUM >= PCPID;-- 删除明细表 DELETE FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM >= PCPID;-- 删除日志 DELETE FROM AR_CALC_BONUS_BS_DETAIL_GPV WHERE PERIOD_NUM >= PCPID; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCDELNET -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCDELNET`; delimiter ;; CREATE PROCEDURE `CALCDELNET`(IN `PLAYER` INT) BEGIN DECLARE FLAG INT DEFAULT 0; DECLARE MUSERID, MMAXUSERID, MINTRODUCERID VARCHAR ( 50 ); /*DECLARE MGPV DECIMAL ( 10, 2 ); DECLARE DN CURSOR FOR SELECT USER_ID FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = PLAYER AND USER_TYPE = 0; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG = 1;*/ START TRANSACTION;-- 打开游标 /*OPEN DN;-- 获取结果 L2 : LOOP FETCH DN INTO MUSERID; IF FLAG = 1 THEN-- 当无法FETCH会触发HANDLER CONTINUE LEAVE L2; END IF;-- 查询需要删除会员的推荐人ID SELECT T.INTRODUCER_ID INTO MINTRODUCERID FROM AR_BS_BONUS_103_CALC_NET T WHERE T.USER_ID = MUSERID;-- 更改需要删除会员第一代的推荐人ID以及层数 UPDATE AR_BS_BONUS_103_CALC_NET T SET T.INTRODUCER_ID = MINTRODUCERID, T.LAYER = T.LAYER - 1 WHERE T.INTRODUCER_ID = MUSERID;-- 关闭游标 END LOOP; CLOSE DN;*/ UPDATE AR_BS_BONUS_103_CALC_NET SET DELETED = 1 WHERE LAYER = PLAYER AND USER_TYPE = 0; UPDATE AR_BS_BONUS_103_CALC_NET T1 INNER JOIN AR_BS_BONUS_103_CALC_NET T2 ON T1.INTRODUCER_ID = T2.USER_ID AND T1.LAYER = PLAYER+1 AND T2.LAYER = PLAYER AND T2.USER_TYPE = 0 SET T1.INTRODUCER_ID = T2.INTRODUCER_ID,T1.LAYER = PLAYER; DELETE FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = PLAYER AND USER_TYPE = 0 AND DELETED = 1; COMMIT; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCINIT -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCINIT`; delimiter ;; CREATE PROCEDURE `CALCINIT`(IN `PCPID` INT, IN `PCALCMONTH` TINYINT, IN `PCALCYEAR` INT) BEGIN INSERT INTO AR_BS_BONUS_103_CALC ( LAST_DEC_LV, LAST_EMP_LV, LAST_STATUS, USER_ID, INTRODUCER_ID, LAYER, PV, GPV10, GPV, GPV_4_CALC, USER_TYPE10, USER_TYPE, BONUS10, BONUS20, BONUS30, BONUS40, BONUS50, BONUS60, BONUS70, BONUS80, BONUS90, BONUS100, BONUS110, BONUS, PRODUCT_POINT, CALC_PERIOD_ID, PV_ZC, PV_FX, PV_UP_ZC ) SELECT AU.LAST_DEC_LV, AU.EMP_LV, AU.STATUS, AU.ID, IFNULL( AURN.PARENT_UID, 0 ), AURN.TOP_DEEP, IFNULL( AO.PV, 0 ), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PCPID, (SELECT IFNULL( SUM( PV ), 0 ) PV FROM AR_PERF_ORDER WHERE PERIOD_NUM IN ( SELECT PERIOD_NUM FROM AR_PERIOD WHERE CALC_YEAR = PCALCYEAR AND CALC_MONTH = PCALCMONTH) AND USER_ID=AU.ID AND DEC_TYPE='ZC')PV_ZC, (SELECT IFNULL( SUM( PV ), 0 ) PV FROM AR_PERF_ORDER WHERE PERIOD_NUM IN ( SELECT PERIOD_NUM FROM AR_PERIOD WHERE CALC_YEAR = PCALCYEAR AND CALC_MONTH = PCALCMONTH) AND USER_ID=AU.ID AND DEC_TYPE='FX')PV_FX, (SELECT IFNULL( SUM( O.PV ), 0 ) PV FROM AR_PERF_ORDER O LEFT JOIN AR_USER_RELATION_NEW R ON R.USER_ID = O.USER_ID WHERE O.PERIOD_NUM IN ( SELECT PERIOD_NUM FROM AR_PERIOD WHERE CALC_YEAR = PCALCYEAR AND CALC_MONTH = PCALCMONTH) AND R.PARENT_UID=AU.ID AND O.DEC_TYPE='ZC')PV_UP_ZC FROM AR_USER AU INNER JOIN AR_USER_RELATION_NEW AURN ON AU.ID = AURN.USER_ID LEFT JOIN ( SELECT USER_ID, SUM( PV ) PV FROM AR_PERF_ORDER WHERE PERIOD_NUM IN ( SELECT PERIOD_NUM FROM AR_PERIOD WHERE CALC_YEAR = PCALCYEAR AND CALC_MONTH = PCALCMONTH ) GROUP BY USER_ID ) AO ON AO.USER_ID = AU.ID WHERE AU.DELETED = 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCKEEP -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCKEEP`; delimiter ;; CREATE PROCEDURE `CALCKEEP`(IN `PCALCYEAR` INT,IN `PCALCMONTH` INT) BEGIN INSERT INTO AR_BS_BONUS_103_TEST SELECT * FROM AR_BS_BONUS_103_CALC; INSERT INTO AR_BS_BONUS_103_TEST_NET SELECT * FROM AR_BS_BONUS_103_CALC_NET; INSERT INTO AR_CALC_BONUS_BS ( USER_ID, INTRODUCER_ID, LAST_DEC_LV, LAST_EMP_LV, LAST_STATUS, LEVEL_ID, ORI_BONUS, MANAGE_TAX, AMOUNT, PRODUCT_POINT, PERIOD_NUM, CALC_YEAR, CALC_MONTH, P_CALC_MONTH, CREATED_AT , ORI_BONUS_ABBR, MANAGE_TAX_ABBR, AMOUNT_ABBR, ABBR_RECONSUME_POINTS, ORI_BONUS_MNT, MANAGE_TAX_MNT, AMOUNT_MNT, MNT_RECONSUME_POINTS ) SELECT A.USER_ID, A.INTRODUCER_ID, A.LAST_DEC_LV, A.LAST_EMP_LV, A.LAST_STATUS, B.ID, IFNULL( A.BONUS, 0 ), 0, IFNULL( A.BONUS, 0 ), IFNULL( A.PRODUCT_POINT, 0 ), CALC_PERIOD_ID, PCALCYEAR, PCALCYEAR*100+PCALCMONTH, NOW(), UNIX_TIMESTAMP( NOW()), IFNULL(A.BONUSYJ,0), 0 , IFNULL(A.BONUSYJ,0), 0, IFNULL(A.BONUSGL,0), 0, IFNULL(A.BONUSGL,0), 0 FROM AR_BS_BONUS_103_CALC A LEFT JOIN AR_EMPLOY_LEVEL B ON A.USER_TYPE = B.SORT * 10 WHERE A.BONUS > 0 OR A.PRODUCT_POINT > 0; INSERT INTO AR_CALC_BONUS_BS_DETAIL ( USER_ID, INTRODUCER_ID, LAST_DEC_LV, LAST_EMP_LV, LAST_STATUS, LEVEL_ID, ORI_BONUS, MANAGE_TAX, AMOUNT, PRODUCT_POINT, PERIOD_NUM, LAYER, PV, GPV10, GPV, GPV_4_CALC, USER_TYPE10, USER_TYPE, BONUS10, BONUS20, BONUS30, BONUS40, BONUS50, BONUS60, BONUS70, BONUS80, BONUS90, BONUS100, BONUS110, CALC_YEAR, CALC_MONTH, P_CALC_MONTH, CREATED_AT , ORI_BONUS_ABBR, AMOUNT_ABBR, ORI_BONUS_MNT, AMOUNT_MNT ) SELECT USER_ID, INTRODUCER_ID, LAST_DEC_LV, LAST_EMP_LV, LAST_STATUS, B.ID, IFNULL( BONUS, 0 ), 0, IFNULL( BONUS, 0 ), IFNULL( PRODUCT_POINT, 0 ), CALC_PERIOD_ID, LAYER, PV, GPV10, GPV, GPV_4_CALC, USER_TYPE10, USER_TYPE, BONUS10, BONUS20, BONUS30, BONUS40, BONUS50, BONUS60, BONUS70, BONUS80, BONUS90, BONUS100, BONUS110, PCALCYEAR, PCALCYEAR*100+PCALCMONTH, NOW(), UNIX_TIMESTAMP( NOW()) , IFNULL(A.BONUSYJ,0), IFNULL(A.BONUSYJ,0), IFNULL(A.BONUSGL,0), IFNULL(A.BONUSGL,0) FROM AR_BS_BONUS_103_CALC A LEFT JOIN ( SELECT ID, SORT FROM AR_EMPLOY_LEVEL ) B ON A.USER_TYPE = B.SORT * 10; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCLEVEL -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCLEVEL`; delimiter ;; CREATE PROCEDURE `CALCLEVEL`(IN `PCPID` INT) BEGIN DECLARE FLAG, MLAYER, MUSERTYPE INT DEFAULT 0; DECLARE MGPV, MLIMITPV DECIMAL ( 10, 2 ); DECLARE MC CURSOR FOR SELECT LAYER FROM AR_BS_BONUS_103_CALC_NET T WHERE T.USER_TYPE = 30 GROUP BY LAYER ORDER BY LAYER DESC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG = 1; START TRANSACTION;-- 打开游标 OPEN MC;-- 获取结果 L2 : LOOP FETCH MC INTO MLAYER; IF FLAG = 1 THEN-- 当无法FETCH会触发HANDLER CONTINUE LEAVE L2; END IF; -- 计算当前层数的奖金以及向上所贡献的奖金 CALL CALCLEVEL_ ( MLAYER ,PCPID); END LOOP; CLOSE MC; /*WHILE ( MLAYER >= 0 ) DO-- 计算当前层数的奖金以及向上所贡献的奖金 CALL CALCLEVEL_ ( MLAYER ); SET MLAYER := MLAYER - 1; END WHILE;*/-- 级别更新 UPDATE AR_BS_BONUS_103_CALC C1 INNER JOIN AR_BS_BONUS_103_CALC_NET C2 ON C1.USER_ID = C2.USER_ID AND C1.USER_TYPE <> C2.USER_TYPE SET C1.USER_TYPE = C2.USER_TYPE; SELECT T.ACHIEVE_PV INTO MLIMITPV FROM AR_EMPLOY_LEVEL T WHERE T.ID = 'E121497617216708615'; UPDATE AR_BS_BONUS_103_CALC SET USER_TYPE = 0 WHERE USER_TYPE = 10; UPDATE AR_BS_BONUS_103_CALC SET USER_TYPE = 10 WHERE GPV10 >= MLIMITPV AND USER_TYPE = 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCLEVEL_ -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCLEVEL_`; delimiter ;; CREATE PROCEDURE `CALCLEVEL_`(IN `PLAYER` INT,IN `PCPID` INT) BEGIN DECLARE FLAG, MLAYER, MUSERTYPE INT DEFAULT 0; DECLARE MUSERID, MBONUSID, MNEWBONUSID VARCHAR ( 50 ); DECLARE MGPV DECIMAL ( 10, 2 ); DECLARE MC CURSOR FOR SELECT C.USER_ID, C.TEAM_GPV FROM AR_BS_BONUS_103_CALC_NET C WHERE C.USER_TYPE >= 30 AND LAYER = PLAYER; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG = 1; START TRANSACTION; -- 打开游标 OPEN MC;-- 获取结果 L2 : LOOP FETCH MC INTO MUSERID, MGPV; IF FLAG = 1 THEN-- 当无法FETCH会触发HANDLER CONTINUE LEAVE L2; END IF;-- 这里是为了显示获取结果 SET MLAYER := 1; SET MBONUSID := MUSERID; OUTER_LABEL : WHILE ( MLAYER <= 9 ) DO IF ( MLAYER > 1 ) THEN CALL CALCREFEREE ( MBONUSID, MNEWBONUSID ); IF ( ISNULL( MNEWBONUSID ) OR MNEWBONUSID = 0 ) THEN LEAVE OUTER_LABEL; ELSE SET MBONUSID := MNEWBONUSID; END IF; END IF; IF ( MLAYER = 1 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, NULL, 30, MGPV ,PCPID); ELSEIF ( MLAYER = 2 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 40, MGPV,PCPID); ELSEIF ( MLAYER = 3 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 50, MGPV, PCPID ); ELSEIF ( MLAYER = 4 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 60, MGPV, PCPID ); ELSEIF ( MLAYER = 5 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 70, MGPV, PCPID ); ELSEIF ( MLAYER = 6 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 80, MGPV, PCPID ); ELSEIF ( MLAYER = 7 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 90, MGPV, PCPID ); ELSEIF ( MLAYER = 8 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 100, MGPV, PCPID ); ELSEIF ( MLAYER = 9 ) THEN INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, PV, PERIOD_NUM ) VALUES ( MBONUSID, MUSERID, 110, MGPV, PCPID ); END IF;-- 计算会员的级别 UPDATE AR_BS_BONUS_103_CALC_NET T SET T.USER_TYPE = ( MLAYER + 2 )* 10 WHERE T.USER_ID = MBONUSID AND USER_TYPE <=( MLAYER + 1 )* 10; SET MLAYER := MLAYER + 1; END WHILE;-- 关闭游标 END LOOP; CLOSE MC; COMMIT; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCMAIN -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCMAIN`; delimiter ;; CREATE PROCEDURE `CALCMAIN`(IN `PCPID` int,OUT `PRESULT` varchar(100)) BEGIN #Routine body goes here... DECLARE EXIT HANDLER FOR SQLEXCEPTION SET PRESULT = 'FAIL'; CALL CalcBlue(PCPID); SET PRESULT = 'SUCCESS'; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCPJ -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCPJ`; delimiter ;; CREATE PROCEDURE `CALCPJ`(IN `PCPID` int) BEGIN DECLARE USERID VARCHAR (100); DECLARE TOTALPV, PV3, PV4, PV5, PV6, PV7, PV8, PV9, PV10, PV11, PERCENT1, PERCENT2, REWARD_BONUS1, REWARD_BONUS2, REWARD_BONUS_TOTAL DECIMAL (16,2); DECLARE RATE DECIMAL (16,8); DECLARE RATE2 DECIMAL (16,8); DECLARE DONE INT DEFAULT TRUE; DECLARE DONE2 INT DEFAULT TRUE; DECLARE CUR CURSOR FOR SELECT DISTINCT(USER_ID) FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND LAST_EMP_LV>=30 AND PV>0; DECLARE CUR2 CURSOR FOR SELECT DISTINCT(USER_ID) FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND LAST_EMP_LV>=30 AND PV>0; DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = FALSE; SELECT IFNULL(MAX(INCREASE_PERCENT),0) INTO PERCENT1 FROM AR_BS_BONUS_REWARD_PARAMETER WHERE LEVEL_ID='67BE5FE7857C216AE055736AECE8644D'; SELECT IFNULL(MAX(INCREASE_PERCENT),0) INTO PERCENT2 FROM AR_BS_BONUS_REWARD_PARAMETER WHERE LEVEL_ID='E121497617216708616'; -- 备份AR_BS_BONUS_REWARD_PARAMETER DELETE FROM AR_BS_BONUS_REWARD_PARAMETER_HISTROY WHERE PERIOD_NUM=PCPID; INSERT INTO AR_BS_BONUS_REWARD_PARAMETER_HISTROY (LEVEL_ID,LEVEL_NAME,INCREASE_PERCENT,PERIOD_NUM) (SELECT LEVEL_ID,LEVEL_NAME,INCREASE_PERCENT,PCPID FROM AR_BS_BONUS_REWARD_PARAMETER); -- 平级奖计奖业绩 SELECT SUM(PV) INTO TOTALPV FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND LAST_EMP_LV>=30; -- 平级奖奖金和业绩占比 SELECT (SUM(PV)*0.15)/TOTALPV INTO RATE FROM AR_BS_BONUS_103_CALC; OPEN CUR; WHILE DONE DO FETCH CUR INTO USERID; IF DONE THEN SELECT SUM(PV) INTO PV3 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=30; UPDATE AR_BS_BONUS_103_CALC SET BONUS30 = PV3 * RATE WHERE USER_ID=USERID; END IF; END WHILE; CLOSE CUR; SELECT SUM(BONUS20)*PERCENT1 INTO REWARD_BONUS1 FROM AR_BS_BONUS_103_CALC WHERE USER_TYPE=20; SELECT SUM(BONUS30)*PERCENT2 INTO REWARD_BONUS2 FROM AR_BS_BONUS_103_CALC WHERE USER_TYPE=30; -- 备份高级专员的加发奖金 UPDATE AR_BS_BONUS_103_CALC SET REWARD20 = BONUS20*PERCENT1 WHERE USER_TYPE=20; -- 备份主任的加发奖金 UPDATE AR_BS_BONUS_103_CALC SET REWARD30 = BONUS30*PERCENT2 WHERE USER_TYPE=30; -- 特别奖励加发总奖金 SET REWARD_BONUS_TOTAL=REWARD_BONUS1+REWARD_BONUS2; -- 平级奖奖金和业绩占比 SELECT (SUM(PV)*0.15 -REWARD_BONUS_TOTAL)/TOTALPV INTO RATE2 FROM AR_BS_BONUS_103_CALC; -- 备份平级奖比例 UPDATE AR_BS_BONUS_103_CALC SET RATE = RATE2; SET DONE = TRUE; OPEN CUR2; WHILE DONE DO FETCH CUR2 INTO USERID; IF DONE THEN SELECT SUM(PV) INTO PV3 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=30; UPDATE AR_BS_BONUS_103_CALC SET BONUS30 = PV3 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV4 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=40; UPDATE AR_BS_BONUS_103_CALC SET BONUS40 = PV4 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV5 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=50; UPDATE AR_BS_BONUS_103_CALC SET BONUS50 = PV5 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV6 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=60; UPDATE AR_BS_BONUS_103_CALC SET BONUS60 = PV6 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV7 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=70; UPDATE AR_BS_BONUS_103_CALC SET BONUS70 = PV7 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV8 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=80; UPDATE AR_BS_BONUS_103_CALC SET BONUS80 = PV8 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV9 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=90; UPDATE AR_BS_BONUS_103_CALC SET BONUS90 = PV9 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV10 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=100; UPDATE AR_BS_BONUS_103_CALC SET BONUS100 = PV10 * RATE2 WHERE USER_ID=USERID; SELECT SUM(PV) INTO PV11 FROM AR_CALC_BONUS_BS_DETAIL_BONUS WHERE PERIOD_NUM=PCPID AND USER_ID=USERID AND LAST_EMP_LV=110; UPDATE AR_BS_BONUS_103_CALC SET BONUS110 = PV11 * RATE2 WHERE USER_ID=USERID; END IF; END WHILE; CLOSE CUR2; -- 达到高级专员加发高级专员奖 UPDATE AR_BS_BONUS_103_CALC SET BONUS20 = REWARD20 + BONUS20 WHERE USER_TYPE=20; -- 达到主任加发主任奖 UPDATE AR_BS_BONUS_103_CALC SET BONUS30 = REWARD30 + BONUS30 WHERE USER_TYPE=30; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCPOINT -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCPOINT`; delimiter ;; CREATE PROCEDURE `CALCPOINT`() BEGIN DECLARE MPOINTRATE DECIMAL ( 10, 2 ); SELECT VALUE / 100 INTO MPOINTRATE FROM AR_CONFIG WHERE CONFIG_NAME = 'bsNoPvPointsPercent'; UPDATE AR_BS_BONUS_103_CALC SET PRODUCT_POINT = PV * MPOINTRATE WHERE USER_TYPE10 = 0 AND USER_TYPE = 0 AND PV > 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCRECORD -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCRECORD`; delimiter ;; CREATE PROCEDURE `CALCRECORD`(IN `PID` INT, IN `PEVENT` VARCHAR ( 255 ), IN `PCPID` INT, IN `PNOW` DATETIME) BEGIN INSERT INTO AR_BS_BONUS_103_CALC_EVENT ( ID, EVENT, CREATION_TIME, CALC_PERIOD_ID ) VALUES ( PID, PEVENT, NOW(), PCPID ); END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCREFEREE -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCREFEREE`; delimiter ;; CREATE PROCEDURE `CALCREFEREE`(IN `PBONUSID` VARCHAR ( 50 ), OUT `PNEWBONUSID` VARCHAR ( 50 )) BEGIN DECLARE MUSERID, MBONUSID VARCHAR ( 50 ); DECLARE MUSERTYPE INT; /*SET MUSERID := PBONUSID; OUTER_LABEL : WHILE ( ISNULL( MBONUSID )) DO SELECT INTRODUCER_ID INTO MUSERID FROM AR_BS_BONUS_103_CALC_NET T WHERE T.USER_ID = MUSERID; IF ( MUSERID = 0 ) THEN SET PNEWBONUSID := NULL; LEAVE OUTER_LABEL; END IF; SELECT USER_TYPE INTO MUSERTYPE FROM AR_BS_BONUS_103_CALC_NET T WHERE T.USER_ID = MUSERID; IF ( MUSERTYPE >= 30 ) THEN SET PNEWBONUSID := MUSERID; LEAVE OUTER_LABEL; END IF; END WHILE;*/ SELECT INTRODUCER_ID30 INTO PNEWBONUSID FROM AR_BS_BONUS_103_CALC_NET WHERE USER_ID = PBONUSID; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCSTAT -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCSTAT`; delimiter ;; CREATE PROCEDURE `CALCSTAT`(IN `PCPID` INT) BEGIN INSERT INTO AR_CALC_BONUS_BS_STAT ( PERIOD_NUM, TOTAL_PV, BONUS10, PERCENT10, BONUS20, PERCENT20, BONUS30, PERCENT30, BONUS40, PERCENT40, BONUS50, PERCENT50, BONUS60, PERCENT60, BONUS70, PERCENT70, BONUS80, PERCENT80, BONUS90, PERCENT90, BONUS100, PERCENT100, BONUS110, PERCENT110, BONUS, PERCENT, CHECK_STATUS , BONUS_ABBR, BONUS_ABBR_PERCENT, BONUS_MNT, BONUS_MNT_PERCENT ) SELECT PCPID, SUM( PV ), SUM( BONUS10 ), 0, SUM( BONUS20 ), 0, SUM( BONUS30 ), 0, SUM( BONUS40 ), 0, SUM( BONUS50 ), 0, SUM( BONUS60 ), 0, SUM( BONUS70 ), 0, SUM( BONUS80 ), 0, SUM( BONUS90 ), 0, SUM( BONUS100 ), 0, SUM( BONUS110 ), 0, SUM( BONUS ), 0, 0 , SUM( BONUSYJ), 0, SUM(BONUSGL), 0 FROM AR_BS_BONUS_103_CALC; UPDATE AR_CALC_BONUS_BS_STAT SET PERCENT10 = BONUS10 / TOTAL_PV, PERCENT20 = BONUS20 / TOTAL_PV, PERCENT30 = BONUS30 / TOTAL_PV, PERCENT40 = BONUS40 / TOTAL_PV, PERCENT50 = BONUS50 / TOTAL_PV, PERCENT60 = BONUS60 / TOTAL_PV, PERCENT70 = BONUS70 / TOTAL_PV, PERCENT80 = BONUS80 / TOTAL_PV, PERCENT90 = BONUS90 / TOTAL_PV, PERCENT100 = BONUS100 / TOTAL_PV, PERCENT110 = BONUS110 / TOTAL_PV, PERCENT = BONUS / TOTAL_PV, BONUS_ABBR_PERCENT = BONUS_ABBR / TOTAL_PV, BONUS_MNT_PERCENT = BONUS_MNT /TOTAL_PV WHERE PERIOD_NUM = PCPID AND TOTAL_PV > 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCSUMMARY -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCSUMMARY`; delimiter ;; CREATE PROCEDURE `CALCSUMMARY`() BEGIN UPDATE AR_BS_BONUS_103_CALC T SET T.BONUS = BONUS10 + BONUS20 + BONUS30 + BONUS40 + BONUS50 + BONUS60 + BONUS70 + BONUS80 + BONUS90 + BONUS100 + BONUS110,T.BONUSYJ = BONUS10 + BONUS20,T.BONUSGL = BONUS30 + BONUS40 +BONUS50 + BONUS60 + BONUS70 +BONUS80 +BONUS90 +BONUS100 + BONUS110 WHERE T.BONUS10 > 0 OR T.BONUS20 > 0 OR T.BONUS30 > 0 OR T.BONUS40 > 0 OR T.BONUS50 > 0 OR T.BONUS60 > 0 OR T.BONUS70 > 0 OR T.BONUS80 > 0 OR T.BONUS90 > 0 OR T.BONUS100 > 0 OR T.BONUS110 > 0; UPDATE AR_BS_BONUS_103_CALC T SET GPV = 0 WHERE T.INTRODUCER_ID = '0' AND USER_TYPE = 0; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCTOTALGPV -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCTOTALGPV`; delimiter ;; CREATE PROCEDURE `CALCTOTALGPV`() BEGIN DECLARE MLAYER, MMINLAYER, MUSERTYPE INT DEFAULT 0; DECLARE MUSERID, MMAXUSERID VARCHAR ( 50 ); DECLARE MGPV DECIMAL ( 10, 2 ); SELECT MAX( LAYER ) INTO MLAYER FROM AR_BS_BONUS_103_CALC_NET WHERE GPV > 0; SELECT MIN( LAYER ) INTO MMINLAYER FROM AR_BS_BONUS_103_CALC_NET WHERE USER_TYPE = 30; UPDATE AR_BS_BONUS_103_CALC_NET T1 INNER JOIN AR_BS_BONUS_103_CALC_NET T2 ON IFNULL( T1.INTRODUCER_ID, '0' ) = T2.USER_ID AND T1.USER_TYPE = 30 AND T2.USER_TYPE = 30 SET T1.INTRODUCER_ID30 = T2.USER_ID; WHILE MLAYER > MMINLAYER DO CALL CALCTOTALGPV_ ( MLAYER, MMINLAYER ); SET MLAYER = MLAYER - 1; END WHILE; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCTOTALGPV_ -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCTOTALGPV_`; delimiter ;; CREATE PROCEDURE `CALCTOTALGPV_`(IN `PLAYER` INT, -- 第几层 IN `PMINLAYER` INT) BEGIN DECLARE FLAG, MLAYER, MINTLAYER, MUSERTYPE, MINTTYPE INT DEFAULT 0; DECLARE MGPV DECIMAL ( 10, 2 ); DECLARE MUSERID, MUSERINTID, MINTUSERID, MINTRODUCERID VARCHAR ( 50 ); DECLARE MC CURSOR FOR SELECT C.USER_ID, C.INTRODUCER_ID, C.USER_TYPE, C.GPV FROM ( SELECT USER_ID, IFNULL( INTRODUCER_ID, '0' ) INTRODUCER_ID, USER_TYPE, GPV FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = PLAYER AND GPV > 0 OR ( GPV = 0 AND USER_TYPE = 30 ) ORDER BY USER_ID DESC ) C; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG = 1; START TRANSACTION;-- 打开游标 OPEN MC;-- 获取结果 L2 : LOOP FETCH MC INTO MUSERID, MUSERINTID, MUSERTYPE, MGPV; IF FLAG = 1 THEN-- 当无法FETCH会触发HANDLER CONTINUE LEAVE L2; END IF; SET MLAYER = PLAYER; SET MINTUSERID = MUSERINTID; IF ( MINTUSERID != '0' ) THEN OUTLABEL : WHILE MLAYER > PMINLAYER DO SELECT INTRODUCER_ID, USER_TYPE, LAYER INTO MINTRODUCERID, MINTTYPE, MLAYER FROM AR_BS_BONUS_103_CALC_NET WHERE USER_ID = MINTUSERID; IF ( MINTUSERID != MUSERINTID AND MINTTYPE = 30 ) THEN UPDATE AR_BS_BONUS_103_CALC_NET SET TEAM_GPV = TEAM_GPV + MGPV WHERE USER_ID = MINTUSERID; IF ( MUSERTYPE = 30 ) THEN UPDATE AR_BS_BONUS_103_CALC_NET SET INTRODUCER_ID30 = MINTUSERID WHERE USER_ID = MUSERID AND INTRODUCER_ID30 IS NULL; END IF; LEAVE OUTLABEL; END IF; SET MINTUSERID = MINTRODUCERID; END WHILE; END IF;-- 关闭游标 END LOOP; CLOSE MC; COMMIT; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCUP30 -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCUP30`; delimiter ;; CREATE PROCEDURE `CALCUP30`() BEGIN START TRANSACTION; UPDATE AR_BS_BONUS_103_CALC_NET T1 SET T1.USER_TYPE = 30 WHERE USER_TYPE >= 10 AND DIRECTLY_UNDER >= 3; COMMIT; END ;; delimiter ; -- ---------------------------- -- Procedure structure for CALCUPGARDE -- ---------------------------- DROP PROCEDURE IF EXISTS `CALCUPGARDE`; delimiter ;; CREATE PROCEDURE `CALCUPGARDE`(IN `PLAYER` INT) BEGIN DECLARE MLAYER, MCOUNT, MCOUNT1, MCOUNT2 INT; SET MLAYER := PLAYER; SELECT COUNT(*) INTO MCOUNT FROM AR_BS_BONUS_103_CALC T WHERE T.LAYER = MLAYER AND USER_TYPE10 = 10 AND USER_TYPE = 0; IF ( MCOUNT > 0 ) THEN BREAKLABLE : WHILE MLAYER > 0 DO SELECT COUNT(*) INTO MCOUNT1 FROM AR_BS_BONUS_103_CALC T1 WHERE T1.USER_TYPE10 = 10 AND T1.LAYER = MLAYER - 1; UPDATE AR_BS_BONUS_103_CALC T1 INNER JOIN ( SELECT INTRODUCER_ID FROM AR_BS_BONUS_103_CALC WHERE LAYER = MLAYER AND USER_TYPE10 = 10 GROUP BY INTRODUCER_ID ) T2 ON T1.USER_ID = T2.INTRODUCER_ID AND T1.USER_TYPE10 = 0 AND T1.LAYER = MLAYER - 1 SET T1.USER_TYPE10 = 10, T1.USER_TYPE = 10; SELECT COUNT(*) INTO MCOUNT2 FROM AR_BS_BONUS_103_CALC T1 WHERE T1.USER_TYPE10 = 10 AND T1.LAYER = MLAYER - 1; IF ( MCOUNT1 = MCOUNT2 ) THEN LEAVE BREAKLABLE; END IF; SET MLAYER := MLAYER - 1; END WHILE; END IF; END ;; delimiter ; -- ---------------------------- -- Procedure structure for UPPERCASE -- ---------------------------- DROP PROCEDURE IF EXISTS `UPPERCASE`; delimiter ;; CREATE PROCEDURE `UPPERCASE`(IN DBNAME VARCHAR(200)) BEGIN DECLARE DONE INT DEFAULT 0; DECLARE OLDNAME VARCHAR(200); DECLARE CUR CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DBNAME; DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1; OPEN CUR; REPEAT FETCH CUR INTO OLDNAME; SET @NEWNAME = UPPER(OLDNAME); SET @ISNOTSAME = @NEWNAME <> BINARY OLDNAME; IF NOT DONE && @ISNOTSAME THEN SET @SQL = CONCAT('RENAME TABLE `',OLDNAME,'` TO `', LOWER(@NEWNAME), '_TMP` '); PREPARE TMPSTMT FROM @SQL; EXECUTE TMPSTMT; SET @SQL = CONCAT('RENAME TABLE `',LOWER(@NEWNAME),'_TMP` TO `',@NEWNAME, '`'); PREPARE TMPSTMT FROM @SQL; EXECUTE TMPSTMT; DEALLOCATE PREPARE TMPSTMT; END IF; UNTIL DONE END REPEAT; CLOSE CUR; END ;; delimiter ; SET FOREIGN_KEY_CHECKS = 1;