Ver Fonte

Merge branch 'feature/1988-blueStarBonusRecruitChange' of http://16.162.42.175:8014/guanli/ngds into feature/1962-memberBrandAmbassador

kevin_zhangl há 3 anos atrás
pai
commit
1bb59ef80b

+ 19 - 1
backendEle/src/views/config/emp-level-edit.vue

@@ -1,7 +1,7 @@
 <template>
   <div v-loading="loading">
     <div class="white-box">
-      <el-form ref="form" :model="form" label-width="100px" style="width:500px;">
+      <el-form ref="form" :model="form" label-width="200px" style="width:500px;">
         <el-form-item label="级别名称">
           <el-input v-model="form.levelName" :disabled="true"></el-input>
         </el-form-item>
@@ -46,6 +46,18 @@
           </el-slider>
         </el-form-item>
 
+        <el-form-item label="推荐会员达标数" v-show="otherPerfShow">
+          <el-input-number v-model="form.achieveMemberNum" :min="1" :max="10"></el-input-number>
+        </el-form-item>
+
+        <el-form-item label="邀请会员数不足时达标业绩BV" v-show="otherPerfShow">
+          <el-input v-model="form.achievePv"></el-input>
+        </el-form-item>
+
+        <el-form-item label="邀请会员数满足时达标业绩BV" v-show="otherPerfShow">
+          <el-input v-model="form.achievePerfPv"></el-input>
+        </el-form-item>
+
         <el-form-item>
           <el-button type="primary" @click="onSubmit" :loading="submitButtonStat">保存</el-button>
         </el-form-item>
