| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- namespace crmeb\listens;
- use app\common\repositories\store\order\StoreGroupOrderRepository;
- use app\common\repositories\store\order\StoreOrderRepository;
- use app\common\repositories\user\UserRepository;
- use app\common\repositories\wechat\WechatUserRepository;
- use crmeb\interfaces\ListenerInterface;
- use crmeb\jobs\MiniOrderShippingJob;
- use crmeb\services\MiniProgramService;
- use think\exception\ValidateException;
- use think\facade\Log;
- use think\facade\Queue;
- /**
- * 小程序发货信息管理事件
- * Class MiniOrderShippingListen
- * @author yyw @date 2023/10/19
- */
- class MiniOrderShippingListen implements ListenerInterface
- {
- public function handle($event): void
- {
- [$order_type, $order, $delivery_type, $delivery_id, $delivery_name] = $event;
- $order_shipping_open = systemConfig('order_shipping_open', 0); // 小程序发货信息管理服务开关
- if (empty($order) || !$order_shipping_open) {
- return;
- }
- try {
- $this->pushDeliveryMiniOrder($order_type, $order, $delivery_type, $delivery_id, $delivery_name);
- } catch (\Exception $exception) {
- Log::error([
- 'title' => '小程序发发货管理异常',
- 'message' => $exception->getMessage(),
- 'file' => $exception->getFile(),
- 'line' => $exception->getLine()
- ]);
- }
- }
- public function pushDeliveryMiniOrder($order_type, $order, $delivery_type = 1, $delivery_id = '', $delivery_name = '')
- {
- $secs = 0;
- //判断订单是否拆单
- $delivery_mode = 1;
- $is_all_delivered = true;
- switch ($order_type) {
- case 'product':
- $order_id = (int)$order['order_id'];
- if ($order['pay_type'] != 2 && $order['pay_price'] <= 0) {
- return false;
- }
- $item_desc = '订单支付';
- $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class);
- // 产找group 订单
- $group_order_info = $storeGroupOrderRepository->get($order['group_order_id']);
- if (empty($group_order_info)) {
- throw new ValidateException('用户订单异常');
- }
- $order_sn = $group_order_info['group_order_sn'];
- // 判断是不是拆单发货
- /** @var StoreOrderRepository $orderServices */
- $orderServices = app()->make(StoreOrderRepository::class);
- $order_son_count = $orderServices->query(['group_order_id' => $order['group_order_id'], 'status' => 0])->count();
- if ($order_son_count > 1) {
- $delivery_mode = 2;
- $is_all_delivered = $orderServices->checkSubOrderNotSend((int)$order['group_order_id'], $order_id);
- }
- $order_key = [
- 'out_trade_no' => $order_sn
- ];
- if ($order['order_type'] == 1) {
- $secs = 60;
- }
- if ($order['activity_type'] == 20) { // 积分商品
- $path = '/pages/points_mall/integral_order_details?order_id=' . $order_id;
- } else {
- $path = '/pages/order_details/index?order_id=' . $order_id;
- }
- break;
- case 'recharge':
- if ($order['recharge_type'] != 'routine' && $order['price'] <= 0) { // 不是小程序订单终止
- return false;
- }
- $order_id = $order['order_id'];
- $delivery_type = 3;
- $item_desc = '用户充值' . $order['price'];
- $order_key = [
- 'out_trade_no' => $order_id
- ];
- $secs = 60;
- $path = '/pages/users/user_bill/index';
- break;
- case 'member':
- if ($order['pay_type'] != 'routine' && $order['pay_price'] <= 0) {
- return false;
- }
- $order_id = $order['order_sn'];
- $delivery_type = 3;
- $item_desc = '用户购买' . $order['member_type'] . '会员卡';
- $order_key = [
- 'out_trade_no' => $order_id
- ];
- $secs = 60;
- $path = '/pages/annex/vip_center/index';
- break;
- default:
- throw new ValidateException('订单类型异常');
- }
- // 整理商品信息
- $logistics_type = $this->getLogisticsType($delivery_type);
- $shipping_list = $this->getShippingList($logistics_type, $item_desc, $order['user_phone'] ?? '', $delivery_id, $delivery_name);
- //查找支付者openid
- $payer_openid = $this->getPayerOpenid($order['uid']);
- $queue_param = compact('order_key', 'logistics_type', 'shipping_list', 'payer_openid', 'path', 'delivery_mode', 'is_all_delivered');
- // MiniProgramService::create()->uploadShippingInfo($order_key, $logistics_type, $shipping_list, $payer_openid, $path, $delivery_mode, $is_all_delivered);
- if ($secs) {
- Queue::later($secs, MiniOrderShippingJob::class, $queue_param);
- } else {
- Queue::push(MiniOrderShippingJob::class, $queue_param);
- }
- }
- /**
- * 转换发货类型
- * @param string $delivery_type
- * @return int
- *
- * @date 2023/10/18
- * @author yyw
- */
- public function getLogisticsType(string $delivery_type)
- {
- switch ($delivery_type) {
- case '1': // 发货
- case '4': //电子面单
- $logistics_type = 1;
- break;
- case '5': // 同城
- case '2': // 送货
- $logistics_type = 2;
- break;
- case '3': // 虚拟
- case '6': // 卡密
- $logistics_type = 3;
- break;
- case '7': // 自提
- $logistics_type = 4;
- break;
- default:
- throw new ValidateException('发货类型异常');
- }
- return $logistics_type;
- }
- /**
- * 获取商品发货信息
- * @param string $logistics_type
- * @param string $receiver_contact
- * @param string $delivery_id
- * @param string $delivery_name
- * @return array|array[]
- *
- * @date 2023/10/18
- * @author yyw
- */
- public function getShippingList(string $logistics_type, string $item_desc, string $receiver_contact = '', string $delivery_id = '', string $delivery_name = '')
- {
- if ($logistics_type == 1) {
- return [
- [
- 'tracking_no' => $delivery_id ?? '',
- 'express_company' => $delivery_name ?? '',
- 'contact' => [
- 'receiver_contact' => $receiver_contact
- ],
- 'item_desc' => $item_desc
- ]
- ];
- } else {
- return [
- ['item_desc' => $item_desc]
- ];
- }
- }
- /**
- * 获取支付者openid
- * @param int $uid
- * @return mixed
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- *
- * @date 2023/10/18
- * @author yyw
- */
- public function getPayerOpenid(int $uid)
- {
- $user = app()->make(UserRepository::class)->get($uid);
- if (empty($user)) {
- throw new ValidateException('用户异常');
- }
- $wechatUser = app()->make(WechatUserRepository::class)->get($user['wechat_user_id']);
- if (empty($wechatUser)) {
- throw new ValidateException('微信用户异常');
- }
- if (empty($wechatUser['routine_openid'])) {
- throw new ValidateException('订单支付者不是小程序');
- }
- return $wechatUser['routine_openid'];
- }
- }
|