Explorar el Código

同步任务 临时提交

ajun hace 5 años
padre
commit
26e55b70de

+ 53 - 0
app/Console/Commands/SyncWMSOrderTask.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Console\Command;
+
+class SyncWMSOrderTask extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'SyncWMSOrderTask';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Command description';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        /**
+         * @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
+         * @var OrderService $orderService
+         */
+        $oracleDOCOrderHeaderService = app('OracleDOCOrderHeaderService');
+        $orderService = app('OrderService');
+        $start_date = Carbon::now()->subSeconds(60+5);
+        $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnStartDate($start_date);
+        $orderService->createOrderInfo($orderHeaders);
+    }
+}

+ 39 - 1
app/Order.php

@@ -13,7 +13,7 @@ class Order extends Model
     protected $fillable = [
         'created_at', 'code', 'shop_id', 'owner_id', 'client_code',
         'logistic_id', 'consignee_name', 'consignee_phone', 'province',
-        'city', 'district', 'address', 'wms_status','warehouse_id','wms_edittime'];
+        'city', 'district', 'address', 'wms_status','status','warehouse_id','wms_edittime'];
 
     /*
      * wms订单号             code=>DOC_ORDER_HEADER[orderno]
@@ -115,4 +115,42 @@ class Order extends Model
         return parent::delete();
     }
 
+    public function isEquals(Order $order)
+    {
+        return
+            $this['code'] == $order['code'] &&
+            $this['warehouse_id'] == $order['warehouse_id'] &&
+            $this['owner_id'] == $order['owner_id'] &&
+            $this['shop_id'] == $order['shop_id'] &&
+            $this['logistic_id'] == $order['logistic_id'] &&
+            $this['consignee_name'] == $order['consignee_name'] &&
+            $this['consignee_phone'] == $order['consignee_phone'] &&
+            $this['province'] == $order['province'] &&
+            $this['city'] == $order['city'] &&
+            $this['district'] == $order['district'] &&
+            $this['address'] == $order['address'] &&
+            $this['client_code'] = $order['client_code'] &&
+            $this['wms_status'] == $order['wms_status'] &&
+            $this['wms_edittime'] == $order['wms_edittime'] &&
+            (string)$this['created_at'] == (string)$order['created_at'];
+    }
+
+    public function assignValueByOrder(Order $order)
+    {
+        $this['code'] = $order['code'] ;
+        $this['warehouse_id'] = $order['warehouse_id'] ;
+        $this['owner_id'] = $order['owner_id'] ;
+        $this['shop_id'] = $order['shop_id'] ;
+        $this['logistic_id'] = $order['logistic_id'] ;
+        $this['consignee_name'] = $order['consignee_name'] ;
+        $this['consignee_phone'] = $order['consignee_phone'] ;
+        $this['province'] = $order['province'] ;
+        $this['city'] = $order['city'] ;
+        $this['district'] = $order['district'] ;
+        $this['address'] = $order['address'] ;
+        $this['client_code'] = $order['client_code'] ;
+        $this['wms_status'] = $order['wms_status'] ;
+        $this['wms_edittime'] = $order['wms_edittime'];
+        $this['created_at'] =$order['created_at'];
+    }
 }

+ 1 - 1
app/OrderIssue.php

@@ -42,7 +42,7 @@ class OrderIssue extends Model
 
     public function rejectedBill()
     {
-        return $this->hasOne(RejectedBill::class, 'logistic_number_return', 'logistic_number_return');
+        return $this->belongsTo(RejectedBill::class, 'logistic_number_return', 'logistic_number_return');
     }
 
     public function issueType()

+ 5 - 3
app/OrderPackageCommodities.php

@@ -13,15 +13,17 @@ class OrderPackageCommodities extends Model
     /*
      * amount => OracleActAllocationDetails->qty_each
      */
-    protected $fillable = ['order_package_id','commodity_id','amount'];
+    protected $fillable = [
+        'order_package_id','commodity_id','amount'
+    ];
 
 
     public function package(){
-        return $this->belongsTo('App\OrderPackage','order_package_id','id');
+        return $this->belongsTo(OrderPackage::class,'order_package_id','id');
     }
 
     public function commodity(){
-        return $this->belongsTo('App\Commodity','commodity_id','id');
+        return $this->belongsTo(Commodity::class,'commodity_id','id');
     }
 
     public function orderTracking(){

+ 22 - 6
app/RejectedBill.php

@@ -20,8 +20,24 @@ class RejectedBill extends Model
     use SoftDeletes;
     protected $fillable=['id_owner','order_number','sender','mobile_sender',
         'logistic_number','logistic_number_return','id_logistic_return',
-        'is_loaded','fee_collected','remark','id_operator','is_checked'
-        ,'is_finished','checked_numbers','remark','common_01','common_02'];
+        'is_loaded','fee_collected','remark','id_operator','is_checked',
+        'is_finished','checked_numbers','remark','common_01','common_02'];
+
+    /*
+     *  id_owner                    货主
+     *  order_number                订单号        OracleDOCOrderHeader->SOReference1
+     *  mobile_sender               电话          OracleDOCOrderHeader->[c_tell1,c_tell2]
+     *  logistic_number             原单单号
+     *  logistic_number_return      退回单号
+     *  id_logistic_return
+     *  is_loaded                   是否入库
+     *  fee_collected               到付费用
+     *  remark                      备注          OracleDOCOrderHeader->notes
+     *  id_operator
+     *  is_checked                  是否审核
+     *  is_finished                 是否完结
+     *  checked_numbers             审核编号
+     */
 
     protected $appends = ['owner_name','logistic_name','created_at_short'
         ,'is_loaded_str','goods_amount','is_loaded_null','operator_name'];
