فهرست منبع

Merge branch 'master' into feature/NG-15

kevin 1 سال پیش
والد
کامیت
89ea89b556

+ 99 - 34
common/helpers/bonus/BonusCalc.php

@@ -40,6 +40,9 @@ use common\models\CalcBonusYJ;
 use common\models\CalcMonthBonusUser;
 use common\models\CalcMonthBonusUser;
 use common\models\Config;
 use common\models\Config;
 use common\models\FlowDeductZR;
 use common\models\FlowDeductZR;
+use common\models\Order;
+use common\models\OrderGoods;
+use common\models\OrderShop;
 use common\models\PerfCompany;
 use common\models\PerfCompany;
 use common\models\PerfMonth;
 use common\models\PerfMonth;
 use common\models\PerfPeriod;
 use common\models\PerfPeriod;
@@ -51,6 +54,7 @@ use common\models\EmployLevel;
 use common\models\FlowBonus;
 use common\models\FlowBonus;
 use common\models\PerfActiveUser;
 use common\models\PerfActiveUser;
 use common\models\ScoreMonth;
 use common\models\ScoreMonth;
+use common\models\ShopGoods;
 use common\models\StarCrownLevel;
 use common\models\StarCrownLevel;
 use common\models\User;
 use common\models\User;
 use common\models\UserInfo;
 use common\models\UserInfo;
