Просмотр исходного кода

Merge branch 'master' into Haozi

# Conflicts:
#	app/Services/RejectedBillService.php
haozi 5 лет назад
Родитель
Сommit
c625bfc92e
88 измененных файлов с 3469 добавлено и 149 удалено
  1. 37 0
      app/Batch.php
  2. 53 0
      app/Console/Commands/SyncWMSOrderTask.php
  3. 88 0
      app/Http/Controllers/BatchController.php
  4. 1 1
      app/Http/Controllers/MeasureMonitorController.php
  5. 85 0
      app/Http/Controllers/OrderBinController.php
  6. 85 0
      app/Http/Controllers/OrderCommodityController.php
  7. 7 2
      app/Http/Controllers/OrderController.php
  8. 10 11
      app/Http/Controllers/OrderIssueController.php
  9. 1 0
      app/Http/Controllers/OrderTrackingController.php
  10. 2 1
      app/Http/Controllers/ProcessController.php
  11. 1 1
      app/Http/Controllers/ProcessStatisticController.php
  12. 142 2
      app/Http/Controllers/RejectedBillController.php
  13. 1 1
      app/Http/Controllers/RejectedBillItemController.php
  14. 85 0
      app/Http/Controllers/SortingStationController.php
  15. 52 14
      app/Http/Controllers/TestController.php
  16. 213 0
      app/Http/Controllers/api/thirdPart/flux/SortingController.php
  17. 5 5
      app/Http/Controllers/api/thirdPart/goodscan/PackageController.php
  18. 180 0
      app/Http/Controllers/api/thirdPart/haochuang/SortingController.php
  19. 3 2
      app/Http/Controllers/api/thirdPart/weight/PackageController.php
  20. 52 1
      app/Order.php
  21. 12 0
      app/OrderBin.php
  22. 35 0
      app/OrderCommodity.php
  23. 2 2
      app/OrderIssue.php
  24. 5 3
      app/OrderPackageCommodities.php
  25. 2 2
      app/Providers/AppServiceProvider.php
  26. 4 1
      app/Providers/RouteServiceProvider.php
  27. 22 6
      app/RejectedBill.php
  28. 1 1
      app/RejectedBillItem.php
  29. 2 2
      app/Services/LogisticService.php
  30. 2 2
      app/Services/OracleActAllocationDetailService.php
  31. 34 11
      app/Services/OracleDOCOrderHeaderService.php
  32. 207 1
      app/Services/OrderPackageCommoditiesService.php
  33. 117 16
      app/Services/OrderPackageService.php
  34. 126 5
      app/Services/OrderService.php
  35. 1 1
      app/Services/ProcessService.php
  36. 5 2
      app/Services/RejectedBillService.php
  37. 45 0
      app/Services/common/ExportService.php
  38. 41 0
      app/SortingStation.php
  39. 18 5
      config/api.php
  40. 12 0
      database/factories/BatchFactory.php
  41. 12 0
      database/factories/OrderBinFactory.php
  42. 12 0
      database/factories/OrderCommodityFactory.php
  43. 12 0
      database/factories/SortingStationFactory.php
  44. 1 0
      database/migrations/2020_07_24_072406_create_order_commodities_table.php
  45. 37 0
      database/migrations/2020_11_10_135835_create_batches_table.php
  46. 33 0
      database/migrations/2020_11_10_162349_create_order_bins_table.php
  47. 38 0
      database/migrations/2020_11_10_164914_create_sorting_stations_table.php
  48. 16 0
      database/seeds/BatchSeeder.php
  49. 16 0
      database/seeds/OrderBinSeeder.php
  50. 16 0
      database/seeds/OrderCommoditySeeder.php
  51. 16 0
      database/seeds/SortingStationSeeder.php
  52. 37 0
      resources/views/maintenance/batch/create.blade.php
  53. 43 0
      resources/views/maintenance/batch/edit.blade.php
  54. 81 0
      resources/views/maintenance/batch/index.blade.php
  55. 12 0
      resources/views/maintenance/batch/menu.blade.php
  56. 2 2
      resources/views/order/index/delivering.blade.php
  57. 144 0
      resources/views/rejected/importRejectedNumber.blade.php
  58. 8 2
      resources/views/rejected/search/general.blade.php
  59. 1 1
      resources/views/weight/measureMonitor/index.blade.php
  60. 7 0
      routes/api/thirdPart/flux.php
  61. 17 0
      routes/api/thirdPart/haochuang.php
  62. 1 0
      routes/apiLocal.php
  63. 1 0
      routes/web.php
  64. 8 0
      serves/excelExportGo/api/controller/controller.go
  65. 27 6
      serves/excelExportGo/excel/export.go
  66. 1 1
      tests/Services/CacheService/GetOrExecuteTest/GetOrExecuteTest.php
  67. 37 0
      tests/Services/OracleDOCOrderHeaderService/GetWMSORderOnStartDateTest/GetWMSOrderOnStartDateTest.php
  68. 39 0
      tests/Services/OracleDOCOrderHeaderService/GetWmsOrderOnStartDateCreateTest/GetWmsOrderOnstartDateCreateTest.php
  69. 38 0
      tests/Services/OracleDOCOrderHeaderService/GetWmsOrderOnStartDateEditTest/GetWmsOrderOnStartDateEditTest.php
  70. 0 29
      tests/Services/OrderIssueService/GetSqlListTest/GetSqlListTest.php
  71. 13 6
      tests/Services/OrderIssueService/OrderIssueTagTest/OrderIssueTagTest.php
  72. 85 0
      tests/Services/OrderPackageCommoditiesService/RegroupOrderCommoditiesTest/RegroupOrderCommoditiesTest.php
  73. 62 0
      tests/Services/OrderPackageService/CreateOrderPackageTest/CreateOrderPackageTest.php
  74. 50 0
      tests/Services/OrderPackageService/CreatePackageByOrderHeaderTest/CreatePackageByOrderHeaderTest.php
  75. 46 0
      tests/Services/OrderPackageService/CreatePackageInfoTest/CreatePackageInfoTest.php
  76. 28 0
      tests/Services/OrderPackageService/DeleteUnnecessaryPackageTest/DeleteUnnecessaryPackageTest.php
  77. 49 0
      tests/Services/OrderPackageService/GetInnerParamsTest/GetInnerParamsTest.php
  78. 118 0
      tests/Services/OrderService/CreateOrderByWMSOrderHeadersTest/CreateOrderByWMSOrderHeadersTest.php
  79. 40 0
      tests/Services/OrderService/CreateOrderInfoTest/CreateOrderInfoTest.php
  80. 1 1
      tests/Services/OrderService/FindOrCreateByClientCodeTest/FindOrCreateByClientCodeTest.php
  81. 42 0
      tests/Services/OrderService/GetByWmsOrdersTest/GetByWmsOrdersTest.php
  82. 113 0
      tests/Services/OrderService/GetCreateOrderModelByWMSOrderHeadersTest/GetCreateOrderModelByWMSOrderHeadersTest.php
  83. 83 0
      tests/Services/OrderService/GetCreateOrderModelsTest/GetCreateOrderModelsTest.php
  84. 71 0
      tests/Services/OrderService/GetOrderByLogisticNumberTest/GetOrderByLogisticNumberTest.php
  85. 45 0
      tests/Services/OrderService/GetParamByOrderHeaderTest/GetParamByOrderHeaderTest.php
  86. 106 0
      tests/Services/OrderService/GetUpdateOrderModelByWMSOrderHeadersTest/GetUpdateModelByWmsOrderHeadersTest.php
  87. 4 0
      tests/sortingFluxNewBatch.http
  88. 4 0
      tests/sortingHaochuangProcess.http

+ 37 - 0
app/Batch.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Batch extends Model
+{
+    protected $fillable = [
+        'id','code','type', 'wms_type', 'status', 'wms_status', 'wms_created_at',
+    ];
+    public function orders(){
+        return $this->hasMany('App\Order','batch_id','id');
+    }
+    public function setProcessed(){
+        $this['status'] = '已处理';
+        $this->orders()->each(function (Order $order){
+            $order->setProcessed();
+        });
+        $this->update();
+    }
+    public function assignBins(){
+        $this->orders()->each(function (Order $order,$i){
+            $bin=new OrderBin(['order_id'=>$order['id'],'number'=>($i+1)]);
+            $bin->save();
+        });
+        return $this->orders()->count();
+    }
+    public function delete()
+    {
+        $this->orders()->each(function(Order $order){
+            $order->delete();
+        });
+        return parent::delete(); // TODO: Change the autogenerated stub
+    }
+
+}

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

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

+ 88 - 0
app/Http/Controllers/BatchController.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Batch;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+
+class BatchController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Http\Response|\Illuminate\View\View
+     */
+    public function index()
+    {
+        if(!Gate::allows('波次-查询')){ return redirect(url('/'));  }
+        $batches=Batch::orderBy('id','desc')->paginate(50);
+        return view('maintenance.batch.index',compact('batches'));
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\Batch  $batch
+     * @return \Illuminate\Http\Response
+     */
+    public function show(Batch $batch)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\Batch  $batch
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(Batch $batch)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\Batch  $batch
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, Batch $batch)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Batch  $batch
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(Batch $batch)
+    {
+        //
+    }
+}

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

@@ -39,7 +39,7 @@ class MeasureMonitorController extends Controller
 
     public function speech(Request $request){
         $logistic=$request->input('logistic');
-        if (!$logistic)return '';
+        if (!$logistic)$logistic='空';
         if (file_exists("storage/".$logistic.'.mp3')){
             return "/storage/".$logistic.'.mp3';
         }

+ 85 - 0
app/Http/Controllers/OrderBinController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderBin;
+use Illuminate\Http\Request;
+
+class OrderBinController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\OrderBin  $orderBin
+     * @return \Illuminate\Http\Response
+     */
+    public function show(OrderBin $orderBin)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\OrderBin  $orderBin
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(OrderBin $orderBin)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\OrderBin  $orderBin
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, OrderBin $orderBin)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\OrderBin  $orderBin
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(OrderBin $orderBin)
+    {
+        //
+    }
+}

+ 85 - 0
app/Http/Controllers/OrderCommodityController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\OrderCommodity;
+use Illuminate\Http\Request;
+
+class OrderCommodityController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\OrderCommodity  $orderCommodity
+     * @return \Illuminate\Http\Response
+     */
+    public function show(OrderCommodity $orderCommodity)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\OrderCommodity  $orderCommodity
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(OrderCommodity $orderCommodity)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\OrderCommodity  $orderCommodity
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, OrderCommodity $orderCommodity)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\OrderCommodity  $orderCommodity
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(OrderCommodity $orderCommodity)
+    {
+        //
+    }
+}

+ 7 - 2
app/Http/Controllers/OrderController.php

@@ -85,6 +85,7 @@ class OrderController extends Controller
         $rejectedBillItems = [];
         //分箱号
         $picktotraceids = json_decode($result['picktotraceids'],true);
+        $rejectedBill_collect = collect();// 保存生成的rejectedBill
         foreach ($result['orders'] as $order){
             //不存在时将当前快递单号视为分箱号
             if (!($picktotraceids[$order->orderno] ?? false))$picktotraceids[$order->orderno] = [$order->soreference5];
@@ -106,7 +107,8 @@ class OrderController extends Controller
                     'is_loaded' =>0,
                     "id_operator" => Auth::id(),
                 ]);
-                app('LogService')->log(__METHOD__,"生成退货单",json_encode($order),Auth::user()['id']);
+                $rejectedBill_collect->push($rejectedBill);// 保存生成的rejectedBill
+                LogService::log(__METHOD__,"生成退货单",json_encode($order),Auth::user()['id']);
                 if ($commodities[$order->orderno] ?? false){
                     foreach ($commodities[$order->orderno] as $orderCommodities){
                         array_push($rejectedBillItems,[
@@ -122,7 +124,10 @@ class OrderController extends Controller
             }
         }
         $rejectedBillItemService->insert($rejectedBillItems);
-        app('LogService')->log(__METHOD__,"批量生成退货单详情",json_encode($rejectedBillItems),Auth::user()['id']);
+        LogService::log(__METHOD__,"批量生成退货单详情",json_encode($rejectedBillItems),Auth::user()['id']);
+        $rejectedBill_collect->each(function($rejectedBill)use($rejectedBillService){
+            $rejectedBillService->syncOrderIssue($rejectedBill);
+        });
         return ['success'=>true];
     }
 

+ 10 - 11
app/Http/Controllers/OrderIssueController.php

@@ -128,6 +128,8 @@ class OrderIssueController extends Controller
 
     public function exportOrderIssue(Request $request)
     {
+        ini_set('max_execution_time', 2500);
+        ini_set('memory_limit', '1526M');
         if (!Gate::allows('订单管理-问题件-查询')) {
             return redirect(url('/'));
         }
@@ -213,7 +215,6 @@ class OrderIssueController extends Controller
         }
     }
 
-
     public function apiEndOrderIssue(Request $request)
     {
         if (!Gate::allows('订单管理-问题件-编辑')) {
@@ -366,7 +367,7 @@ class OrderIssueController extends Controller
             app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent()));
             return ['success' => true];
         } catch (Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request)."||".$e->getMessage()."||".$e->getTraceAsString());
+            app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->getContent())."||".$e->getMessage()."||".$e->getTraceAsString());
             return ['success' => false,'fail_info' => $e->getMessage()];
         }
     }
@@ -511,7 +512,6 @@ class OrderIssueController extends Controller
         foreach ($array as $i => $str) {
 //            $string= preg_replace('/[\s,\,\,]+/','*++*',$str);
 //            $items = explode('*++*',$string);
-//            dd($items,$str);
             $items=[];
             preg_match('/^(\w*?)[\s,,;;]([\x{4e00}-\x{9fa5}]*?)[\s,,;;](.*?)[\s,,;;](\w*?)$/u', $str, $items);
             array_shift($items);
@@ -572,7 +572,7 @@ class OrderIssueController extends Controller
             }
             if(count($map)!==0)$maps[] = $map;
         }
-//        if(count($errors)>0)dd($errors);
+//        if(count($errors)>0)
         if(count($errors)>0) return ['success'=>false,'fail_info'=>$errors];
         try {
             foreach ($maps as $map) {
@@ -624,7 +624,6 @@ class OrderIssueController extends Controller
             $order = $order_issue->order;
             $send_order = $order_issue->secondOrder ??  new Order();
             $logs =  $order_issue->logs ?? collect();
-//            $issueType = $order_issue->issueType->name??'';
             $rejectedBill  = $order_issue->rejectedBill ?? new RejectedBill();
             // 订单信息
             $order_logistic_number = [];
@@ -664,8 +663,8 @@ class OrderIssueController extends Controller
             $start_row = $row_number;
             for ($index =0 ;$index<$max_rows ;$index++){
                 $json[] = [
-                    $order_issue->created_at,       // 登记日期
-                    $order->created_at,             // 创建日期
+                    isset($order_issue->created_at) ? str_split($order_issue->created_at,10)[0] :'',       // 登记日期
+                    isset($order->created_at) ? str_split($order->created_at,10)[0] :'',             // 创建日期
                     $order->owner->name ?? '',      // 客户
                     $order->client_code,              // 客户订单号
                     $order->logistic->name ?? '',   // 原始承运商
@@ -720,10 +719,9 @@ class OrderIssueController extends Controller
             }
         });
         $mergeColumn = ['A','B','C','D','E','F','G','H','I','J','K','L','P','T','X','Y','Z','AA','AF','AG','AH','AI','AJ','AK'];   // 合并行
-//        return view('test',compact('json'));
-        $post=Http::post(config('go.export.url'),['type'=>'base','data'=>json_encode(['row'=>$row,'list'=>$json,'mergeColumn'=>$mergeColumn,'mergeRow'=>$mergeRow],JSON_UNESCAPED_UNICODE),'createFormat'=>'merge']);
-//        $post=Http::post(config('go.export.url'),['type'=>'base','data'=>json_encode(['row'=>$row,'list'=>$json],JSON_UNESCAPED_UNICODE)]);
-
+        $post=Http::post(config('go.export.url'),['type'=>'base',
+            'data'=>json_encode(['row'=>$row,'list'=>$json,'mergeColumn'=>$mergeColumn,'mergeRow'=>$mergeRow],JSON_UNESCAPED_UNICODE),'createFormat'=>'merge']);
+        // 'createFormat'=>'wrapText'
         if ($post->status() == 500){
             throw new Exception($post->header("Msg"));
         }
@@ -732,4 +730,5 @@ class OrderIssueController extends Controller
             "Content-Disposition"=>"attachment; filename=订单问题件-".date('ymdHis').'.xlsx',
         ]);
     }