@@ -43,6 +59,9 @@ class RejectedBill extends Model
     function wmsReflectReceive(){
         return $this->belongsTo('App\WMSReflectReceive','id','id_rejected_bill');
     }
+    function orderIssue(){
+        return $this->hasOne( OrderIssue::class, 'logistic_number_return', 'logistic_number_return');
+    }
     function setIsLoaded_toWaitConfirm(){
         if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"将待推单修改为待确认! 退单号:".$this['logistic_number_return'],Auth::user()['id']);
         $bill=RejectedBill::find($this['id']);
@@ -65,10 +84,7 @@ class RejectedBill extends Model
         return $this['checked_numbers'];
     }
 
-    function orderIssue()
-    {
-        return $this->hasOne( OrderIssue::class, 'logistic_number_return', 'logistic_number_return');
-    }
+
 
     function update(array $attributes = [], array $options = [])
     {

+ 1 - 1
app/RejectedBillItem.php

@@ -21,7 +21,7 @@ class RejectedBillItem extends Model
     protected $appends = ['quality_label'];
 
     public function rejectedBill(){
-        return $this->belongsTo('App\RejectedBill', 'id_rejected_bill', 'id');
+        return $this->hasOne('App\RejectedBill', 'id', 'id_rejected_bill');
     }
     public function quality(){
         return $this->belongsTo(QualityLabel::class, 'id_quality_label', 'id');

+ 2 - 2
app/Services/LogisticService.php

@@ -62,10 +62,10 @@ Class LogisticService
         try {
             if(count($insert_params) > 0){
                 $this->insert($insert_params);
-                LogService::log(__METHOD__, __FUNCTION__, '批量创建 owner error' . count($insert_params) . json_encode($insert_params) );
+                LogService::log(__METHOD__, __FUNCTION__, '批量创建 Logistic ' . count($insert_params) . json_encode($insert_params) );
             }
         } catch (\Exception $e) {
-            LogService::log(__METHOD__, __FUNCTION__, '批量创建 owner error' . json_encode($insert_params) . "||".$e->getMessage() . '||' . $e->getTraceAsString() );
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建 Logistic error' . json_encode($insert_params) . "||".$e->getMessage() . '||' . $e->getTraceAsString() );
         } finally {
             return Logistic::query()->whereIn('code',$codes)->get();
         }

+ 34 - 11
app/Services/OracleDOCOrderHeaderService.php

@@ -5,14 +5,21 @@ namespace App\Services;
 use App\OracleDOCOrderDetail;
 use App\OracleDOCOrderHeader;
 use App\Owner;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Str;
 
 Class OracleDOCOrderHeaderService
 {
 
     static $columns =[
-        'orderno','customerid','ordertime','soreference1','consigneeid','c_contact','consigneename','c_address1',
-        'c_city','c_province','userdefine1','addtime','edittime','notes','carrierid','carriername','lastshipmenttime','edisendflag',
-        'c_tel2','transportation','warehouseid'
+        'DOC_Order_Header.OrderNo','DOC_Order_Header.CustomerID','DOC_Order_Header.OrderTime',
+        'DOC_Order_Header.SOReference1', 'DOC_Order_Header.ConsigneeID','DOC_Order_Header.C_Contact',
+        'DOC_Order_Header.ConsigneeName','DOC_Order_Header.C_Address1', 'DOC_Order_Header.C_City',
+        'DOC_Order_Header.C_Province','DOC_Order_Header.UserDefine1','DOC_Order_Header.AddTime',
+        'DOC_Order_Header.EditTime','DOC_Order_Header.Notes','DOC_Order_Header.CarrierID',
+        'DOC_Order_Header.CarrierName', 'DOC_Order_Header.LastShipmentTime','DOC_Order_Header.EDISendFlag',
+        'DOC_Order_Header.SOReference5', 'DOC_Order_Header.C_Tel2','DOC_Order_Header.Transportation',
+        'DOC_Order_Header.WareHouseId','DOC_Order_Header.SOStatus','DOC_Order_Header.C_Tel1'
     ];
 
     function first(array $params){
@@ -28,9 +35,9 @@ Class OracleDOCOrderHeaderService
         /** @var Owner $owners */
         $owners = app(OrderTrackingOwnerService::class)->getTrackingOrderOwner();
         return OracleDOCOrderHeader::query()
-            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])
-            ->where('addTime','>=',$startDate)
-            ->whereIn('customerID',data_get($owners,'*.code'))
+            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode','oracleBASCustomer'])
+            ->where('DOC_Order_Header.addTime','>=',$startDate)
+            ->whereIn('DOC_Order_Header.customerID',data_get($owners,'*.code'))
             ->get();
     }
 
@@ -38,10 +45,10 @@ Class OracleDOCOrderHeaderService
         /** @var Owner $owners */
         $owners = app(OrderTrackingOwnerService::class)->getTrackingOrderOwner();
         return OracleDOCOrderHeader::query()
-            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])
-            ->where('EditTime','>=',$startDate)
-            ->whereColumn('EditTime','<>','addTime')
-            ->whereIn('customerID',data_get($owners,'*.code'))
+            ->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode','oracleBASCustomer'])
+            ->where('DOC_Order_Header.EditTime','>=',$startDate)
+            ->whereColumn('DOC_Order_Header.EditTime','<>','DOC_Order_Header.addTime')
+            ->whereIn('DOC_Order_Header.customerID',data_get($owners,'*.code'))
             ->get();
     }
 
