error("信息不完整"); $fromLocation = 'HAIB1-03-03';//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)$this->fluxPA($asns[$result],$ide,$amount); else{ $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); } }); } $this->success("OK"); //呼叫海柔进行物理上架,无论是否成功 皆视为已上架,失败逻辑另行处理 $result = app("ForeignHaiRoboticsService")->putWareHousing($fromLocation,'',$box->id); LogService::log(__CLASS__,$result ? "缓存架上架任务下达成功" : "缓存架上架任务下达失败",json_encode(request()->input())); if ($result){ app("CacheShelfService")->_stationCacheLightOn($fromLocation,$ide); //亮灯 $this->success(); }else $this->error("上架失败,请联系管理员处理"); } 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")]); } }