Sfoglia il codice sorgente

波次同步重复问题

Zhouzhendong 4 anni fa
parent
commit
dc3f3b5373

+ 2 - 8
app/Console/Commands/SyncBatchTask.php

@@ -2,8 +2,6 @@
 
 namespace App\Console\Commands;
 
-use App\Exceptions\ErrorException;
-use App\Exceptions\Exception;
 use App\Jobs\BatchTaskJob;
 use App\Order;
 use App\OrderBin;
@@ -157,7 +155,6 @@ sql;
         if (count($details) < 1)return;
         $map = [];
         $nos = [];
-        $ods = [];
         $orderCodes = [];
         $seqnos = [];
         $batchMapping = [];
@@ -166,7 +163,6 @@ sql;
             else {
                 $map[$detail->waveno] = [$detail->orderno];
                 $nos[] = $detail->waveno;
-                $ods[] = $detail->orderno;
             }
             $orderCodes[] = $detail->orderno;
             $seqnos[$detail->orderno] = $detail->seqno;
@@ -174,12 +170,14 @@ sql;
         }
         $orders = Order::query()->select("id","batch_id","code")->whereIn("code",$orderCodes)->get();
         if (count($orderCodes) != count($orders))LogService::log(__CLASS__,"格口号-订单存在差异",json_encode($orderCodes));
+        $existOrder = [];
         if ($orders){
             $orderIds = [];
             $orderMap = [];
             foreach ($orders as $order){
                 $orderIds[] = $order->id;
                 $orderMap[$order->id] = $seqnos[$order->code];
+                $existOrder[$order->code] = $order->batch_id;
             }
             $updateBin = [["id","number"]];
             $insertBin = [];
@@ -227,11 +225,7 @@ sql;
             $batches = $this->batchService->get(["code"=>$nos]);
         }
         $updateOrder = [["code","batch_id"]];
-        $existOrder = [];
         $updatingBatches = [];
-        foreach (Order::query()->select("code","batch_id")->whereNotNull("batch_id")->whereIn("code",$ods)->get() as $item){
-            $existOrder[$item->code] = $item->batch_id;
-        }
         foreach ($batches as $batch){
             $mark = false;
             foreach ($map[$batch->code] as $on){

+ 186 - 37
app/Http/Controllers/TestController.php

@@ -47,6 +47,7 @@ use App\ProcurementDeliverie;
 use App\ProcurementQuotation;
 use App\ProcurementTotalBill;
 use App\RejectedBillItem;
+use App\Services\BatchService;
 use App\Services\CacheService;
 use App\Services\CommodityService;
 use App\Services\common\BatchUpdateService;
@@ -180,52 +181,200 @@ class TestController extends Controller
         }
         return $wms_status;
     }
