Parcourir la source

Merge branch 'v5.0.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v5.0.0dev

evoxwht il y a 2 ans
Parent
commit
2020678ca3

+ 27 - 0
crmeb/app/jobs/MiniOrderJob.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\jobs;
+
+use crmeb\basic\BaseJobs;
+use crmeb\services\easywechat\orderShipping\MiniOrderService;
+use crmeb\traits\QueueTrait;
+use EasyWeChat\Core\Exceptions\HttpException;
+use think\Exception;
+
+class MiniOrderJob extends BaseJobs
+{
+    use QueueTrait;
+
+    /**
+     * @throws HttpException
+     */
+    public function doJob(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, string $path, int $delivery_mode = 1, bool $is_all_delivered = true)
+    {
+        try {
+            MiniOrderService::shippingByTradeNo($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $path, $delivery_mode, $is_all_delivered);
+        } catch (HttpException $e) {
+            // 订单异常处理
+            throw new HttpException($e);
+        }
+    }
+}

+ 82 - 47
crmeb/app/listener/order/OrderShippingListener.php

@@ -2,6 +2,7 @@
 
 namespace app\listener\order;
 
+use app\jobs\MiniOrderJob;
 use app\model\order\StoreOrder;
 use app\services\order\StoreOrderCartInfoServices;
 use app\services\order\StoreOrderServices;
