root 3 роки тому
батько
коміт
bf41027cb8
2 змінених файлів з 93 додано та 30 видалено
  1. 39 27
      common/helpers/bonus/CalcServePerfCalc.php
  2. 54 3
      common/models/ServeProcess.php

+ 39 - 27
common/helpers/bonus/CalcServePerfCalc.php

@@ -73,66 +73,99 @@ class CalcServePerfCalc {
      */
     public function calcStep($periodNum = null) {
         try {
+            $requestTime = date('Y-m-d H:i:s', time());
             if (empty($periodNum)) {
-                echo('触发时间:【'.date('Y-m-d H:i:s', time()).'】'.'定时器执行累计业绩计算 ,内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+                echo('触发时间:【'.$requestTime.'】'.'定时器执行累计业绩计算 ,内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             } else {
-                echo('触发时间:【'.date('Y-m-d H:i:s', time()).'】'.'手动触发累计业绩计算 ,内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+                echo('触发时间:【'.$requestTime.'】'.'手动触发累计业绩计算 ,内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             }
             //一、查询此业绩状态,是否能进行计算
             $calcIng = $this->isCalcIng($periodNum);
+            ServeProcess::recordRequest($requestTime, $this->_periodNum);
             if ($calcIng !== true) {
                 echo('触发时间:【'.date('Y-m-d H:i:s', time()).'】'.'业绩期表中,此期状态不正确');
-                
+                ServeProcess::recordRequest($requestTime, $this->_periodNum, '业绩期表中,此期状态不正确');
                 return false;
             } else {
                 // 将IS_PREPARE改成2,计算中
                 Period::updateCalcProcess(2, $this->_periodNum);
+                ServeProcess::recordRequest($requestTime, $this->_periodNum, '调整IS_PREPARE值为2,计算开始');
             }
-
+            
             // 记录初始化数据,用户总数,业绩单业绩总pv值.
-            // @todo
+            ServeProcess::recordDataInfo(time(), $this->_periodNum);
 
             $t1 = microtime(true);
             //二、初始化
             $this->initCalcTask($this->_periodNum);
             Period::updatePercent(10, $this->_periodNum);
+            ServeProcess::recordProcess($t1, time(), $this->_periodNum, '初始化---初始化配置');
+
+            $initT2 = microtime(true);
             //三、 设置结算状态
             $this->setCalcStatus('start', $this->_periodNum);
+            ServeProcess::recordProcess($initT2, time(), $this->_periodNum, '初始化---设置结算状态');
+
+            $initT3 = microtime(true);
             //四、 清空所有本期结算用到的缓存
             CalcCache::clearAll($this->_periodNum);
+            ServeProcess::recordProcess($initT3, time(), $this->_periodNum, '初始化---清空业绩缓存');
+
+            $initT4 = microtime(true);
             //五、 清空会员推荐和接点关系缓存
             CalcCache::clearNetCache();
+            ServeProcess::recordProcess($initT4, time(), $this->_periodNum, '初始化---清空会员推荐和接点关系缓存');
+
+            $initT5 = microtime(true);
             //六、 清空相关表数据
             $this->clearTableData();
             $this->_updatePercent(15);
+            ServeProcess::recordProcess($initT5, time(), $this->_periodNum, '初始化---清空相关表数据');
+
             $t2 = microtime(true);
             echo(date('Y-m-d H:i:s',time()).'初始化、清空缓存及相关数据表完成,耗时:' . round($t2 - $t1, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            ServeProcess::recordProcess($t1, $t2, $this->_periodNum, '初始化---初始化、清空缓存及相关数据表完成');
+            
             //七、 添加缓存中用户数据
             CalcCache::addUsers($this->_periodNum);
             $t3 = microtime(true);
             echo(date('Y-m-d H:i:s',time()).'计算业绩向缓存中加入用户完成,耗时:' . round($t3 - $t2, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            ServeProcess::recordProcess($t2, $t3, $this->_periodNum, '计算业绩向缓存中加入用户完成');
             $this->_updatePercent(20);
+
             // 八、循环累计用户各项业绩数据
             $this->loopGrandPerf();
             $t4 = microtime(true);
             echo(date('Y-m-d H:i:s',time()).'累计用户业绩完成' . round($t4 - $t3, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            ServeProcess::recordProcess($t3, $t4, $this->_periodNum, '累计用户业绩完成');
+            $this->_updatePercent(60);
+            
             // 九、本期业绩入库
             $this->loopWriteNowPerf();
             $t6 = microtime(true);
             echo(date('Y-m-d H:i:s',time()).'本期业绩入库完成,耗时:' . round($t6 - $t4, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            ServeProcess::recordProcess($t4, $t6, $this->_periodNum, '本期业绩入库完成');
             $this->_updatePercent(70);
+
             //十、计算月业绩表中的数据
             $this->loopCalcMonthPerfTableData();
             $t7 = microtime(true);
             echo(date('Y-m-d H:i:s',time()).'计算月业绩表中的数据完成,耗时:' . round($t7 - $t6, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            if($this->_isCalcMonth) {
+                ServeProcess::recordProcess($t6, $t7, $this->_periodNum, '计算月业绩表中的数据完成');
+            }
             $this->_updatePercent(80);
+
             //十一、本月业绩入库
             $this->loopWriteMonthPerf();
             $t8 = microtime(true);
             echo(date('Y-m-d H:i:s',time()).'本月业绩入库完成,耗时:' . round($t8 - $t7, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
+            if($this->_isCalcMonth) {
+                ServeProcess::recordProcess($t7, $t8, $this->_periodNum, '本月业绩入库完成');
+            }
             $this->_updatePercent(100);
             $t9 = microtime(true);
-            
+            ServeProcess::recordProcess($t6, $t7, $this->_periodNum, '计算业绩业绩结算全部完成');
             echo(date('Y-m-d H:i:s',time()).'计算业绩业绩结算全部完成,共耗时:' . round($t9 - $t1, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
         } catch (\Exception $e) {
             $this->errorCalcTask();
@@ -595,25 +628,4 @@ class CalcServePerfCalc {
         // 把数据写入数据库中
         Period::updateAll(['PERF_PERCENT' => $percent], 'PERIOD_NUM=:PERIOD_NUM', [':PERIOD_NUM' => $this->_periodNum]);
     }
-
-
-    /**
-     * 记录计算过程信息
-     */
-    private function _processScheduleLog($data) {
-        $logData[] = [
-            'ID' => SnowFake::instance()->generateId(),
-            'PERIOD_NUM' => $this->_periodNum,
-            'TASK_TYPE' => $data['TASK_TYPE'],
-            'START_AT' => isset($data['START_AT']) ? date('Y-m-d H:i:s', $data['START_AT']) : '',
-            'END_AT' => isset($data['END_AT']) ?  date('Y-m-d H:i:s', $data['END_AT']) : '',
-            'TASK_DESCRIBE' => $data['TASK_DESCRIBE'] ?? '',
-            'USE_MEMORY' => $data['USE_MEMORY'] ?? '',
-            'USE_TIME' => $data['USE_TIME'] ?? '',
-            'CALC_USER_TOTAL' => $data['USE_TIME'] ?? 0,
-            'CALC_PERF_TOTAL' => $data['USE_TIME'] ?? '0.000',
-        ];
-
-        ServeProcess::batchInsert($logData);
-    }
 }

+ 54 - 3
common/models/ServeProcess.php

@@ -2,6 +2,7 @@
 
 namespace common\models;
 
+use common\helpers\snowflake\SnowFake;
 use Yii;
 
 /**
@@ -47,15 +48,65 @@ class ServeProcess extends \common\components\ActiveRecord
     {
         return [
             'ID' => 'ID',
-            'TASK_TYPE' => '任务类型',
+            'TASK_TYPE' => '任务类型', // 记录类型 serve 服务统计信息,比如总人数,总业绩 perf 业绩单信息 bonus 奖金信息
             'START_AT' => '开始时间',
             'END_AT' => '结束时间',
             'PERIOD_NUM' => '业绩期',
             'TASK_DESCRIBE' => '描述信息',
-            'USE_MEMORY' => '使用内存大小',
-            'USE_TIME' => '耗时',
             'CALC_USER_TOTAL' => '总人数',
             'CALC_PERF_TOTAL' => '总业绩',
         ];
     }
+
+    // ------以下为记录操作流程
+    // 记录请求时间
+    public static function recordRequest($time, $periodNum, $desc = '') {
+        $logData[] = [
+            'ID' => SnowFake::instance()->generateId(),
+            'PERIOD_NUM' => $periodNum ?: 0,
+            'TASK_TYPE' => 'serve',
+            'TASK_DESCRIBE' => $desc ?: '请求服务开始',
+            'START_AT' => $time
+        ];
+
+        ServeProcess::batchInsert($logData);
+    }
+
+    // 记录计算基础数据
+    public static function recordDataInfo($time, $periodNum) {
+        $time = date('Y-m-d H:i:s',$time);
+        $userCount = User::find()->where('1=1')->count('ID'); // user表总数
+        $perfSum = PerfOrder::find()->where('1=1')->sum('PV');// 业绩单总业绩
+        $infoCount = UserInfo::find()->where('1=1')->count('ID'); // userinfo表总数
+        $networkConut = UserNetwork::find()->where('1=1')->count('ID'); // UserNetwork总数
+        $relationCount = UserRelation::find()->where('1=1')->count('ID'); // UserRelation
+        $logData[] = [
+            'ID' => SnowFake::instance()->generateId(),
+            'PERIOD_NUM' => $periodNum ?: 0,
+            'TASK_TYPE' => 'serve',
+            'TASK_DESCRIBE' => '统计业务系统数据信息',
+            'START_AT' => $time,
+            'CALC_USER_TOTAL' => $userCount,
+            'CALC_PERF_TOTAL' => $perfSum,
+            'CALC_USERINFO_TOTAL' => $infoCount,
+            'CALC_NETWORK_TOTAL' => $networkConut,
+            'CALC_RELATION_TOTAL' => $relationCount
+        ];
+
+        ServeProcess::batchInsert($logData);
+    }
+
+    // 记录流程
+    public static function recordProcess($start, $end, $periodNum, $desc) {
+        $logData[] = [
+            'ID' => SnowFake::instance()->generateId(),
+            'PERIOD_NUM' => $periodNum ?: 0,
+            'TASK_TYPE' => 'perf',
+            'START_AT' => date('Y-m-d H:i:s', $start),
+            'END_AT' => date('Y-m-d H:i:s', $end),
+            'TASK_DESCRIBE' => $desc,
+        ];
+
+        ServeProcess::batchInsert($logData);
+    }
 }