Ver código fonte

Merge branch 'feature/2175-team-perf' into feature/master-back

# Conflicts:
#	common/components/SwooleAsyncTimer.php
#	common/helpers/bonus/Calc/CalcConsole.php
theo 3 anos atrás
pai
commit
35be3b7f0a

+ 3 - 1
backendApi/modules/v1/controllers/CalcController.php

@@ -46,6 +46,8 @@ class CalcController extends BaseController
         $formModel->scenario = 'autoPerf';
 
         if ($formModel->load(Yii::$app->request->get(), '') && $formModel->autoPerf()) {
+            //设置预计算进行中标识
+            Period::updatePeriodIsPreparing($periodNum, Period::IS_PREPARING);
             return static::notice('自动计算已开始,请等待');
         } else {
             return static::notice(Form::formatErrorsForApi($formModel->getErrors()), 400);
@@ -320,4 +322,4 @@ class CalcController extends BaseController
     }
 
 
-}
+}

+ 4 - 1
backendEle/src/views/bonus/period.vue

@@ -67,7 +67,10 @@
         </el-table-column>
         <el-table-column fixed="right" label="Action" width="180"><!-- 操作 -->
           <template slot-scope="scope">
-            <el-button class="button" type="primary" @click.native="autoPerfHandle(scope.row.PERIOD_NUM)" >预计算</el-button>
+            <el-button v-if="scope.row.IS_CAN_CLOSE && permission.hasPermission(`bonus/close-period`)" class="button" type="primary"
+                       @click.native="autoPerfHandle(scope.row.PERIOD_NUM)" >
+              预计算
+            </el-button>
             <el-button v-if="scope.row.IS_CAN_CLOSE && permission.hasPermission(`bonus/close-period`)" type="primary" class="button"
                        @click.native="closeHandle(scope.row)">
               Closure period<!-- 封期 -->

+ 3 - 2
common/components/SwooleAsyncTimer.php

@@ -50,10 +50,11 @@ class SwooleAsyncTimer extends SwooleAsyncTimerComponent implements SocketInterf
         // 自动封期
         AutoClosePeriod::instance()->autoClose();
         // 自动执行任务队列中的任务
-        Queue::instance()->consumeTask();
+//        Queue::instance()->consumeTask();
         // 实时监听计算系统修改的period表字段
 //        CalcConsole::listenCalcPeriod();
-//        CalcConsole::listenAutoPerfPeriod();
+        CalcConsole::autoPrePerf();
+        CalcConsole::listenAutoPerfPeriod();
         return true;
     }
 

+ 55 - 8
common/helpers/bonus/Calc/CalcConsole.php

@@ -3,8 +3,11 @@
 namespace common\helpers\bonus\Calc;
 
 
+use common\helpers\Form;
 use common\models\CalcRecord;
+use common\models\forms\PeriodForm;
 use common\models\Period;
+use Yii;
 
 class CalcConsole extends BaseBusiness
 {
@@ -100,7 +103,43 @@ class CalcConsole extends BaseBusiness
         return true;
     }
 