@@ -840,42 +844,71 @@ class BonusCalc extends BaseObject {
                 unset($perfData, $decRoleBonusFrom);
                 unset($perfData, $decRoleBonusFrom);
                 if ( $validPvPcs <= 0 ) continue;
                 if ( $validPvPcs <= 0 ) continue;
 
 
-                $this->loopRelationParentDo($userId, function ($parent) use($userId, $validPvPcs){
-
-                    //判断parent的报单中心级别 和 服务奖比例
-                    $bonusUserId = $parent['PARENT_UID'];
-                    //计算级别之后更新过userInfo的缓存,缓存中级别发生了变化
-                    $bonusUserInfo = CalcCache::getUserInfo($bonusUserId, $this->_periodNum);
-                    $isDec = $bonusUserInfo['IS_DEC'];
-                    if($isDec == 0) return self::LOOP_CONTINUE;
-                    $decRoleId = $bonusUserInfo['DEC_ROLE_ID'];
-                    if( !$decRoleId ) return self::LOOP_CONTINUE;
-                    if( !isset($this->_decRoleConfig[$decRoleId]) ) return self::LOOP_CONTINUE;
-
-                    $parentDecRoleLevel = $this->_decRoleConfig[$decRoleId];
-                    $parentFwBonusPercent = $parentDecRoleLevel['FW_BONUS_PERCENT'] ?? 0;
-                    $cacheMaxPercent = CalcCache::fwMaxBonusPercent($userId, $this->_periodNum);
-                    $diffPercent = $parentFwBonusPercent - $cacheMaxPercent;
-                    if( $diffPercent <= 0 ) return self::LOOP_CONTINUE;
-
-                    $fwBonus = $validPvPcs * $diffPercent / 100;
-                    if( $fwBonus <= 0  ) return self::LOOP_CONTINUE;
-
-                    //给本人添加服务奖比例
-                    CalcCache::fwMaxBonusPercent($userId, $this->_periodNum, $parentFwBonusPercent);
-                    //记录奖金和奖金来源到缓存 并实现在缓存中奖金累加
-                    CalcCache::saveFwBonusList($bonusUserId, $this->_periodNum, $fwBonus, ['fromUid'=>$userId, 'fromPvPcs'=>$validPvPcs]);
-                    CalcCache::addHasFwBonusUsers($bonusUserId, $this->_periodNum);
+                // 查询会员产生时,填写的报单中心
+                $bonusUserId = DecOrder::find()->where('TO_USER_ID=:TO_USER_ID', [':TO_USER_ID' => $userId])->select('DEC_ID')->column();
+                echo 'BonusCalcFw. ' . json_encode(['bonusCalc', $userId, $bonusUserId]);
+                //判断parent的报单中心级别 和 服务奖比例
+                //计算级别之后更新过userInfo的缓存,缓存中级别发生了变化
+                $bonusUserInfo = CalcCache::getUserInfo($bonusUserId, $this->_periodNum);
+                $isDec = $bonusUserInfo['IS_DEC'];
+                if ($isDec == 0) {
+                    return self::LOOP_CONTINUE; // 如果不是报单中心则跳过循环
+                }
 
 
-                    //达到最大的比例就不在向上找了
-//                    if( $parentFwBonusPercent >= $maxLevelPercent ) return self::LOOP_FINISH;
-                    unset($bonusUserId, $bonusUserInfo, $isDec, $decRoleId, $parentDecRoleLevel, $parentFwBonusPercent, $cacheMaxPercent, $diffPercent, $fwBonus);
-                });
+                $decRoleId = $bonusUserInfo['DEC_ROLE_ID'];
+                if( !$decRoleId ) return self::LOOP_CONTINUE;
+                if( !isset($this->_decRoleConfig[$decRoleId]) ) return self::LOOP_CONTINUE;
+
+                // 取报单中心级别对应的拿奖比例
+                $parentDecRoleLevel = $this->_decRoleConfig[$decRoleId];
+                $parentFwBonusPercent = $parentDecRoleLevel['FW_BONUS_PERCENT'] ?? 0;
+                $cacheMaxPercent = CalcCache::fwMaxBonusPercent($userId, $this->_periodNum);
+                $diffPercent = $parentFwBonusPercent - $cacheMaxPercent;
+                if( $diffPercent <= 0 ) return self::LOOP_CONTINUE;
+
+                $fwBonus = $validPvPcs * $diffPercent / 100;
+                if( $fwBonus <= 0  ) return self::LOOP_CONTINUE;
+
+                //给本人添加服务奖比例
+                CalcCache::fwMaxBonusPercent($userId, $this->_periodNum, $parentFwBonusPercent);
+                //记录奖金和奖金来源到缓存 并实现在缓存中奖金累加
+                CalcCache::saveFwBonusList($bonusUserId, $this->_periodNum, $fwBonus, ['fromUid'=>$userId, 'fromPvPcs'=>$validPvPcs]);
+                CalcCache::addHasFwBonusUsers($bonusUserId, $this->_periodNum);
+
+//                $this->loopRelationParentDo($userId, function ($parent) use($userId, $validPvPcs) {
+//                    //判断parent的报单中心级别 和 服务奖比例
+//                    $bonusUserId = $parent['PARENT_UID'];
+//                    //计算级别之后更新过userInfo的缓存,缓存中级别发生了变化
+//                    $bonusUserInfo = CalcCache::getUserInfo($bonusUserId, $this->_periodNum);
+//                    $isDec = $bonusUserInfo['IS_DEC'];
+//                    if($isDec == 0) return self::LOOP_CONTINUE;
+//                    $decRoleId = $bonusUserInfo['DEC_ROLE_ID'];
+//                    if( !$decRoleId ) return self::LOOP_CONTINUE;
+//                    if( !isset($this->_decRoleConfig[$decRoleId]) ) return self::LOOP_CONTINUE;
+//
+//                    $parentDecRoleLevel = $this->_decRoleConfig[$decRoleId];
+//                    $parentFwBonusPercent = $parentDecRoleLevel['FW_BONUS_PERCENT'] ?? 0;
+//                    $cacheMaxPercent = CalcCache::fwMaxBonusPercent($userId, $this->_periodNum);
+//                    $diffPercent = $parentFwBonusPercent - $cacheMaxPercent;
+//                    if( $diffPercent <= 0 ) return self::LOOP_CONTINUE;
+//
+//                    $fwBonus = $validPvPcs * $diffPercent / 100;
+//                    if( $fwBonus <= 0  ) return self::LOOP_CONTINUE;
+//
+//                    //给本人添加服务奖比例
+//                    CalcCache::fwMaxBonusPercent($userId, $this->_periodNum, $parentFwBonusPercent);
+//                    //记录奖金和奖金来源到缓存 并实现在缓存中奖金累加
+//                    CalcCache::saveFwBonusList($bonusUserId, $this->_periodNum, $fwBonus, ['fromUid'=>$userId, 'fromPvPcs'=>$validPvPcs]);
+//                    CalcCache::addHasFwBonusUsers($bonusUserId, $this->_periodNum);
+//
+//                    //达到最大的比例就不在向上找了
+////                    if( $parentFwBonusPercent >= $maxLevelPercent ) return self::LOOP_FINISH;
+//                    unset($bonusUserId, $bonusUserInfo, $isDec, $decRoleId, $parentDecRoleLevel, $parentFwBonusPercent, $cacheMaxPercent, $diffPercent, $fwBonus);
+//                });
 
 
                 unset($userId, $validPvPcs);
                 unset($userId, $validPvPcs);
-
-
             }
             }
