Quellcode durchsuchen

Merge branch 'master' into LD

# Conflicts:
#	app/Services/StationTaskCommodityService.php
LD vor 5 Jahren
Ursprung
Commit
786d8f4b8e
31 geänderte Dateien mit 1204 neuen und 731 gelöschten Zeilen
  1. 3 3
      app/Console/Commands/MakeTestCommand.php
  2. 1 1
      app/Http/Controllers/CitiesController.php
  3. 20 13
      app/Http/Controllers/OrderIssueController.php
  4. 11 20
      app/Http/Controllers/OrderIssueOnTopController.php
  5. 50 0
      app/Http/Controllers/OrderIssueRejectedBillController.php
  6. 144 42
      app/Http/Controllers/PriceModelController.php
  7. 6 8
      app/Http/Controllers/RejectedBillItemController.php
  8. 85 53
      app/Http/Controllers/TestController.php
  9. 5 1
      app/Imports/OrderIssueImport.php
  10. 2 0
      app/Imports/RejectedImport.php
  11. 3 3
      app/Order.php
  12. 148 23
      app/OrderIssue.php
  13. 31 0
      app/OrderIssueRejectedBill.php
  14. 2 0
      app/Providers/AppServiceProvider.php
  15. 42 47
      app/RejectedBill.php
  16. 2 2
      app/Services/OracleDOCOrderHeaderService.php
  17. 124 0
      app/Services/OrderIssueRejectedBillService.php
  18. 24 11
      app/Services/OrderIssueService.php
  19. 1 1
      app/Services/OrderService.php
  20. 91 137
      app/Services/OrderTrackingService.php
  21. 3 2
      app/Services/PackageService.php
  22. 5 34
      app/Services/RejectedBillService.php
  23. 3 3
      app/Services/RejectedService.php
  24. 2 0
      app/Services/StationTaskCommodityService.php
  25. 43 0
      database/migrations/2021_01_07_092258_create_order_issue_rejected_bill_table.php
  26. 1 1
      resources/js/queryForm/queryForm.js
  27. 27 7
      resources/views/customer/project/create.blade.php
  28. 12 12
      resources/views/customer/project/part/_three.blade.php
  29. 304 306
      resources/views/order/issue/index.blade.php
  30. 1 1
      resources/views/rejected/search/general.blade.php
  31. 8 0
      routes/apiLocal.php

+ 3 - 3
app/Console/Commands/MakeTestCommand.php

@@ -56,9 +56,9 @@ class MakeTestCommand extends \Illuminate\Foundation\Console\TestMakeCommand
     }
     protected function getModelNamePlural()
     {
-        $modelName=preg_replace('/s$/','$ses',lcfirst($this->getModelName()));
-        $modelName=preg_replace('/ch$/','$ches',$modelName);
-        $modelName=preg_replace('/sh$/','$shes',$modelName);
+        $modelName=preg_replace('/s$/','ses',lcfirst($this->getModelName()));
+        $modelName=preg_replace('/ch$/','ches',$modelName);
+        $modelName=preg_replace('/sh$/','shes',$modelName);
         $modelName=preg_replace('/y$/','ies',$modelName);
         $modelName=preg_replace('/[cC]hild$/','children',$modelName);
         if(preg_match('/[cC]hildren$/',$modelName)==0){

+ 1 - 1
app/Http/Controllers/CitiesController.php

@@ -83,6 +83,6 @@ class CitiesController extends Controller
     }
 
     public function get(){
-        return ["success"=>true,"data"=>City::query()->select("id","name","province_id")->get()];
+        return ["success"=>true,"data"=>City::query()->select("id","name","province_id")->with("province")->get()];
     }
 }

+ 20 - 13
app/Http/Controllers/OrderIssueController.php

@@ -24,6 +24,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Validator;
@@ -209,7 +210,7 @@ class OrderIssueController extends Controller
             ]);
             $orderIssue = OrderIssue::query()->find($request->id);
             $orderIssue->update($data);
-            $orderIssue->同步退单状态();
+            $orderIssue->syncRejectingStatus();
             app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request));
             return  ['success' => true];
         } catch (Exception $e) {
@@ -480,11 +481,9 @@ class OrderIssueController extends Controller
         $service = app(OrderIssueService::class);
         try {
             $message = $service->updateSecondLogisticNumber($request->input('id'), $request->logistic_number);
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent()));
             return $message;
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent()).$e->getMessage().$e->getTraceAsString());
-            return ['success'=>false,$e->getMessage()];
+            return ['success'=>false,'message' =>$e->getMessage()];
         }
     }
 
@@ -638,18 +637,25 @@ class OrderIssueController extends Controller
                     $order_sku_amount.= ($commodities->amount ?? '').",\r\n";
                 });
             });
-            $rejected_logistic_number = $order_issue->rejectedBill->logistic_number_return ?? '';
+            $rejected_logistic_number = '';
 
             $rejected_Bill_remark = '';
             $rejected_is_checked = '';
             $rejected_name = ''; $rejected_barcode = '';$rejected_amount = '';
-            if($order_issue->rejectedBill){
-                $order_issue->rejectedBill->items->each(function($item)use(&$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked){
-                    $rejected_name.= $item->name_goods.",\r\n";
-                    $rejected_barcode.= $item->barcode_goods.",\r\n";
-                    $rejected_amount.= $item->amount.",\r\n";
-                    $rejected_Bill_remark.= $item->remark.",\r\n";
-                    $rejected_is_checked.= $item->quality->name.",\r\n";
+            if($order_issue->rejectedBills){
+                $order_issue->rejectedBills->each(function($rejectedBill)use(
+                    &$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked,&$rejected_logistic_number
+                    ) {
+                    $rejected_logistic_number.=$rejectedBill->logistic_number_return . ",\r\n";
+                    $rejectedBill->items->each(function($item)use(
+                        &$rejected_name,&$rejected_barcode, &$rejected_amount,&$rejected_Bill_remark,&$rejected_is_checked
+                    ){
+                        $rejected_name.= $item->name_goods.",\r\n";
+                        $rejected_barcode.= $item->barcode_goods.",\r\n";
+                        $rejected_amount.= $item->amount.",\r\n";
+                        $rejected_Bill_remark.= $item->remark.",\r\n";
+                        $rejected_is_checked.= $item->quality->name.",\r\n";
+                    });
                 });
             }
             $log_type = ''; $log_content = '';$log_user = '';
@@ -689,7 +695,7 @@ class OrderIssueController extends Controller
                 rtrim($order_sku_amount,",\r\n"),              //原始商品数量
 
                 //,'退单商品名','退单商品条码','退单商品数量','退单状态','退单备注'
-                $rejected_logistic_number,                      //退回单号
+                rtrim($rejected_logistic_number,",\r\n"),                      //退回单号
                 rtrim($rejected_name,",\r\n"),        // 退单商品名
                 rtrim($rejected_barcode,",\r\n") ,    // 退单商品条码
                 rtrim($rejected_amount,",\r\n"),      // 退单商品数量
@@ -787,4 +793,5 @@ class OrderIssueController extends Controller
         });
         return ['success' =>true];
     }
+
 }

+ 11 - 20
app/Http/Controllers/OrderIssueOnTopController.php

@@ -38,29 +38,20 @@ class OrderIssueOnTopController extends Controller
     }
 
     public function apiDestroy(Request $request){
-        if (!Gate::allows('订单管理-问题件-置顶')) {
-            ['success' => false, 'fail_info' => '没有对应权限'];
-        }
-        if (!$request->has('id')) {
-            return ['success' => false, 'fail_info' => '没有传入对应的id'];
-        }
-        OrderIssueOnTop::where('id', $request->input('id'))->delete();
-        return ['success' => true];
+        if (!Gate::allows('订单管理-问题件-置顶')) ['success' => false, 'fail_info' => '没有对应权限'];
+        if (!$request->has('id'))return ['success' => false, 'fail_info' => '没有传入对应的id'];
+
+        return ['success' => OrderIssueOnTop::query()->where('id', $request->input('id'))->delete()];
     }
 
     public function apiStore(Request $request){
-        if (!Gate::allows('订单管理-问题件-置顶')) {
-            return ['success' => false, 'fail_info' => '没有对应权限'];
-        }
-        if (!$request->filled('id')) {
-            return ['success' => false, 'fail_info' => '没有传入对应参数'];
-        } else if (!$request->filled('remark')) {
-            return ['success' => false, 'fail_info' => '没有写入备注'];
-        }
-        $orderIssueOnTop = OrderIssueOnTop::create(['order_issue_id' => $request->input('id'), 'remark' => $request->input('remark')]);
-        if ($orderIssueOnTop) {
-            return ['success' => true];
-        }
+        if (!Gate::allows('订单管理-问题件-置顶')) return ['success' => false, 'fail_info' => '没有对应权限'];
+        if (!$request->filled('id')) return ['success' => false, 'fail_info' => '没有传入对应参数'];
+        if (!$request->filled('remark')) return ['success' => false, 'fail_info' => '没有写入备注'];
+
+        $orderIssueOnTop = OrderIssueOnTop::query()->create(['order_issue_id' => $request->input('id'), 'remark' => $request->input('remark')]);
+        if ($orderIssueOnTop) return ['success' => true,'data'=>$orderIssueOnTop];
+
         return ['success' => false, 'fail_info' => '置顶失败'];
     }
 }

+ 50 - 0
app/Http/Controllers/OrderIssueRejectedBillController.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderIssue;
+use App\Services\OrderIssueRejectedBillService;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class OrderIssueRejectedBillController extends Controller
+{
+    public function joinRejectedBillApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if(!$request->has('logistic_number_return'))return ['success' => false,'error'=>'参数为空'];
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->find($request['id']);
+        if(!$orderIssue)return ['success' =>false,'error'=>'参数为空'];
+        $result =  app(OrderIssueRejectedBillService::class)->joinRejectedBill($orderIssue,$request['logistic_number_return']);
+        if(is_null($result))return ['success' => false,'error' => '已有对应的关联关系'];
+        if(!$result)return ['success' => false,'error' => '创建关联关系时出现异常'];
+        return ['success' => true,'data' => ['orderIssueRejectedBill' => $result,'orderIssue' => $orderIssue]];
+    }
+
+    public function unJoinRejectedBillApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if(!$request->has('logistic_number_return') || !$request->has('id')) return ['success' => false,'error'=>'参数为空'];
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->where('id',$request->id)->first();
+        if(!$orderIssue)return ['success' => false, 'message'=>'没有找到对应的记录'];
+        $result =  app(OrderIssueRejectedBillService::class)->unJoinRejectedBill($orderIssue,$request['logistic_number_return']);
+        if(is_null($result))return ['success' => false,'message' => '没有相对应的连接关系!请刷新页面后重试'];
+        return ['success' => true , 'orderIssue' => $orderIssue];
+    }
+
+    public function reviseJoinRejectedBillApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
+        if (!$request->has('logistic_number_return_update'))
+            return ['success' => false,'error' => '退回单号为空'];
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = OrderIssue::query()->where('id',$request->id)->first();
+        if(!$orderIssue)return ['success' => false,'error' => '没有找到对应的记录'];
+        $result = app(OrderIssueRejectedBillService::class)->unJoinRejectedBill($orderIssue,$request['logistic_number_return'],$request['logistic_number_return_update']);
+        if(is_null($result))return ['success' => false,'error' =>  '需更新的对应关系不存在!请刷新页面后重试'];
+        if(!$result)return ['success' => false,'error' => '更新关联关系时出现异常'];
+        return ['success' => true,'data' => ['orderIssueRejectedBill' => $result,'orderIssue' => $orderIssue]];
+    }
+}