-    public static function listenAutoPerfPeriod()
+    public static function autoPrePerf(){ // 自动预结算
+        $nowTs = time();
+        $currentPeriod = Period::find()->where('START_TIME< :NOW_TIME',['NOW_TIME'=>$nowTs])->where('END_TIME>= :NOW_TIME',['NOW_TIME'=>$nowTs-6])->asArray()->one();
+        $periodNum = $currentPeriod['PERIOD_NUM'];
+        if (Period::isProcessing($periodNum)) {
+            return;
+        }
+        if($nowTs+86400>$currentPeriod['END_TIME'] ){
+            $nowMin = date("i", $nowTs);
+            $nowSec = date("s", $nowTs);
+            if(($nowMin!=0 || $nowSec >= 5 ) || Period::isProcessing($periodNum)){ // 当不是整点小时,当计算中,不计算
+                return;
+            }
+            print_r($periodNum."该预结算".$nowMin.PHP_EOL.$nowSec);
+            //设置计算进行中标识
+            Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
+            //设置自动计算标识
+            Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
+            //记录开始计算的时间
+            Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
+            $formModel = new PeriodForm();
+            $formModel->scenario = 'autoPerf';
+
+            if($formModel->load(['periodNum'=>$periodNum], '') && $formModel->autoPrePerf()) {
+                echo('自动计算已开始,请等待'.PHP_EOL);
+                CalcRecord::record($periodNum, '第' . $periodNum . '期,定时计算开始');
+            } else {
+                echo('自动计算未开始'.PHP_EOL);
+                CalcRecord::record($periodNum, '第' . $periodNum  . '期,定时计算未开始');
+            }
+            return;
+        }else{
+            return;
+        }
+    }
+
+    public static function listenAutoPerfPeriod() // 拉取预结算的结果
     {
         $db        = self::CALC_DB_NAME;
         $allPeriod = \Yii::$app->$db->createCommand("SELECT * FROM AR_PERIOD order by PERIOD_NUM desc")->queryAll();
@@ -115,15 +154,19 @@ class CalcConsole extends BaseBusiness
             return true;
         }
 
-        $businessPeriod = Period::find()->where(['PERIOD_NUM' => $period['PERIOD_NUM']])
-            ->asArray()->one();
+        $businessPeriod = Period::find()->where(['PERIOD_NUM' => $period['PERIOD_NUM']])->asArray()->one();
 
-        if ($businessPeriod['SEND_STARTED_AT'] > 0 || $businessPeriod['IS_SENT'] > 0) {
-            //开始挂网 或者 已挂网 则直接返回
-            return true;
+        if (
+            $businessPeriod['SEND_STARTED_AT'] > 0 || $businessPeriod['IS_SENT'] > 0 // 已挂网
+            || 1 != $businessPeriod['IS_PREPARING'] // 未在预计算中
+            || $period['PERFED_AT'] < $businessPeriod['START_EXEC_TIME'] // 计算服务中的计算时间,早于业务系统开始计算时间,说明是旧的,不拉取
+        ){
+            return false;
         }
-
-        if (2 == $period['IS_PREPARE'] && 1 == $period['IS_PERFED']) {
+        if (
+            2 == $period['IS_PREPARE']
+            && 3 == $period['IS_PERFED']
+        ) {
             //拉取期业绩
             CalcRecord::record($period['PERIOD_NUM'], '第' . $period['PERIOD_NUM'] . '期的预计算业绩数据已生成');
             CalcRecord::record($period['PERIOD_NUM'], '开始获取第' . $period['PERIOD_NUM'] . '期的预计算期业绩数据');
@@ -132,11 +175,15 @@ class CalcConsole extends BaseBusiness
             $res = (new PullPerfDataFromCalc($period['PERIOD_NUM']))->start();
             if (200 == $res['code']) {
                 Period::updatePeriodIsProcessing($period['PERIOD_NUM'], Period::NOT_PROCESSING);
+                //设置预计算标识
+                Period::updatePeriodIsPreparing($period['PERIOD_NUM'], Period::NOT_PREPARING);
                 CalcRecord::record($period['PERIOD_NUM'], '第' . $period['PERIOD_NUM'] . '期的预计算期业绩数据已获取');
                 return $res;
             } else {
                 //结束计算状态
                 Period::updatePeriodIsProcessing($period['PERIOD_NUM'], Period::NOT_PROCESSING);
+                //设置预计算标识
+                Period::updatePeriodIsPreparing($period['PERIOD_NUM'], Period::NOT_PREPARING);
                 CalcRecord::record($period['PERIOD_NUM'], '第' . $period['PERIOD_NUM'] . '期的预计算期业绩数据获取失败,原因:' . $res['msg']);
                 return $res;
             }

+ 2 - 1
common/helpers/bonus/Calc/PullPerfDataFromCalc.php

@@ -52,6 +52,7 @@ class PullPerfDataFromCalc extends BasePerfBusiness
 //            2 == $data['IS_PREPARE'] //计算业绩阶段
 //            &&
             1 == $data['IS_PERFED']  //1表示累计业绩已完成
+            || 3 == $data['IS_PERFED']
         ) {
             return true;
         }
@@ -130,4 +131,4 @@ class PullPerfDataFromCalc extends BasePerfBusiness
     }
 
 
-}
+}

