instant($this->cacheService,'CacheService'); } public function getSelection($column = ['id','name'], $type = '快递'){ return $this->cacheService->getOrExecute('LogisticAll_'.implode("",$column).Str::studly($type),function()use($column,$type){ $query = Logistic::query()->select($column); if ($type)$query->where(function ($query)use($type){ /** @var Builder $query */ $query->where("type",$type)->orWhere("type","全部"); }); return $query->get(); },config('cache.expirations.rarelyChange')); } public function firstOrCreate(array $params, array $values = null){ return $this->cacheService->getOrExecute('LogisticFirstOrCreate'.md5(json_encode($params).json_encode($values)),function()use($params,$values){ $logistic = Logistic::query(); if ($values)return $logistic->firstOrCreate($params, $values); return $logistic->firstOrCreate($params); },config('cache.expirations.commonFrequent')); } public function getByWmsOrders($orderHeaders){ $codes = data_get($orderHeaders,'*.userdefine1'); $codes = array_unique($codes); $codes = array_diff($codes,['','*',null]); if(!$codes){return [];} $logistics = Logistic::query()->whereIn('code',$codes)->get(); if($logistics->count() < count($codes)){ $codes = array_diff($codes,data_get($logistics,'*.code')); $logistic_list = $this->createLogisticByCarrierIds($codes); $logistics = $logistics->concat($logistic_list); } return $logistics; } public function createLogisticByCarrierIds($codes){ if(!$codes){return [];} $baseCustomers = OracleBasCustomer::query() ->selectRaw('Customer_Type,CustomerID,Descr_C') ->where('Customer_Type','CA') ->whereIn('CustomerID',$codes) ->get(); $insert_params = []; $created_at = Carbon::now()->format('Y-m-d H:i:s'); foreach ($baseCustomers as $baseCustomer) { $insert_params[] = [ 'code' => $baseCustomer['customerid'], 'name' => $baseCustomer['descr_c'], 'created_at' => $created_at ]; } try { if(count($insert_params) > 0){ $this->insert($insert_params); LogService::log(__METHOD__, __FUNCTION__, '批量创建 Logistic ' . count($insert_params) . json_encode($insert_params) ); } } catch (\Exception $e) { LogService::log(__METHOD__, __FUNCTION__, '批量创建 Logistic error' . json_encode($insert_params) . "||".$e->getMessage() . '||' . $e->getTraceAsString() ); } finally { return Logistic::query()->whereIn('code',$codes)->get(); } } public function find($id) { return Logistic::query()->find($id); } public function getLogisticByCodes($codes) { $collect = collect(); if(count($codes) == 0) return $collect; foreach ($codes as $code) { $collect->push($this->getLogisticByCode($code)); } return $collect; } public function getLogisticByCode($code){ return Cache::remember("getLogisticByCode_{$code}", config('cache.expirations.rarelyChange'), function()use($code){ $logistic = Logistic::query()->where('code',$code)->first(); if($logistic)return $logistic; $baseCustomers = app('OracleBasCustomerService')->first(['Customer_Type'=>'CA','CustomerID'=>$code]); if(!$baseCustomers)return null; try { $logistic = Logistic::query()->create(['name' => $baseCustomers['descr_c'], 'code' => $baseCustomers['customerid']]); app('LogService')->log(__METHOD__, __FUNCTION__,'创建Logistic SUCCESS'." || ". json_encode($logistic)); return $logistic; } catch (\Exception $e) { app('LogService')->log(__METHOD__, __FUNCTION__,'创建Logistic ERROR'." || ". json_encode($logistic)." || ".json_encode($e->getMessage())." || ".json_encode($e->getTraceAsString())); return null; } }); } function getIdArr(?int $userId = null): array { if (!$userId)$userId = Auth::id(); return array_column($this->getQuery($userId)->get()->toArray(),"id"); } function getCodeArr(?int $userId): array { return []; } function getQuery(?int $userId = null, $column = "id"): Builder { if (!$userId)$userId = Auth::id(); $query = Logistic::query()->select($column); if (!app("UserService")->checkAdminIdentity($userId)){ $query->whereHas("users",function ($query)use($userId){ $query->where("users.id",$userId); }); } return $query; } /** * 断言快递单号所属快递公司 * * @param string $logisticNumber * @param bool $multi * * @return string|array */ public function assertExpressCompany(string $logisticNumber, bool $multi = false) { $mapping = [ "顺丰" => [ [ "header" => "SF", "length" => 15, ], [ "length" => 12, "type" => "numeric", ], ], "圆通" => [ [ "header" => "YT", "length" => 15, ], [ "length" => 13, "type" => "numeric", "multiHeader" => ["61","71","81"], ], ], "中通" => [ [ "length" => 12, "type" => "numeric", "multiHeader" => ["54","21"], ], [ "length" => 14, "type" => "numeric", "multiHeader" => ["75","78","73",'74'], ], ],"韵达" => [ [ "length" => 13, "type" => "numeric", "multiHeader" => ["46","43","42","35","120",'318','530','570'], ], [ "length" => 15, "type" => "numeric", "multiHeader" => ["46","43","31"], ], ], "京东" => [ [ "header" => "JD", ], ], "邮政" => [ [ "length" => 13, "type" => "numeric", "multiHeader" => ["11","98"], ], [ "length" => 13, "header" => "KH", ], ], "极兔" => [ [ "header" => "JT", ] ], "跨越" => [ [ "header" => "KY", "length" => 15, ], [ "length" => 11, "type" => "numeric", "multiHeader" => ["80"], ], ], "申通" => [ [ "multiHeader" => ["77"], "type" => "numeric", "length" => 15, ], [ "multiHeader" => ["660"], "type" => "numeric", "length" => 13, ], ], "百世" => [ [ "multiHeader" => ["55"], "type" => "numeric", "length" => 15, ] ], "EMS" => [ [ "multiHeader" => ["97","10","95","96","99"], "type" => "numeric", "length" => 13, ], ], "德邦" => [ [ "header" => "DPK", "length" => 15, ], ] ]; $result = $multi ? [] : ""; foreach ($mapping as $name=>$rules){ foreach ($rules as $rule){ if (!$this->matchingNumber($logisticNumber,$rule))continue; if ($multi)$result[] = $name; else return $name; } } return $result; } public function matchingNumber(string $logisticNumber, array $rule):bool { $len = mb_strlen($logisticNumber); $match = function (string $key, $val)use($logisticNumber,$len){ switch ($key){ case "header": return Str::upper(mb_substr($logisticNumber,0,mb_strlen($val))) === $val; case "length": return $len==$val; case "multiHeader": foreach ($val as $item)if (mb_substr($logisticNumber,0,mb_strlen($item)) === $item)return true; return false; case "type": try { return eval("return is_{$val}('$logisticNumber');"); }catch (\ParseError $e){ return false; } default: return false; } }; foreach ($rule as $key=>$val)if (!$match($key,$val))return false; return true; } }