Zhouzhendong 4 anni fa
parent
commit
af6e73249b

+ 5 - 17
app/Http/Controllers/StorageController.php

@@ -30,7 +30,7 @@ class StorageController extends Controller
         if (!$asn || !$ide || !$barCode || !$amount)$this->error("信息不完整");
         $fromLocation = app("MaterialBoxService")->getBoxLocation($ide);
         if (!$fromLocation)$this->error("WAS无此库位信息");
-        $box = MaterialBox::query()->select("id")->where("code",$ide)->first();
+        $box = MaterialBox::query()->where("code",$ide)->first();
         if (!$box)$this->error("WAS无此料箱");
 
         //库存相关信息
@@ -85,14 +85,8 @@ class StorageController extends Controller
      */
     public function checkMaximum()
     {
-        $item = StoreItem::query()->whereHas("store",function (Builder $query){
-            $query->where("asn_code",request("asn"));
-        })->whereHas("commodity",function (Builder $query){
-            $query->whereHas("barcodes",function (Builder $query){
-                $query->where("code",request("barCode"));
-            });
-        })->first();
-        if (!$item)$this->error("WAS无此单据记录");
+        $item = app("StoreItemService")->getMaxAvailableDetail(request("asn"),request("barCode"));
+        if (!$item)$this->error("无此单据记录");
         $models = CommodityMaterialBoxModel::query()->where("commodity_id",$item->commodity_id)->get();
         if ($models->count()==0)$this->error("商品首入,请使用缓存架空箱入库");
         foreach ($models as $model){
@@ -145,14 +139,8 @@ class StorageController extends Controller
             $boxId = null;
             //料箱存在且不可用
             $models = CommodityMaterialBoxModel::query()->where("commodity_id",request("commodity_id"))->get();
-            $item = StoreItem::query()->whereHas("store",function (Builder $query){
-                $query->where("asn_code",request("asn"));
-            })->whereHas("commodity",function (Builder $query){
-                $query->whereHas("barcodes",function (Builder $query){
-                    $query->where("code",request("barCode"));
-                });
-            })->first();
-            if (!$item)$this->error("WAS无此单据记录");
+            $item = app("StoreItemService")->getMaxAvailableDetail(request("asn"),request("barCode"));
+            if (!$item)$this->error("无此单据记录");
             foreach ($models as $model){
                 //料箱不可用寻找新料箱
                 $result = app("StorageService")->getHalfBoxLocation($model,$item,request("asn"),$blacklist);

+ 50 - 7
app/Http/Controllers/TestController.php

@@ -6,6 +6,7 @@ use App\Authority;
 use App\Batch;
 use App\City;
 use App\Commodity;
+use App\CommodityMaterialBoxModel;
 use App\Components\AsyncResponse;
 use App\Console\Commands\CreateOwnerAreaReport;
 use App\Console\Commands\CreateOwnerBillReport;
@@ -142,13 +143,55 @@ class TestController extends Controller
     }
     public function test()
     {
-        ini_set('max_execution_time', 0);
-        Order::query()->whereBetween("wms_edittime",["2021-06-01 00:00:00","2021-06-30 23:59:59"])
-            ->whereNotIn("id",OwnerFeeDetail::query()->select("outer_id")
-                ->whereBetween("worked_at",["2021-06-01 00:00:00","2021-06-30 23:59:59"])
-                ->where("outer_table_name","orders"))->get()->each(function ($order){
-                dispatch(new OrderCreateInstantBill($order));
-            });
+        $asn = "ASN2107011344";
+        $barCode = "XUNI03";
+        $item = app("StoreItemService")->getMaxAvailableDetail($asn,$barCode);
+        if (!$item)$this->error("无此单据记录");
+        $blacklist = [];
+        $model = CommodityMaterialBoxModel::query()->where("commodity_id",505012)->first();
+        $query = \App\Storage::query()->with("materialBox")->whereHas("materialBox",function (Builder $query)use($model){
+            $query->where("material_box_model_id",$model->material_box_model_id);
+        })->where("commodity_id",$model->commodity_id)->where("amount","<",$model->maximum)
+            ->where("status",0)->where(DB::raw("{$model->maximum}-amount"),">",0);
+        if ($blacklist)$query->whereHas("materialBox",function (Builder $query)use($blacklist){
+            $query->whereNotIn("id",$blacklist);
+        });
+        $query->get()->each(function ($storage)use(&$boxCodes,&$map){
+            $boxCodes .= "'".$storage->materialBox->code."',";
+            $map[$storage->materialBox->code] = $storage;
+        });
+        //不存在跳出
+        if (!$boxCodes)return null;
+        $boxCodes = mb_substr($boxCodes,0,-1);
+        //查询对应asn detail
+        $detail = DB::connection("oracle")->selectOne(DB::raw("SELECT * FROM DOC_ASN_DETAILS WHERE ASNNO = ? AND ASNLINENO = ?"),[
+            $asn,$item->asn_line_code
+        ]);
+        if(!$detail)return null;
+        $detail = get_object_vars($detail);
+        //查询对应批次属性
+        $lot = DB::connection("oracle")->selectOne(DB::raw("SELECT * FROM BAS_LOTID WHERE LOTID = (SELECT LOTID FROM BAS_SKU WHERE CUSTOMERID = ? AND SKU = ?)"),[
+            $detail["customerid"],$detail["sku"]
+        ]);
+        if(!$lot)return null;
+        //通过符合条件的批次号来查询 库存
+        $lot = get_object_vars($lot);
+        $sql = <<<sql
+SELECT * FROM INV_LOT_LOC_ID WHERE LOTNUM IN
+ (SELECT LOTNUM FROM INV_LOT_ATT WHERE INV_LOT_ATT.CUSTOMERID = ? AND SKU = ?
+sql;
+        //拼接可以合并的批次属性要求
+        for ($i=1;$i<=8;$i++){
+            if ($lot["lotkey0{$i}"]=='Y'){
+                $val = $detail["lotatt0{$i}"] ? "'{$detail["lotatt0{$i}"]}'" : null;
+                $sql .= " AND LOTATT0{$i} = $val";
+            }
+        }
+        $sql .= ") AND LOCATIONID IN ({$boxCodes}) AND TRACEID = '*' AND {$model->maximum}-QTY > 0 ORDER BY {$model->maximum}-QTY";
+        $res = DB::connection("oracle")->selectOne(DB::raw($sql),[
+            $detail["customerid"],$detail["sku"]
+        ]);
+        return $res ? $map[$res->locationid] : null;
     }
     public function orderCreateBill()
     {

+ 12 - 15
app/Services/StorageService.php

@@ -450,7 +450,7 @@ sql;
             $sql = <<<sql
 INSERT INTO ACT_TRANSACTION_LOG VALUES(?,'PA',?,?,?,?,'ASN',?,?,?,?,?,?,?,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,
 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,null,?,null)
+?,?,?,?,?,'N',null,?,?,?,?,null,null,?,null,null)
 sql;
             list($trid,$max) = $this->getTrNumber();
             $db->insert(DB::raw($sql),[
@@ -462,13 +462,13 @@ sql;
             ]);
             $this->setTrNumber($max);
             $sql = <<<sql
-update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,FMID = '*'
+update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,FMID = '*',
 COMPLETED_TRANSACTIONID = ?,OPENWHO = ?,OPENTIME = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),
  CLOSEWHO = ?,CLOSETIME = ?,EDITTIME = ?,EDITWHO = ?
  where taskid = ? AND TASKID_SEQUENCE = ?
 sql;
             $db->update(DB::raw($sql),[
-                $ide,'0',$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
+                $ide,'0',$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,$task->taskid,$task->taskid_sequence
             ]);
             $task->who = $who;
             $this->checkAsn($task);
@@ -644,27 +644,24 @@ SQL;
      */
     public function getHalfBoxLocation(CommodityMaterialBoxModel $model,StoreItem $item,?string $asn = null,array $blacklist = []):?Storage
     {
-        if (!$asn){
-            $item->loadMissing("store");
-            $asn = $item->store->asn_code;
-        }
-        $stationCodes = '';//拼接库位编码
+        if (!$asn){$item->loadMissing("store");$asn = $item->store->asn_code;}
+        $boxCodes = '';//拼接料箱编码
         $map = [];//库位与库存映射
         //查询填充
-        $query = Storage::query()->with("station")->whereHas("materialBox",function (Builder $query)use($model){
+        $query = Storage::query()->with("materialBox")->whereHas("materialBox",function (Builder $query)use($model){
             $query->where("material_box_model_id",$model->material_box_model_id);
         })->where("commodity_id",$model->commodity_id)->where("amount","<",$model->maximum)
             ->where("status",0)->where(DB::raw("{$model->maximum}-amount"),">",0);
         if ($blacklist)$query->whereHas("materialBox",function (Builder $query)use($blacklist){
            $query->whereNotIn("id",$blacklist);
         });
-        $query->get()->each(function ($storage)use(&$stationCodes,&$map){
-            $stationCodes .= "'".$storage->station->code."',";
-            $map[$storage->station->code] = $storage;
+        $query->get()->each(function ($storage)use(&$boxCodes,&$map){
+            $boxCodes .= "'".$storage->materialBox->code."',";
+            $map[$storage->materialBox->code] = $storage;
         });
         //不存在跳出
-        if (!$stationCodes)return null;
-        $stationCodes = mb_substr($stationCodes,0,-1);
+        if (!$boxCodes)return null;
+        $boxCodes = mb_substr($boxCodes,0,-1);
         //查询对应asn detail
         $detail = DB::connection("oracle")->selectOne(DB::raw("SELECT * FROM DOC_ASN_DETAILS WHERE ASNNO = ? AND ASNLINENO = ?"),[
             $asn,$item->asn_line_code
@@ -689,7 +686,7 @@ sql;
                 $sql .= " AND LOTATT0{$i} = $val";
             }
         }
-        $sql .= ") AND LOCATIONID IN ({$stationCodes}) AND TRACEID = '*' AND {$model->maximum}-QTY > 0 ORDER BY {$model->maximum}-QTY";
+        $sql .= ") AND LOCATIONID IN ({$boxCodes}) AND TRACEID = '*' AND {$model->maximum}-QTY > 0 ORDER BY {$model->maximum}-QTY";
         $res = DB::connection("oracle")->selectOne(DB::raw($sql),[
             $detail["customerid"],$detail["sku"]
         ]);

+ 28 - 0
app/Services/StoreItemService.php

@@ -9,6 +9,9 @@ use App\Services\common\DataHandlerService;
 use App\Store;
 use App\StoreItem;
 use App\Traits\ServiceAppAop;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\DB;
 
 
 class StoreItemService
@@ -258,4 +261,29 @@ class StoreItemService
             LogService::log(__METHOD__, __FUNCTION__, '删除多余StoreItems error' . count($delete_storeItems) . json_encode($delete_storeItems) . $e->getMessage() . $e->getTraceAsString(), null);
         }
     }
+
+    /**
+     * 获取最大可上架数的详情项
+     *
+     * @param string $asn
+     * @param string $barCode
+     *
+     * @return StoreItem|Model|null
+     */
+    public function getMaxAvailableDetail(string $asn,string $barCode):?StoreItem
+    {
+        $sql = <<<SQL
+SELECT DOC_ASN_DETAILS.ASNLINENO,SUM(TSK_TASKLISTS.FMQTY) 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
+LEFT JOIN BAS_SKU ON DOC_ASN_DETAILS.SKU = BAS_SKU.SKU AND DOC_ASN_DETAILS.CUSTOMERID = BAS_SKU.CUSTOMERID
+WHERE DOC_ASN_DETAILS.ASNNO = ? AND DOC_ASN_DETAILS.LINESTATUS IN ('30','40')
+  AND (BAS_SKU.ALTERNATE_SKU1 = ? OR ALTERNATE_SKU2 = ? AND ALTERNATE_SKU3 = ?)
+  AND TSK_TASKLISTS.TASKTYPE = 'PA' AND TASKPROCESS = '00'
+GROUP BY (DOC_ASN_DETAILS.ASNLINENO,DOC_ASN_DETAILS.ASNNO) ORDER BY QTY DESC
+SQL;
+        $detail = DB::connection("oracle")->selectOne(DB::raw($sql),[$asn,$barCode,$barCode,$barCode]);
+        if (!$asn)return null;
+        return StoreItem::query()->whereHas("store",function (Builder $query)use($asn){
+            $query->where("asn_code",$asn);
+        })->where("asn_line_code",$detail->asnlineno)->first();
+    }
 }