+
 }

+ 1 - 0
app/Http/Controllers/OrderTrackingController.php

@@ -243,3 +243,4 @@ class OrderTrackingController extends Controller
         }
     }
 }
+

+ 2 - 1
app/Http/Controllers/ProcessController.php

@@ -369,7 +369,8 @@ class ProcessController extends Controller
             $process->update();
             $result['process']=$processDaily->process_id;
             $processStatistic=ProcessStatistic::find($processDaily->process_id);
-            $processStatistic->started_at=date('Y-m-d H:i:s');
+            //$processStatistic->started_at=date('Y-m-d H:i:s');
+            $processStatistic->started_at=$processDaily->date.' '.$started_at;
             $processStatistic->update();
             app('LogService')->log(__METHOD__,"二次加工单加工中".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
         }

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

@@ -14,7 +14,7 @@ class ProcessStatisticController extends Controller
     public function index(Request $request){
         if(!Gate::allows('二次加工管理-查询')){ return redirect('denied');  }
         /** @var ProcessStatisticService $processStatistics */
-        $processStatistics=app('ProcessStatisticService')->paginate($request->input());
+        $processStatistics=app("ProcessStatisticService")->paginate($request->input());
         $owners=app("OwnerService")->getSelection();
         $processMethods=app("ProcessMethodService")->getSelection();
         return view('process.statistic',['processStatistics'=>$processStatistics,'params'=>$request->input(),'owners'=>$owners,'processMethods'=>$processMethods]);

+ 142 - 2
app/Http/Controllers/RejectedBillController.php

@@ -5,13 +5,18 @@ namespace App\Http\Controllers;
 use App\Events\InformWMSReceivedEvent;
 use App\Http\Controllers\Api\thirdPart\flux\ReceiveController;
 use App\Logistic;
+use App\OracleActAllocationDetails;
+use App\OracleBasSKU;
 use App\OracleDOCOrderHeader;
 use App\Owner;
 use App\QualityLabel;
 use App\Rejected;
 use App\RejectedBill;
 use App\RejectedBillItem;
+use App\Services\LogService;
 use App\Services\OrderPackageCommoditiesService;
+use App\Services\OrderService;
+use App\Services\RejectedBillItemService;
 use App\Services\RejectedBillService;
 use Illuminate\Contracts\View\Factory;
 use Illuminate\Http\RedirectResponse;
@@ -63,6 +68,7 @@ class RejectedBillController extends Controller
     {
         //
     }
+
     public function apiGetRecent()
     {
         if(!Gate::allows('退货管理-查询')){
@@ -73,7 +79,6 @@ class RejectedBillController extends Controller
         return ['success'=>'true','rejectedBills'=>$rejectedBills->toArray()];
     }
 
-
     public function apiStore(Request $request)
     {
         if(!Gate::allows('退货管理-录入')){
@@ -119,6 +124,7 @@ class RejectedBillController extends Controller
         app('LogService')->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true'];
     }
+
     public function apiConfirmBeStored(Request $request)
     {
         if(!Gate::allows('退货管理-编辑')){
@@ -140,7 +146,6 @@ class RejectedBillController extends Controller
         }
     }
 
-
     protected function validator(array $data,$isUpdate=false)
     {
         $mobileShouldBeRequired = 'required';
@@ -278,4 +283,139 @@ class RejectedBillController extends Controller
         $order=OracleDOCOrderHeader::select('soreference1','customerid','c_contact','c_tel2','c_tel1','carrierid')->where('soreference5',$request->soreference5)->first();
         if ($order)return ['success'=>true,'data'=>$order];
     }
+
+    public function disposeImportApi(Request $request)
+    {
+        if(!Gate::allows('退货管理-编辑'))
+            return ['success'=>false,'message'=>'没有对应权限'];
+        /**
+         * @var RejectedBillItemService $rejectedBillItemService
+         * @var RejectedBillService $service
+         */
+        $service = app('RejectedBillService');
+        $rejectedBillItemService = app('RejectedBillItemService');
+        $params = [['logistic_number_return','logistic_number','fee_collected']];
+        $logistic_numbers = [];             // 原单单号
+        $logistic_number_map = [];
+        $logistic_number_return = [];       // 退回单号
+        $logistic_number_return_map = [];
+
+        $errors = [];
+        $array = explode("\n",$request['dataText']); //拆分行
+        foreach ($array as  $i=>$item) {
+            $items = [];
+            preg_match('/^(\w*?)[\s,,;;](\w*?)[\s,,;;](\d.*)$/u',$item,$items);
+            if(count($items) < 1)
+                preg_match('/^(\w*?)[\s,,;;](\w*?)$/u',$item,$items);
+            $head = '第'.($i+1).'行';
+            if(count($items) < 3){
+                $errors[$head] = ['数据不完整'];
+                unset($items);
+                continue;
+            }
+            array_shift($items);
+            isset($items[1]) ? $logistic_numbers[] = $items[1] : null;
+            isset($items[0]) ? $logistic_number_return[] = $items[0] : null;
+            $param = [$items[0] ?? null, $items[1] ?? null, $items[2] ?? null];
+            $params[] = $param;
+            $logistic_number_map[$items[1]] = $param;
+            $logistic_number_return_map[$items[0]] =$param;
+            unset($param);
+        }
+        $rejectedBill_collect = collect();
+
+        // 对已用的进行修改
+        $update_fee_params = [['id','logistic_number','fee_collected']];                //对原有的进行修改 有到付费用
+        $update_params = [['id','logistic_number']];                                    // 无到付费用
+        $exist_picktotraceid = [];                                                      // 已有退回单号
+        $rejectedBills = RejectedBill::query()->whereIn('logistic_number_return',$logistic_number_return)->get();
+        $rejectedBills->each(function($rejectedBill)use(&$update_fee_params,&$update_params,$logistic_number_return_map,&$exist_picktotraceid,&$rejectedBill_collect){
+            $rejectedBill_collect->push($rejectedBill);
+            $logistic_number_return =  $rejectedBill->logistic_number_return; //退回单号
+            $params = $logistic_number_return_map[$logistic_number_return];
+            $rejectedBill->logistic_number ? $exist_picktotraceid[$rejectedBill->logistic_number] = $rejectedBill->logistic_number : null;    // 记录已有原单单号
+            if(isset($params[2])){
+                $update_fee_params[] = ['id'=>$rejectedBill->id,'logistic_number'=>$params[1],'fee_collected'=>$params[2]];
+            }else if(isset($params[1])){
+                $update_params[] = ['id'=>$rejectedBill->id,'logistic_number'=>$params[1]];
+            }
+        });
+        // 对不存在的进行创建
+        $inner_items_params = [];
+        $details = OracleActAllocationDetails::query()->with('oracleDocOrderHeader.oracleBASCustomer')->whereIn('picktotraceid',$logistic_numbers)->get();
+        $bas_sku_map =[];
+        OracleBasSKU::query()->selectRaw('SKU,CustomerID,Alternate_SKU1,Descr_C')->whereIn('SKU',array_diff(data_get($details,'*.sku'),[' ','*']))->whereIn('CustomerID',data_get($details,'*.customerid'))->get()
+            ->each(function($bas_sku)use(&$bas_sku_map){
+                $key = 'Sku = '.$bas_sku->sku.' CustomerID = '.$bas_sku->customerid;
+                $bas_sku_map[$key] = $bas_sku;
+            });
+        $details = $details->groupBy('picktotraceid');
+
+        $details->each(function($items,$key)use(&$inner_params,$bas_sku_map,$exist_picktotraceid,&$inner_items_params,&$rejectedBill_collect,$logistic_number_map){
+            if(!isset($exist_picktotraceid[$key])){
+                $order_header = $items->first()->oracleDocOrderHeader;
+                $owner = app('OwnerService')->firstOrCreate(['name' => $order_header->oracleBASCustomer->descr_c],
+                    ['name' => $order_header->oracleBASCustomer->descr_c, 'code' => $order_header->oracleBASCustomer->descr_c]);
+                $logistic = app('LogisticService')->firstOrCreate(['name' => $order_header->carriername],
+                    ['name' => $order_header->carriername, 'code' => $order_header->carriername]);
+                $rejectedBill = RejectedBill::query()->create([
+                    'id_owner' => $owner->id ?? '',
+                    'sender' => $order_header->c_contact,
+                    'logistic_number_return' => $logistic_number_map[$key][0] ?? '',
+                    'id_logistic_return' =>$logistic->id ?? '',
+                    'fee_collected' => $logistic_number_map[$key][2] ?? '',
+                    'order_number' =>$order_header->soreference1,
+                    'mobile_sender' => empty($order_header->c_tel2)?$order_header->c_tel1:$order_header->c_tel2,
+                    'logistic_number' => $logistic_number_map[$key][1] ?? '',
+                    'remark' => $order_header->notes,
+                    'is_loaded' =>0,
+                    "id_operator" => Auth::id(),
+                ]);
+                $rejectedBill_collect->push($rejectedBill);
+                LogService::log(__METHOD__,"生成退货单",json_encode($rejectedBill),Auth::user()['id']);
+                // 获取创建items
+                $items->each(function($item)use($rejectedBill,$bas_sku_map,&$inner_items_params){
+                    $key = 'Sku = '.$item->sku.' CustomerID = '.$item->customerid;
+                    $bas_sku = $bas_sku_map[$key] ?? '';
+                    $date = date('Y-m-d H:i:s');
+                    $inner_items_params[] = [
+                        'id_rejected_bill' => $rejectedBill->id ?? '',
+                        'barcode_goods' => $bas_sku['alternate_sku1'] ?? '',
+                        'name_goods' => $bas_sku['descr_c'],
+                        'amount' => $item->qty_each,
+                        'id_quality_label' => 1,
+                        'created_at' => $date,
+                        'updated_at' => $date
+                    ];
+                });
+            }
+        });
+        try {
+            if (count($update_fee_params) > 1) {
+                $service->batchUpdate($update_fee_params);
+            }
+            if (count($update_params) > 1) {
+                $service->batchUpdate($update_params);
+            }
+            if(count($inner_items_params) > 0){
+                $rejectedBillItemService->insert($inner_items_params);
+                LogService::log(__METHOD__, "批量生成退货单详情", json_encode($inner_items_params), Auth::user()['id']);
+            }
+            $rejectedBill_collect->each(function ($rejectedBill)use($service){
+                $service->syncOrderIssue($rejectedBill);
+            });
+            return ['success'=>true];
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__.' error', '修改退回单号 失败', json_encode($request->getContent()).' ||'.json_encode($e->getMessage())." || ".json_encode($e->getTraceAsString()));
+            return ['success'=>false,'error'=>['导入处理发生异常'=>$e->getMessage()]];
+        }
+    }
+
+    public function importRejectedNumber(Request $request)
+    {
+        if(!Gate::allows('退货管理-编辑'))
+            return redirect(url('/'));
+        return view('rejected.importRejectedNumber');
+    }
+
 }

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

@@ -327,7 +327,7 @@ class RejectedBillItemController extends Controller
         return Validator::make($data, [
             'id_rejected_bill' => ['required', 'numeric', 'exists:rejected_bills,id'],
             'barcode_goods' => ['required', 'string','max:60'],
-            'name_goods' => ['nullable', 'string','max:50'],
+            'name_goods' => ['nullable', 'string','max:219'],
             'amount' => ['numeric','required', 'max:99999'],
             'id_quality_label' => ['required','numeric',  'max:11'],
             'batch_number' => ['string', 'nullable',],

+ 85 - 0
app/Http/Controllers/SortingStationController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\SortingStation;
+use Illuminate\Http\Request;
+
+class SortingStationController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\SortingStation  $sortingStation
+     * @return \Illuminate\Http\Response
+     */
+    public function show(SortingStation $sortingStation)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\SortingStation  $sortingStation
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(SortingStation $sortingStation)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\SortingStation  $sortingStation
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, SortingStation $sortingStation)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\SortingStation  $sortingStation
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(SortingStation $sortingStation)
+    {
+        //
+    }
+}

+ 52 - 14
app/Http/Controllers/TestController.php

@@ -43,6 +43,7 @@ use App\Services\CityService;
 use App\Services\CommodityService;
 use App\Services\common\BatchUpdateService;
 use App\Services\common\DataHandlerService;
+use App\Services\common\ExportService;
 use App\Services\InventoryCompareService;
 use App\Services\LogService;
 use App\Services\OracleActAllocationDetailService;
@@ -71,6 +72,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Str;
 use Ramsey\Collection\Collection;
 use Zttp\Zttp;
 
@@ -90,8 +92,19 @@ class TestController extends Controller
     }
 
     public function test4(){
-        dd(Unit::query()->whereIn('name',[])->get());
-
+        $row = [];
+        for ($i=0;$i<50;$i++){
+            $row[] = "表头-".Str::random(5);
+        }
+        $list = [];
+        for ($i=0;$i<3000;$i++){
+            $line = [];
+            for($j=0;$j<50;$j++){
+                $line[] = Str::random(3)."\r\n".Str::random(3);
+            }
+            $list[] = $line;
+        }
+        return app(ExportService::class)->json($row,$list,"测试记录");
     }
 
     public function test2(){
@@ -139,16 +152,10 @@ class TestController extends Controller
 
     function wmsSql()
     {
-        $logisticNumber='YT3135994475841';
-        dd(OracleDOCOrderHeader::query()->with('actAllocationDetails','oracleBASCode')
-            ->whereHas('actAllocationDetails',function($query)use($logisticNumber){
-                $query->where('picktotraceid',$logisticNumber);
-            })->orWhere('soreference5',$logisticNumber)->sql());
-        $re= OracleDOCOrderHeader::query()->with('actAllocationDetails','oracleBASCode')
-            ->whereHas('actAllocationDetails',function($query)use($logisticNumber){
-                $query->where('picktotraceid',$logisticNumber);
-            })->orWhere('soreference5',$logisticNumber)->first();
-        dd($re);
+        $owner=Owner::first();
+//        $owner['phone_number'] ?? $owner['phone_number'] = '31115';
+//        $owner->update();
+        dd($owner);
     }
     function issues()
     {
@@ -725,8 +732,19 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
     public function test11()
     {
-        Redis::set('aa', 42);
-        return (Redis::get('aa'));
+        $orderNos = [
+            '111000111','111000222','111000333','111000444'
+        ];
+        $collect = collect();
+        foreach ($orderNos as $item) {
+            $collect->push(new Order([
+                'code'=>$item
+            ]));
+        }
+        $inner_params = $collect->map(function($item){
+            return $item->toArray();
+        });
+        Order::query()->insert($inner_params->toArray());
     }
 
     public function output()
@@ -791,4 +809,24 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         unset($warehouse);
     }
 
+    public function syncSendOrder()
+    {
+        $order_issues = OrderIssue::query()->whereNotNull('second_client_no')->get();
+        $client_nos = data_get($order_issues,'*.second_client_no');
+        $orderHeaders = OracleDOCOrderHeader::query()->selectRaw(implode(',',OracleDOCOrderHeaderService::$columns))
+            ->whereIn('SOReference1',$client_nos)
+            ->with(['oracleBASCustomer'=>function($query){
+                $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
+            },'oracleDOCOrderDetails'=>function($query){
+                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
+            }, 'actAllocationDetails'=>function($query){
+                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID');
+            },'oracleBASCode'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            }])
+            ->get();
+        $service = app('OrderIssueService');
+        $service->updateByWmsOrders($orderHeaders);
+    }
+
 }

