root пре 3 година
родитељ
комит
447f5f2bd2

+ 12 - 35
common/helpers/bonus/CalcCache.php

@@ -8,16 +8,14 @@
 namespace common\helpers\bonus;
 
 use common\helpers\Cache;
-use common\models\CalcBonus;
-use common\models\CalcBonusBS;
 use common\models\PerfMonth;
 use common\models\Period;
 use common\models\DeclarationLevel;
 use common\models\DecRole;
+use common\models\DeductReconsume;
 use common\models\EmployLevel;
 use common\models\StarCrownLevel;
 use common\models\User;
-use common\models\UserBonus;
 use common\models\UserPerf;
 use Yii;
 use common\models\UserInfo;
@@ -76,7 +74,6 @@ class CalcCache {
     const REDIS_KEY_PREFIX_HAS_REPAIR_PERF_USER_POOL = 'calc:hasRepairPerfPool_';
 
     const INCOME_QY_BONUS_BD = 'BONUS_QY_BD';
-    const INCOME_QY_BONUS_FX = 'BONUS_QY_FX';
     const INCOME_BONUS_TRAVEL = 'BONUS_TRAVEL';
     const INCOME_BONUS_CAR = 'BONUS_CAR';
     const INCOME_BONUS_HOUSE = 'BONUS_HOUSE';
@@ -86,7 +83,6 @@ class CalcCache {
     ];
     const NOT_SEND_BONUS_LIST = [
         self::INCOME_QY_BONUS_BD,
-        self::INCOME_QY_BONUS_FX,
         self::INCOME_BONUS_TRAVEL,
         self::INCOME_BONUS_CAR,
         self::INCOME_BONUS_HOUSE,
@@ -403,23 +399,6 @@ class CalcCache {
         return Yii::$app->redis->lrange(self::REDIS_KEY_PREFIX_HAS_MONTH_BONUS_USER . $periodNum, $offset, ($offset + $limit - 1));
     }
 
-
-    /**
-     * 加入月奖的会员
-     * @param $userId
-     * @param $periodNum
-     */
-    public static function addHasMonthBonusUsers($userId, $periodNum) {
-        // 先从已存在的会员池里面获取
-        $isset = Yii::$app->redis->hget(self::REDIS_KEY_PREFIX_HAS_MONTH_BONUS_USER_POOL . $periodNum, $userId);
-        if (!$isset) {
-            Yii::$app->redis->hset(self::REDIS_KEY_PREFIX_HAS_MONTH_BONUS_USER_POOL . $periodNum, $userId, 1);
-            Yii::$app->redis->rpush(self::REDIS_KEY_PREFIX_HAS_MONTH_BONUS_USER . $periodNum, $userId);
-        }
-
-        unset($userId, $periodNum, $isset);
-    }
-
     /**
      * 保存服务奖奖金
      * @param $userId
@@ -552,6 +531,11 @@ class CalcCache {
         return $list;
     }
 
+    // 从缓存获取哪些奖金需要扣除管理费和复消积分
+    public static function deductBonus($periodNum) {
+
+    }
+
     /**
      * 获取会员信息从缓存
      * @param $userId
@@ -636,7 +620,12 @@ class CalcCache {
         if ($cacheValue) {
             $value = Json::decode($cacheValue, true);
         } else {
-            $value = CalcBonus::findUseDbCalc()->select(["SUM(RECONSUME_POINTS) as RECONSUME_POINTS_SUM"])->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH', [':USER_ID' => $userId, ':CALC_MONTH'=>$calcYearMonth])->asArray()->one();
+            $value = DeductReconsume::findUseDbCalc()
+            ->select(["RECONSUME_POINTS_SUM"])
+            ->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH', [':USER_ID' => $userId, ':CALC_MONTH'=>$calcYearMonth])
+            ->asArray()
+            ->one();
+            //$value = CalcBonus::findUseDbCalc()->select(["SUM(RECONSUME_POINTS) as RECONSUME_POINTS_SUM"])->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH', [':USER_ID' => $userId, ':CALC_MONTH'=>$calcYearMonth])->asArray()->one();
             \Yii::$app->redis->hset($cacheKey, $userId, Json::encode($value));
         }
         return $value;
@@ -992,10 +981,6 @@ class CalcCache {
             'BONUS_BS' => 0,
             'BONUS_QUARTER' => 0,
             'ORI_BONUS_BS' => 0,
-            'BONUS_BS_MNT' => 0,
-            'BONUS_BS_ABBR' => 0,
-            'ORI_BONUS_BS_MNT' => 0,
-            'ORI_BONUS_BS_ABBR' => 0,
             'ORI_BONUS_QUARTER' => 0,
             'ORI_BONUS_TG' => 0,
             'ORI_BONUS_QY' => 0,
@@ -1004,14 +989,6 @@ class CalcCache {
             'RECONSUME_POINTS' => 0,
             'MANAGE_TAX' => 0,
             'ORI_CAPPED_BONUS_QY' => 0,// 团队奖,封顶前金额
-            //没有用到的
-            'BONUS_FX' => 0,
-            'BONUS_HB' => 0,
-            'BONUS_BT' => 0,
-            'BONUS_BT_PROD' => 0,
-            'BONUS_BT_TOOL' => 0,
-            'DEDUCT_ZR' => 0,
-            'BONUS_FL' => 0,
         ];
         // 从 redis 中获取当前的结果
         $cacheValue = \Yii::$app->redis->hget($cacheKey, $userId);

+ 34 - 256
common/helpers/bonus/CalcServeBonusCalc.php

@@ -131,22 +131,18 @@ class CalcServeBonusCalc extends BaseObject {
             echo('初始化、清空缓存及相关数据表完成,耗时:' . round($t4 - $t1, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             $this->_updatePercent(10);
             // 蓝星奖放到最前面 奖金计算开始
-            if($this->_sysConfig['openGL']['VALUE']) {
+            if($this->_sysConfig['openBS']['VALUE']) {
                 echo('计算蓝星奖开始,' . date('Y-m-d H:i:s', $t4) . PHP_EOL);
                 // 调用存储过程,计算蓝星管理奖金
                 $this->calcBsProcedure();
                 // 将有蓝星管理奖金的用户加入到有奖金缓存用户中
                 $this->calcBonusBsGL();
-                // 将有【蓝星业绩奖金】的用户加入到有奖金缓存用户中
-                // $this->calcBonusBsYJ();
-                // // 将有【蓝星管理奖金】的用户加入到有奖金缓存用户中
-                // $this->calcBonusBsGL();
                 if ($this->_isCalcMonth) {
                     ServeProcess::recordProcess($t4, time(), $this->_periodNum, '计算蓝星奖', 'bonus');
                 }
             }
             $t5 = microtime(true);
-            echo('计算蓝星奖'.($this->_sysConfig['openGL']['VALUE']?'完成':'关闭').',耗时:' . round($t5 - $t4, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            echo('计算蓝星奖'.($this->_sysConfig['openBS']['VALUE']?'完成':'关闭').',耗时:' . round($t5 - $t4, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
 
             if($this->_sysConfig['openFW']['VALUE']) {
                 $this->calcBonusBDStepOne();
@@ -235,18 +231,15 @@ class CalcServeBonusCalc extends BaseObject {
      * 结算完成
      */
     public function endCalcTask() {
-        // 更新结算状态
-        $this->setCalcStatus('end');
+        $this->setCalcStatus('end');// 更新结算状态
     }
 
     /**
      * 结算错误
      */
     public function errorCalcTask() {
-        // 清空所有本期结算用到的缓存
-        CalcCache::clearCalcBonusCache($this->_periodNum);
-        // 更新结算状态
-        $this->setCalcStatus('fail');
+        CalcCache::clearCalcBonusCache($this->_periodNum); // 清空所有本期结算用到的缓存
+        $this->setCalcStatus('fail'); // 更新结算状态
     }
 
     /**
@@ -333,12 +326,7 @@ class CalcServeBonusCalc extends BaseObject {
 
                 // 获取会员的报单级别
                 $userBaseInfo = CalcCache::getUserInfo($bonusUserId, $this->_periodNum);
-
-                // 最后统一扣除管理费和复消积分
                 CalcCache::bonus($bonusUserId, $this->_periodNum, 'BONUS_TG', $recBonus);                
-                // 扣除相应的复消积分和管理费
-                // $deductData = $this->deduct($bonusUserId, $recBonus);
-                // CalcCache::bonus($bonusUserId, $periodNum, 'BONUS_TG', $recBonus, $deductData);
 
                 //来源会员信息
                 $fromUserInfo = CalcCache::getUserInfo($userId, $this->_periodNum);
@@ -375,7 +363,6 @@ class CalcServeBonusCalc extends BaseObject {
         return true;
     }
 
-
     /**
      * 服务奖第一步
      * @param int $offset
@@ -565,10 +552,6 @@ class CalcServeBonusCalc extends BaseObject {
                 CalcCache::bonus($userId, $periodNum, 'CAPPED_BONUS_QY', $capBonusQy); 
 
                 CalcCache::bonus($userId, $periodNum, 'BONUS_QY', $teamBonus);
-                // //扣除相应的复消积分和管理费 --- 最后统一扣除管理费和复消积分
-                // $deductData = $this->deduct($userId, $teamBonus);
-                // CalcCache::bonus($userId, $periodNum, 'BONUS_QY', $teamBonus, $deductData);
-
                 // TODO:取小腿值
                 $payLeg = min([$perfArr['SURPLUS_1L'], $perfArr['SURPLUS_2L']]);
                 // 计算荣衔星级
@@ -611,7 +594,6 @@ class CalcServeBonusCalc extends BaseObject {
 
     /**
      * 季度奖计算
-     *
      */
     public function calcQuarter() {
         if( !$this->_isCalcMonth || !in_array($this->_calcMonth, [3,6,9,12])) {
@@ -733,10 +715,7 @@ class CalcServeBonusCalc extends BaseObject {
                 if ($bonusData['LAST_DEC_LV'] == $minDecLevel) {
                     // 放入缓存
                     CalcCache::tourismBonus($bonusData['USER_ID'], $this->_periodNum, $amount);
-                    // 加入月奖的会员
-                    CalcCache::addHasMonthBonusUsers($bonusData['USER_ID'], $this->_periodNum);
                 }
-
                 $bonusData['AMOUNT'] = $amount;
                 $bonusData['POINT_COMPLEX'] = $bonusPointComplex;
             }
@@ -749,7 +728,6 @@ class CalcServeBonusCalc extends BaseObject {
 
     // 执行房奖的计算
     public function calcBonusVilla() {
-        // 月结,如果不是月结点,则直接退出
         if (!$this->_isCalcMonth) {
             return true;
         }
@@ -842,8 +820,6 @@ class CalcServeBonusCalc extends BaseObject {
 
                 // 放入缓存
                 CalcCache::villaBonus($bonusData['USER_ID'], $this->_periodNum, $amount);
-                // 加入月奖的会员
-                CalcCache::addHasMonthBonusUsers($bonusData['USER_ID'], $this->_periodNum);
             }
 
             CalcBonusVilla::batchInsert($insertBonusData);
@@ -964,8 +940,6 @@ class CalcServeBonusCalc extends BaseObject {
 
                 // 放入缓存
                 CalcCache::garageBonus($bonusData['USER_ID'], $this->_periodNum, $amount);
-                // 加入月奖的会员
-                CalcCache::addHasMonthBonusUsers($bonusData['USER_ID'], $this->_periodNum);
             }
 
             CalcBonusGarage::batchInsert($insertBonusData);
@@ -976,7 +950,6 @@ class CalcServeBonusCalc extends BaseObject {
 
     /**
      * 季度奖写用户缓存
-     *
      */
     public function calcQuarterUser(int $offset = 0) {
         if( !$this->_isCalcMonth || !in_array($this->_calcMonth, [3,6,9,12])) {
@@ -994,28 +967,11 @@ class CalcServeBonusCalc extends BaseObject {
             // 达标条件:会员级别:钻卡
             $config = json_decode($this->_sysConfig['openQuarter']['OPTIONS'], true);
             $minDecLevel = $config['declarationLevel'] ?? [];
-
             foreach ($allData as $user) {
-                // 扣除相应的复消积分和管理费
-                $deductData = $this->deduct($user['USER_ID'], $user['ORI_BONUS']);
-                $realBonusBs = $deductData['surplus']; // 扣除管理费和复消积分后的实发蓝星奖金
-                $manageTax = $deductData['manageTax']; // 管理费
-                $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
                 // 管理奖钻卡发放
                 if ($user['LAST_DEC_LV'] == $minDecLevel) {
-                    // 把对碰后的奖金存入缓存中
-                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_QUARTER', $user['ORI_BONUS'], $deductData);
-                    // 加入月奖的会员
-                    CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_QUARTER', $user['ORI_BONUS']);
                 }
-
-                // 更新奖金存储过程的实发金额数据
-                CalcBonusQuarter::updateAll([
-                    'RECONSUME_POINTS' => $point,
-                    'AMOUNT' => $realBonusBs,
-                    'MANAGE_TAX' => $manageTax],
-                    'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM',
-                    [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
             }
             return $this->calcQuarterUser($offset + $this->_limit);
         }
@@ -1025,9 +981,6 @@ class CalcServeBonusCalc extends BaseObject {
 
     /**
      * 蓝星管理奖金未拆分
-     * @param int $offset
-     * @return bool
-     * @throws \yii\db\Exception
      */
     public function calcBonusBsGL(int $offset = 0) {
         if( !$this->_isCalcMonth ) {
@@ -1055,119 +1008,8 @@ class CalcServeBonusCalc extends BaseObject {
         return true;
     }
 
-//     /**
-//      * 蓝星管理奖金
-//      * @param int $offset
-//      * @return bool
-//      * @throws \yii\db\Exception
-//      */
-//     public function calcBonusBsGL(int $offset = 0) {
-//         if( !$this->_isCalcMonth ) {
-//             // 不是结算月,则不进行计算
-//             return false;
-//         }
-//         // 从缓存获取分页有收入的会员信息
-//         $allData = CalcBonusBS::findUseDbCalc()
-//             ->where('PERIOD_NUM=:PERIOD_NUM', [':PERIOD_NUM' => $this->_periodNum])
-//             ->groupBy('USER_ID')
-//             ->offset($offset)
-//             ->limit($this->_limit)
-//             ->asArray()
-//             ->all();
-//         if ($allData) {
-//             // 达标条件:会员级别:钻卡
-//             $config = json_decode($this->_sysConfig['openGL']['OPTIONS'], true);
-//             $minDecLevel = $config['mntDec'] ?? [];
-
-//             foreach ($allData as $user) {
-//                 //扣除相应的复消积分和管理费
-//                 $deductData = $this->deduct($user['USER_ID'], $user['ORI_BONUS_MNT']);
-//                 $realBonusBs = $deductData['surplus']; // 扣除管理费和复消积分后的实发蓝星奖金
-//                 $manageTax = $deductData['manageTax']; // 管理费
-//                 $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
-
-//                 // 管理奖钻卡发放
-// //                if (in_array($user['LAST_DEC_LV'], $minDecLevel)) {
-//                     // 把对碰后的奖金存入缓存中
-//                     CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_MNT', $user['ORI_BONUS_MNT'], $deductData);
-//                     // 加入月奖的会员
-//                     CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
-// //                }
-
-//                 // 更新蓝星奖金存储过程的实发金额数据
-//                 CalcBonusBS::updateAll([
-//                     'RECONSUME_POINTS' => $point,
-//                     'AMOUNT_MNT' => $realBonusBs,
-//                     'MANAGE_TAX_MNT' => $manageTax],
-//                 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', 
-//                 [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
-//             }
-//             return $this->calcBonusBsGL($offset + $this->_limit);
-//         }
-//         unset($allData);
-//         return true;
-//     }
-
-//     /**
-//      * 蓝星业绩奖金
-//      * @param int $offset
-//      * @return bool
-//      * @throws \yii\db\Exception
-//      */
-//     public function calcBonusBsYJ(int $offset = 0) {
-//         if( !$this->_isCalcMonth ) {
-//             // 不是结算月,则不进行计算
-//             return false;
-//         }
-//         // 从缓存获取分页有收入的会员信息
-//         $allData = CalcBonusBS::findUseDbCalc()
-//             ->where('PERIOD_NUM=:PERIOD_NUM', [':PERIOD_NUM' => $this->_periodNum])
-//             ->groupBy('USER_ID')
-//             ->offset($offset)
-//             ->limit($this->_limit)
-//             ->asArray()
-//             ->all();
-//         if ($allData) {
-//             // 达标条件:会员级别:金卡、钻卡
-//             $config = json_decode($this->_sysConfig['openGL']['OPTIONS'], true);
-//             $minDecLevel = $config['abbrDec'] ?? [];
-
-//             foreach ($allData as $user) {
-//                 //扣除相应的复消积分和管理费
-//                 $deductData = $this->deduct($user['USER_ID'], $user['ORI_BONUS_ABBR']);
-//                 $realBonusBs = $deductData['surplus']; // 扣除管理费和复消积分后的实发蓝星奖金
-//                 $manageTax = $deductData['manageTax']; // 管理费
-//                 $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
-
-//                 // 业绩奖金卡、钻卡发放
-// //                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);
-// //                }
-
-//                 // 更新蓝星业绩奖金存储过程的实发金额数据
-//                 CalcBonusBS::updateAll([
-//                     'AMOUNT_ABBR' => $realBonusBs,
-//                     'MANAGE_TAX_ABBR' => $manageTax,
-//                     'RECONSUME_POINTS' => $point],
-//             'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM',
-//                     [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
-//             }
-//             return $this->calcBonusBsYJ($offset + $this->_limit);
-//         }
-//         unset($allData);
-//         return true;
-//     }
-
     /**
      * 对碰
-     * @param array $oriPerfArr
-     * @param array $perfArr
-     * @param $percent
-     * @param $loopTimes
-     * @return array
      */
     public function touchPerf(array $oriPerfArr, array $perfArr, $percent, $loopTimes=1) {
         $resultArr = $oriPerfArr;
@@ -1297,10 +1139,6 @@ class CalcServeBonusCalc extends BaseObject {
 
     /**
      * 扣除复消积分和管理费
-     * @param $userId
-     * @param $bonus
-     * @return array
-     * @throws \yii\db\Exception
      */
     public function deduct($userId, $bonus) {
         //判断是否达到了本月扣除复消的上限
@@ -1340,9 +1178,6 @@ class CalcServeBonusCalc extends BaseObject {
 
     /**
      * 循环奖服务奖金会员,并入库
-     * @param int $offset
-     * @return bool
-     * @throws \yii\db\Exception
      */
     public function loopBonusUsers($offset = 0) {
         echo sprintf("时间:[%s]缓存奖金数据入库,当前offset为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $offset);
@@ -1367,13 +1202,10 @@ class CalcServeBonusCalc extends BaseObject {
     }
 
     /**
-     * 奖金
-     * @param $userId
-     * @return array
-     * @throws \yii\db\Exception
+     * 奖金入库
      */
     public function bonusData($userId) {
-        // 从缓存中获取用户的奖金
+        // 车奖和房奖是积分,不参加到奖金累计中.季度奖季度发放,无最低消费限制
         $bonus = CalcCache::bonus($userId, $this->_periodNum);
         $baseInfo = CalcCache::getUserInfo($userId, $this->_periodNum);
         $perfData = CalcCache::nowPeriodPerf($userId, $this->_periodNum);
@@ -1381,70 +1213,30 @@ class CalcServeBonusCalc extends BaseObject {
         $garageBonus = CalcCache::garageBonus($userId, $this->_periodNum);
         $villaBonus = CalcCache::villaBonus($userId, $this->_periodNum);
         $pervSurplusPerf = CalcCache::surplusPerf($userId, $this->_periodNum);
-        // 星级
-        $starCrownLv = CalcCache::getUserStarCrown($userId, $this->_periodNum);
-
-        //没有共享和管理奖
-        $bonusReal = $bonus['BONUS_BD'] + $bonus['BONUS_TG'] + $bonus['BONUS_XF'] + $bonus['BONUS_YJ'] + 
-        $bonus['BONUS_QY'] + $bonus['BONUS_YC'] + $bonus['BONUS_YC_EXTRA'] + $bonus['BONUS_VIP'] + 
-        $bonus['BONUS_BS_MNT'] + $bonus['BONUS_BS_ABBR'] + $bonus['BONUS_QUARTER'];
-        $realBonusGx = 0;
-        $realBonusGl = 0;
-        $realBonusBs = 0; // 蓝星管理奖. BlueStar
-        $blueStartOriBonus = 0;
-        $blueStartManageTax = 0;
-        $exchangePoints = 0; // 蓝星奖管理奖. 产生的兑换积分
-
-        $realBonusBsMnt = 0; // 蓝星管理奖——实发奖金
-        $blueStartOriBonusMnt = 0;  // 蓝星管理奖——原奖金
-        $blueStartManageTaxMnt = 0;   // 蓝星管理奖——管理费
-
-        $realBonusBsAbbr = 0; // 蓝星业绩奖——实发奖金
-        $blueStartOriBonusAbbr = 0; // 蓝星业绩奖——原奖金
-        $blueStartManageTaxAbbr = 0;   // 蓝星业绩奖——管理费
-        if( $this->_isCalcMonth ) {
-            // 个人月消费PV大于配置值,才会计算发放蓝星奖
-            $fxPvStatus = $this->_isMonthPerfLimit($userId);
-            // BONUS_REAL 字段是发到用户的真实奖金
-            if ( $fxPvStatus ) {
-                $userBS = CalcBonusBS::find()
-                ->where(
-                    'PERIOD_NUM=:PERIOD_NUM AND USER_ID=:USER_ID',
-                    [
-                        ':PERIOD_NUM' => $this->_periodNum,
-                        ':USER_ID' => $userId
-                    ]
-                )
-                ->select('AMOUNT,ORI_BONUS,MANAGE_TAX,LEVEL_ID,PRODUCT_POINT,AMOUNT_MNT,ORI_BONUS_MNT,MANAGE_TAX_MNT,AMOUNT_ABBR,ORI_BONUS_ABBR,MANAGE_TAX_ABBR')
-                ->limit(1)
-                ->orderBy('CREATED_AT DESC')
-                ->asArray()
-                ->all();
-
-                $userBS = is_array($userBS) ? reset($userBS) : [];
-                $blueStartAmount = isset($userBS['AMOUNT']) && !empty($userBS['AMOUNT']) ? $userBS['AMOUNT'] : 0; // 奖金
-                $blueStartOriBonus = isset($userBS['ORI_BONUS']) && !empty($userBS['ORI_BONUS']) ? $userBS['ORI_BONUS'] : 0; // 原奖金
-                $blueStartManageTax = isset($userBS['MANAGE_TAX']) && !empty($userBS['MANAGE_TAX']) ? $userBS['MANAGE_TAX'] : 0; // 管理费
-
-                $realBonusBsMnt = $userBS['AMOUNT_MNT'] ?? 0; // 蓝星管理奖. 实发奖金
-                $blueStartOriBonusMnt = $userBS['ORI_BONUS_MNT'] ?? 0; // 蓝星管理奖. 原奖金
-                $blueStartManageTaxMnt = $userBS['MANAGE_TAX_MNT'] ?? 0; // 蓝星管理奖. 管理费
-
-                $realBonusBsAbbr = $userBS['AMOUNT_ABBR'] ?? 0; // 蓝星业绩奖. 奖金
-                $blueStartOriBonusAbbr = $userBS['ORI_BONUS_ABBR'] ?? 0; // 蓝星业绩奖. 原奖金
-                $blueStartManageTaxAbbr = $userBS['MANAGE_TAX_ABBR'] ?? 0; // 蓝星业绩奖. 管理费
-
-                $blueStartManageTax += $blueStartManageTaxMnt + $blueStartManageTaxAbbr; // 管理费
-
-                $realBonusBs = $blueStartAmount; // 蓝星奖直接取数据库中算好的值PRODUCT_POINT
-                $exchangePoints = isset($userBS['PRODUCT_POINT']) && !empty($userBS['PRODUCT_POINT']) ? $userBS['PRODUCT_POINT'] : 0; // 兑换积分
-            }
+        $starCrownLv = CalcCache::getUserStarCrown($userId, $this->_periodNum);// 星级
+
+        $bonusReal = '0.000'; // 总实发
+        $deductConfig = Cache::getSystemConfig()['deductBonusItem']['OPTIONS'];     
+        $deductConfig = json_decode($deductConfig, true); // {"deduct":["BONUS_BS","BONUS_QY","BONUS_QUARTER"],"noDeduct":["BONUS_BD","BONUS_TG"]}
+        $noDeduct = $deductConfig['noDeduct']; // 不需要扣除的奖金项
+        $deduct = $deductConfig['deduct']; // 需要扣除的奖金项
+        $totalDeductSum = '0.000'; // 需要扣除的奖金项,扣除完之后的实发金额
+        $deductManageTax = '0.000'; //  扣除的管理费
+        $deductReconsumePoints = '0.000'; //  扣除的复消积分
+        foreach($noDeduct as $v) {
+            $bonusReal+= $bonus[$v]; // 累加不需要扣除奖的项
         }
-
-        if( $this->_isCalcMonth ) { //季度奖
-            if(in_array($this->_calcMonth, [3,6,9,12])){ // 季度奖
-            }
+        foreach($deduct as $v) {
+            $totalDeductSum+= $bonus[$v]; // 需要扣除的累计之和
         }
+        if ($totalDeductSum > 0) {
+            // 进行扣除管理费和复消积分
+            $tempDeduct = $this->deduct($userId, $totalDeductSum);
+            $totalDeductSum = $tempDeduct['surplus'];
+            $deductManageTax = $tempDeduct['manageTax'];
+            $deductReconsumePoints = $tempDeduct['reConsumePoints'];
+        }
+        $bonusReal += $totalDeductSum;
 
         $result = [
             'USER_ID' => $userId,
@@ -1458,34 +1250,20 @@ class CalcServeBonusCalc extends BaseObject {
             'LAST_REC_REAL_NAME' => $baseInfo['REC_REAL_NAME'],
             'LAST_CON_USER_NAME' => $baseInfo['CON_USER_NAME'],
             'LAST_CON_REAL_NAME' => $baseInfo['CON_REAL_NAME'],
-            'EXCHANGE_POINTS' => $exchangePoints, // 兑换积分
 //            'LAST_LOCATION' => $baseInfo['LOCATION'] ? $baseInfo['LOCATION'] : 1,
             //@todo
             'LAST_LOCATION' => 1,
             'BONUS_BD' => $bonus['BONUS_BD'],
             'BONUS_TG' => $bonus['BONUS_TG'],
             'BONUS_QY' => $bonus['BONUS_QY'],
-            'RECONSUME_POINTS' => $bonus['RECONSUME_POINTS'],
-            'MANAGE_TAX' => $blueStartManageTax,    // 管理费
+            'RECONSUME_POINTS' => $deductReconsumePoints,
+            'MANAGE_TAX' => $deductManageTax,    // 管理费
             'BONUS_INCOME'=>$bonus['INCOME_TOTAL'],
             'BONUS_REAL'=>  $bonusReal,
             'BONUS_TOTAL'=>$bonus['BONUS_TOTAL'],
             'ORI_BONUS_BD' => $bonus['ORI_BONUS_BD'],
             'ORI_BONUS_TG' => $bonus['ORI_BONUS_TG'],
-
-            'BONUS_BS' => $realBonusBs, // 新的管理奖金,即蓝星管理奖
-            'ORI_BONUS_BS' => $blueStartOriBonus, // 蓝星管理奖金原奖金,即包含管理费
-            'REAL_BONUS_BS' => $realBonusBs, // 实发蓝星管理奖金
-
-            'BONUS_BS_MNT' => $realBonusBsMnt, // 蓝星管理奖
-            'ORI_BONUS_BS_MNT' => $blueStartOriBonusMnt, // 蓝星管理奖金原奖金,即包含管理费
-            'REAL_BONUS_BS_MNT' => $realBonusBsMnt, // 实发蓝星管理奖金
-            'MANAGE_TAX_MNT' => $blueStartManageTaxMnt,  // 实发蓝星管理——管理费
-
-            'BONUS_BS_ABBR' => $realBonusBsAbbr, // 蓝星业绩奖
-            'ORI_BONUS_BS_ABBR' => $blueStartOriBonusAbbr, // 蓝星业绩奖金原奖金,即包含管理费
-            'REAL_BONUS_BS_ABBR' => $realBonusBsAbbr, // 实发蓝星业绩奖金
-            'MANAGE_TAX_ABBR' => $blueStartManageTaxAbbr, // 实发蓝星业绩奖——管理费
+            'ORI_BONUS_BS' => $bonus['ORI_BONUS_BS'], // 蓝星管理奖金原奖金
 
             'ORI_BONUS_QY' => $bonus['ORI_BONUS_QY'],
             'ORI_CAPPED_BONUS_QY' => $bonus['ORI_CAPPED_BONUS_QY'], // 团队奖封顶前的奖金
@@ -1521,7 +1299,7 @@ class CalcServeBonusCalc extends BaseObject {
         ];
         $resend = [];
 
-        unset($bonus, $realBonusGx, $realBonusGl, $bonusReal);
+        unset($bonus, $realBonusGl, $bonusReal);
         return ['result'=>$result,'resend'=>$resend];
     }
 

+ 50 - 0
common/models/DeductReconsume.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace common\models;
+
+/**
+ * This is the model class for table "{{%DEDUCT_RECONSUME}}".
+ *
+ * @property string $ID
+ * @property string $USER_ID 会员ID
+ * @property int $RECONSUME_POINTS_SUM 结算月累计复消积分之和
+ * @property int $CALC_MONTH 变动的结算月
+ * @property int $CREATED_AT 创建时间
+ */
+class DeductReconsume extends \common\components\ActiveRecord
+{
+    /**
+     * {@inheritdoc}
+     */
+    public static function tableName()
+    {
+        return '{{%DEDUCT_RECONSUME}}';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rules()
+    {
+        return [
+            [['ID', 'USER_ID', 'CALC_MONTH', 'CREATED_AT'], 'required'],
+            [['CALC_MONTH', 'CREATED_AT'], 'integer'],
+            [['ID', 'USER_ID'], 'string', 'max' => 32],
+            [['ID'], 'unique'],
+        ];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function attributeLabels()
+    {
+        return [
+            'ID' => 'ID',
+            'USER_ID' => '会员ID',
+            'CALC_MONTH' => '变动的结算月',
+            'RECONSUME_POINTS_SUM' => '此结算月累计复消积分总和',
+            'CREATED_AT' => '创建时间',
+        ];
+    }
+}