-    public function test()
-    {
-        $batches = Batch::query()->where("created_at",'>=',"2021-05-28 11:00:00")->get();
+    /** @var DocWaveHeaderService $service */
+    private $service;
+    /** @var BatchService $batchService */
+    private $batchService;
+
+    private function detailExe($details)
+    {
+        $this->service = app(DocWaveHeaderService::class);
+        $this->batchService = app(BatchService::class);
+        if (count($details) < 1)return;
+        $map = [];
+        $nos = [];
+        $orderCodes = [];
+        $seqnos = [];
+        $batchMapping = [];
+        foreach ($details as $detail){
+            if (isset($map[$detail->waveno]))$map[$detail->waveno][] = $detail->orderno;
+            else {
+                $map[$detail->waveno] = [$detail->orderno];
+                $nos[] = $detail->waveno;
+            }
+            $orderCodes[] = $detail->orderno;
+            $seqnos[$detail->orderno] = $detail->seqno;
+            $batchMapping[$detail->orderno] = $detail->waveno;
+        }
+        $orders = Order::query()->select("id","batch_id","code")->whereIn("code",$orderCodes)->get();
+        if (count($orderCodes) != count($orders))LogService::log(__CLASS__,"格口号-订单存在差异",json_encode($orderCodes));
+        if ($orders){
+            $orderIds = [];
+            $orderMap = [];
+            $existOrder = [];
+            foreach ($orders as $order){
+                $orderIds[] = $order->id;
+                $orderMap[$order->id] = $seqnos[$order->code];
+                $existOrder[$order->code] = $order->batch_id;
+            }
+            $updateBin = [["id","number"]];
+            $insertBin = [];
+            $deleteBin = [];
+            $orderBins = OrderBin::query()->select("id","order_id","number")->whereIn("order_id",$orderIds)->get();
+            foreach ($orderBins as $orderBin){
+                if (!isset($orderMap[$orderBin->order_id])){
+                    $deleteBin[] = $orderBin->id;
+                    continue;
+                }
+                if ($orderBin->number != $orderMap[$orderBin->order_id])$updateBin[]=["id"=>$orderBin->id,"number"=>$orderMap[$orderBin->order_id]];
+                unset($orderMap[$orderBin->order_id]);
+            }
+            $d = date('Y-m-d H:i:s');
+            foreach ($orderMap as $orderId=>$binNumber){
+                $insertBin[]=[
+                    "order_id"=>$orderId,
+                    "number"=>$binNumber,
+                    'created_at' => $d
+                ];
+            }
+            if (count($updateBin)>1){
+                app(BatchUpdateService::class)->batchUpdate("order_bins",$updateBin);
+                LogService::log(__METHOD__,"波次同步-更新订单格口号",json_encode($updateBin));
+            }
+            if ($insertBin){
+                OrderBin::query()->insert($insertBin);
+                LogService::log(__METHOD__,"波次同步-录入订单格口号",json_encode($insertBin));
+            }
+            if ($deleteBin){
+                OrderBin::destroy($deleteBin);
+                LogService::log(__METHOD__,"波次同步-删除订单格口号",json_encode($deleteBin));
+            }
+        }
+        $batches = $this->batchService->get(["code"=>$nos]);
+        $batchDiff = array_keys(array_flip(array_diff($nos,array_column($batches->toArray(),"code"))));
+        if (count($batchDiff)>0){
+            $sql = <<<sql
+SELECT * FROM DOC_WAVE_HEADER WHERE WAVENO IN (''
+sql;
+            foreach ($batchDiff as $bd)$sql .= ",'".$bd."'";
+            $sql .= ')';
+            $wmsBatches = DB::connection("oracle")->select(DB::raw($sql));
+            $this->headerExe($wmsBatches);
+            $batches = $this->batchService->get(["code"=>$nos]);
+        }
+        $updateOrder = [["code","batch_id"]];
+        $updatingBatches = [];
         foreach ($batches as $batch){
-            $code = $batch->code;
-            $wave = DB::connection("oracle")->selectOne(DB::raw("select * from DOC_WAVE_HEADER where WAVENO = ?"),[$code]);
-            if (!$wave){
-                $error[] = $code."FLUX无波次";
+            $mark = false;
+            foreach ($map[$batch->code] as $on){
+                if ((!isset($existOrder[$on])) || $existOrder[$on]!=$batch->id){
+                    $updateOrder[] = [
+                        "code"=>$on,
+                        "batch_id"=>$batch->id
+                    ];
+                    $mark = true;
+                }
+            }
+            if ($mark)$updatingBatches[] = $batch;
+            unset($map[$batch->code]);
+        }
+        if (count($updateOrder)>1){
+            app("OrderService")->batchUpdate($updateOrder);//反向修改订单
+            LogService::log(__METHOD__,"波次同步-修改订单波次号",json_encode($updateOrder));
+            app("BatchService")->checkBatchOrderInfo($updatingBatches);
+           dump($updatingBatches);
+        }
+        if ($map){
+            $waveCodes = array_keys($map);
+            $waves = $this->service->get(["waveno"=>$waveCodes],["waveno"=>"in"]);
+            $insert = [];
+            foreach ($waves as $wave){
+                $owner = app("OwnerService")->codeGetOwner($wave->customerid);
+                $insert[] = [
+                    "code" => $wave->waveno,
+                    "status" => '未处理',
+                    "wms_status" => $this->wms_status($wave),
+                    "wms_type"=>$wave->descr,
+                    "created_at"=>$wave->addtime,
+                    "updated_at"=>$wave->edittime,
+                    "owner_id"=>$owner->id,
+                ];
+            }
+            if ($insert){
+                $this->batchService->insert($insert);
+                LogService::log(__METHOD__,"SUCCESS-同步插入波次成功",json_encode($insert));
+                $batches = $this->batchService->get(["code"=>$waveCodes]);
+                foreach ($batches as $batch){
+                    app("OrderService")->update(["code"=>$map[$batch->code]],["batch_id"=>$batch->id]);
+                }
+                app("BatchService")->checkBatchOrderInfo($batches);
+
+            }
+        }
+        ValueStore::query()->where("name","wave_detail_last_sync_date")->update(["value"=>$details[count($details)-1]->edittime]);
+    }
+    private function headerExe($waves)
+    {
+        if (count($waves) < 1)return;
+        //获取本地数据对比差异
+        $codes = [];
+        foreach ($waves as $wave){
+            $codes[] = $wave->waveno;
+        }
+        $map = [];
+        $batches = $this->batchService->get(["code"=>$codes]);
+        if ($batches){
+            foreach ($batches as $index=>$batch)$map[$batch->code] = $index;
+        }
+        $update = [["id","wms_status","wms_type","updated_at"]];
+        $insert = [];
+
+        foreach ($waves as $wave){
+            if (isset($map[$wave->waveno])){
+                $bat = $batches[$map[$wave->waveno]];
+                $wms_status = $this->wms_status($wave);
+                if ($bat->wms_status != $wms_status || $bat->wms_type != $wave->descr){
+                    $update[] = [
+                        "id" => $bat->id,
+                        "wms_status" => $this->wms_status($wave),
+                        "wms_type"=>$wave->descr,
+                        "updated_at"=>$wave->edittime,
+                    ];
+                }
                 continue;
             }
             $owner = app("OwnerService")->codeGetOwner($wave->customerid);
-            $obj = [
-                "wms_status" => $this->wms_status($wave),
+            $insert[] = [
+                "code" => $wave->waveno,
                 "wms_type"=>$wave->descr,
-                "created_at"=>date("Y-m-d H:i:s"),
-                "wms_created_at"=>$wave->addtime,
+                "status" => '未处理',
+                "wms_status" => $this->wms_status($wave),
+                "created_at"=>$wave->addtime,
                 "updated_at"=>$wave->edittime,
                 "owner_id"=>$owner->id,
             ];
-            $wave = Batch::query()->where("code",$code)->first();
-            if (!$wave){
-                $error[] = $code."本地无波次";
-                $obj["code"] = $code;
-                $wave = Batch::query()->create($obj);
-            }else{
-                Batch::query()->where("code",$code)->update($obj);
-            }
-            $ordernos = array_column(DB::connection("oracle")->select(DB::raw("select orderno from DOC_WAVE_DETAILS where WAVENO = ?"),[$code]),"orderno");
-            $count = Order::query()->whereIn("code",$ordernos)->count();
-            if (count($ordernos)!=$count)$error[] = $code."本地订单缺失";
-            Order::query()->whereIn("code",$ordernos)->update([
-                "batch_id"=>$wave->id
-            ]);
-            Order::query()->with(["batch","bin"])->whereIn("code",$ordernos)->get()->each(function ($order){
-                if (!$order->bin){
-                    $bin = DB::connection("oracle")->selectOne(DB::raw("select seqno from DOC_WAVE_DETAILS where waveno = ? and orderno = ?"),[$order->batch->code,$order->code]);
-                    if ($bin){
-                        OrderBin::query()->create([
-                            'order_id' => $order->id,
-                            'number' => $bin->seqno,
-                        ]);
-                    }
-                }
-            });
         }
-        dd("OK");
+
+        //存在则更新
+        if (count($update)>1){
+            $bool = app(BatchUpdateService::class)->batchUpdate("batches",$update);
+            if ($bool!==false)LogService::log(__METHOD__,"SUCCESS-同步更新波次成功",json_encode($update));
+            else LogService::log(__METHOD__,"ERROR-同步更新波次失败",json_encode($update));
+        }
+
+        //不存在则录入
+        if ($insert){
+            $this->batchService->insert($insert);
+            LogService::log(__METHOD__,"SUCCESS-同步插入波次成功",json_encode($insert));
+        }
+        ValueStore::query()->where("name","wave_last_sync_date")->update(["value"=>$waves[count($waves)-1]->edittime]);
+    }
+    public function test()
+    {
+        $sql = "SELECT ORDERNO,WAVENO,SEQNO,EDITTIME FROM DOC_WAVE_DETAILS WHERE WAVENO = 'W210526000315'";
+        $details = DB::connection("oracle")->select(DB::raw($sql));
+        $this->detailExe($details);
+        dd();
         $asnno = "ASN2105240178";
         $query = DB::raw("SELECT b.ALTERNATE_SKU1,h.WAREHOUSEID,h.asnno,d.ASNLINENO,d.SKUDESCRC,h.CUSTOMERID,d.SKU,d.PACKID,d.RECEIVEDQTY_EACH,d.EXPECTEDQTY_EACH,d.LOTATT01,d.LOTATT02,d.lotatt04,".
             "d.lotatt05,d.lotatt08,d.USERDEFINE1,d.USERDEFINE2,d.USERDEFINE3,d.USERDEFINE4,d.USERDEFINE5,d.RECEIVINGLOCATION FROM DOC_ASN_DETAILS d ".