+ 144 - 42
app/Http/Controllers/PriceModelController.php

@@ -1096,7 +1096,7 @@ class PriceModelController extends Controller
         $this->gate("客户管理-项目-录入");
         $params = request()->input();
         $params["logistic_id"] = $params["logistics"];
-        $errors = $this->expressValidator($params)->errors();
+        $errors = $this->expressValidator($params,request("id"))->errors();
         $exist = [];
         foreach ($params["items"] as $index => $item){
             if (isset($exist[$item["province_id"]]))$errors["items.".$index.".province_id"] = ["已存在"];
@@ -1104,19 +1104,51 @@ class PriceModelController extends Controller
         }
         if (count($errors)>0)$this->success(["errors"=>$errors]);
 
-        DB::transaction(function ()use(&$model,$params){
-            $model = app('OwnerPriceExpressService')->create([
-                "name"              => request("name"),
-                "initial_weight"    => request("initial_weight"),
-                "additional_weight" => request("additional_weight"),
-            ]);
-            foreach ($params["items"] as &$item)$item["owner_price_express_id"] = $model->id;
-            OwnerPriceExpressProvince::query()->insert($params["items"]);
-            DB::insert(DB::raw("INSERT INTO owner_price_express_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
+        $obj = [
+            "name"              => request("name"),
+            "initial_weight"    => request("initial_weight"),
+            "additional_weight" => request("additional_weight"),
+        ];
+        if (request("id")){
             /** @var OwnerPriceExpress $model */
-            $model->logistics()->syncWithoutDetaching(request("logistics"));
-            DB::commit();
-        });
+            $model = app('OwnerPriceExpressService')->find(request("id"),["details"]);
+            app('OwnerPriceExpressService')->update(["id"=>request("id")],$obj);
+
+            $delete = [];//需要删除子项
+            $update = [["id","province_id","initial_weight_price","additional_weight_price"]];//需要更新子项
+            $insert = [];//需要新增子项
+            foreach ($params["items"] as $item){
+                $obj = [
+                    "province_id"               => $item["province_id"],
+                    "initial_weight_price"      => $item["initial_weight_price"],
+                    "additional_weight_price"   => $item["additional_weight_price"],
+                ];
+                if (isset($item["id"])){
+                    $obj["id"] = $item["id"];
+                    $update[] = $obj;
+                    $delete[] = $item["id"];
+                } else{
+                    $obj["owner_price_express_id"] = $model->id;
+                    $insert[] = $obj;
+                }
+            }
+            $ids = array_column($model->details->toArray(),"id");
+            $delete = array_diff($ids,$delete);
+            if ($delete)OwnerPriceExpressProvince::destroy($delete);
+            if (count($update) > 1)app(BatchUpdateService::class)->batchUpdate("owner_price_express_provinces",$update);
+            if ($insert)OwnerPriceExpressProvince::query()->insert($insert);
+            $model->logistics()->sync(request("logistics"));
+        }else{
+            DB::transaction(function ()use(&$model,$params,$obj){
+                $model = app('OwnerPriceExpressService')->create($obj);
+                foreach ($params["items"] as &$item)$item["owner_price_express_id"] = $model->id;
+                OwnerPriceExpressProvince::query()->insert($params["items"]);
+                DB::insert(DB::raw("INSERT INTO owner_price_express_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
+                /** @var OwnerPriceExpress $model */
+                $model->logistics()->syncWithoutDetaching(request("logistics"));
+                DB::commit();
+            });
+        }
         $model->load("details");
         $this->success($model);
     }
@@ -1127,7 +1159,7 @@ class PriceModelController extends Controller
         $params = request()->input();
         $params["owner_id"] = [$params["owner_id"]];
         $params["logistic_id"] = $params["logistics"];
-        $errors = $this->logisticValidator($params)->errors();
+        $errors = $this->logisticValidator($params,request("id"))->errors();
         $exist = [];
         foreach ($params["items"] as $index => $item){
             $key = $item["unit_id"]."-".$item["range"]."-".$item["province_id"]."-".$item["city_id"];
@@ -1135,24 +1167,63 @@ class PriceModelController extends Controller
             else $exist[$key] = true;
         }
         if (count($errors)>0)$this->success(["errors"=>$errors]);
-        DB::transaction(function ()use(&$model,$params){
-            $model = app("OwnerPriceLogisticService")->create([
-                "name"              => request('name'),
-                "unit_range"        => request('unit_range'),
-                "unit_id"           => request('unit_id'),
-                "other_unit_range"  => request('other_unit_range'),
-                "other_unit_id"     => request('other_unit_id'),
-                "pick_up_price"     => request('pick_up_price'),
-                "fuel_price"        => request('fuel_price'),
-                "service_price"     => request('service_price'),
-            ]);
-            foreach ($params["items"] as &$param)$param["owner_price_logistic_id"] = $model->id;
-            OwnerPriceLogisticDetail::query()->insert($params["items"]);
-            DB::insert(DB::raw("INSERT INTO owner_price_logistic_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
+
+        $obj = [
+            "name"              => request('name'),
+            "unit_range"        => request('unit_range'),
+            "unit_id"           => request('unit_id'),
+            "other_unit_range"  => request('other_unit_range'),
+            "other_unit_id"     => request('other_unit_id'),
+            "pick_up_price"     => request('pick_up_price'),
+            "fuel_price"        => request('fuel_price'),
+            "service_price"     => request('service_price'),
+        ];
+        if (request("id")){
+            $model = app("OwnerPriceLogisticService")->find(request("id"),["details"]);
+            app("OwnerPriceLogisticService")->update(["id"=>request("id")],$obj);
+
+            $delete = [];//需要删除子项
+            $update = [["id","unit_id","range","province_id","city_id","unit_price","delivery_fee","initial_fee","initial_amount","rate"]];//需要更新子项
+            $insert = [];//需要新增子项
+            foreach ($params["items"] as $item){
+                $obj = [
+                    "unit_id"        => $item["unit_id"],
+                    "range"          => $item["range"],
+                    "province_id"    => $item["province_id"],
+                    "city_id"        => $item["city_id"],
+                    "unit_price"     => $item["unit_price"],
+                    "delivery_fee"   => $item["delivery_fee"],
+                    "initial_fee"    => $item["initial_fee"],
+                    "initial_amount" => $item["initial_amount"],
+                    "rate"           => $item["rate"],
+                ];
+                if (isset($item["id"])){
+                    $obj["id"] = $item["id"];
+                    $update[] = $obj;
+                    $delete[] = $item["id"];
+                } else{
+                    $obj["owner_price_logistic_id"] = $model->id;
+                    $insert[] = $obj;
+                }
+            }
+            $ids = array_column($model->details->toArray(),"id");
+            $delete = array_diff($ids,$delete);
+            if ($delete)OwnerPriceLogisticDetail::destroy($delete);
+            if (count($update) > 1)app(BatchUpdateService::class)->batchUpdate("owner_price_logistic_details",$update);
+            if ($insert)OwnerPriceLogisticDetail::query()->insert($insert);
             /** @var OwnerPriceLogistic $model */
-            $model->logistics()->syncWithoutDetaching(request("logistics"));
-            DB::commit();
-        });
+            $model->logistics()->sync(request("logistics"));
+        }else{
+            DB::transaction(function ()use(&$model,$params,$obj){
+                $model = app("OwnerPriceLogisticService")->create($obj);
+                foreach ($params["items"] as &$param)$param["owner_price_logistic_id"] = $model->id;
+                OwnerPriceLogisticDetail::query()->insert($params["items"]);
+                DB::insert(DB::raw("INSERT INTO owner_price_logistic_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
+                /** @var OwnerPriceLogistic $model */
+                $model->logistics()->syncWithoutDetaching(request("logistics"));
+                DB::commit();
+            });
+        }
         $model->load("details");
         $this->success($model);
     }
@@ -1160,7 +1231,7 @@ class PriceModelController extends Controller
     public function apiStoreDirectLogistic()
     {
         $this->gate("客户管理-项目-录入");
-        $errors = $this->directLogisticValidator(request()->input())->errors();
+        $errors = $this->directLogisticValidator(request()->input(),request("id"))->errors();
         $exist = [];
         foreach (request("items") as $index=>$item){
             if (isset($exist[$item['car_type_id']]))$errors["items.".$index.".car_type_id"] = ["已存在"];
@@ -1169,16 +1240,47 @@ class PriceModelController extends Controller
         if (count($errors)>0)$this->success(["errors"=>$errors]);
 
         $items = request()->input("items");
-        DB::transaction(function ()use(&$model,$items){
-            $model = app("OwnerPriceDirectLogisticService")->create([
-                "name"      => request("name"),
-                "base_km"   => request("base_km"),
-            ]);
-            foreach ($items as &$item)$item["owner_price_direct_logistic_id"] = $model->id;
-            OwnerPriceDirectLogisticCar::query()->insert($items);
-            DB::insert(DB::raw("INSERT INTO owner_price_direct_logistic_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
-            DB::commit();
-        });
+        $obj = [
+            "name"      => request("name"),
+            "base_km"   => request("base_km"),
+        ];
+        if (request("id")){
+            $model = app("OwnerPriceDirectLogisticService")->find(request("id"),["details"]);
+            app("OwnerPriceDirectLogisticService")->update(["id"=>request("id")],$obj);
+
+            $delete = [];//需要删除子项
+            $update = [["id","car_type_id","base_fee","additional_fee"]];//需要更新子项
+            $insert = [];//需要新增子项
+            foreach ($items as $item){
+                $obj = [
+                    "car_type_id"       => $item["car_type_id"],
+                    "base_fee"          => $item["base_fee"],
+                    "additional_fee"    => $item["additional_fee"],
+                ];
+                if (isset($item["id"])){
+                    $obj["id"] = $item["id"];
+                    $update[] = $obj;
+                    $delete[] = $item["id"];
+                } else{
+                    $obj["owner_price_direct_logistic_id"] = $model->id;
+                    $insert[] = $obj;
+                }
+            }
+            $ids = array_column($model->details->toArray(),"id");
+            $delete = array_diff($ids,$delete);
+            if ($delete)OwnerPriceDirectLogisticCar::destroy($delete);
+            if (count($update) > 1)app(BatchUpdateService::class)->batchUpdate("owner_price_direct_logistic_cars",$update);
+            if ($insert)OwnerPriceDirectLogisticCar::query()->insert($insert);
+        }else{
+            DB::transaction(function ()use(&$model,$items,$obj){
+                $model = app("OwnerPriceDirectLogisticService")->create($obj);
+                foreach ($items as &$item)$item["owner_price_direct_logistic_id"] = $model->id;
+                OwnerPriceDirectLogisticCar::query()->insert($items);
+                DB::insert(DB::raw("INSERT INTO owner_price_direct_logistic_owner VALUES(?,?)"),[$model->id,request("owner_id")]);
+                DB::commit();
+            });
+        }
+        /** @var OwnerPriceDirectLogistic $model */
         $model->load("details");
         $this->success($model);
     }

+ 6 - 8
app/Http/Controllers/RejectedBillItemController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Commodity;
 use App\Events\InformWMSReceivedEvent;
+use App\OrderIssue;
 use App\Owner;
 use App\RejectedBill;
 use App\RejectedBillItem;
@@ -95,9 +96,7 @@ class RejectedBillItemController extends Controller
 
 
         $rejectedBill = RejectedBill::query()->where('id',$request->input('id_rejected_bill'))->first();
-        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
-//        $rejectedBIll->同步问题件();
-//        $rejectedBIll->同步问题件退件状态();
+        $rejectedBill->syncOrderIssue();     // 同步问题件 修改问题件退货状态
         app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBillItem['id']];
     }
@@ -118,9 +117,9 @@ class RejectedBillItemController extends Controller
             $rejectedBillItem->fill($request->all());
             $rejectedBillItem->update();
             //$rejectedBillItem->injectCommodityName();  Haozi 2020-12-09
-            $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->with('orderIssue')->first();
-//            $rejectedBill->同步问题件退件状态();
-            app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
+            /** @var RejectedBill $rejectedBill */
+            $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->first();
+            $rejectedBill->syncOrderIssue(); // 同步问题件 修改问题件退货状态
             app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             return ['success'=>'true','id'=>$rejectedBillItem['id']];
         }
@@ -179,8 +178,7 @@ class RejectedBillItemController extends Controller
         }
         $item=$rejectedBillItems->first();
         $rejectedBill = RejectedBill::query()->find($item['id_rejected_bill']);
-        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
-//        $rejectedBill->同步问题件();
+        $rejectedBill->syncOrderIssue();    // 同步问题件 修改问题件退货状态
         if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,'请求处理退单:'.$rejectedBill['logistic_number_return'],Auth::user()['id']);
         $downloadedSkus = WMSReflectReceive::downloadedSkus($rejectedBill['logistic_number_return'],true);
         $isGotMoreThenDownloaded=WMSReflectReceiveSku::isItemsOverDownloadedSkus($rejectedBillItems,$downloadedSkus);

+ 85 - 53
app/Http/Controllers/TestController.php

@@ -53,6 +53,7 @@ use App\Services\FeatureService;
 use App\Services\InventoryCompareService;
 use App\Services\LogisticService;
 use App\Services\LogService;
+use App\Services\OracleBasSkuService;
 use App\Services\OracleDocAsnHerderService;
 use App\Services\OracleDOCOrderHeaderService;
 use App\Services\OracleDocWaveDetailService;
@@ -1126,60 +1127,8 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $orderService->syncOrderByWMSOrderHeaders($orderHeaders);
     }
 
-    public function testSyncOrderTracking()
-    {
-        $orderTrackingService = new OrderTrackingService();
-        $items = OrderTracking::query()->with('commodities.package.order')->where('created_at', '>=', '2020-12-01 00:00:00')->get();
-        $orderNos = $items->map(function ($orderTracking) {
-            return $orderTracking->commodities->package->order->code;
-        });
-        $update_params = [['id', 'client', 'order_remark']];
-        $orderHeaders = OracleDOCOrderHeader::query()->whereIn('OrderNo', $orderNos)->get();
-        foreach ($items as $orderTracking) {
-            $order = $orderTracking->commodities->package->order;
-            $orderHeader = $orderHeaders->where('orderno', $order->code)->first();
-            if (!$orderHeader) continue;
-            if (empty($order)) continue;
-            $params = $orderTrackingService->getParamsByOrderHeaderAndOrder($orderHeader, $order);
-            if ($params['client'] != $orderTracking->client || $params['order_remark'] != $orderTracking->order_remark) {
-                $update_params[] = [
-                    'id' => $orderTracking->id,
-                    'client' => $params['client'],
-                    'order_remark' => $params['order_remark']
-                ];
-            }
-        }
-        if (count($update_params) == 0) return;
-        $orderTrackingService->batchUpdate($update_params);
-    }
 
-    public function editOrderTracking()
-    {
-        $orderTrackingService = new OrderTrackingService();
-        $dataHandlerService = new DataHandlerService();
-        $orderTrackings = OrderTracking::query()->with('commodities.package')->where('client', 'like', '天猫%')->get();
-        $orderTracking_arr = $orderTrackings->chunk(100);
-        foreach ($orderTracking_arr as $items) {
-            $update_params = [['id', 'order_client_code']];
-            $order_nos = array_unique(data_get($items, '*.commodities.package.order.code'));
-            $orderHeaders = OracleDOCOrderHeader::query()
-                ->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode', 'oracleBASCustomer'])
-                ->whereIn('DOC_Order_Header.OrderNo', $order_nos)->get();
-            $orderHeader_map = $dataHandlerService->dataHeader(['orderno'], $orderHeaders);
-            foreach ($items as $orderTracking) {
-                $commodities = $orderTracking->commodities;
-                $orderHeader = $dataHandlerService->getKeyValue(['orderno' => $commodities->package->order->code], $orderHeader_map);
-                $order_client_code = $orderTrackingService->get_d_edit_03($orderHeader, $commodities);
-                $update_params[] = [
-                    'id' => $orderTracking->id,
-                    'order_client_code' => $order_client_code
-                ];
-            }
-            $orderTrackingService->batchUpdate($update_params);
-            unset($update_params, $orderHeaders, $orderHeader_map);
-        }
-        unset($orderTrackings, $orderTracking_arr);
-    }
+
 
     public function testUpdateSkuNameBarcodeToCommodity_id()
     {
@@ -1410,4 +1359,87 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $service->clearCancelledOrderTask();
     }
 
+    public function processOrderIssueRejectedBill()
+    {
+        OrderIssue::query()->withTrashed()->whereNotNull('logistic_number_return')->chunkById(200,function($orderIssues){
+            $orderIssues->each(function($orderIssue){
+                if($orderIssue->logistic_number_return)
+                    $orderIssue->rejectedBills()->syncWithoutDetaching([trim($orderIssue->logistic_number_return)]);
+            });
+        });
+    }
+
+    public function SyncOrderTracking()
+    {
+        $start_data = Carbon::parse('2021-01-01 00:00:00');
+        $service = new OrderTrackingService();
+        $service->trackingWmsOrderOnCreate($start_data);
+    }
+
+    public function SyncUpdateOrderTracking()
+    {
+        $start_data = Carbon::parse('2021-01-14 00:00:00');
+        $service = new OrderTrackingService();
+        $service->trackingWmsOrderOnEdit($start_data);
+    }
+
+    public function orderTrackingUpdate()
+    {
+        $start_at = '2021-01-01 00:00:00';
+        // 修改【安桥,锐活】 订单号
+        $orderHeaderService = new OracleDOCOrderHeaderService();
+        $orderTrackingService = new OrderTrackingService();
+        $query = $orderHeaderService->getQuery();
+        $orderHeaders = $query->whereIn('Doc_Order_Header.customerid',['ONKYO','RUIHUO'])
+            ->where('Doc_Order_Header.AddTime','>=',$start_at)
+            ->get();
+        $orderTrackingService->updateByWmsOrderHeaders($orderHeaders);
+    }
+
+    public function updateOrderTracking()
+    {
+        OrderTracking::query()->with(['commodities'=>function($query){
+            $query->with(['commodity','package.order']);
+        }])->whereNotNull('client')
+            ->where('created_at','>=','2021-01-01')
+            ->where('created_at','<=','2021-01-07')
+            ->where('created_at','!=','0000-00-00 00:00:00')
+            ->chunkById('200',function($orderTrackings){
+                /**
+                 * @var DataHandlerService $dataService
+                 */
+                $service = new OrderTrackingService();
+                $orderHeaderService = new OracleDOCOrderHeaderService();
+                $dataService = new DataHandlerService();
+                $order_nos = array_unique(data_get($orderTrackings,'*.commodities.package.order.code'));
+                $order_headers = $orderHeaderService->getQuery()->whereIn('orderno',$order_nos)->get();
+                $update[] = ['id','order_client_code','client',];
+                $order_header_map = $dataService->dataHeader(['orderno'],$order_headers);
+                foreach ($orderTrackings as $orderTracking) {
+                    $params = ['id' => $orderTracking->id];
+                    $order_package_commodity = $orderTracking->commodities;
+                    if(!$order_package_commodity)continue;
+                    if(!$order_package_commodity->package)continue;
+                    if(!$order_package_commodity->package->order)continue;
+                    $order= $order_package_commodity->package->order;
+                    $order_header = $dataService->getKeyValue(['orderno'=>$order->code],$order_header_map);
+                    $order_remark = $order_header['notes'] ?? '';        // 订单备注
+                    $params['client'] = $order_header['issuepartyname'];
+                    if(mb_stristr($order_remark,'天猫') && mb_stristr($order_remark,'赠品')){ // client and order_remark 商铺 和 订单备注
+                        $params['client'] = '天猫(赠品)';
+                        $params['order_remark'] = $order_remark;
+                    }
+                    if(mb_stristr($order_header['issuepartyname'],'天猫') && $params['client'] !== '天猫(赠品)') $params['client'] = '天猫';
+                    if($params['client'] == '天猫') // order_client_code 订单号  店铺包含天猫
+                        $params['order_client_code'] = $service->get_d_edit_03($order_header,$order_package_commodity);
+                    else
+                        $params['order_client_code'] = $order->client_code;
+                    if($params['client'] != '天猫' && $params['client'] != '天猫(赠品)')continue;
+                    if($params['client']!=$orderTracking->client ||  $params['order_client_code']!=$orderTracking->order_client_code) $update[] = $params;
+            }
+            if(count($update) > 1){
+                $service->batchUpdate($update);
+            }
+        });
+    }
 }

+ 5 - 1
app/Imports/OrderIssueImport.php

@@ -103,8 +103,12 @@ class OrderIssueImport implements ToCollection, WithHeadingRow, WithMultipleShee
                 if ($rejectedBill) {
                     $arr['rejected_bill_id'] = $rejectedBill['id'];
                 }
+
+                /** @var OrderIssue $orderIssue */
                 $orderIssue = OrderIssue::query()->create($arr);
-                $orderIssue->同步退单状态();
+                $orderIssue->syncRejectedBills();
+                $orderIssue->syncRejectingStatus();
+
                 if ($orderIssue) {
                     array_push($exception, ['订单' . $row['原始运单号'] . '问题件创建成功!']);
                     OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '', 'type' => '创建']);

+ 2 - 0
app/Imports/RejectedImport.php

@@ -80,6 +80,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     ]);
                     $item->save();
                 }