+ 213 - 0
app/Http/Controllers/api/thirdPart/flux/SortingController.php

@@ -0,0 +1,213 @@
+<?php
+
+namespace App\Http\Controllers\Api\thirdPart\flux;
+
+use App\Batch;
+use App\Commodity;
+use App\Http\Controllers\Controller;
+use App\OracleActAllocationDetails;
+use App\Order;
+use App\OrderBin;
+use App\OrderCommodity;
+use App\Owner;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use Zttp\Zttp;
+
+class SortingController extends Controller
+{
+
+    /**
+     * 新增被通知的波次列表(一个以上的波次),并且保存在本地数据库,供get波次使用
+     * 接收:request[(下边newBatch的字段)]
+     * 返回:Response{return{returnFlag(1/0),returnCode(0000/0001),returnDesc,resultInfo}}
+     */
+    public function newBatch(Request $request)
+    {
+        $requestArr=$request->all();
+        app('LogService')->log(__METHOD__, 'issued_' . __FUNCTION__, json_encode($request->all()));
+        !$requestArr?$requestArr=json_decode($request->getContent(),true):false;
+        $errors=$this->newBatchValidator($requestArr)->errors();
+        if(count($errors)>0){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, 'fields wrong, see Errors report please.'.'|'.json_encode($request->all()).'|'.json_encode($errors));
+            return response()->json(['Response'=>['return'=>['returnFlag'=>'0','returnCode'=>'0001',
+                'returnDesc'=>':Failure','resultInfo'=>'','errors'=>$errors]]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+        $requestBatches = $requestArr['request']?? '';
+        foreach ($requestBatches as $requestBatch){
+            $requestBatch['edittime']&&strpos(trim($requestBatch['edittime']),' ')?$editTimeFormat='Y-m-d H:i:s':$editTimeFormat='YmdHis';
+            $batch=new Batch([
+                'code' => $requestBatch['waveno'],
+                'wms_type' => $requestBatch['batch_type']??'',
+                'wms_status' => $requestBatch['docstatus']??'',
+                'status' => '未处理',
+                'wms_created_at' => $requestBatch['edittime']?Carbon::createFromFormat($editTimeFormat,$requestBatch['edittime']):'',
+            ]);
+            $batch->save();
+            $oracleAlloactions=OracleActAllocationDetails::query()->where('waveno',$requestBatch['waveno'])->get();
+            foreach($requestBatch['order_list'] as $requestOrder){
+                $owner=Owner::query()->where('code',$requestOrder['customerid'])->first();
+                $order=Order::query()->where('code',$requestOrder['docno'])->first();
+                if(!$order){
+                    $order=new Order([
+                        'batch_id' => $batch['id'],
+                        'code' => $requestOrder['docno'],
+                        'owner_id' => $owner['id'],
+                        'wms_status' => $requestOrder['docstatus']??'波次下发',
+                        'status' => '未处理',
+                    ]);
+                }else{
+                    $order['batch_id']= $order['batch_id']??$batch['id'] ;
+                    $order['owner_id']=$order['owner_id']??$owner['owner_id'];
+                    $order['wms_status']=$order['wms_status']??$requestOrder['docstatus']??'波次下发';
+                    $order['status']=$order['status']??'未处理';
+                }
+                $order->save();
+                OrderBin::query()->firstOrCreate([
+                    'order_id' => $order['id'],
+                    'number' => $requestOrder['reservedfield01'],
+                ]);
+                foreach($requestOrder['barcode_list'] as $requestBarcode){
+                    $orderCommodity=OrderCommodity::query()
+                        ->where('order_id',$order['id'])->where('wms_ptltaskid',$requestBarcode['ptltaskid'])->first();
+                    if(!$orderCommodity){
+                        $commodity=Commodity::newCommodityBy_BarcodeOwnerIdNameSku($requestBarcode['alternate_sku1'],$owner['id'],$requestBarcode['descr_c'],$requestBarcode['sku']);
+                        $orderCommodity = new OrderCommodity([
+                            'order_id' => $order['id'],
+                            'commodity_id' => $commodity['id'],
+                            'amount' => $requestBarcode['fmqty_each']??0,
+                            'wms_ptltaskid' => $requestBarcode['ptltaskid'],
+                        ]);
+                        $allocation=$oracleAlloactions->where('orderno',$requestOrder['docno'])->where('sku',$commodity['sku'])->where('qty',$requestBarcode['fmqty_each'])->first();
+                        if($allocation)
+                            $orderCommodity['location'] = $allocation['location'];
+                        $orderCommodity->save();
+                    }
+                }
+            }
+        }
+        return response()->json(['Response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000',
+            'returnDesc'=>'消息处理成功:Success','resultInfo'=>'']]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+    }
+
+    protected function newBatchValidator(array $data)
+    {
+        return Validator::make($data, [
+            'request' => ['required', 'array', 'min:1'],
+            'request.*.waveno' => ['required', 'string', 'max:191','unique:batches,code'],
+            'request.*.taskprocess' => ['nullable', 'string', 'max:191'],
+            'request.*.edittime' => ['nullable', 'string', 'max:191'],
+            'request.*.batch_type' => ['nullable', 'string', 'max:191'],
+            'request.*.docstatus' => ['nullable', 'string', 'max:191'],
+            'request.*.batch_created_at' => ['nullable', 'string', 'max:191'],
+            'request.*.order_list' => ['required', 'array', 'min:1'],
+            'request.*.order_list.*.docno' => ['required', 'string', 'max:191'],
+            'request.*.order_list.*.customerid' => ['required', 'string', 'max:191','exists:owners,code'],
+            'request.*.order_list.*.docstatus' => ['nullable', 'string', 'max:191'],
+            'request.*.order_list.*.reservedfield01' => ['required',  'max:191'],
+            'request.*.order_list.*.barcode_list' => ['required_unless:request.*.order_list.*.docstatus,90', 'array'],
+            'request.*.order_list.*.barcode_list.*.alternate_sku1' => ['required', 'string', 'max:191'],
+            'request.*.order_list.*.barcode_list.*.descr_c' => ['required', 'string', 'max:191'],
+            'request.*.order_list.*.barcode_list.*.fmqty_each' => ['required', 'numeric'],
+            'request.*.order_list.*.barcode_list.*.ptltaskid' => ['required', 'string', 'max:191'],
+        ]);
+    }
+
+    /**
+     * 新增被通知的取消订单
+     * 接收:docno(订单号),docstatus(状态,唯一:canceled)
+     * 返回:Response{return{returnFlag(1/0),returnCode(0000/0001),returnDesc,resultInfo}} 1和0000成功,0和0001失败
+     */
+    public function newCanceledOrder(Request $request)
+    {
+        $requestArr=$request->all();
+        !$requestArr?$requestArr=json_decode($request->getContent(),true):false;
+        Controller::logS(__METHOD__,__FUNCTION__,"接收到WMS下发取消单:".$request->getContent());
+        $errors=$this->newCanceledOrderValidator($requestArr)->errors();
+        if(count($errors)>0){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, 'fields wrong, see Errors report please.'.'|'.json_encode($request->all()).'|'.json_encode($errors));
+            return response()->json(['Response'=>['return'=>['returnFlag'=>'0','returnCode'=>'0001',
+                'returnDesc'=>':Failure','resultInfo'=>'','errors'=>$errors]]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+        $order=Order::query()->where('code',$requestArr['docno'])->first();
+        $order->cancel();
+        return response()->json(['Response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000',
+            'returnDesc'=>'消息处理成功:Success','resultInfo'=>'']]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+    }
+
+    protected function newCanceledOrderValidator(array $data)
+    {
+        return Validator::make($data, [
+            'docno' => ['required', 'string', 'max:191', 'exists:orders,code'],
+            'docstatus' => ['required', 'string', 'max:191'],
+        ]);
+    }
+
+
+
+    public function informBinAssignment(Batch $batch)
+    {
+        $apiUrl=config('api.flux.inform.binAssignment');
+        if(config('api.faking')){$apiUrl=url(config('api.fake_flux_informBinAssignment'));}
+        $sendingData=['request'=>[]];
+        $batch->orders()->each(function(Order $order)use($batch,&$sendingData){
+            $sendingData['request'][]=[
+                'batch_id'=>$batch['code'],
+                'status'=>'00',//原来是beforeSorting,改成了00
+                'order_id'=>$order['code'],
+                'bin'=>$order->bin()->first()['number']
+            ];
+        });
+        $response=null;
+        try {
+            $response=Zttp::post($apiUrl,$sendingData);
+        }catch (\Exception $e){
+            app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'catch:'.$e->getMessage());
+            return false;
+        }
+        $reJson=$response->json();
+        if(!$reJson || (!isset($reJson['Response'])||!isset($reJson['Response']['return'])) || $reJson['Response']['return']['returnFlag']!='1'){
+            app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'$sending:'.json_encode($sendingData).'$response:'.$response->body());
+            return false;
+        }
+        return true;
+    }
+
+
+    public function informBatchFinished(Batch $batch){
+        $sendingData=['request'=>[]];
+        $batch->orders()->each(function (Order $order)use($batch,&$sendingData){
+            $order->orderCommodities()->each(function (OrderCommodity $orderCommodity)use($batch,$order,&$sendingData){
+                $bin=$order->bin()->first();
+                $sendingData['request'][]=[
+                    'ptltaskid'=>$orderCommodity['wms_ptltaskid'],
+                    'batch_id'=>$batch['code'],
+                    'status'=>'80', //原来是isSorted,改成了80
+                    'order_id'=>$order['code'],
+                    'bin'=>$bin?$bin['number']:'',
+                    'docstatus'=>'success',
+                    'sku'=>$orderCommodity->commodity()->first()?$orderCommodity->commodity()->first()['sku']:'',
+                    'amount'=>'0',
+                ];
+            });
+        });
+        $informApiUrl = config('api.flux.inform.batchFinished');
+        try{
+            $response=Zttp::post($informApiUrl,$sendingData);
+            $result=$response->json();
+            if(!$result||!$result['Response']['return']['returnFlag']||$result['Response']['return']['returnCode']!='0000'){
+                app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'$sending:'.json_encode($sendingData).'|$response:'.$response->body());
+                return false;
+            }
+        }
+        catch(\Exception $e){
+            app('LogService')->log(__METHOD__,'error_'.__FUNCTION__,'catch:'.$e->getMessage());
+            return false;
+        }
+        app('LogService')->log(__METHOD__,'temp_'.__FUNCTION__,'$sending:'.json_encode($sendingData).'|$response:'.$response->body());
+        return true;
+    }
+
+
+}

+ 5 - 5
app/Http/Controllers/api/thirdPart/goodscan/PackageController.php

@@ -28,11 +28,11 @@ class PackageController
         app('LogService')->log(__METHOD__,'GoodScan weightApi add'.__FUNCTION__,json_encode($request->getContent()));
         $errors = $this->validatorWeight($requestInput)->errors(); // 参数校验
         if($requestInput['weight'] == '-9.9'){   // 称重异常校验
-            app('LogService')->log(__METHOD__,'GoodScan weightApi (Error)'.__FUNCTION__,'异方接口称重伤上传异常[异常值为-9.9,电子秤故障或未连接]');
+            LogService::log(__METHOD__,'GoodScan weightApi (Error)'.__FUNCTION__,'异方接口称重伤上传异常[异常值为-9.9,电子秤故障或未连接]'.json_encode($request->getContent()));
             return json_encode(['code'=>500,'error'=>'weight=-9.9']);
         }
         if(count($errors) > 0){
-            app('LogService')->log(__METHOD__,'error'.__FUNCTION__,json_encode($request).'||'.json_encode($errors),null);
+            LogService::log(__METHOD__,'error'.__FUNCTION__,json_encode($request->getContent()).'||'.json_encode($errors),null);
             return json_encode(['code'=>500,'error'=>$errors]);
         }
 
@@ -60,16 +60,16 @@ class PackageController
                 $orderPackage = $this->getOrderPackage($requestInput, $measuringMachine, $order);// 返回包裹对象
                 $this->syncOrderPackageLogistic($orderPackage);// 同步包裹订单的承运商
             } catch (\Exception $e) {
-                app('LogService')->log(__METHOD__,__FUNCTION__,'GoodScan weightApi (Error)'.json_encode($request).'||'.json_encode($orderPackage),null);
+                LogService::log(__METHOD__,__FUNCTION__,'GoodScan weightApi (Error)'.json_encode($request->getContent()).'||'.json_encode($orderPackage),null);
                 return json_encode(["code"=>500,"error"=>"写入WMS失败!"],JSON_UNESCAPED_UNICODE);
             }
         }
         if(!empty($orderPackage->order)){
             Waybill::setWeightByOrderCode($orderPackage->order->code,$orderPackage->weight);
         }
-            event(new WeighedEvent($orderPackage));
+        event(new WeighedEvent($orderPackage));
         $response=["code"=>0,'error'=>'upload success'];
-        app('LogService')->log(__METHOD__,__FUNCTION__,"下发写入包裹成功:".json_encode($request).'||'.json_encode($response),null);
+        LogService::log(__METHOD__,__FUNCTION__,"下发写入包裹成功:".json_encode($request->getContent()).'||'.json_encode($response),null);
         return json_encode($response,JSON_UNESCAPED_UNICODE);
     }
 

+ 180 - 0
app/Http/Controllers/api/thirdPart/haochuang/SortingController.php

