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

Merge branch 'master' into Haozi

haozi 5 лет назад
Родитель
Сommit
fa95b8081d
93 измененных файлов с 3274 добавлено и 543 удалено
  1. 2 2
      .gitignore
  2. 43 4
      app/Console/Commands/SyncBatchTask.php
  3. 46 0
      app/Console/Commands/SyncOrderCountingRecordTask.php
  4. 18 10
      app/Console/Kernel.php
  5. 35 0
      app/Events/BroadcastToStation.php
  6. 53 12
      app/Http/Controllers/ControlPanelController.php
  7. 1 1
      app/Http/Controllers/InventoryAccountController.php
  8. 1 1
      app/Http/Controllers/InventoryCompareController.php
  9. 1 1
      app/Http/Controllers/InventoryController.php
  10. 2 2
      app/Http/Controllers/OrderCommodityAssignController.php
  11. 2 1
      app/Http/Controllers/OrderIssueController.php
  12. 2 10
      app/Http/Controllers/OrderTrackingController.php
  13. 1 1
      app/Http/Controllers/PackageController.php
  14. 1 1
      app/Http/Controllers/ProcessController.php
  15. 2 1
      app/Http/Controllers/ProvincesController.php
  16. 1 1
      app/Http/Controllers/RejectedController.php
  17. 6 1
      app/Http/Controllers/StationController.php
  18. 116 65
      app/Http/Controllers/TestController.php
  19. 2 2
      app/Http/Controllers/WaybillController.php
  20. 5 2
      app/Http/Controllers/api/thirdPart/flux/SortingController.php
  21. 137 12
      app/Http/Controllers/api/thirdPart/haiq/StorageController.php
  22. 9 15
      app/Imports/UpdatePickZone.php
  23. 45 0
      app/Jobs/WaybillCreateInstantBill.php
  24. 2 0
      app/Order.php
  25. 2 0
      app/OrderCommodityAssign.php
  26. 2 1
      app/OrderCountingRecord.php
  27. 6 0
      app/Services/BatchService.php
  28. 19 3
      app/Services/CheckActiveMenuService.php
  29. 1 1
      app/Services/InventoryAccountService.php
  30. 1 1
      app/Services/InventoryCompareService.php
  31. 12 20
      app/Services/LaborReportsCountingRecordService.php
  32. 1 1
      app/Services/LogisticService.php
  33. 439 0
      app/Services/NewOrderCountingRecordService.php
  34. 31 29
      app/Services/OracleDOCOrderHeaderService.php
  35. 34 6
      app/Services/OrderCountingRecordService.php
  36. 65 15
      app/Services/OrderService.php
  37. 12 4
      app/Services/OrderTrackingService.php
  38. 4 2
      app/Services/OwnerService.php
  39. 1 1
      app/Services/RealtimePendingOrdersService.php
  40. 19 5
      app/Services/StationService.php
  41. 1 2
      app/Services/StoreService.php
  42. 1 1
      app/Services/common/ExportService.php
  43. 18 1
      app/StationTask.php
  44. 6 1
      app/StationTaskBatch.php
  45. 15 0
      app/StationTaskChildren.php
  46. 10 1
      app/StationTaskCommodity.php
  47. 5 0
      app/StationTaskMaterialBox.php
  48. 7 0
      app/StationTypeBinMonitor.php
  49. 2 2
      composer.json
  50. 401 112
      composer.lock
  51. 1 2
      config/api.php
  52. 0 2
      config/app.php
  53. 13 0
      database/factories/BarcodeFactory.php
  54. 10 1
      database/factories/BatchFactory.php
  55. 1 1
      database/factories/MaterialBoxFactory.php
  56. 1 0
      database/factories/OrcaleDOCOrderHeaderFactory.php
  57. 24 0
      database/factories/OrderCountingRecordFactory.php
  58. 16 0
      database/factories/StationTaskBatchFactory.php
  59. 14 0
      database/factories/StationTaskChildrenFactory.php
  60. 19 0
      database/factories/StationTaskCommodityFactory.php
  61. 2 1
      database/factories/StationTaskFactory.php
  62. 4 1
      database/factories/StationTypeBinMonitorFactory.php
  63. 3 3
      database/migrations/2020_12_02_150054_create_order_commodity_assigns_table.php
  64. 36 0
      database/migrations/2020_12_07_114859_add_order_counting_records_year_month_week.php
  65. 54 0
      database/migrations/2020_12_12_093011_change_authorities_order_assign.php
  66. 6 1
      package-lock.json
  67. 1 0
      package.json
  68. BIN
      public/images/QRCodeIMG/3.png
  69. 0 1
      public/images/QRCodeIMG/readme.txt
  70. BIN
      public/images/QRCodeIMG/undefined.png
  71. 1 1
      resources/js/app.js
  72. 5 0
      resources/js/queryForm/export.js
  73. 15 0
      resources/js/utilities/barcode.js
  74. 18 0
      resources/js/utilities/tempTip.js
  75. 203 41
      resources/views/control/panel.blade.php
  76. 10 5
      resources/views/maintenance/priceModel/express/index.blade.php
  77. 1 1
      resources/views/order/index/_importModal.blade.php
  78. 31 4
      resources/views/order/index/delivering.blade.php
  79. 2 2
      resources/views/order/index/index.blade.php
  80. 2 2
      resources/views/order/index/menu.blade.php
  81. 6 6
      resources/views/order/tracking/index.blade.php
  82. 29 0
      resources/views/rejected/search/general.blade.php
  83. 49 0
      resources/views/station/monitor/_svg.blade.php
  84. 133 67
      resources/views/station/monitor/show.blade.php
  85. 6 1
      routes/api/thirdPart/haiq.php
  86. 47 0
      tests/Services/BatchService/TestGetBatchByCodes.php
  87. 189 0
      tests/Services/NewOrderCountingRecordService/GetOrderCountingRecordsTest.php
  88. 337 0
      tests/Services/NewOrderCountingRecordService/NewOrderCountingRecordServiceTest.php
  89. 75 0
      tests/Services/NewOrderCountingRecordService/OrderCountingRecordsTest.php
  90. 126 0
      tests/Services/NewOrderCountingRecordService/TransfersToConditionsTest.php
  91. 129 45
      tests/Services/OrderCountingRecordService/OrderCountingRecordServiceGetTest.php
  92. 6 1
      tests/webApi/thirdPart/haiq/storage.http
  93. 1 0
      webpack.mix.js

+ 2 - 2
.gitignore

@@ -4,8 +4,8 @@
 /public/js
 /public/css
 /public/images
-/public/images/QRCodeIMG/*
-/resources/images/QRCodeIMG/*
+/public/images/QRCodeIMG/*.png
+/resources/images/QRCodeIMG/*.png
 /public/mix-manifest.json
 /public/js/app.js
 /public/css/app.csscd

+ 43 - 4
app/Console/Commands/SyncBatchTask.php

@@ -2,6 +2,8 @@
 
 namespace App\Console\Commands;
 
+use App\Order;
+use App\OrderBin;
 use App\Services\BatchService;
 use App\Services\CacheService;
 use App\Services\common\BatchUpdateService;
@@ -99,14 +101,51 @@ class SyncBatchTask extends Command
             $valueStore = ValueStore::query()->where("name","wave_detail_last_sync_date")->first();
             return $valueStore->value ?? Carbon::now()->subSeconds(65)->toDateTimeString();
         });
-        $sql = "SELECT WM_CONCAT(ORDERNO) orderno,WAVENO FROM DOC_WAVE_DETAILS WHERE EDITTIME > TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')  GROUP BY WAVENO";
+        $sql = "SELECT ORDERNO,WAVENO,SEQNO FROM DOC_WAVE_DETAILS WHERE EDITTIME > TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')";
         $details = DB::connection("oracle")->select(DB::raw($sql),[$date]);
         if (count($details) < 1)return;
         $map = [];
         $nos = [];
+        $orderCodes = [];
+        $seqnos = [];
         foreach ($details as $detail){
-            $map[$detail->waveno] = explode(",",$detail->orderno);
-            $nos[] = $detail->waveno;
+            if (isset($map[$detail->waveno]))$map[$detail->waveno][] = $detail->orderno;
+            else {
+                $map[$detail->waveno] = [$detail->orderno];
+                $nos[] = $detail->waveno;
+            }
+            $orderCodes[] = $detail->orderno;
+            $seqnos[$detail->orderno] = $detail->seqno;
+        }
+        $orders = Order::query()->select("id","code")->whereIn("code",$orderCodes)->get();
+        if (count($orderCodes) != count($orders)){
+            $orderIds = [];
+            $orderMap = [];
+            foreach ($orders as $order){
+                $orderIds[] = $order->id;
+                $orderMap[$order->id] = $seqnos[$order->code];
+            }
+            $updateBin = [["id","number"]];
+            $insertBin = [];
+            $orderBins = OrderBin::query()->select("id","order_id","number")->whereIn("order_id",$orderIds)->get();
+            foreach ($orderBins as $orderBin){
+                if ($orderBin->number != $orderMap[$orderBin->order_id])$updateBin[]=["id"=>$orderBin->id,"number"=>$orderMap[$orderBin->order_id]];
+                unset($orderMap[$orderBin->order_id]);
+            }
+            foreach ($orderMap as $orderId=>$binNumber){
+                $insertBin[]=[
+                    "order_id"=>$orderId,
+                    "number"=>$binNumber
+                ];
+            }
+            if (count($updateBin)>1){
+                app(BatchUpdateService::class)->batchUpdate("order_bins",$updateBin);
+                LogService::log(__METHOD__,"波次同步-更新订单格口号",json_encode($updateBin));
+            }
+            if ($insertBin){
+                OrderBin::query()->insert($insertBin);
+                LogService::log(__METHOD__,"波次同步-录入订单格口号",json_encode($insertBin));
+            }
         }
         $batches = $this->batchService->get(["code"=>$nos]);
         foreach ($batches as $batch){
@@ -141,7 +180,7 @@ class SyncBatchTask extends Command
 //        $this->batchService->assignTasks($batches);
 
 
-        ValueStore::query()->where("name","wave_last_sync_date")->update(["value"=>Carbon::now()->subSeconds(1)->toDateTimeString()]);
+        ValueStore::query()->where("name","wave_detail_last_sync_date")->update(["value"=>Carbon::now()->subSeconds(1)->toDateTimeString()]);
     }
 
     /**

+ 46 - 0
app/Console/Commands/SyncOrderCountingRecordTask.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Services\OrderCountingRecordService;
+use Carbon\Carbon;
+use Illuminate\Console\Command;
+
+class SyncOrderCountingRecordTask extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'syncOrderCountingRecordTask';
+
+    /**
+     * 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.
+     *
+     */
+    public function handle()
+    {
+        $orderCountingRecordService = new OrderCountingRecordService;
+        $orderCountingRecordService->orderCountingRecords(Carbon::now()->toDateString(), Carbon::now()->toDateString(), null, '日');
+        $orderCountingRecordService->orderCountingRecords(Carbon::now()->toDateString(), Carbon::now()->toDateString(), null, '周');
+        $orderCountingRecordService->orderCountingRecords(Carbon::now()->toDateString(), Carbon::now()->toDateString(), null, '月');
+    }
+}

+ 18 - 10
app/Console/Kernel.php

@@ -2,8 +2,16 @@
 
 namespace App\Console;
 
+use App\Console\Commands\FluxOrderFix;
+use App\Console\Commands\InventoryDailyLoggingOwner;
+use App\Console\Commands\LogExpireDelete;
+use App\Console\Commands\MakeServiceCommand;
 use App\Console\Commands\SyncBatchTask;
+use App\Console\Commands\SyncLogCacheTask;
+use App\Console\Commands\SyncUserVisitMenuLogsCacheTask;
 use App\Console\Commands\SyncWMSOrderTask;
+use App\Console\Commands\TestTemp;
+use App\Console\Commands\WASSyncWMSOrderInformation;
 use Illuminate\Console\Scheduling\Schedule;
 use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
 
@@ -15,14 +23,14 @@ class Kernel extends ConsoleKernel
      * @var array
      */
     protected $commands = [
-        \App\Console\Commands\LogExpireDelete::class,
-        \App\Console\Commands\MakeServiceCommand::class,
-        \App\Console\Commands\FluxOrderFix::class,
-        \App\Console\Commands\InventoryDailyLoggingOwner::class,
-        \App\Console\Commands\WASSyncWMSOrderInformation::class,
-        \App\Console\Commands\SyncLogCacheTask::class,
-        \App\Console\Commands\SyncUserVisitMenuLogsCacheTask::class,
-        \App\Console\Commands\TestTemp::class,
+        LogExpireDelete::class,
+        MakeServiceCommand::class,
+        FluxOrderFix::class,
+        InventoryDailyLoggingOwner::class,
+        WASSyncWMSOrderInformation::class,
+        SyncLogCacheTask::class,
+        SyncUserVisitMenuLogsCacheTask::class,
+        TestTemp::class,
         SyncBatchTask::class,
         SyncWMSOrderTask::class,
     ];
@@ -43,8 +51,8 @@ class Kernel extends ConsoleKernel
         $schedule->command('createOwnerReport')->monthlyOn(1);
         $schedule->command('createOwnerBillReport')->monthlyOn(1);
         $schedule->command('createOwnerAreaReport')->monthlyOn(25);
-        $schedule->command('sync:batch')->everyMinute();
-        $schedule->command('sync:order')->everyMinute();
+//        $schedule->command('sync:batch')->everyMinute();
+//        $schedule->command('sync:order')->everyMinute();
     }
 
     /**

+ 35 - 0
app/Events/BroadcastToStation.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Events;
+
+use Illuminate\Broadcasting\Channel;
+use Illuminate\Broadcasting\PresenceChannel;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+
+class BroadcastToStation implements ShouldBroadcast
+{
+    public $json;
+    private $id;
+    /**
+     * Create a new event instance.
+     *
+     * @param int $id
+     * @param string $json
+     * @return void
+     */
+    public function __construct(int $id, string $json)
+    {
+        $this->id = $id;
+        $this->json = $json;
+    }
+
+    /**
+     * Get the channels the event should broadcast on.
+     *
+     * @return Channel|array
+     */
+    public function broadcastOn()
+    {
+        return new PresenceChannel('station-'.$this->id);
+    }
+}

+ 53 - 12
app/Http/Controllers/ControlPanelController.php

@@ -4,11 +4,15 @@ namespace App\Http\Controllers;
 
 use App\Services\CheckActiveMenuService;
 use App\Services\LaborReportsCountingRecordService;
+use App\Services\NewOrderCountingRecordService;
 use App\Services\OrderCountingRecordService;
 use App\Services\RealtimePendingOrdersService;
+use App\Services\UserService;
+use App\User;
 use Carbon\Carbon;
 use DebugBar\DataFormatter\DataFormatter;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
 
 class ControlPanelController extends Controller
 {
@@ -24,48 +28,66 @@ class ControlPanelController extends Controller
 
     public function index()
     {
+        /**
+         * @var $orderCountingRecordService  NewOrderCountingRecordService
+         * @var $laborReportsCountingRecordService LaborReportsCountingRecordService
+         */
         $checkActiveMenuService = app(CheckActiveMenuService::class);
         $menus = $checkActiveMenuService->activeMenus();
         $realtimePendingOrdersService = app(RealtimePendingOrdersService::class);
         $warehousesOrders = $realtimePendingOrdersService->warehousesOrders();
-        $orderCountingRecordService = app(OrderCountingRecordService::class);
+        $orderCountingRecordService = app(NewOrderCountingRecordService::class);
         //默认查询一个月的数据
-        $start = (new Carbon())->subMonth()->addDay()->toDateString();
+        $start = (new Carbon())->subMonth()->toDateString();
         $end = (new Carbon())->toDateString();
-        $orderCountingRecords = $orderCountingRecordService->orderCountingRecords($start, $end);
-        $logisticsCountingRecords = $orderCountingRecordService->logisticsCountingRecords($start, $end);
-        $warehouseCountingRecords = $orderCountingRecordService->warehouseCountingRecords($start, $end);
+        $ownerIds = $this->getCountingOwnerIds(null);
+        $unit = '日';
+        $orderCountingRecords = $orderCountingRecordService->orderCountingRecords($start, $end, $unit, $ownerIds);
+        $logisticsCountingRecords = $orderCountingRecordService->logisticsCountingRecords($start, $end, $ownerIds);
+        $warehouseCountingRecords = $orderCountingRecordService->warehouseCountingRecords($start, $end, $ownerIds);
 
         $laborReportsCountingRecordService = app(LaborReportsCountingRecordService::class);
-        $laborReportsCountingRecords = $laborReportsCountingRecordService->get($start, $end, '日');
+        $laborReportsCountingRecords = $laborReportsCountingRecordService->get($start, $end, $unit);
         $laborReportsUserGroupsCount = $laborReportsCountingRecordService->userGroupsCount($start, $end);
         return view('control.panel', compact('menus', 'warehousesOrders', 'orderCountingRecords', 'logisticsCountingRecords', 'warehouseCountingRecords', 'laborReportsCountingRecords', 'laborReportsUserGroupsCount'));
     }
 
     public function orderCountingRecordsApi(Request $request)
     {
-        $orderCountingRecordService = app(OrderCountingRecordService::class);
+        /**
+         * @var $orderCountingRecordService  NewOrderCountingRecordService
+         */
+        $orderCountingRecordService = app(NewOrderCountingRecordService::class);
         $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
         $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
-        $orderCountingRecords = $orderCountingRecordService->orderCountingRecords($start, $end, null, $request->unit, null);
+        $ownerIds = $this->getCountingOwnerIds(null);
+        $orderCountingRecords = $orderCountingRecordService->orderCountingRecords($start, $end, $request->unit, $ownerIds);
         return compact('orderCountingRecords');
     }
 
     public function logisticsCountingRecordsApi(Request $request)
     {
-        $orderCountingRecordService = app(OrderCountingRecordService::class);
+        /**
+         * @var $orderCountingRecordService  NewOrderCountingRecordService
+         */
+        $orderCountingRecordService = app(NewOrderCountingRecordService::class);
         $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
         $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
-        $logisticsCountingRecords = $orderCountingRecordService->logisticsCountingRecords($start, $end);
+        $ownerIds = $this->getCountingOwnerIds(null);
+        $logisticsCountingRecords = $orderCountingRecordService->logisticsCountingRecords($start, $end, $ownerIds);
         return compact('logisticsCountingRecords');
     }
 
     public function warehouseCountingRecordsApi(Request $request)
     {
-        $orderCountingRecordService = app(OrderCountingRecordService::class);
+        /**
+         * @var $orderCountingRecordService  NewOrderCountingRecordService
+         */
+        $orderCountingRecordService = app(NewOrderCountingRecordService::class);
         $start = Carbon::parse($request->start)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->start;
         $end = Carbon::parse($request->end)->gt(Carbon::now()) ? Carbon::now()->toDateString() : $request->end;
-        $warehouseCountingRecords = $orderCountingRecordService->warehouseCountingRecords($start, $end);
+        $ownerIds = $this->getCountingOwnerIds(null);
+        $warehouseCountingRecords = $orderCountingRecordService->warehouseCountingRecords($start, $end, $ownerIds);
         return compact('warehouseCountingRecords');
     }
 
@@ -87,4 +109,23 @@ class ControlPanelController extends Controller
         $laborReportsUserGroupsCount = $laborReportsCountingRecordService->userGroupsCount($start, $end);
         return compact('laborReportsUserGroupsCount');
     }
+
+
+    public function getCountingOwnerIds($ownerIds)
+    {
+
+        $user = auth()->user();
+        /** @var UserService $userService */
+        $userService = app('UserService');
+        $permittingOwnerIds = $userService->getPermittingOwnerIds($user);
+        if (!$ownerIds) {
+            return $permittingOwnerIds;
+        }
+        return Cache::remember(
+            'PermittingOwnerIds' . '_' . auth()->user()->id . '_' . implode('_', $ownerIds),
+            600, function () use ($ownerIds, $permittingOwnerIds) {
+            /** @var User $user */
+            return array_intersect($ownerIds, $permittingOwnerIds);
+        });
+    }
 }

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

@@ -85,7 +85,7 @@ class InventoryAccountController extends Controller
         $paginateParams = $request->input();
         $queryParam = $request->all();
         $inventoryAccounts = app('inventoryAccountService')->paginate($queryParam);
-        $owners = $ownerService->getSelection();
+        $owners = $ownerService->getIntersectPermitting();
         return view('inventory.stockInventory.mission', compact('owners', 'inventoryAccounts', 'paginateParams'));
     }
 

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

@@ -92,7 +92,7 @@ class InventoryCompareController extends Controller
     }
     function inventoryCompare(Request $request,OwnerService $ownerService){
         if (!Gate::allows('库存管理-库存-库存对比')){return redirect(url('/')); }
-        $owners = $ownerService->getSelection();
+        $owners = $ownerService->getIntersectPermitting();
         $inventoryCompares=app('InventoryCompareService')->getInventoryCompare($request->all());
         $param = $request->input();
         return view('inventory.statement.inventoryCompare',compact('owners','inventoryCompares','param'));

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

@@ -90,7 +90,7 @@ class InventoryController extends Controller
         if (!Gate::allows('库存管理-库存体积')){return redirect(url('/')); }
         /** @var InventoryDailyLogService*/
         $inventoryDailyLogs = app('InventoryDailyLogService')->paginate($request->input());
-        $owners = $ownerService->getSelection();
+        $owners = $ownerService->getIntersectPermitting();
         $param = $request->input();
         return view('inventory.statement.dailyLog',compact('inventoryDailyLogs','owners','param'));
     }

+ 2 - 2
app/Http/Controllers/OrderCommodityAssignController.php

@@ -12,14 +12,14 @@ class OrderCommodityAssignController extends Controller
 {
     public function index()
     {
-        if(!Gate::allows('商品配置-查询')){ return redirect(url('denied'));  }
+        if(!Gate::allows('订单管理-指定分配-查询')){ return redirect(url('denied'));  }
         $assigns = app("OrderCommodityAssignService")->paginate();
         return view("order.index.index",compact("assigns"));
     }
 
     public function import(Request $request)
     {
-        if(!Gate::allows('商品配置-编辑')){ return ["success"=>false,"data"=>"无权操作!"];  }
+        if(!Gate::allows('订单管理-指定分配-编辑')){ return ["success"=>false,"data"=>"无权操作!"];  }
         $fileSuffix=$request->file('file')->getClientOriginalExtension();
         if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
             return ['success'=>false,'data'=>'不支持该文件类型'];

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

@@ -642,7 +642,8 @@ class OrderIssueController extends Controller
                     $order_sku_amount.= ($commodities->amount ?? '').",\r\n";
                 });
             });
-            $rejected_logistic_number = $order_issue->rejectedBill->logistic_number_return;
+            $rejected_logistic_number = $order_issue->rejectedBill->logistic_number_return ?? '';
+
             $rejected_Bill_remark = '';
             $rejected_is_checked = '';
             $rejected_name = ''; $rejected_barcode = '';$rejected_amount = '';