+                $bill->syncOrderIssue();
             }else{
                 $bill=new RejectedBill([
                     'id_owner'=>$id_owner,
@@ -89,6 +90,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     'is_loaded'=>0,
                 ]);
                 $bill->save();
+                $bill->syncOrderIssue();
                 $item=RejectedBillItem::where('id_rejected_bill',$bill['id'])
                     ->where('barcode_goods',trim($barcode))->where('id_quality_label',$id_quality_label)->first();
                 if($item){

+ 3 - 3
app/Order.php

@@ -29,9 +29,9 @@ class Order extends Model
      */
 
     protected $appends = [
-        'logisticNumbers',
-        'amount',
-        'commodityPackages'
+//        'logisticNumbers',
+//        'amount',
+//        'commodityPackages'
     ];
     public function cancel(){
         $this['status'] = '取消';

+ 148 - 23
app/OrderIssue.php

@@ -39,23 +39,21 @@ class OrderIssue extends Model
      * finance_confirm 财务确认
      * hidden_tag 隐藏标识
      */
-    protected $appends = [
-//        'secondLogisticNumber',
-//        'createLog',
-//        'endLog',
-//        'processingTime',
-//        'createUser',
-//        'endUser',
-    ];
+    protected $appends = [];
 
     public function order()
     {
         return $this->belongsTo(Order::class, 'order_id', 'id');
     }
 
-    public function rejectedBill()
+    public function rejectedBills()
     {
-        return $this->belongsTo(RejectedBill::class, 'logistic_number_return', 'logistic_number_return');
+        return $this->belongsToMany(RejectedBill::class,'order_issue_rejected_bill','order_issue_id','logistic_number_return','id','logistic_number_return');
+    }
+
+    public function orderIssueRejectedBills()
+    {
+        return $this->hasMany(OrderIssueRejectedBill::class);
     }
 
     public function issueType()
@@ -83,11 +81,6 @@ class OrderIssue extends Model
         return $this->hasOne('App\Order', 'client_code', 'second_client_no');
     }
 
-//    public function getSecondLogisticNumberAttribute()
-//    {
-//        return $this['secondOrder']['code'] ?? '';
-//    }
-
     public function getCreateLogAttribute()
     {
         return $this->logs->where('type', '创建')->first();
@@ -217,7 +210,109 @@ class OrderIssue extends Model
             $this->update(['rejecting_status' => '差异退回']);
     }
 
+    /**
+     * 同步退货状态
+     */
+    public function syncRejectingStatus()
+    {
+        if(!$this->order_id)return;
+        $rejectedItems = [];
+        $orderItems = [];
+        $rejectedBills = $this->rejectedBills;
+        if(!$rejectedBills)return;
+        $rejectedBillItems = RejectedBillItem::query()->with('quality')
+            ->whereIn('id_rejected_bill',function($query)use($rejectedBills){
+                $query->from('rejected_bills')->select('id')->whereIn('logistic_number_return',$rejectedBills->map(function($rejectedBil){
+                    return $rejectedBil->logistic_number_return;
+                }));
+        })->get();
 
+        if($rejectedBillItems->count()===0){
+            $this->update(['rejecting_status' => '未退回']);
+            return;
+        }
+
+        if($rejectedBillItems->where('quality.name','残次')->count()>0){
+            $this->update(['rejecting_status' => '差异退回']);
+            return;
+        }
+        $barcodeGoods = data_get($rejectedBillItems,'*.barcode_goods');
+        $commodityBarcodes = CommodityBarcode::query()->with('commodity')->whereIn('code',$barcodeGoods)->get();
+        $commodities = Commodity::query()->whereIn('sku',$barcodeGoods)->get();
+
+        foreach ($rejectedBillItems as $item) {
+            $barcode_goods = (string)$item->barcode_goods;
+            $commodity = $commodities->where('sku',$barcode_goods)->first();
+            if(!$commodity){
+                $commodityBarcode = $commodityBarcodes->where('code',$barcode_goods)->first();
+                $barcode_goods = $commodityBarcode->commodity->sku ?? $barcode_goods;
+            }
+            if (!isset($rejectedItems[$barcode_goods])){
+                $rejectedItems[$barcode_goods] = 0;
+            }
+            $rejectedItems[(string)$barcode_goods] += $item->amount;
+        }
+
+        $items = OrderPackageCommodities::query()->with('commodity')
+            ->whereIn('order_package_id',function($query){
+                $query->from('order_packages')->selectRaw('id')->where('order_id',$this->order_id);
+            })->get();
+
+        if(count($items) == 0){
+            $this->update(['rejecting_status' => '无']);
+            return;
+        }
+        if (count($items) > 0) {
+            foreach ($items as $item) {
+                $sku = $item['commodity']['sku'];
+                if (! isset($orderItems[$sku]) ?? false){
+                    $orderItems[$sku] = 0;
+                }
+                $orderItems[$sku] += $item->amount;
+            }
+        } else {
+            $this->update(['rejecting_status' => '无']);
+            return;
+        }
+        $rejectedExcess = 0;    // 退回差异
+        $rejectedReview = 0;    // 退回复核  $rejectedItems == $orderItems
+        foreach ($rejectedItems as $key => $items) {
+            if ($orderItems[$key] ?? false) {
+                if ($rejectedItems[$key] == $orderItems[$key])
+                    $rejectedReview++;
+            } else
+                $rejectedExcess++;
+        }
+        if ($rejectedExcess > 0) {
+            $this->update(['rejecting_status' => '差异退回']);
+            return;
+        }
+        // 全部退回 部分退回 超量退回 差异退回 未退回 无
+        $isExcess = 0; // 超量 $orderItems < $rejectedItems
+        $isDiff = 0;   // 部分 $orderItems > $rejectedItems
+        $isAccord = 0; // 相同 $orderItems == $rejectedItems
+        $isLack = 0;   // 缺少 $orderItems != $rejectedItems
+        foreach ($orderItems as $key => $item) {
+            if ($rejectedItems[$key] ?? false) {
+                if ($orderItems[$key] < $rejectedItems[$key])
+                    $isExcess++;
+                else if ($orderItems[$key] > $rejectedItems[$key])
+                    $isDiff++;
+                else if ($orderItems[$key] == $rejectedItems[$key])
+                    $isAccord++;
+            } else
+                $isLack++;
+        }
+
+        if($isAccord == $rejectedReview && $isLack == 0 && $isExcess == 0 && $isDiff==0 && $rejectedExcess == 0 )
+            $this->update(['rejecting_status' => '全部退回']);
+        else if($isExcess > 0 && $isAccord ==  $rejectedReview && $isDiff == 0 && $isLack == 0)
+            $this->update(['rejecting_status' => '超量退回']);
+        else if($isDiff >=0 && $isAccord == $rejectedReview && $isLack >=0 && $rejectedExcess ==0 && $isExcess==0)
+            $this->update(['rejecting_status' => '部分退回']);
+        else if($isLack >= 0 && $rejectedExcess>=0 && $isDiff>=0 && $isLack>=0 && $isExcess>=0 && $rejectedReview>=0)
+            $this->update(['rejecting_status' => '差异退回']);
+    }
 
     public function delete()
     {
@@ -231,16 +326,46 @@ class OrderIssue extends Model
         return parent::delete();
     }
 
-
-    // 同步退回单
-    public function syncRejectedBill()
+    /**
+     * 同步退货单号
+     */
+    public function syncRejectedBills()
     {
-        if(!isset($this['logistic_number_return'])){
-            $order = $this->order;
-            $rejectedBill = RejectedBill::query()->where('logistic_number','like','原单退回'.'%')->where('order_number',$order->client_code)->whereNotNull('order_number')->first();
-            if($rejectedBill){
-                $this->update(['logistic_number_return'=>$rejectedBill->logistic_number_return,'is_new_rejecting'=>'有']);
+        $order_packages = $this->order->packages;
+        if($order_packages){
+            foreach ($order_packages as $order_package) {
+                $logistic_number = $order_package->logistic_number;
+                $rejectedBill = RejectedBill::query()->where('logistic_number_return',$logistic_number)->first();
+                if($rejectedBill){
+                    if(OrderIssueRejectedBill::isExit($this->id,$logistic_number))continue;
+                    $this->joinRejectedBill($logistic_number);
+                    $this->is_new_rejecting = '有';
+                }
             }
+            $this->save();
+        }
+    }
+
+    /**
+     * @param array|string $logistic_number
+     * @return array|void
+     */
+    public function joinRejectedBill($logistic_number)
+    {
+        if(!$logistic_number)return null;
+        if(is_array($logistic_number)){
+            return $this->rejectedBills()->sync($logistic_number,false);
         }
+        return $this->rejectedBills()->attach($logistic_number);
+    }
+
+    public function unJoinRejectedBill($logistic_number)
+    {
+        return $this->rejectedBills()->detach($logistic_number);
+    }
+
+    public function reviseJoinRejectedBill($logistic_number,$logistic_number_update)
+    {
+        return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]);
     }
 }

+ 31 - 0
app/OrderIssueRejectedBill.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\LogModelChanging;
+
+class OrderIssueRejectedBill extends Model
+{
+    use LogModelChanging;
+    protected $table='order_issue_rejected_bill';
+    protected $fillable = [
+        'order_issue_id','logistic_number_return'
+    ];
+
+    public function orderIssue()
+    {
+        return $this->belongsTo(OrderIssue::class,'order_issue_id','id');
+    }
+
+    public function rejectedBill()
+    {
+        return $this->belongsTo(RejectedBill::class,'logistic_number_return','logistic_number_return');
+    }
+
+    public static function isExit($order_issue_id,$logistic_number_return)
+    {
+        return OrderIssueRejectedBill::query()->where('order_issue_id',$order_issue_id)->where('logistic_number_return',$logistic_number_return)->exists();
+    }
+}

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -34,6 +34,7 @@ use App\Services\InventoryDailyLogService;
 use App\Services\LogisticService;
 use App\Services\OracleActAllocationDetailService;
 use App\Services\OrderIssueProcessLogService;
+use App\Services\OrderIssueRejectedBillService;
 use App\Services\OrderIssueService;
 use App\Services\OrderPackageService;
 use App\Services\OrderService;
@@ -164,6 +165,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OracleDocWaveDetailService',OracleDocWaveDetailService::class);
         app()->singleton('OrderCommodityAssignService',OrderCommodityAssignService::class);
         app()->singleton('OrderCommodityService',OrderCommodityService::class);
+        app()->singleton('OrderIssueRejectedBillService',OrderIssueRejectedBillService::class);
         app()->singleton('OrderIssuePerformanceService',OrderIssuePerformanceService::class);
         app()->singleton('OrderIssueProcessLogService',OrderIssueProcessLogService::class);
         app()->singleton('OrderIssueService',OrderIssueService::class);

+ 42 - 47
app/RejectedBill.php

@@ -63,9 +63,16 @@ 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 orderIssue()
+    {
+        return $this->hasOneThrough(OrderIssue::class,OrderIssueRejectedBill::class,'logistic_number_return','id','logistic_number_return','order_issue_id');
+    }
+
+    function orderIssueRejectedBill(){
+        return $this->hasOne(OrderIssueRejectedBill::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']);
@@ -151,56 +158,44 @@ class RejectedBill extends Model
         return $this['is_loaded'];
     }
 
-    public function 同步问题件退件状态()
+    public function delete()
     {
-        $orderIssue = $this->orderIssue()->first();
-        if ($orderIssue ?? false) {
-//            $this->同步退单状态();
-            $orderIssue->update(['is_new_rejecting' => '有']);
-        } else {
-            OrderIssue::query()->where('logistic_number_return', $this->logistic_number_return)->update(['is_new_rejecting' => '有']);
+        /** @var OrderIssue $orderIssue */
+        $orderIssue = $this->orderIssue;
+        if($orderIssue){
+            $orderIssue->unJoinRejectedBill($this->logistic_number_return);
+            $orderIssue->update(['is_new_rejecting'=>'无']);
+            $orderIssue->syncRejectingStatus();
         }
+        return parent::delete(); // TODO: Change the autogenerated stub
     }
 
-    public function 同步问题件()
+    public function syncOrderIssue()
     {
-        $orderIssue = $this->orderIssue()->first();
-        if(!isset($orderIssue)){
-            if(isset($this->order_number)){
-                $orderNumber = $this->order_number;
-                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderNumber){
-                    $query->where('client_code',$orderNumber);
-                })->first();
-            }
-            if(isset($this->logistic_number_return) && !isset($orderIssue)){
-                $logistic_number_return = $this->logistic_number_return;
-                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($logistic_number_return){
-                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$logistic_number_return)->first();
-                })->first();
-                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderHeader){
-                    $query->where('code',$orderHeader->orderno);
-                })->first();
-            }
-        }
-        if(isset($orderIssue)){
-//            $orderIssue->同步退单状态();
-            $orderIssue->update(['is_new_rejecting' => '有']);
+        if(isset($this->orderIssue)){
+            $this->orderIssue->syncRejectingStatus();
+            return;
         }
-    }
-
-    private function 同步退单状态()
-    {
         /** @var OrderIssue $orderIssue */
-        $orderIssue =  $this->orderIssue()->first();
-        if($orderIssue ?? false)
-            $orderIssue->同步退单状态();
-    }
-
-    public function delete()
-    {
-        $orderIssue = $this->orderIssue;
-        if($orderIssue)$orderIssue->update(['is_new_rejecting'=>'无','logistic_number_return'=>null]);
-        return parent::delete();
-    }
-
+        $orderIssue = null;
+        // 原单退回
+        if($this->logistic_number === '原单退回'){
+            $orderIssue = OrderIssue::query()->where('order_id',function ($query){
+                $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
+            })->first();
+        }
+        if(!$orderIssue){
+            $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) {
+                $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $this->logistic_number_return)->first();
+            })->first();
+            if(!$orderHeader)return;
+            $orderIssue = OrderIssue::query()->where('order_id',function($query)use($orderHeader){
+                $query->from('orders')->select('id')->where('code',$orderHeader->orderno);
+            })->first();
+        }
+        if(!$orderIssue)return;
+        if(!OrderIssueRejectedBill::isExit($orderIssue->id,$this->logistic_number_return)) $orderIssue->update(['is_new_rejecting' => '有']);
+        $orderIssue->joinRejectedBill($this->logistic_number_return);
+        $orderIssue->syncRejectingStatus();
+     }
 }

