fix: 修改小程序订单为队列,添加 充值 会员 自提订单处理

This commit is contained in:
Gosowong 2023-05-19 14:10:32 +08:00
parent 9647d96978
commit 51ef4da7de
7 changed files with 114 additions and 50 deletions

View File

@ -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($shippingOrder)
{
try {
MiniOrderService::shippingByTradeNo($shippingOrder['out_trade_no'], $shippingOrder['logistics_type'], $shippingOrder['shipping_list'], $shippingOrder['payer_openid'], $shippingOrder['delivery_mode'] ?? 1, $shippingOrder['is_all_delivered'] ?? true);
} catch (HttpException $e) {
// 订单异常处理
throw new HttpException($e);
}
}
}

View File

@ -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,86 @@ 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); // 小程序发货信息管理服务开关
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'];
} 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'] == 'routine' && $order['paid'] == 1) {
$delivery_type = 3;
$item_desc = '用户充值' . $order['price'];
$out_trade_no = $order['order_id'];
$pay_uid = $order['uid'];
} else {
return;
}
MiniOrderService::shippingByTradeNo($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $delivery_mode, $is_all_delivered);
} 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'];
} else {
return;
}
} else {
return;
}
// 整理商品信息
$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']
]
]
];
}
$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('订单支付人异常');
}
MiniOrderJob::dispatch(compact($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $delivery_mode, $is_all_delivered));
}
}
}

View File

@ -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;

View File

@ -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) { // 有子订单
// 查找待收货的子订单

View File

@ -39,6 +39,11 @@ class PayNotifyServices
$orderInfo = $services->getOne(['order_id' => $order_id]);
if (!$orderInfo) return true;
if ($orderInfo->paid) return true;
// 小程序订单管理 (自提商品)
if ($orderInfo['shipping_type'] == 2) {
event('OrderShipping', ['product', $orderInfo]);
}
return $services->paySuccess($orderInfo->toArray(), $payType, ['trade_no' => $trade_no]);
} catch (\Exception $e) {
return false;
@ -75,6 +80,8 @@ class PayNotifyServices
$orderInfo = $services->getOne(['order_id' => $order_id]);
if (!$orderInfo) return true;
if ($orderInfo->paid) return true;
// 小程序订单服务
event('OrderShipping', ['member', $orderInfo]);
return $services->paySuccess($orderInfo->toArray(), $payType, ['trade_no' => $trade_no]);
} catch (\Exception $e) {
return false;

View File

@ -490,6 +490,8 @@ class UserRechargeServices extends BaseServices
$order['phone'] = $user['phone'];
$capitalFlowServices->setFlow($order, 'recharge');
// 小程序订单服务
event('OrderShipping', ['recharge', $order]);
//提醒推送
event('NoticeListener', [['order' => $order, 'now_money' => $now_money], 'recharge_success']);
return true;

View File

@ -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 */