|
|
@@ -2,6 +2,7 @@
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
+use App\CommodityBarcode;
|
|
|
use App\OracleBasCode;
|
|
|
use App\OracleBasSKU;
|
|
|
use App\OracleDOCASNDetail;
|
|
|
@@ -10,6 +11,7 @@ use App\OracleInvLotAtt;
|
|
|
use App\Traits\ServiceAppAop;
|
|
|
use App\ValueStore;
|
|
|
use Carbon\Carbon;
|
|
|
+use Doctrine\DBAL\Schema\AbstractAsset;
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
@@ -29,19 +31,38 @@ class HandInStorageService
|
|
|
*/
|
|
|
public function selectAsn($asn)
|
|
|
{
|
|
|
- if ($asn) return OracleDOCASNHeader::query()
|
|
|
- ->with('asnStatus')
|
|
|
+ if (!$asn) return OracleDOCASNHeader::query()
|
|
|
->select(['asnno','asnreference1','asnstatus','addtime','customerid'])
|
|
|
- ->where('asnno',$asn)
|
|
|
- ->get();
|
|
|
-
|
|
|
- return OracleDOCASNHeader::query()
|
|
|
- ->select(['asnno','asnreference1','asnstatus','addtime','customerid'])
|
|
|
- ->with('asnStatus')
|
|
|
->where('asnstatus','00')
|
|
|
->orderByDesc('addtime')
|
|
|
->limit(50)
|
|
|
->get();
|
|
|
+
|
|
|
+ if ($asn && strpos(strtoupper($asn),'ASN')!==false){
|
|
|
+ return OracleDOCASNHeader::query()
|
|
|
+ ->select(['asnno','asnreference1','asnstatus','addtime','customerid'])
|
|
|
+ ->where('asnno',$asn)
|
|
|
+ ->get();
|
|
|
+ }else {
|
|
|
+ $asns=OracleDOCASNHeader::query()
|
|
|
+ ->select(['asnno','asnreference1','asnstatus','addtime','customerid'])
|
|
|
+ ->where('customerid',strtoupper($asn))
|
|
|
+ ->whereIn('asnstatus',['00','30'])
|
|
|
+ ->get();
|
|
|
+ if ($asns->count()>0){
|
|
|
+ return $asns;
|
|
|
+ }else{
|
|
|
+ $sql = <<<SQL
|
|
|
+ SELECT DOC_ASN_HEADER.ASNNO,DOC_ASN_HEADER.addtime,DOC_ASN_HEADER.asnreference1,DOC_ASN_HEADER.customerid,DOC_ASN_HEADER.asnstatus FROM DOC_ASN_HEADER
|
|
|
+ LEFT JOIN DOC_ASN_DETAILS ON DOC_ASN_HEADER.ASNNO = DOC_ASN_DETAILS.ASNNO
|
|
|
+ LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID AND DOC_ASN_DETAILS.SKU = BAS_SKU.SKU
|
|
|
+WHERE DOC_ASN_HEADER.ASNSTATUS in ('00','30') and (BAS_SKU.ALTERNATE_SKU1 = ? OR BAS_SKU.ALTERNATE_SKU2 = ? OR BAS_SKU.ALTERNATE_SKU3 = ?)
|
|
|
+group by DOC_ASN_HEADER.ASNNO,DOC_ASN_HEADER.addtime,DOC_ASN_HEADER.asnreference1,DOC_ASN_HEADER.customerid,DOC_ASN_HEADER.asnstatus
|
|
|
+SQL;
|
|
|
+ return DB::connection("oracle")->select(DB::raw($sql),[$asn,$asn,$asn]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -51,24 +72,38 @@ class HandInStorageService
|
|
|
*/
|
|
|
public function selectAsnDetails($asnno)
|
|
|
{
|
|
|
- return OracleDOCASNDetail::query()
|
|
|
- ->select(['sku','expectedqty','skudescrc','asnlineno','asnno','receivedqty'])
|
|
|
- ->where('asnno',$asnno)
|
|
|
- ->get();
|
|
|
+ $sql = <<<sql
|
|
|
+ SELECT DOC_ASN_DETAILS.sku,DOC_ASN_DETAILS.expectedqty,DOC_ASN_DETAILS.skudescrc,DOC_ASN_DETAILS.asnlineno,DOC_ASN_DETAILS.asnno,
|
|
|
+ DOC_ASN_DETAILS.receivedqty,BAS_SKU.alternate_sku1
|
|
|
+FROM DOC_ASN_DETAILS LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID AND DOC_ASN_DETAILS.SKU = BAS_SKU.SKU
|
|
|
+WHERE asnno = ? AND linestatus IN ('00','30')
|
|
|
+sql;
|
|
|
+ $asn_details = DB::connection("oracle")->select(DB::raw($sql),[$asnno]);
|
|
|
+ if (count($asn_details)>0)return $asn_details;
|
|
|
+ else return array();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param $asnno
|
|
|
- * @param $sku
|
|
|
+ * @param $skuOrBarcode
|
|
|
* @return Builder|Model|object|null
|
|
|
*
|
|
|
*/
|
|
|
- public function getAsnDetail($asnno,$sku)
|
|
|
+ public function getAsnDetail($asnno,$skuOrBarcode)
|
|
|
{
|
|
|
- return OracleDOCASNDetail::query()
|
|
|
+ $sql = <<<sql
|
|
|
+SELECT DOC_ASN_DETAILS.sku,DOC_ASN_DETAILS.expectedqty,DOC_ASN_DETAILS.skudescrc,
|
|
|
+ DOC_ASN_DETAILS.asnlineno,DOC_ASN_DETAILS.asnno,DOC_ASN_DETAILS.receivedqty FROM DOC_ASN_DETAILS
|
|
|
+ LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID AND DOC_ASN_DETAILS.SKU = BAS_SKU.SKU
|
|
|
+WHERE ASNNO = ? AND LINESTATUS IN ('00','30') AND (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? OR ALTERNATE_SKU3 = ?)
|
|
|
+sql;
|
|
|
+ $asn_detail = DB::connection("oracle")->selectOne(DB::raw($sql),[$asnno,$skuOrBarcode,$skuOrBarcode,$skuOrBarcode]);
|
|
|
+ if ($asn_detail)return $asn_detail;
|
|
|
+ else return OracleDOCASNDetail::query()
|
|
|
->select(['sku','expectedqty','skudescrc','asnlineno','asnno','receivedqty'])
|
|
|
->where('asnno',$asnno)
|
|
|
- ->where('sku',$sku)
|
|
|
+ ->where('sku',$skuOrBarcode)
|
|
|
+ ->whereIn('linestatus',['00','30'])
|
|
|
->first();
|
|
|
}
|
|
|
|
|
|
@@ -115,8 +150,88 @@ class HandInStorageService
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @param string $barCode
|
|
|
+ * @return array
|
|
|
+ * 根据商品条码 获取完全收货状态 部分收货状态的 PA任务
|
|
|
+ */
|
|
|
+ public function getTsk(string $trackNumber,string $barCode): array
|
|
|
+ {
|
|
|
+ $sql = <<<sql
|
|
|
+SELECT TSK_TASKLISTS.CustomerID,TSK_TASKLISTS.Sku,TSK_TASKLISTS.PlanToLotNum,TSK_TASKLISTS.PlanToID,DOC_ASN_DETAILS.SKUDESCRC,sum(TSK_TASKLISTS.PlanToQty) AS QTY
|
|
|
+FROM DOC_ASN_DETAILS
|
|
|
+ LEFT JOIN TSK_TASKLISTS ON DOC_ASN_DETAILS.ASNNO = TSK_TASKLISTS.DOCNO AND
|
|
|
+ DOC_ASN_DETAILS.ASNLINENO = TSK_TASKLISTS.DOCLINENO
|
|
|
+WHERE
|
|
|
+ ASNNO in (SELECT asnno FROM DOC_ASN_DETAILS
|
|
|
+ LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID AND DOC_ASN_DETAILS.SKU = BAS_SKU.SKU
|
|
|
+ WHERE LINESTATUS in ('30','40') and (ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? OR ALTERNATE_SKU3 = ?))
|
|
|
+ AND TSK_TASKLISTS.TASKPROCESS = '00'
|
|
|
+ AND TSK_TASKLISTS.TASKTYPE = 'PA'
|
|
|
+ AND TSK_TASKLISTS.PlanToID= ?
|
|
|
+ group by TSK_TASKLISTS.CustomerID,TSK_TASKLISTS.Sku,TSK_TASKLISTS.PlanToLotNum,TSK_TASKLISTS.PlanToID,DOC_ASN_DETAILS.SKUDESCRC
|
|
|
+sql;
|
|
|
+ $tasks = DB::connection("oracle")->select(DB::raw($sql),[$barCode,$barCode,$barCode,$trackNumber]);
|
|
|
+ if (!$tasks)return [];
|
|
|
+ else return $tasks;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @throws \Throwable
|
|
|
+ * flux手持端 上架
|
|
|
+ */
|
|
|
+ public function fluxHandPa(array $info, array $taskParam): bool
|
|
|
+ {
|
|
|
+ $tasks=$this->selectFluxTask($taskParam,$info['amount']);
|
|
|
+// dd($tasks);
|
|
|
+ if (!$tasks)return false; //获取任务失败
|
|
|
+ return DB::connection("oracle")->transaction(function ()use($tasks,$info){ //单体嵌套事务 回滚FLUX失败任务
|
|
|
+ foreach ($tasks as $task){
|
|
|
+ if (!app("StorageService")->fluxPA($task,$info['location'])){
|
|
|
+ DB::connection("oracle")->rollBack();
|
|
|
+ return false; //上架失败
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true; //上架成功
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param $taskParam
|
|
|
+ * @param $amount
|
|
|
+ * @return array
|
|
|
+ * 根据跟踪号,货主,sku,批次 获取任务列表 再通过数量 进行任务的重组(拆分或选定)
|
|
|
+ */
|
|
|
+ public function selectFluxTask($taskParam,$amount): array
|
|
|
+ {
|
|
|
+ /** @var StorageService $storageService */
|
|
|
+ $storageService=app('StorageService');
|
|
|
+ $sql = <<<sql
|
|
|
+select * from TSK_TASKLISTS where customerid = ? AND sku = ? AND plantoid = ? AND plantolotnum = ? AND TASKPROCESS = '00' AND TASKTYPE = 'PA'
|
|
|
+sql;
|
|
|
+ $tasks = DB::connection("oracle")->select(DB::raw($sql),[$taskParam['customerid'],$taskParam['sku'],$taskParam['plantoid'],$taskParam['plantolotnum']]);
|
|
|
+ if (!$tasks)return [];
|
|
|
+ $nums = [];
|
|
|
+ $sum = 0;
|
|
|
+ $maxIndex = null;
|
|
|
+ foreach ($tasks as $i => $task){
|
|
|
+ if ((int)$task->fmqty == $amount)return [$task];
|
|
|
+ $nums[] = (int)$task->fmqty;
|
|
|
+ $sum += (int)$task->fmqty;
|
|
|
+ if ((int)$task->fmqty>$amount)$maxIndex = $i;
|
|
|
+ }
|
|
|
+ if ($sum<$amount)return []; //上架数大于入库数
|
|
|
+ $result = $storageService->getMatch($nums,$amount);
|
|
|
+ if (!$result)return $storageService->splitTask($tasks,$maxIndex,$amount);
|
|
|
+ $arr = [];
|
|
|
+ foreach ($result as $index)$arr[] = $tasks[$index];
|
|
|
+ return $arr;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* @throws \Throwable
|
|
|
+ * fulx 手持收货
|
|
|
*/
|
|
|
public function fluxHandIn(array $info)
|
|
|
{
|
|
|
@@ -135,10 +250,16 @@ class HandInStorageService
|
|
|
return DB::connection("oracle")->transaction(function ()use ($info,$invlotatt,$who,$time){
|
|
|
//flux 批次号
|
|
|
$lotNum=$this->getOrCreateLotNum($info,$invlotatt,$who,$time);
|
|
|
- if (!$lotNum) return false;
|
|
|
+ if (!$lotNum){
|
|
|
+ DB::connection("oracle")->rollBack();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
//flux 创建入库事务
|
|
|
$actTransactionLog=$this->setFluxActTransactionLog($info,$lotNum,$who,$time);
|
|
|
- if (!$actTransactionLog)return false;
|
|
|
+ if (!$actTransactionLog){
|
|
|
+ DB::connection("oracle")->rollBack();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
//flux 创建上架任务
|
|
|
$this->setFluxTskTaskListPA($info,$invlotatt, $actTransactionLog, $who, $time);
|
|
|
//flux 完善库存余量
|
|
|
@@ -169,14 +290,15 @@ class HandInStorageService
|
|
|
$asnDetail['customerid']==$info['customerid'] &&
|
|
|
$asnDetail['sku']==$info['sku']) $receiveAsn=$asnDetail;
|
|
|
}
|
|
|
+// dd($receiveAsn);
|
|
|
return $db->transaction(function ()use($db,$info,$receiveAsn,$invlotatt,$time,$who,$asn){
|
|
|
if ($receiveAsn && (int)$receiveAsn['receivedqty']+(int)$info['amount']<(int)$receiveAsn['expectedqty']){
|
|
|
//asn_detail 收货数量+已收数量<预期数量
|
|
|
$db->update(DB::raw("UPDATE DOC_ASN_DETAILS SET receivedqty = receivedqty + ?,receivedqty_each = receivedqty_each + ?,linestatus = '30',holdrejectcode ='OK',
|
|
|
reserve_flag ='Y',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),receivedtime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ?,
|
|
|
- lotatt01 =?,lotatt02 =?,lotatt03 =?,lotatt04 =?,lotatt05 =?,lotatt06 =?,lotatt07 =?,lotatt08=? WHERE asnno = ?"),
|
|
|
+ lotatt01 =?,lotatt02 =?,lotatt03 =?,lotatt04 =?,lotatt05 =?,lotatt06 =?,lotatt07 =?,lotatt08=? WHERE asnno = ? and asnlineno = ?"),
|
|
|
[(int)$info['amount'],(int)$info['amount'],$time,$time,$who,$invlotatt['lotatt01'],$invlotatt['lotatt02'],$invlotatt['lotatt03'],$invlotatt['lotatt04'],
|
|
|
- $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$info['asnno']]);
|
|
|
+ $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$info['asnno'],$info['asnlineno']]);
|
|
|
//asn_header 部分收货状态
|
|
|
$db->update(DB::raw("UPDATE DOC_ASN_HEADER SET asnstatus = '30',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"),
|
|
|
[$time,$who,$info['asnno']]);
|
|
|
@@ -184,13 +306,17 @@ class HandInStorageService
|
|
|
//asn_detail 收货数量+已收数量=预期数量
|
|
|
$db->update(DB::raw("UPDATE DOC_ASN_DETAILS SET receivedqty=receivedqty+?,receivedqty_each=receivedqty_each+?,linestatus = '40',
|
|
|
edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),receivedtime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ?,holdrejectcode='OK',
|
|
|
- reserve_flag='Y',lotatt01=?,lotatt02=?,lotatt03=?,lotatt04=?,lotatt05=?,lotatt06=?,lotatt07=?,lotatt08=? WHERE asnno = ?"),
|
|
|
+ reserve_flag='Y',lotatt01=?,lotatt02=?,lotatt03=?,lotatt04=?,lotatt05=?,lotatt06=?,lotatt07=?,lotatt08=? WHERE asnno = ? and asnlineno = ?"),
|
|
|
[(int)$info['amount'],(int)$info['amount'],$time,$time,$who,$invlotatt['lotatt01'],$invlotatt['lotatt02'],$invlotatt['lotatt03'],$invlotatt['lotatt04'],
|
|
|
- $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$info['asnno']]);
|
|
|
+ $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$info['asnno'],$info['asnlineno']]);
|
|
|
//当asn_detail 所有状态都为完全收货是 asn_header 状态修改为 完全收货(asnstatus=40)
|
|
|
if (OracleDOCASNDetail::query()->where('asnno',$info['asnno'])->where('linestatus',40)->count()==$asn->asn_details_count){
|
|
|
$db->update(DB::raw("UPDATE DOC_ASN_HEADER SET asnstatus = '40',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"),
|
|
|
[$time,$who,$info['asnno']]);
|
|
|
+ }else {
|
|
|
+ //asn_header 部分收货状态
|
|
|
+ $db->update(DB::raw("UPDATE DOC_ASN_HEADER SET asnstatus = '30',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"),
|
|
|
+ [$time,$who,$info['asnno']]);
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
@@ -348,7 +474,7 @@ sql;
|
|
|
* 获取批次号
|
|
|
* @return array
|
|
|
*/
|
|
|
- private function getLtNum()
|
|
|
+ private function getLtNum(): array
|
|
|
{
|
|
|
$val = ValueStore::query()->select("value")->where("name","flux_lt_number")->lockForUpdate()->first();
|
|
|
if (!$val)$val = ValueStore::query()->create(["name"=>"flux_lt_number","value"=>'0']);
|
|
|
@@ -371,7 +497,7 @@ sql;
|
|
|
* 获取批次号
|
|
|
* @return array
|
|
|
*/
|
|
|
- private function getTsNum()
|
|
|
+ private function getTsNum(): array
|
|
|
{
|
|
|
$val = ValueStore::query()->select("value")->where("name","flux_ts_number")->lockForUpdate()->first();
|
|
|
if (!$val)$val = ValueStore::query()->create(["name"=>"flux_ts_number","value"=>'0']);
|