@@ -53,7 +60,23 @@ Class OracleDOCOrderHeaderService
     {
         if(!$orderHeader ?? false){return [];}
         $actAllocationDetails = $orderHeader->actAllocationDetails ?? [];
-        return array_diff(data_get($actAllocationDetails,'*.picktotraceid'),['','*',null]) ;
+        return array_unique(array_diff(data_get($actAllocationDetails,'*.picktotraceid'),['','*',null]));
     }
 
+
+    public function getWMSOrderOnStartDate($startDate)
+    {
+        return OracleDOCOrderHeader::query()->selectRaw(implode(',',self::$columns))
+            ->with(['oracleBASCustomer'=>function($query){
+                $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
+            },'oracleDOCOrderDetails'=>function($query){
+                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
+            }, 'actAllocationDetails'=>function($query){
+                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID');
+            },'oracleBASCode'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            }])
+            ->where('addTime','>=',$startDate)
+            ->get();
+    }
 }

+ 207 - 1
app/Services/OrderPackageCommoditiesService.php

@@ -206,7 +206,7 @@ class OrderPackageCommoditiesService
     public function getByWmsOrder($orderHeaders){
         $order_no =  data_get($orderHeaders,'*.orderno');
         return OrderPackageCommodities::query()
-            ->with('package.order')
+            ->with('package.order','commodity')
             ->whereHas('package.order',function($query) use ($order_no){
                 $query->whereIn('code',$order_no);
             })->get();
@@ -590,4 +590,210 @@ class OrderPackageCommoditiesService
         }
         return $commodity_map;
     }
