Browse Source

Merge branch 'new-version' into dev

# Conflicts:
#	common/config/main.php
kevin_zhangl 2 năm trước cách đây
mục cha
commit
6cb66a12d5

+ 1 - 0
backendApi/modules/v1/controllers/ShopController.php

@@ -367,6 +367,7 @@ class ShopController extends BaseController {
             'MOBILE'=> 'O.MOBILE',
             'PERIOD_NUM'=> 'O.PERIOD_NUM',
             'CREATED_AT'=> 'O.CREATED_AT',
+            'PAY_TYPE'=> 'O.PAY_TYPE',
         ]);
 //        $condition = ' 1=1 ' . $filter['condition'];
 //        $params = $filter['params'];

+ 1 - 1
backendApi/modules/v1/models/lists/shop/GoodsList.php

@@ -50,7 +50,7 @@ class GoodsList extends \common\libs\dataList\DataList implements DataListInterf
                 'CATE_ID' => [
                     'header' => '商品来源',
                     'value' => function($row){
-                        return ShopGoods::GOODS_TYPE[$row['CATE_ID']]['name'];
+                        return ShopGoods::GOODS_TYPE[$row['CATE_ID']]['name'] ?? '';
                     },
                     'headerOther' => ['width' => '150'],
                 ],

+ 11 - 1
backendApi/modules/v1/models/lists/shop/OrderList.php

@@ -391,7 +391,17 @@ class OrderList extends \common\libs\dataList\DataList implements DataListInterf
                         ['id'=>1, 'name'=>'是'],
                         ['id'=>0, 'name'=>'否'],
                     ]
-                ]
+                ],
+                'PAY_TYPE' => [
+                    'name'=>'支付方式',
+                    'other'=> 'select',
+                    'selectData'=> [
+                        ['id' => 'cash', 'name' => '充值账户'],
+                        ['id' => 'exchange', 'name' => '兑换点数'],
+                        ['id' => 'points', 'name' => '复消积分'],
+                        ['id' => 'online', 'name' => '在线支付'],
+                    ]
+                ],
             ];
         }
         return $this->filterTypes;

+ 3 - 4
backendEle/src/views/config/base.vue

@@ -59,6 +59,7 @@
           <el-button type="primary" @click="initRegionXls" :loading="initRegionXlsStat">导入地址xls</el-button>
           <el-button type="primary" @click="renewRegion" :loading="renewRegionStat">刷新地址表</el-button>
           <el-button type="primary" @click="genRegionJs" :loading="genRegionJsStat">生成js</el-button>
+          <el-form><span class="closeWeb">注:需要测试环境更新地址库,检查无误后,在手动更新到正式环境</span></el-form>
         </el-form-item>
         <el-form-item label="行政区划缓存">
           <el-button type="primary" @click="renewRegionCache" :loading="renewReginCacheStat">更新Redis</el-button>
@@ -83,8 +84,7 @@ export default {
       configData: null,
       initRegionXlsStat: false,
       renewRegionStat: false,
-      genRegionJsStat: false,
-    }
+      genRegionJsStat: false }
   },
   computed: {
     form: function () {
@@ -157,8 +157,7 @@ export default {
         this.configData = response
         this.loading = false
       })
-    },
-  }
+    } }
 }
 </script>
 

+ 1 - 1
backendEle/src/views/shop/index.vue

@@ -424,7 +424,7 @@ export default {
         vueObj.form.goodsName = response.goodsInfo.GOODS_NAME
         vueObj.form.sellDiscount = response.goodsInfo.SELL_DISCOUNT
         vueObj.form.goodsNo = response.goodsInfo.GOODS_NO
-        vueObj.form.type = response.goodsInfo.TYPE
+        vueObj.form.type = response.goodsInfo.CATE_ID
         vueObj.form.unit = response.goodsInfo.UNIT
         vueObj.form.marketPrice = response.goodsInfo.MARKET_PRICE
         vueObj.form.sellPrice = response.goodsInfo.SELL_PRICE

+ 4 - 2
common/config/main.php

@@ -66,8 +66,10 @@ return [
             'merchantCode' => 'M08669', // 'M08669_S0002',  // M08669(prod)
             'merchantKey' => 'SiYF6a0QYy', // '5Mb154IrY8',   // SiYF6a0QYy(prod)
             'currencyCode' => 'MYR', //'CNY', // MYR(马来币) CNY(人民币)
-            'responseUrl' => 'https://nc-fele-mips.elken.com:8015/#/shop/order-list', //'https://www.ncshop2023.com/#/shop/order-list', // TODO: https://nc-fele-mips.elken.com:8015/#/shop/order-list(test)
-            'backendUrl' => 'https://nc-fapi-mips.elken.com:8013/v1/shop/verify-approach-order', //'https://fapi.ekhkad.com/v1/shop/verify-approach-order',  // https://nc-fapi-mips.elken.com:8013/v1/shop/verify-approach-order(test)
+//            'responseUrl' => 'http://nc-fele-mips.elken.com:8016/return.html', // (test)
+//            'backendUrl' => 'http://nc-fapi-mips.elken.com:8013/pay.html', // (test)
+            'responseUrl' => 'https://fele.ncshop.elken.com/return.html', // (prod)
+            'backendUrl' => 'http://fapi.ncshop.elken.com/v1/shop/verify-approach-order', // (prod)
             'requeryUrl' => 'https://payment.ipay88.com.my/epayment/enquiry.asp',
             'paymentUrl' => 'https://payment.ipay88.com.my/epayment/entry.asp',
             'recurringUrlSubscription' => 'https://www.ipay88.com/recurringpayment/webservice/RecurringPayment.asmx/Subscription',

+ 4 - 0
common/config/params.php

@@ -340,6 +340,10 @@ return [
         'atUserIds'   => ['rob9muw'],
         'isAtAll'     => false,
     ],
+    // 预警服务平台token
+    'alarmAccessToken' => $mainConfig['alarmAccessToken'],
+    // 业务环境白名单
+    'allowPlatform' => $mainConfig['allowPlatform'],
     // wst配置
     'wst' => [
         //  (prod)

+ 70 - 0
common/helpers/Alarm.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace common\helpers;
+
+
+class Alarm
+{
+    // 预警平台Domain
+    private static $url = 'http://ibs-cn.elken.com:8017';
+
+    // 推送预警信息API
+    private static $reportApi = '/api/report';
+
+    /**
+     * @throws \Exception
+     */
+    public static function reportAlarm($message)
+    {
+        // 业务环境白名单
+//        $allowPlatform = \Yii::$app->params['allowPlatform'];
+        // 是否开启预警信息推送
+        $reportAlarmOpen = Cache::getSystemConfig()['reportAlarmOpen']['VALUE'];
+        // 业务平台token
+        $message['platform-id'] = \Yii::$app->params['alarmAccessToken'];
+        // 堆栈ID
+        $message['trace-id'] = $message['trace-id'] ?? Tool::generateId();
+        // 级别
+        $message['stance'] = $message['stance'] ?? 2;
+        // 类型
+        $message['brand'] = $message['brand'] ?? 'OTA';
+        // 日志入库
+//        Tool::alarmCall($message);
+        // 日志写文件
+        LoggerTool::error($message);
+
+        // 业务环境过滤
+        if ($reportAlarmOpen /**&& (count($allowPlatform) == 0 || in_array($_SERVER['HTTP_HOST'], $allowPlatform))*/) {
+            self::curl(json_encode($message));
+
+            LoggerTool::notice(['信息推送预警平台成功.',  'platformID: .' . $message['platform-id'], 'traceID: . ' . $message['trace-id']]);
+        } 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);
+
+        return ['code' => 200, 'message' => json_decode($response, true)];
+    }
+}

+ 2 - 0
common/helpers/Logistics.php

@@ -149,6 +149,8 @@ class Logistics
         }
         $request['products'] = $products;
 
+        LoggerTool::debug($request);
+
         return $this->curl(self::createOrderUrl, $request);
     }
 

