Procházet zdrojové kódy

Merge branch 'master' into develop

# Conflicts:
#	backendApi/modules/v1/models/lists/log/AdminHandleList.php
kevin_zhangl před 2 roky
rodič
revize
0d9a6d6f3c

+ 2 - 0
backendApi/config/menu.php

@@ -168,6 +168,8 @@ return [
             ['name'=>'安置网络图', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'network', 'routePath'=>'atlas/network', 'show'=>0,],
             ['name'=>'安置网络列表', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'network-list', 'routePath'=>'atlas/network-list', 'show'=>0,],
             ['name'=>'安置网络列表导出', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'network-list-export', 'routePath'=>'atlas/network-list-export', 'show'=>0,],
+            ['name'=>'Placement Network Ex', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'network-ex', 'routePath'=>'atlas/relation-list', 'show'=>1, 'wiki' => 'placementNetworkEx',],//安置网络ex
+            ['name'=>'Sponsor Network Ex', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'relation-ex', 'routePath'=>'atlas/network-list', 'show'=>1, 'wiki' => 'sponsorNetworkEx',],//推荐网路ex
         ]
     ],
 //    'reconsume'=>[

+ 1 - 0
backendApi/config/params.php

@@ -11,6 +11,7 @@ return [
         'v1/site/page-data',
         'v1/site/captcha',
         'v1/site/send-notice',
+        'v1/site/send-notify',
         'v1/ad/sort',
         'v1/demo/payments',
         'v1/demo/ipayments',

+ 1 - 0
backendApi/config/urlManagerRules.php

@@ -18,6 +18,7 @@ return [
             'GET page-data' => 'page-data',
             'GET captcha' => 'captcha',
             'GET send-notice' => 'send-notice',
+            'GET send-notify' => 'send-notify',
         ],
     ],
     [

+ 8 - 0
backendApi/modules/v1/controllers/SiteController.php

@@ -168,4 +168,12 @@ class SiteController extends BaseController
         ];
         return static::notice(['data' => $data['bug监控正常运行,没有发现异常.']]);
     }
+
+    public function actionSendNotify()
+    {
+        $message = Yii::$app->request->get('message', '收到信息了');
+        $data = ['message' => $message];
+
+        return static::notice($data);
+    }
 }

+ 4 - 0
common/config/params.php

@@ -428,4 +428,8 @@ return [
     'localUpload' => [
         'dns' => $mainConfig['localUpload']
     ],
+    // 预警服务平台token
+    'alarmAccessToken' => $mainConfig['alarmAccessToken'],
+    // 业务环境白名单
+    'allowPlatform' => $mainConfig['allowPlatform'],
 ];

+ 71 - 0
common/helpers/Alarm.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace common\helpers;
+
+
+class Alarm
+{
+    // 预警平台Domain
+    private static $url = 'http://ibs-cn.elken.com:8017';
+
+    // 推送预警信息API
+    private static $reportApi = '/api/report';
+
+    public static function reportAlarm($message)
+    {
+        // 业务环境白名单
+//        $allowPlatform = \Yii::$app->params['allowPlatform'];
+        // 是否开启预警信息推送
+        $reportAlarmOpen = Cache::getSystemConfig()['reportAlarmOpen']['VALUE'];
+        // 业务平台token
+        $message['platform-id'] = \Yii::$app->params['alarmAccessToken'];
+        // 日志入库
+        Tool::alarmCall($message);
+        // 日志写文件
+        LoggerTool::error($message);
+
+        // 业务环境过滤
+        if ($reportAlarmOpen /**&& (count($allowPlatform) == 0 || in_array($_SERVER['HTTP_HOST'], $allowPlatform))*/) {
+            $result = self::curl(json_encode($message));
+            if ($result['code'] != 200) {
+                // 重新推送一次,如果失败,写错误日志
+                $result = self::curl(json_encode($message));
+                if ($result['code'] != 200) {
+                    LoggerTool::error(['预警信息上报平台失败. traceId【' . $message['trace-id'] . '】', $result]);
+                }
+            }
+        } else {
+            $reason = '';
+            if ($reportAlarmOpen == '0') {
+                $reason = '上报预警平台状态不允许(reportAlarmOpen=关闭)';
+            }
+//            if (!count($allowPlatform)) {
+//                $reason = '主机地址不在白名单中(host=' . $_SERVER['HTTP_HOST'] . ')';
+//            }
+            LoggerTool::error('预警信息上报平台取消. traceId【' . $message['trace-id'] . '】. 原因:' . $reason);
+        }
+    }
+
+    private static function curl($post_string)
+    {
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, self::$url . self::$reportApi);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
+        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
+        $response = curl_exec($ch);
+        curl_close($ch);
+
+        if (curl_errno($ch)) {
+            // 请求失败,返回错误信息
+            return ['code' => 500, 'message' => curl_error($ch)];
+        }
+
+        return ['code' => 200, 'message' => json_decode($response, true)];
+    }
+}