+ 2 - 2
app/Services/OracleDOCOrderHeaderService.php

@@ -32,9 +32,9 @@ Class OracleDOCOrderHeaderService
             ->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,doc_order_details.Location');
+                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered,doc_order_details.Location,doc_order_details.OrderLineNo,doc_order_details.d_edi_03');
             }, '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,ACT_Allocation_Details.Sku,ACT_Allocation_Details.Location');
+                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku,ACT_Allocation_Details.Location,ACT_Allocation_Details.SkuLineNo,ACT_Allocation_Details.OrderLineno');
             },'oracleBASCode'=>function($query){
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             },'orderType'=>function($query){

+ 124 - 0
app/Services/OrderIssueRejectedBillService.php

@@ -0,0 +1,124 @@
+<?php
+
+namespace App\Services;
+
+use App\Http\Controllers\Controller;
+use App\OrderIssue;
+use App\OrderIssueRejectedBill;
+use App\RejectedBill;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+
+Class OrderIssueRejectedBillService
+{
+    /**
+     * 添加连接
+     * @param OrderIssue $orderIssue
+     * @param $logistic_number_return
+     * @return Builder|Model|object|null|boolean
+     */
+    public function joinRejectedBill($orderIssue,$logistic_number_return)
+    {
+        $orderIssueRejectedBill = OrderIssueRejectedBill::query()
+            ->where('order_issue_id',$orderIssue->id)
+            ->where('logistic_number_return',$logistic_number_return)->first();
+        if($orderIssueRejectedBill)return null;
+        if(!OrderIssueRejectedBill::isExit($orderIssue->id,$logistic_number_return)) $orderIssue->update(['is_new_rejecting' => '有']);
+        $orderIssue->joinRejectedBill($logistic_number_return);
+        $orderIssue->syncRejectingStatus();      // 问题件同步订单状态
+        return OrderIssueRejectedBill::query()->with('rejectedBill.items')
+                ->where('order_issue_id',$orderIssue->id)
+                ->where('logistic_number_return',$logistic_number_return)->first() ?? false;
+    }
+
+    /**
+     * 删除连接
+     * @param OrderIssue $orderIssue
+     * @param $logistic_number_return
+     * @return void|null|boolean
+     */
+    public function unJoinRejectedBill($orderIssue,$logistic_number_return)
+    {
+        $orderIssueRejectedBill = OrderIssueRejectedBill::query()
+            ->where('order_issue_id',$orderIssue->id)
+            ->where('logistic_number_return',$logistic_number_return)->first();
+        if(!$orderIssueRejectedBill)return null;
+
+        $bool = $orderIssue->unJoinRejectedBill($logistic_number_return);
+        $orderIssue->syncRejectingStatus();      // 问题件同步订单状态
+        if($orderIssue->rejectedBills->count() == 0)$orderIssue->update(['is_new_rejecting' => '无']);
+        return $bool;
+    }
+
+    /**
+     * 修改连接
+     * @param  OrderIssue $orderIssue
+     * @param $logistic_number_return
+     * @param $logistic_number_return_update
+     * @return null|boolean|Builder|Model|object
+     */
+    public function reviseJoinRejectedBill($orderIssue,$logistic_number_return,$logistic_number_return_update)
+    {
+        $orderIssueRejectedBill = OrderIssueRejectedBill::query()->where('order_issue_id',$orderIssue->id)
+            ->where('logistic_number_return',$logistic_number_return)->first();
+        if($orderIssueRejectedBill) return null;
+        $orderIssue->reviseJoinRejectedBill($logistic_number_return,$logistic_number_return_update);
+        $orderIssue->syncRejectingStatus();      // 问题件同步订单状态
+        return OrderIssueRejectedBill::query()->with('rejectedBill')
+                ->where('order_issue_id',$orderIssue->id)
+                ->where('logistic_number_return',$logistic_number_return)->first() ?? false;
+    }
+
+    /**
+     * 退回件同步问题件
+     * @param RejectedBill|Controller $rejectedBills
+     * @return void
+     */
+    public function syncOrderIssue($rejectedBills)
+    {
+        if(!$rejectedBills)return;
+        if(is_array($rejectedBills)){
+            foreach ($rejectedBills as $rejectedBill) {
+                $rejectedBill->syncOrderIssue();
+            }
+            return;
+        }
+        $rejectedBills->syncOrderIssue();
+    }
+
+    /**
+     * 问题件同步退回件
+     * @param OrderIssue $orderIssue
+     */
+    public function syncRejectedBill($orderIssue)
+    {
+        if(!$orderIssue)return;
+        $order_packages = $orderIssue->order->packages ?? collect();
+        if(!$order_packages)return;
+        $logistic_number_return = RejectedBill::query()->whereIn('logistic_number_return',$order_packages->map(function($rejectedBill){
+            return $rejectedBill->logistic_number_return;
+        }))->get();
+        $orderIssue->joinRejectedBill($logistic_number_return);
+        $orderIssue->syncRejectingStatus();
+    }
+
+    /**
+     * 问题件更新退单状态
+     * @param OrderIssue|Controller $order_issues
+     */
+    public function syncOrderIssueRejectingStatus($order_issues)
+    {
+        /**@var OrderIssue $orderIssue */
+        if(!$order_issues)return;
+        if(is_array($order_issues)){
+            foreach ($order_issues as $orderIssue) {
+                $orderIssue->syncRejectingStatus();
+            }
+            return;
+        }
+        $order_issues->syncRejectingStatus();
+    }
+
+
+
+}

+ 24 - 11
app/Services/OrderIssueService.php

@@ -51,7 +51,7 @@ class OrderIssueService
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
                 $query->with('barcodes');
             }]);