+ 22 - 1
common/helpers/Tool.php

@@ -9,6 +9,7 @@
 namespace common\helpers;
 
 
+use common\models\AlarmCall;
 use common\models\ApproachOrderCall;
 use common\models\WstOrderCall;
 use Faker\Provider\Uuid;
@@ -475,7 +476,27 @@ class Tool {
     }
 
     /**
-     * iPay88订单写入MongoDB.
+     * 预警日志入库
+     * @param $call
+     * @return void
+     * @throws \Exception
+     */
+    public static function alarmCall($call)
+    {
+        try {
+            $model = new AlarmCall();
+            $model->brand = $call['brand'];
+            $model->stance = $call['stance'];
+            $model->trace_id = $call['trace-id'];
+            $model->content = $call;
+            $model->insert();
+        } catch (\yii\mongodb\Exception $e) {
+            LoggerTool::error($call);
+            LoggerTool::error(sprintf('[%s] [%s] [%s]', $e->getFile(), $e->getLine(), $e->getMessage()));
+        }
+    }
+
+     /* iPay88订单写入MongoDB.
      * @param $call
      * @return void
      * @throws \Exception

+ 72 - 0
common/models/AlarmCall.php

@@ -0,0 +1,72 @@
+<?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 内容
+ * @property string $brand 类型
+ * @property string $stance 级别
+ */
+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',
+            'brand',
+            'stance',
+            'content',
+        ];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function attributeLabels()
+    {
+        return [
+            '_id' => 'objectID',
+            'trace_id' => 'trace_id',
+            'content' => 'content',
+            'brand' => 'brand',
+            'stance' => 'stance',
+        ];
+    }
+
+}

+ 1 - 1
common/models/Config.php