@@ -15,61 +16,95 @@ class OrderShippingListener implements ListenerInterface
     public function handle($event): void
     {
         /** @var StoreOrder $order */
-        [$order, $delivery_type, $delivery_id, $delivery_name] = $event;
+        [$order_type, $order, $delivery_type, $delivery_id, $delivery_name] = $event;
         $order_shipping_open = sys_config('order_shipping_open', 0);  // 小程序发货信息管理服务开关
+        $secs = 0;
         if ($order && $order_shipping_open) {
-            if ($order['is_channel'] == 1 && $order['pay_type'] == 'weixin') {
-                $out_trade_no = $order['order_id'];
-                //判断订单是否拆单
-                $delivery_mode = 1;
-                $is_all_delivered = true;
-                if ($order['pid'] > 0) {
-                    $delivery_mode = 2;
-                    // 判断订单是否全部发货
-                    /** @var StoreOrderServices $orderServices */
-                    $orderServices = app()->make(StoreOrderServices::class);
-                    $is_all_delivered = $orderServices->checkSubOrderNotSend((int)$order['pid'], (int)$order['id']);
-                    $p_order = $orderServices->get((int)$order['pid']);
-                    if (!$p_order) {
-                        throw new AdminException('拆单异常');
-                    }
-                    $out_trade_no = $p_order['order_id'];
-                }
+            //判断订单是否拆单
+            $delivery_mode = 1;
+            $is_all_delivered = true;
+            if ($order_type == 'product') {  // 商品订单
+                if ($order['is_channel'] == 1 && $order['pay_type'] == 'weixin') {
+                    $out_trade_no = $order['order_id'];
+                    /** @var StoreOrderCartInfoServices $orderInfoServices */
+                    $orderInfoServices = app()->make(StoreOrderCartInfoServices::class);
+                    $item_desc = $orderInfoServices->getCarIdByProductTitle((int)$order['id'], true);
 
-                // 整理商品信息
-                /** @var StoreOrderCartInfoServices $orderInfoServices */
-                $orderInfoServices = app()->make(StoreOrderCartInfoServices::class);
-                $item_desc = $orderInfoServices->getCarIdByProductTitle((int)$order['id'], true);
-                $shipping_list = [
-                    ['item_desc' => $item_desc]
-                ];
-                //判断订单物流模式
-                if ($order['shipping_type'] == 1) {
-                    if ($delivery_type == 1) {
-                        $shipping_list = [
-                            [
-                                'tracking_no' => $delivery_id ?? '',
-                                'express_company' => $delivery_name ?? '',
-                                'item_desc' => $item_desc,
-                                'contact' => [
-                                    'receiver_contact' => $order['user_phone']
-                                ]
-                            ]
-                        ];
+                    if ($order['pid'] > 0) {
+                        $delivery_mode = 2;
+                        // 判断订单是否全部发货
+                        /** @var StoreOrderServices $orderServices */
+                        $orderServices = app()->make(StoreOrderServices::class);
+                        $is_all_delivered = $orderServices->checkSubOrderNotSend((int)$order['pid'], (int)$order['id']);
+                        $p_order = $orderServices->get((int)$order['pid']);
+                        if (!$p_order) {
+                            throw new AdminException('拆单异常');
+                        }
+                        $out_trade_no = $p_order['order_id'];
                     }
-                    $logistics_type = $delivery_type;
+                    $pay_uid = $order['pay_uid'];
+                    $path = 'pages/goods/order_details/index?order_id=' . $out_trade_no;
                 } else {
-                    $logistics_type = 4;
+                    return;
                 }
-                //查找支付者openid
-                /** @var WechatUserServices $wechatUserService */
-                $wechatUserService = app()->make(WechatUserServices::class);
-                $payer_openid = $wechatUserService->uidToOpenid($order['pay_uid'], 'routine');
-                if (empty($payer_openid)) {
-                    throw new AdminException('订单支付人异常');
+            } else if ($order_type == 'recharge') {  // 充值订单
+                if ($order['recharge_type'] == 'weixin') {
+                    $delivery_type = 3;
+                    $item_desc = '用户充值' . $order['price'];
+                    $out_trade_no = $order['order_id'];
+                    $pay_uid = $order['uid'];
+                    $secs = 10;
+                    $path = '/pages/users/user_bill/index?type=2';
+                } else {
+                    return;
+                }
+            } else if ($order_type == 'member') {  // 会员订单
+                if ($order['pay_type'] == 'weixin') {
+                    $delivery_type = 3;
+                    $item_desc = '用户购买' . $order['member_type'] . '会员卡';
+                    $out_trade_no = $order['order_id'];
+                    $pay_uid = $order['uid'];
+                    $secs = 10;
+                    $path = '/pages/annex/vip_paid/index';
+                } else {
+                    return;
                 }
-                MiniOrderService::shippingByTradeNo($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $delivery_mode, $is_all_delivered);
+            } else {
+                return;
+            }
+            // 整理商品信息
+            $shipping_list = [
+                ['item_desc' => $item_desc]
+            ];
+            //判断订单物流模式
+            if (!isset($order['shipping_type']) || $order['shipping_type'] == 1) {
+                if ($delivery_type == 1) {
+                    $shipping_list = [
+                        [
+                            'tracking_no' => $delivery_id ?? '',
+                            'express_company' => $delivery_name ?? '',
+                            'item_desc' => $item_desc,
+                            'contact' => [
+                                'receiver_contact' => $order['user_phone']
+                            ]
+                        ]
+                    ];
+                }
+                $logistics_type = $delivery_type;
+            } else {
+                $logistics_type = 4;
+            }
+            //查找支付者openid
+            /** @var WechatUserServices $wechatUserService */
+            $wechatUserService = app()->make(WechatUserServices::class);
+            $payer_openid = $wechatUserService->uidToOpenid($pay_uid, 'routine');
+            if (empty($payer_openid)) {
+                throw new AdminException('订单支付人异常');
+            }
+            if ($secs) {
+                sleep($secs);
             }
+            MiniOrderJob::dispatch('doJob', [$out_trade_no, $logistics_type, $shipping_list, $payer_openid, $path, $delivery_mode, $is_all_delivered]);
         }
     }
 }

+ 3 - 0
crmeb/app/services/order/OtherOrderServices.php

@@ -346,6 +346,9 @@ class OtherOrderServices extends BaseServices
             if ($spread_two && $spread_two_price > 0) $this->memberBrokerage($spread_two, $spread_two_price, 'get_two_member_brokerage', $orderInfo);
         }
 
+        $orderInfo['pay_type'] = $paytype;
+        // 小程序订单服务
+        event('OrderShipping', ['member', $orderInfo, 3, '', '']);
         return false !== $res;
     }
 

+ 2 - 1
crmeb/app/services/order/StoreOrderDeliveryServices.php

@@ -463,7 +463,8 @@ class StoreOrderDeliveryServices extends BaseServices
         if (!$data['delivery_id']) {
             $data['delivery_id'] = uniqid();
         }
-        event('OrderShipping', [$orderInfo, $type, $data['delivery_id'], $data['delivery_name']]);
+        // 小程序订单管理
+        event('OrderShipping', ['product', $orderInfo, $type, $data['delivery_id'], $data['delivery_name']]);
         //到期自动收货
         event('OrderDeliveryListener', [$orderInfo, $storeName, $data, $type]);
         return $res;

+ 5 - 0
crmeb/app/services/order/StoreOrderSuccessServices.php

@@ -100,6 +100,11 @@ class StoreOrderSuccessServices extends BaseServices
         event('NoticeListener', [$orderInfo, 'admin_pay_success_code']);
         // 推送订单
         event('OutPushListener', ['order_pay_push', ['order_id' => (int)$orderInfo['id']]]);
+
+        // 小程序订单管理 (自提商品)
+        if ($orderInfo['shipping_type'] == 2) {
+            event('OrderShipping', ['product', $orderInfo, 4, '', '']);
+        }
         $res = $res1 && $resPink;
         return false !== $res;
     }