+
             unset($allData, $insertBonusData);
             unset($allData, $insertBonusData);
             return $this->calcBonusBDStepOne($offset + $this->_limit);
             return $this->calcBonusBDStepOne($offset + $this->_limit);
         }
         }
@@ -4126,13 +4159,45 @@ class BonusCalc extends BaseObject {
         return $fxPvStatus;
         return $fxPvStatus;
     }
     }
 
 
-    // 判断会员是否活跃
+    // 判断会员是否活跃:1. 当月消费30BV. 2.任意水机+150粒的EKSP. (满足任意条件即可)
     public function _isPerfActive($userId): bool
     public function _isPerfActive($userId): bool
     {
     {
+        // 条件1: 当月消费30BV
         $pv = PerfPeriod::find()->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH AND PERIOD_NUM<=:PERIOD_NUM',
         $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])
             ['USER_ID'=>$userId, 'CALC_MONTH'=>$this->_calcYearMonth, 'PERIOD_NUM'=>$this->_periodNum])
             ->SUM('PV_PCS');
             ->SUM('PV_PCS');
 
 
-        return $pv >= $this->_sysConfig['monthPcsPvFxCondition']['VALUE'];
+        if ($pv >= $this->_sysConfig['monthPcsPvFxCondition']['VALUE']) {
+            return true;
+        }
+
+
+        $calcMonth = $this->_calcYear . ($this->_calcMonth == 1 ? '0' . $this->_calcMonth : $this->_calcMonth);
+
+        // 条件2: 任意水机+150粒的EKSP(HES150N)
+        $orderEKSP = Order::find()
+            ->alias('O')
+            ->join('INNER JOIN', OrderGoods::tableName() . ' AS G', 'O.SN = G.ORDER_SN')
+            ->where("O.IS_DELETE=0 AND O.USER_ID=:USER_ID AND LEFT(O.P_CALC_MONTH, 7)=:P_CALC_MONTH AND O.PERIOD_NUM<=:PERIOD_NUM AND G.SKU_CODE=:SKU_CODE",
+                ['USER_ID' => $userId, 'P_CALC_MONTH' => $calcMonth, 'PERIOD_NUM' => $this->_periodNum, ':SKU_CODE' => 'HES150N'])
+            ->count();
+        if (!$orderEKSP) {
+            return false;
+        }
+
+        // 所有分期商品
+        $instalmentShopGoods = ShopGoods::find()->where('INSTALMENT>0 AND STATUS=1')->select('GOODS_NO')->column();
+        $instalmentShopGoods = implode("','", $instalmentShopGoods);
+        $orderInstalment = Order::find()
+            ->alias('O')
+            ->join('INNER JOIN', OrderGoods::tableName() . ' AS G', 'O.SN = G.ORDER_SN')
+            ->where("O.IS_DELETE=0 AND O.USER_ID=:USER_ID AND LEFT(O.P_CALC_MONTH, 7)=:P_CALC_MONTH AND O.PERIOD_NUM<=:PERIOD_NUM AND G.SKU_CODE IN ('{$instalmentShopGoods}')",
+                ['USER_ID' => $userId, 'P_CALC_MONTH' => $calcMonth, 'PERIOD_NUM' => $this->_periodNum])
+            ->count();
+        if (!$orderInstalment) {
+            return false;
+        }
+
+        return true;
     }
     }
 }
 }

+ 170 - 1
common/helpers/bonus/Calc/PushBaseDataToCalc.php