@@ -0,0 +1,180 @@
+<?php
+
+namespace App\Http\Controllers\Api\thirdPart\haochuang;
+
+use App\Batch;
+use App\CommodityBarcode;
+use App\Http\Controllers\Controller;
+use App\Order;
+use App\OrderCommodity;
+use App\SortingStation;
+use App\User;
+use App\UserToken;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Validator;
+
+class SortingController extends Controller
+{
+
+    function login(Request $request){
+        $name = $request->input('name');
+        $password = $request->input('password');
+        $station_id = $request->input('station_id');
+        $errors=$this->loginValidator($request->all())->errors();
+        if(count($errors)>0){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, json_encode($request->all()).'|'.json_encode($errors));
+            return response()->json(['result'=>'failure','fail_info'=>'error','errors'=>$errors])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+        $user=User::query()->where('name',$name)->first();
+        if(!$user||!Hash::check($password, $user['password'])){
+            return ['result'=>'failure','fail_info'=>'认证错误'];
+        }
+        $station = SortingStation::findOrCreate($station_id);
+        $station->login();
+        return ['result'=>'success','token'=>$user->token()];
+    }
+
+    protected function loginValidator(array $data)
+    {
+        return Validator::make($data, [
+            'name' => ['required', 'string', 'max:191'],
+            'password' => ['required', 'string', 'max:191'],
+            'station_id' => ['required', 'string', 'max:191'],
+        ],[
+            'required' => ':attribute 不能为空',
+        ],[
+            'name' => '用户名',
+            'password' => '密码',
+            'station_id' => '设备ID',
+        ]);
+    }
+
+    function process(Request $request){
+        $token = trim($request->input('token'));
+        $station_id = $request->input('station_id');
+        $batch_id = $request->input('batch_id');
+        $errors=$this->processValidator($request->all())->errors();
+        if(count($errors)>0){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, json_encode($request->all()).'|'.json_encode($errors));
+            return response()->json(['result'=>'failure','fail_info'=>'error','errors'=>$errors])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+//        if(!UserToken::getUser($token)){
+//            return ['result'=>'unauthority','fail_info'=>'无效令牌或令牌过期'];
+//        }
+
+        /** @var Batch $batch */
+        $batch=Batch::query()->where('code',$batch_id)->orderBy('id','desc')->first();
+        $data=[
+            'result'=>'success',
+            'station_id'=>$station_id,
+            'batch_id'=>$batch_id,
+            'orders'=>[]
+        ];
+        $ordersSorted=$batch->orders()->get()->sortBy(function(Order $order){
+            return $order->bin()->first()['number'];
+        });
+        $ordersSorted->each(function(Order $order)use(&$data,$request){
+            if($order['status']=='取消')return;
+            $orderData=[
+                'order_id'=>$order['code'],
+                'owner'=>$order->owner()->first()['code'],
+                'status'=>$order['status']=='未处理'?'available':$order['status'],
+                'created_at'=>$order['created_at']->toDateTimeString(),
+                'bin'=>$order->bin()->first()['number'],
+                'barcodes'=>[]
+            ];
+            $order->orderCommodities()->each(function(OrderCommodity $orderCommodity)use(&$orderData,$request){
+                $commodity=$orderCommodity->commodity()->first();
+                if(!$commodity){
+                    app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, '播种位数据准备出错,找不到订单对应的Commodity id的对象'.$orderCommodity['commodity_id'].',是否表数据在波次生成后丢失?'.json_encode($request->all()));
+                }
+                $barcodeStr=$commodity->barcodes()->get()->map(function(CommodityBarcode $barcode){
+                    return $barcode['code'];
+                })->filter(function($code){
+                    return $code&&(!preg_match('/[\x{4e00}-\x{9fa5}]/u',$code));
+                })->join(',');
+                $orderData['barcodes'][]=[
+                    'id'=>$orderCommodity['id']??'',
+                    'barcode_id'=>$barcodeStr??'',
+                    'name'=>$commodity['name']??'',
+                    'sku'=>$commodity['sku']??'',
+                    'amount'=>$orderCommodity['amount']??'',
+                    'location'=>$orderCommodity['location']??'',
+                ];
+            });
+            $data['orders'][]=$orderData;
+        });
+
+        $sendToWms=(new \App\Http\Controllers\Api\thirdPart\flux\SortingController())->informBinAssignment($batch);
+        if(!$sendToWms){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, '播种位发送给WMS错误:'.json_encode($request->all()));
+            return response()->json(['result'=>'failure','fail_info'=>'播种位发送给WMS错误,请联系管理员检查错误'])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+
+        $station = SortingStation::findOrCreate($station_id);
+        $station->setProcessingBatch($batch);
+        return $data;
+    }
+
+    protected function processValidator(array $data)
+    {
+        return Validator::make($data, [
+            'token' => ['required', 'string', 'max:191'],
+            'station_id' => ['required', 'string', 'max:191'],
+            'batch_id' => ['required', 'string', 'max:191','exists:batches,code'],
+        ],[
+            'required' => ':attribute 不能为空',
+            'exists' => ':attribute 不存在',
+        ],[
+            'station_id' => '设备ID',
+            'batch_id' => '波次号',
+        ]);
+    }
+
+    function done(Request $request){
+        $token = $request->input('token');
+        $station_id = $request->input('station_id');
+        $batch_id = $request->input('batch_id');
+        app('LogService')->log(__METHOD__,  __FUNCTION__.'_request', '浩创的完成请求:'.json_encode($request->all()));
+        $errors=$this->doneValidator($request->all())->errors();
+        $failInfo='';
+        foreach ($errors as $error){$failInfo.=$error[0].'; ';}
+        if(count($errors)>0){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, json_encode($request->all()).'|'.json_encode($errors));
+            return response()->json(['result'=>'failure','fail_info'=>$failInfo,'errors'=>$errors])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+        if(!UserToken::getUser($token)){
+            return ['result'=>'unauthority','fail_info'=>'无效令牌或令牌过期'];
+        }
+        $batch=Batch::query()->where('code',$batch_id)->first();
+        if($batch->status=='已处理'){
+            app('LogService')->log(__METHOD__,'alert_'.__FUNCTION__,$batch['code'].'重复发送,波次已处理');
+            return ['result'=>'failure','fail_info'=>$batch['code'].'重复发送,波次已处理'];
+        }
+        $sendToWms=(new \App\Http\Controllers\Api\thirdPart\flux\SortingController())->informBatchFinished($batch);
+        if(!$sendToWms){
+            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, '发送给WMS错误:'.json_encode($request->all()));
+            return response()->json(['result'=>'failure','fail_info'=>'发送给WMS错误,请联系管理员检查错误'])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+        }
+        $batch->setProcessed();
+        $station = SortingStation::query()->where('name',$station_id)->first();
+        $station->clearProcessingBatch();
+        return ['result'=>'success','batch_id'=>$batch_id];
+    }
+    protected function doneValidator(array $data)
+    {
+        return Validator::make($data, [
+            'token' => ['required', 'string', 'max:191'],
+            'station_id' => ['required', 'string', 'max:191','exists:sorting_stations,name'],
+            'batch_id' => ['required', 'string', 'max:191','exists:batches,code'],
+        ],[
+            'required' => ':attribute 不能为空',
+            'exists' => ':attribute 不存在',
+        ],[
+            'station_id' => '设备ID',
+            'batch_id' => '波次号',
+        ]);
+    }
+
+}

+ 3 - 2
app/Http/Controllers/api/thirdPart/weight/PackageController.php

@@ -177,7 +177,8 @@ class PackageController extends Controller
             return json_encode(["msg"=>$errors,"code"=>500,"data"=>null]);
         }
 
-        $measuringMachine=MeasuringMachine::query()->firstOrCreate(['code'=>$request['id']]);
+        $id = $request['id']??'00C66186389';
+        $measuringMachine=MeasuringMachine::query()->firstOrCreate(['code'=> $id]);
         $measuringMachine->turnOn();
         $measuringMachine->turnOffInMinutes(30);
 
