select('id',"code") ->whereNotIn("id",$blacklist) ->where("id",">",$id)->where("code","like","IDE%") ->where("status",4)->limit(50)->orderBy("id") ->whereNotIn("id",StationTaskMaterialBox::query()->select("material_box_id") ->where("status","!=","完成")->groupBy("material_box_id")); if ($modelId)$boxes->where("material_box_model_id",$modelId); $boxes = $boxes->get(); if ($boxes->count()==0)break; $id = $boxes[count($boxes)-1]->id; $boxCodes = array_column($boxes->toArray(),"code"); //检测海柔的有效料箱 $haiBoxes = DB::connection("mysql_haiRobotics")->table("ks_bin") ->where("status",1)->whereIn("ks_bin_code",$boxCodes)->get(); if ($haiBoxes->count()==0)continue; $haiBoxes->each(function ($haiBox)use(&$codes){$codes[$haiBox->ks_bin_code] = true;}); //剔除有任务待处理的料箱 $haiBoxes = DB::connection("mysql_haiRobotics_ess")->table("ks_ess_task_detail") ->whereIn("bin_code",$boxCodes) ->whereNotIn("status",[0,4])->get(); $haiBoxes->each(function ($haiBox)use(&$notCodes){$notCodes[$haiBox->bin_code] = true;}); //检测FLUX $ides = []; $str = "("; foreach ($boxes as $box){ if (!isset($codes[$box->code]) || isset($notCodes[$box->code]))continue; $str .= "'".$box->code."',"; $ides[$box->code] = $box; } if (!$ides)continue; $str = rtrim($str,",").")"; $sql = <<select(DB::raw($sql)) as $item){ if ((int)$item->qty==0)return $ides[$item->locationid]; unset($ides[$item->locationid]); } if ($ides)return current($ides); } return null; } /** * 获取料箱所在库区 * * @param string $ide * * @return string|null */ public function getBoxLocation(string $ide):?string { $storage = Storage::query()->with("station")->whereHas("materialBox",function (Builder $box)use($ide){ $box->where("code",$ide); })->whereNotNull("station_id")->first(); return $storage->station->code ?? null; } /** * 检查可用料箱 * * @param integer $boxId * * @return bool */ public function checkUsableBox(int $boxId):bool { /** @var MaterialBox|\stdClass $box */ //$box = MaterialBox::query()->find($boxId); //if (!$this->getBoxLocation($box->code))return false; if (StationTaskMaterialBox::query()->select(DB::raw(1))->whereNotIn("status",['完成','取消'])->where("material_box_id",$boxId)->first())return false; return true; } }