+ 1 - 1
crmeb/app/services/order/StoreOrderTakeServices.php

@@ -58,7 +58,7 @@ class StoreOrderTakeServices extends BaseServices
         //查找订单信息
         $order = $this->dao->getOne(['order_id' => $merchant_trade_no]);
         if (!$order) {
-            throw new ApiException(410173);
+            return true;
         }
         if ($order['pid'] == -1) {  // 有子订单
             // 查找待收货的子订单

+ 4 - 0
crmeb/app/services/user/UserRechargeServices.php

@@ -492,6 +492,10 @@ class UserRechargeServices extends BaseServices
 
         //提醒推送
         event('NoticeListener', [['order' => $order, 'now_money' => $now_money], 'recharge_success']);
+
+        $order['pay_type'] = $other['pay_type'];
+        // 小程序订单服务
+        event('OrderShipping', ['recharge', $order, 3, '', '']);
         return true;
     }
 

+ 2 - 1
crmeb/crmeb/services/app/MiniProgramService.php

@@ -13,6 +13,7 @@ namespace crmeb\services\app;
 
 use app\services\order\StoreOrderTakeServices;
 use crmeb\exceptions\AdminException;
+use crmeb\services\easywechat\orderShipping\MiniOrderService;
 use crmeb\services\SystemConfigService;
 use app\services\pay\PayNotifyServices;
 use crmeb\services\easywechat\Application;
@@ -887,7 +888,7 @@ class MiniProgramService
                             break;
                         case 'trade_manage_order_settlement':     // 订单完成发货时  订单结算时
                             if (isset($message['estimated_settlement_time'])) { //订单完成发货时
-
+                                MiniOrderService::notifyConfirmByTradeNo($message['merchant_trade_no'], time());
                             }
                             if (isset($message['confirm_receive_method'])) {  // 订单结算时
                                 /** @var StoreOrderTakeServices $StoreOrderTakeServices */

+ 2 - 2
crmeb/crmeb/services/easywechat/orderShipping/MiniOrderService.php

@@ -69,9 +69,9 @@ class MiniOrderService
      * @date 2023/05/09
      * @author yyw
      */
-    public static function shippingByTradeNo(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, int $delivery_mode = 1, bool $is_all_delivered = true)
+    public static function shippingByTradeNo(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, string $path, int $delivery_mode = 1, bool $is_all_delivered = true)
     {
-        return self::order()->shippingByTradeNo($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $delivery_mode, $is_all_delivered);
+        return self::order()->shippingByTradeNo($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $path, $delivery_mode, $is_all_delivered);
     }
 
     /**

+ 2 - 3
crmeb/crmeb/services/easywechat/orderShipping/OrderClient.php

@@ -70,7 +70,7 @@ class OrderClient extends BaseOrder
      * @date 2023/05/10
      * @author yyw
      */
-    public function shippingByTradeNo(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, int $delivery_mode = 1, bool $is_all_delivered = true)
+    public function shippingByTradeNo(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, $path, int $delivery_mode = 1, bool $is_all_delivered = true)
     {
         if (!$this->checkManaged()) {
             throw new AdminException('开通小程序订单管理服务后重试');
@@ -101,9 +101,8 @@ class OrderClient extends BaseOrder
                 'contact' => $contact
             ];
         }
-
         // 跳转路径
-        $this->setMesJumpPath(self::PATH . '?order_id=' . $out_trade_no);
+        $this->setMesJumpPath($path);
         return $this->shipping($params);
     }