-        }, 'rejectedBill' => function ($query) {
+        }, 'orderIssueRejectedBills.rejectedBill' => function ($query) {
             $query->with(['items.quality']);
         }, 'secondOrder' => function ($query) {
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
@@ -374,8 +374,9 @@ class OrderIssueService
     {
         if(!$orderIssues)return;
         foreach ($orderIssues as $orderIssue) {
-            $orderIssue->syncRejectedBill();
-            $orderIssue->同步退单状态();
+            /**@var OrderIssue $orderIssue */
+            $orderIssue->syncRejectedBills();
+            $orderIssue->syncRejectingStatus();
         }
     }
 
@@ -410,8 +411,10 @@ class OrderIssueService
         ];
         $orderIssue = null;
         try {
+            /** @var OrderIssue $orderIssue */
             $orderIssue = OrderIssue::query()->create($arr);
-            $orderIssue->同步退单状态();
+            $orderIssue->syncRejectedBills();
+            $orderIssue->syncRejectingStatus();
             $orderIssue->order = $order;
             app('LogService')->log(__METHOD__, __FUNCTION__, '创建问题件' . json_encode($orderIssue));
         } catch (\Exception $e) {
@@ -455,6 +458,7 @@ class OrderIssueService
 
     public function create(array $arr)
     {
+        /** @var OrderIssue $orderIssue */
         $orderIssue = OrderIssue::query()->create($arr);
         if (!$arr['order_id']) {
             $order = app("OrderService")->createOrder($arr);
@@ -462,20 +466,23 @@ class OrderIssueService
             $orderIssue->save();
             app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
         }
-        $orderIssue->同步退单状态();
+        $orderIssue->syncRejectedBills();
+        $orderIssue->syncRejectingStatus();
         return $orderIssue;
     }
 
     public function createByLogisticNumber(array $arr)
     {
+        /** @var OrderIssue $orderIssue */
         $arr['code']='null_'.Uuid::uuid4();
         $order = app("OrderService")->createOrder($arr);
         app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
         $orderIssue = OrderIssue::query()->create($arr);
         $orderIssue['order_id'] = $order['id'];
         OrderPackage::query()->create(['order_id' => $order['id'], 'logistic_number' => $arr['logistic_number_return']]);
-        $orderIssue->同步退单状态();
         $orderIssue->update(['order_id' => $order['id']]);
+        $orderIssue->syncRejectedBills();
+        $orderIssue->syncRejectingStatus();
         return $orderIssue;
     }
 
@@ -512,13 +519,19 @@ class OrderIssueService
 
     public function updateSecondLogisticNumber($id, $logisticNumber)
     {
-        $orderIssue = OrderIssue::query()->where('id', $id)->first();
-        if(!$orderIssue->second_client_no){
-            $orderIssue->update(['second_logistic_number'=>$logisticNumber]);
-            return ['success' => true,'second_logistic_number' => $logisticNumber];
+        $orderIssue = OrderIssue::query()->where('id',$id)->first();
+        // 有填写二次订单号 并没有对应的订单号
+        if($orderIssue->second_client_no){
+            if(!$orderIssue->secondOrder){
+                $orderIssue->update(['second_logistic_number'=>$logisticNumber]);
+                return ['success' => true,'second_logistic_number' => $logisticNumber];
+            }else{
+                return ['success' => false,'message' => '二次客户订单号对应的订单已存在,无法更改快递单号'];
+            }
         }
+        // 没有填写二次订单号
         $order = app(OrderService::class)->getOrderByLogisticNumber($logisticNumber);
-        if (!$order) {
+        if (is_null($order)) {
             $orderIssue->update(['second_logistic_number' => $logisticNumber]);
             return ['success' => true, 'second_logistic_number' => $logisticNumber];
         }

+ 1 - 1
app/Services/OrderService.php

@@ -571,7 +571,7 @@ class OrderService
         $orderHeaderService = app('OracleDocOrderHeaderService');
         $orderHeaders = $orderHeaderService->getQuery()->whereIn('OrderNo',function($query)use($logisticNumber){
             $query->from('Act_Allocation_Details')->select('OrderNo')->where('picktotraceid',$logisticNumber);
-        });
+        })->first();
         if(!$orderHeaders) return null;
         $this->syncOrderInfo($orderHeaders);
         $code = $orderHeaders->first()->code;

+ 91 - 137
app/Services/OrderTrackingService.php

@@ -66,11 +66,12 @@ class OrderTrackingService
         $query = $this->getQuery($params);
 
         if (isset($params['client_code'])|| isset($params['logistic_id'])){     // client_code logistic
-            $query->whereHas('commodities.package.order', function ($query) use ($params) {
-                if($params['client_code'] ?? false){
-                    $query->where('client_code','like', $params['client_code']);
-                }
-            });
+            $query->where('order_client_code','like',$params['client_code']);
+//            $query->whereHas('commodities.package.order', function ($query) use ($params) {
+//                if($params['client_code'] ?? false){
+//                    $query->where('client_code','like', $params['client_code']);
+//                }
+//            });
         }
 
         if(isset($params['logistic_id']))$query->where('logistic_id',$params['logistic_id']);   // 快递
@@ -210,9 +211,6 @@ class OrderTrackingService
         /** @var DataHandlerService $dataService */
         $dataService = app(DataHandlerService::class);
 
-        $owners = app(OwnerService::class)->getByWmsOrders($orderHeaders);
-        $owner_id_map = $basSKUs_data = $dataService->dataHeader(['id'],$owners);
-
         $BasSKUs = app(OracleBasSkuService::class)->获取BasSKu_通过WMSOrderHeaders($orderHeaders);
         $BasSKUs_code_sku_map = $dataService->dataHeader(['customerid','sku'],$BasSKUs);
         $order_nos = data_get($orderHeaders,'*.orderno');
@@ -248,38 +246,7 @@ class OrderTrackingService
             $order_header = $order_headers_map[$order->code];
             if(!$order_header){continue ;}
             if($order_header->sostatus == 90){continue;}
-
-            $web_order_number = null;
-            if(preg_match('/^O[\d]/',$order_header['soreference1'] ?? '') > 0){
-                $web_order_number = $order_header['soreference1'];
-            }
-            $param = $this->getParamsByOrderHeaderAndOrder($order_header,$order);
-            $owner = $dataService->getKeyValue(['id'=>$order->owner_id],$owner_id_map);
-            $basSkU = $dataService->getKeyValue(['customerid'=>$owner->code,'sku'=>$item->commodity->sku],$BasSKUs_code_sku_map);
-            $gross_weight = round($basSkU->grossweight * $item->amount, 2);
-            $bulk = round($basSkU->cube * $item->amount, 2);
-
-            $order_client_code = $order->client_code;
-            if($param['client']=='天猫'){
-                $order_client_code = $this->get_d_edit_03($order_header,$item) ;
-            }
-
-            $params[] =[
-                'order_package_commodity_id' => $item->id,
-                'owner_id' => $order->owner_id,
-                'logistic_id' => $param['logistic_id'],
-                'order_client_code' =>$order_client_code,
-                'sale' => $param['sale'],
-                'client' => $param['client'],
-                'created_at' => $order->created_at,
-                'order_remark' => $param['order_remark'],
-                'pick_up_at' => $order_header->lastshipmenttime, // 提货时间,
-                'web_order_number' => $web_order_number,
-                'gross_weight'=> $gross_weight,
-                'bulk'=> $bulk,
-                'is_on_duty_shift'=> $param['is_on_duty_shift'],
-                'planning_sent_at' => $param['planning_sent_at'] ?? ''
-            ];
+            $params[] = $this->getCreateParams($order_header,$order,$item,$BasSKUs_code_sku_map);
         }
         try {
             if (count($params) > 0) {
@@ -292,17 +259,17 @@ class OrderTrackingService
     }
 
     public function get_d_edit_03($orderHeader,$orderPackageCommodity){
-        $sku_line_no = null;
+        $orderLineno = null;
         foreach ($orderHeader->actAllocationDetails as $actAllocationDetail) {
             if($actAllocationDetail->picktotraceid == $orderPackageCommodity->package->logistic_number
                 && $orderPackageCommodity->commodity->sku ==  $actAllocationDetail->sku){
-                $sku_line_no = $actAllocationDetail->skulineno;
+                $orderLineno = $actAllocationDetail->orderlineno;
                 break;
             }
         }
-        if($sku_line_no==null)return null;
+        if($orderLineno==null)return null;
         foreach ($orderHeader->oracleDOCOrderDetails as $oracleDOCOrderDetail) {
-            if($oracleDOCOrderDetail->orderlineno == $sku_line_no) {
+            if($oracleDOCOrderDetail->orderlineno == $orderLineno) {
                 return $oracleDOCOrderDetail['d_edi_03'];
             }
         }
@@ -339,18 +306,15 @@ class OrderTrackingService
             $order_code_map[$order->code] = $order;
             $order_package_commodity_order_code_map[$order->code][] = $order_package_commodity;
         }
-        $owners = app(OwnerService::class)->getByWmsOrders($orderHeaders);
-        $owner_code_map = $basSKUs_data = $dataService->dataHeader(['code'],$owners);
 
         $BasSKUs = app(OracleBasSkuService::class)->获取BasSKu_通过WMSOrderHeaders($orderHeaders);
         $BasSKUs_code_sku_map = $dataService->dataHeader(['customerid','sku'],$BasSKUs);
 
         $update_params = [];
-        $update_params[0] =['id','client','pick_up_at','order_remark','gross_weight','bulk','planning_sent_at'];
+        $update_params[0] =['id','client','pick_up_at','order_remark','gross_weight','bulk','planning_sent_at','web_order_number','order_client_code'];
         foreach ($orderHeaders as $orderHeader) {
             if($orderHeader->sostatus == '90'){continue;}
             $order_package_commodity_list = $order_package_commodity_order_code_map[$orderHeader->orderno] ?? false;
-
             if(!$order_package_commodity_list){continue;}
             $order = $order_code_map[$orderHeader->orderno];
 
@@ -358,27 +322,19 @@ class OrderTrackingService
                 $order_tracking = $order_tracking_id_map[$order_package_commodity->id]??false;
                 if(!$order_tracking){continue;}
 
-                $params = $this->getParamsByOrderHeaderAndOrder($orderHeader,$order);
-                $owner =  $dataService->getKeyValue(['code'=>$orderHeader->customerid],$owner_code_map);
-                $basSku = $dataService->getKeyValue(['customerid'=>$owner->code,'sku'=>$order_package_commodity->commodity->sku],$BasSKUs_code_sku_map);
-                $gross_weight = round($basSku->grossweight * $order_package_commodity->amount,2) ;
-                $bulk = round($basSku->cube * $order_package_commodity->amount,2) ;
+                $params = $this->getCreateParams($orderHeader,$order,$order_package_commodity,$BasSKUs_code_sku_map);
+                $params['id'] = $order_tracking->id;
                 if($order_tracking->owner_id != $params['owner_id'] ||
                     $order_tracking->client !=$params['client'] ||
                     $order_tracking->order_remark != $params['order_remark'] ||
                     $order_tracking->pick_up_at != $params['pick_up_at'] ||
-                    $order_tracking->gross_weight != $gross_weight ||
-                    $order_tracking->bulk != $bulk){
-                    $update_params[] = [
-                        'id' => $order_tracking->id,
-                        'client' => $params['client'],
-                        'pick_up_at' => $params['pick_up_at'],
-                        'order_remark' => $params['order_remark'],
-                        'web_order_number' => $params['web_order_number'],
-                        'gross_weight'  => $gross_weight,
-                        'bulk' => $bulk,
-                        'planning_sent_at' => $params['planning_sent_at']
-                    ];
+                    $order_tracking->gross_weight != $params['gross_weight'] ||
+                    $order_tracking->bulk != $params['bulk'] ||
+                    $order_tracking->client != $params['client']
+                    || $order_tracking->order_client_code != $params['order_client_code']
+                ){
+                    $params['updated_at'] = Carbon::now();
+                    $update_params[] = $params;
                 }
             }
         }
@@ -387,22 +343,14 @@ class OrderTrackingService
         }
         $insert_params = [];
         foreach ($orderHeaders as $orderHeader) {
-            $order_package_commodity_list=  $order_package_commodity_order_code_map[$orderHeader->orderno] ?? false;
+            $order_package_commodity_list = $order_package_commodity_order_code_map[$orderHeader->orderno] ?? false;
             if(!$order_package_commodity_list)continue;
             foreach ($order_package_commodity_list as $item) {
-                $order_tracking =  $order_tracking_id_map[$item->id] ?? false;
+                $order_tracking = $order_tracking_id_map[$item->id] ?? false;
                 if(!$order_tracking){
                     $order = $order_code_map[$orderHeader->orderno] ?? false;
                     if(!$order) continue;
-                    $basSkU = $dataService->getKeyValue(['customerid'=>$orderHeader->customerid,'sku'=>$item->commodity->sku],$BasSKUs_code_sku_map);
-                    $gross_weight = round($basSkU->grossweight * $item->amount, 2);
-                    $bulk = round($basSkU->cube * $item->amount, 2);
-                    $param = $this->getParamsByOrderHeaderAndOrder($orderHeader,$order);
-                    $param['order_package_commodity_id'] =$item->id;
-                    $param['order_client_code'] = $order->client_code;
-                    $param['gross_weight'] = $gross_weight;
-                    $param['bulk'] = $bulk;
-                    $insert_params[] =$param;
+                    $insert_params[] = $this->getCreateParams($orderHeader,$order,$item,$BasSKUs_code_sku_map);
                 }
             }
         }
@@ -417,53 +365,6 @@ class OrderTrackingService
         $this->删除订单追踪_订单取消($orderHeaders);
     }
 
