Explorar el Código

波次同步后检查订单信息完整性
修改波次任务推送的触发时机(置于绑定订单完毕后)

Zhouzhendong hace 5 años
padre
commit
05fbf71b84

+ 3 - 1
app/Console/Commands/SyncBatchTask.php

@@ -250,6 +250,7 @@ sql;
             app("OrderService")->batchUpdate($updateOrder);//反向修改订单
             LogService::log(__METHOD__,"波次同步-修改订单波次号",json_encode($updateOrder));
             LogService::log(__METHOD__,"修改过的波次_",json_encode($updateBatch));
+            app("BatchService")->checkBatchOrderInfo($updateBatch);
             BatchTaskJob::dispatch($updateBatch);    //在这里为波次注册队列任务!
         }
 
@@ -273,10 +274,11 @@ sql;
                 $this->batchService->insert($insert);
                 LogService::log(__METHOD__,"SUCCESS-同步插入波次成功",json_encode($insert));
                 $batches = $this->batchService->get(["code"=>$waveCodes]);
-                BatchTaskJob::dispatch($batches);    //在这里为波次注册队列任务!
                 foreach ($batches as $batch){
                     app("OrderService")->update(["code"=>$map[$batch->code]],["batch_id"=>$batch->id]);
                 }
+                app("BatchService")->checkBatchOrderInfo($batches);
+                BatchTaskJob::dispatch($batches);    //在这里为波次注册队列任务!
             }
         }
         ValueStore::query()->where("name","wave_detail_last_sync_date")->update(["value"=>$details[count($details)-1]->edittime]);

+ 31 - 0
app/Services/BatchService.php

@@ -96,4 +96,35 @@ class BatchService
         if(count($codes) == 0)return collect();
         return Batch::query()->whereIn('code',$codes)->get();
     }
+
+
+    /**
+     * 检查批次订单信息,存在库位异常 直接删除所有所属商品 重新拉取
+     *
+     * @param Collection|array $batches
+     */
+    public function checkBatchOrderInfo($batches)
+    {
+        if (!is_array($batches))$batches = $batches->toArray();
+        $ids = array_column($batches->toArray(),"id");
+        $batches = Batch::query()->whereIn("id",$ids)->with("orders.orderCommodities")->get();
+        foreach ($batches as $batch){
+            if (!$batch->orders)continue;
+            foreach ($batch->orders as $order){
+                if (!$order->orderCommodities)app("OrderService")->notExistToRecover($order);
+                else{
+                    $mark = false;
+                    foreach ($order->orderCommodities as $orderCommodity){
+                        if (!$orderCommodity->location){
+                            $mark = true;break;
+                        }
+                    }
+                    if ($mark){
+                        OrderCommodity::query()->where("order_id",$order->id)->delete();
+                        app("OrderService")->notExistToRecover($order);
+                    }
+                }
+            }
+        }
+    }
 }

+ 20 - 0
app/Services/CommodityService.php

@@ -928,4 +928,24 @@ class CommodityService
         if(count($maps)!=$count) $this->pushToCache($commodities);
         return $commodities;
     }
+
+    /**
+     * 不存在则创建
+     *
+     * @param integer $ownerId
+     * @param array $sku
+     */
+    public function notExistToCreate($ownerId,array $sku)
+    {
+       $map = [];
+       foreach ($sku as $item){
+           $map[$item] = true;
+       }
+       $commodities = Commodity::query()->where("owner_id",$ownerId)->whereIn("sku",$sku)->get();
+       $commodities->each(function ($commodity)use(&$map){
+            unset($map[$commodity->sku]);
+       });
+       $sku = array_keys($map);
+       if ($sku)$this->syncWMSOrderCode($ownerId,$sku);
+    }
 }

+ 31 - 0
app/Services/OrderService.php

@@ -2,6 +2,7 @@
 
 namespace App\Services;
 
+use App\Commodity;
 use App\Feature;
 use App\Jobs\OrderCreateInstantBill;
 use App\Jobs\OrderFreeze;
@@ -11,6 +12,7 @@ use App\OracleActAllocationDetails;
 use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
 use App\Order;
+use App\OrderCommodity;
 use App\OrderIssue;
 use App\Owner;
 use App\OwnerFeeDetail;
@@ -1339,6 +1341,35 @@ sql;
         return $result;
     }
 
+    /**
+     * 恢复不存在商品订单
+     *
+     * @param Order|\stdClass $order
+     */
+    public function notExistToRecover(Order $order)
+    {
+        $sql = <<<sql
+SELECT customerid,orderno,sku,orderlineno,qty_each FROM ACT_ALLOCATION_DETAILS WHERE orderno = ?
+sql;
 
+        $allocations = DB::connection("oracle")->select(DB::raw($sql),[$order->code]);
+        if (!$allocations)return;
+        $insert[] = [];
+        $sku = array_column($allocations,"sku");
+        app("CommodityService")->notExistToCreate($order->owner_id,$sku);
+        $commodities = Commodity::query()->where("owner_id",$order->owner_id)->whereIn("sku",$sku)->get();
+        $commodityMap = [];
+        foreach ($commodities as $commodity)$commodityMap[$commodity->sku] = $commodity->id;
+        foreach ($allocations as $allocation){
+            if (!($commodityMap[$allocation->sku] ?? false))LogService::log(__CLASS__,"ERROR-SKU对应商品在FLUX不存在",json_encode($allocation,JSON_UNESCAPED_UNICODE));
+            $insert[] = [
+                'order_id'      => $order->id,
+                'commodity_id'  => $commodityMap[$allocation->sku] ?? null,
+                'amount'        => $allocation->qty_each,
+                'location'      => $allocation->location,
+            ];
+        }
+        OrderCommodity::query()->insert($insert);
+    }
 
 }