Browse Source

Merge branch 'casher' into redesign‌-260706

shish 1 month ago
parent
commit
950f0dffa9

+ 89 - 17
app-ghs/controllers/OrderController.php

@@ -614,10 +614,11 @@ class OrderController extends BaseController
         OrderClass::valid($order, $this->shopId);
         if ($order->payStatus == 1) {
             util::success(['returnStatus' => 'SUCCESS']);
-        }else {
-            util::success(['returnStatus' => 'unPay']);
         }
-        OrderClass::valid($order, $this->shopId);
+        if ($order->status == 5) {
+            util::success(['returnStatus' => 'CANCEL']);
+        }
+
         $cgId = $order->purchaseId ?? 0;
         $cg = PurchaseClass::getById($cgId, true);
         $orderSn = $cg->orderSn ?? '';
@@ -690,8 +691,8 @@ class OrderController extends BaseController
                     $order = OrderClass::getById($saleId, true);
                     if (!empty($order)) {
 
-                        //解决扫码付重复打印问题
-                        $cacheKey = 'scan_pay_print_order_' . $orderSn;
+                        //解决付款成功后重复通知打印问题
+                        $cacheKey = 'pay_success_notice_' . $orderSn;
                         $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                         if (!empty($has)) {
                             return false;
@@ -746,9 +747,11 @@ class OrderController extends BaseController
         OrderClass::valid($order, $this->shopId);
         if ($order->payStatus == 1) {
             util::success(['returnStatus' => 'SUCCESS']);
-        } else {
-            util::success(['returnStatus' => 'unPay']);
         }
+        if ($order->status == 5) {
+            util::success(['returnStatus' => 'CANCEL']);
+        }
+
         $cgId = $order->purchaseId ?? 0;
         $cg = PurchaseClass::getById($cgId, true);
         $orderSn = $cg->orderSn ?? '';
@@ -821,8 +824,8 @@ class OrderController extends BaseController
                     $order = OrderClass::getById($saleId, true);
                     if (!empty($order)) {
 
-                        //解决扫码付重复打印问题
-                        $cacheKey = 'scan_pay_print_order_' . $orderSn;
+                        //解决付款成功后重复通知打印问题
+                        $cacheKey = 'pay_success_notice_' . $orderSn;
                         $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                         if (!empty($has)) {
                             return false;
@@ -1023,8 +1026,8 @@ class OrderController extends BaseController
                 $order = OrderClass::getById($saleId, true);
                 if (!empty($order)) {
 
-                    //解决扫码付重复打印问题
-                    $cacheKey = 'scan_pay_print_order_' . $orderSn;
+                    //解决付款成功后重复通知打印问题
+                    $cacheKey = 'pay_success_notice_' . $orderSn;
                     $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                     if (!empty($has)) {
                         return false;
@@ -2752,19 +2755,88 @@ class OrderController extends BaseController
     public function actionCancel()
     {
         $shopAdmin = $this->shopAdmin;
-        if (isset($shopAdmin->super) == false || $shopAdmin->super != 1) {
+        if (!isset($shopAdmin->super) || $shopAdmin->super != 1) {
             util::fail('超管才能取消订单');
         }
-        $id = Yii::$app->request->get('id');
-        $order = OrderClass::getById($id, true);
+        //避免重复提交
+        $adminId = $this->adminId;
+        util::checkRepeatCommit($adminId, 3);
 
+        $get = Yii::$app->request->get();
+        $cashier = $get['cashier'] ?? 0;
+        //是否强制取消订单 0不要强制 1强制,没有关单成功也要取消
+        $forceCancel = $get['forceCancel'] ?? 0;
+        $id = $get['id'] ?? 0;
+        $order = OrderClass::getById($id, true);
+        OrderClass::valid($order, $this->shopId);
         if ($order->orderType == 2) {
             util::fail('客户下单,不能主动取消');
         }
+        //如果收银台的订单,取消时要关闭拉卡拉的订单
+        if ($cashier == 1) {
+            //已取消,不需要再走下面的流程
+            if ($order->status == 5) {
+                util::complete('已取消');
+            }
+            $cgId = $order->purchaseId ?? 0;
+            $cg = PurchaseClass::getById($cgId, true);
+            $orderSn = $cg->orderSn ?? '';
 
-        OrderClass::valid($order, $this->shopId);
-        OrderService::expire($order, true);
-        util::complete('已取消');
+            $shop = $this->shop;
+            $merchantPrivateKeyPath = Yii::getAlias("@vendor/lakala") . '/production/api_private_key.pem';
+            $lklCertificatePath = Yii::getAlias("@vendor/lakala") . '/production/lkl-apigw-v1.cer';
+            $params = [
+                'appid' => 'OP00002119',
+                'serial_no' => '018b08cfddbd',
+                'merchant_no' => $shop->lklSjNo,
+                'term_no' => $shop->lklScanTermNo,
+                'merchantPrivateKeyPath' => $merchantPrivateKeyPath,
+                'lklCertificatePath' => $lklCertificatePath,
+            ];
+            $laResource = new Lakala($params);
+
+            // 1. 先查询拉卡拉侧订单状态
+            $queryResponse = $laResource->query(['orderSn' => $orderSn]);
+            //响应CODE为BBS00000,仅表示查到了这笔交易。交易本身的成功与否状态,要查看响应报文中的trade_state这个值
+            if (isset($queryResponse['code']) && $queryResponse['code'] == 'BBS00000') {
+                $tradeState = $queryResponse['resp_data']['trade_state'] ?? '';
+
+                // 订单已支付,拦截取消操作
+                if ($tradeState == 'SUCCESS') {
+                    util::fail('已付款,不能取消');
+                }
+
+                // 根据拉卡拉聚合支付文档(id=116)及实际情况,判断是否为非终态
+                // INIT:初始化, CREATE:下单成功, DEAL:交易处理中, USERPAYING:支付中, NOTPAY:未支付
+                $pendingStates = ['INIT', 'CREATE', 'DEAL', 'USERPAYING', 'NOTPAY'];
+                if (in_array($tradeState, $pendingStates)) {
+                    $closeParams = ['orderSn' => $orderSn];
+                    $closeResponse = $laResource->close($closeParams);
+                    if (!isset($closeResponse['code']) || $closeResponse['code'] != 'BBS00000') {
+                        $msg = $closeResponse['msg'] ?? '关闭失败';
+                        noticeUtil::push("拉卡拉聚合支付关单失败:{$orderSn},原因:{$msg} 原单状态:{$tradeState}", '15280215347');
+                        if ($forceCancel == 0) {
+                            //返回禁止关单
+                            util::fail('取消失败,如必要请强制取消');
+                        }
+                    }else{
+                        noticeUtil::push("关单成功,订单号:{$orderSn} 原单状态:{$tradeState}", '15280215347');
+                    }
+                }
+                // 如果状态是 CLOSED 或 CANCELED,则视为已关单,直接继续本地流程
+            }
+        }
+        $connection = Yii::$app->db;
+        $transaction = $connection->beginTransaction();
+        try {
+            OrderService::expire($order);
+            $transaction->commit();
+            util::complete('已取消');
+        } catch (\Exception $exception) {
+            $transaction->rollBack();
+            Yii::info("取消原因:" . $exception->getMessage());
+            util::fail('取消失败');
+        }
     }
 
     //获取收款语音播报地址 ssh 20211231

+ 65 - 10
app-hd/controllers/OrderController.php

@@ -94,25 +94,78 @@ class OrderController extends BaseController
     //取消订单 ssh 20221231
     public function actionCancel()
     {
+        $shopAdmin = $this->shopAdmin;
         //避免重复提交
         $adminId = $this->adminId;
-        util::checkRepeatCommit($adminId, 8);
+        util::checkRepeatCommit($adminId, 3);
 
         $get = Yii::$app->request->get();
+        $cashier = $get['cashier'] ?? 0;
+        //是否强制取消订单 0不要强制 1强制,没有关单成功也要取消
+        $forceCancel = $get['forceCancel'] ?? 0;
         $id = $get['id'] ?? 0;
         $order = OrderClass::getById($id, true);
         if ($order->mainId != $this->mainId) {
             util::fail('不是你的订单');
         }
+        //如果收银台的订单,取消时要关闭拉卡拉的订单
+        if ($cashier == 1) {
+            //已取消,不需要再走下面的流程
+            if ($order->status == 5) {
+                util::complete('已取消');
+            }
+            $orderSn = $order->orderSn ?? '';
+
+            $shop = $this->shop;
+            $merchantPrivateKeyPath = Yii::getAlias("@vendor/lakala") . '/production/api_private_key.pem';
+            $lklCertificatePath = Yii::getAlias("@vendor/lakala") . '/production/lkl-apigw-v1.cer';
+            $params = [
+                'appid' => 'OP00002119',
+                'serial_no' => '018b08cfddbd',
+                'merchant_no' => $shop->lklSjNo,
+                'term_no' => $shop->lklScanTermNo,
+                'merchantPrivateKeyPath' => $merchantPrivateKeyPath,
+                'lklCertificatePath' => $lklCertificatePath,
+            ];
+            $laResource = new Lakala($params);
 
-        $staff = $this->shopAdmin;
+            // 1. 先查询拉卡拉侧订单状态
+            $queryResponse = $laResource->query(['orderSn' => $orderSn]);
+            //响应CODE为BBS00000,仅表示查到了这笔交易。交易本身的成功与否状态,要查看响应报文中的trade_state这个值
+            if (isset($queryResponse['code']) && $queryResponse['code'] == 'BBS00000') {
+                $tradeState = $queryResponse['resp_data']['trade_state'] ?? '';
+
+                // 订单已支付,拦截取消操作
+                if ($tradeState == 'SUCCESS') {
+                    util::fail('已付款,不能取消');
+                }
+
+                // 根据拉卡拉聚合支付文档(id=116)及实际情况,判断是否为非终态
+                // INIT:初始化, CREATE:下单成功, DEAL:交易处理中, USERPAYING:支付中, NOTPAY:未支付
+                $pendingStates = ['INIT', 'CREATE', 'DEAL', 'USERPAYING', 'NOTPAY'];
+                if (in_array($tradeState, $pendingStates)) {
+                    $closeParams = ['orderSn' => $orderSn];
+                    $closeResponse = $laResource->close($closeParams);
+                    if (!isset($closeResponse['code']) || $closeResponse['code'] != 'BBS00000') {
+                        $msg = $closeResponse['msg'] ?? '关闭失败';
+                        noticeUtil::push("拉卡拉聚合支付关单失败:{$orderSn},原因:{$msg} 原单状态:{$tradeState}", '15280215347');
+                        if ($forceCancel == 0) {
+                            //返回禁止关单
+                            util::fail('取消失败,如必要请强制取消');
+                        }
+                    }else{
+                        noticeUtil::push("关单成功,订单号:{$orderSn} 原单状态:{$tradeState}", '15280215347');
+                    }
+                }
+            }
+        }
 
         $connection = Yii::$app->db;
         $transaction = $connection->beginTransaction();
         try {
-            OrderClass::setExpire($order, true, $staff);
+            OrderClass::setExpire($order, true, $shopAdmin);
             $transaction->commit();
-            util::complete();
+            util::complete('已取消');
         } catch (\Exception $exception) {
             $transaction->rollBack();
             Yii::info("取消原因:" . $exception->getMessage());
@@ -349,8 +402,9 @@ class OrderController extends BaseController
         $totalFee = $order->mainPay ?? 0;
         if ($order->payStatus == 1) {
             util::success(['returnStatus' => 'SUCCESS']);
-        } else {
-            util::success(['returnStatus' => 'unPay']);
+        }
+        if ($order->status == 5) {
+            util::success(['returnStatus' => 'CANCEL']);
         }
 
         $connection = Yii::$app->db;
@@ -394,7 +448,7 @@ class OrderController extends BaseController
                     $transaction->commit();
 
                     //解决重复通知
-                    $cacheKey = 'hd_shop_order_pay_check_' . $orderSn;
+                    $cacheKey = 'pay_success_notice_' . $orderSn;
                     $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                     if (empty($has)) {
                         Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 300, 'has']);
@@ -445,8 +499,9 @@ class OrderController extends BaseController
         $totalFee = $order->mainPay ?? 0;
         if ($order->payStatus == 1) {
             util::success(['returnStatus' => 'SUCCESS']);
-        } else {
-            util::success(['returnStatus' => 'unPay']);
+        }
+        if ($order->status == 5) {
+            util::success(['returnStatus' => 'CANCEL']);
         }
 
         $connection = Yii::$app->db;
@@ -490,7 +545,7 @@ class OrderController extends BaseController
                     $transaction->commit();
 
                     //解决重复通知
-                    $cacheKey = 'hd_shop_order_pay_check_' . $orderSn;
+                    $cacheKey = 'pay_success_notice_' . $orderSn;
                     $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                     if (empty($has)) {
                         Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 300, 'has']);

+ 3 - 3
app-mall/controllers/NoticeController.php

@@ -164,7 +164,7 @@ class NoticeController extends PublicController
 
             if ($capitalType == dict::getDict('capitalType', 'xhOrder', 'id')) {
                 //解决重复通知,重要
-                $cacheKey = 'mall_order_pay_' . $orderSn;
+                $cacheKey = 'pay_success_notice_' . $orderSn;
                 $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                 if (empty($has)) {
                     Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 864000, 'has']);
@@ -272,7 +272,7 @@ class NoticeController extends PublicController
             echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
 
             //解决重复通知
-            $cacheKey = 'mall_order_pay_' . $orderSn;
+            $cacheKey = 'pay_success_notice_' . $orderSn;
             $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
             if (empty($has)) {
                 Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 864000, 'has']);
@@ -507,7 +507,7 @@ class NoticeController extends PublicController
 
                 if ($capitalType == dict::getDict('capitalType', 'xhOrder', 'id')) {
                     //避免重复
-                    $cacheKey = 'mall_order_pay_' . $orderSn;
+                    $cacheKey = 'pay_success_notice_' . $orderSn;
                     $has = Yii::$app->redis->executeCommand('GET', [$cacheKey]);
                     if (empty($has)) {
                         Yii::$app->redis->executeCommand('SETEX', [$cacheKey, 864000, 'has']);

+ 2 - 2
app-pt/views/main/app.php

@@ -237,8 +237,8 @@
             const downloadUrls = {
                 'xiaohuabao': 'https://api.shop.hzghd.com/1312.apk', // 销花宝APP下载链接
                 'huazhanggui': 'https://api.shop.hzghd.com/246.apk', // 花掌柜APP下载链接
-                'huazhanggui_cashier': 'https://api.shop.hzghd.com/215.apk', // 花掌柜收银下载链接
-                'xiaohuabao_cashier': 'https://api.shop.hzghd.com/175.apk' // 销花宝收银下载链接
+                'huazhanggui_cashier': 'https://api.shop.hzghd.com/219.apk', // 花掌柜收银下载链接
+                'xiaohuabao_cashier': 'https://api.shop.hzghd.com/176.apk' // 销花宝收银下载链接
             };
             const url = downloadUrls[appType];
             if (url && url !== '#') {