Kaynağa Gözat

计算时增加CALC_ID

theo 2 yıl önce
ebeveyn
işleme
6b6687cee7

+ 27 - 2
backendApi/modules/v1/controllers/CalcController.php

@@ -15,6 +15,7 @@ use common\models\CalcRecord;
 use common\models\FlowBonus;
 use common\models\forms\PeriodForm;
 use common\models\Period;
+use common\models\CalcOperation;
 use Yii;
 
 /**
@@ -42,7 +43,9 @@ class CalcController extends BaseController
         //设置自动计算标识
         Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
         //记录开始计算的时间
-        Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
+        $calc_id = uniqid('perf_');
+        CalcOperation::record($calc_id, $periodNum);
+        Period::updateAll(['START_EXEC_TIME' => time(), 'CALC_ID' => $calc_id], ['PERIOD_NUM' => $periodNum]);
 
         $formModel = new PeriodForm();
         $formModel->scenario = 'autoPerf';
@@ -79,7 +82,9 @@ class CalcController extends BaseController
         //设置自动计算标识
         Period::updatePeriodIsAutoExec($periodNum, Period::AUTO_EXEC_CALC);
         //记录开始计算的时间
-        Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
+        $calc_id = uniqid('calc_');
+        CalcOperation::record($calc_id, $periodNum);
+        Period::updateAll(['START_EXEC_TIME' => time(), 'CALC_ID' => $calc_id], ['PERIOD_NUM' => $periodNum]);
 
         $formModel           = new PeriodForm();
         $formModel->scenario = 'perf';
@@ -111,6 +116,10 @@ class CalcController extends BaseController
         Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
         //设置计算进行中标识
         Period::updatePeriodIsProcessing($periodNum, Period::IS_PROCESSING);
+        //记录开始计算的时间
+        $calc_id = uniqid('manu_');
+        CalcOperation::record($calc_id, $periodNum);
+        Period::updateAll(['START_EXEC_TIME' => time(), 'CALC_ID' => $calc_id], ['PERIOD_NUM' => $periodNum]);
 
         $formModel           = new PeriodForm();
         $formModel->scenario = 'perf';
@@ -180,6 +189,10 @@ class CalcController extends BaseController
         $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
             ->bindValue(':PERIOD_NUM', $periodNum)
             ->queryOne();
+        $businessPeriod = Period::find()->where(['PERIOD_NUM' => $periodNum])->asArray()->one();
+        if (!$period['CALC_ID'] || $period['CALC_ID'] != $businessPeriod['CALC_ID']) {
+            return static::notice('CALC ID不符', 400);
+        }
 
         if (empty($period)) {
             Period::updatePeriodIsProcessing($periodNum, Period::NOT_PROCESSING);
@@ -212,6 +225,10 @@ class CalcController extends BaseController
         $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
             ->bindValue(':PERIOD_NUM', $periodNum)
             ->queryOne();
+        $businessPeriod = Period::find()->where(['PERIOD_NUM' => $periodNum])->asArray()->one();
+        if (!$period['CALC_ID'] || $period['CALC_ID'] != $businessPeriod['CALC_ID']) {
+            return static::notice('CALC ID不符', 400);
+        }
 
         if (empty($period)) {
             return static::notice('计算系统中的第' . $periodNum . '期的业绩期信息不存在');
@@ -251,6 +268,10 @@ class CalcController extends BaseController
         $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
             ->bindValue(':PERIOD_NUM', $periodNum)
             ->queryOne();
+        $businessPeriod = Period::find()->where(['PERIOD_NUM' => $periodNum])->asArray()->one();
+        if (!$period['CALC_ID'] || $period['CALC_ID'] != $businessPeriod['CALC_ID']) {
+            return static::notice('CALC ID不符', 400);
+        }
 
         $formModel           = new PeriodForm();
         $formModel->scenario = 'calc';
@@ -288,6 +309,10 @@ class CalcController extends BaseController
         $period = \Yii::$app->$db->createCommand('SELECT * FROM AR_PERIOD where PERIOD_NUM=:PERIOD_NUM')
             ->bindValue(':PERIOD_NUM', $periodNum)
             ->queryOne();
+        $businessPeriod = Period::find()->where(['PERIOD_NUM' => $periodNum])->asArray()->one();
+        if (!$period['CALC_ID'] || $period['CALC_ID'] != $businessPeriod['CALC_ID']) {
+            return static::notice('CALC ID不符', 400);
+        }
 
         if (empty($period)) {
             return static::notice('计算系统中的第' . $periodNum . '期的业绩期信息不存在');

+ 21 - 1
common/helpers/bonus/Calc/CalcConsole.php

@@ -5,6 +5,7 @@ namespace common\helpers\bonus\Calc;
 
 use common\helpers\Cache;
 use common\helpers\Form;
+use common\models\CalcOperation;
 use common\models\CalcRecord;
 use common\models\forms\PeriodForm;
 use common\models\Period;
@@ -45,6 +46,10 @@ class CalcConsole extends BaseBusiness
         $businessPeriod = Period::find()->where(['PERIOD_NUM' => $period['PERIOD_NUM']])
             ->asArray()->one();
 
+        if(!$period['CALC_ID'] || $period['CALC_ID'] != $businessPeriod['CALC_ID']) { // 如果计算ID不符,则退出
+            return true;
+        }
+
         if (empty($businessPeriod)) {
             return true;
         }
@@ -114,6 +119,8 @@ class CalcConsole extends BaseBusiness
                 //流程结束
                 //同步周期表的值到业务系统
                 self::pullPeriodForUpdate($period['PERIOD_NUM']);
+                \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['CALC_ID' => ''], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $period['PERIOD_NUM']])->execute();
+                CalcOperation::closeOperation($businessPeriod['CALC_ID']);
                 //拉取计算系统的进度日志
                 self::syncLogRecord($period['PERIOD_NUM'], $db, $startExecTime);
                 //设置redis开关
@@ -121,6 +128,8 @@ class CalcConsole extends BaseBusiness
             } else {
                 //结束计算状态
                 Period::updatePeriodIsProcessing($period['PERIOD_NUM'], Period::NOT_PROCESSING);
+                \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['CALC_ID' => ''], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $period['PERIOD_NUM']])->execute();
+                CalcOperation::closeOperation($businessPeriod['CALC_ID']);
                 CalcRecord::record($period['PERIOD_NUM'], '【奖金计算】第' . $period['PERIOD_NUM'] . '期的奖金数据获取失败,原因:' . $res['msg']);
                 return $res;
             }
@@ -152,7 +161,9 @@ class CalcConsole extends BaseBusiness
             //设置自动计算标识
             Period::updatePeriodIsAutoExec($periodNum, Period::MANUAL_EXEC_CALC);
             //记录开始计算的时间
-            Period::updateAll(['START_EXEC_TIME' => time()], ['PERIOD_NUM' => $periodNum]);
+            $calc_id = uniqid('calc_');
+            CalcOperation::record($calc_id, $periodNum);
+            Period::updateAll(['START_EXEC_TIME' => time(), 'CALC_ID' => $calc_id], ['PERIOD_NUM' => $periodNum]);
             $formModel = new PeriodForm();
             $formModel->scenario = 'autoPerf';
 
@@ -191,6 +202,11 @@ class CalcConsole extends BaseBusiness
             return true;
         }
         $businessPeriod = Period::find()->where(['PERIOD_NUM' => $period['PERIOD_NUM']])->asArray()->one();
+
+        if(!$period['CALC_ID'] || $period['CALC_ID'] != $businessPeriod['CALC_ID']) { // 如果计算ID不符,则退出
+            return true;
+        }
+
         $startExecTime = $businessPeriod['START_EXEC_TIME'] ?? 0;
         if (
             $businessPeriod['SEND_STARTED_AT'] > 0 || $businessPeriod['IS_SENT'] > 0 // 已挂网
@@ -214,6 +230,8 @@ class CalcConsole extends BaseBusiness
                 //设置预计算标识
                 Period::updatePeriodIsPreparing($period['PERIOD_NUM'], Period::NOT_PREPARING);
                 CalcRecord::record($period['PERIOD_NUM'], '【期业绩】第' . $period['PERIOD_NUM'] . '期的预计算期业绩数据已获取');
+                \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['CALC_ID' => ''], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $period['PERIOD_NUM']])->execute();
+                CalcOperation::closeOperation($businessPeriod['CALC_ID']);
                 self::syncLogRecord($period['PERIOD_NUM'], $db, $startExecTime);
                 Yii::$app->cache->set('isPreparing', 0);
                 return $res;
@@ -222,6 +240,8 @@ class CalcConsole extends BaseBusiness
 //                Period::updatePeriodIsProcessing($period['PERIOD_NUM'], Period::NOT_PROCESSING);
                 //设置预计算标识
                 Period::updatePeriodIsPreparing($period['PERIOD_NUM'], Period::NOT_PREPARING);
+                \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['CALC_ID' => ''], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $period['PERIOD_NUM']])->execute();
+                CalcOperation::closeOperation($businessPeriod['CALC_ID']);
                 CalcRecord::record($period['PERIOD_NUM'], '【期业绩】第' . $period['PERIOD_NUM'] . '期的预计算期业绩数据获取失败,原因:' . $res['msg']);
                 return $res;
             }

+ 1 - 0
common/helpers/bonus/Calc/PushBaseDataToCalc.php

@@ -276,6 +276,7 @@ class PushBaseDataToCalc extends BaseBusiness
             'CALCULATE_STARTED_AT',
             'CALCULATED_AT',
             'CREATED_AT',
+            'CALC_ID',
         ]],
         //--- 月业绩表 只有当前结算月为季度最终月时才推
         'perfMonth'        => ['separately' => true, 'table' => 'AR_PERF_MONTH', 'field' => [

+ 72 - 0
common/models/CalcOperation.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace common\models;
+
+use Yii;
+
+/**
+ * This is the model class for table "{{%RECHARGE}}".
+ *
+ * @property string $ID
+ * @property string $CALC_ID 单号
+ * @property string $ADMIN_ID 会员ID
+ * @property int $PERIOD_NUM 期数
+ * @property int $START_AT 开始时间
+ * @property int $END_AT 结束时间
+ * @property int $STATUS 状态
+ */
+
+class CalcOperation extends \common\components\ActiveRecord {
+    /**
+     * @inheritdoc
+     */
+    public static function tableName() {
+        return '{{%CALC_OPERATION}}';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules() {
+        return [
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels() {
+        return [
+            'ID' => 'ID',
+            'CALC_ID' => '计算ID',
+            'ADMIN_ID' => '管理员ID',
+            'PERIOD_NUM' => '期数',
+            'START_TIME' => '开始时间',
+            'END_TIME' => '结束时间',
+            'STATUS' => '状态',
+        ];
+    }
+
+    /**
+     * @param $periodNum
+     * @param $text
+     * @return bool
+     * @throws \yii\db\Exception
+     */
+    public static function record($calcId, $periodNum)
+    {
+        self::insertOne([
+            'CALC_ID' => $calcId,
+            'ADMIN_ID' => '',
+            'PERIOD_NUM' => $periodNum,
+            'START_TIME' => time(),
+            'END_TIME' => '',
+            'STATUS' => 0,
+        ]);
+        return true;
+    }
+
+    public static function closeOperation($calcId){
+        self::updateAll(['STATUS' => 1, 'END_TIME' => time()], 'CALC_ID=:CALC_ID', [':CALC_ID' => $calcId]);
+    }
+}

+ 9 - 1
console/controllers/CalcController.php

@@ -16,11 +16,12 @@ use common\helpers\bonus\Calc\PushBaseDataToCalc;
 use common\helpers\Cache;
 use common\models\CalcRecord;
 use common\models\Period;
+use common\models\CalcOperation;
 
 
 class CalcController extends BaseController
 {
-
+    const  CALC_DB_NAME = 'dbCalcServer';
     public function actionPerfOrder($taskKey)
     {
         $params    = Cache::getAsyncParams($taskKey);
@@ -194,16 +195,23 @@ class CalcController extends BaseController
      */
     public function actionPullBonus($taskKey): bool
     {
+        $db        = self::CALC_DB_NAME;
         $params    = Cache::getAsyncParams($taskKey);
         $periodNum = $params['periodNum'] ?? 0;
         CalcRecord::record($periodNum, '【奖金计算】开始拉取'.$periodNum.'期奖金数据');
+        $currentPeriod = Period::find()->where(['PERIOD_NUM' => $periodNum])
+            ->asArray()->one();
         //推送数据 状态已修改
         $res = (new PullCalcBonusData($periodNum))->start();
         if (200 == $res['code']) {
             self::recordCalcAndProcessStatus($periodNum, '【奖金计算】'.$periodNum.'期奖金数据已全部拉取');
+            \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['CALC_ID' => ''], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $periodNum])->execute();
+            CalcOperation::closeOperation($currentPeriod['CALC_ID']);
             return true;
         } else {
             self::recordCalcAndProcessStatus($periodNum, '【奖金计算】'.$periodNum.'期奖金数据拉取失败,原因:' . $res['msg'] ?? '');
+            \Yii::$app->$db->createCommand()->update('AR_PERIOD', ['CALC_ID' => ''], 'PERIOD_NUM=:PERIOD_NUM', ['PERIOD_NUM' => $periodNum])->execute();
+            CalcOperation::closeOperation($currentPeriod['CALC_ID']);
             return false;
         }
     }