-    /**
-     * @param OracleDOCOrderHeader $orderHeader
-     * @param Order $order
-     * @return array
-     */
-    public function getParamsByOrderHeaderAndOrder($orderHeader,$order)
-    {
-        /** @var LogisticService $logisticService */
-        $logisticService = app('LogisticService');
-        $client = $orderHeader['issuepartyname'] ?? '';
-        $order_remark = $orderHeader['notes'] ?? '';
-        $web_order_number = null;
-        if(preg_match('/^O[\d]/',$orderHeader['soreference1'] ?? '') > 0){
-            $web_order_number = $orderHeader['soreference1'];
-        }
-        $pick_up_at = $orderHeader->lastshipmenttime;
-        $planning_sent_at = null;
-
-        // 快递方式
-        $logistic = $logisticService->getLogisticByCode($orderHeader['userdefine1']);
-        if($orderHeader['userdefine1'] =='ZT') $logistic = $logisticService->getLogisticByCode('XJWL'); // 自提转新杰物流
-        if(isset($pick_up_at)){
-             $logisticTiming = app(LogisticTimingService::class)->findByParams($orderHeader['c_city']??'',$orderHeader['c_province']??'',$logistic['id']);
-             if($logisticTiming)$planning_sent_at = Carbon::parse((string)$pick_up_at)->addDays($logisticTiming->days_at_working); // 预期到货时间
-        }
-        if(stristr($order_remark,'[')){
-            $items = [];
-            preg_match_all('/^(.*?)(\\[)(.*?)(\\])(.*?)$/u',$order_remark,$items);
-            $client = $items[1][0];
-            $order_remark = $items[3][0];
-        }
-        if(mb_strpos($client,'天猫')!=false)$client='天猫';
-        if(mb_strpos($client,'京东')!=false)$client='京东';
-        return [
-            'owner_id' => $order->owner_id,
-            'logistic_id' => $logistic['id'],
-            'client' => $client,
-            'sale' => $orderHeader['issuepartyname'] ?? '',
-            'created_at' => $order->created_at,
-            'order_remark' => $order_remark,
-            'pick_up_at' => $orderHeader['lastshipmenttime'] ?? '', // 提货时间
-            'web_order_number' =>$web_order_number,
-            'is_on_duty_shift'=>$planning_sent_at?'是':null,
-            'planning_sent_at' => (string)$planning_sent_at
-        ];
-    }
-
     /**
      * @param Collection $orderHeaders
      */