@@ -83,7 +83,7 @@ class Config extends \common\components\ActiveRecord
      * @return array|mixed|\yii\db\ActiveRecord[]
      */
     public static function getFromCache(){
-        Yii::$app->cache->delete(Cache::SYSTEM_CONFIG_KEY);
+//        Yii::$app->cache->delete(Cache::SYSTEM_CONFIG_KEY);
         $config = Yii::$app->cache->get(Cache::SYSTEM_CONFIG_KEY);
         if(!$config){
             // 获取配置

+ 2 - 0
common/models/DeclarationPackage.php

@@ -23,6 +23,7 @@ namespace common\models;
  * @property int $STATUS_DATE 是否开启限时
  * @property int $PACKAGE_STATUS_DATE 限时状态
  * @property int $PACKAGE_DATE 限时执行时间
+ * @property string $CATE_ID
  */
 class DeclarationPackage extends \common\components\ActiveRecord
 {
@@ -76,6 +77,7 @@ class DeclarationPackage extends \common\components\ActiveRecord
             'STATUS' => '是否上架',
             'DELETED_AT' => '删除时间',
             'STORE_NUMS' => '套餐库存',
+            'CATE_ID' => '商品来源',
         ];
     }
 

+ 26 - 9
common/models/forms/ApproachOrderForm.php

@@ -146,19 +146,26 @@ class ApproachOrderForm extends Model
     {
         $parentValidate = parent::beforeValidate();
         if ($this->sn) {
-            $this->_model = ApproachOrder::findOne(['SN' => $this->sn]);
+            $this->_model = ApproachOrder::findOne(['SN'=>$this->sn]);
             if (!$this->_model){
                 $this->addError('sn', '订单不存在');
                 return false;
             }
         }
+//        if ($this->sn) {
+//            $this->_model = ApproachOrder::find()->where('SN=:SN', [':SN' => $this->sn])->one();
+//            if (!$this->_model){
+//                $this->addError('sn', '订单不存在. ' . json_encode($this->_model));
+//                return false;
+//            }
+//        }
 
-        if ($this->scenario == 'verifyIPay88'){
-            if ($this->_model->STATUS != \Yii::$app->params['orderStatus']['notPaid']['value']) {
-                $this->addError('sn', '支付方式错误');
-                return false;
-            }
-        }
+//        if ($this->scenario == 'verifyIPay88'){
+//            if ($this->_model->STATUS != \Yii::$app->params['orderStatus']['notPaid']['value']) {
+//                $this->addError('sn', '支付方式错误');
+//                return false;
+//            }
+//        }
 
         return $parentValidate;
     }
@@ -168,10 +175,14 @@ class ApproachOrderForm extends Model
      * @param $attribute
      */
     public function isAddress($attribute){
-        if (!$receiveAddress = ReceiveAddress::find()->where(' ID=:ID', [':ID' => $this->addressId])->asArray()->one()) {
+        if (!$receiveAddress = ReceiveAddress::find()->where('ID=:ID', [':ID' => $this->addressId])->asArray()->one()) {
             $this->addError($attribute, '收货地址不存在');
         } else {
-            $this->_address = $receiveAddress;
+            if (!$receiveAddress['ZIP_CODE']){
+                $this->addError($attribute, '收货地址没有填写邮编');
+            } else {
+                $this->_address = $receiveAddress;
+            }
         }
     }
 
@@ -300,12 +311,14 @@ class ApproachOrderForm extends Model
         $totalPv = 0;
         $totalRealPv = 0;
         $this->_remainPv = 0;
+        $cateId = [];
         foreach ($this->goodsNum as $k => $v) {
             if ($v) {
                 $goods = ShopGoods::findOneAsArray('ID=:ID AND STATUS=1',[':ID'=> $ids[$k]]);
                 if (!$goods) {
                     throw new Exception('商品已下架');
                 }
+                $cateId[] = $goods['CATE_ID'];
                 if ($goods['STORE_NUMS'] > 0) {
                     $discount = $goods['SELL_DISCOUNT'];
                     $realPrice = $goods['SELL_PRICE'] * $discount;
@@ -342,6 +355,10 @@ class ApproachOrderForm extends Model
             }
         }
 
+        if (count(array_unique($cateId)) > 1) {
+            throw new Exception('海内商品、海外商品只能选择一种');
+        }
+
         $this->_decAmount = $totalAmount;
         $this->_decPv = $totalPv;
         $this->_realPv = $totalRealPv;

+ 33 - 25
common/models/forms/DecPackageForm.php

@@ -4,6 +4,7 @@ namespace common\models\forms;
 use backendApi\modules\v1\models\Admin;
 use common\components\Model;
 use common\helpers\Date;
+use common\helpers\LoggerTool;
 use common\models\DeclarationPackage;
 use yii\base\Exception;
 
@@ -96,32 +97,38 @@ class DecPackageForm extends Model
         if(!$this->validate()){
             return null;
         }
-        if($this->scenario == 'add'){
-            $model = new DeclarationPackage();
-            $model->CREATE_ADMIN = Admin::getAdminNameById(\Yii::$app->user->id);
-            $model->CREATED_AT = Date::nowTime();
-        } elseif($this->scenario == 'edit') {
-            $model = DeclarationPackage::findOne(['ID'=>$this->id]);
-            $model->UPDATE_ADMIN = Admin::getAdminNameById(\Yii::$app->user->id);
-            $model->UPDATED_AT = Date::nowTime();
-			$model->STATUS_DATE = $this->statusdate;
-			$model->PACKAGE_STATUS_DATE = $this->packagestatusdate;
-			$model->PACKAGE_DATE = $this->packagedate / 1000;
-        } else {
-            $this->addError('id', '提交场景不存在');
-            return null;
-        }
-        $model->PACKAGE_NAME = $this->packageName;
-        $model->PACKAGE_NO = $this->packageNo;
-        $model->AMOUNT = $this->amount;
-        $model->PV = $this->amountPv;
-        $model->LEVEL_ID = $this->levelId;
-        $model->PACKAGE_CONTENT = $this->packageContent;
-        $model->STORE_NUMS = $this->storenums;
-        $model->SORT = $this->sort;
-        if($model->save()){
+
+        $model = null;
+        try {
+            if($this->scenario == 'add'){
+                $model = new DeclarationPackage();
+                $model->CREATE_ADMIN = Admin::getAdminNameById(\Yii::$app->user->id);
+                $model->CREATED_AT = Date::nowTime();
+            } elseif($this->scenario == 'edit') {
+                $model = DeclarationPackage::findOne(['ID'=>$this->id]);
+                $model->UPDATE_ADMIN = Admin::getAdminNameById(\Yii::$app->user->id);
+                $model->UPDATED_AT = Date::nowTime();
+                $model->STATUS_DATE = $this->statusdate;
+                $model->PACKAGE_STATUS_DATE = $this->packagestatusdate;
+                $model->PACKAGE_DATE = $this->packagedate / 1000;
+            } else {
+                $this->addError('id', '提交场景不存在');
+                return null;
+            }
+            $model->PACKAGE_NAME = $this->packageName;
+            $model->PACKAGE_NO = $this->packageNo;
+            $model->AMOUNT = $this->amount;
+            $model->PV = $this->amountPv;
+            $model->LEVEL_ID = $this->levelId;
+            $model->CATE_ID = 1;
+            $model->PACKAGE_CONTENT = $this->packageContent;
+            $model->STORE_NUMS = $this->storenums;
+            $model->SORT = $this->sort;
+            $model->save();
+
             return $model;
-        } else {
+        } catch (\Exception $e) {
+            LoggerTool::error(sprintf('DecPackageFormError:%s, %s, %s', $e->getMessage(), $e->getLine(), $e->getFile()));
             $this->addErrors($model->getErrors());
             return null;
         }
@@ -147,6 +154,7 @@ class DecPackageForm extends Model
                 }
                 $oneGoods->STATUS = $this->status;
                 $oneGoods->UPDATED_AT = Date::nowTime();
+                $oneGoods->CATE_ID = 1;
                 if (!$oneGoods->save()) {
                     throw new Exception(Form::formatErrorsForApi($oneGoods->getErrors()));
                 }

+ 7 - 0
common/models/forms/OrderForm.php

@@ -310,12 +310,14 @@ class OrderForm extends Model
         $totalPv = 0;
         $totalRealPv = 0;
         $this->_remainPv = 0;
+        $cateId = [];
         foreach ($this->goodsNum as $k => $v) {
             if ($v) {
                 $goods = ShopGoods::findOneAsArray('ID=:ID AND STATUS=1',[':ID'=> $ids[$k]]);
                 if (!$goods) {
                     throw new Exception('商品不存在');
                 }
+                $cateId[] = $goods['CATE_ID'];
                 if($goods['STORE_NUMS']>0){
                     $discount = $goods['SELL_DISCOUNT'];
                     $realPrice = $goods['SELL_PRICE'] * $discount;
@@ -350,6 +352,11 @@ class OrderForm extends Model
                 }
             }
         }
+
+        if (count(array_unique($cateId)) > 1) {
+            throw new Exception('海内商品、海外商品只能选择一种');
+        }
+
         $this->_decAmount = $totalAmount;
         $this->_decPv = $totalPv;
         $this->_realPv = $totalRealPv;

+ 1 - 1
common/models/forms/ShopGoodsForm.php

@@ -208,7 +208,7 @@ class ShopGoodsForm extends Model
             $model = $this->_model;
             $model->GOODS_NAME = $this->goodsName;
             $model->TYPE = 0;
-            $model->CATE_ID = $this->type;
+            $model->CATE_ID = $this->type ?? $this->_model->CATE_ID;
             $model->SELL_DISCOUNT = $this->sellDiscount;
             $model->GIFT_TYPE = implode(',',$this->giftType);
             // $model->SELL_TYPE = implode(',',$this->sellType);

+ 1 - 0
composer.json

@@ -24,6 +24,7 @@
         "yiisoft/yii2-mongodb": "^2.1",
         "godruoyi/php-snowflake": "^1.0",
         "yiisoft/yii2-redis": "^2.0",
+	    "ext-json": "*",
 	    "ext-curl": "*"
     },
     "require-dev": {

+ 2 - 0
frontendApi/config/params.php

@@ -18,9 +18,11 @@ return [
         'v1/shop/verify-approach-order',
         'v1/shop/logistics',
         'v1/shop/logistics-auto',
+        'v1/shop/i-pay88'
     ],
     'noCheckPermissionActions' => [
         'shop/logistics',
         'shop/logistics-auto',
+        'shop/i-pay88'
     ],
 ];

+ 1 - 0
frontendApi/config/urlManagerRules.php

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

+ 127 - 91
frontendApi/modules/v1/controllers/ShopController.php

@@ -8,6 +8,7 @@
 
 namespace frontendApi\modules\v1\controllers;
 
+use common\helpers\Alarm;
 use common\helpers\Cache;
 use common\helpers\Date;
 use common\helpers\DingTalk;
@@ -162,40 +163,6 @@ class ShopController extends BaseController {
         return static::notice($data);
     }
 
-//    /**
-//     * 我的订单
-//     * @return mixed
-//     * @throws \yii\web\HttpException
-//     */
-//    public function actionOrderList() {
-//        $uname = Info::getUserNameByUserId(\Yii::$app->user->id);
-//        $condition = " AND IS_DELETE=0 AND ORDER_TYPE='FX' AND (USER_ID=:USER_ID OR CREATE_USER='$uname')";
-//        $params[':USER_ID'] = \Yii::$app->user->id;
-//        $data = Order::lists($condition, $params, [
-//            'select' => 'O.*,U.REAL_NAME,OG.*',
-//            'orderBy' => 'O.CREATED_AT DESC',
-//            'from' => Order::tableName() . ' AS O',
-//            'join' => [
-//                ['LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID'],
-//                ['LEFT JOIN', OrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN'],
-//            ],
-//        ]);
-//        foreach ($data['list'] as $key => $value) {
-//            if($value['ORDER_TYPE']=='ZC'){
-//                $data['list'][$key]['ORDER_TYPE'] = '首单';
-//            }else{
-////                $data['list'][$key]['ORDER_TYPE'] = in_array($value['PAY_TYPE'], ['cash', 'paystack']) ? '复消': '积分';
-//                $data['list'][$key]['ORDER_TYPE'] = '复消';
-//            }
-//            //$data['list'][$key]['PROVINCE_NAME'] = $value['PROVINCE'] ? Region::getCnName($value['PROVINCE']) : '';
-//           //$data['list'][$key]['CITY_NAME'] = $value['CITY'] ? Region::getCnName($value['CITY']) : '';
-//            //$data['list'][$key]['COUNTY_NAME'] = $value['COUNTY'] ? Region::getCnName($value['COUNTY']) : '';
-//            $data['list'][$key]['PAY_AT'] = Date::convert($value['PAY_AT'],'Y-m-d H:i:s');
-//            $data['list'][$key]['PAY_TYPE'] = $value['PAY_TYPE'] == 'cash' ? '消费点数' : ($value['PAY_TYPE'] == 'exchange' ? '兑换点数' : '复消点数');
-//        }
-//        return static::notice($data);
-//    }
-
     /**
      * 我的订单
      * @return mixed
@@ -203,53 +170,89 @@ class ShopController extends BaseController {
      */
     public function actionOrderList() {
         $uname = Info::getUserNameByUserId(\Yii::$app->user->id);
-        $condition = " O.IS_DELETE = 0 AND O.ORDER_TYPE='FX' AND (O.USER_ID=:USER_ID OR O.CREATE_USER='$uname')";
+        $condition = " AND IS_DELETE=0 AND ORDER_TYPE='FX' AND (USER_ID=:USER_ID OR CREATE_USER='$uname')";
         $params[':USER_ID'] = \Yii::$app->user->id;
-        $orderQuery = Order::find()
-            ->alias('O')
-            ->where($condition, $params)
-            ->select('O.*,U.REAL_NAME,OG.REAL_PRICE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV,OG.ORDER_SN,OG.GOODS_ID')
-            ->join('LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID')
-            ->join('LEFT JOIN', OrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
-            ->orderBy('O.CREATED_AT DESC');
-
-        // 订单中间表只查询待支付和支付失败的订单
-        $params[':NOT_PAID'] = \Yii::$app->params['orderStatus']['notPaid']['value'];   // 待支付
-        $params[':FAIL_PAID'] = \Yii::$app->params['orderStatus']['failPaid']['value'];   // 支付失败
-        $orderStandardQuery = ApproachOrder::find()
-            ->alias('O')
-            ->where($condition . ' AND (O.STATUS = :NOT_PAID OR O.STATUS = :FAIL_PAID)', $params)
-            ->select('O.*,U.REAL_NAME,OG.REAL_PRICE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV,OG.ORDER_SN,OG.GOODS_ID')
-            ->join('LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID')
-            ->join('LEFT JOIN', ApproachOrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
-            ->orderBy('O.CREATED_AT DESC');
-
-        $queryAll = $orderQuery->union($orderStandardQuery, true);
-        $query = (new Query())->from(['Q' => $queryAll])->select('Q.*')->distinct()->orderBy(['CREATED_AT' => SORT_DESC]);
-
-        $totalCount = $query->count();
-        $pagination = new Pagination(['totalCount' => $totalCount, 'pageSize' => \Yii::$app->request->get('pageSize')]);
-        $lists = $query->offset($pagination->offset)->limit($pagination->limit)->all();
-
-        $data = [
-            'list' => $lists,
-            'currentPage'=>$pagination->page,
-            'totalPages'=>$pagination->pageCount,
-            'startNum' => $pagination->page * $pagination->pageSize + 1,
-            'totalCount' => $pagination->totalCount,
-            'pageSize' => $pagination->pageSize,
-        ];
-
+        $data = Order::lists($condition, $params, [
+            'select' => 'O.*,U.REAL_NAME,OG.*',
+            'orderBy' => 'O.CREATED_AT DESC',
+            'from' => Order::tableName() . ' AS O',
+            'join' => [
+                ['LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID'],
+                ['LEFT JOIN', OrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN'],
+            ],
+        ]);
         foreach ($data['list'] as $key => $value) {
-            $data['list'][$key]['ORDER_TYPE'] = $value['ORDER_TYPE'] == 'ZC' ? '首单' : '复消';
-            $data['list'][$key]['PAY_AT'] = $value['PAY_AT'] ? Date::convert($value['PAY_AT'],'Y-m-d H:i:s') : '';
+            if($value['ORDER_TYPE']=='ZC'){
+                $data['list'][$key]['ORDER_TYPE'] = '首单';
+            }else{
+//                $data['list'][$key]['ORDER_TYPE'] = in_array($value['PAY_TYPE'], ['cash', 'paystack']) ? '复消': '积分';
+                $data['list'][$key]['ORDER_TYPE'] = '复消';
+            }
+            //$data['list'][$key]['PROVINCE_NAME'] = $value['PROVINCE'] ? Region::getCnName($value['PROVINCE']) : '';
+           //$data['list'][$key]['CITY_NAME'] = $value['CITY'] ? Region::getCnName($value['CITY']) : '';
+            //$data['list'][$key]['COUNTY_NAME'] = $value['COUNTY'] ? Region::getCnName($value['COUNTY']) : '';
+            $data['list'][$key]['PAY_AT'] = Date::convert($value['PAY_AT'],'Y-m-d H:i:s');
+//            $data['list'][$key]['PAY_TYPE'] = $value['PAY_TYPE'] == 'cash' ? '消费点数' : ($value['PAY_TYPE'] == 'exchange' ? '兑换点数' : '复消点数');
             $data['list'][$key]['PAY_TYPE'] = ShopGoods::payTypes()[$value['PAY_TYPE']]['name'] ?? '';
             $data['list'][$key]['STATUS'] = \Yii::$app->params['orderStatus'][$value['STATUS']]['label'] ?? '';
         }
-
-        return $data;
+        return static::notice($data);
     }
 
+//    /**
+//     * 我的订单
+//     * @return mixed
+//     * @throws \yii\web\HttpException
+//     */
+//    public function actionOrderList() {
+//        $uname = Info::getUserNameByUserId(\Yii::$app->user->id);
+//        $condition = " O.IS_DELETE = 0 AND O.ORDER_TYPE='FX' AND (O.USER_ID=:USER_ID OR O.CREATE_USER='$uname')";
+//        $params[':USER_ID'] = \Yii::$app->user->id;
+//        $orderQuery = Order::find()
+//            ->alias('O')
+//            ->where($condition, $params)
+//            ->select('O.*,U.REAL_NAME,OG.REAL_PRICE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV,OG.ORDER_SN,OG.GOODS_ID')
+//            ->join('LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID')
+//            ->join('LEFT JOIN', OrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
+//            ->orderBy('O.CREATED_AT DESC');
+//
+//        // 订单中间表只查询待支付和支付失败的订单
+//        $params[':NOT_PAID'] = \Yii::$app->params['orderStatus']['notPaid']['value'];   // 待支付
+//        $params[':FAIL_PAID'] = \Yii::$app->params['orderStatus']['failPaid']['value'];   // 支付失败
+//        $orderStandardQuery = ApproachOrder::find()
+//            ->alias('O')
+//            ->where($condition . ' AND (O.STATUS = :NOT_PAID OR O.STATUS = :FAIL_PAID)', $params)
+//            ->select('O.*,U.REAL_NAME,OG.REAL_PRICE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV,OG.ORDER_SN,OG.GOODS_ID')
+//            ->join('LEFT JOIN', User::tableName() . ' AS U', 'U.ID=O.USER_ID')
+//            ->join('LEFT JOIN', ApproachOrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
+//            ->orderBy('O.CREATED_AT DESC');
+//
+//        $queryAll = $orderQuery->union($orderStandardQuery, true);
+//        $query = (new Query())->from(['Q' => $queryAll])->select('Q.*')->distinct()->orderBy(['CREATED_AT' => SORT_DESC]);
+//
+//        $totalCount = $query->count();
+//        $pagination = new Pagination(['totalCount' => $totalCount, 'pageSize' => \Yii::$app->request->get('pageSize')]);
+//        $lists = $query->offset($pagination->offset)->limit($pagination->limit)->all();
+//
+//        $data = [
+//            'list' => $lists,
+//            'currentPage'=>$pagination->page,
+//            'totalPages'=>$pagination->pageCount,
+//            'startNum' => $pagination->page * $pagination->pageSize + 1,
+//            'totalCount' => $pagination->totalCount,
+//            'pageSize' => $pagination->pageSize,
+//        ];
+//
+//        foreach ($data['list'] as $key => $value) {
+//            $data['list'][$key]['ORDER_TYPE'] = $value['ORDER_TYPE'] == 'ZC' ? '首单' : '复消';
+//            $data['list'][$key]['PAY_AT'] = $value['PAY_AT'] ? Date::convert($value['PAY_AT'],'Y-m-d H:i:s') : '';
+//            $data['list'][$key]['PAY_TYPE'] = ShopGoods::payTypes()[$value['PAY_TYPE']]['name'] ?? '';
+//            $data['list'][$key]['STATUS'] = \Yii::$app->params['orderStatus'][$value['STATUS']]['label'] ?? '';
+//        }
+//
+//        return $data;
+//    }
+
     /**
      * 会员复消
      */
@@ -351,7 +354,7 @@ class ShopController extends BaseController {
         }
 
         // 支付webhook回调日志
-        Tool::approachOrderCall($data);
+        //Tool::approachOrderCall($data);
 
         try {
             // 订单状态
@@ -385,6 +388,14 @@ class ShopController extends BaseController {
 
                 return http_response_code(200);
             } else {
+                // 发送预警通知
+                $alarm = [
+                    'stance' => 5,
+                    'brand' => 'MSG',
+                    'message'  => sprintf('跨境商品支付回调失败. 订单号[%s], error[%s]', $oderSn, json_encode($formModel->getErrors())),
+                ];
+                Alarm::reportAlarm($alarm);
+
                 LoggerTool::error(Form::formatErrorsForApi($formModel->getErrors()));
                 return http_response_code(500);
             }
@@ -417,8 +428,16 @@ class ShopController extends BaseController {
     {
         // 订单ID
         $paymentParams['RefNo'] = \Yii::$app->request->post('RefNo');
+        // 订单
+        $order = ApproachOrder::findOne(['SN' => $paymentParams['RefNo']]);
+        if (!$order) {
+            return static::notice('订单编号无效');
+        }
+        // 转为分
+        $money = $order['PAY_AMOUNT'];
+
         // 订单金额,元=>分
-        $money = \Yii::$app->request->post('Amount');
+//        $money = \Yii::$app->request->post('Amount');
         // 马来币汇率
         $exchangeRateMYR = floatval(Cache::getSystemConfig()['exchangeRateMYR']['VALUE'] ?? 0);
         // 计算马来币
@@ -494,25 +513,31 @@ class ShopController extends BaseController {
      */
     public function actionLogisticsAuto()
     {
-        $createdAtStart = strtotime('yesterday');
+//        $createdAtStart = strtotime('yesterday');
         $createdAtEnd = strtotime(date('Y-m-d')) - 1;
         // 早0点推送,前一天0-24点的订单
         $orderList = Order::find()
             ->where(
-                '(CREATED_AT BETWEEN :CREATED_AT_START AND :CREATED_AT_END) AND STATUS=:STATUS AND SEND_AT=:SEND_AT AND PAY_TYPE=:PAY_TYPE',
+                '(CREATED_AT <= :CREATED_AT_END) AND STATUS=:STATUS AND SEND_AT=:SEND_AT AND PAY_TYPE=:PAY_TYPE AND IS_DELETE = 0',
                 [
-                    ':CREATED_AT_START' => $createdAtStart,
+//                    ':CREATED_AT_START' => $createdAtStart,
                     ':CREATED_AT_END' => $createdAtEnd,
                     ':STATUS' => \Yii::$app->params['orderStatus']['paid']['value'],
                     ':SEND_AT' => 0,
-                    'PAY_TYPE' => 'online',
+                    ':PAY_TYPE' => 'online',
                 ]
             )
             ->asArray()
             ->all();
 
         if (!$orderList) {
-            LoggerTool::info(['推送wst系统终止,原因:无订单', $createdAtStart, $createdAtEnd]);
+            LoggerTool::info(['跨境商品推送淘布斯系统终止,原因:无订单', $createdAtEnd]);
+            // 发送预警通知
+            $alarm = [
+                'brand' => 'MSG',
+                'message'  => '跨境商品推送淘布斯系统终止,原因:无订单',
+            ];
+            Alarm::reportAlarm($alarm);
             return static::notice('推送wst系统终止,原因:无订单');
         }
 
@@ -522,28 +547,39 @@ class ShopController extends BaseController {
         foreach ($orderList as $order) {
             // 发送wst仓库系统
             $response = $logistics->createOrder($order);
-            LoggerTool::warning($response);
+            LoggerTool::info($response);
             if ($response['success'] == 1) {
                 // 写入mongo
                 Tool::wstOrderCall($response['data']);
                 $orderSnSuccess[] = $order['SN'];
             } else {
+                // 记录推送结果
                 $orderSnFailed[] = $order['SN'];
+                LoggerTool::error(sprintf('跨境商品推送淘布斯系统失败. 订单号[%s], error[%s]', $order['SN'], $response));
+                // 发送预警通知
+                $alarm = [
+                    'stance' => 5,
+                    'brand' => 'MSG',
+                    'message'  => sprintf('跨境商品推送淘布斯系统失败. 订单号[%s], error[%s]', $order['SN'], $response),
+                ];
+                Alarm::reportAlarm($alarm);
             }
-
-            $orderSnSuccess[] = $response;
         }
 
-
         // 更新db中订单推送成功状态
         if (count($orderSnSuccess) > 0) {
-            Order::updateAll(['SEND_AT' => time()], 'SN IN (:SN)', [':SN' => implode("', '", $orderSnSuccess)]);
-        }
-        if (count($orderSnFailed) > 0) {
-            // 发送预警通知
-            LoggerTool::error(['自动推送wst失败', $orderSnFailed]);
+            $orderSnSuccessIds = implode("','", $orderSnSuccess);
+            Order::updateAll(['SEND_AT' => time()], "SN IN ('" . $orderSnSuccessIds . "')");
         }
 
-        return static::notice(sprintf('wstLogisticsAutoSend success order count{%d}, orderSN[%s]; failed count{%d}, orderSN[%s]', count($orderSnSuccess), implode(', ', $orderSnSuccess), count($orderSnFailed), implode(', ', $orderSnFailed)));
+        // 发送预警通知
+        $alarm = [
+            'stance' => 2,
+            'brand' => 'MSG',
+            'message'  => sprintf('跨境商品推送淘布斯系统结束. 成功订单数{%d}, 订单号[%s]; 失败订单数{%d}, 订单号[%s]', count($orderSnSuccess), implode(', ', $orderSnSuccess), count($orderSnFailed), implode(', ', $orderSnFailed)),
+        ];
+        Alarm::reportAlarm($alarm);
+
+        return static::notice(sprintf('跨境商品推送淘布斯系统结束. 成功订单数{%d}, 订单号[%s]; 失败订单数{%d}, 订单号[%s]', count($orderSnSuccess), implode(', ', $orderSnSuccess), count($orderSnFailed), implode(', ', $orderSnFailed)));
     }
 }

+ 17 - 0
frontendApi/modules/v1/controllers/SiteController.php

@@ -7,6 +7,7 @@
  */
 namespace frontendApi\modules\v1\controllers;
 
+use common\helpers\Alarm;
 use common\helpers\Cache;
 use common\helpers\snowflake\PageSnowFake;
 use common\models\Ad;
@@ -18,6 +19,7 @@ use Yii;
 use frontendApi\modules\v1\models\User;
 
 use common\helpers\parsedown\Parsedown;
+use yii\web\HttpException;
 
 class SiteController extends BaseController
 {
@@ -286,4 +288,19 @@ class SiteController extends BaseController
 
         return static::notice(['data' => $data['bug监控正常运行,没有发现异常,奥利给!']]);
     }
+
+    /**
+     * @throws HttpException
+     * @throws \Exception
+     */
+    public function actionSendNotify()
+    {
+        Alarm::reportAlarm([
+            'stance' => 1,
+            'brand' => 'OTA',
+            'message' => '预警信息测试',
+        ]);
+
+        return static::notice('成功', 0);
+    }
 }

+ 19 - 13
frontendEle/src/views/shop/order-overseas.vue

@@ -272,20 +272,26 @@
               }).then(() => {
                 network.postData(`shop/sure-approach-order`, data).then(response => {
                   this.submitButtonStat = false
-                  // 唤起支付页面
-                  network.postData(`shop/i-pay88`, { Amount: response.ORDER_AMOUNT, RefNo: response.SN }).then(payment => {
-                    this.actionUrl = payment.transactionUrl
-                    this.form = payment.paymentFields
 
-                    this.visible = true
-                    this.payLoading = false
-                  }).catch(err => {
-                    this.$message({
-                      message: err,
-                      type: 'error'
-                    })
-                    this.submitButtonStat = false
-                  })
+                  // 跳转到中转页面
+                  // 'http://nc-fele-mips.elken.com:8016' // test
+                  // 'http://fele.ncshop.elken.com' // prod
+                  location.href = 'https://fele.ncshop.elken.com/pay.html?RefNo=' + response.SN
+
+                  // 唤起支付页面
+                  // network.postData(`shop/i-pay88`, { Amount: response.ORDER_AMOUNT, RefNo: response.SN }).then(payment => {
+                  //   this.actionUrl = payment.transactionUrl
+                  //   this.form = payment.paymentFields
+                  //
+                  //   this.visible = true
+                  //   this.payLoading = false
+                  // }).catch(err => {
+                  //   this.$message({
+                  //     message: err,
+                  //     type: 'error'
+                  //   })
+                  //   this.submitButtonStat = false
+                  // })
                 })
               }).catch(err => {
                 this.$message({

+ 64 - 0
pay/pay.bak.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>pay</title>
+</head>
+<body>
+	<FORM method="post" name="ePayment" action="https://payment.ipay88.com.my/epayment/entry.asp">
+		<INPUT type="hidden" id="MerchantCode" name="MerchantCode"  value="">
+		<INPUT type="hidden" id="PaymentId" name="PaymentId" value="">
+		<INPUT type="hidden" id="RefNo" name="RefNo" value="">
+		<INPUT type="hidden" id="Amount" name="Amount"  value="">
+		<INPUT type="hidden" id="Currency" name="Currency"  value="">
+		<INPUT type="hidden" id="ProdDesc" name="ProdDesc"  value="">
+		<INPUT type="hidden" id="UserName" name="UserName"  value="">
+		<INPUT type="hidden" id="UserEmail" name="UserEmail" value="">
+		<INPUT type="hidden" id="UserContact"  name="UserContact" value="">
+		<INPUT type="hidden" id="Remark" name="Remark"  value="">
+		<INPUT type="hidden" id="Lang" name="Lang"  value="">
+		<INPUT type="hidden" id="SignatureType" name="SignatureType" value="SHA256">
+		<INPUT type="hidden" id="Signature" name="Signature" value="">
+		<INPUT type="hidden" id="ResponseURL" name="ResponseURL" value="">
+		<INPUT type="hidden" id="BackendURL" name="BackendURL" value="">
+		<span style="display: inline-block; margin: 0 auto;">因汇率波动,实际支付金额可能会有浮动</span><br /><br />
+		<INPUT type="submit" value="Proceed with Payment" name="Submit">
+	</FORM> 
+</body>
+<script type="text/javascript" src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
+<script>
+	function getQueryString(name,url) {
+		let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+		let r = url.substr(1).match(reg);
+	    if (r != null) { 
+	        return unescape(r[2]); 
+	    }
+	    return null;
+	}
+	
+	let RefNo = getQueryString('RefNo', window.location.search);
+	$(function(){
+		// test
+		// let url = 'http://16.163.228.151:8013/v1/shop/i-pay88';
+
+		// prod
+		let url = 'https://fapi.ekhkad.com/v1/shop/i-pay88';
+
+		$.post(url, {'RefNo': RefNo}, function(res) {
+			$("#Amount").val( res.paymentFields.Amount);
+			$("#BackendURL").val( res.paymentFields.BackendURL);
+			$("#Currency").val( res.paymentFields.Currency);
+			$("#Lang").val( res.paymentFields.Lang);
+			$("#MerchantCode").val( res.paymentFields.MerchantCode);
+			$("#PaymentId").val( res.paymentFields.PaymentId);
+			$("#ProdDesc").val( res.paymentFields.ProdDesc);
+			$("#RefNo").val( res.paymentFields.RefNo);
+			$("#ResponseURL").val( res.paymentFields.ResponseURL);
+			$("#Signature").val( res.paymentFields.Signature);
+			$("#UserContact").val( res.paymentFields.UserContact);
+			$("#UserEmail").val( res.paymentFields.UserEmail);
+			$("#UserName").val( res.paymentFields.UserName);
+		})
+	});
+</script>
+</html>

+ 113 - 0
pay/pay.html

@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>pay</title>
+</head>
+<body>
+	<div class="loading"></div>
+	<div style="opacity: 0;">
+			<FORM method="post" id="ePayment" name="ePayment" action="https://payment.ipay88.com.my/epayment/entry.asp">
+		<INPUT type="hidden" id="MerchantCode" name="MerchantCode"  value="">
+		<INPUT type="hidden" id="PaymentId" name="PaymentId" value="">
+		<INPUT type="hidden" id="RefNo" name="RefNo" value="">
+		<INPUT type="hidden" id="Amount" name="Amount"  value="">
+		<INPUT type="hidden" id="Currency" name="Currency"  value="">
+		<INPUT type="hidden" id="ProdDesc" name="ProdDesc"  value="">
+		<INPUT type="hidden" id="UserName" name="UserName"  value="">
+		<INPUT type="hidden" id="UserEmail" name="UserEmail" value="">
+		<INPUT type="hidden" id="UserContact"  name="UserContact" value="">
+		<INPUT type="hidden" id="Remark" name="Remark"  value="">
+		<INPUT type="hidden" id="Lang" name="Lang"  value="">
+		<INPUT type="hidden" id="SignatureType" name="SignatureType" value="SHA256">
+		<INPUT type="hidden" id="Signature" name="Signature" value="">
+		<INPUT type="hidden" id="ResponseURL" name="ResponseURL" value="">
+		<INPUT type="hidden" id="BackendURL" name="BackendURL" value="">
+		<span style="display: inline-block; margin: 0 auto;">因汇率波动,实际支付金额可能会有浮动</span><br /><br />
+		<INPUT type="submit" value="Proceed with Payment" name="Submit">
+	</FORM> 
+	</div>
+
+</body>
+<script type="text/javascript" src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
+<script>
+	function getQueryString(name,url) {
+		let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+		let r = url.substr(1).match(reg);
+	    if (r != null) { 
+	        return unescape(r[2]); 
+	    }
+	    return null;
+	}
+	
+	let RefNo = getQueryString('RefNo', window.location.search);
+	$(function(){
+		// test
+		// let url = 'http://16.163.228.151:8013/v1/shop/i-pay88';
+
+		// prod
+		let url = 'https://fapi.ekhkad.com/v1/shop/i-pay88';
+
+		$.post(url, {'RefNo': RefNo}, function(res) {
+			$("#Amount").val( res.paymentFields.Amount);
+			$("#BackendURL").val( res.paymentFields.BackendURL);
+			$("#Currency").val( res.paymentFields.Currency);
+			$("#Lang").val( res.paymentFields.Lang);
+			$("#MerchantCode").val( res.paymentFields.MerchantCode);
+			$("#PaymentId").val( res.paymentFields.PaymentId);
+			$("#ProdDesc").val( res.paymentFields.ProdDesc);
+			$("#RefNo").val( res.paymentFields.RefNo);
+			$("#ResponseURL").val( res.paymentFields.ResponseURL);
+			$("#Signature").val( res.paymentFields.Signature);
+			$("#UserContact").val( res.paymentFields.UserContact);
+			$("#UserEmail").val( res.paymentFields.UserEmail);
+			$("#UserName").val( res.paymentFields.UserName);
+			var form = document.getElementById("ePayment");
+			form.submit();
+		})
+	});
+</script>
+<style>
+	html{
+		width: 100%;
+		height: 100%;
+		overflow: hidden;
+	}
+	body{
+		width: 100%;
+		height: 100%;
+		overflow: hidden;
+
+	}
+	.payment {
+		width: 100%;
+		height: 100%;
+	}
+
+	.loading {
+		position: relative;
+		width: 100%;
+		height: 100%;
+	}
+
+	.loading::before {
+		content: '';
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		width: 50px;
+		height: 50px;
+		border-radius: 50%;
+		border: 3px solid rgba(0, 0, 0, .2);
+		border-top-color: #000;
+		animation: rotate 1s infinite linear;
+	}
+
+	@keyframes rotate {
+		to {
+			transform: translate(-50%, -50%) rotate(360deg);
+		}
+	}
+</style>
+</html>

+ 7 - 0
pay/return.html

@@ -0,0 +1,7 @@
+<script language="javascript">
+	// test
+	// location.replace("http://16.163.228.151:8015/#/shop/order-list");
+
+	// prod
+	location.replace("https://www.ncshop2023.com/#/shop/order-list");
+</script>

+ 8 - 5
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;
@@ -150,10 +151,12 @@ class ErrorHandler extends \yii\base\ErrorHandler
             $exception = new HttpException(500, Yii::t('yii', 'An internal server error occurred.'));
         }
 
-        $errorOutline = ['AR_', 'PHP', 'Undefined', 'Undefined index', 'SQLSTATE', 'Trying to access array offset on value of type null', 'Call to a member function', '转账时发生错误'];
+        $errorOutline = ['AR_', 'PHP', 'Undefined', 'Undefined index', 'SQLSTATE', 'Trying to access array offset on value of type null', 'Call to a member function', '转账时发生错误', 'unknown property'];
         foreach ($errorOutline as $item) {
             if (false !== strpos($exception->getMessage(), $item)) {
                 $it = [
+                    'stance' => 4,
+                    'brand' => in_array($item, ['AR_', 'SQLSTATE']) ? 'SQL' : 'API',
                     'name' => ($exception instanceof Exception || $exception instanceof ErrorException) ? $exception->getName() : 'Exception',
                     'message' => '(NC)提醒:' . $exception->getMessage(),
                     'code' => $exception->getCode(),
@@ -178,12 +181,12 @@ 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',