+ 2 - 10
app/Http/Controllers/OrderTrackingController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Logistic;
 use App\Order;
 use App\OrderTracking;
+use App\Services\common\ExportService;
 use App\Services\LogService;
 use App\Services\OrderTrackingService;
 use App\Services\OwnerService;
@@ -222,16 +223,7 @@ class OrderTrackingController extends Controller
                 $orderTracking->remark,
             ];
         }
-        $post=Http::post(config('go.export.url'),['type'=>'base','data'=>json_encode(['row'=>$row,'list'=>$list,'mergeColumn'=>$mergeColumn,'mergeRow'=>$mergeRow],JSON_UNESCAPED_UNICODE),
-            'createFormat'=>'merge']);
-
-        if ($post->status() == 500){
-            throw new Exception($post->header("Msg"));
-        }
-        return response($post,200, [
-            "Content-type"=>"application/octet-stream",
-            "Content-Disposition"=>"attachment; filename=订单跟踪件-".date('ymdHis').'.xlsx',
-        ]);
+        return app(ExportService::class)->json($row,$list,'订单跟踪件','merge',$mergeColumn,$mergeRow);
     }
 
     public function destroyImg(Request $request)

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

@@ -26,7 +26,7 @@ class PackageController extends Controller
         /** @var PackageService $application */
         $application = app('PackageService');
         $packages = $application->paginate($request);
-        return view('weight.package.index',['packages'=>$packages,'owners'=>$ownerService->getSelection(),'paginateParams'=>$paginateParams]);
+        return view('weight.package.index',['packages'=>$packages,'owners'=>$ownerService->getIntersectPermitting(),'paginateParams'=>$paginateParams]);
     }
 
     public function create()

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

@@ -43,7 +43,7 @@ class ProcessController extends Controller
         if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/'));  }
         $paginateParams = $request->input();
         $processes = app('ProcessService')->paginate($paginateParams);
-        $owners=$ownerService->getSelection();
+        $owners=$ownerService->getIntersectPermitting();
         return view('process.index',['processes'=>$processes,'owners'=>$owners,'paginateParams'=>$paginateParams]);
     }
 

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

@@ -79,6 +79,7 @@ class ProvincesController extends Controller
     }
 
     public function get(){
-        return Province::query()->select("id","name")->get();
+        $provinces = Province::query()->select("id","name")->get();
+        return ["success"=>true,"data"=>$provinces];
     }
 }

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

@@ -53,7 +53,7 @@ class RejectedController extends Controller
         $application = app('RejectedService');
         $rejectedBills= $application->paginate($request);
 //        $issueIds = $application->返回有问题件的ID($request);
-        $owners = $ownerService->getSelection();
+        $owners = $ownerService->getIntersectPermitting();
         $qualityLabels = $qualityLabelService->get();
         $logistics=$logisticService->getSelection();
         return view('rejected.search.general',compact('rejectedBills','owners','logistics',

+ 6 - 1
app/Http/Controllers/StationController.php

@@ -3,6 +3,8 @@
 namespace App\Http\Controllers;
 
 use App\Station;
+use App\StationTypeBinMonitor;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 
 class StationController extends Controller
@@ -19,6 +21,7 @@ class StationController extends Controller
     public function monitorIndex()
     {
         $stations = Station::query()->with('type:name','parent:name')->whereHas('type',function($query){
+            /** @var Builder $query */
             $query->where('name','料箱监视器');
         })->paginate(100);
         return view('station.monitor.index',compact('stations'));
@@ -51,7 +54,9 @@ class StationController extends Controller
     }
     public function monitorShow(Station $station)
     {
-        return view('station.monitor.show',compact('station'));
+        $wall = StationTypeBinMonitor::query()->where("station_id",$station->id)->first();
+        if (!$wall)$wall = factory(StationTypeBinMonitor::class)->make(StationTypeBinMonitor::$default);
+        return view('station.monitor.show',compact('station',"wall"));
     }
 
     /**

+ 116 - 65
app/Http/Controllers/TestController.php

@@ -19,12 +19,14 @@ use App\OracleActAllocationDetails;
 use App\OracleDOCOrderHeader;
 use App\OracleDocOrderPackingSummary;
 use App\OracleDOCWaveDetails;
+use App\OracleDOCWaveHeader;
 use App\Order;
 use App\OrderBin;
 use App\OrderCommodity;
 use App\OrderIssue;
 use App\OrderPackage;
 use App\OrderPackageCommodities;
+use App\OrderTracking;
 use App\Owner;
 use App\Package;
 use App\Process;
@@ -59,11 +61,14 @@ use App\Warehouse;
 use App\Waybill;
 use App\WaybillPriceModel;
 use Carbon\Carbon;
+use Exception;
+use GuzzleHttp\Client;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Str;
 use Maatwebsite\Excel\Facades\Excel;
 use Ramsey\Collection\Collection;
@@ -105,9 +110,86 @@ class TestController extends Controller
             app(BatchUpdateService::class)->batchUpdate('inventory_accounts', $updateParams);
         }
     }
+    public function zui(){
 
-    public function mergeCarrier()
+        $d = ["ada","超管","hospital_1","测试","hospital_5"];
+        $a = [];
+        foreach ($d as $item){
+            $arr = explode("_",$item);
+            if (count($arr) === 2 && $arr[0] == 'hospital' && is_numeric($arr[1]))$a[] = $arr[1];
+        }
+        dd($a);
+    }
+    public function zzd()
     {
+        $post=Http::post("http://localhost:9722",["type"=>"base","format"=>[
+            "method"=>"warpText",
+            "mergeColumn"=>["column"],
+            "mergeRow"=>["row"=>"row"],
+            "datum"=>"datum",
+        ],"connection"=>[
+            "driver"=>"mysql",
+            "host"=>"host",
+            "port"=>"port",
+            "database"=>"databse",
+            "username"=>"username",
+            "password"=>"password",
+            "charset"=>"char",
+            "parsetime"=>"pars",
+            "sid"=>"",
+        ],"data"=>[
+            "row"=>["sql-row"],
+            "list"=>[["sql-list"]],
+            "sql"=>"sql",
+            "rule"=>["sql"=>"rule"],
+        ],"path"=>[
+            "log"=>"log",
+            "file"=>""
+        ]]);
+        $http = new Client();
+        $response = $http->get("http://localhost:9722", ["type"=>"base","format"=>[
+            "method"=>"warpText",
+            "mergeColumn"=>["column"],
+            "mergeRow"=>["row"=>"row"],
+            "datum"=>"datum",
+        ],"connection"=>[
+            "driver"=>"mysql",
+            "host"=>"host",
+            "port"=>"port",
+            "database"=>"databse",
+            "username"=>"username",
+            "password"=>"password",
+            "charset"=>"char",
+            "parsetime"=>"pars",
+            "sid"=>"",
+        ],"data"=>[
+            "row"=>["sql-row"],
+            "list"=>[["sql-list"]],
+            "sql"=>"sql",
+            "rule"=>["sql"=>"rule"],
+        ],"path"=>[
+            "log"=>"log",
+            "file"=>""
+        ]]);
+        if ($response->getStatusCode() == 500){
+            throw new \Exception($response->getHeader("Msg"));
+        }
+        return \response($response,200, [
+            "Content-type"=>"application/octet-stream",
+            "Content-Disposition"=>"attachment; filename=测试.xlsx",
+        ]);
+
+        if ($post->status() == 500){
+            throw new Exception($post->header("Msg"));
+        }
+        $test = "test";
+        return response($response->get,200, [
+            "Content-type"=>"application/octet-stream",
+            "Content-Disposition"=>"attachment; filename=".$test."-".date('ymdHis').'.xlsx',
+        ]);
+    }
+
+    public function mergeCarrier(){
         $carriers = Carrier::query()->get();
         $logistics = [];
         $map = [];
@@ -160,9 +242,8 @@ class TestController extends Controller
         dd($r->getMethods(), $r->getConstants());
     }
 
-    public function updateLaborRemark()
-    {
-        $laborReports = LaborReport::query()->with(['remarks' => function ($query) {
+    public function updateLaborRemark(){
+        $laborReports=LaborReport::query()->with(['remarks'=>function($query){
             return $query->whereNotNull('mark');
         }])->get();
         $updateParams = [[
@@ -182,9 +263,18 @@ class TestController extends Controller
             app(BatchUpdateService::class)->batchUpdate('labor_reports', $updateParams);
         }
     }
-
-    public function test2()
-    {
+    public function test2(){
+        $b = Logistic::query()->first();
+        $a = OrderPackage::query()->with("order")->first();
+        $a->bulk = 521;
+        $a->save();
+        if (!$a->order) $a->order = new Order();
+        dd($a);
+        if (!$a->order->logistic)$a->order->logistic = $b;
+        dd($a->order->logistic);
+        dd($a);
+        $a->save();
+        dd($a);
     }
 
     function packageFromLog(Request $request)
@@ -234,18 +324,6 @@ class TestController extends Controller
             $orderPackageService->createdByOrder($item);
         }
     }
-
-    function t2(Request $request)
-    { //x        $packagesBatch=Package::where('batch_number',$batch_number)->first();
-
-
-        $inventoryCompareService = new InventoryCompareService();
-        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
-        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
-        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
-        echo ($inventoryCompareService)->getCreatingMissionCode('安桥主品');
-    }
-
     function tlog(Request $request)
     {
         app('LogService')->log(__METHOD__, 'cczdelme' . __FUNCTION__, json_encode($request->all()), null);
@@ -257,7 +335,6 @@ class TestController extends Controller
         Cache::put('storedTest', $today);
         return "cacheing:'$today'<script>localStorage.setItem('storedTest','{$today}')</script>";
     }
-
     function getCache(Request $request)
     {
         $cache = Cache::get('storedTest');
@@ -288,13 +365,8 @@ class TestController extends Controller
             oci_bind_by_name($stmt, ':IN_UserID', $IN_UserID);
             oci_bind_by_name($stmt, ':OUT_Return_Code', $OUT_Return_Code);
             return oci_execute($stmt);
-
         }
-
-
     }
-
-
     function packageT(Request $request)
     {
         $package = Package::where('created_at', '<', '2020-07-08')->whereNotNull('logistic_number')->first();
@@ -790,7 +862,6 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
         Commodity::destroy($deleteCommodities);
     }
-
     /*1*/
     function socket(Request $request)
     {/**/
@@ -1204,6 +1275,8 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
             }, 'oracleBASCode' => function ($query) {
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             }])
+//            ->where('DOC_Order_Header.addTime','>=',$startDate)
+//            ->where('orderno','SO201112029795')
             ->where('DOC_Order_Header.addTime','>=',$carbon)
             ->get();
         /** @var OrderService $service */
@@ -1216,7 +1289,7 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         dump(Carbon::now());
         $tack = new SyncWMSOrderTask();
         $tack->handle();
-        dump(Carbon::now());
+        dump(11);
     }
 
     public function testSyncCommodity()
@@ -1231,44 +1304,30 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         dump('end'.(string)Carbon::now());
     }
 
+    //按日志恢复富勒发过的波次下发,不要删
     public function reNewBatches3()
     {
-        $batches = Batch::query()->where('id', '>', 324)->get('code');
-//        $batchCodes = $batches->map(function($batch){
-//            return $batch['code'];
-//        })->toArray();
-        $batchCodes = ['W201201000037',
-            'W201201000038',
-            'W201201000039',
-            'W201201000040',
-            'W201201000041',
-            'W201201000052',
-            'W201201000053',
-            'W201201000054',
-            'W201201000055',
-            'W201201000056',
-            'W201201000057',
-            'W201201000071',
-            'W201201000074',
-            'W201201000075',
-            'W201201000076',];
-        $requests = [];
+        $batches=Batch::query()->where('id','>',5338)->get('code');
+        $batchCodes = $batches->map(function($batch){
+            return $batch['code'];
+        })->toArray();
+        $requests=[];
 //        $logs=Log::query()->select('description')->where('CREATED_AT','>','2020-11-11')
 //            ->where('type',"issued_newBatch")
 //            ->get();
 //        dd($logs);
-        foreach ($batchCodes as $code) {
+        foreach($batchCodes as $code){
 //            $request=Cache::get('temp'.$code)['description'];
-            $request = Log::query()->select('description')->where('CREATED_AT', '>', '2020-12-01')
-                ->where('type', "issued_newBatch")
-                ->where('description', 'like', "%{$code}%")
+            $request=Log::query()->select('description')->where('CREATED_AT','>','2020-12-01')
+                ->where('type',"issued_newBatch")
+                ->where('description','like',"%{$code}%")
                 ->first();
-            if ($request) {
-                $response = Zttp::post('https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newBatch',
+            if($request){
+                $response=Zttp::post('https://wcs.baoshi56.com/api/thirdPart/flux/sorting/newBatch',
                     json_decode($request['description'])
                 );
-                app('LogService')->log(__METHOD__, __FUNCTION__, $response->body());
-                $requests[] = $response->body();
+                app('LogService')->log(__METHOD__,__FUNCTION__,$response->body());
+                $requests[]=$response->body();
             }
 //            Cache::put('temp'.$code,$request);
 //            $requests[]=$request;
@@ -1278,18 +1337,10 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
     public function syncOrderTracking()
     {
+        $startDate = \Illuminate\Support\Carbon::parse('2020-12-12 00:00:00')->toDateTimeString();
         /** @var OrderTrackingService $orderTrackingService */
         $orderTrackingService = app('OrderTrackingService');
-        /** @var OrderService $orderService */
-        $orderService = app(OrderService::class);
-        /*$owners = app(OrderTrackingOwnerService::class)->getTrackingOrderOwner();*/
-        /*$startDate = \Illuminate\Support\Carbon::parse('2020-10-28 00:00:00')->toDateTimeString();*/
-        $orderNos = ['SO201205001735', 'SO201204003891', 'SO201204003706', 'SO201204002877', 'SO201203003771'];
-        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode'])
-            ->whereIn('orderno', $orderNos)
-            ->get();
-        $orderService->updateByWmsOrders($orderHeaders);
-        $orderTrackingService->createByWmsOrderHeader($orderHeaders);
+        $orderTrackingService->trackingWmsOrder($startDate);
     }
 
     public function testSyncOrderTask(){

+ 2 - 2
app/Http/Controllers/WaybillController.php

@@ -56,7 +56,7 @@ class WaybillController extends Controller
         return view('waybill.index', [
             'waybills' => $waybills,
             'logistics' => $logisticService->getSelection(["id","name"],"物流"),
-            'owners' => $ownerService->getSelection(),
+            'owners' => $ownerService->getIntersectPermitting(),
             'paginateParams'=>$paginateParams,
             'uriType'=>$request->uriType??'']);
     }
@@ -68,7 +68,7 @@ class WaybillController extends Controller
         $type=$request->type ?? "";
         if ($type==='ZF')$type='直发车';
         if ($type==='ZX')$type='专线';
-        return view('waybill.create',['owners'=>$ownerService->getSelection(),'type'=>$type]);
+        return view('waybill.create',['owners'=>$ownerService->getIntersectPermitting(),'type'=>$type]);
     }
 
     public function store(Request $request)

+ 5 - 2
app/Http/Controllers/api/thirdPart/flux/SortingController.php

@@ -94,9 +94,12 @@ class SortingController extends Controller
                                 'amount' => $requestBarcode['fmqty_each']??0,
                                 'wms_ptltaskid' => $requestBarcode['ptltaskid'],
                             ]);
+                        }else{
+                            $orderCommodity['order_id']=$order['id'];
+                            $orderCommodity['commodity_id']=$commodity['id'];
+                            $orderCommodity['amount']=$requestBarcode['fmqty_each']??0;
+                            $orderCommodity['wms_ptltaskid']=$requestBarcode['ptltaskid']??0;
                         }
-                        if(!$orderCommodity['amount'])$orderCommodity['amount']=$requestBarcode['fmqty_each']??0;
-                        if(!$orderCommodity['wms_ptltaskid'])$orderCommodity['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'];

+ 137 - 12
app/Http/Controllers/api/thirdPart/haiq/StorageController.php

@@ -10,7 +10,7 @@ use Illuminate\Support\Facades\Http;
 
 class StorageController
 {
-    protected $request;
+    protected $post;
 
     /** @var ForeignHaiRoboticsService $service */
     private $service;
@@ -36,39 +36,164 @@ class StorageController
             "sequenceFlag" => -1,//是否需要有序 1:需要有序 0:不需要有序
             "bins" => [$bin],//可执行货箱任务
         ]];*/