@@ -482,7 +383,7 @@ class OrderTrackingService
     {
         if($orderHeaders->count() == 0){return  collect();}
         $orderNos = data_get($orderHeaders,'*.orderno');
-        return OrderPackageCommodities::query()
+        return OrderTracking::query()
             ->with('commodities.package.order')
             ->whereIn('order_package_commodity_id',function($query)use($orderNos){
                 $query->from('order_package_commodities')->select('id')->whereIn('order_package_id',function($query)use($orderNos) {
@@ -507,19 +408,6 @@ class OrderTrackingService
         }
     }
 
-    /**
-     * @param OracleBasSKU $basSkU
-     * @param OrderPackageCommodities $orderPackageCommodity
-     * @return array
-     */
-    public function getGrossWeightAndBulk($basSkU,$orderPackageCommodity)
-    {
-        return [
-            'gross_weight' =>round($basSkU->grossweight * $orderPackageCommodity->amount, 2),
-            'bulk' =>round($basSkU->cube * $orderPackageCommodity->amount, 2),
-        ];
-    }
-
     public function fillInOrderTracking($orderTracking = null)
     {
         $orderTrackingIds = [];
@@ -557,4 +445,70 @@ class OrderTrackingService
         }
     }
 
+    public function getCreateParams($orderHeader,$order,$orderPackageCommodity,$BasSKUs_code_sku_map)
+    {
+        $params = [];
+        /**
+         * @var LogisticService $logisticService
+         * @var DataHandlerService $dataService
+         */
+        $logisticService = app('LogisticService');
+        $dataService = app('DataHandlerService');
+        $params['order_package_commodity_id'] = $orderPackageCommodity->id;
+        if(preg_match('/^O[\d]/',$orderHeader['soreference1'] ?? '') > 0){  // web_order_number  web+订单号
+            $params['web_order_number'] =$orderHeader['soreference1'];
+        }else $params['web_order_number']= null;
+
+        $params['owner_id'] = $order->owner_id ?? null; // owner_id
+
+        if($orderHeader['userdefine1'] =='ZT'){  // logistic_id
+            $logistic = $logisticService->getLogisticByCode('XJWL'); // 自提转新杰物流
+            $params['logistic_id'] = $logistic->id ?? null;
+        }else{
+            $logistic = $logisticService->getLogisticByCode($orderHeader['userdefine1']);
+            $params['logistic_id'] = $logistic->id ?? null;
+        }
+
+        $order_remark = $orderHeader['notes'] ?? '';        // 订单备注
+        if(mb_stristr($order_remark,'天猫') && mb_stristr($order_remark,'赠品')){ // client and order_remark 商铺 和 订单备注
+            $params['client'] = '天猫(赠品)';
+            $params['order_remark'] = $order_remark;
+        }else{
+            if(mb_stristr($order_remark,'[')){
+                $items = [];
+                preg_match_all('/^(.*?)(\\[)(.*?)(\\])(.*?)$/u',$order_remark,$items);
+                $params['client'] = $items[1][0];
+                $params['order_remark'] = $items[3][0];
+            }else{
+                $params['client'] = $orderHeader['issuepartyname'];
+                $params['order_remark'] = $order_remark;
+            }
+        }
+        if(mb_stristr($orderHeader['issuepartyname'],'天猫') && $params['client'] !== '天猫(赠品)') $params['client'] = '天猫';
+
+        if($params['client'] == '天猫') // order_client_code 订单号  店铺包含天猫
+            $params['order_client_code'] = $this->get_d_edit_03($orderHeader,$orderPackageCommodity);
+        else
+            $params['order_client_code'] = $order->client_code;
+
+        $params['sale'] = $orderHeader['issuepartyname'] ?? null;   // sale 销售
+
+        $params['pick_up_at'] = $orderHeader['lastshipmenttime'] ?? null;  // pick_up_at 提货时间
+
+        if($params['pick_up_at']){  //  planning_sent_at   预期到货时间
+            $logisticTiming = app(LogisticTimingService::class)->findByParams($orderHeader['c_city']??'',$orderHeader['c_province']??'',$logistic['id']);
+            if($logisticTiming) $params['planning_sent_at'] = (string)Carbon::parse((string)$params['pick_up_at'])->addDays($logisticTiming->days_at_working); // 预期到货时间
+            else  $params['planning_sent_at'] = null;
+        }else {
+            $params['planning_sent_at'] = null;
+        }
+
+        $params['is_on_duty_shift'] = isset($params['planning_sent_at']) ? '是' : null;  //is_on_duty_shift 是否卡班
+
+        $basSkU = $dataService->getKeyValue(['customerid'=>$orderHeader->customerid,'sku'=>$orderPackageCommodity->commodity->sku],$BasSKUs_code_sku_map);
+        $params['gross_weight'] = round($basSkU->grossweight * $orderPackageCommodity->amount, 2) ?? null;  // 重量
+        $params['bulk'] = round($basSkU->cube * $orderPackageCommodity->amount, 2) ?? null; // 体积
+        $params['created_at'] = Carbon::now();  // 创建时间
+        return $params;
+    }
 }

+ 3 - 2
app/Services/PackageService.php

@@ -16,11 +16,12 @@ Class PackageService
 {
     use ServiceAppAop;
     private function conditionQuery($params){
-        $packages = OrderPackage::query()->with(['order'=>function($query){
+        $packages = OrderPackage::query()->with(['order','paperBox','measuringMachine'])
+        ->whereHas("order",function ($query){
             /** @var Builder $query */
             $ownerIds=app('UserService')->getPermittingOwnerIds(Auth::user());
             $query->with('owner','logistic')->whereIn("owner_id",$ownerIds ?? []);
-        },'paperBox','measuringMachine'])->orderBy(TABLE.'id','DESC');
+        })->orderBy(TABLE.'id','DESC');
         if ($params['owner_id'] ?? false){
             $owner_id = explode(',',$params['owner_id']);
             $packages->whereHas('order',function ($query)use($owner_id){

+ 5 - 34
app/Services/RejectedBillService.php

@@ -34,42 +34,13 @@ Class RejectedBillService
         return RejectedBill::query()->create($params);
     }
 
+    /**
+     * 同步退回单号
+     * @param RejectedBill $rejectedBill
+     */
     public function syncOrderIssue($rejectedBill)
     {
-        /**
-         * @var OrderIssue $orderIssue
-         */
-        $orderIssue = $rejectedBill->orderIssue()->first();
-        if (!$orderIssue && $rejectedBill['logistic_number'] === '原单退回') {   // 原单退回
-            $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($rejectedBill) {
-                $query->where('client_code', $rejectedBill['order_number']);
-            })->first();
-        } else if (!$orderIssue && isset($rejectedBill->logistic_number_return)) {
-            $orderIssue = OrderIssue::query()->with('order.packages')->whereHas('order.packages', function ($query) use ($rejectedBill) {
-                $query->where('logistic_number', $rejectedBill->logistic_number_return);
-            })->first();
-        }
-        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();
-//                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
-//                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
-//                })->first();
-            if (!isset($orderHeader)) return;
-            $orderIssue = OrderIssue::query()->with('order')->whereHas('order', function ($query) use ($orderHeader) {
-                $query->where('code', $orderHeader->orderno);
-            })->first();
-        }
-        if (isset($orderIssue)) {
-            // 更新问题件的退回单号
-            if ($orderIssue['logistic_number_return'] != $rejectedBill['logistic_number_return'])
-                $orderIssue->update(['logistic_number_return' => $rejectedBill['logistic_number_return']]);
-            //确认问题件有的时候需要更新状态和提示
-            $orderIssue->同步退单状态();
-            $orderIssue->update(['is_new_rejecting' => '有']);
-            app('LogService')->log(__METHOD__, __FUNCTION__, '退回单同步问题件' . json_encode($rejectedBill) . json_encode($orderIssue));
-        }
+        $rejectedBill->syncOrderIssue();
     }
 
     public function syncLoadedStatusByAsnHerder($asnHerders)

+ 3 - 3
app/Services/RejectedService.php

@@ -24,9 +24,9 @@ class RejectedService
     private function conditionQuery(array $param)
     {
         $user = Auth::user();
-        $rejectedBills = RejectedBill::query()->with('user','owner', 'logistic', 'items.quality','orderIssue:logistic_number_return')
-            ->orderBy('rejected_bills.id', 'desc')->whereIn('rejected_bills.id_owner',
-            $user ? (app('UserService')->getPermittingOwnerIds($user) ?? []) : []);
+        $rejectedBills = RejectedBill::query()->with('user','owner', 'logistic', 'items.quality','orderIssueRejectedBill:logistic_number_return')
+            ->orderBy('rejected_bills.id', 'desc')
+            ->whereIn('rejected_bills.id_owner', $user ? (app('UserService')->getPermittingOwnerIds($user) ?? []) : []);
         $columnQueryRules = [
             'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
             'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],

+ 2 - 0
app/Services/StationTaskCommodityService.php

@@ -31,6 +31,7 @@ class StationTaskCommodityService
         $this->stationTaskService=null;
         $this->materialBoxService=null;
     }
+
     function get(array $kvPairs){
         ksort($kvPairs);
         return Cache::remember('stationTaskChild_'.md5(json_encode($kvPairs)), config('cache.expirations.oftenChange'), function ()use($kvPairs) {
@@ -42,6 +43,7 @@ class StationTaskCommodityService
             return $query->get();
         });
     }
+
     function createByBatches(Collection $batches,Collection $stationTasks_toAttach): Collection
     {
         $this->instant($this->stationTaskService,'StationTaskService');

+ 43 - 0
database/migrations/2021_01_07_092258_create_order_issue_rejected_bill_table.php

@@ -0,0 +1,43 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+use App\OrderIssue;
+
+class CreateOrderIssueRejectedBillTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_issue_rejected_bill', function (Blueprint $table) {
+            $table->bigInteger('order_issue_id')->index();
+            $table->string('logistic_number_return')->index();
+        });
+        $this->processOrderIssueRejectedBill();
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_issue_rejected_bill');
+    }
+
+    public function processOrderIssueRejectedBill()
+    {
+        OrderIssue::query()->withTrashed()->whereNotNull('logistic_number_return')->chunkById(200,function($orderIssues){
+            $orderIssues->each(function($orderIssue){
+                if($orderIssue->logistic_number_return)
+                    $orderIssue->rejectedBills()->syncWithoutDetaching([$orderIssue->logistic_number_return]);
+            });
+        });
+    }
+}

+ 1 - 1
resources/js/queryForm/queryForm.js

@@ -5,7 +5,7 @@ const query = function getQueryForm(data) {
         this.method = data.method || 'get';
         this.url = data.url || getPathname();
         this.condition = data.condition;
-        this.paginations = [50, 100, 200, 500,1000] || data.paginations;
+        this.paginations =data.paginations ? data.paginations : [50, 100, 200, 500,1000] ;
         this.isPaginations = data.isPaginations !== false;
         this.keydownfun = data.keydownfun || undefined;
         this.selectChange = data.selectChange || undefined;

+ 27 - 7
resources/views/customer/project/create.blade.php

@@ -695,11 +695,14 @@
                             if (res.errors.owner_id)window.tempTip.show(res.errors.owner_id[0]);
                             return;
                         }
-                        this.model.express.id = res.id;
                         this.model.express.items.forEach((item,i)=>{
                             item.id = res.details[i].id;
                         });
-                        this.selectedModel.express.unshift(this.model.express);
+                        if (this.model.express.id) this.selectedModel.express[this.model.express.index] = this.model.express;
+                        else{
+                            this.model.express.id = res.id;
+                            this.selectedModel.express.unshift(this.model.express);
+                        }
                         this.model.express = {
                             name:"",
                             logistics:[],
@@ -732,11 +735,15 @@
                             this.errors = res.errors;
                             return;
                         }
-                        this.model.logistic.id = res.id;
                         this.model.logistic.items.forEach((item,i)=>{
                             item.id = res.details[i].id;
                         });
-                        this.selectedModel.logistic.unshift(this.model.logistic);
+                        console.log(this.model.logistic);
+                        if (this.model.logistic.id) this.selectedModel.logistic[this.model.logistic.index] = this.model.logistic;
+                        else {
+                            this.model.logistic.id = res.id;
+                            this.selectedModel.logistic.unshift(this.model.logistic);
+                        }
                         this.model.logistic = {
                             items:[],
                             other_ranges:[],
@@ -765,10 +772,10 @@
                             this.errors = res.errors;
                             return;
                         }
-                        this.model.directLogistic.id = res.id;
                         this.model.directLogistic.items.forEach((item,i)=>{
                             item.id = res.details[i].id;
                         });
+                        this.model.directLogistic.id = res.id;
                         this.selectedModel.directLogistic = this.model.directLogistic;
                         this.model.directLogistic = {
                             items:[],
@@ -1400,8 +1407,21 @@
                     this.model.operation.index = index;
                 },
                 //编辑快递
-                editExpress(){
-
+                editExpress(index){
+                    this.switchType("express");
+                    this.model.express = JSON.parse(JSON.stringify(this.selectedModel.express[index]));
+                    this.model.express.index = index;
+                },
+                //编辑物流
+                editLogistic(index){
+                    this.switchType("logistic");
+                    this.model.logistic = JSON.parse(JSON.stringify(this.selectedModel.logistic[index]));
+                    this.model.logistic.index = index;
+                },
+                //编辑直发车
+                editDirectLogistic(){
+                    this.switchType("directLogistic");
+                    this.model.directLogistic = JSON.parse(JSON.stringify(this.selectedModel.directLogistic));
                 },
             },
         });