+
+    public function deleteUnnecessaryOrderCommodities($ids)
+    {
+        if(!$ids)return;
+        OrderPackageCommodities::query()->whereHas('package',function($query)use($ids){
+            $query->whereIn('id',$ids);
+        })->delete();
+    }
+    // TODO
+    public function createOrderCommodity($orderHeaders)
+    {
+        if(!$orderHeaders)return ;
+        $order_nos = data_get($orderHeaders,'*.orderno');
+        $orderCommodities = OrderPackageCommodities::query()
+            ->with(['package.order','commodity'])
+            ->whereHas('package.order',function($query)use($order_nos){
+            $query->whereIn('code',$order_nos);
+        })->get();
+
+        $orderCommodities = $this->regroupOrderCommodities($orderCommodities);
+        $orderAllocationDetails = $this->regroupWmsOrderAllocationDetails($orderHeaders);
+        $this->filterExistParams($orderAllocationDetails,$orderCommodities);
+        $inner_params = $this->filterInnerParams($orderAllocationDetails,$orderCommodities);
+        $update_params =$this->filterUpdateParams($orderAllocationDetails,$orderCommodities);
+        $delete_params = $this->filterDeleteParams($orderAllocationDetails,$orderCommodities);
+        if($inner_params){
+            $package = [];
+            foreach ($orderCommodities as $orderCommodity) {
+                $order_package = $orderCommodity->package;
+                if(!isset($package[$order_package->logistic_number]))
+                    $package[$order_package->logistic_number] = $order_package;
+            }
+            $this->createOrderCommodities($inner_params,$package);
+        }
+        if(!$update_params)
+            $this->updateOrderCommodities($update_params);
+
+        if(!$delete_params)
+            $this->deleteOrderCommodities($delete_params);
+    }
+    // TODO
+    public function regroupOrderCommodities($orderCommodities)
+    {
+        $params = [];
+        $orderCommodities->each(function($orderCommodity)use(&$params){
+            $order_no = $orderCommodity->pacakge->order->code ?? '';
+            dd($orderCommodity->pacakge->order ?? '');
+            $logistic_number = $orderCommodity->package->logistic_number ?? '';
+            $sku = $orderCommodity->commodity->sku ?? '';
+            $key = ' orderno='.$order_no.' logsitic_number='.$logistic_number.' sku='.$sku.' ';
+            $params[$key] = [
+                'id' =>$orderCommodity->id,
+                'orderno'=>$order_no,
+                'logistic_number'=>$logistic_number,
+                'sku' => $sku,
+                'amount' => $orderCommodity->amount
+            ];
+        });
+        return $params;
+    }
+    // TODO
+    public function regroupWmsOrderAllocationDetails($orderHeaders)
+    {
+        $params =[];
+        foreach ($orderHeaders as $orderHeader) {
+            $order_no = $orderHeader->orderno;
+            $actAllocationDetails = $orderHeader->actAllocationDetails ?? [];
+            foreach ($actAllocationDetails as $item) {
+                if($item)continue;
+                $logistic_number = $item->picktotraceid;
+                $sku = $item->sku;
+                $key = ' orderno='.$order_no.' logsitic_number='.$logistic_number.' sku='.$sku.' ';
+                if(isset($params[$key])){
+                    $params[$key]->amount += $item->qty_each;
+                }else{
+                    $params[$key] = [
+                        'orderno'=>$item->orderno,
+                        'logistic_number'=>$item->picktotraceid,
+                        'sku' => $sku,
+                        'amount' => $item->qty_each,
+                        'owner_code' => $item->customerid
+                    ];
+                }
+            }
+        }
+        return $params;
+    }
+    // TODO
+    public function filterExistParams(&$orderAllocationDetails,&$orderCommodities)
+    {
+        foreach ($orderCommodities as $key=>$orderCommodity) {
+            if(isset($orderAllocationDetails[$key])){
+                unset($orderCommodity,$orderAllocationDetails[$key]);
+            }
+        }
+    }
+    // TODO
+    public function filterInnerParams(&$orderAllocationDetails,&$orderCommodities)
+    {
+        $inner_params = [];
+        foreach ($orderAllocationDetails as $key=>$orderAllocationDetail) {
+            if($orderCommodities[$key]){
+                $inner_params[] = $orderAllocationDetail;
+                unset($orderCommodities[$key],$orderAllocationDetail);
+            }
+        }
+        return $inner_params;
+    }
+    // TODO
+    public function filterUpdateParams(&$orderAllocationDetails,&$orderCommodities)
+    {
+        $update_params = [];
+        foreach ($orderCommodities as $key => $orderCommodity) {
+            if(isset($orderAllocationDetails[$key])){
+                if($orderCommodity->amount != $orderAllocationDetails[$key]->amount){
+                    $update_params[$key] = $orderCommodity[$key]->amount = $orderAllocationDetails[$key]->amount;
+                    unset($orderCommodity,$orderAllocationDetails[$key]);
+                }
+            }
+        }
+        return $update_params;
+    }
+    // TODO
+    public function filterDeleteParams(&$orderAllocationDetails,&$orderCommodities)
+    {
+        $del_params = [];
+        foreach ($orderCommodities as $key => $orderCommodity) {
+            if(!isset($orderAllocationDetails[$key])){
+                $del_params[] = $orderCommodity;
+            }
+        }
+        return $del_params;
+    }
+    // TODO
+    public function createOrderCommodities($inner_params,$packages)
+    {
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService  = app('DataHandlerService');
+        $package_map = $dataHandlerService->dataHeader(['logistic_number'],$packages);
+        $sku = [];$owners = [];
+        foreach ($inner_params as $inner_param) {
+            $sku_code = $inner_param['sku'];$owner_code = $inner_param['owner_code'];
+            if(!isset($sku[$sku_code]))
+                $sku[$sku_code] = $sku_code;
+            if(!isset($owner_code[$owner_code]))
+                $owners[$owner_code] = $owner_code;
+        }
+        $commodities = Commodity::query()->with('owner')->whereHas('owner',function ($query)use($owners){
+            $query->whereIn('code',$owners);
+        })->whereIn('sku',$sku)->get();
+        $commodity_map = [];
+        foreach ($commodities as $commodity) {
+            $key = ' owner='.$commodity->owner->code.' sku='.$commodity->sku;
+            $commodity_map[$key] = $commodity;
+        }
+        $create_params =[];
+        $date = Carbon::now();
+        foreach ($inner_params as $inner_param) {
+            $package = $dataHandlerService->getKeyValue(['logistic_number'=>$inner_param],$package_map);
+            $commodity = $commodity_map[' owner='.$inner_param['owner_code'].' sku='.$inner_param['sku']] ?? null;
+            $create_params[] = [
+                'order_package_id'=>$package->id,
+                'commodity_id'=>$commodity->id ?? null,
+                'amount' => $inner_param['amount'],
+                'created_at' => $date,
+                'updated_at' => $date
+            ];
+        }
+        if(count($create_params)>0){
+            try {
+                $bool = OrderPackageCommodities::query()->insert($create_params);
+                LogService::log(__METHOD__,__FUNCTION__,'批量添加 orderCommodity --'. $bool ." || ".count($create_params).' || '.json_encode($create_params));
+            } catch (\Exception $e) {
+                LogService::log(__METHOD__,__FUNCTION__.'error','批量添加 orderCommodity error'." || ".count($create_params).' || '.json_encode($create_params));
+            }
+        }
+    }
+    // TODO
+    public function updateOrderCommodities($orderCommodities)
+    {
+        if(!$orderCommodities)return ;
+        $updated_at = Carbon::now();
+        $update_params = [['id','order_package_id','commodity_id','amount','updated_at']];
+        foreach ($orderCommodities as $orderCommodity) {
+            $update_params[] = [
+                'id' => $orderCommodity->id,
+                'order_package_id'=>$orderCommodity->order_package_id,
+                'commodity_id'=>$orderCommodity->commodity_id,
+                'amount' => $orderCommodity->amount,
+                'updated_at' => $updated_at
+            ];
+        }
+        if(count($update_params)>0)
+            $this->batchUpdate($update_params);
+    }
+    // TODO
+    public function deleteOrderCommodities($orderCommodities){
+        if(!$orderCommodities)return;
+        try {
+            $bool = OrderPackageCommodities::query()->whereIn('id', data_get($orderCommodities, '*.id'))->delete();
+            LogService::log(__METHOD__, __FUNCTION__, '批量删除 OrderCommodity -- ' . $bool . '||' . $orderCommodities->count() . ' || ' . json_encode($orderCommodities->toArray()));
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__.' error', '批量删除 OrderCommodity Error-- ' . $e->getMessage() . '||' . $e->getTraceAsString() );
+        }
+
+    }
 }

+ 117 - 16
app/Services/OrderPackageService.php

