getLimit($params), function ($query) use ($params) { $query->where(['mall_id' => $this->mall_id]); $query->select( 'id, order_id, user_id, order_no, spu_id, chain_order_sn, chain_total_amount, chain_pay_amount, chain_order_status, status, error, updated_at, created_at' ); $query->with([ 'order' => function ($query) { $query->select('id, region_name, address, receiver_name, shipping_money, goods_price, mobile'); }, 'details' => function ($query) { $query->select('id, order_id, goods_name, goods_attr_name, num, pic_url'); }, ]); // 名称查询 if (!empty($params['name'])) { $query->andWhere([ 'id' => OrderItem::find() ->where([ 'spu_id' => Goods::find() ->where(['like', 'name', $params['name']]) ->select('spu_id') ]) ->select('order_id') ]); } // 订单号查询 if (!empty($params['order_no'])) { $query->andWhere([ 'order_no' => $params['order_no'] ]); } // 收货人查询 if (!empty($params['receiver_name'])) { $query->andWhere([ 'order_id' => MallOrder::find()->where([ 'and', ['like', 'receiver_name', $params['receiver_name']], ['=', 'mall_id', $this->mall_id] ])->select('id')->column() ]); } }); $data['list'] = array_map(function ($item) { $item['chain_order_status_text'] = StarChainOrderEnum::getValue($item['chain_order_status']); return $item; }, $data['list']); return $data; } /** * 获取订单详情 * * @param integer $id * @return array */ public function getOrderDetail($id) { $order = Order::getOrderAndItemById($this->mall_id, $id); $order_detail = []; try { foreach ($order->items as $item) { $order_detail[] = $this->api->getOrderDetail($item->chain_order_sn); } } catch (Exception $e) { return $this->error($e->getMessage()); } return $order_detail; } /** * 订单发货 * * @param string|array $order_sn * @return boolean */ public function orderDelivery($order_sn) { $t = Yii::$app->db->beginTransaction(); try { $this->orderDeliveryByOrderSn($order_sn); $t->commit(); } catch (Exception $e) { $t->rollback(); return $this->error($e->getMessage()); } return true; } /** * 通过订单号发货 * * @param string|array $order_sn * @return void */ public function orderDeliveryByOrderSn($order_sn) { $order_list = Order::getUnDeliveryOrderByOrderSn($this->mall_id, $order_sn); foreach ($order_list as $order) { $this->orderDeliveryByOrder($order); } } /** * 通过订单发货 * * @param Order $order * @return void */ public function orderDeliveryByOrder(Order $order) { $order_detail = $this->api->getOrderDetail($order->chain_order_sn); if ($order_detail['orderStatus'] == StarChainOrderEnum::STATUS_30) { $order->delivery($order_detail); } } /** * 订单收货 * * @param integer $id * @return void */ public static function orderDelivered($id) { $order = Order::find()->where(['order_id' => $id])->one(); // 不是星链供应链 不处理 if (empty($order)) return true; $data = Json::decode($order->dot); $service = new self(['mall_id' => $order->mall_id]); try { $service->api->confirmReceive($order->chain_order_sn, $data['shipMobile']); } catch (Exception $e) { Yii::error("订单:{$id}, 收货失败. 失败原因:" . $e->getMessage()); } } /** * 获取订单物流 * * @param integer $order_id * @return array|boolean */ public function getOrderExpress($order_id) { try { $order = Order::getOrderAndItemByOrderId($this->mall_id, $order_id); if (empty($order) || empty($order->items)) return []; // $this->error('订单有误'); // 查看订单详情 $deliverList = []; foreach ($order->items as $item) { $order_detail = $this->api->getOrderDetail($item->chain_order_sn); $deliverList = [...$deliverList, ...$order_detail['deliverList']]; } // 格式化数据 $result = []; foreach ($deliverList as $item) { // 使用接口查询 // $express = $this->api->getOrderExpressListByOs($item['orderSn'], $item['deliverySn']); // 直接使用订单详情数据 $ItemVOList = reset($item['orderExpressItemVOList']); $item['deliveryUpdateVOList'] && $result[] = [ 'express_name' => $item['expressName'], 'express_no' => $item['deliverySn'], 'list' => ['Traces' => $this->_formatToMall($item['deliveryUpdateVOList'] ?? [])], 'pic_url' => $ItemVOList['goodsPhotoUrl'] ?? '', ]; } return $result; } catch (Exception $e) { return $this->error($e->getMessage()); } } /** * 订单状态修改 * * @param string $returnSn * @param integer $status * @return boolean */ public function orderStatusChange($returnSn, $status) { // 仅处理订单完成 其他状态会有其他处理 if ($status != StarChainOrderEnum::STATUS_40) { return true; } try { $order = Order::find()->where(['mall_id' => $this->mall_id, 'chain_order_status' => StarChainOrderEnum::STATUS_30, 'chain_order_sn' => $returnSn])->one(); if ($order) { $order->chain_order_status = StarChainOrderEnum::STATUS_40; return $order->save(); } } catch (Exception $e) { return false; } } /** * 通过推送数据发货 * * @param string $order_sn * @param string $delivery_sn * @param array $sku_ids * @param string $delivery_corp_sn * @return void */ public function orderDeliveryByPushMsg( string $order_sn, string $delivery_sn, array $sku_ids, string $delivery_corp_sn ) { $order_item = OrderItem::getOrderByOrderSn($this->mall_id, $order_sn); if (empty($order_item)) throw new Exception(sprintf('订单发货: %s子订单不存在', $order_sn)); $order = $order_item->order; if (empty($order)) throw new Exception(sprintf('订单发货: %s订单不存在', $order_sn)); $order->deliveryByMsg($delivery_sn, $delivery_corp_sn, $sku_ids); } /** * 格式化格式 * * @param array $var * @return array */ private function _formatToMall(array $list) { return array_map(function ($item) { return [ 'AcceptTime' => $item['time'], 'AcceptStation' => $item['context'] ]; }, $list); } /** * 重新推送订单 * * @param integer $id * @return boolean */ public function resendOrder(int $id) { $order = Order::findOne($id); if (empty($order)) return $this->error('订单不存在'); $dot = json_decode($order->dot, true); $dot['goodsList'] = array_map(function ($item) { return [ 'goodsQty' => $item['goodsQty'], 'skuId' => $item['skuId'], ]; }, $dot['goodsList']); try { new ChainOrderService(['mall_id' => $this->mall_id]); $order_data = (new self(['mall_id' => $order->mall_id]))->api->submitOrder($dot); Yii::$app->db->transaction(function () use ($order_data, $order) { // 修改状态 if ($order->orderSuccess($order_data['orderList']) === false) throw new \Exception('修改状态失败'); }); } catch (\Exception $e) { return $this->error($e->getMessage()); } return true; } }