MiniOrderShippingListen.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. namespace crmeb\listens;
  3. use app\common\repositories\store\order\StoreGroupOrderRepository;
  4. use app\common\repositories\store\order\StoreOrderRepository;
  5. use app\common\repositories\user\UserRepository;
  6. use app\common\repositories\wechat\WechatUserRepository;
  7. use crmeb\interfaces\ListenerInterface;
  8. use crmeb\jobs\MiniOrderShippingJob;
  9. use crmeb\services\MiniProgramService;
  10. use think\exception\ValidateException;
  11. use think\facade\Log;
  12. use think\facade\Queue;
  13. /**
  14. * 小程序发货信息管理事件
  15. * Class MiniOrderShippingListen
  16. * @author yyw @date 2023/10/19
  17. */
  18. class MiniOrderShippingListen implements ListenerInterface
  19. {
  20. public function handle($event): void
  21. {
  22. [$order_type, $order, $delivery_type, $delivery_id, $delivery_name] = $event;
  23. $order_shipping_open = systemConfig('order_shipping_open', 0); // 小程序发货信息管理服务开关
  24. if (empty($order) || !$order_shipping_open) {
  25. return;
  26. }
  27. try {
  28. $this->pushDeliveryMiniOrder($order_type, $order, $delivery_type, $delivery_id, $delivery_name);
  29. } catch (\Exception $exception) {
  30. Log::error([
  31. 'title' => '小程序发发货管理异常',
  32. 'message' => $exception->getMessage(),
  33. 'file' => $exception->getFile(),
  34. 'line' => $exception->getLine()
  35. ]);
  36. }
  37. }
  38. public function pushDeliveryMiniOrder($order_type, $order, $delivery_type = 1, $delivery_id = '', $delivery_name = '')
  39. {
  40. $secs = 0;
  41. //判断订单是否拆单
  42. $delivery_mode = 1;
  43. $is_all_delivered = true;
  44. switch ($order_type) {
  45. case 'product':
  46. $order_id = (int)$order['order_id'];
  47. if ($order['pay_type'] != 2 && $order['pay_price'] <= 0) {
  48. return false;
  49. }
  50. $item_desc = '订单支付';
  51. $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class);
  52. // 产找group 订单
  53. $group_order_info = $storeGroupOrderRepository->get($order['group_order_id']);
  54. if (empty($group_order_info)) {
  55. throw new ValidateException('用户订单异常');
  56. }
  57. $order_sn = $group_order_info['group_order_sn'];
  58. // 判断是不是拆单发货
  59. /** @var StoreOrderRepository $orderServices */
  60. $orderServices = app()->make(StoreOrderRepository::class);
  61. $order_son_count = $orderServices->query(['group_order_id' => $order['group_order_id'], 'status' => 0])->count();
  62. if ($order_son_count > 1) {
  63. $delivery_mode = 2;
  64. $is_all_delivered = $orderServices->checkSubOrderNotSend((int)$order['group_order_id'], $order_id);
  65. }
  66. $order_key = [
  67. 'out_trade_no' => $order_sn
  68. ];
  69. if ($order['order_type'] == 1) {
  70. $secs = 60;
  71. }
  72. if ($order['activity_type'] == 20) { // 积分商品
  73. $path = '/pages/points_mall/integral_order_details?order_id=' . $order_id;
  74. } else {
  75. $path = '/pages/order_details/index?order_id=' . $order_id;
  76. }
  77. break;
  78. case 'recharge':
  79. if ($order['recharge_type'] != 'routine' && $order['price'] <= 0) { // 不是小程序订单终止
  80. return false;
  81. }
  82. $order_id = $order['order_id'];
  83. $delivery_type = 3;
  84. $item_desc = '用户充值' . $order['price'];
  85. $order_key = [
  86. 'out_trade_no' => $order_id
  87. ];
  88. $secs = 60;
  89. $path = '/pages/users/user_bill/index';
  90. break;
  91. case 'member':
  92. if ($order['pay_type'] != 'routine' && $order['pay_price'] <= 0) {
  93. return false;
  94. }
  95. $order_id = $order['order_sn'];
  96. $delivery_type = 3;
  97. $item_desc = '用户购买' . $order['member_type'] . '会员卡';
  98. $order_key = [
  99. 'out_trade_no' => $order_id
  100. ];
  101. $secs = 60;
  102. $path = '/pages/annex/vip_center/index';
  103. break;
  104. default:
  105. throw new ValidateException('订单类型异常');
  106. }
  107. // 整理商品信息
  108. $logistics_type = $this->getLogisticsType($delivery_type);
  109. $shipping_list = $this->getShippingList($logistics_type, $item_desc, $order['user_phone'] ?? '', $delivery_id, $delivery_name);
  110. //查找支付者openid
  111. $payer_openid = $this->getPayerOpenid($order['uid']);
  112. $queue_param = compact('order_key', 'logistics_type', 'shipping_list', 'payer_openid', 'path', 'delivery_mode', 'is_all_delivered');
  113. // MiniProgramService::create()->uploadShippingInfo($order_key, $logistics_type, $shipping_list, $payer_openid, $path, $delivery_mode, $is_all_delivered);
  114. if ($secs) {
  115. Queue::later($secs, MiniOrderShippingJob::class, $queue_param);
  116. } else {
  117. Queue::push(MiniOrderShippingJob::class, $queue_param);
  118. }
  119. }
  120. /**
  121. * 转换发货类型
  122. * @param string $delivery_type
  123. * @return int
  124. *
  125. * @date 2023/10/18
  126. * @author yyw
  127. */
  128. public function getLogisticsType(string $delivery_type)
  129. {
  130. switch ($delivery_type) {
  131. case '1': // 发货
  132. case '4': //电子面单
  133. $logistics_type = 1;
  134. break;
  135. case '5': // 同城
  136. case '2': // 送货
  137. $logistics_type = 2;
  138. break;
  139. case '3': // 虚拟
  140. case '6': // 卡密
  141. $logistics_type = 3;
  142. break;
  143. case '7': // 自提
  144. $logistics_type = 4;
  145. break;
  146. default:
  147. throw new ValidateException('发货类型异常');
  148. }
  149. return $logistics_type;
  150. }
  151. /**
  152. * 获取商品发货信息
  153. * @param string $logistics_type
  154. * @param string $receiver_contact
  155. * @param string $delivery_id
  156. * @param string $delivery_name
  157. * @return array|array[]
  158. *
  159. * @date 2023/10/18
  160. * @author yyw
  161. */
  162. public function getShippingList(string $logistics_type, string $item_desc, string $receiver_contact = '', string $delivery_id = '', string $delivery_name = '')
  163. {
  164. if ($logistics_type == 1) {
  165. return [
  166. [
  167. 'tracking_no' => $delivery_id ?? '',
  168. 'express_company' => $delivery_name ?? '',
  169. 'contact' => [
  170. 'receiver_contact' => $receiver_contact
  171. ],
  172. 'item_desc' => $item_desc
  173. ]
  174. ];
  175. } else {
  176. return [
  177. ['item_desc' => $item_desc]
  178. ];
  179. }
  180. }
  181. /**
  182. * 获取支付者openid
  183. * @param int $uid
  184. * @return mixed
  185. * @throws \think\db\exception\DataNotFoundException
  186. * @throws \think\db\exception\DbException
  187. * @throws \think\db\exception\ModelNotFoundException
  188. *
  189. * @date 2023/10/18
  190. * @author yyw
  191. */
  192. public function getPayerOpenid(int $uid)
  193. {
  194. $user = app()->make(UserRepository::class)->get($uid);
  195. if (empty($user)) {
  196. throw new ValidateException('用户异常');
  197. }
  198. $wechatUser = app()->make(WechatUserRepository::class)->get($user['wechat_user_id']);
  199. if (empty($wechatUser)) {
  200. throw new ValidateException('微信用户异常');
  201. }
  202. if (empty($wechatUser['routine_openid'])) {
  203. throw new ValidateException('订单支付者不是小程序');
  204. }
  205. return $wechatUser['routine_openid'];
  206. }
  207. }