select('order_id')->where('logistic_number_return', $rejectedBill->logistic_number_return); $order = Order::query()->whereIn('id', $query)->first(); $this->syncRejectingStatus($order); } /** * 订单同步退回状态 */ public function syncRejectingStatus($order) { if (!$order) return; $rejecting_status = $this->getOrderRejectingStatus($order); $query = OrderDetail::query()->where('order_id', $order->id); $order_detail = $query->first(); $is_new_rejecting = in_array($rejecting_status, ['无', '未退回']) ? '无' : '有'; if (!$order_detail) { try { OrderDetail::query()->create( ['order_id' => $order->id, 'is_new_rejecting' => $is_new_rejecting, 'rejecting_status' => $rejecting_status] ); } catch (\Exception $e) { LogService::log(__CLASS__, __METHOD__, $e->getMessage()); } return; } if (in_array($order_detail->is_new_rejecting, ['有', '已处理']) && $rejecting_status != '无') { $query->update(['rejecting_status' => $rejecting_status]); } else { $query->update(['rejecting_status' => $rejecting_status, 'is_new_rejecting' => $is_new_rejecting]); } if ($rejecting_status == '全部退回') { $orderIssueTypeQuery = OrderIssueType::query()->select('id')->where('name','拦截'); $workOrder = WorkOrder::query()->where('order_id',$order->id) ->whereIn('order_issue_type_id',$orderIssueTypeQuery)->where('status','!=',6)->first(); if($workOrder){ app(WorkOrderInterceptService::class)->autoReviewIntercept($workOrder); } } } public function getOrderRejectingStatus(Order $order): string { $rejected_bill_item_map = $this->getRejectedBillMaps($order); $order_commodity_map = $this->getOrderCommodityMap($order); return $this->computerRejectingStatus($rejected_bill_item_map, $order_commodity_map); } private function getRejectedBillItems(Order $order) { $orderIssueRejectedBills = OrderIssueRejectedBill::query()->select('logistic_number_return')->where('order_id', $order->id)->where('logistic_number_return', '!=', '')->get(); $logistic_number_return = $orderIssueRejectedBills->map(function ($item) { return $item->logistic_number_return; })->toArray(); $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return', $logistic_number_return); return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill', $query)->get(); } private function getRejectedBillMaps($order): array { $rejected_bill_items = $this->getRejectedBillItems($order); $map = []; if (count($rejected_bill_items) == 0) return $map; foreach ($rejected_bill_items as $item) { $code = $item->barcode_goods; $amount = $item->amount; if (!Commodity::query()->where("sku", $code)->where('owner_id', $order->owner_id)->exists()) { $query = CommodityBarcode::query()->select('commodity_id')->where('code', $code); $commodity = Commodity::query()->where('owner_id', $order->owner_id)->whereIn('id', $query)->whereNotNull('sku')->first(); if ($commodity) $code = $commodity->sku; } $quality_name = $item->quality->name; if ($map[$code][$quality_name] ?? false) $map[$code][$quality_name] += $amount; else $map[$code][$quality_name] = $amount; } return $map; } private function getOrderCommodityMap(Order $order): array { $map = []; $order->packages->each(function ($package) use ($order, &$map) { $package->commodities->map(function ($item) use ($order, &$map) { $sku = $item->commodity->sku ?? null; if ($sku) { $amount = $item->amount; empty($map[$sku]) ? $map[$sku] = $amount : $map[$sku] += $amount; } }); }); return $map; } private function computerRejectingStatus(array $rejected_bill_item_map, array $order_commodity_map): string { //未退回,差异退回,全部退回,超量退回,部分退回 if (count($rejected_bill_item_map) == 0) return "未退回"; $equal = 0; // 相等sku $portion = 0; // 相等的sku foreach ($rejected_bill_item_map as $key => $map) { if (isset($map['残次']) && $map['残次'] > 0) return "差异退回"; if (empty($order_commodity_map[$key])) return "差异退回"; if (isset($map['正品']) && isset($order_commodity_map[$key])) { if ($map['正品'] < $order_commodity_map[$key]) $portion += 1; if ($map['正品'] > $order_commodity_map[$key]) return "超量退回"; if ($map['正品'] == $order_commodity_map[$key]) $equal += 1; } } if ($equal == count($rejected_bill_item_map) && $equal == count($order_commodity_map) && $portion == 0) return "全部退回"; // 全部退回 if ($portion > 0) return "部分退回"; if (count(array_diff_key($order_commodity_map, $rejected_bill_item_map)) > 0) return '部分退回'; if (count(array_diff_key($rejected_bill_item_map, $order_commodity_map)) > 0) return '差异退回'; return "无"; } }