-        $this->request = [[
+        $this->post = [[
             "taskMode"      => 2,
             "bins"=>[[
-                "taskCode"  =>"TEST-BS2011160004",
-                "binCode"   => "IDE0000034",
+                "taskCode"  =>"TEST-BS2011160007",
+                "binCode"   => "IDE0000001",
+//                "fromLocCode" => "BIN-IN1",
+                "toLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TEST-BS2011160008",
+                "binCode"   => "IDE0000001",
+//                "fromLocCode" => "BIN-IN1",
+                "toLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TEST-BS2011160009",
+                "binCode"   => "IDE0000001",
 //                "fromLocCode" => "BIN-IN1",
                 "toLocCode" => "BIN-OUT1",
             ]],
-            "groupCode"     => 4,
+            "groupCode"     => 21,
             "priority"      => 20,
             "sequenceFlag"  => -1,
         ]];
+        $this->post2 = [[
+            "taskMode"      => 2,
+            "bins"=>[[
+                "taskCode"  =>"TEST-BS2011160016",
+                "binCode"   => "IDE0000002",
+//                "fromLocCode" => "BIN-IN1",
+                "toLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TEST-BS2011160017",
+                "binCode"   => "IDE0000009",
+//                "fromLocCode" => "BIN-IN1",
+                "toLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TEST-BS2011160018",
+                "binCode"   => "IDE0000014",
+//                "fromLocCode" => "BIN-IN1",
+                "toLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TEST-BS2011160019",
+                "binCode"   => "IDE0000016",
+//                "fromLocCode" => "BIN-IN1",
+                "toLocCode" => "BIN-OUT1",
+            ]],
+            "groupCode"     => 'W12346',
+            "priority"      => 20,
+            "sequenceFlag"  => -1,
+        ]];
+        $this->backIn = [[
+            "taskMode"      => 1,
+            "bins"=>[[
+                "taskCode"  =>"TESTININ-BS2011160016",
+                "binCode"   => "IDE0000052",
+                "fromLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TESTIN-BS2011160017",
+                "binCode"   => "IDE0000004",
+                "fromLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TESTIN-BS2011160018",
+                "binCode"   => "IDE0000054",
+                "fromLocCode" => "BIN-OUT1",
+            ],[
+                "taskCode"  =>"TESTIN-BS2011160019",
+                "binCode"   => "IDE0005683",
+                "fromLocCode" => "BIN-OUT1",
+            ]],
+            "groupCode"     => 'W12346In',
+            "priority"      => 20,
+            "sequenceFlag"  => -1,
+        ]];
+        $this->move = [[
+            "taskMode"      => 3,
+            "bins"=>[[
+                "taskCode"  =>"TESTINM-BS2011160024",
+                "binCode"   => "IDE0000054",
+                "fromLocCode" => "",
+                "toLocCode" => "HAIB2-01-02",
+            ],[
+                "taskCode"  =>"TESTINM-BS2011160023",
+                "binCode"   => "IDE0000004",
+                "fromLocCode" => "",
+                "toLocCode" => "HAIB2-01-01",
+            ],[
+                "taskCode"  =>"TESTINM-BS2011160022",
+                "binCode"   => "IDE0005683",
+                "fromLocCode" => "",
+                "toLocCode" => "HAIB2-02-03",
+            ]],
+            "groupCode"     => 'WM12352',
+            "priority"      => 20,
+            "sequenceFlag"  => -1,
+        ]];
+        $this->lightOn = [
+            "areaCode"=> "1004",
+            "PTLAction"=> 1,
+            "PTLSettings"=> [
+                "color"=> 1,
+                "frequency"=> 1
+            ],
+            "displayInfo"=> [
+                "detail01"=> "detail01",
+                "detail02"=> "detail02",
+                "detail03"=> "detail03",
+                "qrCode"=> "qrCode",
+                "qty00"=> "11",
+                "qty01"=> 1,
+                "qty02"=> 2,
+                "title"=> "title",
+                "uomDesc01"=> "uo",
+                "uomDesc02"=> "uo"
+            ],
+            "locCode"=> "1004-BZ04-01-01"
+        ];
+        $this->lightOff = [
+            "locCode"=> "12G03-21",
+        ];
     }
 
-    public function relocate(Request $request){
-        $response = Http::post(config('api.haiq.storage.moveBin'),$this->request);
+    public function relocate(Request $request,$post){
+        $response = Http::post(config('api.haiq.storage.moveBin'),$post);
         if (!$response->ok()){
-            app('LogService')->log(__METHOD__,"haiq-请求失败,路径异常","REQUEST:".json_encode($this->request)." | RESPONSE:".$response);
+            app('LogService')->log(__METHOD__,"haiq-请求失败,路径异常","REQUEST:".json_encode($this->post)." | RESPONSE:".$response);
             return ['success'=>false,"data"=>$response->body()];
         }
         if (($response["code"] ?? false) && $response["code"] != 200){
-            app('LogService')->log(__METHOD__,"haiq-料箱出库失败","REQUEST:".json_encode($this->request)." | RESPONSE:".$response);
+            app('LogService')->log(__METHOD__,"haiq-料箱出库失败","REQUEST:".json_encode($this->post)." | RESPONSE:".$response);
             return ['success'=>false,"data"=>$response["errMsg"]];
         }
        if (($response["status"] ?? false) && $response["status"] == 500){
-           app('LogService')->log(__METHOD__,"haiq-料箱出库失败","REQUEST:".json_encode($this->request)." | RESPONSE:".$response);
+           app('LogService')->log(__METHOD__,"haiq-料箱出库失败","REQUEST:".json_encode($this->post)." | RESPONSE:".$response);
            return ['success'=>false,"data"=>$response["msg"]];
         }
-        app('LogService')->log(__METHOD__,"haiq-料箱出库成功","REQUEST:".json_encode($this->request)." | RESPONSE:".$response);
+        app('LogService')->log(__METHOD__,"haiq-料箱出库成功","REQUEST:".json_encode($this->post)." | RESPONSE:".$response);
         return ["success"=>true];
     }
+    public function light(Request $request,$post){
+        $response = Http::post(config('api.haiq.storage.light'),$post);
+        return $response->body();
+    }
     public function moveBin(Request $request){
-
+        return $this->relocate($request,$this->post);
+    }
+    public function moveBin2(Request $request){
+        return $this->relocate($request,$this->post2);
+    }
+    public function moveBinIn(Request $request){
+        return $this->relocate($request,$this->backIn);
+    }
+    public function moveBinM(Request $request){
+        return $this->relocate($request,$this->move);
+    }
+    public function lightOn(Request $request){
+        return $this->light($request,$this->lightOn);
+    }
+    public function lightOff(Request $request){
+        return $this->light($request,$this->lightOff);
     }
     public function taskUpdate(Request $request){
         $this->service->taskUpdate();

+ 9 - 15
app/Imports/UpdatePickZone.php

@@ -50,7 +50,7 @@ class UpdatePickZone implements ToCollection,WithHeadingRow
                 $errors[] = "第“" . ($index + 2) . "”行不存在日期";
                 continue;
             }
-            $detail = OracleDOCOrderDetail::query()->select("customerid","sku")
+            $detail = OracleDOCOrderDetail::query()->select("customerid","sku","orderno","orderlineno")
                 ->where("orderno",$item["订单编号"])
                 ->whereHas("sku",function ($query)use($item){
                     /** @var Builder $query */
@@ -84,25 +84,19 @@ class UpdatePickZone implements ToCollection,WithHeadingRow
                 $max = null;
                 $map = [];
                 foreach ($lot as $i => $l){
-                    $qty = (int)$l->quty;
+                    $qty = (int)$l->qty;
                     $map[$qty] = $i;
-                    if ($qty >= (int)$item["数量"] && $qty<=$max)$max = $qty;
-                    if ($qty < (int)$item["数量"] && $qty>=$min)$min = $qty;
+                    if (($qty >= (int)$item["数量"] && $qty<=$max) || $max===null)$max = $qty;
+                    if (($qty < (int)$item["数量"] && $qty>=$min) || $min===null)$min = $qty;
                 }
                 if ($max !== null)$result = $lot[$map[$max]];
                 else $result = $lot[$map[$min]];
             }
             if (count($lot) == 1)$result = $lot[0];
-            if ($result){dd($result);
+            if ($result){
                 try{
-                    $detail->update([
-                        "lotnum" => $result->lotnum,
-                        "pickzone" => $result->pickzone,
-                        "kitreferenceno" => '0',
-                        "d_edi_09" => '0',
-                        "d_edi_10" => '0',
-                    ]);
-                    DB::connection("oracle")->commit();
+                    $sql = "UPDATE DOC_ORDER_DETAILS SET LOTNUM = ?,PICKZONE = ?,KITREFERENCENO = ?,D_EDI_09 = ?,D_EDI_10 = ? WHERE ORDERNO = ? AND ORDERLINENO = ?";
+                    DB::connection("oracle")->update(DB::raw($sql),[$result->lotnum,$result->pickzone,'0','0','0',$detail->orderno,$detail->orderlineno]);
                     LogService::log(__METHOD__,"SUCCESS-指定效期分配修改库位",json_encode($detail)." | ".json_encode($result));
                     $order = app("OrderService")->first(["code"=>$item["订单编号"]]);
                     if (!$order){
@@ -115,8 +109,8 @@ class UpdatePickZone implements ToCollection,WithHeadingRow
                         continue;
                     }
                     $model = app("OrderCommodityAssignService")->create([
-                        "order_id"      =>  1,//$order->id,
-                        "commodity_id"  =>  1,//$barcode->commodity_id,
+                        "order_id"      =>  $order->id,
+                        "commodity_id"  =>  $barcode->commodity_id,
                         "amount"        =>  $item["数量"],
                         "produced_at"   =>  $item["生产日期"],
                         "valid_at"      =>  $item["失效日期"],

+ 45 - 0
app/Jobs/WaybillCreateInstantBill.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Services\LogService;
+use App\Services\WaybillService;
+use App\Waybill;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class WaybillCreateInstantBill implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+
+    protected $waybill;
+    /**
+     * Create a new job instance.
+     *
+     * @param Waybill $waybill
+     * @return void
+     */
+    public function __construct(Waybill $waybill)
+    {
+        $this->waybill = $waybill;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @param WaybillService $service
+     * @return void
+     */
+    public function handle(WaybillService $service)
+    {
+        try{
+            $service->createInstantBill($this->waybill);
+        }catch (\Exception $e){
+            LogService::log(__METHOD__,"ERROR-运输计算运费失败",$this->waybill->toJson()." | ".$e->getMessage());
+        }
+    }
+}

+ 2 - 0
app/Order.php

@@ -136,6 +136,7 @@ class Order extends Model
     {
         return
             $this['code'] == $order['code'] &&
+            $this['batch_id'] == $order['batch_id'] &&
             $this['warehouse_id'] == $order['warehouse_id'] &&
             $this['owner_id'] == $order['owner_id'] &&
             $this['shop_id'] == $order['shop_id'] &&
@@ -156,6 +157,7 @@ class Order extends Model
     public function assignValueByOrder($order)
     {
         $this['code'] = $order['code'] ;
+        $this['batch_id'] = $order['batch_id'] ;
         $this['warehouse_id'] = $order['warehouse_id'] ;
         $this['owner_id'] = $order['owner_id'] ;
         $this['shop_id'] = $order['shop_id'] ;

+ 2 - 0
app/OrderCommodityAssign.php

@@ -2,10 +2,12 @@
 
 namespace App;
 
+use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 
 class OrderCommodityAssign extends Model
 {
+    use ModelTimeFormat;
     protected $fillable = [
         "order_id",         //外键订单
         "commodity_id",     //外键商品

+ 2 - 1
app/OrderCountingRecord.php

@@ -7,5 +7,6 @@ use Illuminate\Database\Eloquent\Model;
 class OrderCountingRecord extends Model
 {
     //
-    protected $fillable = ['owner_id','shop_id' ,'warehouse_id' ,'logistic_id' ,'date_target' ,'counting_unit' ,'amount'];
+    protected $fillable = ['owner_id','shop_id' ,'warehouse_id' ,'logistic_id' ,'date_target' ,'counting_unit' ,'amount','year','month','week'];
+
 }

+ 6 - 0
app/Services/BatchService.php

@@ -51,4 +51,10 @@ Class BatchService
         //执行总任务
     }
 
+    public function getBatchByCodes($codes)
+    {
+        if(empty($codes))return collect();
+        if(count($codes) == 0)return collect();
+        return Batch::query()->whereIn('code',$codes)->get();
+    }
 }

+ 19 - 3
app/Services/CheckActiveMenuService.php

@@ -66,18 +66,22 @@ class CheckActiveMenuService
     public static function activeMenus()
     {
         $user_id = self::getUserId();
+        $result = collect();
         try {
             Redis::LLEN('UserVisitMenuLogsL1');
             if (Redis::LLEN('UserVisitMenuLogsL1') + Redis::LLEN('UserVisitMenuLogsL2') > 0) {
                 //缓存中有数据
-                return self::getFromRedis($user_id);
+                $result= self::getFromRedis($user_id);
             }else{
-                return self::getFromDB($user_id);
+                $result= self::getFromDB($user_id);
             }
         } catch (\Exception $e) {
             // TODO 缓存异常的处理策略
-            return self::getFromDB($user_id);
+            $result=self::getFromDB($user_id);
         }
+
+        $result = self::filterRepetitionMenu($result);
+        return $result;
     }
 
     /**
@@ -261,4 +265,16 @@ class CheckActiveMenuService
                 //将查询结果按照上面拍好的顺序重新排列
             });
     }
+
+
+    protected static function filterRepetitionMenu($result)
+    {
+        $response = $result->duplicates('id');
+        if (!empty($response)) {
+            $result = $result->filter(function ($item) use ($response) {
+                return !($response->contains($item->id) && empty($item->secondLevelMenu));
+            });
+        }
+        return $result;
+    }
 }

+ 1 - 1
app/Services/InventoryAccountService.php

@@ -40,7 +40,7 @@ class InventoryAccountService
             ->sql();
     }
     private function conditionQuery($queryParam){
-        $ownerIds=app('OwnerService')->getSelectionId();
+        $ownerIds=app('OwnerService')->getSelection();
         $inventories=InventoryAccount::query()->with(['owner','creator'])->orderBy('id','desc')->whereIn('owner_id',$ownerIds);
         $columnQueryRules=[
             'owner_id' => ['multi' => ','],

+ 1 - 1
app/Services/InventoryCompareService.php

@@ -125,7 +125,7 @@ class InventoryCompareService
         return $inventoryCompares;
     }
     private function conditionQueryInventoryCompare(array $param){
-        $ownerIds=app('OwnerService')->getSelectionId();
+        $ownerIds=app('OwnerService')->getSelection();
         $differ=$param['differ']??'';
         if ($differ=='有'){
             $inventoryCompares = InventoryCompare::query()->with(['owner','commodity'=>function($query){

+ 12 - 20
app/Services/LaborReportsCountingRecordService.php

@@ -18,7 +18,7 @@ class LaborReportsCountingRecordService
     {
         $resultByCache = Cache::remember('userGroupsCount_' . $start . '_' . $end, 600, function () use ($start, $end) {
             return LaborReport::query()->selectRaw('user_workgroup_id,count(user_workgroup_id) amount')
-                ->with('userWorkgroup','laborReportStatus')
+                ->with('userWorkgroup', 'laborReportStatus')
                 ->whereDate('created_at', '>=', $start)
                 ->whereDate('created_at', '<', $end)
                 ->groupBy('user_workgroup_id')->get();
@@ -88,11 +88,6 @@ class LaborReportsCountingRecordService
                     $dataArray[] = $item->toDateString();
                 }
                 break;
-            case '周';
-                foreach (Carbon::parse($start)->startOfWeek(1)->weeksUntil($end, 1)->toArray() as $item) {
-                    $dataArray[] = $item->year . '-' . $item->week . '';
-                }
-                break;
             case '月';
                 foreach (Carbon::parse($start)->monthsUntil($end, 1)->toArray() as $item) {
                     $dataArray[] = $item->year . '-' . $item->format('m') . '';
@@ -100,7 +95,7 @@ class LaborReportsCountingRecordService
                 break;
             case '年';
                 foreach (Carbon::parse($start)->yearsUntil($end, 1)->toArray() as $item) {
-                    $dataArray[] = $item->year . '-' . $item->month . '';
+                    $dataArray[] = $item->year.'';
                 }
                 break;
             default:
@@ -114,7 +109,7 @@ class LaborReportsCountingRecordService
         switch ($unit) {
             case '日':
                 $query = LaborReport::query()
-                    ->selectRaw("DATE_FORMAT(created_at,'%Y-%m-%d') as date_target, count(1) as counter");
+                    ->selectRaw("DATE_FORMAT(created_at,'%Y-%m-%d') as date_target, count(DISTINCT enter_number ) as counter");
                 foreach ($dateList as $startOfWeek) {
                     $query->orWhere(function ($query) use ($startOfWeek) {
                         $query->whereDate('created_at', $startOfWeek);
@@ -127,31 +122,28 @@ class LaborReportsCountingRecordService
                     Cache::put($key, $item);
                 });
                 break;
-            case '':
-                $query = LaborReport::query()->selectRaw("DATE_FORMAT(created_at,'%x-%v') as date_target, count(1) as counter");
+            case '':
+                $query = LaborReport::query()->selectRaw("DATE_FORMAT(created_at,'%Y-%m') as date_target, count(DISTINCT enter_number ) as counter");
                 foreach ($dateList as $date) {
                     $query->orWhere(function ($query) use ($date) {
                         $year = Str::of($date)->explode('-')[0];
-                        $week = Str::of($date)->explode('-')[1];
-                        $startOfWeek = Carbon::now()->setISODate($year, $week)->startOfWeek()->toDateString();
-                        $endOfWeek = Carbon::parse($startOfWeek)->endOfWeek()->toDateString();
-                        $query->whereDate('created_at', '>=', $startOfWeek)->whereDate('created_at', '<=', $endOfWeek);
+                        $month = Str::of($date)->explode('-')[1];
+                        $query->whereYear('created_at', $year)->whereMonth('created_at', $month);
                     });
                 }
                 $dataList = $query->groupBy('date_target')->get();
                 $dataList->each(function ($item) use ($unit) {
                     $date = $item->date_target;
-                    $item->date_target = Carbon::now()->setISODate(Str::of($date)->explode('-')[0], Str::of($date)->explode('-')[1])->startOfWeek()->toDateString();
-                    Cache::put('laborReportsCountingRecords_' . $date . '_' . $unit, $item);
+                    $key = 'laborReportsCountingRecords_' . $date . '_' . $unit;
+                    Cache::put($key, $item);
                 });
                 break;
-            case '':
-                $query = LaborReport::query()->selectRaw("DATE_FORMAT(created_at,'%Y-%m') as date_target, count(1) as counter");
+            case '':
+                $query = LaborReport::query()->selectRaw("DATE_FORMAT(created_at,'%Y') as date_target, count(DISTINCT enter_number ) as counter");
                 foreach ($dateList as $date) {
                     $query->orWhere(function ($query) use ($date) {
                         $year = Str::of($date)->explode('-')[0];
-                        $month = Str::of($date)->explode('-')[1];
-                        $query->whereYear('created_at', $year)->whereMonth('created_at', $month);
+                        $query->whereYear('created_at', $year)->whereYear('created_at', $year);
                     });
                 }
                 $dataList = $query->groupBy('date_target')->get();

+ 1 - 1
app/Services/LogisticService.php

@@ -104,7 +104,7 @@ Class LogisticService
         return Cache::remember("getLogisticByCode_{$code}", config('database.cache.expirations.rarelyChange'), function()use($code){
             $logistic = Logistic::query()->where('code',$code)->first();
             if($logistic)return $logistic;
-            $baseCustomers = app('OracleBasCustomerService')->first(['Customer_Type'=>'CA','CustomerID'=>'$code']);
+            $baseCustomers = app('OracleBasCustomerService')->first(['Customer_Type'=>'CA','CustomerID'=>$code]);
             if(!$baseCustomers)return null;
             try {
                 $logistic = Logistic::query()->create(['name' => $baseCustomers['descr_c'], 'code' => $baseCustomers['customerid']]);

+ 439 - 0
app/Services/NewOrderCountingRecordService.php

@@ -0,0 +1,439 @@
+<?php
+
+
+namespace App\Services;
+
+
+use App\Logistic;
+use App\Order;
+use App\OrderCountingRecord;
+use App\Warehouse;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\Cache;
+
+class NewOrderCountingRecordService
+{
+    public function orderCountingRecords($start, $end, $unit, $ownerIds)
+    {
+        $orders = $this->get($start, $end, $unit, $ownerIds);
+        $dataList = collect();
+        $orders->groupBy('date_target')->sortKeys()->each(function ($items) use (&$dataList, $unit) {
+            $counter = $items->reduce(function ($sum, $item) {
+                return $sum + $item->amount;
+            }, 0);
+            $date_target = $items[0]->date_target;
+            $dataList->push([
+                'counter' => $counter,
+                'date_target' => $date_target,
+            ]);
+        });
+        return $dataList;
+    }
+
+    public function logisticsCountingRecords($start, $end, $ownerIds)
+    {
+        $key = 'logisticsCountingRecords_' . $start . '_' . $end . '_' . json_encode($ownerIds);
+        return Cache::remember($key, 600, function () use ($start, $end, $ownerIds) {
+            $dataList = collect();
+            $resultOrders = $this->get($start, $end, '日', $ownerIds);
+            $resultOrders->groupBy('logistic_id')->each(function ($item) use (&$dataList) {
+                $counter = $item->reduce(function ($sum, $item) {
+                    return $sum + $item->amount;
+                }, 0);
+                $dataList->push([
+                    'value' => $counter,
+                    'logistic_id' => $item[0]->logistic_id,
+                ]);
+            });
+            $map = [];
+            $logistics = Logistic::query()->whereIn('id', data_get($dataList, '*.logistic_id'))->get();
+            $logistics->each(function ($logistic) use (&$map) {
+                $map[$logistic->id] = $logistic;
+            });
+            return $dataList->map(function (&$item) use ($map) {
+                $logistic = $map[$item['logistic_id']] ?? '';
+                $item['name'] = $logistic->name ?? '';
+                return $item;
+            });
+        });
+    }
+
+    public function warehouseCountingRecords($start, $end, $ownerIds)
+    {
+        $key = 'warehouseCountingRecords_' . $start . '_' . $end . '_' . json_encode($ownerIds);
+        return Cache::remember($key, 600, function () use ($start, $end, $ownerIds) {
+            $dataList = collect();
+            $resultOrders = $this->get($start, $end, '日', $ownerIds);
+            $resultOrders->groupBy('warehouse_id')->each(function ($item) use (&$dataList) {
+                $counter = $item->reduce(function ($sum, $item) {
+                    return $sum + $item->amount;
+                }, 0);
+                $dataList->push([
+                    'value' => $counter,
+                    'warehouse_id' => $item[0]->warehouse_id,
+                ]);
+            });
+            $map = [];
+            $logistics = Warehouse::query()->whereIn('id', data_get($dataList, '*.warehouse_id'))->get();
+            $logistics->each(function ($warehouse) use (&$map) {
+                $map[$warehouse->id] = $warehouse;
+            });
+            return $dataList->map(function (&$item) use ($map) {
+                $warehouse = $map[$item['warehouse_id']] ?? '';
+                $item['code'] = $warehouse->name ?? '';
+                switch ($item['code']) {
+                    case 'WH01':
+                        $item['name'] = '松江一仓';
+                        break;
+                    case 'WH02':
+                        $item['name'] = '松江二仓';
+                        break;
+                    case 'WH03':
+                        $item['name'] = '嘉定一仓';
+                        break;
+                    default:
+                        $item['name'] = '仓库为空';
+                        break;
+                }
+                return $item;
+            });
+        });
+    }
+
+
+    public function get($start, $end, $unit, $ownerIds)
+    {
+        $queryCondition = $this->transfersToCondition($start, $end, $unit, $ownerIds);
+        return $this->getOrderCountingRecords($queryCondition);
+    }
+
+    public function getFromCache($queryCondition)
+    {
+        $lackingCondition = [];
+        $orderCountingRecords_FromCache = collect();
+        $lackingCondition['unit'] = $queryCondition['unit'];
+        foreach ($queryCondition['data'] as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $ownerId) {
+                $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $queryCondition['unit'];
+                $items = cache()->get($key);
+                if (empty($items)) {
+                    if (empty($lackingCondition['data'][$dateStr])) {
+                        $lackingCondition['data'][$dateStr] = [];
+                    }
+                    $lackingCondition['data'][$dateStr][] = $ownerId;
+                } else {
+                    foreach ($items as $item) {
+                        $orderCountingRecords_FromCache->push($item);
+                    }
+                }
+            }
+        }
+        return [$orderCountingRecords_FromCache, $lackingCondition];
+    }
+
+    public function dataFromMiddleTable($queryCondition)
+    {
+        $result = [];
+        $orderSqlBuilder = OrderCountingRecord::query();
+        $unit = $queryCondition['unit'];
+        foreach ($queryCondition['data'] as $date => $owners) {
+            $orderSqlBuilder->orWhere(function ($query) use ($owners, $date, $unit) {
+                $query->whereIn('owner_id', $owners)->where('date_target', $date)->where('counting_unit', $unit);
+            });
+        }
+        $dataFromMiddleTable = $orderSqlBuilder->get();
+        $this->insertIntoCache($dataFromMiddleTable, $unit);
+        $queryCondition = $this->unQueryCondition($dataFromMiddleTable, $queryCondition);
+        $orderCountingRecords_fromSelfTable = $dataFromMiddleTable;
+        $lackingCondition = $queryCondition;
+        return [$orderCountingRecords_fromSelfTable, $lackingCondition];
+    }
+
+    public function getOrderCountingRecords($queryCondition)
+    {
+
+        list($orderCountingRecords_fromCache, $lackingCondition)
+            = $this->getFromCache($queryCondition);
+        if (empty($lackingCondition['data'])) {
+            return $orderCountingRecords_fromCache;
+        }
+
+        list($orderCountingRecords_fromSelfTable, $lackingCondition)
+            = $this->dataFromMiddleTable($lackingCondition);
+        if (empty($lackingCondition['data'])) {
+            return $orderCountingRecords_fromCache->concat($orderCountingRecords_fromSelfTable);
+        }
+        list($orderCountingRecords_combinedByLower, $lackingCondition)
+            = $this->getByLowerUnit($lackingCondition);
+
+        if (!empty($lackingCondition)) {
+            $orderCountingRecords_FromOrder = $this->dataFromOrder($lackingCondition);
+        }
+        $result = collect();
+        if (isset($orderCountingRecords_FromOrder)  && !$orderCountingRecords_FromOrder->isEmpty()) {
+            $result =  $result->concat($orderCountingRecords_FromOrder);
+        }
+        if (!$orderCountingRecords_fromCache->isEmpty()) {
+            $result =  $result->concat($orderCountingRecords_fromCache);
+        }
+        if (!$orderCountingRecords_fromSelfTable->isEmpty()) {
+            $result = $result->concat($orderCountingRecords_fromSelfTable);
+        }
+        if (count($orderCountingRecords_combinedByLower) != 0) {
+            $result = $result->concat($orderCountingRecords_combinedByLower);
+        }
+        return $result;
+    }
+
+
+    public function getByLowerUnit($queryCondition)
+    {
+        switch ($queryCondition['unit']) {
+            case '年':
+                $lowUnit = '月';
+                $conditionClone = ['unit' => $lowUnit, 'data' => []];
+                foreach ($queryCondition['data'] as $date => $ownerIds) {
+                    $startAt = $date;
+                    $endAt = Carbon::parse($date)->endOfYear()->toDateString();
+                    $items = $this->transfersToCondition(
+                        $startAt, $endAt, $lowUnit, $ownerIds
+                    )['data'];
+                    foreach ($items as $dateStr => $item) {
+                        if (empty($conditionClone['data'][$dateStr])) $conditionClone['data'][$dateStr] = $dateStr;
+                        $conditionClone['data'][$dateStr] = ($item);
+                    }
+                }
+                $orderCountingRecords_days = $this->getOrderCountingRecords($conditionClone);
+                $orderCountingRecords_combinedByLower = $this->turnGradingUpToLow($orderCountingRecords_days, $lowUnit, 'year');
+                break;
+            case '月':
+                $lowUnit = '日';
+                $conditionClone = ['unit' => $lowUnit, 'data' => []];
+                foreach ($queryCondition['data'] as $date => $ownerIds) {
+                    $startAt = $date;
+                    $endAt = Carbon::parse($date)->endOfMonth()->toDateString();
+                    $items = $this->transfersToCondition(
+                        $startAt, $endAt, $lowUnit, $ownerIds
+                    )['data'];
+                    foreach ($items as $dateStr => $item) {
+                        if (empty($conditionClone['data'][$dateStr])) $conditionClone['data'][$dateStr] = $dateStr;
+                        $conditionClone['data'][$dateStr] = ($item);
+                    }
+                }
+                $orderCountingRecords_days = $this->getOrderCountingRecords($conditionClone);
+                $orderCountingRecords_combinedByLower = $this->turnGradingUpToLow($orderCountingRecords_days, $lowUnit, 'month');
+                break;
+            case '日':
+                return [[], $queryCondition];
+            default:
+        }
+        return [$orderCountingRecords_combinedByLower, []];
+    }
+
+    public function transfersToCondition($start, $end, $unit, $ownerIds)
+    {
+        $condition = [
+            'data' => [],
+            'unit' => $unit,];
+        $startAt = Carbon::parse($start);
+        $dates = [];
+        switch ($unit) {
+            case '年':
+                $dates = collect($startAt->yearsUntil($end, 1)->toArray())
+                    ->map(function (Carbon $date) {
+                        return $date->firstOfYear();
+                    });
+                break;
+            case '月':
+                $dates = collect($startAt->monthsUntil($end, 1)->toArray())
+                    ->map(function (Carbon $date) {
+                        return $date->firstOfMonth();
+                    });
+                break;
+            case '日':
+                $dates = collect($startAt->daysUntil($end, 1)->toArray())
+                    ->map(function (Carbon $date) {
+                        return $date->startOfDay();
+                    });
+                break;
+            default:
+        }
+
+        foreach ($dates as $day) {
+            $condition['data'][$day->toDateString()] = $ownerIds;
+        }
+        return $condition;
+    }
+
+    public function dataFromOrder($queryCondition)
+    {
+        $orderSqlBuilder = Order::query()->selectRaw("owner_id,warehouse_id,shop_id,logistic_id,count(1) as amounts ,DATE_FORMAT(created_at,'%Y-%m-%d') as date_target");
+        foreach ($queryCondition['data'] as $dateStr => $ownerIds) {
+            $orderSqlBuilder->orWhere(function ($query) use ($ownerIds, $dateStr) {
+                $query->whereIn('owner_id', $ownerIds)->where('created_at', '>', $dateStr)->where('created_at', '<', Carbon::parse($dateStr)->addDay()->toDateString())->where('wms_status', '订单完成');
+            });
+        }
+        $dataFromOrder = $orderSqlBuilder->groupBy(['owner_id', 'warehouse_id', 'shop_id', 'logistic_id', 'date_target'])->get();
+        $dataFromMiddleTable = $this->ordersToOrderCountingRecords($dataFromOrder, $queryCondition['unit']);
+        $this->setDefultData($dataFromMiddleTable, $queryCondition);
+        $this->insertIntoMiddleTable($dataFromMiddleTable);
+        $this->insertIntoCache($dataFromMiddleTable, $queryCondition['unit']);
+        return $dataFromMiddleTable;
+    }
+
+    public function insertIntoMiddleTable($data)
+    {
+        $data->filter(function ($item) {
+            return $this->isNotCurrentDate($item->date_target);
+        })->chunk(1000)->each(function ($item) {
+            OrderCountingRecord::query()->insert($item->toArray());
+        });
+    }
+
+    public function insertIntoCache($collect, $unit)
+    {
+        $map = [];
+        $collect->each(function ($order) use ($unit, &$map) {
+            $key = "order_counting_records_{$order->date_target}_{$order->owner_id}_{$unit}";
+            if (empty($map[$key])) $map[$key] = [];
+            $map[$key][] = $order;
+        });
+
+        foreach ($map as $key => $orders) {
+            $ttl = 3600 * 24;
+            if (!$this->isNotCurrentDate($orders[0]['date_target'])) {
+                $ttl = 70;
+            }
+            Cache::put($key, collect($orders), $ttl);
+        }
+    }
+
+    public function isNotCurrentDate($dateStr): bool
+    {
+        return $dateStr != Carbon::now()->format('Y-m-d')
+            && $dateStr != Carbon::now()->year . '-' . Carbon::now()->month;
+    }
+
+
+    public function unQueryCondition($dataFromMiddleTable, $unQueryCondition)
+    {
+        $map = [];
+        $dataFromMiddleTable->each(function ($item) use (&$map) {
+            $key = 'owner_id=' . $item->owner_id . ' date_target' . $item->date_target;
+            $map[$key] = true;
+        });
+        foreach ($unQueryCondition['data'] as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $key => $ownerId) {
+                $key1 = 'owner_id=' . $ownerId . ' date_target' . $dateStr;
+                if (isset($map[$key1])) {
+                    //中间表查找到数据
+                    unset($unQueryCondition['data'][$dateStr][$key]);
+                }
+            }
+            if (empty($unQueryCondition['data'][$dateStr])) {
+                unset($unQueryCondition['data'][$dateStr]);
+            }
+        }
+        return $unQueryCondition;
+    }
+
+
+    public function ordersToOrderCountingRecords($dataFromOrder, $unit)
+    {
+        $dataFromMiddleTable = collect();
+        //当日当周当月当年的数据不能插入到中间表
+        $dateTime = Carbon::now()->toDateTimeString();
+        foreach ($dataFromOrder as $order) {
+            $carbon = Carbon::parse($order->date_target);
+            $year = $carbon->year;
+            $week = $carbon->week;
+            $month = $carbon->month;
+            $dataFromMiddleTable->push(new OrderCountingRecord([
+                'owner_id' => $order->owner_id,
+                'shop_id' => $order->shop_id,
+                'warehouse_id' => $order->warehouse_id,
+                'logistic_id' => $order->logistic_id,
+                'date_target' => $order->date_target,
+                'counting_unit' => $unit,
+                'amount' => $order->amounts,
+                'week' => $year . '-' . $week,
+                'month' => $year . '-' . $month,
+                'year' => $year . '',
+                'created_at' => $dateTime,
+                'updated_at' => $dateTime,
+            ]));
+        }
+        return $dataFromMiddleTable;
+    }
+
+    public function count($orderCountingRecords_days, $unit)
+    {
+        $isEnd = false;
+        $result = collect();
+        $item = null;
+        $amount = 0;
+        foreach ($orderCountingRecords_days as $itemToCount) {
+            if ($itemToCount instanceof OrderCountingRecord) {
+                if (!$isEnd) {
+                    $isEnd = true;
+                    $item = clone($itemToCount);
+                }
+                $amount += $itemToCount->amount;
+            } else {
+                $result = $result->concat($this->count($itemToCount, $unit));
+            }
+        }
+        if ($isEnd) {
+            switch ($unit) {
+                case "日":
+                    $item['date_target'] = Carbon::parse($item['date_target'])->firstOfMonth()->toDateString();
+                    break;
+                case "月":
+                    $item['date_target'] = Carbon::parse($item['date_target'])->firstOfYear()->toDateString();
+                    break;
+            }
+            $item['amount'] = $amount;
+            $item['counting_unit'] = $unit;
+            return $result->push($item);
+        }
+        return $result;
+    }
+
+    public function turnGradingUpToLow($orderCountingRecords_days, $unit, $grading)
+    {
+        $orderCountingRecords_days = $orderCountingRecords_days->groupBy(['owner_id', 'shop_id', 'warehouse_id', 'logistic_id', $grading]);
+        return $this->count($orderCountingRecords_days, $unit);
+    }
+
+    public function setDefultData($dataFromMiddleTable, $queryCondition)
+    {
+        $map = [];
+        foreach ($dataFromMiddleTable as $data) {
+            if (empty($map[$data->date_target . '-' . $data->owner_id])) $map[$data->date_target . '-' . $data->owner_id] = true;
+        }
+        foreach ($queryCondition['data'] as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $ownerId) {
+                if (empty($map[$dateStr . '-' . $ownerId]) && Carbon::parse($dateStr)->isBefore(Carbon::now())) {
+                    $carbon = Carbon::parse($dateStr);
+                    $year = $carbon->year;
+                    $week = $carbon->week;
+                    $month = $carbon->month;
+                    $dataFromMiddleTable->push(new OrderCountingRecord([
+                        'owner_id' => $ownerId,
+                        'shop_id' => null,
+                        'warehouse_id' => null,
+                        'logistic_id' => null,
+                        'date_target' => $dateStr,
+                        'counting_unit' => $queryCondition['unit'],
+                        'amount' => 0,
+                        'week' => $year . '-' . $week,
+                        'month' => $year . '-' . $month,
+                        'year' => $year . '',
+                        'created_at' => $carbon->toDateString(),
+                        'updated_at' => $carbon->toDateString(),
+                    ]));
+                }
+            }
+        }
+    }
+}

+ 31 - 29
app/Services/OracleDOCOrderHeaderService.php

@@ -2,11 +2,12 @@
 
 namespace App\Services;
 
+use App\OracleActAllocationDetails;
+use App\OracleBasCode;
+use App\OracleBasCustomer;
 use App\OracleDOCOrderDetail;
 use App\OracleDOCOrderHeader;
 use App\Owner;
-use Illuminate\Support\Arr;
-use Illuminate\Support\Str;
 
 Class OracleDOCOrderHeaderService
 {
@@ -20,9 +21,24 @@ Class OracleDOCOrderHeaderService
         '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','DOC_Order_Header.C_District',
-        'DOC_Order_Header.IssuePartyName','DOC_Order_Header.OrderType'
+        'DOC_Order_Header.IssuePartyName','DOC_Order_Header.OrderType','DOC_Order_Header.WaveNo'
     ];
 
+    private function getQuery(){
+        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,doc_order_details.Location');
+            }, 'actAllocationDetails'=>function($query){
+                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku');
+            },'oracleBASCode'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            },'orderType'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            }]);
+    }
+
     function first(array $params){
         $order = OracleDOCOrderHeader::query();
         foreach ($params as $column => $value){
@@ -67,40 +83,26 @@ Class OracleDOCOrderHeaderService
 
     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,doc_order_details.Location');
-            }, 'actAllocationDetails'=>function($query){
-                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku');
-            },'oracleBASCode'=>function($query){
-                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-            },'orderType'=>function($query){
-                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-            }])
-            ->where('DOC_Order_Header.addTime','>=',$startDate)
+        return  $this->getQuery()->where('DOC_Order_Header.addTime','>=',$startDate)
             ->whereColumn('DOC_Order_Header.editTime','=','DOC_Order_Header.addTime')
             ->orderByDesc('DOC_Order_Header.addTime')
             ->get();
     }
 
     public function getWMSOrderOnEditDate($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,doc_order_details.Location');
-            }, 'actAllocationDetails'=>function($query){
-                $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku');
-            },'oracleBASCode'=>function($query){
-                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-            },'orderType'=>function($query){
-                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
-            }])
-            ->where('DOC_Order_Header.editTime','>=',$startDate)
+        return  $this->getQuery()->where('DOC_Order_Header.editTime','>=',$startDate)
             ->whereColumn('DOC_Order_Header.editTime','!=','DOC_Order_Header.addTime')
             ->orderByDesc('DOC_Order_Header.editTime')
             ->get();
     }
+
+    public function getOrderInfoByOrderNos($orderNos)
+    {
+        if(empty($orderNos))return collect();
+        if(count($orderNos) == 0)return collect();
+        return $this->getQuery()->whereIn('DOC_Order_Header.OrderNo',$orderNos)->get();
+    }
+
+
+
 }

+ 34 - 6
app/Services/OrderCountingRecordService.php

@@ -190,7 +190,7 @@ class OrderCountingRecordService
             $item->each(function ($item, $owner_id) use ($dateStr, $unit) {
                 $key = "order_counting_records_{$dateStr}_{$owner_id}_{$unit}";
                 $ttl = 3600 * 24;
-                if ($dateStr == Carbon::now()->toDateString()) {
+                if (!$this->isNotCurrentDate($dateStr)) {
                     $ttl = 70;
                 }
                 Cache::put($key, $item, $ttl);
@@ -265,11 +265,7 @@ class OrderCountingRecordService
             ]);
             $result->push($orderCountingRecord);
         });
-        if ($isHasCurrentDate) {
-            //删除OrderCountingRecord表中与当前日期相关的数据,之后的批量插入重新插入这部分数据
-            OrderCountingRecord::query()->where('date_target', $currentDate)->where('counting_unit', $unit)->delete();
-        }
-        OrderCountingRecord::query()->insert($result->toArray());
+        $this->insertDataToMiddle($isHasCurrentDate, $currentDate, $unit, $result);
         return ['resultOrders' => $result];
     }
 
@@ -378,4 +374,36 @@ class OrderCountingRecordService
             && $dateStr != Carbon::now()->year . '-' . Carbon::now()->week
             && $dateStr != Carbon::now()->year . '-' . Carbon::now()->month;
     }
+
+    protected function insertDataToMiddle($isHasCurrentDate, $currentDate, $unit, $result)
+    {
+        $orderCountingRecordsClock = cache()->get('orderCountingRecordsClock');
+        switch ($orderCountingRecordsClock) {
+            case true:
+            case null:
+                $this->setClockAndDeleteCurrentDateAndInsert($isHasCurrentDate, $currentDate, $unit, $result);
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    protected function deleteMiddleWhereCurrentDate($isHasCurrentDate, $currentDate, $unit)
+    {
+        if ($isHasCurrentDate) {
+            //删除OrderCountingRecord表中与当前日期相关的数据,之后的批量插入重新插入这部分数据
+            OrderCountingRecord::query()->where('date_target', $currentDate)->where('counting_unit', $unit)->delete();
+        }
+    }
+
+    protected function setClockAndDeleteCurrentDateAndInsert($isHasCurrentDate, $currentDate, $unit, $result)
+    {
+        cache()->put('orderCountingRecordsClock', false, 10);
+        $this->deleteMiddleWhereCurrentDate($isHasCurrentDate, $currentDate, $unit);
+        $result->chunk(1000)->each(function ($item) {
+            OrderCountingRecord::query()->insert($item->toArray());
+        });
+        cache()->put('orderCountingRecordsClock', true, 10);
+    }
 }

+ 65 - 15
app/Services/OrderService.php

@@ -28,6 +28,25 @@ use Illuminate\Support\Facades\Redis;
 
 class OrderService
 {
+    /**
+     * @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
+     * @var OrderPackageService $packageService
+     * @var OrderCommodityService $orderCommodityService
+     * @var BatchService $batchService
+     */
+    private $oracleDOCOrderHeaderService;
+    private $packageService;
+    private $orderCommodityService;
+    private $batchService;
+
+    public function __construct()
+    {
+        $this->oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
+        $this->packageService = app('OrderPackageService');
+        $this->orderCommodityService = app('OrderCommodityService');
+        $this->batchService = app('BatchService');
+    }
+
     public function batchUpdate($params){
         return app(BatchUpdateService::class)->batchUpdate('orders',$params);
     }
@@ -219,7 +238,7 @@ class OrderService
         ,DOC_ORDER_HEADER.soreference5,DOC_ORDER_HEADER.EDISENDFLAG2,DOC_ORDER_HEADER.EDISendTime2,DOC_ORDER_HEADER.Notes,DOC_ORDER_HEADER.ERPCANCELFLAG,
        DOC_ORDER_HEADER.Picking_Print_Flag,DOC_ORDER_HEADER.EDISENDFLAG
         ,DOC_ORDER_HEADER.ReleaseStatus,DOC_ORDER_HEADER.C_Address1,DOC_ORDER_HEADER.OrderTime,DOC_Order_Details.CustomerID,
-       DOC_Order_Details.SKU,DOC_Order_Details.QtyOrdered,DOC_Order_Details.LineStatus,DOC_Order_Details.OrderLineNo,order_code.codename_c as orderCodeName,
+       DOC_Order_Details.SKU,DOC_Order_Details.QtyOrdered,DOC_Order_Details.LOTNUM,DOC_Order_Details.LineStatus,DOC_Order_Details.OrderLineNo,order_code.codename_c as orderCodeName,
        order_detail_code.codename_c as orderDetailCodeName,BAS_Customer.descr_c as customer_descr_c,
        BAS_SKU.Alternate_SKU1,BAS_SKU.Descr_C,(select count(*) from DOC_ORDER_HEADER WHERE 1=1";
         $sql=$this->preciseQuery($params,$sql);
@@ -261,7 +280,7 @@ class OrderService
                       DOC_ORDER_HEADER.EDIREMARKS2,DOC_ORDER_HEADER.WaveNo,DOC_ORDER_HEADER.SOReference1, DOC_ORDER_HEADER.soreference5,
                       DOC_ORDER_HEADER.EDISENDFLAG2,DOC_ORDER_HEADER.EDISendTime2,DOC_ORDER_HEADER.Notes,DOC_ORDER_HEADER.ERPCANCELFLAG,
                       DOC_ORDER_HEADER.Picking_Print_Flag,DOC_ORDER_HEADER.EDISENDFLAG,DOC_ORDER_HEADER.ReleaseStatus,DOC_ORDER_HEADER.C_Address1,
-                      DOC_ORDER_HEADER.OrderTime,DOC_Order_Details.CustomerID,DOC_Order_Details.SKU,DOC_Order_Details.QtyOrdered,
+                      DOC_ORDER_HEADER.OrderTime,DOC_Order_Details.CustomerID,DOC_Order_Details.SKU,DOC_Order_Details.QtyOrdered,DOC_Order_Details.LOTNUM,
                       DOC_Order_Details.LineStatus,DOC_Order_Details.OrderLineNo,order_code.codename_c,order_detail_code.codename_c,BAS_Customer.descr_c,
                       BAS_SKU.Alternate_SKU1,BAS_SKU.Descr_C ORDER BY DOC_ORDER_HEADER.ADDTIME desc";
         return $sql;
@@ -311,12 +330,12 @@ class OrderService
             if (isset($commodities[$order->orderno])){
                 array_push($commodities[$order->orderno],
                     ["sku"=>$order->sku,"alternate_sku1"=>$order->alternate_sku1,"descr_c"=>$order->descr_c,"qtyordered"=>$order->qtyordered
-                        ,"checktime"=>$order->checktime,"orderdetailcodename"=>$order->orderdetailcodename]);
+                        ,"lotnum"=>$order->lotnum,"checktime"=>$order->checktime,"orderdetailcodename"=>$order->orderdetailcodename]);
                 unset($orders[$index]);
                 continue;
             }
             $commodities[$order->orderno]=[["sku"=>$order->sku,"alternate_sku1"=>$order->alternate_sku1,
-                "descr_c"=>$order->descr_c,"qtyordered"=>$order->qtyordered,"checktime"=>$order->checktime,"orderdetailcodename"=>$order->orderdetailcodename]];
+                "descr_c"=>$order->descr_c,"qtyordered"=>$order->qtyordered,"lotnum"=>$order->lotnum,"checktime"=>$order->checktime,"orderdetailcodename"=>$order->orderdetailcodename]];
             $orderNos .= ",'".$order->orderno."'";
         }
         $orderNos .= ")";
@@ -421,7 +440,7 @@ class OrderService
         if (!$ASNHeader) {
             return null;
         }
-        $orderHeader = OracleDOCOrderHeader::query()->where('SOReference1', $ASNHeader->ASNReference2);
+        $orderHeader = OracleDOCOrderHeader::query()->where('SOReference1', $ASNHeader->ASNReference2)->first();
         if (!$orderHeader) {
             return null;
         }
@@ -815,8 +834,10 @@ class OrderService
         $logisticService = app("LogisticService");
         $shopService = app('ShopService');
         $warehouseService = app('WarehouseService');
-        $owner_codes = [];$logistic_codes = [];$warehouse_codes = [];$shop_names = [];
+        $owner_codes = [];$logistic_codes = [];$warehouse_codes = [];$shop_names = [];$batch_codes = [];
         foreach ($orderHeaders as $orderHeader) {
+            if(!empty($orderHeader['waveno']))
+                $batch_codes[$orderHeader['waveno']] = $orderHeader['waveno'];
             if(!empty($orderHeader['customerid']))
                 $owner_codes[$orderHeader['customerid']] = $orderHeader['customerid'];
             if(!empty($orderHeader['warehouseid']))
@@ -833,12 +854,13 @@ class OrderService
         $logistics = $logisticService->getLogisticByCodes($logistic_codes);
         $shops = $shopService->getShopByCodeMap($shop_names);
         $warehouses = $warehouseService->getWareHouseByCode($warehouse_codes);
+        $batches = $this->batchService->getBatchByCodes($batch_codes);
 
         $orders = $this->getByWmsOrders($orderHeaders);
 
-        $created_params = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops); //3s
+        $created_params = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops,$batches); //3s
 
-        $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+        $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops,$batches);
 
 
         // 转换插入 3s
@@ -848,7 +870,7 @@ class OrderService
             });
         }
         $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','order_type']
+            ['id','code','warehouse_id','owner_id','batch_id','shop_id','logistic_id','consignee_name','consignee_phone','province','city','district','address','client_code','wms_status','created_at','updated_at','wms_edittime','order_type']
         ];
 
         $update_order->each(function($item)use(&$update_params){
@@ -859,7 +881,7 @@ class OrderService
         $this->batchUpdate($update_params);
     }
 
-    public function getCreateOrderModelsByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops)
+    public function getCreateOrderModelsByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops,&$batches)
     {
         /** @var DataHandlerService $dataHandlerService */
         $dataHandlerService = app('DataHandlerService');
@@ -869,20 +891,20 @@ class OrderService
         $logistic_map = $dataHandlerService->dataHeader(['code'],$logistics);
         $shop_map = $dataHandlerService->dataHeader(['name','owner_id'],$shops);
         $order_map = $dataHandlerService->dataHeader(['code'],$orders);
-
+        $batch_map = $dataHandlerService->dataHeader(['code'],$batches);
         $inner_params  = [];
         $date = (string)Carbon::now();
         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,$date);