@@ -9,12 +9,14 @@
 namespace common\helpers\bonus\Calc;
 namespace common\helpers\bonus\Calc;
 
 
 use common\components\ActiveRecord;
 use common\components\ActiveRecord;
+use common\helpers\LoggerTool;
 use common\models\CalcBonus;
 use common\models\CalcBonus;
 use common\models\CalcBonusBS;
 use common\models\CalcBonusBS;
 use common\models\CalcBonusQY;
 use common\models\CalcBonusQY;
 use common\models\CalcRecord;
 use common\models\CalcRecord;
 use common\models\EmployLevel;
 use common\models\EmployLevel;
 use common\models\forms\DeclarationForm;
 use common\models\forms\DeclarationForm;
+use common\models\Order;
 use common\models\PerfMonth;
 use common\models\PerfMonth;
 use common\models\PerfOrder;
 use common\models\PerfOrder;
 use common\models\PerfPeriod;
 use common\models\PerfPeriod;
@@ -178,6 +180,35 @@ class PushBaseDataToCalc extends BaseBusiness
             'SURPLUS_5L_FX',
             'SURPLUS_5L_FX',
             'PV_PSS_TOTAL',
             'PV_PSS_TOTAL',
         ]],
         ]],
+        // --- 报单订单表
+        'decOrder' => ['table' => 'AR_DEC_ORDER', 'field' => [
+            'ID',
+            'DEC_SN',
+            'ORDER_SN',
+            'USER_ID',
+            'TO_USER_ID',
+            'TYPE',
+            'IS_ADMIN',
+            'DEC_AMOUNT',
+            'PAID_WALLET',
+            'IS_BATCH',
+            'REMARK',
+            'REC_USER_ID',
+            'CON_USER_ID',
+            'PERIOD_NUM',
+            'P_CALC_MONTH',
+            'CALC_MONTH',
+            'CREATED_AT',
+            'UPDATER',
+            'UPDATED_AT',
+            'IS_DEL',
+            'DELETED_AT',
+            'DEC_ID',
+            'DETAIL_TYPE',
+            'UPGRADE_TYPE',
+            'ORI_LV',
+            'UPGRADE_LV',
+        ]],
         //--- 团队奖明细表, 月节点的时候,需要将这个结算月的所有数据都同步过来
         //--- 团队奖明细表, 月节点的时候,需要将这个结算月的所有数据都同步过来
         'calcBonusQy'      => ['separately' => true, 'table' => 'AR_CALC_BONUS_QY', 'field' => [
         'calcBonusQy'      => ['separately' => true, 'table' => 'AR_CALC_BONUS_QY', 'field' => [
             'ID',
             'ID',
@@ -308,6 +339,116 @@ class PushBaseDataToCalc extends BaseBusiness
             'TOP_DEEP',
             'TOP_DEEP',
             'CREATED_AT',
             'CREATED_AT',
         ]],
         ]],
