Преглед на файлове

修改业绩店补计算

root преди 3 години
родител
ревизия
2d72929264
променени са 3 файла, в които са добавени 70 реда и са изтрити 35 реда
  1. 21 0
      common/helpers/bonus/CalcCache.php
  2. 30 27
      common/helpers/bonus/PerfCalc.php
  3. 19 8
      common/models/StorePerfLog.php

+ 21 - 0
common/helpers/bonus/CalcCache.php

@@ -34,6 +34,7 @@ class CalcCache {
     const REDIS_KEY_PREFIX_USER = 'calc:user_';
     const REDIS_KEY_PREFIX_USER_ACTIVE = 'calc:userActive_';
     const REDIS_KEY_PREFIX_USER_INFO = 'calc:userInfo_';
+    const REDIS_KEY_PREFIX_USER_NETWORK_INFO = 'calc:userNetWork_';
     const REDIS_KEY_PREFIX_USER_BONUS = 'calc:userBonus_';
     const REDIS_KEY_PREFIX_PERIOD_MONTH_CALC_BONUS = 'calc:periodMonthCalcBonus_';
     const REDIS_KEY_PREFIX_USER_PERF = 'calc:userPerf_';
@@ -743,6 +744,26 @@ class CalcCache {
         return $list;
     }
 
+    /**
+     * 获取会员networknew表数据,根据用户id
+     */
+    public static function getUserNetWorkNewInfo($userId, $periodNum) {
+        $key = self::REDIS_KEY_PREFIX_USER_NETWORK_INFO . $periodNum;
+        $data = Yii::$app->redis->hget($key, $userId);
+        if (!$data) {
+            $netWork = UserNetwork::findUseDbCalc()
+            ->select('USER_ID,PARENT_UID')
+            ->where('USER_ID=:USER_ID', [':USER_ID' => $userId])
+            ->asArray()
+            ->one();
+            $data = Json::encode($netWork);
+            Yii::$app->redis->hset($key, $userId, $data);
+            unset($netWork, $key, $userId, $periodNum);
+        }
+
+        return $data ? Json::decode($data, true) : [];
+    }
+
     /**
      * 获取会员信息从缓存
      * @param $userId

+ 30 - 27
common/helpers/bonus/PerfCalc.php

@@ -1185,63 +1185,66 @@ class PerfCalc {
             return true;
         }
         echo sprintf("时间:[%s]店服务奖业绩计算,当前offset为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $offset);
-        // 从缓存列表里面从底层往上倒序获取会员      IS_HAS_USER 0 代表是此结算周期新增的业绩 
+
         $allData = PerfOrder::findUseDbCalc()
-        ->select('ID,SN,DEC_SN,DEC_TYPE,USER_ID,PV,PERIOD_NUM,CALC_MONTH')
+        ->select('ID,USER_ID, SUM(PV) AS MONTH_PV, CALC_MONTH')
         ->where('CALC_MONTH=:CALC_MONTH', [':CALC_MONTH' => $this->_calcYearMonth])
+        ->groupBy('USER_ID')
         ->orderBy('USER_ID DESC')
         ->offset($offset)
         ->limit($this->_limit)
         ->asArray()
         ->all();
+
         if ($allData) {
             foreach ($allData as $everyData) {
-                // 记录pv分配,为了好找小组业绩,需要将即便是没有订单的用户也保存进去.
-                // 这样,需要判断是否有用户,有的话,需要更新此用户的PV,把0改成正常的PV,不在重新插入了.
                 $userId = $everyData['USER_ID'];
-                $pv = $everyData['PV'];
-                $perfOrderId = $everyData['ID'];
+                $pv = $everyData['MONTH_PV'];
                 $userBaseInfo = CalcCache::getUserInfo($userId, $this->_periodNum);
+                $userNetWork = CalcCache::getUserNetWorkNewInfo($userId, $this->_periodNum);
+                // 记录有业绩单的用户
+                StorePerfLog::addOrUpdate(
+                    $this->_periodNum, 
+                    $this->_calcYearMonth, 
+                    $userId, 
+                    [
+                        'USER_ID' => $userId,
+                        'IS_STUDIO' => $userBaseInfo['IS_STUDIO'],
+                        'MONTH_PV' => $pv,
+                        'PERIOD_NUM' => $this->_periodNum,
+                        'CALC_MONTH' => $this->_calcYearMonth,
+                        'CREATE_AT' => time(),
+                        'PARENT_UID' => $userNetWork['PARENT_UID']
+                    ],
+                    $pv
+                );
                 // 判断此用户是否是店铺,如果是店铺则累计此业绩到自己身上
                 if ($userBaseInfo['IS_STUDIO'] == 1) {
                     CalcCache::addHasPerfUsers($userId, $this->_periodNum);
                     CalcCache::nowPeriodPerf($userId, $this->_periodNum, [
                         'STORE_PV_GRAND' => $pv,
                     ]);
-                    
-                    StorePerfLog::addOrUpdate(
-                        $this->_periodNum, 
-                        $this->_calcYearMonth, 
-                        $userId, 
-                        [
-                            'PERF_ORDER_ID' => $perfOrderId,
-                            'USER_ID' => $userId,
-                            'IS_STUDIO' => 1,
-                            'PV' => $pv,
-                            'PERIOD_NUM' => $this->_periodNum,
-                            'CALC_MONTH' => $this->_calcYearMonth,
-                            'CREATE_AT' => time(),
-                        ]
-                    );
                 } else {
-                // 如果此用户不是店铺,则往上找用户上级,是否是店铺,并累计上去
-                    // 给上追加业绩
+                    // 如果此用户不是店铺,继续上找到店铺并累加上去PV
                     $this->loopNetworkParentDo($userId, function ($parent) use (&$everyData) {
                         $parentUser = CalcCache::getUserInfo($parent['PARENT_UID'], $this->_periodNum);
+                        $userNetWork = CalcCache::getUserNetWorkNewInfo($parent['PARENT_UID'], $this->_periodNum);
                         $isStudio = $parentUser['IS_STUDIO'] == 1 ? true : false;
+                        $appendPv = $isStudio ? $everyData['MONTH_PV'] : 0;
                         StorePerfLog::addOrUpdate(
                             $this->_periodNum, 
                             $this->_calcYearMonth, 
                             $parent['PARENT_UID'], 
                             [
-                                'PERF_ORDER_ID' => $everyData['ID'],
                                 'USER_ID' => $parent['PARENT_UID'],
-                                'IS_STUDIO' => $parentUser['IS_STUDIO'],
-                                'PV' => $everyData['PV'],
+                                'IS_STUDIO' => $isStudio,
+                                'MONTH_PV' => 0,
                                 'PERIOD_NUM' => $this->_periodNum,
                                 'CALC_MONTH' => $this->_calcYearMonth,
                                 'CREATE_AT' => time(),
-                            ]
+                                'PARENT_UID' => $userNetWork['PARENT_UID']
+                            ],
+                            $appendPv
                         );
                         if ($isStudio) {
                             CalcCache::nowPeriodPerf($parent['PARENT_UID'], $this->_periodNum, [

+ 19 - 8
common/models/StorePerfLog.php

@@ -55,8 +55,14 @@ class StorePerfLog extends \common\components\ActiveRecord
     }
 
     // 更新或者添加业绩数据
-    public static function addOrUpdate($periodNum, $calcMonth, $userId, $data) {
-        // 判断是否有此数据,如果有则进行更新
+    /**
+     * @param $periodNum 结算业绩期
+     * @param $calcMonth 结算月
+     * @param $userId 结算过程中的用户
+     * @param $data 数据
+     * @param $appendPv 往上找店铺,需要给店铺的PV值
+     */
+    public static function addOrUpdate($periodNum, $calcMonth, $userId, $data, $appendPv = 0) {
         $info = StorePerfLog::findUseDbCalc()
         ->select('ID')
         ->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM AND CALC_MONTH=:CALC_MONTH',
@@ -64,15 +70,20 @@ class StorePerfLog extends \common\components\ActiveRecord
         )
         ->asArray()
         ->one();
-        if ($data['IS_STUDIO'] == 1) {
-            $data['GRAND_TOTAL_PV'] = $data['PV'] + $info['GRAND_TOTAL_PV'];
-        }
         if (empty($info)) {
-            $ret = StorePerfLog::insertOne($data);
+            StorePerfLog::insertOne($data);
         } else {
-            $ret = StorePerfLog::updateAll($data, 'ID=:ID', [':ID' => $info['ID']]);
+            // 如果循环到此用户有业绩单,则将此用户的PV更新为自己业绩单的值
+            if ($data['MONTH_PV'] > 0) {
+                StorePerfLog::updateAll(['MONTH_PV' => $data['MONTH_PV']], 'ID=:ID', [':ID' => $info['ID']]);
+            }
+            if ($data['IS_STUDIO'] == 1) {
+                // 累加总PV
+                $totalPv = $data['MONTH_PV'] + $appendPv;
+                StorePerfLog::updateAll(['GRAND_TOTAL_PV' => $totalPv], 'ID=:ID', [':ID' => $info['ID']]);
+            }
         }
 
-        return $ret;
+        return true;
     }
 }