+            $order_model = $this->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map,$batch_map,$date);
             $inner_params[] = $order_model;
         }
         return $inner_params;
     }
 
-    public function getUpdateOrderModelByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops)
+    public function getUpdateOrderModelByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops,&$batches)
     {
         /**
          * @var DataHandlerService $dataHandlerService
@@ -894,12 +916,13 @@ class OrderService
         $owner_map = $dataHandlerService->dataHeader(['code'],$owners);
         $logistic_map = $dataHandlerService->dataHeader(['code'],$logistics);
         $shop_map = $dataHandlerService->dataHeader(['name','owner_id'],$shops);
+        $batch_map = $dataHandlerService->dataHeader(['code'],$batches);
         $collect = collect();
         $date = (string)Carbon::now();
         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,$date);
+            $order_model = $this->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map,$batch_map,$date);
             if(!$order->isEquals($order_model)){
                 $order->assignValueByOrder($order_model);
                 $collect->push($order);
@@ -908,19 +931,21 @@ class OrderService
         return $collect;
     }
 
-    public function getCreateOrderModels(&$orderHeader,&$warehouse_map,&$owner_map,&$logistic_map,&$shop_map,$date)
+    public function getCreateOrderModels(&$orderHeader,&$warehouse_map,&$owner_map,&$logistic_map,&$shop_map,&$batch_map,$date)
     {
         /** @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);
+        $batch = $dataHandlerService->getKeyValue(['code'=>$orderHeader->waveno],$batch_map);
         $shop['id'] = null;
         if($orderHeader->issuepartyname != null && $orderHeader->issuepartyname != '' ){
             $shop = $dataHandlerService->getKeyValue(['name'=>$orderHeader->issuepartyname ?? '','owner_id'=>$owner->id??''],$shop_map);
         }
         return [
             'code'=>$orderHeader['orderno'],
+            'batch_id' =>$batch['id'] ?? null,
             'warehouse_id' => $warehouse['id'] ?? null,
             'owner_id' => $owner['id'] ?? null,
             'shop_id' => $shop['id'] ?? null,
@@ -1156,6 +1181,30 @@ class OrderService
         }
     }
 
+    public function syncOrderByWmsOrderNos($orderNos)
+    {
+        if(empty($orderNos))return ;
+        if(count($orderNos)==0)return;
+        $orderHeaders = $this->oracleDOCOrderHeaderService->getOrderByOrderNos($orderNos);
+        $this->syncOrderByWMSOrderHeaders($orderHeaders);
+    }
+
+    public function syncOrderInfoByWmsOrderNos($orderNos)
+    {
+        if(empty($orderNos))return ;
+        if(count($orderNos)==0)return;
+        $orderHeaders = $this->oracleDOCOrderHeaderService->getOrderInfoByOrderNos($orderNos);
+        $this->syncOrderInfoByWMSOrderHeaders($orderHeaders);
+    }
+
+    public function syncOrderInfoByWMSOrderHeaders($orderHeaders){
+        if(empty($orderNos))return ;
+        if(count($orderNos)==0)return;
+        $this->syncOrderByWMSOrderHeaders($orderHeaders);
+        $this->orderCommodityService->syncOrderCommodities($orderHeaders);
+        $this->packageService->syncOrderPackage($orderHeaders);
+    }
+
     public function update(array $params, array $values)
     {
         $query = Order::query();
@@ -1240,4 +1289,5 @@ class OrderService
         ]))return true;
        return false;
     }
+
 }

+ 12 - 4
app/Services/OrderTrackingService.php

@@ -405,8 +405,8 @@ class OrderTrackingService
      */
     public function getParamsByOrderHeaderAndOrder($orderHeader,$order)
     {
-        $client = null;
-        $order_remark = null;
+        $client = $orderHeader['issuepartyname'] ?? '';
+        $order_remark = $orderHeader['notes'] ?? '';
         $web_order_number = null;
         if(preg_match('/^O[\d]/',$orderHeader['soreference1'] ?? '') > 0){
             $web_order_number = $orderHeader['soreference1'];
@@ -419,12 +419,20 @@ class OrderTrackingService
                  $planning_sent_at = Carbon::parse((string)$pick_up_at)->addDays($logisticTiming->days_at_working);
              }
         }
+        if(stristr($order_remark,'[')){
+            $items = [];
+            preg_match_all('/^(.*?)(\\[)(.*?)(\\])(.*?)$/u',$order_remark,$items);
+            $client = $items[1][0];
+            $order_remark = $items[3][0];
+        }
+        if(stristr($client,'天猫'))$client='天猫';
+        if(stristr($client,'京东'))$client='京东';
         return [
             'owner_id' => $order->owner_id,
-            'client' => $orderHeader['c_contact'] ?? '',
+            'client' => $client,
             'sale' => $orderHeader['issuepartyname'] ?? '',
             'created_at' => $order->created_at,
-            'order_remark' => $orderHeader['notes'] ?? '',
+            'order_remark' => $order_remark,
             'pick_up_at' => $orderHeader['lastshipmenttime'] ?? '', // 提货时间
             'web_order_number' =>$web_order_number,
             'is_on_duty_shift'=>$planning_sent_at?'是':null,

+ 4 - 2
app/Services/OwnerService.php

@@ -22,7 +22,7 @@ Class OwnerService
      * array | string $column
      * 默认一些select字段,可传递string 或 array来指定select字段
      */
-    public function getSelection(array $column = ['id', 'name'])
+    public function getIntersectPermitting(array $column = ['id', 'name'])
     {
         $ownerIds=app('UserService')->getPermittingOwnerIds(Auth::user());
         return $this->cacheService->getOrExecute('OwnersAll_IdName'.md5(json_encode($column).json_encode($ownerIds)),function()use($column,$ownerIds){
@@ -30,12 +30,14 @@ Class OwnerService
             return Owner::query()->select($column)->whereIn('id', $ownerIds)->get();
         },config('cache.expirations.owners'));
     }
-    public function getSelectionId($column = ['id'])
+
+    public function getSelection($column = ['id'])
     {
         return $this->cacheService->getOrExecute('OwnersAll_Id',function()use($column){
             return Owner::filterAuthorities()->select($column)->get();
         },config('cache.expirations.owners'));
     }
+
     /**
      *同步WMS全部货主至WAS
      */

+ 1 - 1
app/Services/RealtimePendingOrdersService.php

@@ -39,7 +39,7 @@ class RealtimePendingOrdersService
     {
         $start = $start ?? date('Y-m-d 00:00:00');
         $end = $end ?? date('Y-m-d 23:59:59');
-        $ownerIds = app('OwnerService')->getSelectionId();
+        $ownerIds = app('OwnerService')->getSelection();
         $builders = Order::query()->selectRaw("warehouses.code," .
             "count(case wms_status when '创建订单' then 1 end) as createOrder, " .
             "count(case wms_status when '分配完成' then 1 end) as assignedComplete, " .

+ 19 - 5
app/Services/StationService.php

@@ -4,9 +4,9 @@
 namespace App\Services;
 
 
+use App\Events\BroadcastToStation;
 use App\Station;
 use App\StationTask;
-use App\StationTaskCommodity;
 use App\StationType;
 use Exception;
 use Illuminate\Support\Facades\Cache;
@@ -29,19 +29,33 @@ class StationService
     }
 
     function broadcast($station_id, $json_data){
+        broadcast(new BroadcastToStation($station_id,$json_data));
+    }
+
+    function broadcastBinMonitor($station_id, StationTask $stationTask){
+        $stationTask->loadMissing(["taskCommodities.commodity.barcodes","taskCommodities.materialBox","taskBatches.batch"/*,"taskMaterialBoxes.box"*/]);
+        $stationTask->toJson();
+        $this->broadcast($station_id, $stationTask->toJson());
         //...
-        //event(new BroadcastToStation($station_id,$json_data))
+        //$stationTask->stationTaskBatch
+        //$stationTask->stationTaskMaterialBox
+        //$stationTask->stationTaskCommodities   //'待处理',   '处理中' blue,'完成',green
+        //$batch= $stationTask->stationTaskBatch->batch
+        //$orders= $batch->....
+        //.....
+        //$json_data=['batch','stationCommodities','stationMaterialBin','$currentStationTaskCommodity']
+        //$this->broadcast($station_id, $json_data)
     }
 
-    function broadcastBinMonitor($station_id, StationTask $stationTask,StationTaskCommodity $stationTaskCommodity){
+    function broadcastBinChange($station_id, StationTask $stationTask, int $currentStationTaskCommodity_id){
         //...
         //$stationTask->stationTaskBatch
         //$stationTask->stationTaskMaterialBox
-        //$stationTask->stationCommodities
+        //$stationTask->stationTaskCommodities   //'待处理',   '处理中' blue,'完成',green
         //$batch= $stationTask->stationTaskBatch->batch
         //$orders= $batch->....
         //.....
-        //$json_data=['batch','stationCommodities','stationMaterialBin']
+        //$json_data=['batch','stationCommodities','stationMaterialBin','$currentStationTaskCommodity']
         //$this->broadcast($station_id, $json_data)
     }
 

+ 1 - 2
app/Services/StoreService.php

@@ -301,8 +301,7 @@ Class StoreService
     public function createInstantBill(Store $store): bool
     {
         if (!$store || $store->status != "已入库") return false;
-        if (!$store->storeItems) $store->load("storeItems");
-
+        $store->loadMissing("storeItems");
 
         /** @var OwnerPriceOperationService $service */
         $service = app("OwnerPriceOperationService");

+ 1 - 1
app/Services/common/ExportService.php

@@ -28,7 +28,7 @@ Class ExportService
         $data = ['row'=>$row,'list'=>$list];
         if ($createFormat){
             $data["mergeColumn"] = $mergeColumn;
-            $data["mergeRow"] = $mergeRow;
+            if($mergeRow)$data["mergeRow"] = $mergeRow;
             $request["createFormat"] = "merge";
         }
         $request["data"] = json_encode($data,JSON_UNESCAPED_UNICODE);

+ 18 - 1
app/StationTask.php

@@ -6,5 +6,22 @@ use Illuminate\Database\Eloquent\Model;
 
 class StationTask extends Model
 {
-    protected $fillable = ['status',];
+    protected $fillable = ['status'];
+
+
+    public function taskCommodities()
+    {   //任务商品列表
+        return $this->belongsToMany(StationTaskCommodity::class,"station_task_children","station_task_id","station_task_table_id")
+            ->where("station_task_table_type","station_task_commodities");
+    }
+    public function taskBatches()
+    {   //任务波次 目前为单个,取值时应取第一个即可
+        return $this->belongsToMany(StationTaskBatch::class,"station_task_children","station_task_id","station_task_table_id")
+            ->where("station_task_table_type","station_task_batches");
+    }
+    public function taskMaterialBoxes()
+    {   //任务料箱
+        return $this->belongsToMany(StationTaskMaterialBox::class,"station_task_children","station_task_id","station_task_table_id")
+            ->where("station_task_table_type","station_task_material_boxes");
+    }
 }

+ 6 - 1
app/StationTaskBatch.php

@@ -6,5 +6,10 @@ use Illuminate\Database\Eloquent\Model;
 
 class StationTaskBatch extends Model
 {
-    protected $fillable=['batch_id','station_id','station_mission_batch_type_id','status'];
+    protected $fillable=['batch_id','station_id','station_task_batch_type_id','status'];
+
+    public function batch()
+    {   //波次
+        return $this->hasOne(Batch::class,"id","batch_id");
+    }
 }

+ 15 - 0
app/StationTaskChildren.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class StationTaskChildren extends Model
+{
+    protected $table="station_task_children";
+    protected $fillable=[
+        "station_task_id",
+        "station_task_table_type",
+        "station_task_table_id",
+    ];
+}

+ 10 - 1
app/StationTaskCommodity.php

@@ -6,5 +6,14 @@ use Illuminate\Database\Eloquent\Model;
 
 class StationTaskCommodity extends Model
 {
-    protected $fillable= ['station_id','material_box_id','commodity_id','amount','order_id','status'];
+    protected $fillable= ['station_id','material_box_id','commodity_id','amount','order_id','status',"bin_number"];
+
+    public function commodity()
+    {   //商品
+        return $this->hasOne(Commodity::class,"id","commodity_id");
+    }
+    public function materialBox()
+    {   //料箱
+        return $this->hasOne(MaterialBox::class,"id","material_box_id");
+    }
 }

+ 5 - 0
app/StationTaskMaterialBox.php

@@ -7,4 +7,9 @@ use Illuminate\Database\Eloquent\Model;
 class StationTaskMaterialBox extends Model
 {
     protected $fillable=['station_id','material_box_id','status'];
+
+    public function box()
+    {   //料箱
+        return $this->hasOne(MaterialBox::class,"id","material_box_id");
+    }
 }

+ 7 - 0
app/StationTypeBinMonitor.php

@@ -7,4 +7,11 @@ use Illuminate\Database\Eloquent\Model;
 class StationTypeBinMonitor extends Model
 {
     protected $fillable=['station_id','bin_row_length','bin_column_length','bin_wall_amount'];
+
+    public static $default=[
+        "station_id"        => null,
+        "bin_row_length"    => 2,
+        "bin_column_length" => 4,
+        "bin_wall_amount"   => 2,
+    ];
 }

+ 2 - 2
composer.json

@@ -29,7 +29,7 @@
         "pusher/pusher-php-server": "^4.1",
         "te7a-houdini/laravel-trix": "^2.0",
         "yajra/laravel-oci8": "7.0",
-      "ext-bcmath": "*"
+        "ext-bcmath": "*"
     },
     "require-dev": {
         "barryvdh/laravel-debugbar": "^3.2",
@@ -81,4 +81,4 @@
             "@php artisan key:generate --ansi"
         ]
     }
-}
+}

Разница между файлами не показана из-за своего большого размера
+ 401 - 112
composer.lock


+ 1 - 2
config/api.php

@@ -46,8 +46,7 @@ return [
         'storage'=>[
 //            'relocate' => "http://59.37.126.227:65448/api/haiqEss/gr/relocate",
             'moveBin' => "http://192.168.1.201:2011/api/haiqEss/gr/relocate",  //移动料箱
-            'lightOn' => "http://192.168.1.201:2011/api/ptl/curlPTL",  //亮灯
-            'lightOff' => "",  //灭灯
+            'light' => "http://192.168.1.201:40000/api/haiqEss/ctlPTL",  //控灯
         ],
     ],
 

+ 0 - 2
config/app.php

@@ -174,7 +174,6 @@ return [
          App\Providers\BroadcastServiceProvider::class,
         App\Providers\EventServiceProvider::class,
         App\Providers\RouteServiceProvider::class,
-
     ],
 
     /*
@@ -225,7 +224,6 @@ return [
         'URL' => Illuminate\Support\Facades\URL::class,
         'Validator' => Illuminate\Support\Facades\Validator::class,
         'View' => Illuminate\Support\Facades\View::class,
-
     ],
 
 ];

+ 13 - 0
database/factories/BarcodeFactory.php

@@ -0,0 +1,13 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\CommodityBarcode;
+use Faker\Generator as Faker;
+
+$factory->define(CommodityBarcode::class, function (Faker $faker) {
+    return [
+        'code' => md5(\Illuminate\Support\Str::random(8)).date('Ymd'),
+        'commodity_id'=>factory(\App\Commodity::class),
+    ];
+});

+ 10 - 1
database/factories/BatchFactory.php

@@ -6,7 +6,16 @@ use App\Batch;
 use Faker\Generator as Faker;
 
 $factory->define(Batch::class, function (Faker $faker) {
+    $status = ['未处理','已处理','取消','处理中','挂起','异常'];
+    $type = ['无'];
     return [
-        //
+        'code' => $faker->uuid,
+        'type' => '无',
+        'wms_type' =>$faker->name,
+        'status' => $status[rand(0,count($status)-1)],
+        'wms_status' =>$faker->name,
+        'wms_created_at'=> $faker->date(),
+        'remark' => $faker->text(20),
+        'owner_id' => 1,
     ];
 });

+ 1 - 1
database/factories/MaterialBoxFactory.php

@@ -7,6 +7,6 @@ use Faker\Generator as Faker;
 
 $factory->define(MaterialBox::class, function (Faker $faker) {
     return [
-        //
+        'code'=>md5(\Illuminate\Support\Str::random(5)).date('Ymd')
     ];
 });

+ 1 - 0
database/factories/OrcaleDOCOrderHeaderFactory.php

@@ -9,6 +9,7 @@ $factory->define(OracleDOCOrderHeader::class, function (Faker $faker) {
     return [
         'orderno' => $faker->uuid,
         'customerid' => '',
+        'waveno' => '',
         'ordertime' =>$faker->time(),
         'soreference1' => $faker->uuid,
         'consigneeid' => '',

+ 24 - 0
database/factories/OrderCountingRecordFactory.php

@@ -0,0 +1,24 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\Logistic;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
+use Faker\Generator as Faker;
+use Illuminate\Database\Eloquent\Factory;
+
+$factory->define(OrderCountingRecord::class, function (Faker $faker) {
+    return [
+        'owner_id' => $faker->numberBetween(0, 100),
+        'shop_id' => $faker->numberBetween(0, 100),
+        'warehouse_id' => $faker->numberBetween(0, 100),
+        'logistic_id' => $faker->numberBetween(0, 100),
+        'date_target' => Carbon::now()->toDateString(),
+        'counting_unit' => '日',
+        'amount' => $faker->numberBetween(0, 100),
+    ];
+});

+ 16 - 0
database/factories/StationTaskBatchFactory.php

@@ -0,0 +1,16 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\StationTaskBatch;
+use Faker\Generator as Faker;
+
+$factory->define(StationTaskBatch::class, function (Faker $faker) {
+    $status = ['待处理','挂起','处理中','完成','异常','取消'];
+    return [
+        'batch_id' => factory(\App\Batch::class),
+        'station_id' => factory(\App\Station::class),
+        'station_task_batch_type_id' => factory(\App\StationTaskBatchType::class),
+        "status"=>$status[array_rand($status)],
+    ];
+});

+ 14 - 0
database/factories/StationTaskChildrenFactory.php

@@ -0,0 +1,14 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\StationTaskChildren;
+use Faker\Generator as Faker;
+
+$factory->define(StationTaskChildren::class, function (Faker $faker) {
+    return [
+        "station_task_id" => factory(\App\StationTask::class),
+        "station_task_table_type" => \Illuminate\Support\Str::random(5),
+        "station_task_table_id" => rand(1,5),
+    ];
+});

+ 19 - 0
database/factories/StationTaskCommodityFactory.php

@@ -0,0 +1,19 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\StationTaskCommodity;
+use Faker\Generator as Faker;
+
+$factory->define(StationTaskCommodity::class, function (Faker $faker) {
+    $status = ['待处理','挂起','处理中','完成','异常','取消'];
+    return [
+        'station_id' => factory(\App\Station::class),
+        'material_box_id' => factory(\App\MaterialBox::class),
+        'commodity_id' => factory(\App\Commodity::class),
+        'amount'=>rand(1,1000),
+        "bin_number"=>rand(1,24),
+        'order_id'=>factory(\App\Order::class),
+        "status"=>$status[array_rand($status)],
+    ];
+});

+ 2 - 1
database/factories/StationTaskFactory.php

@@ -6,7 +6,8 @@ use App\StationTask;
 use Faker\Generator as Faker;
 
 $factory->define(StationTask::class, function (Faker $faker) {
+    $status = ['待处理','挂起','处理中','完成','异常','取消'];
     return [
-        //
+        "status"=>$status[array_rand($status)],
     ];
 });

+ 4 - 1
database/factories/StationTypeBinMonitorFactory.php

@@ -7,6 +7,9 @@ use Faker\Generator as Faker;
 
 $factory->define(StationTypeBinMonitor::class, function (Faker $faker) {
     return [
-        //
+        'station_id' => factory(\App\Station::class),
+        'bin_row_length' => rand(1,20),
+        'bin_column_length' => rand(1,20),
+        'bin_wall_amount' => rand(1,20),
     ];
 });

+ 3 - 3
database/migrations/2020_12_02_150054_create_order_commodity_assigns_table.php

@@ -8,9 +8,9 @@ class CreateOrderCommodityAssignsTable extends Migration
 {
 
     protected $authorities = [
-        "商品配置",
-        "商品配置-查询",
-        "商品配置-编辑",
+        "订单管理-指定分配",
+        "订单管理-指定分配-查询",
+        "订单管理-指定分配-编辑",
     ];
     /**
      * Run the migrations.

+ 36 - 0
database/migrations/2020_12_07_114859_add_order_counting_records_year_month_week.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOrderCountingRecordsYearMonthWeek extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_counting_records', function (Blueprint $table) {
+            $table->string('year')->nullable();
+            $table->string('week')->nullable();
+            $table->string('month')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_counting_records', function (Blueprint $table) {
+            $table->dropColumn('year');
+            $table->dropColumn('week');
+            $table->dropColumn('month');
+        });
+    }
+}

+ 54 - 0
database/migrations/2020_12_12_093011_change_authorities_order_assign.php

@@ -0,0 +1,54 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeAuthoritiesOrderAssign extends Migration
+{
+
+    protected $changeNames=[
+
+        ["指定分配","订单管理-指定分配"],
+        ["指定分配-查询","订单管理-指定分配-查询"],
+        ["指定分配-编辑","订单管理-指定分配-编辑"],
+        ["商品配置","订单管理-指定分配"],
+        ["商品配置-查询","订单管理-指定分配-查询"],
+        ["商品配置-编辑","订单管理-指定分配-编辑"],
+    ];
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        //修改或没有则添加
+        foreach ($this->changeNames as $namePack){
+            $authority=Authority::where('name',$namePack[0])->orWhere('name',$namePack[1])->first();
+            if(!$authority){
+                (new Authority(['name'=>$namePack[1],'alias_name'=>$namePack[1]]))->save();
+            }elseif($authority['name']==$namePack[0]){
+                $authority['name']=$namePack[1];
+                $authority['alias_name']=$namePack[1];
+                $authority->save();
+            }
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //改回旧的
+        foreach ($this->changeNames as $namePack){
+            $authority=Authority::where('name',$namePack[1])->first();
+            $authority['name']=$namePack[0];
+            $authority->save();
+        }
+    }
+}

+ 6 - 1
package-lock.json

@@ -5533,6 +5533,11 @@
                 }
             }
         },
+        "jsbarcode": {
+            "version": "3.11.3",
+            "resolved": "https://registry.npm.taobao.org/jsbarcode/download/jsbarcode-3.11.3.tgz",
+            "integrity": "sha1-HI+5tcfURS5XGTCAGwDhIJSnBR4="
+        },
         "jsbn": {
             "version": "0.1.1",
             "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
@@ -6254,7 +6259,7 @@
         },
         "minimist": {
             "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+            "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
             "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
             "dev": true
         },

+ 1 - 0
package.json

@@ -30,6 +30,7 @@
     "element-ui": "^2.14.1",
     "jquery.cookie": "^1.4.1",
     "js-cookie": "^2.2.1",
+    "jsbarcode": "^3.11.3",
     "laravel-echo": "^1.8.0",
     "laravel-echo-server": "^1.6.2",
     "moment": "^2.28.0",

BIN
public/images/QRCodeIMG/3.png


+ 0 - 1
public/images/QRCodeIMG/readme.txt

@@ -1 +0,0 @@
-生成二维码文件夹用的参照物,请勿删除

BIN
public/images/QRCodeIMG/undefined.png


+ 1 - 1
resources/js/app.js

@@ -9,6 +9,6 @@ window.ElementUI=require('./utilities/tempTip');
 window.getGetVal=require('./utilities/getGetVal');
 window.scanner=require('./utilities/scanner');
 window.datetimeRelating=require('./utilities/datetimeRelating');
-window.Vue.use(window.ElementUI)
+window.Vue.use(window.ElementUI);
 require('bootstrap-select');
 

+ 5 - 0
resources/js/queryForm/export.js

@@ -4,6 +4,11 @@ function excelExport(checkAllSign,checkData,url,sum,token,reservation = null) {
         if (sum > 10000){
             if (!confirm('导出条数超过一万条,耗时可能过长,您确定继续吗?'))return;
         }
+        if (sum > 1000000){
+            tempTip.setDuration(3000);
+            tempTip.showSuccess('导出条数超过百万条,超出最大执行条目!');
+            return;
+        }
         let thisUrl=document.URL;
         let parameter=thisUrl.split('?',2);
         url += "?checkAllSign=true";

+ 15 - 0
resources/js/utilities/barcode.js

@@ -0,0 +1,15 @@
+
+import JsBarcode from 'jsbarcode'
+
+window.setBarcode = function setBarcode(val, dom='barcode', width=2, height=40, isShowValue=false){
+    if (!val)return;
+    JsBarcode(dom, val, {
+        format: 'CODE39',
+        lineColor: '#000',
+        background: '#EBEEF5',
+        width: width,
+        height: height,
+        displayValue: isShowValue
+    });
+};
+

+ 18 - 0
resources/js/utilities/tempTip.js

@@ -117,6 +117,24 @@ const tempTip={
         $('body').append(tiper);
         $input.focus()
     },
+    postBasicRequest(url, params, successMsg, successExe, isPriority = false) {
+        if (isPriority)this.setIndex(1099);
+        window.axios.post(url,params).then(res=> {
+            if (res.data.success){
+                successExe(res.data.data);
+                if (successMsg){
+                    this.setDuration(2000);
+                    this.showSuccess(successMsg);
+                }
+                return;
+            }
+            this.setDuration(3000);
+            this.show(res.data.data);
+        }).catch(function (err) {
+            this.setDuration(3000);
+            this.show('网络异常:'+err);
+        });
+    }
 };
 module.exports=tempTip;
 

+ 203 - 41
resources/views/control/panel.blade.php

@@ -26,6 +26,11 @@
                 <div class="col-sm col-lg-2 col-xl-2 col-md-2">
                     <div class="card">
                         <div class="card-header text-dark h5">
+                            {{--                            <p><select name="" id="">--}}
+                            {{--                                    <option value="i+1980"  v-for="i in (new Array(30).keys())" :selected="year(widgets.orderAmount.startAt)==i+1980">--}}
+                            {{--                                        @{{i+1980}}--}}
+                            {{--                                    </option>--}}
+                            {{--                                </select></p>--}}
                             <p>实时待处理订(总):@{{ totalOrders.total }}</p>
                         </div>
                         <div class="card-body">
@@ -33,21 +38,21 @@
                             <p>分配完成:@{{ totalOrders.assignedComplete }}</p>
                             <p>部分分配:@{{ totalOrders.partialAllocation }}</p>
                             <p>部分装箱:@{{ totalOrders.partPacking }}</p>
-                            <p>播种完成:@{{ totalOrders.sowComplete }}</p>
+                            <p>分拨完成:@{{ totalOrders.sowComplete }}</p>
                         </div>
                     </div>
                 </div>
                 <div class="col-sm col-lg-2 col-xl-2 col-md-2" v-for="(warehousesOrder,index) in warehousesOrders">
                     <div class="card">
                         <div class="card-header text-success h5">
-                            <p>@{{ getWareHouse(warehousesOrder.name) }}:@{{ warehousesOrder.total }}</p>
+                            <p>@{{ getWareHouse(warehousesOrder.code) }}:@{{ warehousesOrder.total }}</p>
                         </div>
                         <div class="card-body">
                             <p>创建订单:@{{ warehousesOrder.createOrder }}</p>
                             <p>分配完成:@{{ warehousesOrder.assignedComplete }}</p>
                             <p>部分分配:@{{ warehousesOrder.partialAllocation }}</p>
                             <p>部分装箱:@{{ warehousesOrder.partPacking }}</p>
-                            <p>播种完成:@{{ warehousesOrder.sowComplete }}</p>
+                            <p>分拨完成:@{{ warehousesOrder.sowComplete }}</p>
                         </div>
                     </div>
                 </div>
@@ -56,27 +61,77 @@
                 <div class="col-sm col-lg-5  col-xl-5 col-md-5">
                     <div class="card">
                         <div class="card-header">
-                            <span class="demonstration"></span>
-                            <el-date-picker @blur="orderCountingRecordApi('')"
-                                            v-model="orderCountingRecordsDate"
-                                            type="daterange"
-                                            align="right"
-                                            unlink-panels
-                                            range-separator="-"
-                                            start-placeholder="开始日期"
-                                            end-placeholder="结束日期"
-                                            value-format="yyyy-MM-dd"
-                                            :picker-options="pickerOptions">
-                            </el-date-picker>
+                            <div class="block">
+                                <span v-show="orderCountingRecordsDayShow" class="demonstration">起始日期</span>
+                                <el-date-picker
+                                    @blur="orderCountingRecordApi('')"
+                                    v-show="orderCountingRecordsDayShow"
+                                    v-model="orderCountingRecordsStart"
+                                    type="date"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选起始日期">
+                                </el-date-picker>
+
+                                <span v-show="orderCountingRecordsDayShow" class="demonstration">结束日期</span>
+                                <el-date-picker
+                                    @blur="orderCountingRecordApi('')"
+                                    v-show="orderCountingRecordsDayShow"
+                                    v-model="orderCountingRecordsEnd"
+                                    type="date"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择结束日期">
+                                </el-date-picker>
+
+                                <span v-show="orderCountingRecordsMonthShow" class="demonstration">起始月</span>
+                                <el-date-picker
+                                    @blur="orderCountingRecordApi('')"
+                                    v-show="orderCountingRecordsMonthShow"
+                                    v-model="orderCountingRecordsStart"
+                                    type="month"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择起始月">
+                                </el-date-picker>
+
+                                <span v-show="orderCountingRecordsMonthShow" class="demonstration">结束月</span>
+                                <el-date-picker
+                                    @blur="orderCountingRecordApi('')"
+                                    v-show="orderCountingRecordsMonthShow"
+                                    v-model="orderCountingRecordsEnd"
+                                    type="month"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择结束月">
+                                </el-date-picker>
+
+                                <span v-show="orderCountingRecordsYearShow" class="demonstration">起始年</span>
+                                <el-date-picker
+                                    @blur="orderCountingRecordApi('')"
+                                    v-show="orderCountingRecordsYearShow"
+                                    v-model="orderCountingRecordsStart"
+                                    type="year"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择年">
+                                </el-date-picker>
+
+                                <span v-show="orderCountingRecordsYearShow" class="demonstration">结束年</span>
+                                <el-date-picker
+                                    @blur="orderCountingRecordApi('')"
+                                    v-show="orderCountingRecordsYearShow"
+                                    v-model="orderCountingRecordsEnd"
+                                    type="year"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择年">
+                                </el-date-picker>
+                            </div>
+
                             <el-button type="primary" value="日" @click="orderCountingRecordApi('日')"
                                        v-model="orderCountingRecordsUnit">日
                             </el-button>
-                            <el-button type="primary" value="周" @click="orderCountingRecordApi('周')"
-                                       v-model="orderCountingRecordsUnit">周
-                            </el-button>
                             <el-button type="primary" value="月" @click="orderCountingRecordApi('月')"
                                        v-model="orderCountingRecordsUnit">月
                             </el-button>
+                            <el-button type="primary" value="年" @click="orderCountingRecordApi('年')"
+                                       v-model="orderCountingRecordsUnit">年
+                            </el-button>
                         </div>
                         <div class="card-body row">
                             <div v-show="orderCountingRecordsShow" id="orderCountingRecords" class="col"
@@ -154,26 +209,89 @@
                         <div class="card">
                             <div class="card-header">
                                 <span class="demonstration"></span>
-                                <el-date-picker @blur="laborReportsCountingRecordApi('')"
-                                                v-model="laborReportsCountingRecordsDate"
-                                                type="daterange"
-                                                align="right"
-                                                unlink-panels
-                                                range-separator="-"
-                                                start-placeholder="开始日期"
-                                                end-placeholder="结束日期"
-                                                value-format="yyyy-MM-dd"
-                                                :picker-options="pickerOptions">
-                                </el-date-picker>
+{{--                                <el-date-picker @blur="laborReportsCountingRecordApi('')"--}}
+{{--                                                v-model="laborReportsCountingRecordsDate"--}}
+{{--                                                type="daterange"--}}
+{{--                                                align="right"--}}
+{{--                                                unlink-panels--}}
+{{--                                                range-separator="-"--}}
+{{--                                                start-placeholder="开始日期"--}}
+{{--                                                end-placeholder="结束日期"--}}
+{{--                                                value-format="yyyy-MM-dd"--}}
+{{--                                                :picker-options="pickerOptions">--}}
+{{--                                </el-date-picker>--}}
+
+                                <div class="block">
+                                    <span v-show="laborReportsCountingRecordsDayShow" class="demonstration">起始日期</span>
+                                    <el-date-picker
+                                        @blur="laborReportsCountingRecordApi('')"
+                                        v-show="laborReportsCountingRecordsDayShow"
+                                        v-model="laborReportsCountingRecordsStart"
+                                        type="date"
+                                        value-format="yyyy-MM-dd"
+                                        placeholder="选起始日期">
+                                    </el-date-picker>
+
+                                    <span v-show="laborReportsCountingRecordsDayShow" class="demonstration">结束日期</span>
+                                    <el-date-picker
+                                        @blur="laborReportsCountingRecordApi('')"
+                                        v-show="laborReportsCountingRecordsDayShow"
+                                        v-model="laborReportsCountingRecordsEnd"
+                                        type="date"
+                                        value-format="yyyy-MM-dd"
+                                        placeholder="选择结束日期">
+                                    </el-date-picker>
+
+                                    <span v-show="laborReportsCountingRecordsMonthShow" class="demonstration">起始月</span>
+                                    <el-date-picker
+                                        @blur="laborReportsCountingRecordApi('')"
+                                        v-show="laborReportsCountingRecordsMonthShow"
+                                        v-model="laborReportsCountingRecordsStart"
+                                        type="month"
+                                        value-format="yyyy-MM-dd"
+                                        placeholder="选择起始月">
+                                    </el-date-picker>
+
+                                    <span v-show="laborReportsCountingRecordsMonthShow" class="demonstration">结束月</span>
+                                    <el-date-picker
+                                        @blur="laborReportsCountingRecordApi('')"
+                                        v-show="laborReportsCountingRecordsMonthShow"
+                                        v-model="laborReportsCountingRecordsEnd"
+                                        type="month"
+                                        value-format="yyyy-MM-dd"
+                                        placeholder="选择结束月">
+                                    </el-date-picker>
+
+                                    <span v-show="laborReportsCountingRecordsYearShow" class="demonstration">起始年</span>
+                                    <el-date-picker
+                                        @blur="laborReportsCountingRecordApi('')"
+                                        v-show="laborReportsCountingRecordsYearShow"
+                                        v-model="laborReportsCountingRecordsStart"
+                                        type="year"
+                                        value-format="yyyy-MM-dd"
+                                        placeholder="选择年">
+                                    </el-date-picker>
+
+                                    <span v-show="laborReportsCountingRecordsYearShow" class="demonstration">结束年</span>
+                                    <el-date-picker
+                                        @blur="laborReportsCountingRecordApi('')"
+                                        v-show="laborReportsCountingRecordsYearShow"
+                                        v-model="laborReportsCountingRecordsEnd"
+                                        type="year"
+                                        value-format="yyyy-MM-dd"
+                                        placeholder="选择年">
+                                    </el-date-picker>
+                                </div>
+
                                 <el-button type="primary" value="日" @click="laborReportsCountingRecordApi('日')"
                                            v-model="laborReportsCountingRecordUnit">日
                                 </el-button>
-                                <el-button type="primary" value="周" @click="laborReportsCountingRecordApi('周')"
-                                           v-model="laborReportsCountingRecordUnit">周
-                                </el-button>
                                 <el-button type="primary" value="月" @click="laborReportsCountingRecordApi('月')"
                                            v-model="laborReportsCountingRecordUnit">月
                                 </el-button>
+                                <el-button type="primary" value="年" @click="laborReportsCountingRecordApi('年')"
+                                           v-model="laborReportsCountingRecordUnit">年
+                                </el-button>
                             </div>
                             <div class="card-body row">
                                 <div v-show="laborReportsCountingRecordsShow" id="laborReportsCountingRecords"
@@ -290,6 +408,16 @@
                 warehouseCountingRecordsShow: true,
                 laborReportsCountingRecordsShow: true,
                 laborReportsUserGroupsCountShow: true,
+                orderCountingRecordsDayShow: true,
+                orderCountingRecordsMonthShow: false,
+                orderCountingRecordsYearShow: false,
+                orderCountingRecordsStart: moment().subtract('1', 'month').format('yyyy-MM-DD'),
+                orderCountingRecordsEnd: moment(new Date()).format('yyyy-MM-DD'),
+                laborReportsCountingRecordsDayShow: true,
+                laborReportsCountingRecordsMonthShow: false,
+                laborReportsCountingRecordsYearShow:false ,
+                laborReportsCountingRecordsStart: moment().subtract('1', 'month').format('yyyy-MM-DD'),
+                laborReportsCountingRecordsEnd: moment(new Date()).format('yyyy-MM-DD'),
             },
             mounted: function () {
                 $('#list').removeClass('d-none');
@@ -330,11 +458,10 @@
                     return this.warehouses[code];
                 },
                 initOrderCountingRecords() {
-                    let _this = this;
-                    this.orderCountingRecords.forEach(function (item) {
-                        _this.orderCountingRecordsDateTarget.push(item.date_target);
-                        _this.orderCountingRecordsData.push(item.counter);
-                    });
+                    for (let key in this.orderCountingRecords) {
+                        this.orderCountingRecordsDateTarget.push(this.orderCountingRecords[key].date_target);
+                        this.orderCountingRecordsData.push(this.orderCountingRecords[key].counter);
+                    }
                 },
                 initOrderCountingRecordsChart() {
                     this.orderCountingRecordsChart.setOption({
@@ -466,10 +593,27 @@
                     if (orderCountingRecordsUnit === '') {
                         orderCountingRecordsUnit = this.orderCountingRecordsUnit;
                     }
+                    switch (orderCountingRecordsUnit) {
+                        case '日':
+                            this.orderCountingRecordsDayShow = true;
+                            this.orderCountingRecordsMonthShow = false;
+                            this.orderCountingRecordsYearShow = false;
+                            break;
+                        case '月':
+                            this.orderCountingRecordsDayShow = false;
+                            this.orderCountingRecordsMonthShow = true;
+                            this.orderCountingRecordsYearShow = false;
+                            break;
+                        case '年':
+                            this.orderCountingRecordsDayShow = false;
+                            this.orderCountingRecordsMonthShow = false;
+                            this.orderCountingRecordsYearShow = true;
+                            break;
+                    }
                     this.orderCountingRecordsUnit = orderCountingRecordsUnit;
                     let formData = new FormData();
-                    formData.append('start', this.orderCountingRecordsDate[0]);
-                    formData.append('end', this.orderCountingRecordsDate[1]);
+                    formData.append('start', this.orderCountingRecordsStart);
+                    formData.append('end', this.orderCountingRecordsEnd);
                     formData.append('unit', orderCountingRecordsUnit);
                     this.orderCountingRecordsShow = false;
                     let _this = this;
@@ -521,9 +665,27 @@
                         laborReportsCountingRecordUnit = this.laborReportsCountingRecordUnit;
                     }
                     this.laborReportsCountingRecordUnit = laborReportsCountingRecordUnit;
+                    switch (laborReportsCountingRecordUnit) {
+                        case '日':
+                            this.laborReportsCountingRecordsDayShow = true;
+                            this.laborReportsCountingRecordsMonthShow = false;
+                            this.laborReportsCountingRecordsYearShow = false;
+                            break;
+                        case '月':
+                            this.laborReportsCountingRecordsDayShow = false;
+                            this.laborReportsCountingRecordsMonthShow = true;
+                            this.laborReportsCountingRecordsYearShow = false;
+                            break;
+                        case '年':
+                            this.laborReportsCountingRecordsDayShow = false;
+                            this.laborReportsCountingRecordsMonthShow = false;
+                            this.laborReportsCountingRecordsYearShow = true;
+                            break;
+                    }
+
                     let formData = new FormData();
-                    formData.append('start', this.laborReportsCountingRecordsDate[0]);
-                    formData.append('end', this.laborReportsCountingRecordsDate[1]);
+                    formData.append('start', this.laborReportsCountingRecordsStart);
+                    formData.append('end', this.laborReportsCountingRecordsEnd);
                     formData.append('unit', laborReportsCountingRecordUnit);
                     let _this = this;
                     axios.post('{{url('apiLocal/control/panel/menu/laborReportsCountingRecordApi')}}', formData).then(function (res) {

+ 10 - 5
resources/views/maintenance/priceModel/express/index.blade.php

@@ -83,14 +83,20 @@
                     window.axios.post("{{url('maintenance/priceModel/express/getDetail')}}", {id:model.id})
                         .then(res=>{
                             if (res.data.success){
-                                this.details[model.id] = res.data.data;
-                                this.$forceUpdate();
+                                if (res.data.data.length>0){
+                                    this.details[model.id] = res.data.data;
+                                    this.$forceUpdate();
+                                }else {
+                                    this.details[model.id] = [];
+                                    this.addDetail();
+                                }
                                 $("#detailModal").modal("show");
                                 return;
                             }
                             window.tempTip.setDuration(3000);
                             window.tempTip.show(res.data.data);
                         }).catch(err=>{
+                            console.log(err);
                         window.tempTip.setDuration(3000);
                         window.tempTip.show("网络错误:"+err);
                     });
@@ -132,9 +138,8 @@
                 },
                 addDetail(){
                     if (this.provinces === null){
-                        window.axios.post('{{url('maintenance/province/get')}}')
-                            .then(res=>{
-                                this.provinces = res.data;
+                        window.tempTip.postBasicRequest('{{url('maintenance/province/get')}}',{},undefined,data=>{
+                            this.provinces = data;
                         });
                     }
                     this.details[this.id].unshift({

+ 1 - 1
resources/views/order/index/_importModal.blade.php

@@ -14,7 +14,7 @@
                 <div class="mt-5 mb-5">
                     <input id="file" type="file" class="d-none" accept=".csv, .xlsx, .xls" @change="importAssign($event)"/>
                     <label class="w-100 text-center small"><b>表头示例:</b><label class="text-primary">订单编号  商品条码  数量  生产日期  失效日期</label></label>
-                    <label class="w-100 row d-block ml-1"><input type="button" class="btn btn-dark col-6 offset-3" value="导入商品配置" @click="selectFile()"></label>
+                    <label class="w-100 row d-block ml-1"><input type="button" class="btn btn-dark col-6 offset-3" value="导入指定分配" @click="selectFile()"></label>
                 </div>
             </div>
             <div class="modal-footer">

+ 31 - 4
resources/views/order/index/delivering.blade.php

@@ -39,6 +39,7 @@
                         <button class="btn btn-sm ml-2" :class="[checkData.length>0?'btn-dark':'btn-outline-danger']" @click="isRejectedBillExist()"
                             style="opacity: 0.7">生成退货单</button>
                     @endcan
+                    <button class="btn btn-sm ml-2 btn-primary" v-if="checkData.length>0" @click="copyLogisticNumber()">复制快递单号</button>
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -100,7 +101,7 @@
                         <td class="text-nowrap"> @{{ order.warehouseid }}</td>
                         <td class="text-nowrap"><span v-if="order.edisendflag2=='Y'">是</span><span v-if="order.edisendflag2=='N'">否</span><span v-if="order.edisendflag2=='W'">错误</span></td>
                         <td class="text-nowrap">@{{ order.edisendtime2 }}</td>
-                        <td colspan="6" class="text-center">
+                        <td colspan="7" class="text-center">
                             <table v-if="commodities[order.orderno]&&commodities[order.orderno].length==1 || isBtn[order.orderno]" class="table text-nowrap table-sm">
                                 <tr v-for="oracleDOCOrderDetail in commodities[order.orderno]">
                                     <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.sku }}</div></td>
@@ -110,12 +111,13 @@
                                         <div class="text-nowrap tooltipTarget"  style="display: none;cursor:pointer" @dblclick="truncateText($event)" title="双击收起全部">@{{ oracleDOCOrderDetail.descr_c  }}</div>
 {{--                                        <div :title="oracleDOCOrderDetail.descr_c" class="tooltipTarget" style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.descr_c }}</div>--}}
                                     </td>
-                                    <td>@{{ oracleDOCOrderDetail.qtyordered }}</td>
+                                    <td><div style="min-width: 100px">@{{ oracleDOCOrderDetail.qtyordered }}</div></td>
+                                    <td><div style="min-width: 150px">@{{ oracleDOCOrderDetail.lotnum }}</div></td>
                                     <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.orderdetailcodename }}</div></td>
                                     <td><div style="width: 180px;overflow: hidden">@{{ oracleDOCOrderDetail.checktime }}</div></td>
                                 </tr>
                                 <tr v-if="isBtn[order.orderno]">
-                                    <td colspan="6">
+                                    <td colspan="7">
                                         <b style="cursor:pointer;color: #4aa0e6;" @click="isBtn[order.orderno]=false;">点击收起明细</b>
                                     </td>
                                 </tr>
@@ -363,6 +365,7 @@
                     {name:'alternate_sku1',value: '产品条码', neglect: true, style:"min-width: 150px"},
                     {name:'descr_c',value: '产品名称', neglect: true, style:"min-width: 180px"},
                     {name:'qtyordered',value: '订单数量', neglect: true},
+                    {name:'lotnum',value: '批次号', style:"min-width: 150px"},
                     {name:'orderdetailcodename',value: '明细状态', neglect: true, style:"min-width: 150px"},
                     {name:'checktime',value: '复核时间', neglect: true},
                     {name:'notes',value: '备注', style:"min-width: 260px"},
@@ -492,7 +495,6 @@
                             tempTip.show('标记勾选内容冻结失败,错误:'+response.data.fail_info);
                         }
                     }).catch(function (e) {
-                        alert('网络连接错误:'+e);
                         tempTip.setDuration(2500);
                         tempTip.show('标记勾选内容冻结失败,网络连接错误:'+e);
                     })
@@ -853,6 +855,31 @@
                 copyLogisticInfo(){
                     this.copyText(this.tagOrder.logisticInfo)
                 },
+                copyLogisticNumber(){
+                    let text="";
+                    this.checkData.forEach((code,i)=>{
+                        if (this.picktotraceidMap[code] && this.picktotraceidMap[code].length>1){console.log(1);
+                            this.picktotraceidMap[code].forEach((number,j)=>{
+                                text += number;
+                                if (i!==this.checkData.length-1 && j!==this.picktotraceidMap[code].length-1){
+                                    text += ",";
+                                }
+                            });
+                        }else{
+                            this.orders.some(order=>{
+                                if (order.orderno == code){
+                                    if (order.soreference5) {
+                                        text += order.soreference5;
+                                        if(i!==this.checkData.length-1)text += ",";
+                                    }
+                                    return true;
+                                }
+                            });
+                        }
+                    });
+                    if (!text)text = " ";
+                    this.copyText(text)
+                },
                 copyMerchantInfo(){
                     this.copyText(this.tagOrder.merchantInfo)
                 },

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

@@ -1,5 +1,5 @@
 @extends('layouts.app')
-@section('title')订单管理-商品配置@endsection
+@section('title')订单管理-指定分配@endsection
 
 @section('content')
     @component('order.index.menu')@endcomponent
@@ -122,4 +122,4 @@
         },
     });
 </script>
-@endsection
+@endsection

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

@@ -8,9 +8,9 @@
                     <li class="nav-item">
                         <a class="nav-link" href="{{url('order/index/delivering')}}" :class="{active:isActive('delivering',3)}">查询</a>
                     </li> @endcan
-                @can('商品配置')
+                @can('订单管理-指定分配')
                     <li class="nav-item">
-                        <a class="nav-link" href="{{url('order/index/commodityAssign')}}" :class="{active:isActive('commodityAssign',3)}">商品配置</a>
+                        <a class="nav-link" href="{{url('order/index/commodityAssign')}}" :class="{active:isActive('commodityAssign',3)}">指定分配</a>
                     </li> @endcan
             </ul>
         </div>

+ 6 - 6
resources/views/order/tracking/index.blade.php

@@ -110,12 +110,12 @@
                             @endcan
                         </td>
                         <td class="td-warm">
-                            @can('订单管理-跟踪-仓库编辑')
-                                <input class="form-control form-control-sm" :value="trackOrder.sale" @change="warehouseUpdate($event,'sale',trackOrder)" >
-                            @else
-                                @{{ trackOrder.sale }}
-                            @endcan
-                        </td>
+{{--                            @can('订单管理-跟踪-仓库编辑')--}}
+{{--                                <input class="form-control form-control-sm" :value="trackOrder.sale" @change="warehouseUpdate($event,'sale',trackOrder)" >--}}
+{{--                            @else--}}
+{{--                                @{{ trackOrder.sale }}--}}
+{{--                            @endcan--}}
+{{--                        </td>--}}
                         <td class="td-yellow">
                             @can('订单管理-跟踪-仓库编辑')
                                 <input class="form-control form-control-sm" :value="trackOrder.client" @change="warehouseUpdate($event,'client',trackOrder)" >

+ 29 - 0
resources/views/rejected/search/general.blade.php

@@ -59,6 +59,8 @@
                 @can('退货管理-编辑')
                     <a class="btn btn-sm btn-outline-dark" href="{{url('rejected/importRejectedNumber')}}" style="cursor: pointer">导入修改</a>
                 @endcan
+                <button class="btn btn-sm ml-2 btn-primary" v-if="rejectedBills_checkBoxes.length>0" @click="copyLogisticNumber()">复制快递单号</button>
+
                 <span for="checkSelectingAll" class="d-none" id="cloneCheckAll">
                     <input type="checkbox" class="form-control-sm tooltipTarget" title="全选"
                            id="checkSelectingAll" @click="checkBoxAllToggle($event)">
@@ -153,6 +155,7 @@
                 <div class="text-info h5 btn btn">{{$rejectedBills->count()}}/{{$rejectedBills->total()}}</div>
                 {{$rejectedBills->appends($paginateParams)->links()}}
             </div>
+            <label><textarea  id="clipboardDiv" style="opacity:0"></textarea></label>
         </div>
     </div>
 @endsection
@@ -307,6 +310,32 @@
                 }
             },
             methods:{
+                copyLogisticNumber(){
+                    let text="";
+                    this.rejectedBills_checkBoxes.forEach((id,i)=>{
+                        this.rejectedBills.some(bill=>{
+                            if (bill.id == id){
+                                text += bill.logistic_number_return;
+                                if (i!==this.rejectedBills_checkBoxes.length-1)text += ",";
+                                return true;
+                            }
+                        });
+                    });
+                    this.copyText(text)
+                },
+                copyText(text){
+                    try {
+                        $('#clipboardDiv').text(text).select().focus();
+                        document.execCommand("Copy");
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制成功')
+                    } catch (e) {
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制失败:'+e)
+                    }
+                },
                 updateRejectedBillRemark:function (e) {
                     let target = $(e.target);
                     let _this = this;

+ 49 - 0
resources/views/station/monitor/_svg.blade.php

@@ -0,0 +1,49 @@
+{{--<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="blue-cube"
+     viewBox="68 30 180 220" --}}{{--style="transform: rotate3d(0,0,60,40deg)"--}}{{-->
+    <defs>
+        <g id="cube" style="fill-opacity: .9;stroke-miterlimit: 0;">
+            <rect width="21" height="24" fill="#fff" stroke="#0079ad"
+                  transform="skewY(30)" />
+            <rect width="21" height="24" fill="#fff" stroke="#0079ad"
+                  transform="skewY(-30) translate(21 24.3)" />
+            <rect width="21" height="21" fill="#fff" stroke="#0079ad"
+                  transform="scale(1.41,.81) rotate(45) translate(0 -21)" />
+        </g>
+    </defs>
+    <defs>
+        <g id="exceptionCube" style="fill-opacity: .9;stroke-miterlimit: 0;">
+            <rect width="21" height="24" :fill="color" stroke="#0079ad"
+                  transform="skewY(30)" />
+            <rect width="21" height="24" :fill="color" stroke="#0079ad"
+                  transform="skewY(-30) translate(21 24.3)" />
+            <rect width="21" height="21" :fill="color" stroke="#0079ad"
+                  transform="scale(1.41,.81) rotate(45) translate(0 -21)" />
+        </g>
+    </defs>
+    <use v-for="box in boxes" :xlink:href="box.sign ? '#exceptionCube' : '#cube'" :x="box.x" :y="box.y" />
+</svg>--}}
+
+
+<svg width="579.9997059770881" height="399.999797225578" xmlns="http://www.w3.org/2000/svg">
+    <g>
+        <title>background</title>
+        <rect height="402" width="582" y="-1" x="-1" fill="#fff" id="canvas_background"/>
+        <g y="0" x="0" height="100%" width="100%" display="none" overflow="visible" id="canvasGrid">
+            <rect height="100%" width="100%" y="0" x="0" stroke-width="0" fill="url(#gridpattern)"/>
+        </g>
+    </g>
+    <g>
+        <title>Layer 1</title>
+        <line y2="228.67" x2="335.5" y1="229.67" x1="176.5" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_1"/>
+        <line y2="267.67" x2="177.5" y1="229.67" x1="177.5" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_4"/>
+        <line y2="266.67" x2="334.5" y1="229.67" x1="334.5" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_8"/>
+        <line y2="146.17" x2="190.5" y1="230.17" x1="176.5" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_10"/>
+        <line y2="228.67" x2="334.5" y1="141.67" x1="316.5" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" fill="none" id="svg_13"/>
+        <line y2="264.67" x2="334.5" y1="265.67" x1="177.5" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_14"/>
+        <line y2="145.835" x2="317.751" y1="146.835" x1="191.252" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_15"/>
+        <line y2="229.334" x2="334.25" y1="144.835" x1="317.751" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_16"/>
+        <line y2="181.835" x2="324.75" y1="182.335" x1="185.252" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_17"/>
+        <line y2="228.834" x2="224.751" y1="147.335" x1="231.751" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_18"/>
+        <line y2="228.834" x2="280.751" y1="145.835" x1="279.251" stroke-width="1.5" stroke-linejoin="undefined" stroke-linecap="undefined" stroke="#0000ff" fill="none" id="svg_19"/>
+    </g>
+</svg>

+ 133 - 67
resources/views/station/monitor/show.blade.php

@@ -11,7 +11,7 @@
                     </li>
         @endcomponent
     </div>
-    <div class="container-fluid body">
+    <div class="container-fluid body" id="container">
         <div class="card">
             <div class="card-body">
                 <div class="row border" style="opacity: 0.75">
@@ -22,99 +22,61 @@
                     <div class="col-4">
                         <div class="row">
                             <div class="col py-3 h4">
-                                波次号:nnnnnnnnnnn
+                                波次号:<b>@{{ task.taskBatch.batch.code }}</b>
                             </div>
                             <div class="col py-3 h4">
 
                             </div>
                         </div>
                         <div class="row">
-                            <div class="col py-3 h4">
-                            </div>
-                            <div class="col py-3 h4 text-muted">
-                                {条码}
+                            <div class="py-3 text-muted">
+                                <img id="barcode" alt="">
                             </div>
                         </div>
                         <div class="row">
                             <div class="col py-3 h4">
-                                料箱号:nnnnnnnnnnn
+                                料箱号:<b v-if="task.currentCommodityIndex!=-1">@{{task.taskCommodities[task.currentCommodityIndex]['materialBox']['code']}}</b>
                             </div>
                         </div>
-                        <div class="row pt-5">
-                            <div class="col"><img src="{{asset('images/demoBin.png')}}" alt="" class="img"></div>
+                        <div class="row pt-2">
+                            <div class="col">
+{{--                                @include("station.monitor._svg")--}}
+                                <img src="{{asset('images/demoBin.png')}}" alt="" class="img">
+                            </div>
                         </div>
                     </div>
                     <div class="col text-center">
                         <div class="row">
-                            <div class="col py-3 h4">
+                            <div class="col py-3 h4" v-for="wall in walls">
                                 <table class="table border">
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">6</span></td>
-                                        <td class="bg-info border p-0"><span style="opacity:0.25">7</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">8</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">9</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">10</span></td>
-                                    </tr>
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">1</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">2</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">3</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">4</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">5</span></td>
-                                    </tr>
-                                </table>
-                            </div>
-                            <div class="col py-3 h4">
-                                <table class="table border">
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">6</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">7</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">8</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">9</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">10</span></td>
-                                    </tr>
-                                    <tr>
-                                        <td class="border p-0"><span style="opacity:0.25">1</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">2</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">3</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">4</span></td>
-                                        <td class="border p-0"><span style="opacity:0.25">5</span></td>
+                                    <tr v-for="row in wall">
+                                        <td class="border p-0" v-for="column in row"
+                                            :class="task.currentCommodityIndex!=-1&&task.taskCommodities[task.currentCommodityIndex]['binNumber']==column ? 'bg-info' : ''">
+                                            <span style="opacity:0.25">@{{ column }}</span></td>
                                     </tr>
                                 </table>
                             </div>
                         </div>
-                        <div class="row">
-                            <div class="col py-1">数量</div>
-                            <div class="col py-1">0/0</div>
-                            <div class="col py-1 text-muted">异常</div>
-                            <div class="col py-1"></div>
+                        <div class="row mb-1">
+                            <div class="col-1 text-left font-weight-bold">数量:</div>
+                            <div class="col-2 text-left">@{{ task.sum }}/@{{ task.currentSum }}</div>
+                            <div class="col-1 offset-2 text-muted" v-if="error">异常:</div>
+                            <div class="col-6" v-if="error">@{{ error }}</div>
                         </div>
                         <div class="row">
                             <div class="col py-1">
-                                <table class="table table-striped border">
+                                <table class="table table-hover border">
                                     <tr class="text-muted">
                                         <th class="py-2">序号</th>
                                         <th class="py-2">商品</th>
                                         <th class="py-2">数量</th>
                                         <th class="py-2">条码</th>
                                     </tr>
-                                    <tr class="text-muted">
-                                        <td></td>
-                                        <td></td>
-                                        <td>0/0</td>
-                                        <td></td>
-                                    </tr>
-                                    <tr class="text-muted">
-                                        <td></td>
-                                        <td></td>
-                                        <td>0/0</td>
-                                        <td></td>
-                                    </tr>
-                                    <tr class="text-muted">
-                                        <td></td>
-                                        <td></td>
-                                        <td>0/0</td>
-                                        <td></td>
+                                    <tr class="text-muted" v-for="(taskCommodity,i) in task.taskCommodities" :class="taskCommodity.bg">
+                                        <td>@{{ i+1 }}</td>
+                                        <td>@{{ taskCommodity.name }}</td>
+                                        <td>@{{ taskCommodity.amount }}</td>
+                                        <td><small v-for="barcode in taskCommodity.barcodes">@{{ barcode.code }}</small><br></td>
                                     </tr>
                                 </table>
                             </div>
@@ -127,18 +89,122 @@
 @endsection
 
 @section('lastScript')
+    <script type="text/javascript" src="{{mix('js/utilities/barcode.js')}}"></script>
     <script>
         new Vue({
-            el:"#app",
+            el:"#container",
+            data:{
+                broadcastName : "{{config('database.redis.options.prefix').'presence-station-'.$station->id}}",
+                channelName : ".App\\Events\\BroadcastToStation",
+                task : {
+                    currentCommodityIndex : -1,
+                    taskCommodities:[
+                        /*{amount:"",binNumber:"",name:"",barcodes:[]},*/
+                    ],
+                    taskBatch:{
+                        batch:{
+                            code:"",
+                        },
+                    },
+                    box:{},
+                    sum : 0,
+                    currentSum : 0,
+                },
+                boxes:[],
+                walls:[],
+                wall:{
+                    row:Number("{{$wall->bin_row_length}}"),
+                    column:Number("{{$wall->bin_column_length}}"),
+                    amount:Number("{{$wall->bin_wall_amount}}"),
+                },
+                color:"red",
+                error:"",
+            },
             mounted() {
-                $('.navbar,.nav1,.nav2').hide()
+                $('.navbar,.nav1,.nav2').hide();
                 $('.nav3').on('mouseenter', function () {
                     $('.navbar,.nav1,.nav2').show();
                 });
                 $('.body').on('mouseenter', function () {
                     $('.navbar,.nav1,.nav2').hide();
                 });
-            }
+                this._broadcast();
+                this._renderingWall(this.wall.amount,this.wall.row,this.wall.column);
+               /* this._renderingBox(3,5);*/
+            },
+            methods:{
+                _broadcast(){
+                    initEcho();
+                    window.Echo.channel(this.broadcastName).listen(this.channelName,(msg)=> {
+                        let json = JSON.parse(msg.json);
+                        this._refreshData(json);
+                    });
+                },
+                //刷新数据
+                _refreshData(obj){
+                    let task={};
+                    task.taskCommodities = [];
+                    task.sum = 0;
+                    task.currentSum = 0;
+                    task.currentCommodityIndex = "";
+                    obj.task_commodities.forEach((taskCommodity,i)=> {
+                        task.sum += Number(taskCommodity.amount);
+                        if (taskCommodity.status === '完成') task.currentSum += Number(taskCommodity.amount);
+                        if (taskCommodity.status === '处理中') task.currentCommodityIndex = i;
+                        task.taskCommodities.push({
+                            bg:this._setColor(taskCommodity.status),
+                            amount:taskCommodity.amount,
+                            binNumber:taskCommodity.bin_number,
+                            name:taskCommodity.commodity?taskCommodity.commodity.name:'',
+                            barcodes:taskCommodity.commodity?taskCommodity.commodity.barcodes:[],
+                            materialBox:taskCommodity.material_box,
+                        });
+                    });
+                    task.taskBatch=obj.task_batches[0];
+                    setBarcode(task.taskBatch.batch.code,"#barcode",2,50,false);
+                    this.task = task;
+                },
+                //渲染墙格口
+                _renderingWall(amount, row, column){
+                    for (let i=0;i<amount;i++){
+                        this.walls.push(this._createWall(row, column, i*(row*column)));
+                    }
+                },
+                _setColor(status){
+                    switch (status) {
+                        case "待处理":return "";
+                        case "挂起"  :return "bg-white";
+                        case "处理中"  :return "bg-primary";
+                        case "完成"  :return "bg-success";
+                        case "异常"  :return "bg-danger";
+                        case "取消"  :return "bg-dark text-white";
+                    }
+                    return "";
+                },
+                //生成墙格口
+                _createWall(row, column, increment){
+                    let wall = [];
+                    for (let i=1;i<=row;i++){
+                        let columns = [];
+                        for (let j=((i-1)*column)+1;j<=i*column;j++){
+                            columns.push(j+increment);
+                        }
+                        wall.unshift(columns);
+                    }
+                    return wall;
+                },
+                //渲染料箱格口
+                _renderingBox(row, column, x=79, y=72, width=21, height=12){
+                    let boxes = [];
+                    for (let i=0;i<column;i++){
+                        for (let j=row-1;j>=0;j--){
+                            if (boxes.length===5) boxes.push({x:((i+j)*width)+x,y:(y+(i*height))-(j*height),sign:true});
+                            else boxes.push({x:((i+j)*width)+x,y:(y+(i*height))-(j*height),sign:false});
+                        }
+                    }
+                    this.boxes = boxes;
+                },
+            },
         });
     </script>
 @endsection