@@ -177,17 +177,22 @@ class OrderPackageService
 
     public function createByWmsOrder($orderHeaders)
     {
-        if(!$orderHeaders ){return ;}
-        /** @var OrderService $orderService */
+        /**
+         * @var OrderService $orderService
+         * @var DataHandlerService $dataHandlerService
+         * @var OrderPackageCommoditiesService $orderPackageCommodityService
+         */
         $orderService = app(OrderService::class);
-        /** @var DataHandlerService $dataHandlerService */
         $dataHandlerService = app(DataHandlerService::class);
-        $order_headers_orderNo_map =  $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
+        $orderPackageCommodityService = app(OrderPackageCommoditiesService::class);
 
+        if(!$orderHeaders ){return ;}
         $orders = $orderService->getByWmsOrders($orderHeaders);
         if(!$orders){return ;}
         $order_packages = OrderPackage::query()->whereIn('order_id',data_get($orders,'*.id'))->get();
-        $order_packages_logistic_number_map  =$dataHandlerService->dataHeader(['order_id','logistic_number'],$order_packages);
+
+        $order_packages_logistic_number_map=$dataHandlerService->dataHeader(['order_id','logistic_number'],$order_packages);
+        $order_headers_orderNo_map =  $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
 
         $insert_params = [];
         foreach ($orders as $order) {
@@ -210,8 +215,6 @@ class OrderPackageService
             $order_packages = $this->create($insert_params);
         }
         unset($orders_code_map,$order_packages_logistic_number_ma,$insert_params,$order_packages,$order_package_commodities);
-        /** @var OrderPackageCommoditiesService $orderPackageCommodityService */
-        $orderPackageCommodityService = app(OrderPackageCommoditiesService::class);
         $orderPackageCommodityService->createByWmsOrder($orderHeaders);
         unset($orderHeaders);
     }
@@ -352,15 +355,6 @@ class OrderPackageService
             })->get();
     }
 
-    /**
-     * @param Collection $orders
-     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
-     */
-    public function getByOrders($orders)
-    {
-        return $this->getByOrderNos(data_get($orders,'*.code'));
-    }
-
     public function 返回OrderPackage数组_根据数组中的快递单号($params)
     {
         $map = [];
@@ -388,5 +382,112 @@ class OrderPackageService
         $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
         return  compact('orderPackage','order');
     }
+    // TODO
+    public function createPackageInfo($orderHeaders)
+    {
+        /**
+         * @var OrderPackageCommoditiesService $OrderPackageCommoditiesService
+         */
+        $OrderPackageCommoditiesService = app('OrderPackageCommoditiesService');
+        $this->createPackageByOrderHeader($orderHeaders);
+        $OrderPackageCommoditiesService->createOrderCommodity($orderHeaders);
+    }
+    // TODO
+    public function createPackageByOrderHeader($orderHeaders)
+    {
+        /**
+         * @var OrderService $orderService
+         * @var OrderPackageCommoditiesService $orderPackageCommodityService
+         * @var OrderTrackingService $orderTrackingService
+         */
+        $orderService = app('OrderService');
+        $orderPackageCommodityService= app('OrderPackageCommoditiesService');
+        $orderTrackingService = app('OrderTrackingService');
+        if(!$orderHeaders)return;
+        $orders = $orderService->getByWmsOrders($orderHeaders);
+        $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno'));
+
+        $this->createOrderPackage($orderHeaders,$orders,$packages);                     // 创建package
+        $del_ids = $this->deleteUnnecessaryPackage($orderHeaders,$packages);            // 删除package
+
+        $orderPackageCommodityService->deleteUnnecessaryOrderCommodities($del_ids);     // orderCommodity
+        $orderTracking = OrderTracking::query()->whereHas('commodities.package',function($query)use($del_ids){
+            $query->whereIn('id',$del_ids);
+        })->get();
+        $orderTrackingService->deleteOrderTracings($orderTracking);                     // 删除追踪件
+    }
+    // TODO
+    public function createOrderPackage($orderHeaders,$orders,$packages)
+    {
+        if(!$orderHeaders)return;
+        /**
+         * @var DataHandlerService $dataHandlerService
+         */
+        $dataHandlerService = app(DataHandlerService::class);
+        $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
+        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
+        $inner_params = [];
+        foreach ($orders as $order){
+            $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeaders_map);
+            if(!$orderHeader)continue;
+            if($orderHeader->sotatus == 90)continue;
+            $params = $this->getInnerParams($orderHeader,$order,$packages_maps);
+            $inner_params = array_merge($inner_params,$params);
+        }
+
+        if(count($inner_params)>0){
+            $this->insert($inner_params);
+            LogService::log(__METHOD__,__FUNCTION__,'批量添加 OrderPackage '.count($inner_params).' || '.json_encode($inner_params));
+        }
+    }
+    // TODO
+    public function getInnerParams($orderHeader,$order,$packages_maps)
+    {
+        /**
+        * @var DataHandlerService $dataHandlerService
+        */
+        $dataHandlerService = app('DataHandlerService');
+        $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']);
+        $inner_params = [];
+        $date = Carbon::now()->format('Y-m-d H:i:s');
+        foreach ($logistic_numbers as $logistic_number){
+            $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps);
+            if(isset($package))continue;
+            $inner_params[] = [
+                'order_id' => $order->id,
+                'logistic_number' => $logistic_number,
+                'created_at' => $date,
+                'updated_at' => $date,
+            ];
+        }
+        return $inner_params;
+    }
+    // TODO
+    public function deleteUnnecessaryPackage($orderHeaders,$packages)
+    {
+        /**
+         * @var DataHandlerService $dataHandlerService
+         */
+        $dataHandlerService = app(DataHandlerService::class);
+        $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.picktotraceid');     // 获取picktotraceid (运单的快递单号)
+        $logistic_numbers = array_unique($logistic_numbers);
+        $logistic_numbers = array_diff($logistic_numbers,['',' ','*']);
+
+        $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
+        $exits_number = data_get($packages,'*.logistic_number');
+        $packages = collect();
+        $diff_number = array_diff($exits_number,$logistic_numbers);
+        foreach ($diff_number as $number) {
+            $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps);
+            if($package)$packages->push($package->id);
+        }
+        if(!$packages)return $packages;
+        try {
+            return OrderPackage::query()->whereIn('id', $packages)->delete() ? $packages : collect();
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages).$e->getMessage());
+            return collect();
+        }
+    }
 
 }

