batchUpdate('order_packages',$params); } public function insert(array $params) { return OrderPackage::query()->insert($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('status', '已上传异常')->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->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 = []; $date = Carbon::now()->format('Y-m-d H:i:s'); foreach ($logistic_numbers as $logistic_number){ $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps); if(isset($package))continue; $inner_params[] = [ 'order_id' => $order->id, 'logistic_number' => $logistic_number, 'created_at' => $date, 'updated_at' => $date, 'status' =>'无' ]; } 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 (运单的快递单号) $logistic_numbers = array_unique($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 $packages; try { $bool = OrderPackage::query()->whereIn('id', $packages)->delete(); $orderPackageCommodities = OrderPackageCommodities::query()->where('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()); } } }