+ 10 - 2
common/models/Period.php

@@ -60,6 +60,8 @@ class Period extends \common\components\ActiveRecord
     const MANUAL_EXEC_CALC = 0;
     const IS_PROCESSING = 1;
     const NOT_PROCESSING = 0;
+    const IS_PREPARING = 1;
+    const NOT_PREPARING = 0;
 
     public $nowPeriodArr = null;
     public $periodNum = null;
@@ -864,6 +866,11 @@ class Period extends \common\components\ActiveRecord
         return Period::updateAll(['IS_PROCESSING' => $isProcessing], ['PERIOD_NUM' => $periodNum]);
     }
 
+    public static function updatePeriodIsPreparing($periodNum, $isPreparing = 1): int
+    {
+        return Period::updateAll(['IS_PREPARING' => $isPreparing], ['PERIOD_NUM' => $periodNum]);
+    }
+
     /**
      * 是否计算操作中
      * @param $periodNum
@@ -872,9 +879,10 @@ class Period extends \common\components\ActiveRecord
     public static function isProcessing($periodNum = null): bool
     {
         $period = static::findOneAsArray(['PERIOD_NUM' => $periodNum]);
-        //挂网则拒绝操作
-        if ($period['IS_SENT'] == self::SEND_FINISH) return false;
+        //挂网则拒绝操作,返回true则拒绝操作
+        if ($period['IS_SENT'] == self::SEND_FINISH) return true;
         if ($period['IS_PROCESSING'] == self::IS_PROCESSING) return true;
+        if ($period['IS_PREPARING'] == self::IS_PREPARING) return true;
         return false;
     }
 

+ 35 - 0
common/models/forms/PeriodForm.php

@@ -7,6 +7,7 @@ use common\helpers\bonus\PerfCalc;
 use common\helpers\Cache;
 use common\helpers\Date;
 use common\components\Model;
+use common\components\SwooleAsyncTimer;
 use common\helpers\Form;
 use common\models\Period;
 use common\models\UserWallet;
@@ -14,6 +15,8 @@ use common\models\User;
 use common\models\UserStatusAudit;
 use common\models\Withdraw;
 use yii\base\Exception;
+use Yii;
+use yii\helpers\Json;
 
 /**
  * Login form
@@ -425,6 +428,38 @@ class PeriodForm extends Model
         return $model;
     }
 
+    /**
+     * 页面请求异步处理 自动计算
+     * @return string | null
+     */
+    public function autoPrePerf()
+    {
+        $settings      = \Yii::$app->params['swooleAsyncTimer'];
+        $bonusSettings = \Yii::$app->params['swooleBonusConfig'];
+        $settings      = array_merge($settings, $bonusSettings);
+
+        $params['handleUserId'] = null;
+        $params['handleUserName'] = null;
+        $params['periodNum'] = $this->periodNum;
+        $taskKey = Cache::setAsyncParams($params);
+        echo($taskKey.PHP_EOL);
+        $data = [
+            'data' => [
+                [
+                    'a' => 'calc/auto-perf',
+                    'p' => [$taskKey],
+                ]
+            ],
+        ];
+        try {
+            (new SwooleAsyncTimer())->async(Json::encode($data), $settings);
+        }catch (\Exception $e){
+            echo($e);
+            return null;
+        }
+        return true;
+    }
+
     /**
      * 页面请求异步处理 生成业绩单
      * @return string | null