where('is_manual_back',1)->orderBy('interval_time')->get(); $sys_last_manual_back_time=$this->getOrderManualBackAt();//系统上次回传时间 $now=Carbon::now()->toDateTimeString();//当前时间 $manualBackTime=null; $ownerCodes=[]; foreach ($owners as $owner){ $intervalTime=Carbon::parse($now)->diffInMinutes(Carbon::parse($owner->last_manual_back_time)); if ($intervalTime>16*60 || !$owner->last_manual_back_time){ // 隔天回传情况 或者 货主上次回传时间为null $manualBackTime=$sys_last_manual_back_time; $ownerCodes=array_unique(data_get($owners,'*.code')); break; } if ($owner->interval_time==30 && $intervalTime>=25 &&$intervalTime<=35){ //存在每30分钟一回传的货主 $manualBackTime=$owner->last_manual_back_time; $ownerCodes[]=$owner->code; }else if ($owner->interval_time==60 && $intervalTime>=55 &&$intervalTime<=65){ //存在每1小时一回传的货主 $manualBackTime=$owner->last_manual_back_time; $ownerCodes[]=$owner->code; }else if ($owner->interval_time==120 && $intervalTime>=115 &&$intervalTime<=125){ //存在每2小时一回传的货主 $manualBackTime=$owner->last_manual_back_time; $ownerCodes[]=$owner->code; }else if ($owner->interval_time==180 && $intervalTime>=175 &&$intervalTime<=185){ //存在每3小时一回传的货主 $manualBackTime=$owner->last_manual_back_time; $ownerCodes[]=$owner->code; } } try { $ordernos=$this->allocation($manualBackTime, $now, $ownerCodes);//分配是创建状态订单 $this->manualBack($manualBackTime,$now, $ownerCodes,$ordernos);//回传 } catch (\Exception $e) { app('LogService')->log(__METHOD__, __FUNCTION__, "自动回传失败" . $manualBackTime . ' || ' .$now. ' || ' . json_encode($ownerCodes).' || ' . json_encode($e->getMessage())); } $this->changeOwnerLastManualTime($ownerCodes,$now);//更新回传货主的回传时间 $this->setOrderManualBackAt();//回传结束时间标记 } /** * @param $last_order_manual_back_at * @param $now * @param $ownerCodes * @return array|void * 分配 状态:创建订单、部分预配、预配完成 的订单 */ private function allocation($last_order_manual_back_at,$now,$ownerCodes) { $orders=OracleDOCOrderHeader::query() ->whereIn('sostatus',['00','10','20'])//状态:创建订单、部分预配、预配完成 ->where('edittime','>=',$last_order_manual_back_at) ->where('edittime','<=',$now) ->whereNotNull('soreference5') //快递单号不为空 ->whereIn('customerid',$ownerCodes) //指定货主 ->where('releasestatus','!=','H')//订单非冻结状态 ->get(); if($orders->count()==0)return; /** @var OrderService $orderService */ $orderService=app("OrderService"); $conn = null; $allocationOrderNos=[]; foreach ($orders as $order){ if (!$order->soreference5) continue; if (!$conn)$conn = $this->getFluxConnection(); $res=$orderService->allocation($order->orderno,null,$order->warehouseid,$conn); if (mb_substr($res,0,3)=='000') array_push($allocationOrderNos,$order->orderno); } if ($conn)$this->releaseFluxConnection($conn); return $allocationOrderNos; } /** * @param $last_order_manual_back_at * @param $now * @param $ownerCodes * 回传修改标记状态 */ private function manualBack($last_order_manual_back_at,$now, $ownerCodes,$ordernos) { OracleDOCOrderHeader::query() ->whereIn('sostatus',['40','50','60','61']) ->where('edittime','>=',$last_order_manual_back_at) ->where('edittime','<=',$now) ->whereNotNull('soreference5') ->where('manualflag','N') ->whereIn('customerid',$ownerCodes) //指定货主 ->where('releasestatus','!=','H') ->update(['manualflag'=>'Y','edittime'=>$now]); if (count($ordernos)==0)return; OracleDOCOrderHeader::query() ->whereIn('orderno',$ordernos) ->whereIn('sostatus',['40','50','60','61']) ->whereNotNull('soreference5') ->where('manualflag','N') ->where('releasestatus','!=','H') ->update(['manualflag'=>'Y','edittime'=>$now]); } /** * @return HigherOrderBuilderProxy|mixed|null * 获取订单上次自动回传时间 */ private function getOrderManualBackAt() { $val = ValueStore::query() ->select("value") ->where("name", "last_order_manual_back_at") ->lockForUpdate() ->first(); if (!$val) $val = ValueStore::query() ->create(["name" => "last_order_manual_back_at",'value'=>Carbon::now()->toDateTimeString()]); return $val->value ?? null; } /** * 设置订单上次自动回传时间 */ private function setOrderManualBackAt() { ValueStore::query() ->select("value") ->where("name", "last_order_manual_back_at") ->update(["value" => Carbon::now()->toDateTimeString()]); } private function changeOwnerLastManualTime($ownerCodes,$now) { Owner::query()->whereIn('code',$ownerCodes) ->update(['last_manual_back_time'=>$now]); } }