|
|
@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
|
|
use App\Components\AsyncResponse;
|
|
|
use App\MaterialBox;
|
|
|
use App\Services\LogService;
|
|
|
+use App\ValueStore;
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
@@ -17,7 +18,7 @@ class StorageController extends Controller
|
|
|
$asn = \request("asn");
|
|
|
$ide = \request("ide");
|
|
|
$barCode = \request("barCode");
|
|
|
- $amount = \request("amount");
|
|
|
+ $amount = (int)\request("amount");
|
|
|
//check info
|
|
|
if (!$asn || !$ide || !$barCode || !$amount)$this->error("信息不完整");
|
|
|
$fromLocation = 'HAIB1-03-03';//app("MaterialBoxService")->getBoxLocation($ide);
|
|
|
@@ -30,12 +31,41 @@ class StorageController extends Controller
|
|
|
SELECT * FROM DOC_ASN_DETAILS LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID AND DOC_ASN_DETAILS.SKU = BAS_SKU.SKU
|
|
|
LEFT JOIN TSK_TASKLISTS ON DOC_ASN_DETAILS.ASNNO = TSK_TASKLISTS.DOCNO AND DOC_ASN_DETAILS.ASNLINENO = TSK_TASKLISTS.DOCLINENO
|
|
|
WHERE ASNNO = ? AND (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? OR ALTERNATE_SKU3 = ?) AND RECEIVEDQTY >= ?
|
|
|
- AND TASKPROCESS = '00' AND TASKTYPE = 'PA' AND FMQTY = ?
|
|
|
+ AND TASKPROCESS = '00' AND TASKTYPE = 'PA'
|
|
|
sql;
|
|
|
- $asn = DB::connection("oracle")->selectOne(DB::raw($sql),[$asn,$barCode,$barCode,$barCode,$amount,(int)$amount]);
|
|
|
- if (!$asn)$this->error("ASN不存在或上架数量与入库数量不符");
|
|
|
+ $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 = <<<sql
|
|
|
SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND traceid = ? AND customerid= ? and sku = ?
|
|
|
sql;
|
|
|
@@ -59,7 +89,7 @@ sql;
|
|
|
$qty = $qty-$in->qty;
|
|
|
}
|
|
|
}
|
|
|
- $db->delete(DB::raw("DELETE FROM inv_lot_loc_id WHERE lotnum = ? AND traceid = ? AND traceid != '*'"),[
|
|
|
+ $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"),[
|
|
|
@@ -78,7 +108,7 @@ INSERT INTO ACT_TRANSACTION_LOG VALUES(?,'PA',?,?,?,?,'ASN',?,?,?,?,?,?,?,?,TO_D
|
|
|
TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,?,null,null,null,'*',?,?,?,?,?,?,?,
|
|
|
?,?,?,?,?,'N',null,?,?,?,?,?,?,?,null,null)
|
|
|
sql;
|
|
|
- $trid = 'W'.date('ymd').substr(\request("asn"),-2).rand(0,9);
|
|
|
+ $trid = $this->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,
|
|
|
@@ -86,6 +116,7 @@ sql;
|
|
|
'*','0','N','*',$asn->taskid_sequence,$asn->warehouseid,$asn->userdefine1,$asn->userdefine2,
|
|
|
$asn->userdefine3,$asn->userdefine4,$asn->userdefine5,'O'
|
|
|
]);
|
|
|
+ $this->setTrNumber();
|
|
|
$sql = <<<sql
|
|
|
update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,
|
|
|
CREATE_TRANSACTIONID = ?,OPENWHO = ?,OPENTIME = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),
|
|
|
@@ -97,9 +128,9 @@ sql;
|
|
|
]);
|
|
|
});
|
|
|
//成功后应去修改ASN状态及数量 暂时不知上架后ASN应为状态
|
|
|
-/* $sql = <<<sql
|
|
|
-UPDATE doc_asn_details SET linestatus = ?,edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ? AND asnlineno = ?
|
|
|
-sql;*/
|
|
|
+ /* $sql = <<<sql
|
|
|
+ UPDATE doc_asn_details SET linestatus = ?,edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ? AND asnlineno = ?
|
|
|
+ sql;*/
|
|
|
//if ($asn->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]);
|
|
|
@@ -120,12 +151,36 @@ sql;*/
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- //呼叫海柔进行物理上架,无论是否成功 皆视为已上架,失败逻辑另行处理
|
|
|
- $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("上架失败,请联系管理员处理");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param Integer[] $nums
|
|
|
+ * @param Integer $target
|
|
|
+ * @return Integer[]|null
|
|
|
+ */
|
|
|
+ function twoSum($nums, $target) {
|
|
|
+ $map=[];
|
|
|
+ for($i=0;$i<count($nums);$i++){
|
|
|
+ $complement=$target-$nums[$i];
|
|
|
+ if(array_key_exists($complement,$map)){
|
|
|
+ return [$map[$complement],$i];
|
|
|
+ }
|
|
|
+ $map[$nums[$i]]=$i;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTrNumber()
|
|
|
+ {
|
|
|
+ $val = ValueStore::query()->select("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")]);
|
|
|
}
|
|
|
}
|