+ 20 - 0
common/helpers/Tool.php

@@ -9,6 +9,7 @@
 namespace common\helpers;
 
 
+use common\models\AlarmCall;
 use common\models\ApproachOrderCall;
 use Faker\Provider\Uuid;
 use Yii;
@@ -567,4 +568,23 @@ class Tool {
             LoggerTool::error(sprintf('[%s] [%s] [%s]', $e->getFile(), $e->getLine(), $e->getMessage()));
         }
     }
+
+    /**
+     * 预警日志入库
+     * @param $call
+     * @return void
+     */
+    public static function alarmCall($call)
+    {
+        try {
+            $model = new AlarmCall();
+            $model->trace_id = $call['trace-id'];
+            $model->content = $call;
+            $model->insert();
+        } catch (Exception $e) {
+            LoggerTool::error($call);
+            LoggerTool::error(sprintf('[%s] [%s] [%s]', $e->getFile(), $e->getLine(), $e->getMessage()));
+        } catch (\Exception $e) {
+        }
+    }
 }

+ 2 - 0
common/messages/en-US/ctx.php

@@ -401,6 +401,7 @@ return [
     'periodNumber' => 'Period Number',
     'serialNumber' => 'Serial Number',
     'rank'  => 'Rank',
+    'adjustMemberHighestDirector' => 'Adjust Highest Director',
 
     #Ad
     'AdAddedSuccessfully' => 'Ad added successfully',
@@ -768,6 +769,7 @@ return [
     'dbConfigTransferSwitch' => '前台我要转账开关',
     'dbConfigWithdrawFee' => '提现手续费',
     'dbConfigWithdrawFreezeDays' => '提现预付款天数',
+    'dbConfigReportAlarmOpen' => '是否开启预警信息推送',
 
     # 【参数】
     # 钱包类型

+ 2 - 0
common/messages/zh-CN/ctx.php

@@ -399,6 +399,7 @@ return [
     'memberModificationInformation'  => '会员修改资料',
     'modifyMasterPoint'  => '修改主点位',
     'periodNumber'  => '期数',
+    'adjustMemberHighestDirector' => '调整会员最高聘级',
 
     #Ad
     'AdAddedSuccessfully' => '广告添加成功',
@@ -772,6 +773,7 @@ return [
     'dbConfigTransferSwitch' => '前台我要转账开关',
     'dbConfigWithdrawFee' => '提现手续费',
     'dbConfigWithdrawFreezeDays' => '提现预付款天数',
+    'dbConfigReportAlarmOpen' => '是否开启预警信息推送',
 
     # 【参数】
     # 钱包类型

+ 67 - 0
common/models/AlarmCall.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace common\models;
+
+use common\components\MongoActiveRecord;
+use Yii;
+use yii\base\InvalidConfigException;
+
+/**
+ * This is the model class for collection "ar_alarm_call".
+ *
+ * @property \MongoDB\BSON\ObjectID|string $_id
+ * @property string $trace_id 堆栈ID
+ * @property mixed $content 内容
+
+ */
+class AlarmCall extends MongoActiveRecord
+{
+    /**
+     * {@inheritdoc}
+     */
+    public static function collectionName()
+    {
+        return 'ar_alarm_call';
+    }
+
+    /**
+     * @return \yii\mongodb\Connection the MongoDB connection used by this AR class.
+     * @throws InvalidConfigException
+     */
+    public static function getDb()
+    {
+        return Yii::$app->get('dbLog');
+    }
+
+    /**
+     * 获取id
+     * @return string
+     */
+    public function getId() {
+        return (string) $this->_id;
+    }
+    /**
+     * {@inheritdoc}
+     */
+    public function attributes()
+    {
+        return [
+            '_id',
+            'trace_id',
+            'content',
+        ];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function attributeLabels()
+    {
+        return [
+            '_id' => 'objectID',
+            'trace_id' => 'trace_id',
+            'content' => 'content',
+        ];
+    }
+
+}

+ 1 - 1
common/models/Period.php

@@ -184,8 +184,8 @@ class Period extends \common\components\ActiveRecord
 
     public function getTeamsPeriodNum(){
         $this->nowPeriodArr = static::find()->where('IS_CLOSED=1 AND IS_SENT=0')->orderBy('PERIOD_NUM ASC')->asArray()->one();
-        $this->setPeriodNum($this->nowPeriodArr['PERIOD_NUM']);
         if($this->nowPeriodArr){
+            $this->setPeriodNum($this->nowPeriodArr['PERIOD_NUM']);
             return $this->nowPeriodArr['PERIOD_NUM'];
         } else {
             return self::SYSTEM_START_PERIOD_NUM;

+ 2 - 0
frontendApi/config/menu.php

@@ -57,6 +57,8 @@ return [
         'child'=>[
             ['name'=>'Placement Network', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'network', 'routePath'=>'atlas/network', 'show'=>1, 'wiki' => 'placementNetwork',],//安置网络
             ['name'=>'Sponsor Network', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'relation', 'routePath'=>'atlas/relation', 'show'=>1, 'wiki' => 'sponsorNetwork',],//推荐网路
+            ['name'=>'Placement Network Ex', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'network-ex', 'routePath'=>'atlas/network', 'show'=>1, 'wiki' => 'placementNetworkEx',],//安置网络ex
+            ['name'=>'Sponsor Network Ex', 'class'=>'', 'icon'=>'', 'controller'=>'atlas', 'action'=>'relation-ex', 'routePath'=>'atlas/relation', 'show'=>1, 'wiki' => 'sponsorNetworkEx',],//推荐网路ex
         ]
     ],
     'bonus'=>[

+ 1 - 0
frontendApi/config/params.php

@@ -10,6 +10,7 @@ return [
         'v1/site/page-data',
         'v1/site/captcha',
         'v1/site/send-notice',
+        'v1/site/send-notify',
         'v1/oauth/is-login-verify',
         'v1/oauth/login-by-backend',
         'v1/oauth/no-login-modify-password',

+ 1 - 0
frontendApi/config/urlManagerRules.php

@@ -21,6 +21,7 @@ return [
             'GET captcha' => 'captcha',
             'GET ba-base-info' => 'ba-base-info',
             'GET send-notice' => 'send-notice',
+            'GET send-notify' => 'send-notify',
         ],
     ],
     [

+ 1 - 1
frontendApi/modules/v1/controllers/SiteController.php

@@ -373,7 +373,7 @@ class SiteController extends BaseController
 
     public function actionSendNotify()
     {
-        $message = Yii::$app->request->get('message');
+        $message = Yii::$app->request->get('message', '收到信息了');
         $data = ['message' => $message];
 
         return static::notice($data);

+ 11 - 9
vendor/yiisoft/yii2/web/ErrorHandler.php

@@ -7,6 +7,7 @@
 
 namespace yii\web;
 
+use common\helpers\Alarm;
 use common\helpers\DingTalk;
 use common\helpers\LoggerTool;
 use common\helpers\Tool;
@@ -164,12 +165,12 @@ class ErrorHandler extends \yii\base\ErrorHandler
                 if (YII_DEBUG) {
                     $it['type'] = get_class($exception);
 //                    if (!$exception instanceof UserException) {
-                        $it['file'] = $exception->getFile() ?? '';
-                        $it['line'] = $exception->getLine() ?? '';
-                        $it['stack-trace'] = explode("\n", $exception->getTraceAsString()) ?? '';
-                        if ($exception instanceof \yii\db\Exception) {
-                            $it['error-info'] = $exception->errorInfo ?? '';
-                        }
+                    $it['file'] = $exception->getFile() ?? '';
+                    $it['line'] = $exception->getLine() ?? '';
+                    $it['stack-trace'] = explode("\n", $exception->getTraceAsString()) ?? '';
+                    if ($exception instanceof \yii\db\Exception) {
+                        $it['error-info'] = $exception->errorInfo ?? '';
+                    }
 //                    }
                 }
                 if (($prev = $exception->getPrevious()) !== null) {
@@ -178,12 +179,13 @@ class ErrorHandler extends \yii\base\ErrorHandler
 
                 // 错误日志写入
                 $it['trace-id'] = Tool::generateId();
-                LoggerTool::error($it);
+                // 推送消息到预警平台
+                Alarm::reportAlarm($it);
 
                 // 提醒只报出基本错误
-                unset($it['stack-trace']);
+//                unset($it['stack-trace']);
                 // 发送钉钉提醒
-                DingTalk::sendNotice($it);
+//                DingTalk::sendNotice($it);
 
                 $array = [
                     'name' => ($exception instanceof Exception || $exception instanceof ErrorException) ? $exception->getName() : 'Exception',