+ 6 - 1
routes/api/thirdPart/haiq.php

@@ -8,7 +8,12 @@ use Illuminate\Support\Facades\Route;
 
 
 Route::group(['prefix'=>'storage'],function(){
-    Route::post('moveBin', "StorageController@moveBin");//移库
+    Route::post('moveBin', "StorageController@moveBin");//出库
+    Route::post('moveBin2', "StorageController@moveBin2");//出库
+    Route::post('moveBinIn', "StorageController@moveBinIn");//移库
+    Route::post('moveBinM', "StorageController@moveBinM");//移库
+    Route::post('lightOn', "StorageController@lightOn");//移库
+    Route::post('lightOff', "StorageController@lightOff");//移库
     Route::post('taskUpdate', "StorageController@taskUpdate");//移库
     Route::post('exception', "StorageController@exception");//移库
 });

+ 47 - 0
tests/Services/BatchService/TestGetBatchByCodes.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace Tests\Services\BatchService;
+
+use App\Batch;
+use App\Services\BatchService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Tests\TestCase;
+
+class TestGetBatchByCodes extends TestCase
+{
+//    use RefreshDatabase;
+
+    /** @var BatchService $service */
+    private $service;
+    private $data = [];
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('BatchService');
+        $batch = factory(Batch::class)->create();
+        $this->data['batch'] = $batch;
+    }
+
+    /**
+     * @test
+     */
+    public function getBatchByCodes()
+    {
+        $batch = $this->service->getBatchByCodes([$this->data['batch']['code']])->first();
+        $this->assertNotNull($batch);
+        $this->assertEquals($batch['code'],$this->data['batch']['code']);
+        $this->assertEquals($batch['type'],$this->data['batch']['type']);
+        $this->assertEquals($batch['wms_type'],$this->data['batch']['wms_type']);
+        $this->assertEquals($batch['status'],$this->data['batch']['status']);
+        $this->assertEquals($batch['wms_status'],$this->data['batch']['wms_status']);
+        $this->assertEquals($batch['remark'],$this->data['batch']['remark']);
+        $this->assertEquals($batch['owner_id'],$this->data['batch']['owner_id']);
+    }
+
+    public function tearDown(): void
+    {
+        $this->data['batch']->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 189 - 0
tests/Services/NewOrderCountingRecordService/GetOrderCountingRecordsTest.php

@@ -0,0 +1,189 @@
+<?php
+
+namespace NewOrderCountingRecordService;
+
+
+use App\Order;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Services\NewOrderCountingRecordService;
+use App\User;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Support\Collection;
+use Tests\TestCase;
+use Tightenco\Collect\Support\Arr;
+
+class GetOrderCountingRecordsTest extends TestCase
+{
+    use RefreshDatabase;
+
+    protected $newOrderCountingRecordService;
+    protected $queryConditionDay;
+    protected $queryConditionWeek;
+    protected $queryConditionMonth;
+    protected $queryConditionYear;
+    protected $ownerIds;
+    protected $cache_key = 'order_counting_records_';
+    protected $step_length = 1;
+    protected $orderCountingRecordIds = [];
+    protected $units = ['日', '月', '年'];
+    protected $orderIds;
+
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        cache()->flush();
+        $this->newOrderCountingRecordService = new NewOrderCountingRecordService();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $owners = factory(Owner::class)->times(2)->create();
+        $this->ownerIds = array_column($owners->toArray(), 'id');
+        $this->queryConditionDay = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subDays($this->step_length)->toDateString(), Carbon::now()->toDateString(), '日', $this->ownerIds);
+        $this->queryConditionWeek = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subWeeks($this->step_length)->toDateString(), Carbon::now()->toDateString(), '周', $this->ownerIds);
+        $this->queryConditionMonth = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subMonths($this->step_length)->toDateString(), Carbon::now()->toDateString(), '月', $this->ownerIds);
+        $this->queryConditionYear = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subYears($this->step_length)->toDateString(), Carbon::now()->toDateString(), '年', $this->ownerIds);
+    }
+
+    protected function tearDown(): void
+    {
+        cache()->flush();
+        Owner::destroy($this->ownerIds);
+        orderCountingRecord::destroy($this->orderCountingRecordIds);
+        parent::tearDown();
+    }
+
+
+//    /**
+//     * @test
+//     */
+//    public function get_all_from_cache()
+//    {
+//        for ($i = 0; $i <= $this->step_length; $i++) {
+//            foreach ($this->ownerIds as $ownerId) {
+//                foreach ($this->units as $unit) {
+//                    switch ($unit) {
+//                        case "日":
+//                            $dateStr = Carbon::now()->subDays($i)->toDateString();
+//                            break;
+//                        case "月":
+//                            $dateStr = Carbon::now()->subMonths($i)->toDateString();
+//                            break;
+//                        default:
+//                            break;
+//                    }
+//                    if ($dateStr) {
+//                        $orderCountingRecord = factory(OrderCountingRecord::class)->create([
+//                            'date_target' => $dateStr,
+//                            'owner_id' => $ownerId,
+//                            'counting_unit' => $unit,
+//                        ]);
+//                        $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $unit;
+//                        cache()->put($key, collect()->push($orderCountingRecord));
+//                        if (empty($this->orderCountingRecordIds[$unit])) $this->orderCountingRecordIds[$unit] = [];
+//                        $this->orderCountingRecordIds[$unit][] = $orderCountingRecord->id;
+//                        $dateStr = null;
+//                    }
+//                }
+//            }
+//        }
+//        $resultDay = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionDay);
+//        $resultWeek = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionWeek);
+////        $resultMonth = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionMonth);
+//        foreach ($this->units as $unit) {
+//            if (!empty($this->orderCountingRecordIds[$unit])) {
+//                switch ($unit) {
+//                    case "日":
+//                        $this->assertEquals($this->orderCountingRecordIds[$unit], array_column($resultDay->sortBy('id')->toArray(), 'id'));
+//                        break;
+//                    case "月":
+////                        $this->assertEquals($this->orderCountingRecordIds[$unit], array_column($resultMonth->sortBy('id')->toArray(), 'id'));
+//                        break;
+//                }
+//            }
+//        }
+//
+//    }
+
+    /**
+     * @test
+     */
+    public
+    function get_all_from_middle_day()
+    {
+        for ($i = 0; $i <= $this->step_length; $i++) {
+            foreach ($this->ownerIds as $ownerId) {
+                $unit = '日';
+                $dateStr = Carbon::now()->subDays($i)->toDateString();
+                $orderCountingRecord = factory(OrderCountingRecord::class)->create([
+                    'date_target' => $dateStr,
+                    'owner_id' => $ownerId,
+                    'counting_unit' => $unit,
+                ]);
+                $this->orderCountingRecordIds[] = $orderCountingRecord->id;
+            }
+        }
+        $result = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionDay);
+        $this->assertEquals($this->orderCountingRecordIds, array_column($result->sortBy('id')->toArray(), 'id'));
+    }
+
+    /**
+     * @test
+     */
+    public function get_all_from_orders_day()
+    {
+        for ($i = 0; $i <= $this->step_length; $i++) {
+            foreach ($this->ownerIds as $ownerId) {
+                $dateStr = Carbon::now()->subDays($i)->toDateTimeString();
+                $order = factory(Order::class)->create([
+                    'created_at' => $dateStr,
+                    'owner_id' => $ownerId,
+                    'wms_status' => '订单完成'
+                ]);
+                $this->orderIds = $order->id;
+            }
+        }
+        $result = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionDay);
+        $this->assertEquals([1, 1, 1, 1], array_column($result->toArray(), 'amount'));
+    }
+
+    /**
+     * @test
+     */
+    public function get_all_from_orders_Month()
+    {
+        for ($i = 0; $i <= $this->step_length; $i++) {
+            foreach ($this->ownerIds as $ownerId) {
+                $dateStr = Carbon::now()->subMonths($i)->toDateTimeString();
+                $order = factory(Order::class)->create([
+                    'created_at' => $dateStr,
+                    'owner_id' => $ownerId,
+                    'wms_status' => '订单完成'
+                ]);
+                $this->orderIds = $order->id;
+            }
+        }
+        $result = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionMonth);
+        $this->assertEquals([1, 1, 1, 1], array_column($result->toArray(), 'amount'));
+    }
+
+    /**
+     * @test
+     */
+    public function get_all_from_orders_Year()
+    {
+        for ($i = 0; $i <= $this->step_length; $i++) {
+            foreach ($this->ownerIds as $ownerId) {
+                $dateStr = Carbon::now()->subYears($i)->toDateTimeString();
+                $order = factory(Order::class)->create([
+                    'created_at' => $dateStr,
+                    'owner_id' => $ownerId,
+                    'wms_status' => '订单完成'
+                ]);
+                $this->orderIds = $order->id;
+            }
+        }
+        $result = $this->newOrderCountingRecordService->getOrderCountingRecords($this->queryConditionYear);
+        $this->assertEquals([1, 1, 1, 1], array_column($result->toArray(), 'amount'));
+    }
+}

