TonyY 2 лет назад
Родитель
Сommit
7ac1060c6f
21 измененных файлов с 1714 добавлено и 1 удалено
  1. 88 0
      CALC10.sql
  2. 154 0
      CALC20.sql
  3. 63 0
      CALC20_0.sql
  4. 101 0
      CALCBLUE.sql
  5. 168 0
      CALCCHECKING.sql
  6. 120 0
      CALCCLEAN.sql
  7. 102 0
      CALCINIT.sql
  8. 166 0
      CALCKEEP.sql
  9. 64 0
      CALCLEVEL.sql
  10. 125 0
      CALCLEVEL_.sql
  11. 149 0
      CALCMAIN.sql
  12. 22 0
      CALCPOINT.sql
  13. 10 0
      CALCRECORD.sql
  14. 47 0
      CALCREFEREE.sql
  15. 91 0
      CALCSTAT.sql
  16. 26 0
      CALCSUMMARY.sql
  17. 40 0
      CALCTOTALGPV.sql
  18. 105 0
      CALCTOTALGPV_.sql
  19. 14 0
      CALCUP30.sql
  20. 58 0
      CALCUPGARDE.sql
  21. 1 1
      test_test.sql

+ 88 - 0
CALC10.sql

@@ -0,0 +1,88 @@
+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
+;;

+ 154 - 0
CALC20.sql

@@ -0,0 +1,154 @@
+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
+;;

+ 63 - 0
CALC20_0.sql

@@ -0,0 +1,63 @@
+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
+;;

+ 101 - 0
CALCBLUE.sql

@@ -0,0 +1,101 @@
+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
+;;

+ 168 - 0
CALCCHECKING.sql

@@ -0,0 +1,168 @@
+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
+;
+;;

+ 120 - 0
CALCCLEAN.sql

@@ -0,0 +1,120 @@
+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
+;;

+ 102 - 0
CALCINIT.sql

@@ -0,0 +1,102 @@
+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
+;;

+ 166 - 0
CALCKEEP.sql

@@ -0,0 +1,166 @@
+DROP PROCEDURE IF EXISTS `CALCKEEP`;
+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
+;;

+ 64 - 0
CALCLEVEL.sql

@@ -0,0 +1,64 @@
+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
+;;

+ 125 - 0
CALCLEVEL_.sql

@@ -0,0 +1,125 @@
+DROP PROCEDURE IF EXISTS `CALCLEVEL_`;
+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
+;;

+ 149 - 0
CALCMAIN.sql

@@ -0,0 +1,149 @@
+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;
+
+-- 
+UPDATE AR_BS_BONUS_103_CALC SET ORI_RATE = RATE;
+
+OPEN CUR;
+
+WHILE DONE DO
+
+FETCH CUR INTO USERID;
+
+IF DONE THEN
+
+SELECT IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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 IFNULL(SUM(PV),0) 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
+;;

+ 22 - 0
CALCPOINT.sql

@@ -0,0 +1,22 @@
+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
+;;

+ 10 - 0
CALCRECORD.sql

@@ -0,0 +1,10 @@
+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
+;;

+ 47 - 0
CALCREFEREE.sql

@@ -0,0 +1,47 @@
+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
+;;

+ 91 - 0
CALCSTAT.sql

@@ -0,0 +1,91 @@
+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
+;;

+ 26 - 0
CALCSUMMARY.sql

@@ -0,0 +1,26 @@
+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
+;;

+ 40 - 0
CALCTOTALGPV.sql

@@ -0,0 +1,40 @@
+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
+;;

+ 105 - 0
CALCTOTALGPV_.sql

@@ -0,0 +1,105 @@
+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
+;;

+ 14 - 0
CALCUP30.sql

@@ -0,0 +1,14 @@
+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
+;;

+ 58 - 0
CALCUPGARDE.sql

@@ -0,0 +1,58 @@
+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
+;;

+ 1 - 1
test_test.sql

@@ -1,4 +1,4 @@
--- Active: 1688690638810@@127.0.0.1@3306@test_test
+-- Active: 1688690638810@@127.0.0.1@3306
 /*
  Navicat Premium Data Transfer