+ 126 - 5
app/Services/OrderService.php

@@ -4,13 +4,10 @@ namespace App\Services;
 
 use App\Logistic;
 use App\OracleActAllocationDetails;
-use App\OracleBasCustomer;
 use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
 use App\Order;
 use App\OrderIssue;
-use App\OrderPackage;
-use App\OrderPackageCommodities;
 use App\Owner;
 use App\RejectedBill;
 use App\Services\common\BatchUpdateService;
@@ -18,7 +15,7 @@ use App\Services\common\DataHandlerService;
 use App\Shop;
 use App\Warehouse;
 use Carbon\Carbon;
-use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\DB;
 
@@ -536,7 +533,6 @@ class OrderService
         return Order::query()->whereIn('code',$order_nos)->get();
     }
 
-
     public function getParamsByOrderHeader($orderHeaders_map,$owners_code_map,$logistics_code_map,$shop_name_map,$warehouses_code_map)
     {
         $params = [];
@@ -755,4 +751,129 @@ class OrderService
         $orders =$this->createByWmsOrder($orderHeaders);
         return  $orders ? $orders->first() : null ;
     }
+
+    // TODO
+    public function createOrderInfo($orderHeaders)
+    {
+        /** @var OrderPackageService $packageService */
+        $packageService = app("OrderPackageService");
+        $order_models = $this->createOrderByWMSOrderHeaders($orderHeaders);
+//        $packageService->createPackageInfo($orderHeaders);
+        return $order_models;
+    }
+    // TODO
+    public function createOrderByWMSOrderHeaders($orderHeaders)
+    {
+        if($orderHeaders->isEmpty())return;
+        /**
+         * @var OwnerService $ownerService
+         * @var LogisticService $logisticService
+         * @var ShopService $shopService
+         * @var WarehouseService $warehouseService
+         */
+        $ownerService = app("OwnerService");
+        $logisticService = app("LogisticService");
+        $shopService = app('ShopService');
+        $warehouseService = app('WarehouseService');
+
+        $owners = $ownerService->getByWmsOrders($orderHeaders);
+        $logistics = $logisticService->getByWmsOrders($orderHeaders);
+        $shops = $shopService->getByWmsOrders($orderHeaders);
+        $warehouses = $warehouseService->getByWmsOrders($orderHeaders);
+        $orders = $this->getByWmsOrders($orderHeaders);
+        $created_order = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+        $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+        $this->insert($created_order->map(function($item){
+            $array = $item->toArray();
+            unset($array['logisticNumbers'],$array['packages'],$array['commodityPackages'],$array['amount']);
+            return $array;
+        })->toArray());
+
+        $update_params = [
+            ['id','code','warehouse_id','owner_id','shop_id','logistic_id','consignee_name','consignee_phone','province','city','district','address','client_code','wms_status','created_at','updated_at','wms_edittime']
+        ];
+        $update_order->map(function ($item){
+            return $item->toArray();
+        })->each(function($item)use(&$update_params){
+            $update_params[] =$item;
+        });
+        $this->batchUpdate($update_params);
+        return $created_order->concat($update_order);
+    }
+    // TODO
+    public function getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops)
+    {
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService = app('DataHandlerService');
+        $warehouse_map = $dataHandlerService->dataHeader(['code'],$warehouses);
+        $owner_map = $dataHandlerService->dataHeader(['code'],$owners);
+        $logistic_map = $dataHandlerService->dataHeader(['code'],$logistics);
+        $shop_map = $dataHandlerService->dataHeader(['name','owner_id'],$shops);
+        $order_map = $dataHandlerService->dataHeader(['code'],$orders);
+
+        $collect = collect();
+        foreach ($orderHeaders as $orderHeader) {
+            $order_no = $orderHeader->orderno;
+            $order = $dataHandlerService->getKeyValue(['code'=>$order_no],$order_map);
+            if(isset($order))continue;
+            $order_model = $this->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map);
+            $collect->push($order_model);
+        }
+        return $collect;
+    }
+    // TODO
+    public function getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops)
+    {
+        /**
+         * @var DataHandlerService $dataHandlerService
+         * @var Order $order
+         */
+        $dataHandlerService = app('DataHandlerService');
+        $orderHeader_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
+        $warehouse_map = $dataHandlerService->dataHeader(['code'],$warehouses);
+        $owner_map = $dataHandlerService->dataHeader(['code'],$owners);
+        $logistic_map = $dataHandlerService->dataHeader(['code'],$logistics);
+        $shop_map = $dataHandlerService->dataHeader(['name','owner_id'],$shops);
+        $collect = collect();
+        foreach ($orders as $order) {
+            $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeader_map);
+            if(!$orderHeader)continue;
+            $order_model = $this->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map);
+            if(!$order->isEquals($order_model)){
+                $order->assignValueByOrder($order_model);
+                $collect->push($order);
+            }
+        }
+        return $collect;
+    }
+    // TODO
+    public function getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map)
+    {
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService = app('DataHandlerService');
+        $warehouse = $dataHandlerService->getKeyValue(['code'=>$orderHeader->warehouseid],$warehouse_map);
+        $owner = $dataHandlerService->getKeyValue(['code'=>$orderHeader->customerid],$owner_map);
+        $logistic = $dataHandlerService->getKeyValue(['code'=>$orderHeader->userdefine1],$logistic_map);
+        $shop = $dataHandlerService->getKeyValue(['name'=>$orderHeader->issuepartyname,'owner_id'=>$owner->id??null],$shop_map);
+        $date = Carbon::now();
+        return  new Order( [
+            'code'=>$orderHeader->orderno,
+            'warehouse_id' => $warehouse->id ?? null,
+            'owner_id' => $owner->id ?? null,
+            'shop_id' => $shop->id ?? null,
+            'logistic_id' =>$logistic->id ?? null,
+            'consignee_name' =>  $orderHeader->c_contact,
+            'consignee_phone' =>  empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2,
+            'province' => $orderHeader->c_province,
+            'city' =>  $orderHeader->c_city,
+            'district' => $orderHeader->c_district,
+            'address' => $orderHeader->c_address1,
+            'client_code' => $orderHeader->soreference1,
+            'wms_edittime' => $orderHeader->edittime,
+            'wms_status' => $orderHeader->oracleBASCode_codename_c ?? '',
+            'updated_at' => $date,
+            'created_at' => $orderHeader->addtime,
+        ]);
+    }
+
 }

