123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- <?php
- namespace addons\shopro\service\order\shippingInfo;
- use app\admin\model\shopro\order\OrderItem;
- use app\admin\model\shopro\order\Express as OrderExpress;
- use app\admin\model\shopro\order\Address as OrderAddress;
- class OrderShippingInfo extends Base
- {
- protected $orderItems = null;
-
- protected $dispatchTypes = [];
- /**
- * 获取整个订单的 shippingParams 参数
- *
- * @return array
- */
- public function getShippingParams()
- {
- $wechatPay = $this->getWechatPay();
- $this->setSendOrderItems();
- $uploadParams = [];
- if (in_array('express', $this->dispatchTypes)) {
- // 有 快递物流 商品
- $expressUploadParams = $this->getExpressShippingParams();
- $uploadParams = array_merge($uploadParams, $expressUploadParams);
- }
- if (!$uploadParams && array_intersect(['autosend', 'custom'], $this->dispatchTypes)) {
- // 有 自动发货,或者手动发货 商品
- $virtualParams = $this->getVirtualShippingParams();
- $uploadParams[] = $virtualParams;
- }
- if (!$uploadParams && in_array('selfetch', $this->dispatchTypes)) {
- // 有 到店自提 商品
- $selfParams = $this->getSelfetchShippingParams();
- $uploadParams[] = $selfParams;
- }
- if (!$uploadParams && in_array('store_delivery', $this->dispatchTypes)) {
- // 有 店铺配送 商品
- $storeDeliveryParams = $this->getStoreDeliveryShippingParams();
- $uploadParams[] = $storeDeliveryParams;
- }
- // 处理微信相关参数
- return $this->setWechatParams($uploadParams, $wechatPay);
- }
- /**
- * 修改物流是获取指定 包裹的 shippingParams
- *
- * @param \think\Model $express
- * @return array
- */
- public function getChangeShippingParams($express)
- {
- $wechatPay = $this->getWechatPay();
- $this->setSendOrderItems();
- $orderExpresses = collection([$express]); // 指定包裹
- // 获取包裹的 params
- $uploadParams = $this->getExpressShippingParamsByExpresses($orderExpresses);
- // 处理微信相关参数
- return $this->setWechatParams($uploadParams, $wechatPay);
- }
- /**
- * 获取订单所有包裹的 shippingParams
- *
- * @return array
- */
- private function getExpressShippingParams()
- {
- $orderExpresses = collection(OrderExpress::where('order_id', $this->order['id'])->select());
- return $this->getExpressShippingParamsByExpresses($orderExpresses);
- }
- /**
- * 获取订单指定包裹的 shippingParams
- *
- * @param \think\Model $order
- * @param \think\Collection $orderExpresses
- * @return array
- */
- private function getExpressShippingParamsByExpresses($orderExpresses)
- {
- $uploadParams = [];
- if (!$orderExpresses->isEmpty()) {
- $orderAddress = OrderAddress::where('order_id', $this->order['id'])->find();
- $receiver_contact = $orderAddress ? mb_substr($orderAddress->mobile, 0, 3) . '****' . mb_substr($orderAddress->mobile, -4) : '130****0000';
- $shippingList = [];
- foreach ($orderExpresses as $orderExpress) {
- $currentItems = $this->getItemsByCondition('order_express_id', $orderExpress->id);
- $item_desc = [];
- foreach ($currentItems as $currentItem) {
- $item_desc[] = $currentItem['goods_title'] . '*' . $currentItem['goods_num'];
- }
- $item_desc = join(', ', $item_desc);
- $item_desc = mb_strlen($item_desc) > 110 ? mb_substr($item_desc, 0, 110) . ' 等商品' : $item_desc; // 处理字符串
- $shippingList[] = [
- 'tracking_no' => $orderExpress['express_no'],
- 'express_company' => $orderExpress['express_code'],
- 'item_desc' => $item_desc,
- 'contact' => [
- 'receiver_contact' => $receiver_contact
- ]
- ];
- }
- if ($shippingList) {
- // 发货
- $uploadParams[] = [
- 'logistics_type' => $this->getLogisticsType('express'),
- 'shipping_list' => $shippingList,
- ];
- }
- }
- return $uploadParams;
- }
- /**
- * 获取订单中虚拟商品的 shippingParams
- *
- * @return array
- */
- private function getVirtualShippingParams()
- {
- // 是否存在虚拟发货商品
- $virtualItems = $this->getItemsByCondition('dispatch_type', ['autosend', 'custom'], 'in_array');
- if (!$virtualItems->isEmpty()) {
- $shippingList = [];
- $item_desc = [];
- foreach ($virtualItems as $virtualItem) {
- $item_desc[] = $virtualItem['goods_title'] . '*' . $virtualItem['goods_num'];
- }
- $item_desc = join(', ', $item_desc);
- $item_desc = mb_strlen($item_desc) > 110 ? mb_substr($item_desc, 0, 110) . ' 等商品' : $item_desc; // 处理字符串
- $shippingList[] = [
- 'item_desc' => $item_desc,
- ];
- // 发货
- $currentParams = [
- 'logistics_type' => $this->getLogisticsType('autosend'),
- 'shipping_list' => $shippingList,
- ];
- }
- return $currentParams ?? null;
- }
- /**
- * 获取订单中到店自提商品的 shippingParams
- *
- * @return array
- */
- public function getSelfetchShippingParams()
- {
- // 到店自提商品
- $selfetchItems = $this->getItemsByCondition('dispatch_type', ['selfetch'], 'in_array');
- if (!$selfetchItems->isEmpty()) {
- $shippingList = [];
- $item_desc = [];
- foreach ($selfetchItems as $selfetchItem) {
- $item_desc[] = $selfetchItem['goods_title'] . '*' . $selfetchItem['goods_num'];
- }
- $item_desc = join(', ', $item_desc);
- $item_desc = mb_strlen($item_desc) > 110 ? mb_substr($item_desc, 0, 110) . ' 等商品' : $item_desc; // 处理字符串
- $shippingList[] = [
- 'item_desc' => $item_desc,
- ];
- // 发货
- $currentParams = [
- 'logistics_type' => $this->getLogisticsType('selfetch'),
- 'shipping_list' => $shippingList,
- ];
- }
- return $currentParams ?? null;
- }
- /**
- * 获取订单中店铺配送商品的 shippingParams
- *
- * @return array
- */
- public function getStoreDeliveryShippingParams()
- {
- // 到店自提商品
- $storeDeliveryItems = $this->getItemsByCondition('dispatch_type', ['store_delivery'], 'in_array');
- if (!$storeDeliveryItems->isEmpty()) {
- $shippingList = [];
- $item_desc = [];
- foreach ($storeDeliveryItems as $storeDeliveryItem) {
- $item_desc[] = $storeDeliveryItem['goods_title'] . '*' . $storeDeliveryItem['goods_num'];
- }
- $item_desc = join(', ', $item_desc);
- $item_desc = mb_strlen($item_desc) > 110 ? mb_substr($item_desc, 0, 110) . ' 等商品' : $item_desc; // 处理字符串
- $shippingList[] = [
- 'item_desc' => $item_desc,
- ];
- // 发货
- $currentParams = [
- 'logistics_type' => $this->getLogisticsType('store_delivery'),
- 'shipping_list' => $shippingList,
- ];
- }
- return $currentParams ?? null;
- }
- /**
- * 设置 orderItems (这里是订单中的所有 items)
- *
- * @return void
- */
- private function setSendOrderItems()
- {
- $orderItems = OrderItem::where('order_id', $this->order['id'])->where('refund_status', OrderItem::REFUND_STATUS_NOREFUND)
- ->whereIn('dispatch_status', [OrderItem::DISPATCH_STATUS_SENDED, OrderItem::DISPATCH_STATUS_GETED])->select();
- $this->orderItems = $orderItems instanceof \think\Collection ? $orderItems : collection($orderItems);
- $this->dispatchTypes = array_values(array_unique(array_filter($this->orderItems->column('dispatch_type'))));
- }
- /**
- * 根据条件获取指定 itemd
- *
- * @param string $field
- * @param mixed $value
- * @return \think\Collection
- */
- private function getItemsByCondition($field, $value, $exp = '')
- {
- $new = [];
- foreach ($this->orderItems as $item) {
- if ($exp == 'in_array') {
- if (in_array($item[$field], $value)) {
- $new[] = $item;
- }
- } else {
- if ($item[$field] == $value) {
- $new[] = $item;
- }
- }
- }
- return collection($new);
- }
- }
|