@@ -77,6 +89,9 @@ export default {
         this.form.iconNum = parseInt(response.ICON_NUM)
         this.form.otherDepartPerf = parseFloat(response.OTHER_DEPART_PERF)
         this.allEmployLevel = response.allLevel
+        this.form.achieveMemberNum = parseInt(response.ACHIEVE_MEMBER_NUM)
+        this.form.achievePv = parseInt(response.ACHIEVE_PV)
+        this.form.achievePerfPv = parseInt(response.ACHIEVE_PERF_PV)
         this.loading = false
         if ( response.SORT === '1' ) {
           this.otherPerfShow = true;
@@ -101,6 +116,9 @@ export default {
         iconType: 0,
         iconNum: 0,
         otherDepartPerf:0,
+        achieveMemberNum: 0,
+        achievePv: 0,
+        achievePerfPv: 0,
       },
       allEmployLevel: [],
       loading: true,

+ 79 - 27
common/helpers/bonus/BonusCalc.php

@@ -307,12 +307,12 @@ class BonusCalc extends BaseObject {
 
             $this->calcBonusVilla();
             $t22 = microtime(true);
-            echo('计算房奖' . ($this->_sysConfig['openVilla']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t22 - $t21, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL . PHP_EOL);
+            echo('计算房奖' . ($this->_sysConfig['openVilla']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t22 - $t21, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             $this->_updatePercent(69);
 
             $this->calcBonusGarage();
             $t23 = microtime(true);
-            echo('计算车奖' . ($this->_sysConfig['openGarage']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t23 - $t22, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL . PHP_EOL);
+            echo('计算车奖' . ($this->_sysConfig['openGarage']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t23 - $t22, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             $this->_updatePercent(69);
 
             // 计算季度奖
@@ -1258,15 +1258,15 @@ class BonusCalc extends BaseObject {
                 //扣除相应的复消积分和管理费
                 $deductData = $this->deduct($userId, $teamBonus);
 
-                // 把对碰后的奖金存入缓存中
-                CalcCache::bonus($userId, $periodNum, 'BONUS_QY', $teamBonus, $deductData);
-
-                // TODO:取小腿值
+                // 取小腿值
                 $payLeg = min([$perfArr['SURPLUS_1L'], $perfArr['SURPLUS_2L']]);
                 // 计算荣衔星级
                 $starCrown = StarCrownLevel::getStarCrown($payLeg);
-                // 星级放入缓存
-                CalcCache::addUserStarCrown($userId, $periodNum, $starCrown['ID']);
+
+                // 是否活跃
+                $isActive = $this->_isPerfActive($userId);
+                $oriBonus = $isActive ? $teamBonus : 0;
+                $lastCrownLv = $isActive ? $starCrown['ID'] : StarCrownLevel::getDefaultLevelId();
 
                 //团队奖流水
                 $insertBonusData[] = [
@@ -1275,10 +1275,10 @@ class BonusCalc extends BaseObject {
                     'ORI_CAPPED_BONUS_QY' => $capBonusQy,
                     'LAST_DEC_LV' => $userBaseInfo['DEC_LV'],
                     'LAST_EMP_LV' => $userBaseInfo['EMP_LV'],
-                    'LAST_CROWN_LV' => $starCrown['ID'],
+                    'LAST_CROWN_LV' => $lastCrownLv,
                     'LAST_STATUS' => $userBaseInfo['STATUS'],
                     'AMOUNT' => $deductData['surplus'],
-                    'ORI_BONUS' => $teamBonus,
+                    'ORI_BONUS' => $oriBonus,
                     'RECONSUME_POINTS' => $deductData['reConsumePoints'],
                     'MANAGE_TAX' => $deductData['manageTax'],
                     'PERIOD_NUM' => $this->_periodNum,
@@ -1293,8 +1293,18 @@ class BonusCalc extends BaseObject {
                         'nowDecLevelConfig' => $nowDecLevelConfig,
                         'decLevel' => $userBaseInfo['DEC_LV'],
                     ]),
+                    'IS_ACTIVE' => (int)$isActive,
+                    'HOPE_CROWN_LV' => $starCrown['ID'],
+                    'HOPE_BONUS' => $teamBonus,
                 ];
 
+                // 星级放入缓存
+                CalcCache::addUserStarCrown($userId, $periodNum, $lastCrownLv);
+                if ($oriBonus > 0) {
+                    // 把对碰后的奖金存入缓存中
+                    CalcCache::bonus($userId, $periodNum, 'BONUS_QY', $oriBonus, $deductData);
+                }
+
                 unset($perfData, $pervSurplusPerf, $perfArr, $oriPerfArr, $touchPerfArr, $userBaseInfo, $decLevelConfig, $touchBonusArr, $userId, $nowDecLevelConfig, $teamBonus, $deductData);
             }
             CalcBonusQY::batchInsert($insertBonusData);
@@ -2097,19 +2107,35 @@ class BonusCalc extends BaseObject {
                 $manageTax = $deductData['manageTax']; // 管理费
                 $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
 
+                // 是否活跃会员
+                $isActive = $this->_isPerfActive($user['USER_ID']);
+                $oriBonus = $isActive ? $user['ORI_BONUS_MNT'] : 0;
+                $lastEmpLv = $isActive ? $user['LEVEL_ID'] : EmployLevel::getDefaultLevelId();
+
                 // 管理奖钻卡发放
 //                if (in_array($user['LAST_DEC_LV'], $minDecLevel)) {
+                if ($oriBonus > 0) {
                     // 把对碰后的奖金存入缓存中
-                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_MNT', $user['ORI_BONUS_MNT'], $deductData);
+                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_MNT', $oriBonus, $deductData);
                     // 加入月奖的会员
                     CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                }
 //                }
 
                 // 更新蓝星奖金存储过程的实发金额数据
-                CalcBonusBS::updateAll([
-                    'RECONSUME_POINTS' => $point,
-                    'AMOUNT_MNT' => $realBonusBs,
-                    'MANAGE_TAX_MNT' => $manageTax],
+                CalcBonusBS::updateAll(
+                    [
+                        'ORI_BONUS' => $user['ORI_BONUS'] + $oriBonus,
+                        'RECONSUME_POINTS' => $point,
+                        'AMOUNT_MNT' => $realBonusBs,
+                        'MANAGE_TAX_MNT' => $manageTax,
+                        'IS_ACTIVE' => (int)$isActive,
+                        'HOPE_BONUS' => $user['ORI_BONUS_MNT'] + $user['HOPE_BONUS_ABBR'],
+                        'HOPE_EMP_LV' => $user['LEVEL_ID'],
+                        'HOPE_BONUS_MNT' => $user['ORI_BONUS_MNT'],
+                        'ORI_BONUS_MNT' => $oriBonus,
+                        'LEVEL_ID' => $lastEmpLv,
+                    ],
                 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', 
                 [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
             }
@@ -2150,20 +2176,36 @@ class BonusCalc extends BaseObject {
                 $manageTax = $deductData['manageTax']; // 管理费
                 $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
 
+                // 是否活跃会员
+                $isActive = $this->_isPerfActive($user['USER_ID']);
+                $oriBonus = $isActive ? $user['ORI_BONUS_ABBR'] : 0;
+                $lastEmpLv = $isActive ? $user['LEVEL_ID'] : EmployLevel::getDefaultLevelId();
+
                 // 业绩奖金卡、钻卡发放
 //                if (in_array($user['LAST_DEC_LV'], $minDecLevel)) {
                     // 把对碰后的奖金存入缓存中
-                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_ABBR', $user['ORI_BONUS_ABBR'], $deductData);
-                    // 加入月奖的会员
-                    CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_ABBR', $oriBonus, $deductData);
+                    if ($oriBonus > 0) {
+                        // 加入月奖的会员
+                        CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                    }
 //                }
 
                 // 更新蓝星业绩奖金存储过程的实发金额数据
-                CalcBonusBS::updateAll([
-                    'AMOUNT_ABBR' => $realBonusBs,
-                    'MANAGE_TAX_ABBR' => $manageTax,
-                    'RECONSUME_POINTS' => $point],
-            'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM',
+                CalcBonusBS::updateAll(
+                    [
+                        'ORI_BONUS' => $oriBonus,
+                        'AMOUNT_ABBR' => $realBonusBs,
+                        'MANAGE_TAX_ABBR' => $manageTax,
+                        'RECONSUME_POINTS' => $point,
+                        'IS_ACTIVE' => (int)$isActive,
+                        'HOPE_BONUS' => $user['ORI_BONUS_ABBR'],
+                        'HOPE_EMP_LV' => $user['LEVEL_ID'],
+                        'HOPE_BONUS_ABBR' => $user['ORI_BONUS_ABBR'],
+                        'ORI_BONUS_ABBR' => $oriBonus,
+                        'LEVEL_ID' => $lastEmpLv,
+                    ],
+        'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM',
                     [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
             }
             return $this->calcBonusBsYJ($offset + $this->_limit);
@@ -4079,16 +4121,26 @@ class BonusCalc extends BaseObject {
     // 判断是否满足月最低消费
     public function _isMonthPerfLimit($userId) {
         $userMonthTotal = PerfMonth::find()->where(
-            'USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH', 
+            'USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH',
             ['USER_ID'=>$userId, 'CALC_MONTH'=>$this->_calcYearMonth]
         )
-        ->asArray()
-        ->one();
+            ->asArray()
+            ->one();
         $fxPvStatus = false;
         if (isset($userMonthTotal['PV_PCS']) && $userMonthTotal['PV_PCS'] >= $this->_sysConfig['monthPcsPvFxCondition']['VALUE']) {
             $fxPvStatus = true;
         }
-        
+
         return $fxPvStatus;
     }
+
+    // 判断会员是否活跃
+    public function _isPerfActive($userId): bool
+    {
+        $pv = PerfPeriod::find()->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH AND PERIOD_NUM<=:PERIOD_NUM',
+            ['USER_ID'=>$userId, 'CALC_MONTH'=>$this->_calcYearMonth, 'PERIOD_NUM'=>$this->_periodNum])
+            ->SUM('PV_PCS');
+
+        return $pv >= $this->_sysConfig['monthPcsPvFxCondition']['VALUE'];
+    }
 }

+ 3 - 0
common/models/CalcBonusBS.php

@@ -24,6 +24,9 @@ use Yii;
  * @property string $LOGS 日志
  * @property $ORI_BONUS 原奖金
  * @property $MANAGE_TAX 管理费
+ * @property int $IS_ACTIVE 是否活跃
+ * @property string $HOPE_CROWN_LV 应有starCrown级别
+ * @property string $HOPE_BONUS 应得奖金
  */
 class CalcBonusBS extends \common\components\ActiveRecord
 {

+ 3 - 0
common/models/CalcBonusQY.php

@@ -21,6 +21,9 @@ use Yii;
  * @property $ORI_BONUS 原奖金
  * @property $RECONSUME_POINTS 重复消费积分
  * @property $MANAGE_TAX 管理费
+ * @property int $IS_ACTIVE 是否活跃
+ * @property string $HOPE_CROWN_LV 应有starCrown级别
+ * @property string $HOPE_BONUS 应得奖金
  */
 class CalcBonusQY extends \common\components\ActiveRecord
 {

+ 3 - 0
common/models/EmployLevel.php

@@ -34,6 +34,9 @@ use yii\helpers\Json;
  * @property string $UPGRADE_SCORE 升级分数
  * @property string $TOURISM_PERCENT 旅游奖比例
  * @property string $GARAGE_PERCENT 车房奖比例
+ * @property int $ACHIEVE_MEMBER_NUM 推荐会员达标数
+ * @property string $ACHIEVE_PV 邀请会员数不足时达标业绩PV
+ * @property string $ACHIEVE_PERF_PV 邀请会员数满足时达标业绩PV
  */
 class EmployLevel extends \common\components\ActiveRecord
 {

+ 7 - 1
common/models/forms/EmployLevelForm.php

@@ -24,6 +24,9 @@ class EmployLevelForm extends Model {
     public $iconType;               // 等级排序
     public $iconNum;               // 等级排序
     public $otherDepartPerf;       // 其它部门的累计推荐业绩
+    public $achieveMemberNum;   // 当月邀请会员数
+    public $achievePv;          // 邀请会员数不及格后获奖BV值
+    public $achievePerfPv;      // 邀请会员数及格后获奖BV值
 
     public function init() {
         parent::init();
@@ -37,7 +40,7 @@ class EmployLevelForm extends Model {
      */
     public function rules() {
         return [
-            [['id', 'levelName', 'locationNum', 'locationPerf', 'newPerf', 'minEmployLevel', 'sort', 'iconType', 'iconNum', 'otherDepartPerf'], 'trim', 'on' => ['add', 'edit']],
+            [['id', 'levelName', 'locationNum', 'locationPerf', 'newPerf', 'minEmployLevel', 'sort', 'iconType', 'iconNum', 'otherDepartPerf', 'achieveMemberNum', 'achievePv', 'achievePerfPv'], 'trim', 'on' => ['add', 'edit']],
             [['id'], 'required', 'on' => 'edit'],
             [['id'], 'exist', 'targetClass' => EmployLevel::class, 'targetAttribute' => 'ID'],
             [['levelName', 'locationNum', 'locationPerf', 'newPerf', 'sort'], 'required'],
@@ -97,6 +100,9 @@ class EmployLevelForm extends Model {
         $model->ICON_TYPE = $this->iconType;
         $model->ICON_NUM = $this->iconNum;
         $model->OTHER_DEPART_PERF = $this->otherDepartPerf;
+        $model->ACHIEVE_MEMBER_NUM = $this->achieveMemberNum ?? 0;
+        $model->ACHIEVE_PV = $this->achievePv ?? 0;
+        $model->ACHIEVE_PERF_PV = $this->achievePerfPv ?? 0;
         if ($model->save()) {
             return $model;
         } else {

+ 520 - 0
sql/upgrade/1988.sql

@@ -0,0 +1,520 @@
+-- 总监级别表增加推荐会员相关属性
+ALTER TABLE `AR_EMPLOY_LEVEL` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数' AFTER `ACHIEVE_PV`;
+ALTER TABLE `AR_EMPLOY_LEVEL` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV' AFTER `ACHIEVE_MEMBER_NUM`;
+
+-- 蓝星管理奖增加推荐会员相关属性
+ALTER TABLE `AR_BS_BONUS_103_CALC` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数';
+ALTER TABLE `AR_BS_BONUS_103_CALC` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV';
+
+ALTER TABLE `AR_BS_BONUS_103_TEST` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数';
+ALTER TABLE `AR_BS_BONUS_103_TEST` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV';
+
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV';
+
+
+
+-- 蓝星管理奖存储过程修改
+CREATE DEFINER=`black_tea_0309`@`%` PROCEDURE `CALCINIT`(IN `PCPID` INT, IN `PCALCMONTH` TINYINT, IN `PCALCYEAR` INT)
+BEGIN
+
+    DECLARE
+        AC_USER_NO INT;     -- 邀请会员达标数
+    DECLARE
+        MLIMITPV,   -- 邀请会员不及格达标PV
+        AC_PERF_PV DECIMAL ( 10, 2 );   -- 邀请会员及格达标PV
+
+    -- 查询第一个级别的邀请会员数、达标PV值以及等奖比例
+    SELECT
+        T.ACHIEVE_PV,
+        T.ACHIEVE_PERF_PV,
+        T.ACHIEVE_MEMBER_NUM
+    INTO MLIMITPV, AC_PERF_PV, AC_USER_NO
+    FROM
+        AR_EMPLOY_LEVEL T
+    WHERE
+        T.ID = 'E121497617216708615';
+
+    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,
+        ACHIEVE_MEMBER_NUM,
+        ACHIEVE_PERF_PV
+    ) 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,
+          IFNULL(DO.ACHIEVE_MEMBER_NUM, 0) AS ACHIEVE_NUM,
+          IF(DO.ACHIEVE_MEMBER_NUM >= AC_USER_NO, AC_PERF_PV, MLIMITPV) AS ACHIEVE_PV
+    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
+    LEFT JOIN (
+        SELECT
+            R.PARENT_UID,
+            COUNT(O.USER_ID) AS ACHIEVE_MEMBER_NUM,
+            GROUP_CONCAT(CONCAT(O.USER_ID, '_', U.USER_NAME, '_', O.PERIOD_NUM) separator ' | ') AS ACHIEVE_MEMBER
+        FROM
+            AR_PERF_ORDER O
+                INNER JOIN AR_USER_RELATION_NEW R ON O.USER_ID = R.USER_ID
+                INNER JOIN AR_USER U ON O.USER_ID = U.ID
+        WHERE
+                O.CALC_MONTH = PCALCMONTH AND O.DEC_TYPE = 'ZC'
+        GROUP BY R.PARENT_UID
+    ) DO ON DO.PARENT_UID = AU.ID
+    WHERE
+            AU.DELETED = 0;
+
+END
+
+
+
+CREATE DEFINER=`black_tea_0309`@`%` 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';
+    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 < T.ACHIEVE_PERF_PV 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 >= T.ACHIEVE_PERF_PV
+              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
+
+
+
+
+
+
+CREATE DEFINER=`black_tea_0309`@`%` 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';
+    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 < T.ACHIEVE_PERF_PV 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 >= T.ACHIEVE_PERF_PV
+              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
+
+
+
+
+CREATE DEFINER=`black_tea_0309`@`%` 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_MNT,
+        MANAGE_TAX_MNT,
+        AMOUNT_MNT,
+        ORI_BONUS_ABBR,
+        MANAGE_TAX_ABBR,
+        AMOUNT_ABBR,
+        ACHIEVE_MEMBER_NUM,
+        ACHIEVE_PERF_PV
+    ) 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.BONUS_MNT, 0 ),
+          0,
+          IFNULL( A.BONUS_MNT, 0 ),
+          IFNULL( A.BONUS_ABBR, 0 ),
+          0,
+          IFNULL( A.BONUS_ABBR, 0 ),
+          A.ACHIEVE_MEMBER_NUM,
+          A.ACHIEVE_PERF_PV
+    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_MNT,
+        MANAGE_TAX_MNT,
+        AMOUNT_MNT,
+        ORI_BONUS_ABBR,
+        MANAGE_TAX_ABBR,
+        AMOUNT_ABBR
+    ) 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.BONUS_MNT, 0 ),
+          0,
+          IFNULL( A.BONUS_MNT, 0 ),
+          IFNULL( A.BONUS_ABBR, 0 ),
+          0,
+          IFNULL( A.BONUS_ABBR, 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

+ 9 - 0
sql/upgrade/2022_09_05_1969.sql

@@ -0,0 +1,9 @@
+ALTER TABLE `AR_CALC_BONUS_QY` ADD COLUMN `IS_ACTIVE` TINYINT NOT NULL DEFAULT '0' COMMENT '是否活跃: 0否 1是';
+ALTER TABLE `AR_CALC_BONUS_QY` ADD COLUMN `HOPE_CROWN_LV` varchar(32) COLLATE utf8mb4_bin DEFAULT '' COMMENT '应有starCrown级别';
+ALTER TABLE `AR_CALC_BONUS_QY` ADD COLUMN `HOPE_BONUS` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得奖金';
+
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `IS_ACTIVE` TINYINT NOT NULL DEFAULT '0' COMMENT '是否活跃: 0否 1是';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_EMP_LV` varchar(32) COLLATE utf8mb4_bin DEFAULT '' COMMENT '应有starDir级别';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_BONUS` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得奖金';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_BONUS_MNT` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得管理奖金';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_BONUS_ABBR` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得绩效奖金';