+ 337 - 0
tests/Services/NewOrderCountingRecordService/NewOrderCountingRecordServiceTest.php

@@ -0,0 +1,337 @@
+<?php
+
+namespace NewOrderCountingRecordService;
+
+use App\Order;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Services\NewOrderCountingRecordService;
+use App\User;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Support\Arr;
+use Tests\TestCase;
+
+class NewOrderCountingRecordServiceTest extends TestCase
+{
+    use RefreshDatabase;
+
+    protected $newOrderCountingRecordService;
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        cache()->flush();
+        $this->newOrderCountingRecordService = new NewOrderCountingRecordService();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+
+    }
+
+    protected function tearDown(): void
+    {
+        cache()->flush();
+        OrderCountingRecord::truncate();
+        Order::truncate();
+        Owner::truncate();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+
+    /**
+     * @test
+     */
+    public function transfersToConditions()
+    {
+        factory(Owner::class)->times(2)->create();
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+        $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+        $this->assertEquals([
+            Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->toDateString() => [0 => 1, 1 => 2],
+        ], $dateArray);
+    }
+
+    /**
+     * @test
+     */
+    public function dateUtils_week()
+    {
+        factory(Owner::class)->times(2)->create();
+        $start = Carbon::now()->subWeeks(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '周';
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+        $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+        dd($dateArray);
+//        $this->assertEquals([
+//            Carbon::now()->subWeeks(2)->toDateString() => [0 => 1, 1 => 2],
+//            Carbon::now()->subWeeks(1)->toDateString() => [0 => 1, 1 => 2],
+//            Carbon::now()->toDateString() => [0 => 1, 1 => 2],
+//        ], $dateArray);
+    }
+
+
+    /**
+     * @test
+     */
+    public function orderCountingRecords_remember_day()
+    {
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $key = 'orderCountingRecords_' . $start . '_' . $end . '_' . $unit . '_' . auth()->id();
+
+        cache()->put($key, 'This is a test value');
+
+        $result = $this->newOrderCountingRecordService->get($start, $end, $unit);
+        $this->assertEquals('This is a test value', $result);
+    }
+
+
+    /**
+     * @test
+     */
+    public function dataFromCache_all_day()
+    {
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        factory(Owner::class)->times(2)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+        $queryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+
+        foreach ($queryCondition as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $ownerId) {
+                $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $unit . '_' . auth()->id();
+                cache()->put($key, collect()->push(factory(Owner::class)->create()));
+            }
+        }
+        $result = $this->newOrderCountingRecordService->getFromCache($queryCondition, $unit);
+        $this->assertCount(6, $result['dataFromCache']);
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromCache_empty_day()
+    {
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        factory(Owner::class)->times(2)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+        $queryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+
+
+        $result = $this->newOrderCountingRecordService->getFromCache($queryCondition, $unit);
+        $this->assertEquals([
+            Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->toDateString() => [0 => 1, 1 => 2],
+        ], $result['unQueryCondition']);
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromMiddleTable_all_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner2->id]);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner1->id]);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner2->id]);
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+
+        $queryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+        $result = $this->newOrderCountingRecordService->dataFromMiddleTable($queryCondition, $unit);
+
+        $this->assertCount(8, $result['dataFromMiddleTable']);
+        $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->toDateString()]);
+        $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromMiddleTable_empty_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        factory(Owner::class)->create();
+        factory(Owner::class)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+
+        $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+        $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
+
+        $this->assertCount(0, $result['dataFromMiddleTable']);
+        $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->toDateString()]);
+        $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromMiddleTable_common_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+
+        $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
+
+        $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
+
+        $this->assertCount(2, $result['dataFromMiddleTable']);
+        $this->assertCount(1, $result['unQueryCondition'][Carbon::now()->toDateString()]);
+        $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
+    }
+
+    /**
+     * @test
+     */
+    public function insertIntoCache_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+
+        $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+        $orderCountingRecord = factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
+
+        $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
+
+        $this->newOrderCountingRecordService->insertIntoCache($result['dataFromMiddleTable'], $unit);
+        $key = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
+        $this->assertNotNull(cache()->get($key));
+        $this->assertNotNull($orderCountingRecord->toArray());
+        $this->assertEquals($orderCountingRecord->toArray(), cache()->get($key)->toArray());
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromOrder_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+
+        $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $result = $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
+        $this->assertEquals(1, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner1->id)->first()->amount);
+        $this->assertEquals(2, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner2->id)->first()->amount);
+        $this->assertEquals(3, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner1->id)->first()->amount);
+        $this->assertEquals(4, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner2->id)->first()->amount);
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromOrder_insertMiddleTable_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+        $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
+        $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
+        //当天的数据不入中间表
+        $this->assertCount(0, OrderCountingRecord::query()->where('date_target', Carbon::now()->toDateString())->get());
+        $this->assertCount(2, OrderCountingRecord::query()->where('date_target', Carbon::now()->subDays(1)->toDateString())->get());
+
+    }
+
+    /**
+     * @test
+     */
+    public function dataFromOrder_insertCache_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit,$this->newOrderCountingRecordService->getCountingOwnerIds());
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
+        $key1 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
+        $key2 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner2->id . '_' . $unit;
+        $key3 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner1->id . '_' . $unit;
+        $key4 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner2->id . '_' . $unit;
+        $this->assertCount(1, cache()->get($key1));
+        $this->assertCount(1, cache()->get($key2));
+        $this->assertCount(1, cache()->get($key3));
+        $this->assertCount(1, cache()->get($key4));
+    }
+
+    /**
+     * @test
+     */
+    public function orderCountingRecordsDay_day()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+        $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit,$this->newOrderCountingRecordService->getCountingOwnerIds());
+
+        $result = $this->newOrderCountingRecordService->getOrderCountingRecords($unQueryCondition, $unit);
+        $this->assertEquals(3, $result->where('date_target', Carbon::now()->toDateString())->reduce(function ($carry, $item) {
+            return $carry + $item->amount;
+        }));
+        $this->assertEquals(7, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->reduce(function ($carry, $item) {
+            return $carry + $item->amount;
+        }));
+    }
+}

