Просмотр исходного кода

业绩改成查询以前的三个非结算月节点 加上当前结算月单独业绩,存入预计算业绩的月业绩表中

root 3 лет назад
Родитель
Сommit
304568a8d0
1 измененных файлов с 152 добавлено и 4 удалено
  1. 152 4
      common/helpers/bonus/PreparePerfCalc.php

+ 152 - 4
common/helpers/bonus/PreparePerfCalc.php

@@ -160,6 +160,8 @@ class PreparePerfCalc {
             $this->_updatePercent(80);
 
             $t8 = microtime(true);
+            // 计算预计月业绩表的数据,这些数据用户不在前三期非月节点的数据.需要将此期新用户业绩统计一下
+            $this->loopCalcMonthPerfTableDataPrepare();
   
             //本月业绩入库
             $this->loopWriteMonthPerf();
@@ -789,11 +791,19 @@ class PreparePerfCalc {
         if (!$this->_isCalcMonth) {
             return true;
         }
-        // 正常计算的时候,维护业绩到prepare表中,预计计算月业绩的时候,只需要插入定时任务的结算那期的业绩即可.
-        // 这里直接获取预计计算业绩单数据
+        // AR_PERF_ORDER_PREPARE\AR_PERF_PERIOD_PREPARE\AR_PERIOD_PREPARE\AR_PERF_MONTH_PREPARE
+        // AR_PERIOD_PREPARE 表只需要是结算月的数据
+        // AR_PERF_PERIOD_PREPARE 表特殊,需要增加一个字段,是否存在于前三期中  
+        //  `IS_HAS_USER` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有此用户,默认为0没有此用户1为有
+        // 如果依旧是0则再次循环此月业绩的时候,需要再次处理'
+        //
+        // 月业绩由perfperiod表加上perfperiodprepare表之和,其中perfperiod表数据为此月非计算月的期业绩数据
+        // 先查询perfperiod表的数据,再查询perfperiodprepare这个表的数据.
+        // 如果查询到了perfperiodprepare的数据,则将此perfperiodprepare表的新增的是否统计到的字段标识为1.
+        // 最后再循环 perfperiodprepare 表中标识依旧为0的数据,再次循环.相当于这些数据是此结算月业绩期的新增用户
         echo sprintf("时间:[%s]月业绩,当前offset为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $offset);
         // 从缓存列表里面从底层往上倒序获取会员       
-        $allData = PerfPeriodPrepare::findUseDbCalc()
+        $allData = PerfPeriod::findUseDbCalc()
         ->select('USER_ID, SUM(FX_AMOUNT_CASH) AS FX_AMOUNT_CASH_SUM,SUM(PV_PCS) AS PV_PCS_SUM,
         SUM(PV_PCS_FX) AS PV_PCS_FX_SUM,SUM(PV_PSS) AS PV_PSS_SUM,
         SUM(PV_1L) AS PV_1L_SUM,SUM(PV_2L) AS PV_2L_SUM,
@@ -826,7 +836,43 @@ class PreparePerfCalc {
                 if( $this->_sysConfig['vipBonusGoldDecLevel']['VALUE'] && $userBaseInfo['DEC_LV'] === DeclarationLevel::JIN_ZUAN_LEVEL_ID ) {
                     $isVip = true;
                 }
-
+                // 查询perfperiodprepare表中数据,是否有此用户信息.因为是月提前结算,所以此结算期是只有一个数据
+                $monthPrepare = PerfPeriodPrepare::findUseDbCalc()
+                ->select('USER_ID, SUM(FX_AMOUNT_CASH) AS FX_AMOUNT_CASH_SUM,SUM(PV_PCS) AS PV_PCS_SUM,
+                SUM(PV_PCS_FX) AS PV_PCS_FX_SUM,SUM(PV_PSS) AS PV_PSS_SUM,
+                SUM(PV_1L) AS PV_1L_SUM,SUM(PV_2L) AS PV_2L_SUM,
+                SUM(PV_3L) AS PV_3L_SUM,SUM(PV_4L) AS PV_4L_SUM,
+                SUM(PV_5L) AS PV_5L_SUM,SUM(PV_1L_ZC) AS PV_1L_ZC_SUM,
+                SUM(PV_2L_ZC) AS PV_2L_ZC_SUM,SUM(PV_3L_ZC) AS PV_3L_ZC_SUM,
+                SUM(PV_4L_ZC) AS PV_4L_ZC_SUM,SUM(PV_5L_ZC) AS PV_5L_ZC_SUM')
+                ->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM ', [':USER_ID' => $userId, ':PERIOD_NUM' => $this->_periodNum])
+                ->asArray()
+                ->one();
+                if (!empty($monthPrepare)) {
+                    // 如果前三期中,在此提前计算业绩期中有数据,则需要加上此用户信息
+                    $everyData['FX_AMOUNT_CASH_SUM'] = $everyData['FX_AMOUNT_CASH_SUM'] + $monthPrepare['FX_AMOUNT_CASH_SUM'];
+                    $everyData['PV_PCS_SUM'] = $everyData['PV_PCS_SUM'] + $monthPrepare['PV_PCS_SUM'];
+                    $everyData['PV_PCS_FX_SUM'] =  $everyData['PV_PCS_FX_SUM'] + $monthPrepare['PV_PCS_FX_SUM'];
+                    $everyData['PV_PSS_SUM'] = $everyData['PV_PSS_SUM'] + $monthPrepare['PV_PSS_SUM'];
+                    $everyData['PV_1L_SUM'] = $everyData['PV_1L_SUM'] + $monthPrepare['PV_1L_SUM'];
+                    $everyData['PV_2L_SUM'] = $everyData['PV_2L_SUM'] + $monthPrepare['PV_2L_SUM'];
+                    $everyData['PV_3L_SUM'] = $everyData['PV_3L_SUM'] + $monthPrepare['PV_3L_SUM'];
+                    $everyData['PV_4L_SUM'] = $everyData['PV_4L_SUM'] + $monthPrepare['PV_4L_SUM'];
+                    $everyData['PV_5L_SUM'] = $everyData['PV_5L_SUM'] + $monthPrepare['PV_5L_SUM'];
+                    $everyData['PV_1L_ZC_SUM'] = $everyData['PV_1L_ZC_SUM'] + $monthPrepare['PV_1L_ZC_SUM'];
+                    $everyData['PV_2L_ZC_SUM'] = $everyData['PV_2L_ZC_SUM'] + $monthPrepare['PV_2L_ZC_SUM'];
+                    $everyData['PV_3L_ZC_SUM'] = $everyData['PV_3L_ZC_SUM'] + $monthPrepare['PV_3L_ZC_SUM'];
+                    $everyData['PV_4L_ZC_SUM'] = $everyData['PV_4L_ZC_SUM'] + $monthPrepare['PV_4L_ZC_SUM'];
+                    $everyData['PV_5L_ZC_SUM'] = $everyData['PV_5L_ZC_SUM'] + $monthPrepare['PV_5L_ZC_SUM'];
+                    // 将用户的状态改成1,为存在此用户.当之后再次循环PerfPeriodPrepare的时候,不再循环此用户了.
+                    PerfPeriodPrepare::updateAll(
+                        [
+                            'IS_HAS_USER' => 1
+                        ], 
+                        'PERIOD_NUM=:PERIOD_NUM AND USER_ID=:USER_ID', 
+                        [':PERIOD_NUM' => $this->_periodNum, ':USER_ID' => $userId]
+                    );
+                }
 
                 $nowMonthPerf = [
                     'USER_ID' => $userId,
@@ -870,6 +916,108 @@ class PreparePerfCalc {
         return true;
     }
 
+    /**
+     * 预计计算月业绩,当前三期没有此最新业绩单的用户
+     * 再次添加进去
+     * @param int $offset
+     * @return bool
+     * @throws Exception
+     * @throws \yii\db\Exception
+     */
+    public function loopCalcMonthPerfTableDataPrepare(int $offset = 0) {
+        if (!$this->_isCalcMonth) {
+            return true;
+        }
+        
+        // 上面的计算月业绩,计算了前三期有的用户,此次只计算此结算周期未含有前三期业绩的用户
+       
+        echo sprintf("时间:[%s]预计月业绩,结算月新添加的用户,当前offset为:【%s】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $offset);
+        // 从缓存列表里面从底层往上倒序获取会员      IS_HAS_USER 0 代表是此结算周期新增的业绩 
+        $allData = PerfPeriodPrepare::findUseDbCalc()
+        ->select('USER_ID, SUM(FX_AMOUNT_CASH) AS FX_AMOUNT_CASH_SUM,SUM(PV_PCS) AS PV_PCS_SUM,
+        SUM(PV_PCS_FX) AS PV_PCS_FX_SUM,SUM(PV_PSS) AS PV_PSS_SUM,
+        SUM(PV_1L) AS PV_1L_SUM,SUM(PV_2L) AS PV_2L_SUM,
+        SUM(PV_3L) AS PV_3L_SUM,SUM(PV_4L) AS PV_4L_SUM,
+        SUM(PV_5L) AS PV_5L_SUM,SUM(PV_1L_ZC) AS PV_1L_ZC_SUM,
+        SUM(PV_2L_ZC) AS PV_2L_ZC_SUM,SUM(PV_3L_ZC) AS PV_3L_ZC_SUM,
+        SUM(PV_4L_ZC) AS PV_4L_ZC_SUM,SUM(PV_5L_ZC) AS PV_5L_ZC_SUM')
+        ->where('CALC_MONTH=:CALC_MONTH AND IS_HAS_USER=:IS_HAS_USER', [':CALC_MONTH' => $this->_calcYearMonth,':IS_HAS_USER'=>0])
+        ->groupBy('USER_ID')
+        ->orderBy('USER_ID DESC')
+        ->offset($offset)
+        ->limit($this->_limit)
+        ->asArray()
+        ->all();
+        if ($allData) {
+            // 月度业绩表
+            foreach ($allData as $everyData) {
+                $userId = $everyData['USER_ID'];
+                //往期业绩
+                $userLastPerf = PrepareCalcCache::userPerf($userId, $this->_periodNum);
+                //本期业绩
+                $periodPerf = PrepareCalcCache::nowPeriodPerf($userId, $this->_periodNum);
+
+                $userBaseInfo = PrepareCalcCache::getUserInfo($userId, $this->_periodNum);
+                //级别必须为VIP
+                $isVip = false;
+                if( $userBaseInfo['DEC_LV'] === DeclarationLevel::VIP_LEVEL_ID ) {
+                    $isVip= true;
+                }
+                if( $this->_sysConfig['vipBonusGoldDecLevel']['VALUE'] && $userBaseInfo['DEC_LV'] === DeclarationLevel::JIN_ZUAN_LEVEL_ID ) {
+                    $isVip = true;
+                }
+
+                $nowMonthPerf = [
+                    'USER_ID' => $userId,
+                    'FX_AMOUNT_CASH' => $everyData['FX_AMOUNT_CASH_SUM'],
+                    'PV_PCS' => $everyData['PV_PCS_SUM'],
+                    'PV_PCS_FX' => $everyData['PV_PCS_FX_SUM'],
+                    'PV_PSS' => $everyData['PV_PSS_SUM'],
+                    'PV_1L' => $everyData['PV_1L_SUM'],
+                    'PV_2L' => $everyData['PV_2L_SUM'],
+                    'PV_3L' => $everyData['PV_3L_SUM'],
+                    'PV_4L' => $everyData['PV_4L_SUM'],
+                    'PV_5L' => $everyData['PV_5L_SUM'],
+
+                    //VIP统计相关业绩
+                    'VIP_PV_1L_ZC' => $isVip ? $everyData['PV_1L_ZC_SUM'] : 0,
+                    'VIP_PV_2L_ZC' => $isVip ? $everyData['PV_2L_ZC_SUM'] : 0,
+                    'VIP_PV_3L_ZC' => $isVip ? $everyData['PV_3L_ZC_SUM'] : 0,
+                    'VIP_PV_4L_ZC' => $isVip ? $everyData['PV_4L_ZC_SUM'] : 0,
+                    'VIP_PV_5L_ZC' => $isVip ? $everyData['PV_5L_ZC_SUM'] : 0,
+
+                    //总数据,历史+本期。不能用上月加本月,因为上月可能没业绩,上上个月有业绩。
+                    'PV_1L_TOTAL' => $periodPerf['PV_1L'] + $userLastPerf['PV_1L'],
+                    'PV_2L_TOTAL' => $periodPerf['PV_2L'] + $userLastPerf['PV_2L'],
+                    'PV_3L_TOTAL' => $periodPerf['PV_3L'] + $userLastPerf['PV_3L'],
+                    'PV_4L_TOTAL' => $periodPerf['PV_4L'] + $userLastPerf['PV_4L'],
+                    'PV_5L_TOTAL' => $periodPerf['PV_5L'] + $userLastPerf['PV_5L'],
+                    'PV_PSS_TOTAL' => $periodPerf['PV_PSS'] + $userLastPerf['PV_PSS_TOTAL'],
+                ];
+
+                // 把会员的月业绩写入缓存中,以便下面的奖金计算从缓冲中获取数据效率高
+                PrepareCalcCache::addHasMonthPerfUsers($userId, $this->_periodNum);
+                PrepareCalcCache::nowMonthPerf($userId, $this->_periodNum, $nowMonthPerf);
+                // 将用户的状态改成1,为存在此用户.当之后再次循环PerfPeriodPrepare的时候,不再循环此用户了.
+                PerfPeriodPrepare::updateAll(
+                    [
+                        'IS_HAS_USER' => 1
+                    ], 
+                    'PERIOD_NUM=:PERIOD_NUM AND USER_ID=:USER_ID', 
+                    [':PERIOD_NUM' => $this->_periodNum, ':USER_ID' => $userId]
+                );
+
+
+                unset($userId, $everyData, $nowMonthPerf, $lastMonthData, $userBaseInfo, $isVip);
+            }
+            unset($allData);
+            $this->loopCalcMonthPerfTableDataPrepare($offset + $this->_limit);
+        }
+
+        unset($allData);
+        return true;
+    }
+
     /**
      * 循环有业绩会员,并入库
      * @param int $offset