error("信息不完整"); $fromLocation = app("MaterialBoxService")->getBoxLocation($ide); if (!$fromLocation)$this->error("海柔无此库位信息"); $box = MaterialBox::query()->select("id")->where("code",$ide)->first(); if (!$box)$this->error("WAS无此料箱"); //get flux $sql = <<= ? AND TASKPROCESS = '00' AND TASKTYPE = 'PA' sql; $asns = DB::connection("oracle")->select(DB::raw($sql),[$asn,$barCode,$barCode,$barCode,$amount]); if (!$asns)$this->error("ASN不存在或上架数量与入库数量不符"); $nums = []; $result = null; foreach ($asns as $index=>$asn){ if ((int)$asn->fmqty == $amount){$result=$index;break;} $nums[] = (int)$asn->fmqty; } //flux上架 if ($result===null){ $result = $this->twoSum($nums,$amount); if (!$result)$this->error("无法匹配入库记录,检查您的上架数量"); DB::connection("oracle")->transaction(function ()use($result,$asns,$ide){ foreach ($result as $index){ $this->fluxPA($asns[$index],$ide,(int)$asns[$index]->fmqty); } }); } else $this->fluxPA($asns[$result],$ide,$amount); //亮灯 app("CacheShelfService")->_stationCacheLightOn($fromLocation,$ide); //库存相关信息 /** @var Station|\stdClass $station */ $station = Station::query()->firstOrCreate(["code"=>$fromLocation],[ 'name' => $fromLocation, 'code' => $fromLocation, 'station_type_id' => 5 ]); $item = StoreItem::query()->whereHas("store",function (Builder $query){ $query->where("asn_code",request("asn")); })->whereHas("commodity",function (Builder $query)use($barCode){ $query->whereHas("barcodes",function (Builder $query)use($barCode){ $query->where("code",$barCode); }); })->first(); //库存记录 app("StorageService")->enterWarehouse($station->id, $box->id, $item->commodity_id ?? null, $amount); //建立入库任务 if (!app("ForeignHaiRoboticsService")->putWareHousing($fromLocation,$box->id))$this->error("错误库位或库位已被下达任务"); $this->success(); } public function fluxPA($asn,$ide,$amount) { if (!$asn->taskid)$this->error("ASN单无此入库信息,禁止上架"); $sql = <<select(DB::raw($sql),[$asn->fmlotnum,$asn->plantoid,$asn->customerid,$asn->sku]); if (count($inv)==0)$this->error("余量与入库不符"); DB::connection("oracle")->transaction(function ()use($inv,$amount,$ide,$asn,&$who){ $db = DB::connection("oracle"); $qty = $amount; foreach ($inv as $in){ if ($qty==0)break; if ($in->qty > $qty){ $db->update(DB::raw("update inv_lot_loc_id set qty = qty-?,qtymvout = qty-? where lotnum = ? and locationid = ? and traceid = ?"),[ $qty,$qty,$in->lotnum,$in->locationid,$in->traceid ]);//TODO 遗留问题:对应生成分配库位上架数量未被变更 $in->qty = $in->qty-$qty; $qty = 0; }else{ $db->delete(DB::raw("DELETE FROM inv_lot_loc_id WHERE lotnum = ? and locationid = ? and traceid = ?"),[ $in->lotnum,$in->locationid,$in->traceid ]); $qty = $qty-$in->qty; } } $db->delete(DB::raw("DELETE FROM inv_lot_loc_id WHERE lotnum = ? AND traceid = ? AND traceid != '*' AND qty = 0"),[ $inv[0]->lotnum,$inv[0]->traceid ]); $invHistory = $db->selectOne(DB::raw("SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND locationid = ? AND customerid = ? AND sku = ? AND traceid = '*' FOR UPDATE"),[ $inv[0]->lotnum,$ide,$inv[0]->customerid,$inv[0]->sku ]); $who = 'WAS'.(Auth::user() ? '-'.Auth::user()["name"] : ''); if ($invHistory)$db->update(DB::raw("UPDATE inv_lot_loc_id SET qty = qty+? WHERE lotnum = ? AND locationid = ? AND traceid = '*'"),[ (int)$amount,$inv[0]->lotnum,$ide ]); else $db->insert(DB::raw("INSERT INTO inv_lot_loc_id VALUES(?,?,'*',?,?,?,0,0,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,0,'*',0,null)"),[ $inv[0]->lotnum,$ide,$inv[0]->customerid,$inv[0]->sku,$amount,date("Y-m-d H:i:s"),$who, date("Y-m-d H:i:s"),$who ]); $sql = <<getTrNumber(); $db->insert(DB::raw($sql),[ $trid,$asn->customerid,$asn->sku, $asn->asnno,$asn->asnlineno,$inv[0]->lotnum,$asn->fmlocation,$asn->plantoid,$asn->packid,$asn->uom,$amount,$amount,'99',date("Y-m-d H:i:s"),$who, date("Y-m-d H:i:s"),$who,date("Y-m-d H:i:s"),$asn->customerid,$asn->sku,$ide,$who,$asn->packid,$asn->uom,$amount,$amount,$inv[0]->lotnum, '*','0','N','*',$asn->taskid_sequence,$asn->warehouseid,$asn->userdefine1,$asn->userdefine2, $asn->userdefine3,$asn->userdefine4,$asn->userdefine5,'O' ]); $this->setTrNumber(); $sql = <<update(DB::raw($sql),[ $ide,$ide,$trid,$who,date("Y-m-d H:i:s"),$who,date("Y-m-d H:i:s"),date("Y-m-d H:i:s"),$who,$asn->taskid,$asn->taskid_sequence ]); }); //成功后应去修改ASN状态及数量 暂时不知上架后ASN应为状态 /* $sql = <<expectedqty>$asn->receivedqty && $asn->linestatus!='30')DB::connection("oracle")->update(DB::raw($sql),['30',date("Y-m-d H:i:s"),$who,$asn->asnno,$asn->asnlineno]); if ($asn->expectedqty==$asn->receivedqty && $asn->linestatus=='40'){ //DB::connection("oracle")->update(DB::raw($sql),['40',date("Y-m-d H:i:s"),$who,$asn->asnno,$asn->asnlineno]); $check = DB::connection("oracle")->selectOne(DB::raw("SELECT 1 FROM DOC_ASN_DETAILS WHERE ASNNO = ? AND LINESTATUS != '40'"),[$asn->asnno]); if (!$check){ $logs = DB::connection("oracle")->select(DB::raw("SELECT SUM(FMQTY) qty,TRANSACTIONTYPE FROM ACT_TRANSACTION_LOG WHERE DOCNO = ? AND TRANSACTIONTYPE IN ('PA','IN') GROUP BY TRANSACTIONTYPE"),[$asn->asnno]); $paQty = 0; $inQty = 0; foreach ($logs as $log){ if ($log->transactiontype == 'IN')$inQty = $log->qty; else $paQty = $log->qty; } if ($paQty == $inQty){ DB::connection("oracle")->update(DB::raw("UPDATE DOC_ASN_HEADER SET asnstatus = '99',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"), [date("Y-m-d H:i:s"),$who,$asn->asnno]); DB::connection("oracle")->update(DB::raw("UPDATE DOC_ASN_DETAILS SET linestatus = '99',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"), [date("Y-m-d H:i:s"),$who,$asn->asnno]); } } } } /** * @param Integer[] $nums * @param Integer $target * @return Integer[]|null */ function twoSum($nums, $target) { $map=[]; for($i=0;$iselect("value")->where("name","flux_tr_number")->first(); if (!$val)$val = ValueStore::query()->create(["name"=>"flux_tr_number","value"=>'0']); $max = $val->value+1; $number = sprintf("%09d", $max); return 'W'.$number; } function setTrNumber() { ValueStore::query()->select("value")->where("name","flux_tr_number")->update(["value"=>DB::raw("flux_tr_number+1")]); } /** * 重置缓存架指定格口 */ public function resetCacheShelf() { $boxes = request("boxes"); //清理任务 $data = ''; $station = Station::query()->select("id")->whereIn("code",$boxes); $occupy = Storage::query()->with("station:id,code")->whereIn("station_id",$station)->where("status",1)->get(); foreach ($occupy as $item){ unset($boxes[array_search($item->station->code,$boxes)]); $data .= '“'.$item->station->code.'”,'; } if ($occupy->count()>0){ $data .= "存在任务待处理,无法释放"; $boxes = array_values($boxes); $station = Station::query()->select("id")->whereIn("code",$boxes); } $task = StationTask::query()->select("id")->where("status","!=",'完成')->whereIn("station_id",$station); StationTaskMaterialBox::query()->where("status","!=",'完成')->whereIn("station_task_id",$task)->update([ "status" => "完成" ]); StationTask::query()->where("status","!=",'完成')->whereIn("station_id",$station)->update([ "status" => "完成" ]); //重新调取料箱 app("ForeignHaiRoboticsService")->paddingCacheShelf($station->get()); $this->success(["data"=>$data,"boxes"=>$boxes]); } }