service = $service; } public function rejectedBillSyncOrder(RejectedBill $rejectedBill) { $order = $this->getOrder($rejectedBill); if (!$order) return; $order_issue = OrderIssue::query()->where('order_id', $order->id)->first(); $item = OrderIssueRejectedBill::query()->where('logistic_number_return', $rejectedBill->logistic_number_return)->first(); if ($item) { OrderIssueRejectedBill::query()->where('logistic_number_return', $rejectedBill->logistic_number_return)->update( ['order_id' => $order->id,'order_issue_id' => $order_issue->id ?? null] ); } else { if($rejectedBill->logistic_number_return !== ''){ OrderIssueRejectedBill::query()->create( ['order_id' => $order->id, 'order_issue_id' => $order_issue->id ?? null, 'logistic_number_return' => $rejectedBill->logistic_number_return] ); } } $this->sendSWMSMessage($order); $this->service->syncRejectingStatus($order); } public function sendSWMSMessage($order){ $items = OrderIssueRejectedBill::query()->select("logistic_number_return") ->whereNotNull("logistic_number_return") ->where("order_id",$order->id)->get(); if(count($items) == 0){ return; } $logisticNumbers = $items->map(function($item){ return $item->logistic_number_return; })->toArray(); // TODO 这里遗留待处理 $url = config('api.java.base').config('api.java.reject.modifyStatus'); $request = [ "returnNos" => $logisticNumbers ]; app('LogService')->log("通知问题件关联", "modifyStatus", '推送:'.json_encode($request)); Http::post($url,$request); } private function getOrder(RejectedBill $rejectedBill) { return ($this->getOrderByLogisticNumber($rejectedBill) ?? $this->getOrderByOracleOrderHeader($rejectedBill)) ?? $this->getOrderByOrderIssueRejectedBill($rejectedBill); } private function getOrderByLogisticNumber(RejectedBill $rejectedBill) { return Order::query()->whereHas('packages', function ($query) use ($rejectedBill) { $query->where('logistic_number', $rejectedBill->logistic_number_return); })->first(); } private function getOrderByOracleOrderHeader(RejectedBill $rejectedBill) { $order_header = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) use ($rejectedBill) { $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $rejectedBill->logistic_number_return)->first(); })->first(); return $order_header ? Order::query()->where('code', $order_header->orderno)->first() : null; } private function getOrderByOrderIssueRejectedBill(RejectedBill $rejectedBill){ $query = OrderIssueRejectedBill::query()->select('order_id')->where('logistic_number_return',$rejectedBill['logistic_number_return']); return Order::query()->whereIn('id',$query)->first(); } // 问题件同步 public function orderSyncRejectedBill(Order $order) { $logistic_number_returns = array_unique( array_merge($this->getOrderPackagesLogisticNumbers($order), $this->getOracleOrderHeaderRelationLogisticNumbers($order)) ); $logistic_number_returns = $this->filtersCanBeJoinLogisticNumberReturns($order, $logistic_number_returns); $order_issue = OrderIssue::query()->where('order_id',$order->id)->first(); OrderIssueRejectedBill::query()->insert(array_map(function($item)use($order,$order_issue){ return ['order_id' => $order->id,'logistic_number_return' => $item,'order_issue_id' => $order_issue->id ?? '']; },$logistic_number_returns)); if(!$order->id ?? null){ return ; } OrderIssueRejectedBill::query()->where("order_id",$order->id)->update(['order_issue_id'=>$order_issue->id ?? null]); $this->service->syncRejectingStatus($order); $this->sendSWMSMessage($order); } private function getOrderPackagesLogisticNumbers(Order $order): array { return OrderPackage::query()->where('order_id', $order->id)->get()->map(function ($orderPackages) { return $orderPackages->logistic_number; })->toArray(); } private function getOracleOrderHeaderRelationLogisticNumbers(Order $order): array { $query = OracleDOCOrderHeader::query()->select('SoReference1')->where('orderNo', $order->code); return OracleDOCASNHeader::query()->select('AsnReference3')->whereIn('AsnReference2', $query)->get()->map(function ($asnHeader) { return $asnHeader->asnreference3; })->toArray(); } /** * @param Order $order * @param array $logistic_number_returns * @return array */ public function filtersCanBeJoinLogisticNumberReturns(Order $order, array $logistic_number_returns): array { $order_issue_rejected_bill_logistic_number_returns = $this->geExistRelationLogisticNumberReturn($order, $logistic_number_returns); $logistic_number_returns = array_diff($logistic_number_returns, $order_issue_rejected_bill_logistic_number_returns); $rejected_bill_logistic_number_return = $this->getExistRejectedBIllLogisticNumberReturn($logistic_number_returns); return array_filter(array_intersect($logistic_number_returns, $rejected_bill_logistic_number_return),function($item){ return $item != ''; }); } /** * @param Order $order * @param array $logistic_numbers * @return array */ public function geExistRelationLogisticNumberReturn(Order $order, array $logistic_numbers): array { return OrderIssueRejectedBill::query() ->select('logistic_number_return')->where('order_id', $order->id) ->whereIn('logistic_number_return', $logistic_numbers)->get() ->where('logistic_number_return','!=','') ->map(function ($item) { return $item->logistic_number_return; })->toArray(); } /** * @param array $logistic_numbers * @return array */ public function getExistRejectedBIllLogisticNumberReturn(array $logistic_numbers): array { return RejectedBill::query()->select('logistic_number_return') ->whereIn('logistic_number_return', $logistic_numbers) ->where('logistic_number_return','!=','')->get() ->map(function ($item) { return $item->logistic_number_return; })->toArray(); } }