@@ -303,7 +304,7 @@ class PackageController extends Controller
 
     public function validatorWeight(array $request){
         $validator=Validator::make($request,[
-            'id'=>['required','max:30',/*function ($attribute, $value, $fail) {
+            'id'=>['nullable','max:30',/*function ($attribute, $value, $fail) {
                 $measuringMachine=MeasuringMachine::where('code',$value)->first();
                 if (!$measuringMachine) {
                     $fail($attribute.' 设备未录入在系统中!');

+ 52 - 1
app/Order.php

@@ -11,9 +11,10 @@ class Order extends Model
     use ModelTimeFormat;
 
     protected $fillable = [
+        'id', 'batch_id',  'owner_id', 'status',
         'created_at', 'code', 'shop_id', 'owner_id', 'client_code',
         'logistic_id', 'consignee_name', 'consignee_phone', 'province',
-        'city', 'district', 'address', 'wms_status','warehouse_id','wms_edittime'];
+        'city', 'district', 'address', 'wms_status','status','warehouse_id','wms_edittime'];
 
     /*
      * wms订单号             code=>DOC_ORDER_HEADER[orderno]
@@ -58,6 +59,18 @@ class Order extends Model
         return $this->hasOne(Warehouse::class, 'id', 'owner_id');
 
     }
+    public function orderCommodities(){
+        return $this->hasMany('App\OrderCommodity','order_id','id');
+    }
+    public function bin(){
+        $bin= $this->hasOne('App\OrderBin','order_id','id');
+        if($bin->count()>0)return $bin;
+        $this->batch()->first()->assignBins();
+        return $this->hasOne('App\OrderBin','order_id','id');
+    }
+    public function batch(){
+        return $this->belongsTo('App\Batch', 'batch_id','id');
+    }
 
     public function getLogisticNumbersAttribute()
     {
@@ -115,4 +128,42 @@ class Order extends Model
         return parent::delete();
     }
 
+    public function isEquals(Order $order)
+    {
+        return
+            $this['code'] == $order['code'] &&
+            $this['warehouse_id'] == $order['warehouse_id'] &&
+            $this['owner_id'] == $order['owner_id'] &&
+            $this['shop_id'] == $order['shop_id'] &&
+            $this['logistic_id'] == $order['logistic_id'] &&
+            $this['consignee_name'] == $order['consignee_name'] &&
+            $this['consignee_phone'] == $order['consignee_phone'] &&
+            $this['province'] == $order['province'] &&
+            $this['city'] == $order['city'] &&
+            $this['district'] == $order['district'] &&
+            $this['address'] == $order['address'] &&
+            $this['client_code'] = $order['client_code'] &&
+            $this['wms_status'] == $order['wms_status'] &&
+            $this['wms_edittime'] == $order['wms_edittime'] &&
+            (string)$this['created_at'] == (string)$order['created_at'];
+    }
+
+    public function assignValueByOrder(Order $order)
+    {
+        $this['code'] = $order['code'] ;
+        $this['warehouse_id'] = $order['warehouse_id'] ;
+        $this['owner_id'] = $order['owner_id'] ;
+        $this['shop_id'] = $order['shop_id'] ;
+        $this['logistic_id'] = $order['logistic_id'] ;
+        $this['consignee_name'] = $order['consignee_name'] ;
+        $this['consignee_phone'] = $order['consignee_phone'] ;
+        $this['province'] = $order['province'] ;
+        $this['city'] = $order['city'] ;
+        $this['district'] = $order['district'] ;
+        $this['address'] = $order['address'] ;
+        $this['client_code'] = $order['client_code'] ;
+        $this['wms_status'] = $order['wms_status'] ;
+        $this['wms_edittime'] = $order['wms_edittime'];
+        $this['created_at'] =$order['created_at'];
+    }
 }

+ 12 - 0
app/OrderBin.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class OrderBin extends Model
+{
+    protected $fillable = [
+        'order_id', 'number',
+    ];
+}

+ 35 - 0
app/OrderCommodity.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderCommodity extends Model
+{
+    protected $fillable = [
+        'id', 'order_id','commodity_id', 'amount','wms_ptltaskid','location'
+    ];
+    protected $appends=['barcode','name','sku'];
+    public function order(){
+        return $this->belongsTo('App\Order', 'order_id','id');
+    }
+    public function commodity(){
+        return $this->hasOne('\App\Commodity','id','commodity_id');
+    }
+    public function getBarcodeAttribute(){
+        $commodity=$this->commodity()->first();
+        if($commodity)return $commodity['barcode'];
+        return '';
+    }
+    public function getNameAttribute(){
+        $commodity=$this->commodity()->first();
+        if($commodity)return $commodity['name'];
+        return '';
+    }
+    public function getSkuAttribute(){
+        $commodity=$this->commodity()->first();
+        if($commodity)return $commodity['sku'];
+        return '';
+    }
+}

+ 2 - 2
app/OrderIssue.php

@@ -42,7 +42,7 @@ class OrderIssue extends Model
 
     public function rejectedBill()
     {
-        return $this->hasOne(RejectedBill::class, 'logistic_number_return', 'logistic_number_return');
+        return $this->belongsTo(RejectedBill::class, 'logistic_number_return', 'logistic_number_return');
     }
 
     public function issueType()
@@ -224,7 +224,7 @@ class OrderIssue extends Model
             $order = $this->order;
             $rejectedBill = RejectedBill::query()->where('logistic_number','like','原单退回'.'%')->where('order_number',$order->client_code)->first();
             if($rejectedBill){
-                $this->update(['logistic_number_return'=>$rejectedBill->logistic_number_return]);
+                $this->update(['logistic_number_return'=>$rejectedBill->logistic_number_return,'is_new_rejecting'=>'有']);
             }
         }
     }

+ 5 - 3
app/OrderPackageCommodities.php

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

+ 2 - 2
app/Providers/AppServiceProvider.php

@@ -32,7 +32,6 @@ use App\Services\OrderService;
 use App\Services\OrderIssueWorkLoadService;
 use App\Services\OrderPackageCommoditiesService;
 use App\Services\OrderTrackingService;
-use App\Services\OwnerReportService;
 use App\Services\OwnerService;
 use App\Services\PackageService;
 use App\Services\PackageStatisticsService;
@@ -72,7 +71,7 @@ class AppServiceProvider extends ServiceProvider
     {
         //
         app()->singleton('OrderIssuePerformanceService',OrderIssuePerformanceService::class);
-        app()->singleton('inventoryCompareService',InventoryCompareService::class);
+        app()->singleton('InventoryCompareService',InventoryCompareService::class);
     }
 
     /**
@@ -140,6 +139,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('WarehouseService',WarehouseService::class);
         app()->singleton('StoreItemService',StoreItemService::class);
         app()->singleton('PackageService',PackageService::class);
+        app()->singleton('ProcessMethodService',ProcessMethodService::class);
 
         $this->loadingOrderModuleService();
         $this->loadingBasedModuleService();

+ 4 - 1
app/Providers/RouteServiceProvider.php

@@ -90,9 +90,12 @@ class RouteServiceProvider extends ServiceProvider
         Route::prefix('api/thirdPart/haiq')
             ->namespace('App\Http\Controllers\api\thirdPart\haiq')
             ->group(base_path('routes/api/thirdPart/haiq.php'));
-
         Route::prefix('api/thirdPart/goodscan')
             ->namespace('App\Http\Controllers\api\thirdPart\goodscan')
             ->group(base_path('routes/api/thirdPart/goodscan.php'));
+        Route::prefix('api/thirdPart/haochuang')
+            ->middleware('api')
+            ->namespace('App\Http\Controllers\Api\thirdPart\haochuang')
+            ->group(base_path('routes/api/thirdPart/haochuang.php'));
     }
 }

+ 22 - 6
app/RejectedBill.php

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

+ 1 - 1
app/RejectedBillItem.php

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

+ 2 - 2
app/Services/LogisticService.php

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

+ 2 - 2
app/Services/OracleActAllocationDetailService.php

@@ -13,10 +13,10 @@ Class OracleActAllocationDetailService
 {
     private function query($sql, array $params){
         if ($params['checktime_start'] ?? false){
-            $sql .= " AND checktime >= '".$params['checktime_start']." 00:00:00'";
+            $sql .= " AND checktime >= '".$params['checktime_start'].":00'";
         }
         if ($params['checktime_end'] ?? false){
-            $sql .= " AND checktime <= '".$params['checktime_end']." 23:59:59'";
+            $sql .= " AND checktime <= '".$params['checktime_end'].":59'";
         }
         return $sql;
     }

+ 34 - 11
app/Services/OracleDOCOrderHeaderService.php

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

+ 207 - 1
app/Services/OrderPackageCommoditiesService.php

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

+ 117 - 16
app/Services/OrderPackageService.php

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

+ 126 - 5
app/Services/OrderService.php

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

+ 1 - 1
app/Services/ProcessService.php

@@ -14,7 +14,7 @@ Class ProcessService
      * @return Builder
      */
     private function conditionQuery(array $params){
-        $processes=Process::filterAuthorities()->with(['tutorials','signs',
+        $processes=Process::filterAuthorities()->with(['owner','processMethod','tutorials'=>function($query){$query->with('owner');},'signs','operatorLogs'=>function($query){$query->with('user');},
             'signUnitPrice','processesContents'=>function($query){
             return $query->with(['signCommodityName','signCommoditySku','signCommodityBarcode','commodity'=>function($query){
                 return $query->with('barcodes');

+ 5 - 2
app/Services/RejectedBillService.php

@@ -33,12 +33,12 @@ Class RejectedBillService
     public function syncOrderIssue($rejectedBill)
     {
         $orderIssue = $rejectedBill->orderIssue()->first();
-        if($rejectedBill['logistic_number'] === '原单退回'){   // 原单退回
+        if(!$orderIssue && $rejectedBill['logistic_number'] === '原单退回'){   // 原单退回
             $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($rejectedBill){
                 $query->where('client_code',$rejectedBill['order_number']);
             })->first();
         }
-        if(!isset($orderIssue)){ // 有对应的问题发货订单
+        if(!isset($orderIssue)){ // 有对应的问题发货订单
             $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
                 $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
             })->first();
@@ -55,6 +55,9 @@ Class RejectedBillService
             if($orderIssue['logistic_number_return']!=$rejectedBill['logistic_number_return'])
                 $orderIssue->update(['logistic_number_return'=>$rejectedBill['logistic_number_return']]);
             //确认问题件有的时候需要更新状态和提示
+            /**
+             * @var OrderIssue $orderIssue
+             */
             $orderIssue->同步退单状态();
             $orderIssue->update(['is_new_rejecting' => '有']);
             app('LogService')->log(__METHOD__,__FUNCTION__,'退回单同步问题件'.json_encode($rejectedBill).json_encode($orderIssue));

+ 45 - 0
app/Services/common/ExportService.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Services\common;
+
+
+
+use Exception;
+use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Http;
+
+Class ExportService
+{
+
+    /**
+     * @param array $row            表头 一维数组
+     * @param array $list           表体 二维数组
+     * @param string $fileName      导出Excel文件名
+     * @param string $createFormat  导出数据格式化方式,默认非格式化
+     * @param array $mergeColumn    需要合并时 合并列 一维数组
+     * @param array $mergeRow       需要合并时 合并行 key-val数组 key为合并起点val为终点 例:["1"=>"4"] 第一行到第四行合并为一列
+     * @return Response
+     * @throws Exception            请求接口返回异常
+     */
+    public function json(array $row, array $list, string $fileName = '记录',
+                         string $createFormat = null, array $mergeColumn = [], array $mergeRow = []) :Response
+    {
+        $request['type'] = 'base';
+        $data = ['row'=>$row,'list'=>$list];
+        if ($createFormat){
+            $data["mergeColumn"] = $mergeColumn;
+            $data["mergeRow"] = $mergeRow;
+            $request["createFormat"] = "merge";
+        }
+        $request["data"] = json_encode($data,JSON_UNESCAPED_UNICODE);
+        $post=Http::post(config('go.export.url'),$request);
+
+        if ($post->status() == 500){
+            throw new Exception($post->header("Msg"));
+        }
+        return response($post,200, [
+            "Content-type"=>"application/octet-stream",
+            "Content-Disposition"=>"attachment; filename=".$fileName."-".date('ymdHis').'.xlsx',
+        ]);
+    }
+}

+ 41 - 0
app/SortingStation.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App;
+
+use App\Http\Controllers\Controller;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Model;
+use mysql_xdevapi\Exception;
+use Zttp\Zttp;
+
+class SortingStation extends Model
+{
+    protected $fillable = [
+        'name','type', 'bin_amount','is_occupied','is_online','processing_batch_id','login_at'
+    ];
+    static public function findOrCreate($name){
+        $station=SortingStation::where('name',$name)->first();
+        if(!$station){
+            $station=new SortingStation(['name'=>$name]);
+            $station->save();
+        }
+        return $station;
+    }
+    public function login(){
+        $this['login_at'] = Carbon::now();
+        $this['is_online'] = '是';
+        $this->update();
+    }
+    public function setProcessingBatch(Batch $batch){
+        $this['processing_batch_id'] = $batch['id'];
+        $this['is_occupied'] = '是';
+        $this->login();
+        $this->update();
+    }
+    public function clearProcessingBatch(){
+        $this['processing_batch_id'] = null;
+        $this['is_occupied'] = '否';
+        $this->login();
+        $this->update();
+    }
+}

+ 18 - 5
config/api.php

@@ -12,12 +12,12 @@ return [
     'sign_key_rejected_send_jianshang' => 'ymgYuN01D3UCZneZ53wGC0suOIUPmLgY',
 
 
-    /** Flux
-    https://was.baoshi56.com/api/thirdPart/flux/receive/new  //新增收货
-    https://was.baoshi56.com/api/thirdPart/flux/package/new  //新增包裹
-    https://was.baoshi56.com/api/thirdPart/flux/waybill/new  //新增运单
-     **/
     'flux'=>[
+        /** Flux
+        https://was.baoshi56.com/api/thirdPart/flux/receive/new  //新增收货
+        https://was.baoshi56.com/api/thirdPart/flux/package/new  //新增包裹
+        https://was.baoshi56.com/api/thirdPart/flux/waybill/new  //新增运单
+         **/
         'receive'=>[
             'new'=>'http://106.14.155.246:19192/datahub/FluxBSJsonApi/RECECF?messageId=RECECF' //通知WMS, 已完成的订单收货
         ],
@@ -27,6 +27,14 @@ return [
         'waybill'=>[
             'new'=>'http://106.14.155.246:19192/datahub/FluxBSJsonApi/?messageId=BS_TMS' //通知WMS, 已称完的包裹
         ],
+        /**分拔墙
+        https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newBatch  //下发波次
+        https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newCanceledOrder  //下发取消订单
+         **/
+        'inform'=>[
+            'binAssignment' => 'http://106.14.155.246:19192/datahub/FluxBSJsonApi/PUTTOLOCATION', //发送隔口号(播种位)给WMS
+            'batchFinished' => 'http://106.14.155.246:19192/datahub/FluxBSJsonApi/PUTTOLIGHT', //分播结束后通知WMS结果
+        ],
     ],
 
     'haiq'=>[
@@ -47,4 +55,9 @@ return [
     https://was.baoshi56.com/api/thirdPart/goodscan/weight/new  //新增包裹
      */
 
+    /**浩创请求地址
+    https://wcs.baoshi56.com/api/thirdPart/haochuang/sorting/login
+    https://wcs.baoshi56.com/api/thirdPart/haochuang/sorting/process
+    https://wcs.baoshi56.com/api/thirdPart/haochuang/sorting/done
+     **/
 ];

+ 12 - 0
database/factories/BatchFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\Batch;
+use Faker\Generator as Faker;
+
+$factory->define(Batch::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 12 - 0
database/factories/OrderBinFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OrderBin;
+use Faker\Generator as Faker;
+
+$factory->define(OrderBin::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 12 - 0
database/factories/OrderCommodityFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OrderCommodity;
+use Faker\Generator as Faker;
+
+$factory->define(OrderCommodity::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 12 - 0
database/factories/SortingStationFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\SortingStation;
+use Faker\Generator as Faker;
+
+$factory->define(SortingStation::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 1 - 0
database/migrations/2020_07_24_072406_create_order_commodities_table.php

@@ -19,6 +19,7 @@ class CreateOrderCommoditiesTable extends Migration
             $table->integer('commodity_id')->index();
             $table->integer('amount');
             $table->string('wms_ptltaskid')->nullable();
+            $table->string('location')->nullable();
             $table->timestamps();
         });
     }

+ 37 - 0
database/migrations/2020_11_10_135835_create_batches_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateBatchesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('batches', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('code')->unique();
+            $table->enum('status',['未处理','已处理','取消']);
+            $table->enum('type',['无'])->nullable();
+            $table->string('wms_type')->nullable();
+            $table->string('wms_status')->nullable();
+            $table->dateTime('wms_created_at');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('batches');
+    }
+}

+ 33 - 0
database/migrations/2020_11_10_162349_create_order_bins_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateOrderBinsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('order_bins', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->integer('order_id')->index();
+            $table->integer('number')->default(0);
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_bins');
+    }
+}

+ 38 - 0
database/migrations/2020_11_10_164914_create_sorting_stations_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateSortingStationsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('sorting_stations', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('name')->index();
+            $table->enum('type',['人工墙'])->default('人工墙');
+            $table->integer('bin_amount')->default(0);
+            $table->enum('is_online',['是','否','未知'])->default('否');
+            $table->enum('is_occupied',['是','否','未知'])->default('否');
+            $table->integer('processing_batch_id')->nullable();
+            $table->timestamp('login_at')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('sorting_stations');
+    }
+}

+ 16 - 0
database/seeds/BatchSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class BatchSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 16 - 0
database/seeds/OrderBinSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class OrderBinSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 16 - 0
database/seeds/OrderCommoditySeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class OrderCommoditySeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 16 - 0
database/seeds/SortingStationSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class SortingStationSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 37 - 0
resources/views/maintenance/batch/create.blade.php

@@ -0,0 +1,37 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.logistic.menu')@endcomponent
+    </div>
+    <div class="container-fluid mt-3">
+        <div class="card col-md-8 offset-md-2">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <form method="POST" action="{{ url('maintenance/logistic') }}">
+                    @csrf
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">物流公司名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="{{ old('name') }}" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-success form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 43 - 0
resources/views/maintenance/batch/edit.blade.php

@@ -0,0 +1,43 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')
+        @endcomponent
+        @component('maintenance.logistic.menu')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',4)}">修改</a>
+                </li>
+        @endcomponent
+    </div>
+    <div class="container-fluid mt-3">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}!</div>
+                @endif
+                <form method="POST" action='{{url("maintenance/logistic/{$logistic->id}")}}'>
+                    @csrf
+                    @method('PUT')
+                    <div class="form-group row">
+                        <label for="name" class="col-2 col-form-label text-right">物流公司名称</label>
+                        <div class="col-8">
+                            <input type="text" class="form-control @error('name') is-invalid @enderror"
+                                   name="name" autocomplete="off" value="@if(old('name')){{old('name')}}@else{{$logistic->name}}@endif" required>
+                            @error('name')
+                            <span class="invalid-feedback" role="alert">
+                                <strong>{{ $message }}</strong>
+                            </span>
+                            @enderror
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <input type="submit" class="btn btn-outline-dark form-control">
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+@endsection

+ 81 - 0
resources/views/maintenance/batch/index.blade.php

@@ -0,0 +1,81 @@
+@extends('layouts.app')
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+        @component('maintenance.batch.menu')@endcomponent
+    </span>
+    <div class="container-fluid mt-3">
+        <div class="card">
+            <div class="card-body">
+                @if(Session::has('successTip'))
+                    <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+                @endif
+                <table class="table table-striped table-sm" id="list">
+                    <tr>
+                        <th>波次号</th>
+                        <th>状态</th>
+                        <th>类型(WMS)</th>
+                        <th>创建时间</th>
+{{--                        <th>操作</th>--}}
+                    </tr>
+                    <tr v-for="batch in batches">
+                        <td class="text-muted">@{{batch.batch_id}}</td>
+                        <td class="text-muted">@{{batch.status}}</td>
+                        <td>@{{batch.remote_type}}</td>
+                        <td class="text-muted">@{{batch.created_at}}</td>
+{{--                        <td>--}}
+{{--                            @can('物流公司-编辑')--}}
+{{--                            <button class="btn btn-sm btn-outline-primary" @click="edit(batch.id)">改</button> @endcan--}}
+{{--                            @can('物流公司-删除')--}}
+{{--                            <button class="btn btn-sm btn-outline-dark" @click="destroy(batch)">删</button> @endcan--}}
+{{--                        </td>--}}
+                    </tr>
+                </table>
+                {{$batches->links()}}
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                batches:{!! json_encode($batches->toArray()['data'],true)??"\'\'" !!},
+            },
+            methods:{
+                {{--edit:function(id){--}}
+                {{--    location.href = "{{url('maintenance/batch')}}/"+id+"/edit";--}}
+                {{--},--}}
+                {{--destroy:function(batch){--}}
+                {{--    if(!confirm('确定要删除物流公司“' + batch.name + '”吗?')){return};--}}
+                {{--    let data=this;--}}
+                {{--    let url = "{{url('maintenance/batch')}}/"+batch.id;--}}
+                {{--    axios.delete(url,{id:batch.id})--}}
+                {{--        .then(function (response) {--}}
+                {{--            if(response.data.success){--}}
+                {{--                for (let i = 0; i < data.batches.length; i++) {--}}
+                {{--                    if (data.batches[i].id===batch.id){--}}
+                {{--                        data.batches.splice(i,1);--}}
+                {{--                        break;--}}
+                {{--                    }--}}
+                {{--                }--}}
+                {{--                tempTip.setDuration(1000);--}}
+                {{--                tempTip.showSuccess('删除物流公司"'+batch.name+'"成功!')--}}
+                {{--            }else{--}}
+                {{--                tempTip.setDuration(1000);--}}
+                {{--                tempTip.show('删除物流公司"'+batch.name+'"失败!')--}}
+                {{--            }--}}
+                {{--        })--}}
+                {{--        .catch(function (err) {--}}
+                {{--            tempTip.setDuration(3000);--}}
+                {{--            tempTip.show('删除物流公司失败!'+'网络错误:' + err)--}}
+                {{--            console.log(err);--}}
+                {{--        });--}}
+                {{--},--}}
+            }
+        });
+    </script>
+@endsection

+ 12 - 0
resources/views/maintenance/batch/menu.blade.php

@@ -0,0 +1,12 @@
+
+<div class="container-fluid">
+    <div class="card" style="background: #f9f0f0;transform: scale(0.95)">
+        <ul class="nav nav-pills">
+            @can('物流公司-查询')
+            <li class="nav-item">
+                <a class="nav-link" href="{{url('maintenance/batch')}}" :class="{active:isActive('',3)}">查询</a>
+            </li> @endcan
+            {{$slot}}
+        </ul>
+    </div>
+</div>

+ 2 - 2
resources/views/order/index/delivering.blade.php

@@ -326,8 +326,8 @@
                         {name:'c_city',type:'input',tip:'市:15天以内模糊搜索,15天以外精确搜索',placeholder:'市'},
                         {name:'c_district',type:'input',tip:'区:15天以内模糊搜索,15天以外精确搜索',placeholder:'区'},
                         {name:'releasestatus',type:'select',tip:'是否冻结冻结',placeholder:'是否冻结',data:[{name:'H',value:'是'},{name:'',value:'否'}]},
-                        {name:'checktime_start',type:'dateTime',tip:'选择显示复核时间的起始日期'},
-                        {name:'checktime_end',type:'dateTime',tip:'选择显示复核时间的结束日期'},
+                        {name:'checktime_start',type:'time',tip:['选择显示复核时间的起始日期',"选择显示复核时间的起始时间"]},
+                        {name:'checktime_end',type:'time',tip:['选择显示复核时间的结束日期','选择显示复核时间的结束时间']},
                         {name: 'is_display_all', type: 'checkbox', tip: '是否隐藏装箱完成以后的状态', data: [{name: 'ture', value: '隐藏完成状态'}]},
                     ],
                 ];

+ 144 - 0
resources/views/rejected/importRejectedNumber.blade.php

@@ -0,0 +1,144 @@
+@extends('layouts.app')
+@section('title')退回件-导入@endsection
+@section('content')
+    <div id="nav2">
+        @component('order.issue.menu')@endcomponent
+    </div>
+    <div class="container-fluid" id="issue_import_div">
+        <div class="card col-md-8 offset-md-2">
+            <div class="card-body">
+                @can('退货管理-编辑')
+                    <div class="form-group row text-center">
+                        <div class="col-12 text-danger">
+                            退回单号修改<br/>
+                            【退回单号,原单单号】 必填项;【到付金额】 非必填项<br/>
+                            <span class="text-muted" style="opacity:0.7">
+                                如果在导入后出现部分数据导入失败,修改对应错误的数据继续导入即可,
+                            </span>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <button type="button" class="btn form-control btn-primary"  @click="showPasteDataModal">文本导入</button>
+                        </div>
+                    </div>
+                    <hr/>
+                @endcan
+
+                </form>
+            </div>
+        </div>
+        <div class="modal fade" id="pasteData" role="dialog" tabindex="-1" aria-labelledby="pasteDataTetlie" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <div class="row modal-title font-weight-bold w-100 text-nowrap ml-1 noselect" id="pasteDataTitle">
+                            <span v-for="(row,i) in rows" draggable="true"
+                                  @drop="drop($event,i)" @dragover="dragover($event)" @dragstart="dragstart($event,i)"
+                                  class="col-4 border text-center" style="cursor: move"
+                                  :class="requiredRows.includes(row)?'text-danger':''">@{{ row }}</span>
+                        </div>
+                    </div>
+                    <div class="modal-body text-center">
+                        <button type="button" id="popover" class="btn btn-danger" v-if="popoverContent"
+                                data-container="body" data-toggle="popover" data-placement="bottom"
+                                :data-content="popoverContent" data-html="true">
+                            部分数据导入失败
+                        </button>
+                        <textarea id="pasteDataText" class="w-100" style="height: 400px" v-model="pasteDataText"
+                                  @keydown.tab="forbidTab($event)" @keyup.tab="replaceSpacing()"
+                                  placeholder="内容可为EXCEL复制,也可手动输入使用“TAB”缩进符区分列,以表头顺序为准" @click="hidePopover"></textarea>
+                    </div>
+                    <div class="modal-footer">
+                        <button class="btn btn-primary" @click="importPasteData">开始导入</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        let listVue = new Vue({
+            el:'#issue_import_div',
+            data:{
+                rows:['退回单号','原单单号','到付金额'],
+                requiredRows:['退回单号','原单单号','到付金额'],
+                popoverContent:'',
+                pasteDataText: '',
+            },
+            mounted:function(){
+                $('[data-toggle="popover"]').popover();
+            },
+            methods:{
+                showPasteDataModal(){
+                    $('#popover').attr('hidden','hidden')
+                    $('#pasteData').modal('show')
+                },
+                drop(e,index){
+                    e.preventDefault();
+                    if (this.dom !== e.target.innerHTML){
+                        this.dom.innerHTML = e.target.innerHTML;
+                        let temp=JSON.parse(JSON.stringify(this.rows[index]));
+                        this.$set(this.rows,index,this.rows[e.dataTransfer.getData('text/html')]);
+                        this.$set(this.rows,Number(e.dataTransfer.getData('text/html')),temp);
+                    }
+                },
+                dragover(e){
+                    e.preventDefault();
+                },
+                dragstart(e,index){
+                    this.dom = e.target.innerHTML;
+                    e.dataTransfer.setData("text/html",index);
+                },
+                importPasteData(){
+                    if(!this.pasteDataText){
+                        tempTip.setDuration(2000)
+                        tempTip.show('导入文本不能为空')
+                    }
+                    let _this = this
+                    let data = {dataText:this.pasteDataText}
+                    tempTip.setDuration(99999)
+                    tempTip.setIndex(1051)
+                    tempTip.waitingTip('正在执行中,请稍后')
+                    axios.post('{{url('apiLocal/rejectedBill/importRejectedNumber')}}',data).then(function (response) {
+                        tempTip.cancelWaitingTip()
+                        if(response.data.success){
+                            $('#pasteData').modal('hide')
+                            tempTip.setDuration(2000)
+                            tempTip.showSuccess('导入完毕')
+                        }else{
+                            let content = '';
+                            for (const key in response.data.error) {
+                                content+=key+':'+response.data.error[key] + "</br>"
+                            }
+                            _this.popoverContent = content
+                            setTimeout(function () {
+                                $("#popover").removeAttr('hidden').popover('show')
+                            },1);
+                        }
+                    }).catch(function(error){
+                        tempTip.cancelWaitingTip()
+                        tempTip.setDuration(2000)
+                        tempTip.show('导入失败'+error)
+                    })
+                },
+                forbidTab(e){
+                    e.preventDefault();
+                },
+                replaceSpacing(){
+                    this.pasteDataText += "\t";
+                },
+                hidePopover(){
+                    let _this = this;
+                    setTimeout(function () {
+                        _this.popoverContent = ''
+                        $("#popover").removeAttr('hidden').popover('hide')
+                    },1)
+                }
+            }
+        });
+    </script>
+@endsection
+

+ 8 - 2
resources/views/rejected/search/general.blade.php

@@ -55,10 +55,16 @@
                         <a class="dropdown-item" @click="setIsLoaded_batch(4)" href="javascript:">待确认</a>
                     </div>
                 </span>
-                <label for="checkSelectingAll" class="d-none" id="cloneCheckAll">
+
+                @can('退货管理-编辑')
+                    <a class="btn btn-sm btn-outline-dark" href="{{url('rejected/importRejectedNumber')}}" style="cursor: pointer">导入修改</a>
+                @endcan
+                <span for="checkSelectingAll" class="d-none" id="cloneCheckAll">
                     <input type="checkbox" class="form-control-sm tooltipTarget" title="全选"
                            id="checkSelectingAll" @click="checkBoxAllToggle($event)">
-                </label>
+                </span>
+
+
                 <table class="table table-striped table-sm table-bordered table-hover text-nowrap d-none" id="headerRoll" ></table>
                 <table class="table table-striped table-sm table-bordered table-hover text-nowrap" style="background: #fff;" id="headerParent">
                     <tr id="header"></tr>

+ 1 - 1
resources/views/weight/measureMonitor/index.blade.php

@@ -141,7 +141,7 @@
                                         audio.play();
                                     }else {
                                         tempTip.setDuration(4000);
-                                        tempTip.show('文件名不规范!');
+                                        tempTip.show('没有对应快递名称!');
                                     }
                                 })
                                 .catch(function (err) {

+ 7 - 0
routes/api/thirdPart/flux.php

@@ -27,3 +27,10 @@ Route::post('process/getProcessContent', "ProcessController@getProcessContent");
 */
 //请求数据,查询库单据是否存在
 Route::post('waybill/new', "WaybillController@new_");//增加运输单消息
+
+
+/*
+文件地址前缀:/api/thirdPart/flux/sorting
+*/
+Route::post('sorting/newBatch', "SortingController@newBatch");//增加新波次(分拣用)
+Route::post('sorting/newCanceledOrder', "SortingController@newCanceledOrder");//取消波次

+ 17 - 0
routes/api/thirdPart/haochuang.php

@@ -0,0 +1,17 @@
+<?php
+
+use Illuminate\Http\Request;
+
+/*
+文件地址前缀:/api/thirdPart/haochuang/
+*/
+
+
+/*
+ 地址前缀:/api/thirdPart/haochuang/sorting
+*/
+Route::prefix('sorting')->group(function(){
+    Route::post('login', "SortingController@login");
+    Route::post('process', "SortingController@process");
+    Route::post('done', "SortingController@done");
+});

+ 1 - 0
routes/apiLocal.php

@@ -20,6 +20,7 @@ Route::post('rejectedBill/apiGetRecent', 'RejectedBillController@apiGetRecent');
 Route::post('rejectedBill/apiSetIsLoadedAll', 'RejectedBillController@apiSetIsLoadedAll');
 Route::post('rejectedBill/apiConfirmBeStored', 'RejectedBillController@apiConfirmBeStored');
 Route::post('rejectedBill/seekOrder','RejectedBillController@seekOrder');
+Route::post('rejectedBill/importRejectedNumber','RejectedBillController@disposeImportApi');
 
 Route::post('logistic/numberFeatures/computeLogisticByNumber', 'LogisticNumberFeatureController@apiComputeLogisticByNumber');
 Route::post('logistic/logisticNumberReturnIsUnique', 'RejectedBillController@apiLogisticNumberReturnIsUnique');

+ 1 - 0
routes/web.php

@@ -215,6 +215,7 @@ Route::group(['prefix'=>'rejected'],function(){
     Route::any('exportAnalyze', 'RejectedController@exportAnalyze');
     Route::post('ajaxGetRejected', 'RejectedController@ajaxGetRejected');
     Route::post('changeRejectedBillRemark', 'RejectedController@changeRejectedBillRemark');
+    Route::get('importRejectedNumber','RejectedBillController@importRejectedNumber');
 });
 Route::resource('rejected', 'RejectedController');
 

+ 8 - 0
serves/excelExportGo/api/controller/controller.go

@@ -5,8 +5,10 @@ import (
     "bswas/orm"
     "bswas/utilities"
     "encoding/json"
+    "fmt"
     "net/http"
     "strconv"
+    "time"
 )
 
 func Export(w http.ResponseWriter,req *http.Request)  {
@@ -40,6 +42,8 @@ func selectCreateFormat(params map[string]string) (row []interface{}, list [][]i
 	switch params["createFormat"] {
 	case "merge":
 		row, list, mergeRow, mergeColumn = selectModule(params)
+    case "warpText":
+        row, list, _, mergeColumn = selectModule(params)
 	default:
 		row, list, _, _ = selectModule(params)
 	}
@@ -126,6 +130,8 @@ func selectModule(params map[string]string) (row []interface{}, list [][]interfa
 		}
 		row, list = LaborReportFormat(data)
 	case "orderIssue":
+        t := time.Now()
+        fmt.Println(t.Format("2006-01-02 15:04:05"))
 		sqlList := make(map[string]string)
 		err := json.Unmarshal([]byte(params["sqlList"]), &sqlList)
 		if err != nil {
@@ -177,6 +183,8 @@ func selectModule(params map[string]string) (row []interface{}, list [][]interfa
 			"A","B","C","D","E","F","G","H","I","J","K","L",
 			"U","Y","Z","AA","AF","AG","AH","AI","AJ","AK",
 		}
+        t = time.Now()
+        fmt.Println(t.Format("2006-01-02 15:04:05"))
 	case "inventoryAccountMission":
 		err := json.Unmarshal([]byte(params["data"]), &data)
 		if err != nil {

+ 27 - 6
serves/excelExportGo/excel/export.go

@@ -8,27 +8,48 @@ import (
 const SHEET  = "Sheet1"
 
 func CreateFile(row []interface{},list [][]interface{}, mergeRow map[string]string, mergeColumn []string) (excel *excelize.File) {
+    /* 生成文件 */
 	file := excelize.NewFile()
 	streamWriter, err := file.NewStreamWriter(SHEET)
 	if err != nil {
-		utilities.WriteLog("/excel/export.go:14   文件生成失败!","ERROR")
+		utilities.WriteLog("/excel/export.go:15   文件生成失败!","ERROR")
 	}
+
+	/* 换行 */
+    styleID, err := file.NewStyle(&excelize.Style{
+        Alignment: &excelize.Alignment{
+            WrapText: true,
+        },
+    })
+    if err != nil {
+        utilities.WriteLog("/excel/export.go:25  创建换行样式失败!","ERROR")
+    }
+    end, _ := excelize.ColumnNumberToName(len(row))
+    err = file.SetColStyle(SHEET, "A:"+end, styleID)
+    if err != nil {
+        utilities.WriteLog("/excel/export.go:30  设置换行格式失败!","ERROR")
+        return
+    }
+
+    /* 写入表头 */
 	cell, _ := excelize.CoordinatesToCellName(1, 1)
 	if err := streamWriter.SetRow(cell, row); err != nil {
-		utilities.WriteLog("/excel/export.go:18  写入表头失败!","ERROR")
+		utilities.WriteLog("/excel/export.go:37  写入表头失败!","ERROR")
 	}
+	/* 流式写入数据 */
 	for index := 0; index < len(list); index++ {
 		cell, _ := excelize.CoordinatesToCellName(1, index+2)
 		if err := streamWriter.SetRow(cell, list[index]); err != nil {
-			utilities.WriteLog("/excel/export.go:23  数据写入文件失败!","ERROR")
+			utilities.WriteLog("/excel/export.go:43  数据写入文件失败!","ERROR")
 		}
 	}
+	/* 合并操作 */
 	if mergeRow != nil && mergeColumn != nil {
 		for start,end := range mergeRow {
 			for i := 0;i<len(mergeColumn); i++ {
 				err := file.MergeCell(SHEET,mergeColumn[i]+start,mergeColumn[i]+end)
 				if err != nil {
-					utilities.WriteLog("/excel/export.go:31  合并单元格失败!","ERROR")
+					utilities.WriteLog("/excel/export.go:52  合并单元格失败!","ERROR")
 					return
 				}
 			}
@@ -36,7 +57,7 @@ func CreateFile(row []interface{},list [][]interface{}, mergeRow map[string]stri
 	}
 
 	if err := streamWriter.Flush(); err != nil {
-		utilities.WriteLog("/excel/export.go:39  文件流关闭失败!","ERROR")
+		utilities.WriteLog("/excel/export.go:60  文件流关闭失败!","ERROR")
 	}
 	return file
-}
+}

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

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

+ 37 - 0
tests/Services/OracleDOCOrderHeaderService/GetWMSORderOnStartDateTest/GetWMSOrderOnStartDateTest.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace Tests\Services\OracleDOCOrderHeaderService\GetWMSORderOnStartDateTest;
+
+use App\Services\OracleDOCOrderHeaderService;
+use Carbon\Carbon;
+//use Illuminate\Foundation\Testing\RefreshDatabase;
+//use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetWMSOrderOnStartDateTest extends TestCase
+{
+    /** @var OracleDOCOrderHeaderService $service */
+    public $service;
+
+    public function setUp(): void
+    {
+        $this->service = app(OracleDOCOrderHeaderService::class);
+        parent::setUp();
+    }
+
+    public function testGetWMSOrderOnStartDate()
+    {
+        $carbon =Carbon::now()->subSeconds(10);
+        var_dump(Carbon::now());
+        $orderHeaders = $this->service->getWMSOrderOnStartDate($carbon);
+        var_dump(Carbon::now());
+        $this->assertNotNull($orderHeaders);
+        $orderHeader = $orderHeaders->first();
+        var_dump($orderHeader->toArray());
+        $this->assertNotNull($orderHeader->oracleDOCOrderDetails);
+        $this->assertNotNull($orderHeader->actAllocationDetails);
+        $this->assertNotNull($orderHeader->oracleBASCustomer);
+        $this->assertNotNull($orderHeader->oracleBASCode);
+    }
+
+}

+ 39 - 0
tests/Services/OracleDOCOrderHeaderService/GetWmsOrderOnStartDateCreateTest/GetWmsOrderOnstartDateCreateTest.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace Tests\Services\OracleDOCOrderHeaderService\GetWmsOrderOnStartDateCreateTest;
+
+use App\OracleDOCOrderHeader;
+use App\Services\OracleDOCOrderHeaderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetWmsOrderOnstartDateCreateTest extends TestCase
+{
+    /** @var OracleDOCOrderHeaderService $service */
+    public $service;
+
+    public function setUp(): void
+    {
+        $this->service = app(OracleDOCOrderHeaderService::class);
+        parent::setUp();
+    }
+
+    public function testGetWmsOrderOnstartDateCreate()
+    {
+        $carbon =Carbon::now()->subHours(10);
+        var_dump(Carbon::now());
+        $orderHeaders = $this->service->getWmsOrderOnStartDateCreate($carbon);
+        var_dump(Carbon::now());
+        $this->assertNotNull($orderHeaders);
+        $orderHeader = $orderHeaders->first();
+        if($orderHeaders->count() == 0){
+            return ;
+        }
+        $this->assertNotNull($orderHeader->oracleDOCOrderDetails);
+        $this->assertNotNull($orderHeader->actAllocationDetails);
+        $this->assertNotNull($orderHeader->oracleBASCustomer);
+        $this->assertNotNull($orderHeader->oracleBASCode);
+    }
+}

+ 38 - 0
tests/Services/OracleDOCOrderHeaderService/GetWmsOrderOnStartDateEditTest/GetWmsOrderOnStartDateEditTest.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace Tests\Services\OracleDocOrderHeaderServie\GetWmsOrderOnStartDateEditTest;
+
+use App\Services\OracleDOCOrderHeaderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetWmsOrderOnStartDateEditTest extends TestCase
+{
+    /** @var OracleDOCOrderHeaderService $service */
+    public $service;
+
+    public function setUp(): void
+    {
+        $this->service = app(OracleDOCOrderHeaderService::class);
+        parent::setUp();
+    }
+
+    public function testGetWmsOrderOnStartDateEdit()
+    {
+        $carbon =Carbon::now()->subHours(10);
+        var_dump(Carbon::now());
+        $orderHeaders = $this->service->getWmsOrderOnStartDateEdit($carbon);
+        var_dump(Carbon::now());
+        $this->assertNotNull($orderHeaders);
+        $orderHeader = $orderHeaders->first();
+        if($orderHeaders->count() == 0){
+            return ;
+        }
+        $this->assertNotNull($orderHeader->oracleDOCOrderDetails);
+        $this->assertNotNull($orderHeader->actAllocationDetails);
+        $this->assertNotNull($orderHeader->oracleBASCustomer);
+        $this->assertNotNull($orderHeader->oracleBASCode);
+    }
+}

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

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

+ 13 - 6
tests/Services/OrderIssueService/OrderIssueTagTest/OrderIssueTagTest.php

@@ -2,26 +2,33 @@
 
 namespace Tests\Services\OrderIssueService\OrderIssueTagTest;
 
+use App\OracleDOCOrderHeader;
 use App\Services\OrderIssueService;
+use Carbon\Carbon;
 use Tests\TestCase;
 
 class OrderIssueTagTest extends TestCase
 {
-
     /** @var OrderIssueService $service */
     public $service;
     public function setUp(): void
     {
-        $this->service = app('OrderIssueService');
+        $this->service = app(OrderIssueService::class);
         parent::setUp();
     }
 
-    public function testGetArray()
-    {
-        return [];
-    }
     public function testOrderIssueTag()
     {
 
+        $orderHeader = OracleDOCOrderHeader::query()->orderByDesc('AddTime')->first();
+        $addtime = $orderHeader->addtime;
+        $addtime = Carbon::parse((string)$addtime)->subMinutes(30);
+        $orderNos = OracleDOCOrderHeader::query()
+            ->where('AddTime','>=',$addtime)
+            ->get()
+            ->map(function($orderHeader){
+                return $orderHeader->orderno;
+            });
+        $this->assertNotNull($orderNos);
     }
 }

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

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

+ 62 - 0
tests/Services/OrderPackageService/CreateOrderPackageTest/CreateOrderPackageTest.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace Tests\Services\OrderPackageService\CreateOrderPackageTest;
+
+use App\OracleDOCOrderHeader;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderPackageService;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class CreateOrderPackageTest extends TestCase
+{
+    /**
+     * @var OrderPackageService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var OrderService $orderService
+     */
+    public $service;
+    public $orderService;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderPackageService');
+        $this->orderService = app('OrderService');
+        $this->orderHeaderService = app('OracleDOCOrderHeaderService');
+    }
+
+    public function testCreateOrderPackage()
+    {
+        /*
+         * createOrderPackage($orderHeaders,$orders,$packages)
+         * */
+
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        if($orderHeaders->count()==0){
+            var_dump('查询数据为空');
+            return;
+        }
+        $orders = $this->orderService->getByWmsOrders($orderHeaders);
+        $packages = $this->service->getByWmsOrders($orderHeaders);
+        $this->service->createOrderPackage($orderHeaders,$orders,$packages);
+        $exits_packages  = $this->service->getByWmsOrders($orderHeaders);
+        $exits_count = $exits_packages->count();
+        $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid');
+        $logistic_numbers = array_unique(array_diff($logistic_numbers,['',' ','*']));
+        $this->assertEquals(count($logistic_numbers),$exits_count);
+        foreach ($logistic_numbers as $logistic_number) {
+            $exits_package = $exits_packages->where('logistic_number',$logistic_number);
+            $this->assertEmpty($exits_package);
+            $this->assertEquals($exits_package->count(),1);
+        }
+    }
+
+
+}

+ 50 - 0
tests/Services/OrderPackageService/CreatePackageByOrderHeaderTest/CreatePackageByOrderHeaderTest.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace Tests\Services\OrderPackageService\CreatePackageByOrderHeaderTest;
+
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderPackageService;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class CreatePackageByOrderHeaderTest extends TestCase
+{
+    /**
+     * @var OrderPackageService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var OrderService $orderService
+     */
+    public $service;
+    public $orderService;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderPackageService');
+        $this->orderService = app('OrderService');
+        $this->orderHeaderService = app('OracleDOCOrderHeaderService');
+    }
+    public function testCreatePackageByOrderHeader()
+    {
+        /**
+         * createPackageByOrderHeader($orderHeaders)
+         */
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        if ($orderHeaders->count() == 0) {
+            var_dump('查询数据为空');
+            return;
+        }
+        $this->service->createPackageByOrderHeader($orderHeaders);
+        $packages = $this->service->getByWmsOrders($orderHeaders);
+        $order_nos =  array_unique(data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'));
+        foreach ($order_nos as $order_no) {
+            $this->assertNotEmpty($packages->where('logistic_number',$order_no));
+        }
+    }
+}

+ 46 - 0
tests/Services/OrderPackageService/CreatePackageInfoTest/CreatePackageInfoTest.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace Tests\Services\OrderPackageService\CreatePackageInfoTest;
+
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderPackageService;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class CreatePackageInfoTest extends TestCase
+{
+    /**
+     * @var OrderPackageService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var OrderService $orderService
+     */
+    public $service;
+    public $orderService;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderPackageService');
+        $this->orderService = app('OrderService');
+        $this->orderHeaderService = app('OracleDOCOrderHeaderService');
+    }
+
+    public function testCreatePackageInfo()
+    {
+        /**
+         * createPackageByOrderHeader($orderHeaders)
+         */
+
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        if ($orderHeaders->count() == 0) {
+            var_dump('查询数据为空');
+        }
+        $this->service->createPackageInfo($orderHeaders);
+    }
+}

+ 28 - 0
tests/Services/OrderPackageService/DeleteUnnecessaryPackageTest/DeleteUnnecessaryPackageTest.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace Tests\Services\OrderPackageService\DeleteUnnecessaryPackageTest;
+
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderPackageService;
+use App\Services\OrderService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class DeleteUnnecessaryPackageTest extends TestCase
+{
+    /**
+     * @var OrderPackageService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     */
+    public $service;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderPackageService');
+        $this->orderHeaderService = app('OracleDOCOrderHeaderService');
+    }
+
+}

+ 49 - 0
tests/Services/OrderPackageService/GetInnerParamsTest/GetInnerParamsTest.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace Tests\Services\OrderPackageSerivce\GetInnerParamsTest;
+
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderPackageService;
+use App\Services\OrderService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetInnerParamsTest extends TestCase
+{
+    /**
+     * @var OrderPackageService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var OrderService $orderService
+     */
+    public $service;
+    public $orderService;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderPackageService');
+        $this->orderService = app('OrderService');
+        $this->orderHeaderService = app('OracleDOCOrderHeaderService');
+    }
+    public function testGetInnerParamsTest()
+    {
+        $orderHeader = OracleDOCOrderHeader::query()->with('actAllocationDetails')->orderByDesc('AddTime')->first();
+        $order = Order::query()->where('code',$orderHeader->orderno)->first();
+        $inner_params = $this->service->getInnerParams($orderHeader,$order,[]);
+        $this->assertNotEmpty($inner_params);
+        $actAllocationDetails = $orderHeader->actAllocationDetails;
+
+        foreach ($inner_params as $inner_param) {
+            $detail = $actAllocationDetails->where('picktotraceid',$inner_param['logistic_number'])->first();
+            $this->assertNotEmpty($detail);
+            $this->assertEquals($inner_param['order_id'],$order->id);
+            $this->assertEquals($inner_param['logistic_number'],$detail->picktotraceid);
+            $this->assertNotEmpty($inner_param['created_at']);
+            $this->assertNotEmpty($inner_param['updated_at']);
+        }
+    }
+}

+ 118 - 0
tests/Services/OrderService/CreateOrderByWMSOrderHeadersTest/CreateOrderByWMSOrderHeadersTest.php

@@ -0,0 +1,118 @@
+<?php
+
+namespace Tests\Services\OrderService\CreateOrderByWMSOrderHeadersTest;
+
+use App\Logistic;
+use App\Order;
+use App\Owner;
+use App\Services\common\DataHandlerService;
+use App\Services\LogisticService;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use App\Services\WarehouseService;
+use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class CreateOrderByWMSOrderHeadersTest extends TestCase
+{
+    /**
+     * @var OrderService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var DataHandlerService $dataHandlerService
+     * @var OwnerService $ownerService
+     * @var LogisticService $logisticService
+     * @var ShopService $shopService
+     * @var WarehouseService $warehouseService
+     */
+    public $service;
+    public $orderHeaderService;
+    public $dataHandlerService;
+    public $ownerService;
+    public $logisticService;
+    public $shopService;
+    public $warehouseService;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app(OrderService::class);
+        $this->orderHeaderService=app(OracleDOCOrderHeaderService::class);
+    }
+
+    public function testCreateOrderByWMSOrderHeaders()
+    {
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        $orders = $this->service->createOrderByWMSOrderHeaders($orderHeaders);
+        $existOrders = $this->service->getByWmsOrders($orderHeaders);
+        $collect =null;
+        if($existOrders->count()!==$orders->count()){
+            $collect = $existOrders->map(function($order)use($orders){
+                $_order = $orders->where($order->code)->first();
+                return $_order ?? $order;
+            });
+            $this->assertEquals($collect->count(),$orderHeaders->count());
+        }else{
+            $this->assertEquals($orderHeaders->counts(),$orders->count());
+        }
+        foreach ($orderHeaders as $orderHeader) {
+            $code = $orderHeader->orderno;
+            $order = $collect->where('code',$code)->first();
+            $this->assertNotNull($order);
+
+            $warehouse = Warehouse::query()->where('code',$orderHeader->warehouseid)->first();
+            if($orderHeader->warehouseid ?? false)
+                $this->assertEquals($warehouse->id ?? '',$order->warehouse_id ?? '');
+
+            $owner = Owner::query()->where('code',$orderHeader->customerid)->first();
+            if($orderHeader->customerid ?? false)
+                $this->assertEquals($order->owner_id ?? '',$owner->id??'');
+
+            $logistic = Logistic::query()->where('code',$orderHeader->userdefine1??'')->first();
+            if($orderHeader->userdefine1 ?? false)
+                $this->assertEquals($logistic->id ?? '',$logistic->id ?? '');
+
+            $shop = Shop::query()->where('name',$orderHeader->issuepartyname)->where('owner_id',$owner->id)->first();
+            if($orderHeader->issuepartyname ?? false)
+                $this->assertEquals($shop->name,$orderHeader->issuepartyname);
+
+            $this->assertEquals($order->consignee_name ,$orderHeader->c_contact);
+            $this->assertEquals($order->consignee_phone ,empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2);
+            $this->assertEquals($order->province ,$orderHeader->c_province);
+            $this->assertEquals($order->city ,$orderHeader->c_city);
+            $this->assertEquals($order->district ,$orderHeader->c_district);
+
+            $this->assertEquals($order->client_code ,$orderHeader->soreference1);
+            $this->assertEquals($order->wms_edittime ,(string)$orderHeader->edittime);
+            $this->assertEquals($order->wms_status ,$orderHeader->oracleBASCode_codename_c);
+
+            $this->assertEquals((string)$order->created_at ,(string)$orderHeader->addtime);
+        }
+    }
+
+    /*
+            'code'                      => $orderHeader->orderno,
+            'warehouse_id'              => $warehouse->id ?? null,
+            'owner_id'                  => $owner->id ?? null,
+            'shop_id'                   => $shop->id ?? null,
+            'logistic_id'               => $logistic->id ?? null,
+            'consignee_name'            => $orderHeader->c_contact,
+            'consignee_phone'           => empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2,
+            'province'                  => $orderHeader->c_province,
+            'city'                      => $orderHeader->c_city,
+            'district'                  => $orderHeader->c_district,
+            'address'                   => $orderHeader->c_address1,
+            'client_code'               => $orderHeader->soreference1,
+            'wms_edittime'              => $orderHeader->edittime,
+            'wms_status'                => $orderHeader->oracleBASCode_codename_c ?? '',
+            'updated_at'                => (string)$date,
+            'created_at'                => $orderHeader->addtime,
+        ]);*/
+
+}

+ 40 - 0
tests/Services/OrderService/CreateOrderInfoTest/CreateOrderInfoTest.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace Tests\Services\OrderService\CreateOrderInfoTest;
+
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class CreateOrderInfoTest extends TestCase
+{
+    /**
+     * @var OrderService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     */
+    public $service;
+    public $orderHeaderService;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service=app('OrderService');
+        $this->orderHeaderService=app('OracleDOCOrderHeaderService');
+    }
+
+    public function testCreateOrderInfo()
+    {
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeader = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        $order_models = $this->service->createOrderInfo($orderHeader);
+        $this->assertNotNull($order_models);
+//        var_dump($orderHeader->count());
+//        var_dump($order_models);
+        $order = $this->service->getByWmsOrders($orderHeader);
+        $this->assertNotNull($order);
+        $this->assertNotNull($orderHeader);
+    }
+}

+ 1 - 1
tests/Services/OrderService/FindOrCreateByClientCodeTest/FindOrCreateByClientCodeTest.php

@@ -15,8 +15,8 @@ class FindOrCreateByClientCodeTest extends TestCase
 
     public function setUp(): void
     {
-        $this->service=app(OrderService::class);
         parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service=app('OrderService');
     }
 
     public function testFindOrCreateByClientCode()

+ 42 - 0
tests/Services/OrderService/GetByWmsOrdersTest/GetByWmsOrdersTest.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace Tests\Services\OrderService\GetByWmsOrdersTest;
+
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\Services\OrderService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetByWmsOrdersTest extends TestCase
+{
+    /** @var OrderService $service */
+    public $service;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderService');
+    }
+
+    public function testGetByWmsOrders()
+    {
+        $orders = Order::query()->orderByDesc('id')->forPage(0,5)->get();
+        $orderHeader = OracleDOCOrderHeader::query()->whereIn('OrderNo',$orders->map(function($order){
+            return $order->code;
+        }))->get();
+        $order_list = $this->service->getByWmsOrders($orderHeader);
+        $this->assertIsBool(count($order_list)==count($orders));
+
+        $order_codes = $orders->sortBy('code')->map(function($order){
+            return $order->code;
+        });
+
+        $order_list_codes = $order_list->sortBy('code')->map(function($order){
+            return $order->code;
+        });
+
+        $this->assertEquals(count($order_list_codes),count($order_codes));
+    }
+}

+ 113 - 0
tests/Services/OrderService/GetCreateOrderModelByWMSOrderHeadersTest/GetCreateOrderModelByWMSOrderHeadersTest.php

@@ -0,0 +1,113 @@
+<?php
+
+namespace Tests\Services\OrderService\GetCreateOrderModelByWMSOrderHeadersTest;
+
+use App\Logistic;
+use App\Owner;
+use App\Services\common\DataHandlerService;
+use App\Services\LogisticService;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use App\Services\WarehouseService;
+use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
+{
+    /**
+     * @var OrderService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var DataHandlerService $dataHandlerService
+     * @var OwnerService $ownerService
+     * @var LogisticService $logisticService
+     * @var ShopService $shopService
+     * @var WarehouseService $warehouseService
+     */
+    public $service;
+    public $orderHeaderService;
+    public $dataHandlerService;
+    public $ownerService;
+    public $logisticService;
+    public $shopService;
+    public $warehouseService;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderService');
+        $this->orderHeaderService = app('OracleDocOrderHeaderService');
+        $this->dataHandlerService=app('DataHandlerService');
+        $this->ownerService=app('OwnerService');
+        $this->logisticService=app('LogisticService');
+        $this->shopService=app('ShopService');
+        $this->warehouseService=app('WarehouseService');
+    }
+
+    public function testGetCreateOrderModelByWMSOrderHeaders()
+    {
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        $warehouses = $this->getWareHouses($orderHeaders);
+        $owners = $this->getOwners($orderHeaders);
+        $logistics = $this->getLogistics($orderHeaders);
+        $shops = $this->getShops($orderHeaders);
+
+        $orders = $this->service->getByWmsOrders($orderHeaders);
+        $crate_orders = $this->service->getCreateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+        if($orders->count() == $orderHeaders->count() ){
+            $this->assertEquals($orders->count(),$orderHeaders->count());
+        }
+        foreach ($orderHeaders as $orderHeader) {
+            $order = $crate_orders->where('code',$orderHeader->orderno)->first();
+            $exist_order = $orders->where('code',$orderHeader->orderno)->first();
+            if(isset($exist_order))continue;
+            $this->assertNotNull($order);
+            $warehouse = Warehouse::query()->where('code',$orderHeader->warehouseid)->first();
+            if($orderHeader->warehouseid ?? false)
+                $this->assertEquals($warehouse->id ?? '',$order->warehouse_id ?? '');
+
+            $owner = Owner::query()->where('code',$orderHeader->customerid)->first();
+            if($orderHeader->customerid ?? false)
+                $this->assertEquals($order->owner_id ?? '',$owner->id??'');
+
+            $logistic = Logistic::query()->where('code',$orderHeader->userdefine1??'')->first();
+            if($orderHeader->userdefine1 ?? false)
+                $this->assertEquals($logistic->id ?? '',$logistic->id ?? '');
+            $shop = Shop::query()->where('name',$orderHeader->issuepartyname)->where('owner_id',$owner->id)->first();
+            if($orderHeader->issuepartyname ?? false)
+                $this->assertEquals($shop->name,$orderHeader->issuepartyname);
+            $this->assertEquals($order->consignee_name ,$orderHeader->c_contact);
+            $this->assertEquals($order->consignee_phone ,empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2);
+            $this->assertEquals($order->province ,$orderHeader->c_province);
+            $this->assertEquals($order->city ,$orderHeader->c_city);
+            $this->assertEquals($order->district ,$orderHeader->c_district);
+            $this->assertEquals($order->client_code ,$orderHeader->soreference1);
+            $this->assertEquals($order->wms_edittime ,(string)$orderHeader->edittime);
+            $this->assertEquals($order->wms_status ,$orderHeader->oracleBASCode_codename_c);
+            $this->assertEquals((string)$order->created_at ,(string)$orderHeader->addtime);
+        }
+    }
+
+    public function getWareHouses($orderHeaders)
+    {
+        return $this->warehouseService->getByWmsOrders($orderHeaders);
+    }
+    public function getOwners($orderHeaders)
+    {
+        return $this->ownerService->getByWmsOrders($orderHeaders);
+    }
+    public function getLogistics($orderHeaders)
+    {
+        return $this->logisticService->getByWmsOrders($orderHeaders);
+    }
+    public function getShops($orderHeaders)
+    {
+        return $this->shopService->getByWmsOrders($orderHeaders);
+    }
+}

+ 83 - 0
tests/Services/OrderService/GetCreateOrderModelsTest/GetCreateOrderModelsTest.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace Tests\Services\OrderService\GetCreateOrderModelsTest;
+
+use App\OracleDOCOrderHeader;
+use App\Services\common\DataHandlerService;
+use App\Services\LogisticService;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use App\Services\WarehouseService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetCreateOrderModelsTest extends TestCase
+{
+    /**
+     * @var OrderService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     * @var DataHandlerService $dataHandlerService
+     * @var OwnerService $ownerService
+     * @var LogisticService $logisticService
+     * @var ShopService $shopService
+     * @var WarehouseService $warehouseService
+     */
+    public $service;
+    public $orderHeaderService;
+    public $dataHandlerService;
+    public $ownerService;
+    public $logisticService;
+    public $shopService;
+    public $warehouseService;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderService');
+        $this->orderHeaderService = app('OracleDocOrderHeaderService');
+        $this->dataHandlerService=app('DataHandlerService');
+        $this->ownerService=app('OwnerService');
+        $this->logisticService=app('LogisticService');
+        $this->shopService=app('ShopService');
+        $this->warehouseService=app('WarehouseService');
+    }
+
+    public function testGetCreateModels()
+    {
+        $orderHeader = OracleDOCOrderHeader::query()->orderByDesc('addTime')->first();
+
+        $orderHeaders= collect($orderHeader);
+        $warehouse_map = $this->getWareHouseMap($orderHeaders);
+        $owner_map = $this->getOwnersMap($orderHeaders);
+        $logistic_map = $this->getLogisticMap($orderHeaders);
+        $shop_map = $this->getShopMap($orderHeaders);
+
+        $create_order = $this->service->getCreateOrderModel($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map);
+        $this->assertNotEmpty($create_order);
+
+    }
+
+    public function getWareHouseMap($orderHeaders)
+    {
+        $warehouses = $this->warehouseService->getByWmsOrders($orderHeaders);
+        return $this->dataHandlerService->dataHeader(['code'],$warehouses);
+    }
+    public function getOwnersMap($orderHeaders)
+    {
+        $owners = $this->ownerService->getByWmsOrders($orderHeaders);
+        return $this->dataHandlerService->dataHeader(['code'],$owners);
+    }
+    public function getLogisticMap($orderHeaders)
+    {
+        $logistics = $this->logisticService->getByWmsOrders($orderHeaders);
+        return $this->dataHandlerService->dataHeader(['code'],$logistics);
+    }
+    public function getShopMap($orderHeaders)
+    {
+        $shops = $this->shopService->getByWmsOrders($orderHeaders);
+        return $this->dataHandlerService->dataHeader(['code'],$shops);
+    }
+
+}

+ 71 - 0
tests/Services/OrderService/GetOrderByLogisticNumberTest/GetOrderByLogisticNumberTest.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace Tests\Services\OrderService\GetOrderByLogisticNumberTest;
+
+use App\Logistic;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderPackage;
+use App\Owner;
+use App\Services\OrderService;
+use App\Shop;
+use App\Warehouse;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetOrderByLogisticNumberTest extends TestCase
+{
+    /** @var OrderService $service */
+    public $service;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderService');
+    }
+
+    public function testGetOrderByLogisticNumber()
+    {
+        $order_package = OrderPackage::query()->orderByDesc('id')->first();
+        $logistic_number = $order_package->logistic_number;
+//        var_dump($logistic_number);
+        $orderHeader = OracleDOCOrderHeader::query()->whereHas('actAllocationDetails',function($query)use($order_package){
+            $query->where('PickToTraceID',$order_package->logistic_number);
+        })->first();
+//        var_dump($orderHeader?$orderHeader->orderno:'');
+
+        if(!$orderHeader){
+            $orderHeader = OracleDOCOrderHeader::query()->with('actAllocationDetails')->orderBy('AddTime')->first();
+//            var_dump($orderHeader?$orderHeader->orderno:'查询为空');
+            $logistic_number = data_get($orderHeader,'actAllocationDetails.*.picktotraceid')[0];
+        }
+        $order = $this->service->getOrderByLogisticNumber($logistic_number);
+//        var_dump($order,$logistic_number,$orderHeader,$order_package);
+        $this->assertEquals((string)$orderHeader->addtime,(string)$order->created_at);
+        $this->assertEquals($orderHeader->orderno,$order->code);
+
+        $shop = Shop::query()->where('name',$orderHeader->issuepartyname)->first();
+        $this->assertEquals($shop->id,$order->shop_id);
+
+        $owner = Owner::query()->where('code',$orderHeader->customerid)->first();
+        $this->assertEquals($owner->id, $order->owner_id);
+        $this->assertEquals($orderHeader->soreference1,$order->client_code);
+
+        $logistic = Logistic::query()->where('code',$orderHeader->userdefine1)->first();
+        $this->assertEquals($logistic->id,$order->logistic_id);
+        $this->assertEquals($orderHeader->c_contact,$order->consignee_name);
+
+        $consignee_phone = empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2;
+        $this->assertEquals($consignee_phone,$order->consignee_phone);
+
+        $this->assertEquals($orderHeader->c_province,$order->province);
+        $this->assertEquals($orderHeader->c_city,$order->city);
+        $this->assertEquals($orderHeader->c_district,$order->district);
+        $this->assertEquals($orderHeader->c_address1,$order->address);
+        $this->assertEquals($orderHeader->oracleBASCode_codename_c,$order->wms_status);
+
+        $warehouse = Warehouse::query()->where('code',$orderHeader->warehouseid)->first();
+        $this->assertEquals($warehouse->id,$order->warehouse_id);
+        $this->assertEquals($orderHeader->edittime,$order->wms_edittime);
+    }
+}

+ 45 - 0
tests/Services/OrderService/GetParamByOrderHeaderTest/GetParamByOrderHeaderTest.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace Tests\Services\OrderService\GetParamByOrderHeaderTest;
+
+use App\OracleDOCOrderHeader;
+use App\Services\OrderIssueService;
+use App\Services\OrderService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetParamByOrderHeaderTest extends TestCase
+{
+    /** @var OrderService $service */
+    public $service;
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app(OrderService::class);
+    }
+
+    public function testGetParamByOrderHeader()
+    {
+        $orderHeader = OracleDOCOrderHeader::query()
+            ->with('actAllocationDetails')
+            ->orderByDesc('AddTime')->first();
+        $param = $this->service->getParamByOrderHeader($orderHeader);
+        $this->assertNotNull($param);
+        $this->assertNotEmpty($param['code']);
+        $this->assertNotEmpty($param['owner_id']);
+        $this->assertNotNull($param['logistic_id']);
+        $this->assertNotEmpty($param['consignee_name']);
+        $this->assertNotEmpty($param['consignee_phone']);
+        $this->assertNotEmpty($param['province']);
+        $this->assertNotEmpty($param['city']);
+        $this->assertNotEmpty($param['district']);
+        $this->assertNotEmpty($param['address']);
+        $this->assertNotEmpty($param['client_code']);
+        $this->assertNotEmpty($param['wms_edittime']);
+        $this->assertNotEmpty($param['wms_status']);
+        $this->assertNotEmpty($param['updated_at']);
+        $this->assertNotEmpty($param['created_at']);
+        $this->assertNotEmpty($param['warehouse_id']);
+    }
+}

+ 106 - 0
tests/Services/OrderService/GetUpdateOrderModelByWMSOrderHeadersTest/GetUpdateModelByWmsOrderHeadersTest.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace Tests\Services\OrderService\GetUpdateOrderModelByWMSOrderHeadersTest;
+
+use App\Logistic;
+use App\Owner;
+use App\Services\LogisticService;
+use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderService;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use App\Services\WarehouseService;
+use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Str;
+use Tests\TestCase;
+
+class GetUpdateModelByWmsOrderHeadersTest extends TestCase
+{
+    /**
+     * @var OrderService $service
+     * @var OracleDOCOrderHeaderService $orderHeaderService
+     */
+    public $service;
+    public $orderHeaderService;
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderService');
+        $this->orderHeaderService = app('OracleDocOrderHeaderService');
+    }
+    public function testExample()
+    {
+        $carbon =Carbon::now()->subHours(10);
+        $date = '2020-09-18 18:13:50';
+        $orderHeaders = $this->orderHeaderService->getWMSOrderOnStartDate($carbon);
+        /**
+         * @var OwnerService $ownerService
+         * @var LogisticService $logisticService
+         * @var ShopService $shopService
+         * @var WarehouseService $warehouseService
+         */
+        $ownerService = app("OwnerService");
+        $logisticService = app("LogisticService");
+        $shopService = app('ShopService');
+        $warehouseService = app('WarehouseService');
+
+        $owners = $ownerService->getByWmsOrders($orderHeaders);
+        $logistics = $logisticService->getByWmsOrders($orderHeaders);
+        $shops = $shopService->getByWmsOrders($orderHeaders);
+        $warehouses = $warehouseService->getByWmsOrders($orderHeaders);
+
+        $orders = $this->service->getByWmsOrders($orderHeaders);
+        $orders->each(function($item){
+            $item->warehouse_id = rand(1,3);
+            $item->owner_id = rand(1,50);
+            $item->shop_id = rand(1,50);
+            $item->logistic_id = rand(1,50);
+            $item->consignee_name = Str::random(50);
+            $item->consignee_phone = Str::random(50);
+            $item->province = Str::random(50);
+            $item->city = Str::random(50);
+            $item->district = Str::random(50);
+            $item->address = Str::random(50);
+            $item->client_code = Str::random(52);
+            $item->wms_edittime = Carbon::now();
+            $item->wms_status = Str::random(10);
+            $item->updated_at = Carbon::now();
+            $item->created_at = Carbon::now();
+        });
+        $update_orders = $this->service->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+
+        foreach ($orderHeaders as $orderHeader) {
+            $order = $update_orders->where('code',$orderHeader->orderno)->first();
+            $this->assertNotNull($order);
+
+            $warehouse = Warehouse::query()->where('code',$orderHeader->warehouseid)->first();
+            if($orderHeader->warehouseid ?? false)
+                $this->assertEquals($warehouse->id ?? '',$order->warehouse_id ?? '');
+
+            $owner = Owner::query()->where('code',$orderHeader->customerid)->first();
+            if($orderHeader->customerid ?? false)
+                $this->assertEquals($order->owner_id ?? '',$owner->id??'');
+
+            $logistic = Logistic::query()->where('code',$orderHeader->userdefine1??'')->first();
+            if($orderHeader->userdefine1 ?? false)
+                $this->assertEquals($logistic->id ?? '',$logistic->id ?? '');
+            $shop = Shop::query()->where('name',$orderHeader->issuepartyname)->where('owner_id',$owner->id)->first();
+            if($orderHeader->issuepartyname ?? false)
+                $this->assertEquals($shop->name,$orderHeader->issuepartyname);
+            $this->assertEquals($order->consignee_name ,$orderHeader->c_contact);
+            $this->assertEquals($order->consignee_phone ,empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2);
+            $this->assertEquals($order->province ,$orderHeader->c_province);
+            $this->assertEquals($order->city ,$orderHeader->c_city);
+            $this->assertEquals($order->district ,$orderHeader->c_district);
+            $this->assertEquals($order->client_code ,$orderHeader->soreference1);
+            $this->assertEquals($order->wms_edittime ,(string)$orderHeader->edittime);
+            $this->assertEquals($order->wms_status ,$orderHeader->oracleBASCode_codename_c);
+            $this->assertEquals((string)$order->created_at ,(string)$orderHeader->addtime);
+        }
+    }
+}

+ 4 - 0
tests/sortingFluxNewBatch.http

@@ -0,0 +1,4 @@
+POST https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newBatch
+Content-Type: application/json
+
+{"request":[{"waveno":"W201110000202","taskprocess":"40","order_list":[{"docno":"SO201110001862","customerid":"LINGFEI","docstatus":"40","barcode_list":[{"ptltaskid":"1325481","alternate_sku1":"9787506031974,,","sku":"9218607916476921790","descr_c":"\u5c0f\u8a00\u9ec4\u5e1d\u5185\u7ecf\u4e0e\u751f\u547d\u79d1\u5b66","fmqty_each":"1"}],"reservedfield01":"3"},{"docno":"SO201110002395","customerid":"LINGFEI","docstatus":"40","barcode_list":[{"ptltaskid":"1325480","alternate_sku1":"9789869084703,,","sku":"2717383766596407841","descr_c":"\u9e23\u54cd\u96ea\u677e1\uff1a\u963f\u7eb3\u4e1d\u5854\u590f(\u53f0\u7248T1\uff09","fmqty_each":"1"}],"reservedfield01":"2"},{"docno":"SO201110002637","customerid":"LINGFEI","docstatus":"40","barcode_list":[{"ptltaskid":"1325478","alternate_sku1":"9787501980529-1,,","sku":"640375800304320414","descr_c":"\u751f\u547d\u559c\u60a6\u7684\u7948\u7977","fmqty_each":"1"},{"ptltaskid":"1325479","alternate_sku1":"LF172701,,","sku":"6500297636247276","descr_c":"\u80fd\u91cf\u6717\u8bfb","fmqty_each":"1"}],"reservedfield01":"1"}],"edittime":"2020-11-10 17:02:41"}]}

+ 4 - 0
tests/sortingHaochuangProcess.http

@@ -0,0 +1,4 @@
+POST http://bswas/api/thirdPart/haochuang/sorting/process
+Content-Type: application/json
+
+{"batch_id":"W201023000096k","station_id":"ffffffff-c7f2-adf0-c7f2-adf000000000","token":"bf803b6eeffcfc61396f1accb8487e27"}