+ 32 - 30
app/Services/OrderTrackingService.php

@@ -112,34 +112,34 @@ class OrderTrackingService
             ->orderBy('order_trackings.order_client_code')
             ->paginate($params['paginate'] ?? 50);
     }
-
-    public function getSql($params)
-    {
-        if($params['data'] ?? false){
-            $params['ids'] = $params['data'];
-        }
-        $order_tracking_colnums = "case order_trackings.order_client_code when  order_trackings.web_order_number then '' when order_trackings.order_client_code then  order_trackings.order_client_code end order_client_code,";
-        $order_tracking_colnums .= 'order_trackings.web_order_number,order_trackings.pick_up_at,order_trackings.sale,order_trackings.client,order_trackings.order_remark,order_trackings.gross_weight,order_trackings.bulk,';
-        $order_tracking_colnums .= "case order_trackings.planning_sent_at when '0000-00-00 00:00:00' then null else order_trackings.planning_sent_at end planning_sent_at,";
-        $order_tracking_colnums .= 'order_trackings.pallet_total,order_trackings.is_on_duty_shift,order_trackings.is_arrival,order_trackings.signed_at,order_trackings.receive_bill_status,order_trackings.remark';
-        return  $this->getConditionQuery($params)
-            ->orderBy('order_trackings.order_client_code')
-            ->orderByDesc('order_trackings.pick_up_at')
-            ->selectRaw($order_tracking_colnums)
-            ->leftJoin('order_package_commodities','order_trackings.order_package_commodity_id','order_package_commodities.id')
-                ->selectRaw('order_package_commodities.amount amount')
-            ->leftJoin('order_packages','order_package_commodities.order_package_id','order_packages.id')
-                ->selectRaw('order_packages.logistic_number logistic_number')
-            ->leftJoin('orders','order_packages.order_id','orders.id')
-                ->selectRaw('orders.city city')
-            ->leftJoin('logistics','orders.logistic_id','logistics.id')
-                ->selectRaw("case logistics.code when 'ZT' then '新杰物流' else  logistics.name end  logistic_name")
-            ->leftJoin('commodities','order_package_commodities.commodity_id','commodities.id')
-                ->selectRaw('commodities.sku sku,commodities.name sku_name')
-            ->leftJoin('owners','orders.owner_id','owners.id')
-               ->selectRaw('owners.name owners_name')
-            ->sql();
-    }
+//
+//    public function getSql($params)
+//    {
+//        if($params['data'] ?? false){
+//            $params['ids'] = $params['data'];
+//        }
+//        $order_tracking_colnums = "case order_trackings.order_client_code when  order_trackings.web_order_number then '' when order_trackings.order_client_code then  order_trackings.order_client_code end order_client_code,";
+//        $order_tracking_colnums .= 'order_trackings.web_order_number,order_trackings.pick_up_at,order_trackings.sale,order_trackings.client,order_trackings.order_remark,order_trackings.gross_weight,order_trackings.bulk,';
+//        $order_tracking_colnums .= "case order_trackings.planning_sent_at when '0000-00-00 00:00:00' then null else order_trackings.planning_sent_at end planning_sent_at,";
+//        $order_tracking_colnums .= 'order_trackings.pallet_total,order_trackings.is_on_duty_shift,order_trackings.is_arrival,order_trackings.signed_at,order_trackings.receive_bill_status,order_trackings.remark';
+//        return  $this->getConditionQuery($params)
+//            ->orderBy('order_trackings.order_client_code')
+//            ->orderByDesc('order_trackings.pick_up_at')
+//            ->selectRaw($order_tracking_colnums)
+//            ->leftJoin('order_package_commodities','order_trackings.order_package_commodity_id','order_package_commodities.id')
+//                ->selectRaw('order_package_commodities.amount amount')
+//            ->leftJoin('order_packages','order_package_commodities.order_package_id','order_packages.id')
+//                ->selectRaw('order_packages.logistic_number logistic_number')
+//            ->leftJoin('orders','order_packages.order_id','orders.id')
+//                ->selectRaw('orders.city city')
+//            ->leftJoin('logistics','orders.logistic_id','logistics.id')
+//                ->selectRaw("case logistics.code when 'ZT' then '新杰物流' else  logistics.name end  logistic_name")
+//            ->leftJoin('commodities','order_package_commodities.commodity_id','commodities.id')
+//                ->selectRaw('commodities.sku sku,commodities.name sku_name')
+//            ->leftJoin('owners','orders.owner_id','owners.id')
+//               ->selectRaw('owners.name owners_name')
+//            ->sql();
+//    }
 
     public function getOrderTrackings($params)
     {
@@ -477,9 +477,11 @@ class OrderTrackingService
         if($orderTracking->count() == 0){return;}
         try {
             OrderTracking::query()->whereIn('id', data_get($orderTracking,'*.id'))->delete();
-            LogService::log(__METHOD__,__FUNCTION__,'删除订单取消的OrderTracking '.$orderTracking->count().json_encode($orderTracking),null);
+            LogService::log(__METHOD__,__FUNCTION__,'删除 OrderTracking '.$orderTracking->count().json_encode($orderTracking));
         } catch (\Exception $e) {
-            LogService::log(__METHOD__,__FUNCTION__,'删除订单取消的OrderTracking error'.$orderTracking->count().json_encode($orderTracking).$e->getMessage().$e->getTraceAsString(),null);
+            LogService::log(__METHOD__,__FUNCTION__,'删除 OrderTracking error'.$orderTracking->count().json_encode($orderTracking).$e->getMessage().$e->getTraceAsString(),null);
+        } finally {
+            unset($orderTracking);
         }
     }
 

