batchUpdate('order_packages',$params); } /** * @param string $logistic_number * @param array $values * @return OrderPackage $package */ public function firstOrCreate($logistic_number, array $values){ /** @var $package OrderPackage */ $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first(); if ($package)return $package; /** @var OrderService */ $order = app('OrderService')->logisticNumberFirstOrCreateOrder($logistic_number); if ($order) $values["order_id"] = $order->id; $values["logistic_number"] = $logistic_number; /** @var OrderPackage $package */ $package = OrderPackage::query()->create($values); return $package; } public function createExceptionPaginate($paginate) { return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id') ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC') ->paginate($paginate); } public function issueExceptionPaginate($paginate) { return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule') ->where('status', '下发异常')->orWhere('status', '记录异常') ->orWhere('uploaded_to_wms', '异常')->orderBy('created_at', 'DESC') ->paginate($paginate); } public function getByWmsOrders($orderHeaders){ $order_nos = data_get($orderHeaders,'*.orderno'); return OrderPackage::query()->with('order') ->whereIn('order_id',function($query) use ($order_nos){ $query->from('orders')->select('id')->whereIn('code',$order_nos); })->get(); } public function create(array $params) { if(count($params) == 0)return null; try { $this->insert($params); app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params)); } catch (\Exception $e) { app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString()); } finally { $logistic_numbers = data_get($params,'*.logistic_number'); unset($params); return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get(); } } public function getByOrderNos($orderNos) { return OrderPackage::query()->with('order') ->whereIn('order_id',function($query)use($orderNos){ $query->from('orders')->select('id')->whereIn('code',$orderNos); })->get(); } public function update($orderClientNo,$logisticNumber) { $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first(); if(!$order){ $order = Order::query()->create(['client_code'=>$orderClientNo]); } $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first(); if($orderPackage){return compact('orderPackage','order');} $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]); return compact('orderPackage','order'); } public function syncOrderPackage(&$orderHeaders) { $this->syncPackageByOrderHeaders($orderHeaders); } public function syncPackageByOrderHeaders(&$orderHeaders) { /** @var OrderService $orderService */ $orderService = app('OrderService'); if(!$orderHeaders)return; $orders = $orderService->getByWmsOrders($orderHeaders); $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno')); // 已有 $this->createOrderPackage($orderHeaders,$orders,$packages); // 创建package $this->updatePackage($orderHeaders,$packages); $this->deleteUnnecessaryPackage($orderHeaders,$packages); // 删除package unset($orders,$packages); // 手动清除 } public function createOrderPackage($orderHeaders,$orders,$packages) { if(!$orderHeaders)return; /** * @var DataHandlerService $dataHandlerService */ $dataHandlerService = app(DataHandlerService::class); $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders); $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages); $inner_params = []; foreach ($orders as $order){ $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeaders_map); if(!$orderHeader)continue; if($orderHeader->sotatus == 90)continue; $params = $this->getInnerParams($orderHeader,$order,$packages_maps); $inner_params = array_merge($inner_params,$params); } if(count($inner_params)>0){ try { $inner_array = array_chunk($inner_params,5000); foreach ($inner_array as $params) { $bool = $this->insert($params); $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null; } } catch (\Exception $e) { LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' .json_encode($e->getMessage()). json_encode($inner_params).json_encode($e->getTraceAsString())); } } } public function getInnerParams($orderHeader,$order,$packages_maps) { /** * @var DataHandlerService $dataHandlerService */ $dataHandlerService = app('DataHandlerService'); $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']); $inner_params = []; if($orderHeader['sostatus'] == '90'){ if($orderHeader['soreference5']=='')$logistic_numbers = [$orderHeader['orderno']]; else $logistic_numbers = [$orderHeader['soreference5']]; } $date = Carbon::now()->format('Y-m-d H:i:s'); $sentAtMap = []; foreach ($orderHeader->actAllocationDetails as $item){ $sentAtMap[$item->picktotraceid] = $item; } foreach ($logistic_numbers as $logistic_number){ $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps); if(isset($package))continue; try { $data = $sentAtMap[$logistic_number]; } catch (\Exception $e) { $data = null; } $inner_params[] = [ 'order_id' => $order->id, 'logistic_number' => $logistic_number, 'created_at' => $date, 'updated_at' => $date, 'status' => '无', 'owner_id' => $order->owner_id, 'sent_at' => $data ? $data->checktime:null, ]; } return $inner_params; } public function deleteUnnecessaryPackage($orderHeaders,$packages) { /** * @var DataHandlerService $dataHandlerService * @var OrderTrackingService $orderTrackingService * @var OrderPackageCommoditiesService $orderPackageCommoditiesService */ $dataHandlerService = app(DataHandlerService::class); $orderPackageCommoditiesService = app('OrderPackageCommoditiesService'); $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'); // 获取picktotraceid (运单的快递单号) foreach ($orderHeaders as $orderHeader) { if($orderHeader['sostatus'] == '90'){ if($orderHeader['soreference5']=='')$logistic_numbers[] =$orderHeader['orderno']; else $logistic_numbers[] = $orderHeader['soreference5']; } } $logistic_numbers = array_unique(array_values($logistic_numbers)); $logistic_numbers = array_diff($logistic_numbers,['',' ','*']); $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages); $exits_number = data_get($packages,'*.logistic_number'); $packages = []; $diff_number = array_diff($exits_number,$logistic_numbers); foreach ($diff_number as $number) { $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps); if($package ?? false)$packages[]=$package->id; } if(count($packages)==0)return; try { $bool = OrderPackage::query()->whereIn('id', $packages)->delete(); $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id',$packages)->get(); $orderPackageCommoditiesService->deleteOrderCommodities($orderPackageCommodities); $bool ? LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages)) : null; } catch (\Exception $e) { LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages).$e->getMessage()); } } private function updatePackage($orderHeaders, $packages) { $map = $this->getSentAtMap($orderHeaders); $update_params = []; $update_params[] = ['id','sent_at']; foreach ($packages as $package) { if ($package->sent_at) continue; try { $data = $map[$package->logistic_number]; } catch (\Exception $e) { continue; } $update_params[] = [ 'id'=>$package->id, 'sent_at' => $data->checktime, ]; } $this->batchUpdate($update_params); } /** * @param $orderHeaders * @return array */ private function getSentAtMap($orderHeaders): array { $map = []; foreach ($orderHeaders as $orderHeader) { $actAllocationDetails = $orderHeader->actAllocationDetails; foreach ($actAllocationDetails as $actAllocationDetail) { $logistic_number = $actAllocationDetail->picktotraceid; $map[$logistic_number] = $actAllocationDetail; } } return $map; } }