+ 75 - 0
tests/Services/NewOrderCountingRecordService/OrderCountingRecordsTest.php

@@ -0,0 +1,75 @@
+<?php
+
+namespace NewOrderCountingRecordService;
+
+
+use App\Order;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Services\NewOrderCountingRecordService;
+use App\User;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Tests\TestCase;
+
+class OrderCountingRecordsTest extends TestCase
+{
+    use RefreshDatabase;
+
+    protected $newOrderCountingRecordService;
+    protected $queryConditionDay;
+    protected $queryConditionWeek;
+    protected $queryConditionMonth;
+    protected $queryConditionYear;
+    protected $ownerIds;
+    protected $cache_key = 'order_counting_records_';
+    protected $step_length = 1;
+    protected $orderCountingRecordIds = [];
+    protected $units = ['日', '月', '年'];
+    protected $orderIds;
+
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        cache()->flush();
+        $this->newOrderCountingRecordService = new NewOrderCountingRecordService();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $owners = factory(Owner::class)->times(2)->create();
+        $this->ownerIds = array_column($owners->toArray(), 'id');
+        $this->queryConditionDay = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subDays($this->step_length)->toDateString(), Carbon::now()->toDateString(), '日', $this->ownerIds);
+        $this->queryConditionMonth = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subMonths($this->step_length)->toDateString(), Carbon::now()->toDateString(), '月', $this->ownerIds);
+        $this->queryConditionYear = $this->newOrderCountingRecordService->transfersToCondition(Carbon::now()->subYears($this->step_length)->toDateString(), Carbon::now()->toDateString(), '年', $this->ownerIds);
+    }
+
+    protected function tearDown(): void
+    {
+        cache()->flush();
+        Owner::destroy($this->ownerIds);
+        orderCountingRecord::destroy($this->orderCountingRecordIds);
+        parent::tearDown();
+    }
+
+
+    /**
+     * @test
+     */
+    public function unit_day()
+    {
+        for ($i = 0; $i <= $this->step_length; $i++) {
+            foreach ($this->ownerIds as $ownerId) {
+                $dateStr = Carbon::now()->subDays($i)->toDateTimeString();
+                $order = factory(Order::class)->create([
+                    'created_at' => $dateStr,
+                    'owner_id' => $ownerId,
+                    'wms_status' => '订单完成'
+                ]);
+                $this->orderIds = $order->id;
+            }
+        }
+        $start = Carbon::now()->subDays($this->step_length)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $result =  $this->newOrderCountingRecordService->orderCountingRecords($start, $end, '日', $this->ownerIds);
+        $this->assertEquals([2,2],$result->pluck('counter')->toArray());
+    }
+}

