root 3 лет назад
Родитель
Сommit
acc588fa5e

+ 11 - 34
common/helpers/bonus/CalcCache.php

@@ -798,53 +798,30 @@ class CalcCache {
         $key = self::REDIS_KEY_PREFIX_USER_INFO . $periodNum;
         $data = Yii::$app->redis->hget($key, $userId);
         if (!$data) {
-            $userInfo = UserInfo::findUseDbCalc()->select('USER_ID,USER_NAME,ZC_AMOUNT,ZC_PV,CON_UID,REC_UID,CON_NUM,REC_NUM,NETWORK_DEEP,RELATION_DEEP,STORE_TYPE,UPDATED_AT,SYSTEM_ID')->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
+            $userInfo = UserInfo::findUseDbCalc()
+            ->select('USER_ID,USER_NAME,CON_UID,REC_UID')
+            ->where('USER_ID=:USER_ID', [':USER_ID' => $userId])
+            ->asArray()
+            ->one();
             if( !$userInfo ) {
                 throw new \Exception('用户信息表数据不存在,userId:'.$userId);
             }
-            // 在获取商城库的会员的级别信息和是否报单中心的会员
-            $userShopInfo = User::find()->select('REAL_NAME,LAST_DEC_LV,DEC_LV,EMP_LV,CROWN_LV,IS_DEC,DEC_ID,DEC_ROLE_ID,STATUS,PERIOD_AT,MOBILE,CREATED_AT,SUB_COM_ID,PROVINCE,CITY,COUNTY,DEC_PROVINCE,DEC_CITY,DEC_COUNTY,IS_DIRECT_SELLER,SUB_COM_LEADER')->where('ID=:ID', [':ID' => $userId])->asArray()->one();
+            $userShopInfo = User::find()
+            ->select('LAST_DEC_LV,REAL_NAME,DEC_LV,EMP_LV,CROWN_LV,IS_DEC,STATUS,IS_STUDIO,REC_UID,DEC_ID')
+            ->where('ID=:ID', [':ID' => $userId])
+            ->asArray()
+            ->one();
             if ( !$userShopInfo ) {
                 throw new \Exception('用户表数据不存在,userId:'.$userId);
             }
             $userInfo['REAL_NAME'] = $userShopInfo['REAL_NAME'];
-//            $userInfo['DEC_LV'] = $userShopInfo['DEC_LV'];
-            //先用last_dec_lv
             $userInfo['DEC_LV'] = $userShopInfo['LAST_DEC_LV'];
             $userInfo['EMP_LV'] = $userShopInfo['EMP_LV'];
             $userInfo['CROWN_LV'] = $userShopInfo['CROWN_LV'];
             $userInfo['IS_DEC'] = $userShopInfo['IS_DEC'];
-            $userInfo['DEC_ID'] = $userShopInfo['DEC_ID'];
-            $userInfo['DEC_ROLE_ID'] = $userShopInfo['DEC_ROLE_ID'];
-            $userInfo['DEC_PROVINCE'] = $userShopInfo['DEC_PROVINCE'];
-            $userInfo['DEC_CITY'] = $userShopInfo['DEC_CITY'];
-            $userInfo['DEC_COUNTY'] = $userShopInfo['DEC_COUNTY'];
             $userInfo['STATUS'] = $userShopInfo['STATUS'];
-            $userInfo['PERIOD_NUM'] = $userShopInfo['PERIOD_AT'];
-            $userInfo['MOBILE'] = $userShopInfo['MOBILE'];
-            $userInfo['CREATED_AT'] = $userShopInfo['CREATED_AT'];
-            $userInfo['SUB_COM_ID'] = $userShopInfo['SUB_COM_ID'];
-            $userInfo['PROVINCE'] = $userShopInfo['PROVINCE'];
-            $userInfo['CITY'] = $userShopInfo['CITY'];
-            $userInfo['COUNTY'] = $userShopInfo['COUNTY'];
-            $userInfo['IS_DIRECT_SELLER'] = $userShopInfo['IS_DIRECT_SELLER'];
-            $userInfo['SUB_COM_LEADER'] = $userShopInfo['SUB_COM_LEADER'];
-            $userInfo['REC_USER_NAME'] = isset($userInfo['REC_UID']) && $userInfo['REC_UID'] ? Info::getUserNameByUserId($userInfo['REC_UID']) : '';
-            $userInfo['REC_REAL_NAME'] = isset($userInfo['REC_UID']) && $userInfo['REC_UID'] ? Info::getUserRealNameByUserId($userInfo['REC_UID']) : '';
-            $userInfo['CON_USER_NAME'] = isset($userInfo['CON_UID']) && $userInfo['CON_UID'] ? Info::getUserNameByUserId($userInfo['CON_UID']) : '';
-            $userInfo['CON_REAL_NAME'] = isset($userInfo['CON_UID']) && $userInfo['CON_UID'] ? Info::getUserRealNameByUserId($userInfo['CON_UID']) : '';
-//            $userInfo['REC_USER_NAME'] = '';
-//            $userInfo['REC_REAL_NAME'] = '';
-//            $userInfo['CON_USER_NAME'] = '';
-//            $userInfo['CON_REAL_NAME'] = '';
-//            $userInfo['LOCATION'] = 1;
+            $userInfo['DEC_ID'] = $userShopInfo['DEC_ID'];
             unset($userShopInfo);
-//            if( isset($userInfo['CON_UID']) && $userInfo['CON_UID'] ) {
-//                if ($networkParent = UserNetwork::findOneAsArray('USER_ID=:USER_ID', [':USER_ID' => $userId])) {
-//                    $userInfo['LOCATION'] = $networkParent['RELATIVE_LOCATION'];
-//                }
-//            }
-
             if (!$userInfo['DEC_LV']) {
                 $userInfo['DEC_LV'] = DeclarationLevel::getDefaultLevelId();
             }

+ 102 - 4
common/helpers/bonus/CalcServePerfCalc.php

@@ -122,17 +122,19 @@ class CalcServePerfCalc {
             echo('计算业绩向缓存中加入用户完成,耗时:' . round($t3 - $t2, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             $this->_updatePercent(20);
             // 八、循环累计用户各项业绩数据
+            $this->loopGrandPerf();
+            
             
 
             // // 周结,循环向上级计入业绩并加入业绩单
-            // $this->loopCalcPeriodPerfByDecOrder();
-            // $this->loopCalcPeriodPerfByOrderDec();
+            $this->loopCalcPeriodPerfByDecOrder();
+            $this->loopCalcPeriodPerfByOrderDec();
             // $t4 = microtime(true);
             // echo('预计算业绩计算周业绩表中的数据完成,耗时:' . round($t4 - $t1, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             // $this->_updatePercent(40);
             // // 从会员的复销订单会员计算复销业绩并加入业绩单
-            // $this->loopCalcPerfByFXOrder();
-            // $this->loopCalcPerfByShopFXOrder();
+            $this->loopCalcPerfByFXOrder();
+            $this->loopCalcPerfByShopFXOrder();
             // $t5 = microtime(true);
             // echo('预计算业绩计算复销业绩并写入业绩单完成,耗时:' . round($t5 - $t4, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             // $this->_updatePercent(60);
@@ -299,6 +301,102 @@ class CalcServePerfCalc {
         }
     }
 
+    /**
+     * 累计用户业绩
+     * @param int $offset
+     * @return bool
+     * @throws \yii\db\Exception
+     */
+    public function loopGrandPerf($offset = 0) {
+        $allData = PerfOrder::findUseDbCalc()
+        ->select('ORDER_AMOUNT,PERF_TYPE,USER_ID,PV,PERIOD_NUM,DEC_USER_ID,PAY_TYPE')
+        ->where(
+            "PERIOD_NUM=:PERIOD_NUM", 
+            [':PERIOD_NUM' => $this->_periodNum]
+        )
+        ->orderBy('CREATED_AT DESC,ID DESC')
+        ->offset($offset)
+        ->limit($this->_limit)
+        ->asArray()
+        ->all();
+        if ($allData) {
+            foreach ($allData as $data) {
+                // 循环累计报单业绩
+                if ($data['PERF_TYPE'] == PerfOrder::ZC_TYPE) {
+                    // 给自己增加PCS(个人消费)
+                    CalcCache::nowPeriodPerf($data['USER_ID'], $this->_periodNum, [
+                        'PV_PCS' => $data['PV'],
+                        'PV_PCS_ZC' => $data['PV'],
+                    ]);
+                    // 把该会员加入到能拿到业绩的会员缓存中
+                    CalcCache::addHasPerfUsers($data['USER_ID'], $this->_periodNum);
+                    //加入到报单会员中
+                    $toInfo = CalcCache::getUserInfo($data['USER_ID'], $this->_periodNum);
+                    CalcCache::addHasBDUsers($data['USER_ID'], $this->_periodNum, [
+                        'TO_USER_ID' => $data['USER_ID'],
+                        'USER_ID' => $toInfo['DEC_ID'],
+                        'DEC_ID' => $toInfo['DEC_ID'],
+                        //考虑可能会移网的情况
+                        'REC_USER_ID' => $toInfo['REC_UID'] ?? '',
+                        'CON_USER_ID' => $toInfo['CON_UID'] ?? '',
+                        'DEC_AMOUNT' => $data['ORDER_AMOUNT'],
+                        'DEC_PV' => $data['PV'],
+                    ]);
+                    // 给上追加业绩
+                    $this->loopNetworkParentDo($data['USER_ID'], function ($parent) use (&$data) {
+                        // 给上级会员追加本期业绩到缓存中
+                        CalcCache::nowPeriodPerf($parent['PARENT_UID'], $this->_periodNum, [
+                            'PV_' . $parent['LOCATION'] . 'L' => $data['PV'],
+                            'PV_' . $parent['LOCATION'] . 'L_TOUCH' => $data['PV'],
+                            'PV_' . $parent['LOCATION'] . 'L_' . $data['PERF_TYPE'] => $data['PV'],
+                        ]);
+                        // 把该会员加入到能拿到业绩的会员缓存中
+                        CalcCache::addHasPerfUsers($parent['PARENT_UID'], $this->_periodNum);
+                        unset($parent);
+                    });
+                    //给推荐关系累计增加业绩
+                    $this->loopRelationParentDo($data['USER_ID'], function ($parent) use (&$data) {
+                        // 给上级会员追加本期业绩到缓存中
+                        CalcCache::nowPeriodPerf($parent['PARENT_UID'], $this->_periodNum, [
+                            'PV_PSS' => $data['PV'],
+                        ]);
+                        // 把该会员加入到能拿到业绩的会员缓存中
+                        CalcCache::addHasPerfUsers($parent['PARENT_UID'], $this->_periodNum);
+                        unset($parent);
+                    });
+                }
+                
+                // 循环累计复消业绩
+                if ($data['PERF_TYPE'] == PerfOrder::FX_TYPE) {
+                    if( $data['PAY_TYPE'] === self::ORDER_PAY_TYPE_CASH ) {
+                        $orderCashAmount = $data['ORDER_AMOUNT'];
+                        $payPv = $data['PV'] * $this->_sysConfig['cashReconsumeBonusPercent']['VALUE'] / 100;
+                        $cacheDataKey = 'PV_PCS_FX_CASH';
+                    } else {
+                        $orderCashAmount = 0;
+                        $payPv = $data['PV'];
+                        $cacheDataKey = 'PV_PCS_FX_POINT';
+                    }
+
+                    if( $payPv <= 0 ) continue;
+                    // 给自己增加PCS(个人消费)
+                    CalcCache::nowPeriodPerf($data['USER_ID'], $this->_periodNum, [
+                        'FX_AMOUNT_CASH' => $orderCashAmount,
+                        'PV_PCS' => $payPv,
+                        'PV_PCS_FX' => $payPv,
+                        $cacheDataKey => $payPv,
+                    ]);
+                    // 把该会员加入到能拿到业绩的会员缓存中
+                    CalcCache::addHasPerfUsers($data['USER_ID'], $this->_periodNum);
+                }
+            }
+
+            return $this->loopGrandPerf($offset + $this->_limit);
+        }
+        unset($allData);
+        return true;
+    }
+
     /**
      * 周结,向上级算业绩,并计入业绩单
      * @param int $offset

+ 11 - 49
common/models/PerfOrder.php

@@ -12,38 +12,23 @@ use yii\base\Exception;
  *
  * @property string $ID
  * @property string $SN 业绩单编号
- * @property string $DEC_SN 报单编号
- * @property string $DEC_TYPE 报单类型
- * @property int $DEC_STATUS 业绩单状态
+ * @property string $PERF_TYPE 业绩单类型
  * @property string $USER_ID 产生业绩会员ID
- * @property string $LAST_DEC_LV 结算时会员级别
- * @property string $LAST_EMP_LV 结算时会员聘级
- * @property int $LAST_STATUS 结算时状态
- * @property string $LAST_REC_USER_NAME 结算时开拓者编号
- * @property string $LAST_REC_REAL_NAME 结算时开拓者姓名
  * @property string $PV 业绩单PV
- * @property string $DEC_AMOUNT 报单金额
- * @property string $LAST_SUB_COM_ID 结算时所属分公司
- * @property int $LAST_PROVINCE 结算时省份
- * @property int $LAST_CITY 结算时城市
- * @property int $LAST_COUNTY 结算时地区
- * @property string $DEC_USER_ID 报单主体ID
- * @property string $LAST_DEC_DEC_LV 结算时报单主体级别
- * @property string $LAST_DEC_SUB_COM_ID 结算时报单主体所属分公司
- * @property int $LAST_DEC_PROVINCE 结算时报单主体省份
- * @property int $LAST_DEC_CITY 结算时报单主体城市
- * @property int $LAST_DEC_COUNTY 结算时报单主体地区
+ * @property string $DEC_USER_ID 报单者ID
+ * @property string $ORDER_AMOUNT 支付金额
  * @property int $PERIOD_NUM 所在期数
  * @property int $CALC_MONTH 结算月
- * @property string $P_CALC_MONTH 分区结算月
  * @property int $CREATED_AT 创建时间
- * @property int $CLOSED_AT 置废时间
+ * 
  */
 class PerfOrder extends \common\components\ActiveRecord
 {
     //业绩单状态
     const STATUS_NORMAL = 1; //正常
     const STATUS_CLOSED = 2; //置废
+    const ZC_TYPE = "ZC";
+    const FX_TYPE = "FX";
     const STATUS_NAME = [
       self::STATUS_NORMAL=>'Audited',//已审核
       self::STATUS_CLOSED=>'置废',
@@ -62,14 +47,9 @@ class PerfOrder extends \common\components\ActiveRecord
     public function rules()
     {
         return [
-            [['SN', 'DEC_TYPE', 'USER_ID', 'PERIOD_NUM', 'CALC_MONTH', 'P_CALC_MONTH', 'CREATED_AT', 'CLOSED_AT'], 'required'],
-            [['LAST_STATUS', 'DEC_STATUS', 'LAST_PROVINCE', 'LAST_CITY', 'LAST_COUNTY', 'LAST_DEC_PROVINCE', 'LAST_DEC_CITY', 'LAST_DEC_COUNTY', 'PERIOD_NUM', 'CALC_MONTH', 'CREATED_AT', 'CLOSED_AT'], 'integer'],
-            [['PV', 'DEC_AMOUNT'], 'number'],
-            [['ID', 'USER_ID', 'LAST_DEC_LV','LAST_EMP_LV', 'LAST_SUB_COM_ID', 'DEC_USER_ID', 'LAST_DEC_DEC_LV', 'LAST_DEC_SUB_COM_ID'], 'string', 'max' => 32],
-            [['SN', 'DEC_SN', 'DEC_TYPE'], 'string', 'max' => 32],
-            [['LAST_REC_USER_NAME'], 'string', 'max' => 16],
-            [['LAST_REC_REAL_NAME'], 'string', 'max' => 128],
-            [['P_CALC_MONTH'], 'string', 'max' => 7],
+            [['SN', 'PERF_TYPE', 'USER_ID', 'PERIOD_NUM', 'CALC_MONTH', 'CREATED_AT'], 'required'],
+            [['PERIOD_NUM', 'CALC_MONTH', 'CREATED_AT'], 'integer'],
+            [['PV', 'ORDER_AMOUNT'], 'number'],
             [['SN'], 'unique'],
             [['ID'], 'unique'],
         ];
@@ -83,32 +63,14 @@ class PerfOrder extends \common\components\ActiveRecord
         return [
             'ID' => 'ID',
             'SN' => '业绩单编号',
-            'DEC_SN' => '报单编号',
-            'DEC_TYPE' => '报单类型',
-            'DEC_STATUS' => '业绩单状态',
+            'PERF_TYPE' => '业绩单类型',
             'USER_ID' => '产生业绩会员ID',
-            'LAST_DEC_LV' => '结算时会员级别',
-            'LAST_EMP_LV' => '结算时会员聘级',
-            'LAST_STATUS' => '结算时状态',
-            'LAST_REC_USER_NAME' => '结算时开拓者编号',
-            'LAST_REC_REAL_NAME' => '结算时开拓者姓名',
             'PV' => '业绩单BV',
-            'DEC_AMOUNT' => '报单金额',
-            'LAST_SUB_COM_ID' => '结算时所属分公司',
-            'LAST_PROVINCE' => '结算时省份',
-            'LAST_CITY' => '结算时城市',
-            'LAST_COUNTY' => '结算时地区',
+            'ORDER_AMOUNT' => '报单金额',
             'DEC_USER_ID' => '报单主体ID',
-            'LAST_DEC_DEC_LV' => '结算时报单主体级别',
-            'LAST_DEC_SUB_COM_ID' => '结算时报单主体所属分公司',
-            'LAST_DEC_PROVINCE' => '结算时报单主体省份',
-            'LAST_DEC_CITY' => '结算时报单主体城市',
-            'LAST_DEC_COUNTY' => '结算时报单主体地区',
             'PERIOD_NUM' => '所在期数',
             'CALC_MONTH' => '结算月',
-            'P_CALC_MONTH' => '分区结算月',
             'CREATED_AT' => '创建时间',
-            'CLOSED_AT' => '置废时间',
         ];
     }
 

+ 2 - 2
common/models/UserNetwork.php

@@ -117,11 +117,11 @@ class UserNetwork extends \common\components\ActiveRecord
         foreach ($pageParentUids as $parentUid) {
             try {
                 $parentNetInfo = static::find($isSlaves, $db)
-                ->select(['TOP_DEEP', 'RELATIVE_LOCATION', 'LOCATION_TAG', 'PARENT_UID'])
+                ->select(['TOP_DEEP', 'RELATIVE_LOCATION', 'PARENT_UID'])
                 ->where('USER_ID=:USER_ID', ['USER_ID'=>$parentUid])
                 ->asArray()
                 ->one();
-                $location = empty($parentNetInfo['PARENT_UID']) ? $parentNetInfo['LOCATION_TAG'] : $parentNetInfo['RELATIVE_LOCATION'];
+                $location = empty($parentNetInfo['RELATIVE_LOCATION']) ? 1 : $parentNetInfo['RELATIVE_LOCATION'];
                 $parentList[] = [
                     'USER_ID' => $userId,
                     'TOP_DEEP' => $topDeep,