+ 12 - 12
resources/views/customer/project/part/_three.blade.php

@@ -138,7 +138,7 @@
                         <th>详情</th>
                         <th></th>
                     </tr>
-                    <tbody v-for="(express,i) in selectedModel.express" @click="editExpress()">
+                    <tbody v-for="(express,i) in selectedModel.express" @dblclick="editExpress(i)" style="cursor: pointer">
                         <tr>
                             <td>
                                 <div class="text-overflow-warp-100 small">
@@ -148,11 +148,11 @@
                             <td>@{{ express.name }}</td>
                             <td>@{{ express.initial_weight }}</td>
                             <td>@{{ express.additional_weight }}</td>
-                            <td @click="show('express-item-'+i)" class="cursor-pointer">
+                            <td @click.stop="show('express-item-'+i)" class="cursor-pointer">
                                 <span class="fa" :class="upList['express-item-'+i] ? 'fa-angle-double-right' : 'fa-angle-double-down'"></span>
                                 &nbsp;@{{ express.items.length }} 省份</td>
                             <td>
-                                <span class="cursor-pointer text-danger font-weight-bold" @click="delExpress(express,i)">&times;</span>
+                                <span class="cursor-pointer text-danger font-weight-bold" @click.stop="delExpress(express,i)">&times;</span>
                             </td>
                         </tr>
                         <tr>
@@ -170,7 +170,7 @@
                                             <td>@{{ item.initial_weight_price }}</td>
                                             <td>@{{ item.additional_weight_price }}</td>
                                             <td>
-                                                <span class="cursor-pointer text-danger font-weight-bold" @click="deleteExpressItem(item,j,i)">&times;</span>
+                                                <span class="cursor-pointer text-danger font-weight-bold" @click.stop="deleteExpressItem(item,j,i)">&times;</span>
                                             </td>
                                         </tr>
                                     </table>
@@ -200,7 +200,7 @@
                         <th>详情</th>
                         <th></th>
                     </tr>
-                    <tbody v-for="(logistic,i) in selectedModel.logistic">
+                    <tbody v-for="(logistic,i) in selectedModel.logistic" @dblclick="editLogistic(i)">
                         <tr>
                             <td>
                                 <div class="text-overflow-warp-100 small">
@@ -215,12 +215,12 @@
                             <td>@{{ logistic.pick_up_price }}</td>
                             <td>@{{ logistic.fuel_price }}</td>
                             <td>@{{ logistic.service_price }}</td>
-                            <td @click="show('logistic-item-'+i)" class="cursor-pointer">
+                            <td @click.stop="show('logistic-item-'+i)" class="cursor-pointer">
                                 <span class="fa" :class="upList['logistic-item-'+i] ? 'fa-angle-double-right' : 'fa-angle-double-down'"></span>
                                 &nbsp;@{{ logistic.items.length }} 地区
                             </td>
                             <td>
-                                <span class="cursor-pointer text-danger font-weight-bold" @click="delLogistic(logistic,i)">&times;</span>
+                                <span class="cursor-pointer text-danger font-weight-bold" @click.stop="delLogistic(logistic,i)">&times;</span>
                             </td>
                         </tr>
                         <tr>
@@ -250,7 +250,7 @@
                                             <td>@{{ item.initial_amount }}</td>
                                             <td>@{{ item.rate }}<span v-if="item.rate" class="font-weight-bold">&nbsp;%</span></td>
                                             <td>
-                                                <span class="cursor-pointer text-danger font-weight-bold" @click="deleteLogisticItem(item,j,i)">&times;</span>
+                                                <span class="cursor-pointer text-danger font-weight-bold" @click.stop="deleteLogisticItem(item,j,i)">&times;</span>
                                             </td>
                                         </tr>
                                     </table>
@@ -265,16 +265,16 @@
             <div class="card-header bg-light-info">
                 <span class="pull-left font-weight-bold cursor-pointer" @click="show('directLogistic')"><span class="fa fa-rocket"></span>&nbsp;直发</span>
             </div>
-            <div class="card-body" id="directLogistic">
+            <div class="card-body" id="directLogistic" @dblclick="editDirectLogistic()" style="cursor: pointer">
                 <div class="row">
                     <label class="col-4">名称:<b>@{{ selectedModel.directLogistic.name }}</b></label>
                     <label class="col-4">起步数(KM):<b>@{{ selectedModel.directLogistic.base_km }}</b></label>
                     <label class="col-1 offset-3" v-if="selectedModel.directLogistic.name">
-                        <span class="cursor-pointer text-danger font-weight-bold" @click="delDirectLogistic(selectedModel.directLogistic)">&times;</span>
+                        <span class="cursor-pointer text-danger font-weight-bold" @click.stop="delDirectLogistic(selectedModel.directLogistic)">&times;</span>
                     </label>
                 </div>
                 <div class="row">
-                    <div class="cursor-pointer text-primary col-2" @click="show('directLogistic-item')">
+                    <div class="cursor-pointer text-primary col-2" @click.stop="show('directLogistic-item')">
                         <span class="fa" :class="upList['directLogistic-item'] ? 'fa-angle-double-right' : 'fa-angle-double-down'"></span>&nbsp;详情</div>
                     <div class="col-10" id="directLogistic-item">
                         <table class="table table-sm">
@@ -289,7 +289,7 @@
                                 <td>@{{ item.base_fee }}</td>
                                 <td>@{{ item.additional_fee }}</td>
                                 <td>
-                                    <span class="cursor-pointer text-danger font-weight-bold" @click="deleteDirectLogisticItem(item,i)">&times;</span>
+                                    <span class="cursor-pointer text-danger font-weight-bold" @click.stop="deleteDirectLogisticItem(item,i)">&times;</span>
                                 </td>
                             </tr>
                         </table>

Datei-Diff unterdrückt, da er zu groß ist
+ 304 - 306
resources/views/order/issue/index.blade.php


+ 1 - 1
resources/views/rejected/search/general.blade.php

@@ -76,7 +76,7 @@
                         </td>
                         <td class="text-nowrap">
 {{--                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="issueIds.includes(rejectedBill.id)" class="badge badge-pill badge-danger">问题件</span>--}}
-                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="rejectedBill.order_issue" class="badge badge-pill badge-danger">问题件</span>
+                            <span class="text-muted" style="opacity:0.7">@{{ i+1 }}</span> <span v-if="rejectedBill.order_issue_rejected_bill" class="badge badge-pill badge-danger">问题件</span>
                         </td>
                         <td class="text-muted">
                             <span v-if="rejectedBill.is_checked==1" class="text-success">

+ 8 - 0
routes/apiLocal.php

@@ -33,6 +33,8 @@ Route::post('waybill/changeCharge', 'WaybillController@changeCharge');
 Route::post('rejectedBill/getRejectedByLogisticNumberReturn','RejectedController@apiGetRejectedByLogisticNumberReturn');
 
 Route::group(['prefix' => 'order'], function () {
+
+
     Route::group(['prefix'=>'issue'],function(){
 
         Route::post('orderIssueHasClientCode', 'OrderIssueController@apiOrderIssueHasClientCode');
@@ -55,6 +57,12 @@ Route::group(['prefix' => 'order'], function () {
         Route::match(['get','post'],'disposeImport','OrderIssueController@disposeImportApi');
         Route::post('financeConfirm','OrderIssueController@financeConfirmApi');
 
+        Route::group(['prefix'=>'rejectedBill'],function(){
+            Route::post('join','OrderIssueRejectedBillController@joinRejectedBillApi');
+            Route::post('unJoin','OrderIssueRejectedBillController@unJoinRejectedBillApi');
+            Route::post('reviseJoin','OrderIssueRejectedBillController@reviseJoinRejectedBillApi');
+        });
+
          Route::group(['prefix'=>'onTop'],function(){
             Route::post('/store', 'OrderIssueOnTopController@apiStore');
             Route::post('/cancelTop', 'OrderIssueOnTopController@apiDestroy');

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.