+        // --- 订单表
+        'order' => ['table' => 'AR_ORDER', 'field' => [
+            'ID',
+            'SN',
+            'DEC_SN',
+            'USER_ID',
+            'USER_NAME',
+            'ORDER_TYPE',
+            'ORDER_AMOUNT',
+            'PV',
+            'PAY_AMOUNT',
+            'PAY_PV',
+            'ORDER_AMOUNT_STANDARD',
+            'PAY_AMOUNT_STANDARD',
+            'EXCHANGE_RATE',
+            'PAY_AT',
+            'FREIGHT',
+            'PAY_FREIGHT',
+            'DELIVERY_STATUS',
+            'DELIVERY_PERIOD',
+            'DELIVERY_AT',
+            'EXPRESS_COMPANY',
+            'ORDER_TRACK_NO',
+            'EXPRESS_TYPE',
+            'FRONT_REMARK',
+            'REMARK',
+            'NOTE',
+            'PERIOD_NUM',
+            'STATUS',
+            'CONSIGNEE',
+            'MOBILE',
+            'TEL',
+            'PROVINCE',
+            'CITY',
+            'COUNTY',
+            'CITY_NAME',
+            'LGA_NAME',
+            'ADDRESS',
+            'P_CALC_MONTH',
+            'CREATED_AT',
+            'CREATE_USER',
+            'UPDATED_AT',
+            'UPDATER',
+            'IS_DELETE',
+            'DELETED_AT',
+            'PAY_TYPE',
+            'WAREHOUSE',
+            'EMAIL',
+            'REMAIN_PV',
+            'IS_AUTO',
+            'ORDER_CATEGORY',
+            'DEC_USER_ID',
+        ]],
+        // --- 订单商品表
+        'orderGoods' => ['table' => 'AR_ORDER_GOODS', 'field' => [
+            'ID',
+            'ORDER_SN',
+            'GOODS_ID',
+            'GOODS_TITLE',
+            'PRICE',
+            'REAL_PRICE',
+            'PV',
+            'REAL_PV',
+            'STANDARD_PRICE',
+            'EXCHANGE_RATE',
+            'TAX_RATE',
+            'REAL_STANDARD_PRICE',
+            'SKU_CODE',
+            'BUY_NUMS',
+            'P_CALC_MONTH',
+            'POINT',
+            'EMAIL',
+            'CATEGORY_TYPE',
+            'PAY_TYPE',
+            'REMAIN_PV',
+        ]],
+        // --- 商品表
+        'shopGoods' => ['table' => 'AR_SHOP_GOODS', 'field' => [
+            'ID',
+            'GOODS_NAME',
+            'CATE_ID',
+            'TYPE',
+            'GOODS_NO',
+            'UNIT',
+            'COVER',
+            'IMAGES',
+            'CONTENT',
+            'SELL_PRICE',
+            'SELL_PRICE_STANDARD',
+            'MARKET_PRICE',
+            'PRICE_PV',
+            'TAX_RATE',
+            'STORE_NUMS',
+            'STATUS',
+            'CREATED_AT',
+            'UPDATED_AT',
+            'SORT',
+            'IS_DEL',
+            'DELETED_AT',
+            'POINT',
+            'SELL_TYPE',
+            'GIFT_TYPE',
+            'SELL_DISCOUNT',
+            'CATEGORY_TYPE',
+            'STATUS_DATE',
+            'GOODS_DATE',
+            'GOODS_STATUS_DATE',
+            'PV_SPLIT',
+            'INSTALMENT',
+        ]],
     ];
     ];
 
 
     public function __construct($periodNum)
     public function __construct($periodNum)
@@ -391,7 +532,35 @@ class PushBaseDataToCalc extends BaseBusiness
                     }
                     }
                     $field = implode(',', $fieldArray);
                     $field = implode(',', $fieldArray);
                     $model = 'common\models\\' . ucfirst($method);
                     $model = 'common\models\\' . ucfirst($method);