+ 2 - 2
app/Services/RejectedBillService.php

@@ -32,12 +32,12 @@ Class RejectedBillService
     public function syncOrderIssue($rejectedBill)
     {
         $orderIssue = $rejectedBill->orderIssue()->first();
-        if($rejectedBill['logistic_number'] === '原单退回'){   // 原单退回
+        if(!$orderIssue && $rejectedBill['logistic_number'] === '原单退回'){   // 原单退回
             $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($rejectedBill){
                 $query->where('client_code',$rejectedBill['order_number']);
             })->first();
         }
-        if(!isset($orderIssue)){ // 有对应的问题发货订单
+        if(!isset($orderIssue)){ // 有对应的问题发货订单
             $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
                 $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
             })->first();

+ 1 - 1
tests/Services/CacheService/GetOrExecuteTest/GetOrExecuteTest.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace Tests\CacheService\GetOrExecuteTest;
+namespace Tests\Services\CacheService\GetOrExecuteTest;
 
 use App\Services\CacheService;
 use Illuminate\Support\Facades\Cache;

+ 0 - 29
tests/Services/OrderIssueService/GetSqlListTest/GetSqlListTest.php

@@ -1,29 +0,0 @@
-<?php
-
-namespace Tests\Services\OrderIssueService\GetSqlListTest;
-
-use App\Services\OrderIssueService;
-use Illuminate\Foundation\Testing\RefreshDatabase;
-use Illuminate\Foundation\Testing\WithFaker;
-use Tests\TestCase;
-
-class GetSqlListTest extends TestCase
-{
-
-    /** @var OrderIssueService $service */
-    public $service;
-
-
-    public function setUp(): void
-    {
-        $this->service = app('OrderIssueService');
-        parent::setUp();
-    }
-
-    public function testGetArray()
-    {
-        return [
-
-        ];
-    }
-}

+ 85 - 0
tests/Services/OrderPackageCommoditiesService/RegroupOrderCommoditiesTest/RegroupOrderCommoditiesTest.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace Tests\Services\OrderPackageCommoditiesService\RegroupOrderCommoditiesTest;
+
+use App\Order;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderPackageCommoditiesService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class RegroupOrderCommoditiesTest extends TestCase
+{
+    /**
+     * @var OrderPackageCommoditiesService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     */
+    public $service;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderPackageCommoditiesService');
+        $this->orderHeaderService = app('OracleDocOrderHeaderService');
+    }
+
+    public function testRegroupOrderCommodities()
+    {
+        /*
+        * createOrderPackage($orderHeaders,$orders,$packages)
+        * */
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        if($orderHeaders->count()==0){
+            var_dump('查询数据为空');
+            return;
+        }
+        $order_nos = data_get($orderHeaders,'*.orderno');
+        $order_commodities = OrderPackageCommodities::query()->with(['commodity','package.order'])->whereHas('package',function($query)use($order_nos){
+            $query->whereHas('order',function ($query)use($order_nos){
+                $query->whereIn('code',$order_nos);
+            });
+        })->sql();
+        $order_commodities = OrderPackageCommodities::query()->with(['commodity','package.order'])->whereHas('package.order',function($query)use($order_nos){
+            $query->whereIn('code',$order_nos);
+        })->get();
+
+        $package = OrderPackage::query()->with('order')->where('order',function($query)use($order_nos){
+            $query->whereIn('code',$order_nos);
+        })->sql();
+
+        $order = Order::query()->whereIn('code',$order_nos)->sql();
+        $params = $this->service->regroupOrderCommodities($order_commodities);
+        $_params = [];
+        $orderHeaders->each(function($order_header)use(&$_params){
+            $order_header->actAllocationDetails->each(function($detail)use(&$_params){
+                $order_no = $detail->orderno;
+                $logistic_number = $detail->picktotraceid;
+                $sku = $detail->sku;
+                $key = ' orderno='.$order_no.' logsitic_number='.$logistic_number.' sku='.$sku.' ';
+                if(isset($_params[$key])){
+                    $_params[$key]['amount'] += $detail->qty_each;
+                }else{
+                    $_params[$key] = [
+                        'orderno'=>$order_no,
+                        'logistic_number'=>$logistic_number,
+                        'sku' => $sku,
+                        'amount' => $sku,
+                        'owner_code' => $detail->customerid
+                    ];
+                }
+            });
+        });
+
+        foreach ($_params as $key=>$param) {
+            $this->assertNotEmpty($params[$key]);
+        }
+
+    }
+}