+ 126 - 0
tests/Services/NewOrderCountingRecordService/TransfersToConditionsTest.php

@@ -0,0 +1,126 @@
+<?php
+
+namespace NewOrderCountingRecordService;
+
+use App\Order;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Services\NewOrderCountingRecordService;
+use App\User;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Support\Arr;
+use Tests\TestCase;
+
+class TransfersToConditionsTest extends TestCase
+{
+    protected $newOrderCountingRecordService;
+    protected $data;
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        cache()->flush();
+        $this->newOrderCountingRecordService = new NewOrderCountingRecordService();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $this->data['dates'] = [
+            'right'=>[
+                ['startAt'=>Carbon::now()->subDays(2),'endAt'=>Carbon::now()->addDays(2)],
+                ['startAt'=>Carbon::now()->subYears(1),'endAt'=>Carbon::now()->addYears(1)],
+            ],
+            'wrong'=>[
+                ['startAt'=>Carbon::now()->addDays(2),'endAt'=>Carbon::now()->subDays(2)],
+                ['startAt'=>Carbon::now()->addYears(1),'endAt'=>Carbon::now()->subYears(1)],
+            ]
+        ];
+        $this->data['units'] = ['year'=>'年','month'=>'月','week'=>'周','day'=>'日'];
+        $this->data['owners']=factory(Owner::class)->times(2)->create();
+    }
+
+    protected function tearDown(): void
+    {
+        cache()->flush();
+        Owner::destroy(data_get($this->data['owners'],'*.id'));
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+
+    public function test_transfersToConditions_format()
+    {
+        foreach($this->data['units'] as $unit){
+            foreach($this->data['dates']['right'] as $date){
+                $result=$this->newOrderCountingRecordService->transfersToCondition($date['startAt'],$date['endAt'],$unit,data_get($this->data['owners'],'*.id'));
+                $this->assertIsArray($result);
+            }
+            foreach($this->data['dates']['wrong'] as $date){
+                $result=$this->newOrderCountingRecordService->transfersToCondition($date['startAt'],$date['endAt'],$unit,data_get($this->data['owners'],'*.id'));
+                $this->assertIsArray($result);
+            }
+        }
+    }
+    public function test_transfersToConditions_ifEmpty()
+    {
+        foreach($this->data['units'] as $unit){
+            foreach($this->data['dates']['right'] as $date){
+                $result=$this->newOrderCountingRecordService->transfersToCondition($date['startAt'],$date['endAt'],$unit,data_get($this->data['owners'],'*.id'));
+                $this->assertNotEmpty($result);
+            }
+            foreach($this->data['dates']['wrong'] as $date){
+                $result=$this->newOrderCountingRecordService->transfersToCondition($date['startAt'],$date['endAt'],$unit,data_get($this->data['owners'],'*.id'));
+                $this->assertEmpty($result['data']);
+                $this->assertNotEmpty($result['unit']);
+            }
+        }
+    }
+
+    public function test_transfersToConditions_ifDatesMatches()
+    {
+        foreach($this->data['units'] as $unit){
+            foreach($this->data['dates']['right'] as $date){
+                $result=$this->newOrderCountingRecordService->transfersToCondition($date['startAt'],$date['endAt'],$unit,data_get($this->data['owners'],'*.id'));
+                $datesExpected=[];
+                switch ($unit){
+                    case '年': $datesExpected=collect($date['startAt']->yearsUntil($date['endAt'], 1)->toArray())
+                        ->map(function(Carbon $date){
+                            return $date->firstOfYear();
+                        })->toArray();
+                        break;
+                    case '月': $datesExpected=collect($date['startAt']->monthsUntil($date['endAt'], 1)->toArray())
+                        ->map(function(Carbon $date){
+                            return $date->firstOfMonth();
+                        })->toArray();break;
+                    case '周': $datesExpected=collect($date['startAt']->weeksUntil($date['endAt'], 1)->toArray())
+                        ->map(function(Carbon $date){
+                            return $date->startOfWeek();
+                        })->toArray();break;
+                    case '日': $datesExpected=collect($date['startAt']->daysUntil($date['endAt'], 1)->toArray())
+                        ->map(function(Carbon $date){
+                            return $date->startOfDay();
+                        })->toArray();break;
+                }
+                $datesExpected=array_map(function($date){
+                    return $date->toDateString();
+                },$datesExpected);
+                $actualDays = array_keys($result['data']);
+                $this->assertEquals($datesExpected, $actualDays);
+            }
+        }
+    }
+
+    public function test_transfersToConditions_ifOwnerIdMatches()
+    {
+        foreach($this->data['units'] as $unit){
+            foreach($this->data['dates']['right'] as $date){
+                $result=$this->newOrderCountingRecordService->transfersToCondition($date['startAt'],$date['endAt'],$unit,data_get($this->data['owners'],'*.id'));
+                $ownerIdsExpected=data_get($this->data['owners'],'*.id');
+                $isMatch=true;
+                foreach($result['data'] as $date=>$ownerIds){
+                    if(json_encode($ownerIdsExpected)!=json_encode($ownerIds)){
+                        $isMatch=false; break;
+                    }
+                }
+                $this->assertTrue($isMatch);
+            }
+        }
+    }
+
+}

+ 129 - 45
tests/Services/OrderCountingRecordService/OrderCountingRecordServiceGetTest.php

@@ -38,27 +38,18 @@ class OrderCountingRecordServiceGetTest extends TestCase
         $this->actingAs($user = factory(User::class)->create(['name' => 'yang']));
 
         $owner = factory(Owner::class)->create();
-        $orders = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
-        $orders = factory(Order::class)->times(10)->create([
-            'created_at' => Carbon::now()->subDays(1),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createCurrentDateOrders($owner);
+
+        $this->createSubDayOrders($owner);
+
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end)->toArray();
         $this->assertEquals([0, 10, 20], array_column($result, 'counter'));
         cache()->flush();
-        $orders = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createCurrentDateOrders($owner);
+
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end)->toArray();
         $this->assertEquals([0, 10, 40], array_column($result, 'counter'));
         cache()->flush();
-        Order::query()->delete();
-        Owner::query()->delete();
-        User::query()->delete();
     }
 
     /**
@@ -71,29 +62,18 @@ class OrderCountingRecordServiceGetTest extends TestCase
         $end = (new Carbon())->toDateString();
         $this->actingAs(factory(User::class)->create(['name' => 'yang']));
         $owner = factory(Owner::class)->create();
-        $orders1 = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createCurrentDateOrders($owner);
 
-        $orders2 = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now()->subWeek(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createSubWeekOrders($owner);
 
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '周')->toArray();
         $this->assertEquals([20, 20], array_column($result, 'counter'));
         cache()->flush();
-        $orders1 = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createCurrentDateOrders($owner);
 
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '周')->toArray();
         $this->assertEquals([20, 40], array_column($result, 'counter'));
-        Order::query()->delete();
-        Owner::query()->delete();
-        User::query()->delete();
+
     }
 
     /**
@@ -106,29 +86,93 @@ class OrderCountingRecordServiceGetTest extends TestCase
         $end = (new Carbon())->toDateString();
         $this->actingAs(factory(User::class)->create(['name' => 'yang']));
         $owner = factory(Owner::class)->create();
-        $orders1 = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createCurrentDateOrders($owner);
 
-        $orders2 = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now()->subMonth(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createSubMonthOrders($owner);
 
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '月')->toArray();
         $this->assertEquals([20, 20], array_column($result, 'counter'));
         cache()->flush();
-        $orders1 = factory(Order::class)->times(20)->create([
-            'created_at' => Carbon::now(),
-            'owner_id' => $owner->id,
-            'wms_status' => '订单完成']);
+        $this->createCurrentDateOrders($owner);
 
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '月')->toArray();
         $this->assertEquals([20, 40], array_column($result, 'counter'));
-        Order::query()->delete();
-        Owner::query()->delete();
-        User::query()->delete();
+
+    }
+
+    /**
+     * @test
+     */
+    public function current_date_ttl_day()
+    {
+        cache()->flush();
+        $start = Carbon::now()->subDays(2)->format('Y-m-d');
+        $end = (new Carbon())->toDateString();
+
+        $this->actingAs($user = factory(User::class)->create(['name' => 'yang']));
+
+        $owner = factory(Owner::class)->create();
+        $this->createCurrentDateOrders($owner);
+
+        $this->createSubDayOrders($owner);
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end)->toArray();
+        $this->assertEquals([0, 10, 20], array_column($result, 'counter'));
+        sleep(4);
+        $this->createCurrentDateOrders($owner);
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end)->toArray();
+        $this->assertEquals([0, 10, 40], array_column($result, 'counter'));
+        cache()->flush();
+
+    }
+
+    /**
+     * @test
+     */
+    public function current_date_ttl_week()
+    {
+        cache()->flush();
+        $start = Carbon::now()->subWeek()->format('Y-m-d');
+        $end = (new Carbon())->toDateString();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $owner = factory(Owner::class)->create();
+        $this->createCurrentDateOrders($owner);
+
+        $this->createSubWeekOrders($owner);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '周')->toArray();
+        $this->assertEquals([20, 20], array_column($result, 'counter'));
+
+        sleep(4);
+
+        $this->createCurrentDateOrders($owner);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '周')->toArray();
+        $this->assertEquals([20, 40], array_column($result, 'counter'));
+
+    }
+
+    /**
+     * @test
+     */
+    public function current_date_ttl_month()
+    {
+        cache()->flush();
+        $start = Carbon::now()->subMonth()->format('Y-m-d');
+        $end = (new Carbon())->toDateString();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $owner = factory(Owner::class)->create();
+        $this->createCurrentDateOrders($owner);
+
+        $this->createSubMonthOrders($owner);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '月')->toArray();
+        $this->assertEquals([20, 20], array_column($result, 'counter'));
+        sleep(4);
+        $this->createCurrentDateOrders($owner);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '月')->toArray();
+        $this->assertEquals([20, 40], array_column($result, 'counter'));
+
     }
 
 
@@ -164,4 +208,44 @@ class OrderCountingRecordServiceGetTest extends TestCase
         $this->assertTrue($month_true);
         $this->assertFalse($month_false);
     }
+
+    public function tearDown(): void
+    {
+        Order::query()->delete();
+        Owner::query()->delete();
+        User::query()->delete();
+    }
+
+
+    protected function createCurrentDateOrders($owner): void
+    {
+        factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+    }
+
+    protected function createSubWeekOrders($owner): void
+    {
+        factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now()->subWeek(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+    }
+
+    protected function createSubMonthOrders($owner): void
+    {
+        factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now()->subMonth(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+    }
+
+    protected function createSubDayOrders($owner): void
+    {
+        factory(Order::class)->times(10)->create([
+            'created_at' => Carbon::now()->subDays(1),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+    }
 }

+ 6 - 1
tests/webApi/thirdPart/haiq/storage.http

@@ -4,9 +4,14 @@
 ## * 'gtrp' and 'gtr' create a GET request with or without query parameters;
 ## * 'ptr' and 'ptrp' create a POST request with a simple or parameter-like body;
 ## * 'mptr' and 'fptr' create a POST request to submit a form with a text or file field (multipart/form-data);
+### out to roller
+POST http://bswas/api/thirdPart/haiq/storage/moveBinM
 
-POST http://bswas/api/thirdPart/haiq/storage/relocate
+###
+POST http://bswas/api/thirdPart/haiq/storage/moveBinIn
 
+###
+POST http://bswas/api/thirdPart/haiq/storage/lightOn
 
 ###
 

+ 1 - 0
webpack.mix.js

@@ -23,6 +23,7 @@ mix.copy('resources/sass/trix.css','public/css/initLaborReportsCountingRecords')
 mix.copy('resources/js/queryForm/queryForm.js','public/js/queryForm/queryForm.js');
 mix.copy('resources/js/queryForm/export.js','public/js/queryForm/export.js');
 mix.js('resources/js/queryForm/header.js','public/js/queryForm/header.js');
+mix.js('resources/js/utilities/barcode.js','public/js/utilities/barcode.js');
 
 mix.copy('resources/sound/','public/sound');
 mix.js('resources/js/elementUi.js','public/js/element-ui.js')

Некоторые файлы не были показаны из-за большого количества измененных файлов