-                    $data  = $model::find()->select($field)->limit($this->_limit)->offset($_offset * $this->_limit)->asArray()->all();
+
+                    $where = '1=1';
+                    if ($table == 'AR_ORDER') {
+                        $periodObj = Period::instance();
+                        $calcYear = $periodObj->getYear($this->_periodNum);
+                        $calcMonth = $periodObj->getMonth($this->_periodNum);
+                        $periodList = $periodObj->getYearMonthAllPeriod($calcYear, $calcMonth);
+                        $periodList = implode("','", $periodList);
+
+                        $where = "IS_DELETE = 0 AND PERIOD_NUM IN ('{$periodList}')";
+                    }
+                    if ($table == 'AR_ORDER_GOODS') {
+                        $periodObj = Period::instance();
+                        $calcYear = $periodObj->getYear($this->_periodNum);
+                        $calcMonth = $periodObj->getMonth($this->_periodNum);
+                        $periodList = $periodObj->getYearMonthAllPeriod($calcYear, $calcMonth);
+                        $periodList = implode("','", $periodList);
+
+                        $orderSn = Order::find()->select('SN')->where("IS_DELETE = 0 AND PERIOD_NUM IN ('{$periodList}')")->column();
+                        $orderSn = implode("','", $orderSn);
+                        $where = "ORDER_SN IN ('{$orderSn}')";
+                    }
+
+                    $sql = $model::find()->select($field)->where($where)->limit($this->_limit)->offset($_offset * $this->_limit)->createCommand()->getRawSql();;
+                    if ($table == 'order' || $table == 'orderGoods') {
+                        echo 'runLog: ' . $sql;
+                    }
+
+                    $data  = $model::find()->select($field)->where($where)->limit($this->_limit)->offset($_offset * $this->_limit)->asArray()->all();
                     if (!empty($data)) {
                     if (!empty($data)) {
                         $_offset += 1;
                         $_offset += 1;
                         \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();
                         \Yii::$app->$db->createCommand()->batchInsert($table, $fieldArray, $data)->execute();

+ 1 - 0
common/messages/en-US/ctx.php

@@ -709,6 +709,7 @@ return [
     'dbDecRole3rdLevelStockist'	=> '3rd Level Stockist',
     'dbDecRole3rdLevelStockist'	=> '3rd Level Stockist',
     'dbDecRole4thLevelStockist'	=> '4th Level Stockist',
     'dbDecRole4thLevelStockist'	=> '4th Level Stockist',
     'dbDecRole5thLevelStockist'	=> '5th Level Stockist',
     'dbDecRole5thLevelStockist'	=> '5th Level Stockist',
+    'dbDecRole6thLevelStockist'	=> '6th Level Stockist',
     # 注册类型
     # 注册类型
     'dbRegTypePersonal' => '个人',
     'dbRegTypePersonal' => '个人',
     'dbRegTypeBusiness' => '个体工商户',
     'dbRegTypeBusiness' => '个体工商户',

+ 1 - 0
common/messages/zh-CN/ctx.php

@@ -713,6 +713,7 @@ return [
     'dbDecRole3rdLevelStockist'	=> '三级报单中心',
     'dbDecRole3rdLevelStockist'	=> '三级报单中心',
     'dbDecRole4thLevelStockist'	=> '四级报单中心',
     'dbDecRole4thLevelStockist'	=> '四级报单中心',
     'dbDecRole5thLevelStockist'	=> '五级报单中心',
     'dbDecRole5thLevelStockist'	=> '五级报单中心',
+    'dbDecRole6thLevelStockist'	=> '六级报单中心',
     # 注册类型
     # 注册类型
     'dbRegTypePersonal' => '个人',
     'dbRegTypePersonal' => '个人',
     'dbRegTypeBusiness' => '个体工商户',
     'dbRegTypeBusiness' => '个体工商户',

+ 10 - 0
common/models/Period.php

@@ -322,6 +322,16 @@ class Period extends \common\components\ActiveRecord
         return Period::find()->where('CALC_YEAR=:CALC_YEAR AND CALC_MONTH=:CALC_MONTH', [':CALC_YEAR'=>$year, ':CALC_MONTH'=>$month])->count(1);
         return Period::find()->where('CALC_YEAR=:CALC_YEAR AND CALC_MONTH=:CALC_MONTH', [':CALC_YEAR'=>$year, ':CALC_MONTH'=>$month])->count(1);
     }
     }
 
 
+    /**
+     * 所传年、月所有期数
+     * @param $year
+     * @param $month
+     * @return array
+     */
+    public function getYearMonthAllPeriod($year, $month){
+        return Period::find()->select('PERIOD_NUM')->where('CALC_YEAR=:CALC_YEAR AND CALC_MONTH=:CALC_MONTH', [':CALC_YEAR'=>$year, ':CALC_MONTH'=>$month])->column();
+    }
+
     /**
     /**
      * 是否是结算月节点
      * 是否是结算月节点
      * @param $periodNum
      * @param $periodNum

+ 4 - 0
frontendApi/modules/v1/controllers/SiteController.php

@@ -18,7 +18,11 @@ use common\models\ArticleCategory;
 use common\models\BaUser;
 use common\models\BaUser;
 use common\models\DecOrder;
 use common\models\DecOrder;
 use common\models\DecRole;
 use common\models\DecRole;
+use common\models\Order;
+use common\models\OrderGoods;
+use common\models\PerfPeriod;
 use common\models\Period;
 use common\models\Period;
+use common\models\ShopGoods;
 use Yii;
 use Yii;
 use frontendApi\modules\v1\models\User;
 use frontendApi\modules\v1\models\User;