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

Merge branch 'master' into zengjun

# Conflicts:
#	app/Providers/AppServiceProvider.php
#	app/Services/OrderService.php
#	app/Services/OwnerService.php
#	resources/js/queryForm/queryForm.js
ajun 5 лет назад
Родитель
Сommit
b44e41c582
97 измененных файлов с 4524 добавлено и 63120 удалено
  1. 3 0
      app/Console/Commands/InventoryDailyLoggingOwner.php
  2. 1 1
      app/Exports/InventoryBlindReceiveExcelExport.php
  3. 11 11
      app/Http/Controllers/ExcelController.php
  4. 17 24
      app/Http/Controllers/InventoryAccountController.php
  5. 22 1
      app/Http/Controllers/InventoryCompareController.php
  6. 39 2
      app/Http/Controllers/LaborReportController.php
  7. 85 378
      app/Http/Controllers/OrderController.php
  8. 98 0
      app/Http/Controllers/StoreBlindReceiveController.php
  9. 16 10
      app/Http/Controllers/StoreController.php
  10. 6 2
      app/Http/Controllers/StoreItemsController.php
  11. 11 11
      app/Http/Controllers/TestController.php
  12. 0 11
      app/Http/Controllers/UserDutyCheckController.php
  13. 43 9
      app/Http/Controllers/api/thirdPart/flux/ProcessController.php
  14. 19 0
      app/InventoryBlindReceiveExcel.php
  15. 65 30
      app/LaborReport.php
  16. 4 1
      app/OracleDOCASNDetail.php
  17. 5 1
      app/Providers/AppServiceProvider.php
  18. 30 5
      app/Services/InventoryAccountService.php
  19. 4 3
      app/Services/InventoryCompareService.php
  20. 38 11
      app/Services/LaborReportService.php
  21. 17 8
      app/Services/OracleActAllocationDetailService.php
  22. 284 3
      app/Services/OrderService.php
  23. 5 0
      app/Services/OwnerService.php
  24. 7 0
      app/Services/PackageService.php
  25. 13 0
      app/Services/RejectedBillItemService.php
  26. 25 0
      app/Services/RejectedBillService.php
  27. 3 2
      app/UserDutyCheck.php
  28. 31 0
      database/migrations/2020_09_11_102338_add_authorities_labor_reports.php
  29. 52 0
      database/migrations/2020_09_11_115414_change_labor_reports_labor_company_to_labor_company_id.php
  30. 35 0
      database/migrations/2020_09_11_155001_create_inventory_blind_receive_excels_table.php
  31. 31 0
      database/migrations/2020_09_14_102338_add_authorities_order_generate_rejected_and_blind_receive.php
  32. 0 0
      php
  33. 0 0
      phph
  34. 0 61994
      public/js/app.js
  35. BIN
      public/sound/ding.mp3
  36. BIN
      public/sound/warning_otherBarcode.mp3
  37. 7 2
      resources/js/queryForm/queryForm.js
  38. 1 1
      resources/js/utilities/tempTip.js
  39. BIN
      resources/sound/ding.mp3
  40. BIN
      resources/sound/warning_otherBarcode.mp3
  41. 1 1
      resources/views/inventory/statement/changeInventory.blade.php
  42. 1 1
      resources/views/inventory/statement/dailyLog.blade.php
  43. 6 1
      resources/views/inventory/statement/inventoryCompare.blade.php
  44. 101 26
      resources/views/inventory/stockInventory/inventoryMission.blade.php
  45. 12 8
      resources/views/inventory/stockInventory/mission.blade.php
  46. 1 1
      resources/views/layouts/menu.blade.php
  47. 19 2
      resources/views/maintenance/owner/index.blade.php
  48. 1 1
      resources/views/maintenance/role/index.blade.php
  49. 39 3
      resources/views/order/index/delivering.blade.php
  50. 1 1
      resources/views/order/issue/index.blade.php
  51. 1 1
      resources/views/order/issue/performance.blade.php
  52. 1 1
      resources/views/order/issue/workload.blade.php
  53. 1 1
      resources/views/order/tracking/index.blade.php
  54. 1 1
      resources/views/order/wave/search.blade.php
  55. 550 472
      resources/views/personnel/laborReport/index.blade.php
  56. 19 0
      resources/views/personnel/laborReport/menu.blade.php
  57. 156 0
      resources/views/personnel/laborReport/recycle.blade.php
  58. 15 5
      resources/views/process/create.blade.php
  59. 1 1
      resources/views/process/index.blade.php
  60. 1 1
      resources/views/rejected/search/analyze.blade.php
  61. 2 2
      resources/views/rejected/search/general.blade.php
  62. 33 0
      resources/views/store/blindReceive/excel/index.blade.php
  63. 475 0
      resources/views/store/blindReceive/index.blade.php
  64. 58 0
      resources/views/store/blindReceive/layout.blade.php
  65. 15 0
      resources/views/store/blindReceive/menu.blade.php
  66. 1 1
      resources/views/store/fast/create.blade.php
  67. 1 0
      resources/views/store/fast/index.blade.php
  68. 20 0
      resources/views/store/fast/menu.blade.php
  69. 0 12
      resources/views/store/fast/menuFast.blade.php
  70. 1 1
      resources/views/store/fast/storeItem.blade.php
  71. 4 8
      resources/views/store/menu.blade.php
  72. 0 12
      resources/views/store/storeItem/menu.blade.php
  73. 1 1
      resources/views/waybill/index.blade.php
  74. 3 2
      resources/views/weight/package/index.blade.php
  75. 24 5
      routes/web.php
  76. 2 0
      serves/excelExportGo/.gitignore
  77. 188 0
      serves/excelExportGo/api/controller/controller.go
  78. 130 0
      serves/excelExportGo/api/controller/inventoryController.go
  79. 35 0
      serves/excelExportGo/api/controller/laborReportController.go
  80. 432 0
      serves/excelExportGo/api/controller/orderController.go
  81. 122 0
      serves/excelExportGo/api/controller/packageController.go
  82. 113 0
      serves/excelExportGo/api/controller/processController.go
  83. 120 0
      serves/excelExportGo/api/controller/rejectedController.go
  84. 170 0
      serves/excelExportGo/api/controller/waybillController.go
  85. 41 0
      serves/excelExportGo/excel/export.go
  86. 9 0
      serves/excelExportGo/go.mod
  87. 52 0
      serves/excelExportGo/go.sum
  88. 9 0
      serves/excelExportGo/logs/2020-09-09.log
  89. 37 0
      serves/excelExportGo/logs/2020-09-10.log
  90. BIN
      serves/excelExportGo/main.exe
  91. 14 0
      serves/excelExportGo/main.go
  92. 59 0
      serves/excelExportGo/orm/query.go
  93. 61 0
      serves/excelExportGo/utilities/connect.go
  94. 14 0
      serves/excelExportGo/utilities/format.go
  95. 61 0
      serves/excelExportGo/utilities/log.go
  96. 259 26
      tests/Routes/WebTest.php
  97. 2 1
      webpack.mix.js

+ 3 - 0
app/Console/Commands/InventoryDailyLoggingOwner.php

@@ -4,6 +4,7 @@ namespace App\Console\Commands;
 
 use App\CommodityBarcode;
 use App\Services\CommodityService;
+use App\Services\LogService;
 use Illuminate\Console\Command;
 use App\InventoryDailyLoggingOwner as LoggingOwner;
 use Illuminate\Support\Facades\DB;
@@ -106,6 +107,7 @@ class InventoryDailyLoggingOwner extends Command
                 'volumn'=>$commodity['volumn'],
             ];
             $result = $commodityService->updateOrCreate($param,$column);
+            LogService::log(__METHOD__,"同步库存每日记录时修改或生成商品",json_encode($column));
             $commodity_id = $result->id;
             //寻找对应barcode是否存在,不存在录入
             if ($commodity['code']) CommodityBarcode::query()->firstOrCreate(['commodity_id'=>$commodity_id,'code'=>$commodity['code']]);
@@ -120,6 +122,7 @@ class InventoryDailyLoggingOwner extends Command
             ]);
         }
         DB::table('inventory_daily_logs')->insert($data);
+        LogService::log(__METHOD__,"同步库存每日记录",json_encode($data));
     }
 
     public function getLoggingOwners(){

+ 1 - 1
app/Exports/GoodsNeateningExcelExport.php → app/Exports/InventoryBlindReceiveExcelExport.php

@@ -6,7 +6,7 @@ use App\User;
 use Illuminate\Support\Collection;
 use Maatwebsite\Excel\Concerns\FromCollection;
 
-class GoodsNeateningExcelExport implements FromCollection
+class InventoryBlindReceiveExcelExport implements FromCollection
 {
     private $data;
     public function __construct($data)

+ 11 - 11
app/Http/Controllers/ExcelController.php

@@ -2,8 +2,8 @@
 
 namespace App\Http\Controllers;
 
-use App\Exports\GoodsNeateningExcelExport;
-use App\GoodsNeateningExcel;
+use App\Exports\InventoryBlindReceiveExcelExport;
+use App\InventoryBlindReceiveExcel;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
@@ -59,17 +59,17 @@ class ExcelController extends Controller
             array_push($goodsesExcelArray,[$barcode,$obj['weight']??'',($obj['id']??'').' '
                 ,($obj['key'])??'',($obj['time'])??'', ($url)??'']);
         }
-        Excel::store(new GoodsNeateningExcelExport($goodsesExcelArray),'exportedJson.xlsx','public');
+        Excel::store(new InventoryBlindReceiveExcelExport($goodsesExcelArray),'exportedJson.xlsx','public');
         return ['result'=>'success'];
     }
 
     /**
      * Display the specified resource.
      *
-     * @param  \App\GoodsNeateningExcel  $goodsNeateningExcel
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
      * @return \Illuminate\Http\Response
      */
-    public function show(GoodsNeateningExcel $goodsNeateningExcel)
+    public function show(InventoryBlindReceiveExcel $goodsNeateningExcel)
     {
         //
     }
@@ -77,10 +77,10 @@ class ExcelController extends Controller
     /**
      * Show the form for editing the specified resource.
      *
-     * @param  \App\GoodsNeateningExcel  $goodsNeateningExcel
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
      * @return \Illuminate\Http\Response
      */
-    public function edit(GoodsNeateningExcel $goodsNeateningExcel)
+    public function edit(InventoryBlindReceiveExcel $goodsNeateningExcel)
     {
         //
     }
@@ -89,10 +89,10 @@ class ExcelController extends Controller
      * Update the specified resource in storage.
      *
      * @param  \Illuminate\Http\Request  $request
-     * @param  \App\GoodsNeateningExcel  $goodsNeateningExcel
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
      * @return \Illuminate\Http\Response
      */
-    public function update(Request $request, GoodsNeateningExcel $goodsNeateningExcel)
+    public function update(Request $request, InventoryBlindReceiveExcel $goodsNeateningExcel)
     {
         //
     }
@@ -100,10 +100,10 @@ class ExcelController extends Controller
     /**
      * Remove the specified resource from storage.
      *
-     * @param  \App\GoodsNeateningExcel  $goodsNeateningExcel
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
      * @return \Illuminate\Http\Response
      */
-    public function destroy(GoodsNeateningExcel $goodsNeateningExcel)
+    public function destroy(InventoryBlindReceiveExcel $goodsNeateningExcel)
     {
         //
     }

+ 17 - 24
app/Http/Controllers/InventoryAccountController.php

@@ -5,12 +5,13 @@ namespace App\Http\Controllers;
 use App\Exports\Export;
 use App\InventoryAccount;
 use App\InventoryAccountMission;
-use App\Owner;
 use App\Services\InventoryAccountService;
 use App\Services\OwnerService;
+use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Http;
 use Maatwebsite\Excel\Facades\Excel;
 
 class InventoryAccountController extends Controller
@@ -53,19 +54,13 @@ class InventoryAccountController extends Controller
     }
     //进入盘点中或复盘页面
     public function enterStockInventory($id,Request $request){
-        if($request->input('listMode') ?? false){
-            if (!Gate::allows('库存管理-盘点-查看')){return redirect(url('/')); }
-        }else{
-            if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
-        }
+        if (!Gate::allows('库存管理-盘点-查看')&&!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
         if (!$id) return ['success'=>false,'data'=>'参数错误!'];
         $inventoryAccount=InventoryAccount::with('owner')->find($id);
         $inventoryAccountMissions=InventoryAccountMission::with(['commodity.barcodes','stockInventoryPersons'])->where('inventory_account_id',$id)->orderBy('difference_amount','desc')->get();
         return view('inventory.stockInventory.inventoryMission',compact('inventoryAccount','inventoryAccountMissions'));
     }
 
-
-
     //依据盘点任务id进行 --盘点
     public function stockInventory(Request $request){
         if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
@@ -221,29 +216,27 @@ class InventoryAccountController extends Controller
             $stockInventoryPersons=$inventoryAccountMission->stockInventoryPersons;
             return ['success'=>true,'inventoryMission'=>$inventoryAccountMission,'inventory'=>$inventoryAccount,'stockInventoryPersons'=>$stockInventoryPersons];
         }
-
-
-
-
     }
 
-
     public function 删除盘点记录(Request $request){
         if(!Gate::allows('库存管理-盘点-删除')){return['success'=>false,'data'=>'没有权限'];}
         $inventoryAccountMissionId=$request->input('inventoryAccountMissionId');
         $inventoryAccountId=$request->input('inventoryAccountId');
         if(is_null($inventoryAccountMissionId)){return ['success'=>false,'data'=>'传入id为空'];}
-        $inventoryAccountMission=InventoryAccountMission::query()->where('id',$inventoryAccountMissionId)->delete();
-        $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        if ($inventoryAccountMission>0){
-            $inventoryAccount=InventoryAccount::query()->find($inventoryAccountId);
-            $inventoryAccount->total=$inventoryAccount->total-1;
-            $inventoryAccount->processed=$inventoryAccount->getProcessedAmount();//已盘点数
-            $inventoryAccount->difference=$inventoryAccount->getDifferenceAmount();//盘点差异数
-            $inventoryAccount->returned=$inventoryAccount->getReturnedAmount(); //复盘归位数
-            $inventoryAccount->update();
-            $this->log(__METHOD__,'删除盘点记录时修改盘点任务信息'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
-        }
+        /** @var InventoryAccountService $inventoryService */
+        $inventoryService=app('inventoryAccountService');
+        $inventoryAccountMission=$inventoryService->删除盘点记录($inventoryAccountMissionId,$inventoryAccountId);
         return ['success'=>true,'data'=>$inventoryAccountMission];
     }
+    public function exportInventoryAccountMission(Request $request){
+        if(!Gate::allows("库存管理-盘点")){ return redirect(url('/'));  }
+        $post = Http::post(config('go.export.url'),['type'=>'inventoryAccountMission','data'=>$request->data]);
+        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',
+        ]);
+    }
 }

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

@@ -5,10 +5,12 @@ namespace App\Http\Controllers;
 use App\Imports\InventoryCompareImport;
 use App\InventoryCompare;
 use App\Services\OwnerService;
+use Exception;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Http;
 use Maatwebsite\Excel\Facades\Excel;
 
 class InventoryCompareController extends Controller
@@ -91,7 +93,7 @@ class InventoryCompareController extends Controller
     function inventoryCompare(Request $request,OwnerService $ownerService){
         if (!Gate::allows('库存管理-库存-库存对比')){return redirect(url('/')); }
         $owners = $ownerService->getSelection();
-        $inventoryCompares=app('InventoryCompareService')->getInventoryCompare($request->all());
+        $inventoryCompares=app('inventoryCompareService')->getInventoryCompare($request->all());
         $param = $request->input();
         return view('inventory.statement.inventoryCompare',compact('owners','inventoryCompares','param'));
     }
@@ -126,4 +128,23 @@ class InventoryCompareController extends Controller
             return '<h1 class="text-danger">失败<br><p style="color: red">不支持该文件类型</p></h1>';
         }
     }
+
+    public function exportInventoryCompare(Request $request){
+        if (!Gate::allows('库存管理-库存-库存对比')){return redirect(url('/')); }
+        if ($request->checkAllSign){
+            $params = $request->input();
+            unset($params['checkAllSign']);
+            $sql=app('inventoryCompareService')->getSql($params);
+        }else{
+            $sql=app('inventoryCompareService')->getSql(['id'=>$request->data]);
+        }
+        $post = Http::post(config('go.export.url'),['type'=>'inventoryCompare','sql'=>$sql]);
+        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',
+        ]);
+    }
 }

+ 39 - 2
app/Http/Controllers/LaborReportController.php

@@ -6,6 +6,7 @@ use App\Events\ClockoutEvent;
 use App\Events\GuardAuditEvent;
 use App\Events\TeamAuditEvent;
 use App\Exports\Export;
+use App\LaborCompany;
 use App\LaborReport;
 use App\LaborReportStatus;
 use App\Services\LaborReportService;
@@ -61,8 +62,9 @@ class LaborReportController extends Controller
                 $this->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
             }
         }
+        $laborCompanies=LaborCompany::query()->get();
         $userWorkGroups=UserWorkgroup::query()->select('id','name')->get();
-        return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave'));
+        return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laborCompanies','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave'));
     }
     public function export(Request $request){
         if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
@@ -81,7 +83,7 @@ class LaborReportController extends Controller
                 "name" => $laborReport->name,
                 "mobile_phone" => $laborReport->mobile_phone,
                 "identity_number" => $laborReport->identity_number,
-                "labor_company" => $laborReport->labor_company,
+                "labor_company" => $laborReport->laborCompany ? $laborReport->laborCompany->name : null,
                 "enter_at" => $laborReport->enter_at,
                 "check_in_at" => $laborReport->check_in_at,
                 "check_out_at" => $laborReport->check_out_at,
@@ -229,4 +231,39 @@ class LaborReportController extends Controller
         }
         return $hour;
     }
+    public function updateLaborCompany(Request $request){
+        if(!Gate::allows('人事管理-临时工报表-修改劳务所')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
+        $param=$request->input();
+        $enter_number=$request->enter_number;
+        app('laborReportService')->修改劳务所($param);
+        $laborReport=LaborReport::query()->where('enter_number',$enter_number)->first();
+        if ($laborReport->labor_company_id==$request->input('laborCompanyId')){
+            $labor_company=LaborCompany::query()->find($request->input('laborCompanyId'))->value('name');
+            return ['success'=>true,'data'=>$laborReport,'labor_company'=>$labor_company];
+        }else{
+            return ['success'=>true,'data'=>'修改劳务所失败'];
+        }
+    }
+    public function 删除($id){
+        if(!Gate::allows('人事管理-临时工报表-删除')){return['success'=>false,'data'=>'没有权限'];}
+        if(is_null($id)){return ['success'=>false,'data'=>'传入id为空'];}
+        $laborReport=app('laborReportService')->删除($id);
+        if ($laborReport>0)return ['success'=>true,'data'=>$laborReport];
+        return ['success'=>true,'data'=>'删除报表失败'];
+    }
+
+    //回收站
+    function recycle(Request $request){
+        if(!Gate::allows('人事管理-临时工报表-删除')){ return redirect('/');  }
+        $laborReports=LaborReport::query()->with(['user','userDutyCheck','userWorkgroup','laborCompany'])->onlyTrashed()->paginate($request->paginate??50);
+        return view('personnel.laborReport.recycle',compact('laborReports'));
+    }
+
+    //回收站恢复
+    function recover(Request $request){
+        if(!Gate::allows('人事管理-临时工报表-删除')){ return redirect('/');  }
+        $checkData=$request->checkData;
+        $this->log(__METHOD__,"回收站恢复临时工报表记录_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
+        return ['success'=>LaborReport::withTrashed()->whereIn('id',$checkData)->restore()];
+    }
 }

+ 85 - 378
app/Http/Controllers/OrderController.php

@@ -2,304 +2,113 @@
 
 namespace App\Http\Controllers;
 
-use App\Exports\Export;
 use App\OracleBasCustomer;
 use App\OracleDOCOrderHeader;
 use App\OracleDOCWaveDetails;
 use App\OrderIssueType;
+use App\Services\LogService;
+use App\Services\OrderService;
+use App\Services\RejectedBillItemService;
+use App\Services\RejectedBillService;
 use Exception;
-use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Http;
-use Maatwebsite\Excel\Facades\Excel;
 
 class OrderController extends Controller
 {
-    private function preciseQuery(Request $request,$sql){
-        $orderdate_start=$request->input('orderdate_start');
-        $orderdate_end=$request->input('orderdate_end');
-        $customerid=$request->input('customerid');
-        $orderno=$request->input('orderno');
-        $soreference5=$request->input('soreference5');
-        $codename_c=$request->input('codename_c');
-        $codename_c_end=$request->input('codename_c_end');
-        $carriername=$request->input('carriername');
-        $soreference1=$request->input('soreference1');
-        $issuepartyname=$request->input('issuepartyname');
-        $notes=$request->input('notes');
-        $addtime=$request->input('addtime');
-        $waveno=$request->input('waveno');
-        $alternate_sku1=$request->input('alternate_sku1');
-        $c_contact = $request->input('c_contact');
-        $c_tel2 = $request->input('c_tel2');
-        $c_province = $request->input('c_province');
-        $c_city = $request->input('c_city');
-        $c_district = $request->input('c_district');
-        $releasestatus = $request->input('releasestatus');
-        $ordernos = $request->input('ordernos');
-        $edisendflag2=$request->edisendflag2;
-        $edisendflag=$request->edisendflag;
-        if ($ordernos){
-            $sql .= " AND orderno IN ".$ordernos;
-        }
-        if ($c_contact){
-            $sql .= " AND c_contact like '".$c_contact."'";
-        }
-        if ($c_tel2){
-            $sql .= " AND c_tel2 like '".$c_tel2."'";
-        }
-        if ($c_province){
-            $sql .= " AND c_province like '".$c_province."'";
-        }
-        if ($c_city){
-            $sql .= " AND c_city like '".$c_city."'";
-        }
-        if ($c_district){
-            $sql .= " AND c_district like '".$c_district."'";
-        }
-        if ($releasestatus){
-            $sql .= " AND releasestatus = '".$releasestatus."'";
-        }
-        if ($alternate_sku1){
-            if ($request->checkAllSign) $detailsOrderno = $this->getOrdersNo($alternate_sku1,false);
-            else $detailsOrderno = $this->getOrdersNo($alternate_sku1,true, $request->page ?? 1, $request->paginate ?? 50);
-            if (count($detailsOrderno)>0){
-                $sql.=' AND orderno IN (';
-                foreach ($detailsOrderno as $index => $no){
-                    if ($index==0){
-                        $sql.="'".$no."'";
-                        continue;
-                    }
-                    $sql.=",'".$no."'";
-                }
-                $sql.=')';
-            }else{
-                $sql .= 'AND orderno IS NULL ';
-            }
-        }
-        if ($orderdate_start && $orderdate_end && $addtime){
-            $request->offsetUnset('orderdate_start');$request->offsetUnset('orderdate_end');
-            $orderdate_start=null;
-            $orderdate_end=null;
-        }
-        if ($orderdate_start){
-            if (strlen($orderdate_start)<11)$orderdate_start .= ' 00:00';
-            $sql.=" and addtime>='".$orderdate_start.":00'";
-        }
-        if ($orderdate_end){
-            if (strlen($orderdate_end)<11)$orderdate_end .= ' 23:59 ';
-            $sql.=" and addtime<='".$orderdate_end.":59' ";
-        }
-        if ($customerid){
-            $arr = explode(',',$customerid);
-            if (count($arr)>0) {
-                $sql.=" and customerid in (";
-                foreach ($arr as $index=>$str){
-                    if ($index==0){
-                        $sql.="'".$str."'";
-                        continue;
-                    }
-                    $sql.=",'".$str."'";
-                }
-                $sql.=")";
-            }
-        }
-        if ($orderno)$sql.=" and orderno like '".$orderno."%'";
-        if ($codename_c&&$codename_c_end)$sql.=" and sostatus between '".$codename_c."' and '".$codename_c_end."'";
-        if ($codename_c&&!$codename_c_end)$sql.=" and sostatus = '".$codename_c."'";
-        if (!$codename_c&&$codename_c_end)$sql.=" and sostatus = '".$codename_c_end."'";
-        if ($carriername)$sql.=" and carriername like '".$carriername."%'";
-        if ($soreference1){
-            $arr=array_filter(preg_split('/[,, ]+/is', $soreference1));
-            if (count($arr)==1){
-                $sql.=" and soreference1 like '".$soreference1."%'";
-            }
-            if (count($arr)>1){
-                $sql.=" and soreference1 in (";
-                foreach ($arr as $index=>$str){
-                    if ($index==0){
-                        $sql.="'".$str."'";
-                        continue;
-                    }
-                    $sql.=",'".$str."'";
-                }
-                $sql.=")";
-            }
-        }
-        if ($waveno)$sql.=" and WaveNo like '".$waveno."%'";
-        if ($issuepartyname)$sql.=" and issuepartyname like '".$issuepartyname."%'";
-        if ($notes){
-            if ($addtime&&$addtime!=0)$sql.=" and addtime >= '".date('Y-m-d H:i:s',strtotime("-".$addtime." day"))."'";
-            $sql.=" and notes like '%".$notes."%'";
-        }else $request->offsetUnset('addtime');
-        if ($soreference5){
-            $arr=array_filter(preg_split('/[,, ]+/is', $soreference5));
-            if (count($arr)>0){
-                $sql.=" and (soreference5 in (";
-                foreach ($arr as $index=>$str){
-                    if ($index==0){
-                        $sql.="'".$str."'";
-                        continue;
-                    }
-                    $sql.=",'".$str."'";
-                }
-                $sql.=") ";
-                /*分箱号*/
-                $oracleActAllocationDetails=DB::connection('oracle')->table('ACT_ALLOCATION_DETAILS')->whereIn('picktotraceid',$arr)->get();
-                $picktotraceids=array_unique(array_column($oracleActAllocationDetails->toArray(),'orderno'));
-                if (count($picktotraceids)>0){
-                    $sql.='OR orderno IN (';
-                    foreach ($picktotraceids as $index=>$str){
-                        if ($index==0){
-                            $sql.="'".$str."'";
-                            continue;
-                        }
-                        $sql.=",'".$str."'";
-                    }
-                    $sql.=") ";
-                }
-                $sql.=")";
-            }
-        }
-        if ($edisendflag2){
-            $sql.=" and edisendflag2 like '".$edisendflag2."%'";
-        }
-        if ($edisendflag){
-            $sql.=" and edisendflag like '".$edisendflag."%'";
-        }
-        return $sql;
-    }
-
     public function delivering(Request $request){
         if(!Gate::allows('订单管理-查询')){ return redirect(url('/'));  }
-        $paginate=$request->input('paginate')??50;
-        $page=$request->input('page')??1;
-        if ($request->alternate_sku1){
-            $page = 1;$paginate=50;
-        }
-        if ($request->checktime_start || $request->checktime_end){
-            $ordernos = app('oracleActAllocationDetailService')
-                ->getOrderno(['checktime_start'=>$request->checktime_start,'checktime_end'=>$request->checktime_end,
-                    'paginate'=>$request->paginate,'page'=>$request->page]);
-            $request->offsetSet('ordernos',$ordernos);
-        }
-        $checkData=$request->input('data');
-        $export=$request->input('checkAllSign');
-        $sql="select ACT_ALLOCATION_DETAILS.picktotraceid,ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
-        ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,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_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($request,$sql);
-        ;$sql.=" ) as counted from (";
-        if (!$export)$sql.=" select * from (";
-        $sql.=" select ROWNUM as rn,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
-                          ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
-                         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_HEADER.EDIREMARKS2 from (select * from DOC_ORDER_HEADER  order by ADDTIME desc )DOC_ORDER_HEADER where 1=1 ";
-        $sql=$this->preciseQuery($request,$sql);
-        if ($checkData){
-            $checkData=explode(',',$checkData);
-            if (count($checkData)>0){
-                $sql.=" and orderno in (";
-                foreach ($checkData as $index=>$str){
-                    if ($index==0){
-                        $sql.="'".$str."'";
-                        continue;
-                    }
-                    $sql.=",'".$str."'";
-                }
-                $sql.=")";
-            }
-        }
-        if (!$export)$sql.=" and ROWNUM<='".$page*$paginate."')";
-        if (!$export)$sql.=" header where header.rn>'".($page-1)*$paginate."' ";
-        $sql.=")DOC_ORDER_HEADER left join DOC_ORDER_DETAILS on DOC_ORDER_DETAILS.ORDERNO=DOC_ORDER_HEADER.ORDERNO
-                      left join BAS_CODES  order_code on order_code.CODE=DOC_ORDER_HEADER.sostatus and order_code.codeid='SO_STS'
-                      left join BAS_CODES  order_detail_code on order_detail_code.CODE=DOC_ORDER_DETAILS.linestatus and order_detail_code.codeid='SO_STS'
-                      left join BAS_Customer on BAS_Customer.customerid=DOC_ORDER_HEADER.customerid
-                      left join  BAS_SKU on DOC_Order_Details.CustomerID=BAS_SKU.CustomerID and DOC_Order_Details.SKU=BAS_SKU.SKU
-                      left join ACT_ALLOCATION_DETAILS on DOC_Order_Details.orderno=ACT_ALLOCATION_DETAILS.orderno and
-                      DOC_Order_Details.orderlineno=ACT_ALLOCATION_DETAILS.orderlineno GROUP BY ACT_ALLOCATION_DETAILS.picktotraceid,
-                      ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,
-                      DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,
-                      DOC_ORDER_HEADER.CustomerID,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
-                      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_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";
-        //转导出
-        if ($checkData || $export){
-            $post = Http::post(config('go.export.url'),['type'=>'order','sql'=>$sql]);
-            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',
-            ]);
-        }
-        $orders=DB::connection('oracle')->select(DB::raw($sql));
-        $commodities=[];
-        $picktotraceids=[];
-        /*
-         * 第二种扁平化方式(节省空间): 使用快慢指针,因拿到数据正常为顺序数据,自下标1开始与上一条对比orderno唯一标识,不同则更新慢指针下标,
-         *  相同则为指定下标map类型数组追加一个键值对属性来记录同类数量,如N条,每次追加属性时先看属性是否存在,存在+1
-         * */
-        foreach ($orders as $index=>$order){
-            if ($order->picktotraceid){
-                if (array_key_exists($order->orderno,$picktotraceids)){
-                    if (!in_array($order->picktotraceid,$picktotraceids[$order->orderno],true)){
-                        array_push($picktotraceids[$order->orderno],$order->picktotraceid);
-                    };
-                }else $picktotraceids[$order->orderno] = [$order->picktotraceid];
-            }
-            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]);
-                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]];
-        }
-        $picktotraceids=json_encode($picktotraceids);
-        $orders=array_values($orders);
-        $orders = new Collection($orders);
-        $commodities=new Collection($commodities);
-        if ($checkData || $export)return $this->export($orders,$commodities);
+        /** @var OrderService $orderService */
+        $orderService = app('orderService');
+        $request = $request->input();
+        $result = $orderService->paginate($request);
+        $picktotraceids = $result['picktotraceids'];
+        $orders = $result['orders'];
+        $commodities = $result['commodities'];
         $customers=OracleBasCustomer::query()->select('customerid','descr_c')->where('customer_type','OW')->where('active_flag','Y')->get();
         $page = $request->page ?? 1;
-        $request=$request->input();
         $codes=DB::connection('oracle')->table('BAS_CODES')->select('code','codename_c')->where('codeid','SO_STS')->orderBy('code','asc')->get();
         $orderIssueType = OrderIssueType::all();
         return view('order/index/delivering',compact('orders','customers','request','codes','commodities','page','picktotraceids','orderIssueType'));
     }
-    //通过商品条码获取订单编号
-    public function getOrdersNo($alternate_sku1, $isPaging = true, $page = 1, $paginate = 50){
-        if ($isPaging){
-            $sql = "SELECT RESULT.ORDERNO FROM
-                        (SELECT ROWNUM rn,DETAIL.ORDERNO as ORDERNO FROM
-                            (SELECT ORDERNO FROM DOC_ORDER_DETAILS WHERE SKU LIKE '".$alternate_sku1."' GROUP BY ORDERNO ORDER BY ORDERNO DESC)DETAIL
-                        WHERE ROWNUM<='".$page*$paginate."')RESULT
-                    WHERE RESULT.rn>'".($page-1)*$paginate."'";
-        }else {
-            $sql = "SELECT ORDERNO FROM DOC_ORDER_DETAILS WHERE SKU LIKE '".$alternate_sku1."' GROUP BY ORDERNO ORDER BY ORDERNO DESC";
+
+    //导出
+    public function export(Request $request){
+        /** @var OrderService $orderService */
+        $orderService = app('orderService');
+        if ($request->data){
+            $post = Http::post(config('go.export.url'),['type'=>'order','sql'=>$orderService->getSql(['data'=>$request->data])]);
+        }else{
+            $post = Http::post(config('go.export.url'),['type'=>'order','sql'=>$orderService->getSql($request->input())]);
         }
-        $orderDetails = DB::connection('oracle')->select(DB::raw($sql));
-        return array_column($orderDetails,'orderno');
+        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',
+        ]);
+    }
+
+    public function createRejectedBill(Request $request){
+        if(!Gate::allows('订单管理-订单-退货单生成')){ return ['success'=>false,'data'=>'您无权操作!'];  }
+        /** @var OrderService $orderService */
+        $orderService = app('orderService');
+        $result = $orderService->get(['data' => $request->data]);
+
+        /** @var RejectedBillService $rejectedBillService */
+        $rejectedBillService = app('rejectedBillService');
+
+        /** @var RejectedBillItemService $rejectedBillItemService */
+        $rejectedBillItemService = app('rejectedBillItemService');
+
+        $commodities = $result['commodities'];
+        $rejectedBillItems = [];
+        foreach ($result['orders'] as $order){
+            $owner = app('ownerService')->firstOrCreate(['name' => $order->customer_descr_c],
+                ['name' => $order->customer_descr_c, 'code' => $order->customer_descr_c]);
+            $logistic = app('logisticService')->firstOrCreate(['name' => $order->carriername],
+                ['name' => $order->carriername, 'code' => $order->carriername]);
+            $rejectedBill = $rejectedBillService->create([
+                'id_owner' => $owner->id,
+                'sender' => $order->c_contact,
+                'logistic_number_return' => $order->soreference5,
+                'id_logistic_return' => $logistic->id,
+                'order_number' => $order->orderno,
+                'mobile_sender' => $order->c_tel2,
+                'logistic_number' => '原单退回',//$order->soreference1
+                'remark' => $order->notes,
+                'is_loaded' =>1,
+            ]);
+            LogService::log(__METHOD__,"生成退货单",json_encode($order),Auth::user()['id']);
+            if ($commodities[$order->orderno] ?? false){
+                foreach ($commodities[$order->orderno] as $orderCommodities){
+                    array_push($rejectedBillItems,[
+                        'id_rejected_bill' => $rejectedBill->id,
+                        'barcode_goods' => $orderCommodities['alternate_sku1'],
+                        'name_goods' => $orderCommodities['descr_c'],
+                        'amount' => $orderCommodities['qtyordered'],
+                        'id_quality_label' => 1,
+                        'created_at' => date('Y-m-d H:i:s'),
+                    ]);
+                }
+            }
+        }
+        $rejectedBillItemService->insert($rejectedBillItems);
+        LogService::log(__METHOD__,"批量生成退货单详情",json_encode($rejectedBillItems),Auth::user()['id']);
+        return ['success'=>true];
+    }
+
+    public function isRejectedBillExist(Request $request){
+        if(!Gate::allows('订单管理-订单-退货单生成')){ return redirect(url('/'));  }
+        /** @var RejectedBillService $rejectedBillService */
+        $rejectedBillService = app('rejectedBillService');
+        $rejectedBills = $rejectedBillService->get(['order_number' => $request->data]);
+        if (count($rejectedBills) == 0)return ['success'=>true];
+        return ['success'=>false, 'data'=>json_encode(array_column($rejectedBills->toArray(),'order_number'))];
     }
 
     //批量备注追加
@@ -399,108 +208,6 @@ class OrderController extends Controller
         return ['success'=>true];
     }
 
-    function export($orders,$commodities){
-        if(!Gate::allows('订单管理')){ return redirect(url('/'));  }
-        ini_set('max_execution_time',3500);
-        ini_set('memory_limit','3526M');
-        $row=[[
-            'orderno'=>'编号',
-            'sostatus'=>'订单状态',
-            'notes'=>'备注',
-            'addtime'=>'接口下发时间',
-            'issuepartyname'=>'店铺名称',
-            'oracleBASCustomer_descr_c'=>'客户',
-            'soreference1'=>'客户订单号',
-            'carriername'=>'承运人',
-            'soreference5'=>'快递单号',
-            'c_contact'=>'收货人名称',
-            'c_tel2'=>'收货人电话',
-            'c_province'=>'省',
-            'c_city'=>'市',
-            'c_district'=>'区',
-            'c_address1'=>'收货人地址',
-            'waveno'=>'波次编号',
-            'warehouseid'=>'仓库',
-            'edisendflag2'=>'快递获取标记',
-            'edisendtime2'=>'快递获取时间',
-            'sku'=>'产品代码',
-            'alternate_sku1'=>'产品条码',
-            'orderdetailcodename'=>'明细状态',
-            'descr_c'=>'产品名称',
-            'qtyordered'=>'订单数量',
-            'checktime'=>'复核时间',
-            'erpcancelflag'=>'接口取消标记',
-            'picking_print_flag'=>'拣货单打印标记',
-            'edisendflag'=>'接口回传标记',
-            'ediremarks2'=>'接口回传异常备注',
-            'releasestatus'=>'订单冻结',
-
-        ]];
-        $list=[];
-        $sign=[];
-        $mergeCell=[];
-        foreach ($orders as $order){
-            $data=[
-                'orderno'=>$order->orderno,
-                'addtime'=>$order->addtime,
-                'sostatus'=>$order->ordercodename,
-                'warehouseid'=>$order->warehouseid,
-                'oracleBASCustomer_descr_c'=>$order->customer_descr_c,
-                'c_contact'=>$order->c_contact,
-                'c_tel2'=>$order->c_tel2,
-                'c_province'=>$order->c_province,
-                'c_city'=>$order->c_city,
-                'c_district'=>$order->c_district,
-                'carriername'=>$order->carriername,
-                'issuepartyname'=>$order->issuepartyname,
-                'waveno'=>$order->waveno,
-                'soreference1'=>$order->soreference1,
-                'soreference5'=>$order->soreference5,
-                'edisendflag2'=>$order->edisendflag2,
-                'edisendtime2'=>$order->edisendtime2,
-                'notes'=>$order->notes,
-                'erpcancelflag'=>$order->erpcancelflag,
-                'ediremarks2'=>$order->ediremarks2,
-                'picking_print_flag'=>$order->picking_print_flag,
-                'edisendflag'=>$order->edisendflag,
-                'releasestatus'=>$order->releasestatus,
-                'c_address1'=>$order->c_address1,
-            ];
-            if (count($commodities[$order->orderno])<1){
-                $data['sku']='';
-                $data['alternate_sku1']='';
-                $data['descr_c']='';
-                $data['qtyordered']='';
-                $data['checktime']='';
-                $data['orderdetailcodename']='';
-                array_push($list,$data);
-                continue;
-            }
-            foreach ($commodities[$order->orderno] as $oracleDOCOrderDetail){
-                $data['sku']=$oracleDOCOrderDetail['sku'];
-                $data['alternate_sku1']=$oracleDOCOrderDetail['alternate_sku1'];
-                $data['descr_c']=$oracleDOCOrderDetail['descr_c'];
-                $data['qtyordered']=$oracleDOCOrderDetail['qtyordered'];
-                $data['checktime']=$oracleDOCOrderDetail['checktime'];
-                $data['orderdetailcodename']=$oracleDOCOrderDetail['orderdetailcodename'];
-                if (isset($sign[$order->orderno])){
-                    $data['orderno']='';$data['sostatus']='';$data['warehouseid']='';$data['oracleBASCustomer_descr_c']='';$data['c_contact']='';$data['addtime']='';
-                    $data['c_tel2']='';$data['carriername']='';$data['issuepartyname']='';$data['waveno']='';$data['soreference1']='';$data['soreference5']='';
-                    $data['edisendflag2']='';$data['edisendtime2']='';$data['notes']='';$data['erpcancelflag']='';$data['picking_print_flag']='';$data['edisendflag']='';
-                    $data['releasestatus']='';$data['c_address1']='';$data['c_province']='';$data['c_city']='';$data['c_district']='';
-                    array_push($list,$data);
-                    continue;
-                }
-                array_push($list,$data);
-                $sign[$order->orderno]=count($list)+1;
-            }
-            if (count($commodities[$order->orderno])>1){
-                $mergeCell[$sign[$order->orderno]]=$sign[$order->orderno]+(count($commodities[$order->orderno])-1);
-            }
-        }
-        $columnName=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","X","Y","Z","AA"];
-        return Excel::download(new Export($row,$list,$mergeCell,$columnName),date('YmdHis', time()).'-出库发运单.xlsx');
-    }
     //取消分配
     public function deAllocation(Request $request){
         if(!Gate::allows('订单管理-编辑')){ return redirect(url('/'));  }

+ 98 - 0
app/Http/Controllers/StoreBlindReceiveController.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Exports\InventoryBlindReceiveExcelExport;
+use App\InventoryBlindReceiveExcel;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Maatwebsite\Excel\Facades\Excel;
+
+class StoreBlindReceiveController extends Controller
+{
+    public function index()
+    {
+        $excels=InventoryBlindReceiveExcel::orderBy('id','desc')->get();
+        return view('store.blindReceive.excel.index',['excels'=>$excels]);
+    }
+    public function create()
+    {
+
+    }
+    public function store(Request $request)
+    {
+        //
+    }
+    public function apiStore(Request $request)
+    {
+        $request=json_decode($request->getContent(),true);
+        $goodses=$request['goodses']??'';
+        $excelFileName=$request['filename']??'';
+        if(!$goodses||!is_array($goodses)||count($goodses)==0){
+            return ['result'=>'failure','fail_info'=>'没有数据提交!'];
+        }
+        $goodsesExcelArray=[['隔口','数量','条码','生产日期','失效日期','批次号']];
+        foreach ($goodses as $goods){
+            array_push($goodsesExcelArray,[$goods['bin'],$goods['amount'],$goods['barcode'].' '
+                ,$goods['produce_date'],$goods['valid_date'],$goods['batch_number']]);
+        }
+        $fileName=Carbon::now()->toDateTimeLocalString().microtime(true).'.xlsx';
+        $fileName = str_replace( ':', '_',$fileName);
+        $goodsNeateningExcel = new InventoryBlindReceiveExcel(['file' => $fileName, 'goods_amount' => count($goodses), 'name'=>$excelFileName]);
+        $goodsNeateningExcel->save();
+        Excel::store(new InventoryBlindReceiveExcelExport($goodsesExcelArray),$fileName,'public');
+        $this->removeExpiredExcel();
+        return ['result'=>'success'];
+    }
+    private function removeExpiredExcel(){
+        $excels=InventoryBlindReceiveExcel::where('created_at','<',Carbon::now()->subDays(100)->toDateTimeString())->get();
+        $excels->each(function(InventoryBlindReceiveExcel $excel){
+            $excel->delete();
+        });
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
+     * @return \Illuminate\Http\Response
+     */
+    public function show(InventoryBlindReceiveExcel $goodsNeateningExcel)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(InventoryBlindReceiveExcel $goodsNeateningExcel)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, InventoryBlindReceiveExcel $goodsNeateningExcel)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\InventoryBlindReceiveExcel  $goodsNeateningExcel
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(InventoryBlindReceiveExcel $goodsNeateningExcel)
+    {
+        //
+    }
+}

+ 16 - 10
app/Http/Controllers/StoreController.php

@@ -9,28 +9,34 @@ use App\Store;
 use App\StoreItems;
 use App\Warehouse;
 use App\WMSReflectReceive;
+use Illuminate\Contracts\Foundation\Application;
+use Illuminate\Contracts\View\Factory;
+use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
+use Illuminate\Http\Response;
+use Illuminate\Routing\Redirector;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Validator;
+use Illuminate\View\View;
 
 class StoreController extends Controller
 {
     /**
      * Display a listing of the resource.
      *
-     * @return \Illuminate\Http\Response
+     * @return Application|Factory|Response|View
      */
     public function index()
     {
         if(!Gate::allows('入库管理-快速入库-查询')){ return redirect(url('/'));  }
         $stores=Store::orderBy('id','DESC')->paginate(50);
-        return view('store.index',['stores'=>$stores]);
+        return view('store.fast.index',['stores'=>$stores]);
     }
 
     /**
      * Show the form for creating a new resource.
      *
-     * @return \Illuminate\Http\Response
+     * @return Application|Factory|Response|View
      */
     public function create()
     {
@@ -41,8 +47,8 @@ class StoreController extends Controller
     /**
      * Store a newly created resource in storage.
      *
-     * @param  \Illuminate\Http\Request  $request
-     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Routing\Redirector
+     * @param Request $request
+     * @return RedirectResponse|Response|Redirector
      */
     public function store(Request $request)
     {
@@ -148,7 +154,7 @@ class StoreController extends Controller
      * Display the specified resource.
      *
      * @param  \App\Store  $store
-     * @return \Illuminate\Http\Response
+     * @return Response
      */
     public function show(Store $store)
     {
@@ -159,7 +165,7 @@ class StoreController extends Controller
      * Show the form for editing the specified resource.
      *
      * @param  \App\Store  $store
-     * @return \Illuminate\Http\Response
+     * @return Response
      */
     public function edit(Store $store)
     {
@@ -169,9 +175,9 @@ class StoreController extends Controller
     /**
      * Update the specified resource in storage.
      *
-     * @param  \Illuminate\Http\Request  $request
+     * @param Request $request
      * @param  \App\Store  $store
-     * @return \Illuminate\Http\Response
+     * @return Response
      */
     public function update(Request $request, Store $store)
     {
@@ -182,7 +188,7 @@ class StoreController extends Controller
      * Remove the specified resource from storage.
      *
      * @param  \App\Store  $store
-     * @return \Illuminate\Http\Response
+     * @return Response
      */
     public function destroy(Store $store)
     {

+ 6 - 2
app/Http/Controllers/StoreItemsController.php

@@ -3,17 +3,21 @@
 namespace App\Http\Controllers;
 
 use App\StoreItems;
+use Illuminate\Contracts\Foundation\Application;
+use Illuminate\Contracts\View\Factory;
+use Illuminate\Http\Response;
+use Illuminate\View\View;
 
 class StoreItemsController extends Controller
 {
     /**
      * Display a listing of the resource.
      *
-     * @return \Illuminate\Http\Response
+     * @return Application|Factory|Response|View
      */
     public function index()
     {
         $storeItems=StoreItems::query()->orderBy('id','DESC')->paginate(50);
-        return view('store.storeItem.index',['storeItems'=>$storeItems]);
+        return view('store.fast.storeItem',['storeItems'=>$storeItems]);
     }
 }

+ 11 - 11
app/Http/Controllers/TestController.php

@@ -11,6 +11,8 @@ use App\Events\CancelOrder;
 use App\Log;
 use App\Logistic;
 use App\OracleActAllocationDetails;
+use App\OracleBasCode;
+use App\OracleDOCASNDetail;
 use App\OracleDOCOrderHeader;
 use App\OracleDocOrderPackingSummary;
 use App\OracleDOCWaveDetails;
@@ -328,18 +330,16 @@ class TestController extends Controller
     }
 
     function test1(){
-        $package = OrderPackage::query()->whereNull('order_id')->first();
-        $package->load(['order'=>function($query){
-            $query->with('owner','logistic');
-        },'paperBox','measuringMachine']);
-        $logisticNumberController = new LogisticNumberFeatureController();
-        if (!$package->order){
-            $package->order = new Order();
+        $wms_code = "ASN2008120974";
+        $basCodes = OracleBasCode::query()->select('code','codename_c')
+            ->whereIn('codename_c',['部分收货','订单创建'])->where('codeid','ASN_STS')->get();
+        $basCodeMap = [];
+        foreach ($basCodes as $basCode){
+            $basCodeMap[$basCode->code] = $basCode->codename_c;
         }
-        if (!$package->order->logistic){
-            $package->order->logistic = $logisticNumberController->getLogisticByFeatures($package->logistic_number);
-        }
-        dd($package);
+        $docASNs=OracleDOCASNDetail::query()->where("ASNNo",$wms_code)->get();   //入库单
+        $docASNs[0]->load('oracleDocAsnHeader');
+        dd($docASNs[0]);
     }
 
     /*1*/

+ 0 - 11
app/Http/Controllers/UserDutyCheckController.php

@@ -15,7 +15,6 @@ use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\Cookie;
 use Illuminate\Support\Facades\Validator;
 use Ramsey\Uuid\Uuid;
 
@@ -50,7 +49,6 @@ class UserDutyCheckController extends Controller
         if ($userLaborToken && $user_id) {
             $userDetail = UserDetail::find($user_id);
             if($userDetail){
-//                if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
                 if($importAndExportQRCodeType=='import') return redirect('personnel/checking-in/userDutyCheck/updateUserLaborCompanies/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
                 $userDutyCheck = $this->importAndExportDutyCheck($user_id, $importAndExportQRCodeType);
                 if ($userDutyCheck && $userDutyCheck->isNotImport == true) return "<h1 style='color: darkred;text-align:center'>当前还未入场,不可出场!</h1>";
@@ -77,15 +75,6 @@ class UserDutyCheckController extends Controller
         $userDetail = UserDetail::where('mobile_phone', $mobile_phone)->first();
         if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/' . $mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
         if (Cache::has('dutyCheckTokenUser_' . $userDetail->user_id)) return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
-//        $userDutyCheckOld = UserDutyCheck::where('user_id', $userDetail->user_id)->orderBy('checked_at', 'DESC')->first();
-//        $date = date('Y-m-d H:i:s');
-//        $lastDate = Carbon::parse($userDutyCheckOld['checked_at']);
-//        $thisDate = Carbon::parse($date);
-//        $diffDate = $thisDate->diffInMinutes($lastDate);
-//        //未登录从新选择劳务所
-//        if ($diffDate > 0.5 * 1440 ||!$userDutyCheckOld) {
-//            return redirect('personnel/checking-in/userDutyCheck/updateUserLaborCompanies/' . $mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
-//        }
         if($importAndExportQRCodeType=='import') return redirect('personnel/checking-in/userDutyCheck/updateUserLaborCompanies/' . $userDetail->mobile_phone)->with("importAndExportQRCodeType", $importAndExportQRCodeType);
         $userDutyCheck=$this->importAndExportDutyCheck($userDetail->user_id, $importAndExportQRCodeType);
         if ($userDutyCheck && $userDutyCheck->isNotImport == true) return "<h1 style='color: darkred;text-align:center'>当前还未入场,不可出场!</h1>";

+ 43 - 9
app/Http/Controllers/api/thirdPart/flux/ProcessController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\thirdPart\flux;
 
 
 use App\Commodity;
+use App\OracleBasCode;
 use App\OracleBasSKU;
 use App\OracleDOCASNDetail;
 use App\OracleDOCMovementDetail;
@@ -11,6 +12,7 @@ use App\OracleDOCMovementHeader;
 use App\OracleDOCOrderDetail;
 use App\Http\Controllers\Controller;
 use App\Owner;
+use App\ProcessesContent;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -22,26 +24,36 @@ class ProcessController extends Controller
         $wms_code=$request->input('wms_code');
         if (!$wms_code)return ['error'=>'提交的单据号为空'];
         try{
+            $basCodes = OracleBasCode::query()->select('code','codename_c')
+                ->whereIn('codename_c',['部分收货','订单创建'])->where('codeid','ASN_STS')->get();
+            $basCodeMap = [];
+            foreach ($basCodes as $basCode){
+                $basCodeMap[$basCode->code] = $basCode->codename_c;
+            }
             $docASNs=OracleDOCASNDetail::query()->where("ASNNo",$wms_code)->get();   //入库单
         }
         catch (\Exception $e){
-            return ['error'=>'数据库连接失败!'];
+            return ['error'=>'数据库连接失败'];
         }
         if (count($docASNs)>0){
             $owner=Owner::query()->where("code",$docASNs[0]->customerid)->first();
             if (!$owner)$owner=$this->storeOwner($docASNs[0]->customerid);
             if (!$owner)return ['error'=>'找到了入库单,但未查询到货主代码!'];
-            $commodities=$this->resetData($docASNs,"sku","customerid","expectedqty","asnlineno");
+            $docASNs[0]->load('oracleDocAsnHeader');
+            $asnstatus = $basCodeMap[$docASNs[0]['oracleDocAsnHeader'] ? $docASNs[0]['oracleDocAsnHeader']['asnstatus'] : null] ?? null;
+            $commodities=$this->resetData($docASNs,"sku","customerid","receivedqty","asnlineno");
+            $commodities = $this->resetCommodityAmount($wms_code,$request->is_finished_product,$commodities);
             $processContent=[
                 'wms_code'=>$wms_code,
                 'owner_name'=>$owner->name,
                 'owner_id'=>$owner->id,
                 'commodities'=>$commodities,
                 'bill_type'=>'入库单',
+                'asnstatus' => $asnstatus,
             ];
             return json_encode($processContent);
         }
-        $docOrders=OracleDOCOrderDetail::where("OrderNo",$wms_code)->get();//出库单
+        $docOrders=OracleDOCOrderDetail::query()->where("OrderNo",$wms_code)->get();//出库单
         if (count($docOrders)>0){
             $owners=Owner::query()->where("code",$docOrders[0]->customerid)->get();
             if ($owners->isEmpty()){
@@ -50,7 +62,8 @@ class ProcessController extends Controller
                 $owner=$owners->first();
             }
             if (!$owner)return ['error'=>'找到了入库单,但未查询到货主代码!'];
-            $commodities=$this->resetData($docOrders,"sku","customerid","qtyordered",'orderlineno');
+            $commodities=$this->resetData($docOrders,"sku","customerid","qtyshipped",'orderlineno');
+            $commodities = $this->resetCommodityAmount($wms_code,$request->is_finished_product,$commodities);
             $processContent=[
                 'wms_code'=>$wms_code,
                 'owner_name'=>$owner->name,
@@ -60,11 +73,11 @@ class ProcessController extends Controller
             ];
             return json_encode($processContent);
         }
-        $docMovementDetails=OracleDOCMovementDetail::where("MDOCNO",$wms_code)->get();//移库单
+        $docMovementDetails=OracleDOCMovementDetail::query()->where("MDOCNO",$wms_code)->get();//移库单
         if (count($docMovementDetails)>0){
-            $docMovementHeaders=OracleDOCMovementHeader::select('CustomerID')->where('MDOCNO',$wms_code)->get();
+            $docMovementHeaders=OracleDOCMovementHeader::query()->select('customerid')->where('MDOCNO',$wms_code)->get();
             if (count($docMovementHeaders)<1)return ['error'=>'找到了移库单,但未查询移库单表头!'];
-            $owner=Owner::where("code",$docMovementHeaders[0]->customerid)->first();
+            $owner=Owner::query()->where("code",$docMovementHeaders[0]->customerid)->first();
             if (!$owner)$owner=$this->storeOwner($docMovementHeaders[0]->customerid);
             if (!$owner)return ['error'=>'找到了入库单,但未查询到货主代码!'];
             $commodities=$this->resetData($docMovementDetails,"sku","customerid","toqty","mdoclineno",$docMovementHeaders);
@@ -149,7 +162,7 @@ class ProcessController extends Controller
     }
 
     private function storeCommodity($basSKUs){
-        $oracleBasSkus=OracleBasSKU::whereIn("CustomerID",$basSKUs['owner_code'])->whereIn("SKU",$basSKUs['sku'])->get();
+        $oracleBasSkus=OracleBasSKU::query()->whereIn("CustomerID",$basSKUs['owner_code'])->whereIn("SKU",$basSKUs['sku'])->get();
         if (count($oracleBasSkus)<1)return;
         $commoditiesData=[];
         $commoditiesTem=["sku"=>[],"owner_id"=>[]];
@@ -167,7 +180,7 @@ class ProcessController extends Controller
         }
         DB::table('commodities')->insert($commoditiesData);
         $this->log(__METHOD__, 'FLUX二次加工单接口录入商品__' . __FUNCTION__, json_encode($commoditiesData), Auth::user()['id']);
-        $commodities=Commodity::whereIn('sku',$commoditiesTem['sku'])->whereIn('owner_id',$commoditiesTem['owner_id'])->get();
+        $commodities=Commodity::query()->whereIn('sku',$commoditiesTem['sku'])->whereIn('owner_id',$commoditiesTem['owner_id'])->get();
         foreach ($commodities as $commodity){
             $commodityBarCodeData[$commodity->sku."_".$commodity->owner_id]['commodity_id']=$commodity->id;
         }
@@ -188,4 +201,25 @@ class ProcessController extends Controller
         $this->log(__METHOD__, 'FLUX二次加工单接口录入货主__' . __FUNCTION__, json_encode($owner), Auth::user()['id']);
         return $owner;
     }
+
+    private function resetCommodityAmount($code,$is_finished_product,$commodities){
+        if ($is_finished_product) $type = "成品单";
+        else $type="原料单";
+        $ids = array_column($commodities,'id');
+        $processesContent = ProcessesContent::query()->where('type',$type)->where('wms_code',$code)
+            ->whereIn('commodity_id',$ids)->get();
+        if (count($processesContent) < 1)return $commodities;
+        $amountMap = [];
+        foreach ($processesContent as $content){
+            if ($amountMap[$content->commodity_id] ?? false)$amountMap[$content->commodity_id] += $content->amount;
+            else $amountMap[$content->commodity_id] = $content->amount;
+        }
+        foreach ($commodities as &$commodity){
+            if (($amountMap[$commodity['id']] ?? false) && $amountMap[$commodity['id']] < $commodity['amount']){
+                $commodity['former_amount'] = $commodity['amount'];
+                $commodity['amount'] = ($commodity['amount'])-$amountMap[$commodity['id']];
+            }
+        }
+        return $commodities;
+    }
 }

+ 19 - 0
app/InventoryBlindReceiveExcel.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Storage;
+
+class InventoryBlindReceiveExcel extends Model
+{
+    //
+    protected $fillable = [
+        'file','goods_amount','name'
+    ];
+    public function delete()
+    {
+        Storage::disk('public')->delete($this['file']);
+        return parent::delete();
+    }
+}

+ 65 - 30
app/LaborReport.php

@@ -14,13 +14,13 @@ class LaborReport extends Model
     use ModelTimeFormat;
     use SoftDeletes;
     protected $fillable=[
-        'id','enter_number','user_workgroup_id','user_id','name','mobile_phone','identity_number','labor_company',
+        'id','enter_number','user_workgroup_id','user_id','name','mobile_phone','identity_number','labor_company_id',
         'check_in_at','verify_at','group_user_id','check_out_at','online_duration','working_duration','created_at','updated_at',
         'user_duty_check_id','relax_time'
     ];
     protected $appends = [
         'is_exportGroup','is_export', 'exit_at','enter_at','sequence', 'amountOfJoined','remark','thisRecordOnlineTime','thisRecordWorkingTime',
-        'totalOnlineTime','verifyPerson','userDutyCheckVerifyUserId',
+        'totalOnlineTime','verifyPerson','userDutyCheckVerifyUserId','isAdult',
     ];
     protected $tempFields = [
         'temEnteringRecord',
@@ -34,6 +34,9 @@ class LaborReport extends Model
     public function userWorkgroup(){
         return $this->hasOne('App\UserWorkgroup','id','user_workgroup_id');
     }
+    public  function laborCompany(){
+        return $this->hasOne('App\LaborCompany','id','labor_company_id');
+    }
     public function user(){
         return $this->hasOne('App\User','id','group_user_id');
     }
@@ -54,7 +57,6 @@ class LaborReport extends Model
     public function getIsExportGroupAttribute(){
         return $this['check_out_at']? true:false;
     }
-
     public function getVerifyPersonAttribute(){
         if ($this['group_user_id']&&$this['group_user_id']==Auth::user()['id'])
         return Auth::user()['name'];
@@ -165,8 +167,6 @@ class LaborReport extends Model
     //进场时间
     public function getEnterAtAttribute()
     {
-//        if(!$this['enteringRecord'])return null;
-//        return $this['enteringRecord']->userDutyCheck['checked_at'];
         $laborReportStatus=LaborReportStatus::where('labor_report_id',$this['id'])->where('status','未审核')->orderBy('id','desc')->first();
         if (empty($laborReportStatus))return null;
         return Carbon::parse($laborReportStatus['created_at'])->format('Y-m-d H:i:s');
@@ -174,29 +174,6 @@ class LaborReport extends Model
 
     public function getEnteringRecordAttribute()
     {
-//        if($this['temEnteringRecord'])return $this['temEnteringRecord'];
-//        if($this->laborReportStatus['status']=='已入场'||$this->laborReportStatus['status']=='未审核')
-//        {
-//            $laborReport=$this;
-//            if(empty($laborReport))
-//                $laborReport=LaborReport::with(['laborReportStatus'=>function($query){
-//                    return $query->whereIn('status',['已入场','未审核']);
-//                }])->whereNotNull('deleted_at')->where('enter_number',$this['enter_number'])->first();
-//            if(empty($laborReport)){
-//                if(!$this['enter_number']){
-//                    $laborReport=LaborReport::with(['laborReportStatus'=>function($query){
-//                        return $query->whereIn('status',['已入场','未审核']);
-//                    }])->whereNotNull('deleted_at')->where('user_id',$this['user_id'])->first();
-//                    if(!$laborReport) return null;
-//                    $laborReport=LaborReport::with(['laborReportStatus'=>function($query){
-//                        return $query->where('status','已退场');
-//                    }])->whereNotNull('deleted_at')->where('enter_number',$laborReport['enter_number'])->first();
-//                    if ($laborReport->isEmpty())return null;
-//                }
-//            }
-////            $this['temEnteringRecord']=$laborReport;
-//            return $laborReport;
-//        }
         $laborReport=LaborReport::with(['laborReportStatus'=>function($query){
             return $query->whereIn('status',['已入场','未审核']);
         }])->where('user_id',$this['user_id'])->orderBy('id','desc')->first();
@@ -226,8 +203,7 @@ class LaborReport extends Model
         $laborReportStatus=LaborReportStatus::where('labor_report_id',$this['id'])->orderBy('id','desc')->first();
         return $laborReportStatus['status']=='已退场'?true:false;
     }
-
-//出场更新临时工报表信息
+    //出场更新临时工报表信息
     static function exitAndChangeLaborReport($laborReport,$userDutyCheck){
         $laborReportStatus=new LaborReportStatus([
             'labor_report_id'=>$laborReport['id'],
@@ -249,6 +225,65 @@ class LaborReport extends Model
         return $laborReport;
     }
 
+    /**
+     * 是否成年
+     * @param 身份证号
+     * @return int 0 成年,1未成年
+     */
+    public function getIsAdultAttribute(){
+            $flag = 0;
+            $tyear=intval(substr($this['identity_number'],6,4));
+            $tmonth=intval(substr($this['identity_number'],10,2));
+            $tday=intval(substr($this['identity_number'],12,2));
+            if($tyear>date("Y")||$tyear<(date("Y")-100)){
+                $flag=0;
+            }elseif($tmonth<0||$tmonth>12){
+                $flag=0;
+            }elseif($tday<0||$tday>31){
+                $flag=0;
+            }else{
+                $day_sum = self::full_year_day($tyear,$tmonth,16);
+                if((time()-mktime(0,0,0,$tmonth,$tday,$tyear))>$day_sum*24*60*60){
+                    $flag=0;
+                }else{
+                    $flag=1;
+                }
+            }
+        return $flag;
+    }
+    /**
+     * n周岁的天数
+     * @param $tyear
+     * @param $tmonth
+     * @return int
+     */
+    public static function full_year_day($tyear,$tmonth,$type=16){
+        $sum=365*$type;
+        for($i=$tyear+1;$i<$tyear+$type;$i++)//考虑中间年份
+        {
+            if(self::is_leap_year($i))
+                $sum++;
+        }
+        if(self::is_leap_year($tyear)&&$tmonth<=2)//考虑初末两年
+            $sum++;
+        if(self::is_leap_year($tyear+$type)&&$tmonth>=3){
+            $sum++;
+        }
+        return $sum;
+    }
+
+    /**
+     * @param $year
+     * @return int 1是闰年,0不是闰年
+     */
+    public static function is_leap_year($year){
+        if(($year%4==0&&$year%100!=0)||$year%400==0)
+            return 1;
+        else
+            return 0;
+    }
+
+
 
 
 

+ 4 - 1
app/OracleDOCASNDetail.php

@@ -12,6 +12,9 @@ class OracleDOCASNDetail extends Model
     protected $table="Doc_ASN_Details";
 
     public function sku(){
-        return OracleBasSKU::where(['sku'=>$this->sku,'customerId'=>$this->customerId])->get();
+        return OracleBasSKU::query()->where(['sku'=>$this->sku,'customerId'=>$this->customerId])->get();
+    }
+    public function oracleDocAsnHeader(){
+        return $this->belongsTo('App\OracleDOCAsnHeader','asnno','asnno');
     }
 }

+ 5 - 1
app/Providers/AppServiceProvider.php

@@ -22,6 +22,8 @@ use App\Services\PackageStatisticsService;
 use App\Services\ProcessMethodService;
 use App\Services\ProcessService;
 use App\Services\ProcessStatisticService;
+use App\Services\RejectedBillItemService;
+use App\Services\RejectedBillService;
 use App\Services\ShopService;
 use App\Services\RejectedService;
 use App\Services\WaybillFinancialService;
@@ -45,7 +47,7 @@ class AppServiceProvider extends ServiceProvider
     {
         //
         app()->singleton('orderIssuePerformanceService',OrderIssuePerformanceService::class);
-        app()->singleton('InventoryCompareService',InventoryCompareService::class);
+        app()->singleton('inventoryCompareService',InventoryCompareService::class);
     }
 
     /**
@@ -95,6 +97,8 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('orderIssueService',OrderIssueService::class);
         app()->singleton('orderService',OrderService::class);
         app()->singleton('oracleDocOrderHeaderService',OracleDOCOrderHeaderService::class);
+        app()->singleton('rejectedBillService',RejectedBillService::class);
+        app()->singleton('rejectedBillItemService',RejectedBillItemService::class);
 
         $this->loadingOrderModuleService();
         $this->loadingBasedModuleService();

+ 30 - 5
app/Services/InventoryAccountService.php

@@ -4,7 +4,6 @@
 namespace App\Services;
 
 use App\Commodity;
-use App\CommodityBarcode;
 use App\Http\Controllers\Controller;
 use App\InventoryAccount;
 use App\InventoryAccountMission;
@@ -14,15 +13,28 @@ use App\OracleBasCustomer;
 use App\OracleInvLotLocId;
 use App\Owner;
 use App\Services\common\QueryService;
-use App\Sign;
 use Carbon\Carbon;
-use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 
 class InventoryAccountService
 {
-
+    private function conditionQueryInventoryAccountMission(array $params){
+        $inventoryAccountMissions=InventoryAccountMission::with(['commodity.barcodes','stockInventoryPersons'])->orderBy('difference_amount','desc');
+        $columnQueryRules=[];
+        $inventoryAccountMissions = app(QueryService::class)->query($params,$inventoryAccountMissions,$columnQueryRules,'inventory_account_missions');
+        return $inventoryAccountMissions;
+    }
+    public  function getSql(array $params){
+        return $this->conditionQueryInventoryAccountMission($params)->selectRaw("inventory_account_missions.*")
+            ->leftJoin('signs','inventory_account_missions.id','signs.signable_id')
+                ->selectRaw('signs.mark stockInventoryPerson')
+            ->leftJoin('commodities','inventory_account_missions.commodity_id','commodities.id')
+                ->selectRaw('commodities.name commodity_name,commodities.sku commodity_sku')
+            ->leftJoin('commodity_barcodes','commodity_barcodes.commodity_id','commodities.id')
+                ->selectRaw('commodity_barcodes.code commodity_barcode_code')
+            ->sql();
+    }
     private function conditionQuery($queryParam){
         $inventories=InventoryAccount::query()->with(['owner','creator'])->orderBy('id','desc');
         $columnQueryRules=[
@@ -37,7 +49,6 @@ class InventoryAccountService
         $inventories = $this->conditionQuery($queryParam);
         return $inventories->paginate($queryParam['paginate'] ?? 50);
     }
-
     public function get($queryParam){
         $inventories = $this->conditionQuery($queryParam);
         return $inventories->get();
@@ -406,5 +417,19 @@ class InventoryAccountService
         $inventoryAccountMission->update();
         $inventoryAccountMission->createSignStockInventoryPersons();
     }
+    public function 删除盘点记录($inventoryAccountMissionId,$inventoryAccountId){
+        $inventoryAccountMission=InventoryAccountMission::query()->where('id',$inventoryAccountMissionId)->delete();
+        Controller::logS(__METHOD__,__FUNCTION__,json_encode($inventoryAccountMissionId));
+        if ($inventoryAccountMission>0){
+            $inventoryAccount=InventoryAccount::query()->find($inventoryAccountId);
+            $inventoryAccount->total=$inventoryAccount->total-1;
+            $inventoryAccount->processed=$inventoryAccount->getProcessedAmount();//已盘点数
+            $inventoryAccount->difference=$inventoryAccount->getDifferenceAmount();//盘点差异数
+            $inventoryAccount->returned=$inventoryAccount->getReturnedAmount(); //复盘归位数
+            $inventoryAccount->update();
+            Controller::logS(__METHOD__,'删除盘点记录时修改盘点任务信息'.__FUNCTION__,json_encode($inventoryAccountId));
+        }
+        return $inventoryAccountMission;
+    }
 
 }

+ 4 - 3
app/Services/InventoryCompareService.php

@@ -166,8 +166,9 @@ class InventoryCompareService
             'date_start' => ['alias' => 'created_at' , 'startDate' => ' 00:00:00'],
             'date_end' => ['alias' => 'created_at' , 'endDate' => ' 23:59:59'],
             'mission_code' => ['timeLimit' => 20],
+            'id' => ['multi' => ','],
         ];
-        $inventoryCompares = app(QueryService::class)->query($param,$inventoryCompares,$columnQueryRules);
+        $inventoryCompares = app(QueryService::class)->query($param,$inventoryCompares,$columnQueryRules,'inventory_compares');
         return $inventoryCompares;
     }
 
@@ -176,8 +177,8 @@ class InventoryCompareService
      * @return string $sql
      */
     public function getSql(array $params){
-        $this->conditionQueryInventoryCompare($params)
-            ->selectRaw("inventory_compares.mission_code,inventory_compares.custom_location,inventory_compares.quality,inventory_compares.amount_in_sys,inventory_compares.amount_in_compare,inventory_compares.differ,inventory_compares.created_at")
+      return  $this->conditionQueryInventoryCompare($params)
+            ->selectRaw("inventory_compares.*")
             ->leftJoin('owners','inventory_compares.owner_id','owners.id')
                 ->selectRaw('owners.name owner_name')
             ->leftJoin('commodities','inventory_compares.commodity_id','commodities.id')

+ 38 - 11
app/Services/LaborReportService.php

@@ -27,7 +27,7 @@ class LaborReportService
 {
     private function conditionQuery(array $params){
         $user=Auth::user();
-        $laborReports=LaborReport::query()->with(['user','userDutyCheck','userWorkgroup'])->orderBy('labor_reports.id','DESC');
+        $laborReports=LaborReport::query()->with(['user','userDutyCheck','userWorkgroup','laborCompany'])->orderBy('labor_reports.id','DESC');
         if (!($params["is_export"] ?? false)){
             $laborReports = $laborReports->whereNotIn('labor_reports.enter_number',function ($builder)use($params){
                 $builder->select('enter_number')->from('labor_reports')
@@ -45,9 +45,11 @@ class LaborReportService
             'enter_number' => ['timeLimit' => 15],
             'created_at_start' => ['alias' => 'created_at' , 'startDate' => ' 00:00:00'],
             'created_at_end' => ['alias' => 'created_at' , 'endDate' => ' 23:59:59'],
-            'identity_number' => ['timeLimit' => 15]
+            'identity_number' => ['timeLimit' => 15],
+            'name' => ['like' => ''],
+            'id' => ['multi' => ',']
         ];
-        $laborReports = app(QueryService::class)->query($params,$laborReports,$columnQueryRules);
+        $laborReports = app(QueryService::class)->query($params,$laborReports,$columnQueryRules,'labor_reports');
         if((Gate::allows('人事管理-临时工报表-可见全部组')||Gate::allows('人事管理-门卫审核')) && !($params["user_workgroup_id"] ?? false)){
             $laborReports->where(function ($query)use($user){
                 $query->whereIn('labor_reports.user_workgroup_id',$user?$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组')):[])
@@ -57,6 +59,7 @@ class LaborReportService
             $laborReports->whereIn('labor_reports.user_workgroup_id',
                 $user?$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组')):[]);
         }
+        $laborReports = app(QueryService::class)->query($params,$laborReports,$columnQueryRules,'labor_reports');
         return $laborReports;
     }
     public function paginate(array $params){
@@ -70,6 +73,8 @@ class LaborReportService
         return $this->conditionQuery($params)->selectRaw("labor_reports.*")
             ->leftJoin('user_workgroups','labor_reports.user_workgroup_id','user_workgroups.id')
                 ->selectRaw('user_workgroups.name user_workgroup_name')
+            ->leftJoin('labor_companies','labor_reports.labor_company_id','labor_companies.id')
+                ->selectRaw('labor_companies.name labor_company')
             ->sql();
     }
 
@@ -99,19 +104,27 @@ class LaborReportService
             //退场时间跨天情况
             $yesterdayDate=Carbon::now()->subDays(1)->format('Y-m-d');
             $laborReportYesterday=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$yesterdayDate.'%')->orderBy('id','desc')->first();
-            if (!$laborReportYesterday->check_out_at&&$laborReportYesterday['user_workgroup_id']){
-                UserDutyCheck::where('user_id',$laborReportYesterday->user_id)->where('type','登出')->where('checked_at','like',Carbon::now()->format('Y-m-d H:i').'%')->orderBy('id','desc')->delete();
-                return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可退场,请联系组长!</h1>";
+            if (!$laborReportYesterday->group_user_id&&!$laborReportYesterday->verify){
+                LaborReport::query()->where('user_id',$userDutyCheck->user_id)->whereNull('group_user_id')->whereNull('verify_at')->orderBy('id','desc')->delete();
+                $laborReportYesterday=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$yesterdayDate.'%')->orderBy('id','desc')->first();
             }
+//            if (!$laborReportYesterday->check_out_at&&$laborReportYesterday['user_workgroup_id']){
+//                UserDutyCheck::where('user_id',$laborReportYesterday->user_id)->where('type','登出')->where('checked_at','like',Carbon::now()->format('Y-m-d H:i').'%')->orderBy('id','desc')->delete();
+//                return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可退场,请联系组长!</h1>";
+//            }
                 $exportReport=LaborReport::exitAndChangeLaborReport($laborReportYesterday,$userDutyCheck);
                 Controller::logS(__METHOD__,"退场更改临时工报表信息__".__FUNCTION__,json_encode([$laborReportYesterday,$userDutyCheck]));
                 if ($exportReport) event(new ExportEvent($exportReport));
         }
         if($laborReport&&$importAndExportQRCodeType=='export'){
-            if (!$laborReport['check_out_at']&&$laborReport['user_workgroup_id']){
-                UserDutyCheck::where('user_id',$laborReport->user_id)->where('type','登出')->where('checked_at','like',Carbon::now()->format('Y-m-d H:i').'%')->orderBy('id','desc')->delete();
-                return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可退场,请联系组长!</h1>";
+            if (!$laborReport->group_user_id&&!$laborReport->verify){
+                LaborReport::where('user_id',$userDutyCheck->user_id)->whereNull('group_user_id')->whereNull('verify_at')->orderBy('id','desc')->delete();
+                $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
             }
+//            if (!$laborReport['check_out_at']&&$laborReport['user_workgroup_id']){
+//                UserDutyCheck::where('user_id',$laborReport->user_id)->where('type','登出')->where('checked_at','like',Carbon::now()->format('Y-m-d H:i').'%')->orderBy('id','desc')->delete();
+//                return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可退场,请联系组长!</h1>";
+//            }
             $exportReport=LaborReport::exitAndChangeLaborReport($laborReport,$userDutyCheck);
             Controller::logS(__METHOD__,"退场更改临时工报表信息__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
             if ($exportReport) event(new ExportEvent($exportReport));
@@ -165,14 +178,15 @@ class LaborReportService
         $mobile_phone=$userDetail['mobile_phone'];
         $identity_number=$userDetail['identity_number'];
         $labor_company_id=UserLabor::where('user_id',$user_id)->value('labor_company_id');
-        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
+//        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
         $laborReport=new LaborReport([
             'user_workgroup_id'=>$userWorkgroupID,
             'user_id'=>$user_id,
             'name'=>$name,
             'mobile_phone'=>$mobile_phone,
             'identity_number'=>$identity_number,
-            'labor_company'=>$labor_company,
+//            'labor_company'=>$labor_company,
+            'labor_company_id'=>$labor_company_id,
             'check_in_at'=>date('Y-m-d H:i:s'),
             'user_duty_check_id'=>$userDutyCheck->id,
         ]);
@@ -185,5 +199,18 @@ class LaborReportService
         $laborReportStatus->save();
         return $laborReport;
     }
+    public function 修改劳务所($param){
+        $laborReports=LaborReport::query()->where('enter_number',$param['enter_number'])->get();
+        foreach($laborReports as $laborReport){
+            $laborReport->labor_company_id=$param['laborCompanyId'];
+            $laborReport->update();
+        }
+        Controller::logS(__METHOD__,'修改临时工报表劳务所'.__FUNCTION__,json_encode($param));
+    }
+    public function 删除($id){
+        $laborReport=LaborReport::query()->where('id',$id)->delete();
+        Controller::logS(__METHOD__,'删除盘点记录时修改盘点任务信息'.__FUNCTION__,json_encode($id));
+        return $laborReport;
+    }
 
 }

+ 17 - 8
app/Services/OracleActAllocationDetailService.php

@@ -11,25 +11,34 @@ use Illuminate\Support\Facades\DB;
  */
 Class OracleActAllocationDetailService
 {
-    public function paginate(array $params){
-        $page = $params['page'] ?? 1;
-        $pagiante = $params['pagiante'] ?? 50;
-        if (!is_numeric($page) || !is_numeric($pagiante))return;
-        $sql = "SELECT ACT_ALLOCATION_DETAILS.* FROM(SELECT ACT_ALLOCATION_DETAILS.*,ROWNUM rn FROM
-                    (SELECT orderno FROM ACT_ALLOCATION_DETAILS WHERE 1=1 ";
+    private function query($sql, array $params){
         if ($params['checktime_start'] ?? false){
             $sql .= " AND checktime >= '".$params['checktime_start']." 00:00:00'";
         }
         if ($params['checktime_end'] ?? false){
             $sql .= " AND checktime <= '".$params['checktime_end']." 23:59:59'";
         }
+        return $sql;
+    }
+
+    public function paginate(array $params){
+        $sql = "SELECT ACT_ALLOCATION_DETAILS.* FROM(SELECT ACT_ALLOCATION_DETAILS.*,ROWNUM rn FROM
+                    (SELECT orderno FROM ACT_ALLOCATION_DETAILS WHERE 1=1 ";
+        $sql = $this->query($sql, $params);
         $sql .= "GROUP BY orderno)ACT_ALLOCATION_DETAILS)ACT_ALLOCATION_DETAILS
-                WHERE ACT_ALLOCATION_DETAILS.rn <= ".$page*$pagiante." AND rn >".($page-1)*$pagiante;
+                WHERE ACT_ALLOCATION_DETAILS.rn <= ".$params['page']*$params['paginate']." AND rn >".($params['page']-1)*$params['paginate'];
+        return DB::connection('oracle')->select(DB::raw($sql));
+    }
+    public function get(array $params){
+        $sql = "SELECT orderno FROM ACT_ALLOCATION_DETAILS WHERE 1=1 ";
+        $sql = $this->query($sql, $params);
+        $sql .= "GROUP BY orderno";
         return DB::connection('oracle')->select(DB::raw($sql));
     }
 
     public function getOrderno(array $params){
-        $allocations = $this->paginate($params);
+        if (($params['page'] ?? false) && ($params['paginate'] ?? false))$allocations = $this->paginate($params);
+        else $allocations = $this->get($params);
         $count = count($allocations);
         $str = "(";
         foreach ($allocations as $index => $allocation){

+ 284 - 3
app/Services/OrderService.php

@@ -13,10 +13,291 @@ use App\OrderPackageCommodities;
 use App\Owner;
 use App\RejectedBill;
 use App\Shop;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\DB;
 use Carbon\Carbon;
 
 class OrderService
 {
+    private function preciseQuery(array $params,$sql){
+        $orderdate_start=$params["orderdate_start"] ?? null;
+        $orderdate_end=$params["orderdate_end"] ?? null;
+        $customerid=$params["customerid"] ?? null;
+        $orderno=$params["orderno"] ?? null;
+        $soreference5=$params["soreference5"] ?? null;
+        $codename_c=$params["codename_c"] ?? null;
+        $codename_c_end=$params["codename_c_end"] ?? null;
+        $carriername=$params["carriername"] ?? null;
+        $soreference1=$params["soreference1"] ?? null;
+        $issuepartyname=$params["issuepartyname"] ?? null;
+        $notes=$params["notes"] ?? null;
+        $addtime=$params["addtime"] ?? null;
+        $waveno=$params["waveno"] ?? null;
+        $alternate_sku1=$params["alternate_sku1"] ?? null;
+        $c_contact = $params["c_contact"] ?? null;
+        $c_tel2 = $params["c_tel2"] ?? null;
+        $c_province = $params["c_province"] ?? null;
+        $c_city = $params["c_city"] ?? null;
+        $c_district = $params["c_district"] ?? null;
+        $releasestatus = $params["releasestatus"] ?? null;
+        $ordernos = $params["ordernos"] ?? null;
+        $edisendflag2=$params["edisendflag2"] ?? null;
+        $edisendflag=$params["edisendflag"] ?? null;
+        $checkAllSign = $params['checkAllSign'] ?? null;
+        if ($ordernos){
+            $sql .= " AND orderno IN ".$ordernos;
+        }
+        if ($c_contact){
+            $sql .= " AND c_contact like '".$c_contact."'";
+        }
+        if ($c_tel2){
+            $sql .= " AND c_tel2 like '".$c_tel2."'";
+        }
+        if ($c_province){
+            $sql .= " AND c_province like '".$c_province."'";
+        }
+        if ($c_city){
+            $sql .= " AND c_city like '".$c_city."'";
+        }
+        if ($c_district){
+            $sql .= " AND c_district like '".$c_district."'";
+        }
+        if ($releasestatus){
+            $sql .= " AND releasestatus = '".$releasestatus."'";
+        }
+        if ($alternate_sku1){
+            if ($checkAllSign) $detailsOrderno = $this->getOrdersNo($alternate_sku1,false);
+            else $detailsOrderno = $this->getOrdersNo($alternate_sku1,true, $request->page ?? 1, $request->paginate ?? 50);
+            if (count($detailsOrderno)>0){
+                $sql.=' AND orderno IN (';
+                foreach ($detailsOrderno as $index => $no){
+                    if ($index==0){
+                        $sql.="'".$no."'";
+                        continue;
+                    }
+                    $sql.=",'".$no."'";
+                }
+                $sql.=')';
+            }else{
+                $sql .= 'AND orderno IS NULL ';
+            }
+        }
+        if ($orderdate_start && $orderdate_end && $addtime){
+            $orderdate_start=null;
+            $orderdate_end=null;
+        }
+        if ($orderdate_start){
+            if (strlen($orderdate_start)<11)$orderdate_start .= ' 00:00';
+            $sql.=" and addtime>='".$orderdate_start.":00'";
+        }
+        if ($orderdate_end){
+            if (strlen($orderdate_end)<11)$orderdate_end .= ' 23:59 ';
+            $sql.=" and addtime<='".$orderdate_end.":59' ";
+        }
+        if ($customerid){
+            $arr = explode(',',$customerid);
+            if (count($arr)>0) {
+                $sql.=" and customerid in (";
+                foreach ($arr as $index=>$str){
+                    if ($index==0){
+                        $sql.="'".$str."'";
+                        continue;
+                    }
+                    $sql.=",'".$str."'";
+                }
+                $sql.=")";
+            }
+        }
+        if ($orderno)$sql.=" and orderno like '".$orderno."%'";
+        if ($codename_c&&$codename_c_end)$sql.=" and sostatus between '".$codename_c."' and '".$codename_c_end."'";
+        if ($codename_c&&!$codename_c_end)$sql.=" and sostatus = '".$codename_c."'";
+        if (!$codename_c&&$codename_c_end)$sql.=" and sostatus = '".$codename_c_end."'";
+        if ($carriername)$sql.=" and carriername like '".$carriername."%'";
+        if ($soreference1){
+            $arr=array_filter(preg_split('/[,, ]+/is', $soreference1));
+            if (count($arr)==1){
+                $sql.=" and soreference1 like '".$soreference1."%'";
+            }
+            if (count($arr)>1){
+                $sql.=" and soreference1 in (";
+                foreach ($arr as $index=>$str){
+                    if ($index==0){
+                        $sql.="'".$str."'";
+                        continue;
+                    }
+                    $sql.=",'".$str."'";
+                }
+                $sql.=")";
+            }
+        }
+        if ($waveno)$sql.=" and WaveNo like '".$waveno."%'";
+        if ($issuepartyname)$sql.=" and issuepartyname like '".$issuepartyname."%'";
+        if ($notes){
+            if ($addtime&&$addtime!=0)$sql.=" and addtime >= '".date('Y-m-d H:i:s',strtotime("-".$addtime." day"))."'";
+            $sql.=" and notes like '%".$notes."%'";
+        }
+        if ($soreference5){
+            $arr=array_filter(preg_split('/[,, ]+/is', $soreference5));
+            if (count($arr)>0){
+                $sql.=" and (soreference5 in (";
+                foreach ($arr as $index=>$str){
+                    if ($index==0){
+                        $sql.="'".$str."'";
+                        continue;
+                    }
+                    $sql.=",'".$str."'";
+                }
+                $sql.=") ";
+                /*分箱号*/
+                $oracleActAllocationDetails=DB::connection('oracle')->table('ACT_ALLOCATION_DETAILS')->whereIn('picktotraceid',$arr)->get();
+                $picktotraceids=array_unique(array_column($oracleActAllocationDetails->toArray(),'orderno'));
+                if (count($picktotraceids)>0){
+                    $sql.='OR orderno IN (';
+                    foreach ($picktotraceids as $index=>$str){
+                        if ($index==0){
+                            $sql.="'".$str."'";
+                            continue;
+                        }
+                        $sql.=",'".$str."'";
+                    }
+                    $sql.=") ";
+                }
+                $sql.=")";
+            }
+        }
+        if ($edisendflag2){
+            $sql.=" and edisendflag2 like '".$edisendflag2."%'";
+        }
+        if ($edisendflag){
+            $sql.=" and edisendflag like '".$edisendflag."%'";
+        }
+        return $sql;
+    }
+
+    public function getSql($params, $page = null, $paginate = null){
+        $checktime_start = $params['checktime_start'] ?? null;
+        $checktime_end = $params['checktime_end'] ?? null;
+        $checkData = $params['data'] ?? null;
+        if ($checktime_start || $checktime_end){
+            /** @var  OracleActAllocationDetailService */
+            $ordernos = app('oracleActAllocationDetailService')
+                ->getOrderno(['checktime_start'=>$checktime_start,'checktime_end'=>$checktime_end,
+                    'paginate'=>$paginate,'page'=>$page]);
+            $params['ordernos'] = $ordernos;
+        }
+        $sql="select ACT_ALLOCATION_DETAILS.picktotraceid,ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
+        ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,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_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);
+        ;$sql.=" ) as counted from (";
+        if ($paginate && $page)$sql.=" select * from (";
+        $sql.=" select ROWNUM as rn,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,DOC_ORDER_HEADER.CustomerID
+                          ,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
+                         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_HEADER.EDIREMARKS2 from (select * from DOC_ORDER_HEADER  order by ADDTIME desc )DOC_ORDER_HEADER where 1=1 ";
+        $sql=$this->preciseQuery($params,$sql);
+        if ($checkData){
+            if (!is_array($checkData)) $checkData=explode(',',$checkData);
+            if (count($checkData)>0){
+                $sql.=" and orderno in (";
+                foreach ($checkData as $index=>$str){
+                    if ($index==0){
+                        $sql.="'".$str."'";
+                        continue;
+                    }
+                    $sql.=",'".$str."'";
+                }
+                $sql.=")";
+            }
+        }
+        if ($paginate && $page)$sql.=" and ROWNUM<='".$page*$paginate."')";
+        if ($paginate && $page)$sql.=" header where header.rn>'".($page-1)*$paginate."' ";
+        $sql.=")DOC_ORDER_HEADER left join DOC_ORDER_DETAILS on DOC_ORDER_DETAILS.ORDERNO=DOC_ORDER_HEADER.ORDERNO
+                      left join BAS_CODES  order_code on order_code.CODE=DOC_ORDER_HEADER.sostatus and order_code.codeid='SO_STS'
+                      left join BAS_CODES  order_detail_code on order_detail_code.CODE=DOC_ORDER_DETAILS.linestatus and order_detail_code.codeid='SO_STS'
+                      left join BAS_Customer on BAS_Customer.customerid=DOC_ORDER_HEADER.customerid
+                      left join  BAS_SKU on DOC_Order_Details.CustomerID=BAS_SKU.CustomerID and DOC_Order_Details.SKU=BAS_SKU.SKU
+                      left join ACT_ALLOCATION_DETAILS on DOC_Order_Details.orderno=ACT_ALLOCATION_DETAILS.orderno and
+                      DOC_Order_Details.orderlineno=ACT_ALLOCATION_DETAILS.orderlineno GROUP BY ACT_ALLOCATION_DETAILS.picktotraceid,
+                      ACT_ALLOCATION_DETAILS.CHECKTIME,DOC_ORDER_HEADER.addtime,DOC_ORDER_HEADER.C_PROVINCE,DOC_ORDER_HEADER.C_CITY,
+                      DOC_ORDER_HEADER.C_DISTRICT,DOC_ORDER_HEADER.C_CONTACT,DOC_ORDER_HEADER.OrderNo,DOC_ORDER_HEADER.SOStatus,DOC_ORDER_HEADER.WAREHOUSEID,
+                      DOC_ORDER_HEADER.CustomerID,DOC_ORDER_HEADER.C_Tel2,DOC_ORDER_HEADER.CarrierName,DOC_ORDER_HEADER.IssuePartyName,
+                      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_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;
+    }
+
+    //通过商品条码获取订单编号
+    public function getOrdersNo($alternate_sku1, $isPaging = true, $page = 1, $paginate = 50){
+        if ($isPaging){
+            $sql = "SELECT RESULT.ORDERNO FROM
+                        (SELECT ROWNUM rn,DETAIL.ORDERNO as ORDERNO FROM
+                            (SELECT ORDERNO FROM DOC_ORDER_DETAILS WHERE SKU LIKE '".$alternate_sku1."' GROUP BY ORDERNO ORDER BY ORDERNO DESC)DETAIL
+                        WHERE ROWNUM<='".$page*$paginate."')RESULT
+                    WHERE RESULT.rn>'".($page-1)*$paginate."'";
+        }else {
+            $sql = "SELECT ORDERNO FROM DOC_ORDER_DETAILS WHERE SKU LIKE '".$alternate_sku1."' GROUP BY ORDERNO ORDER BY ORDERNO DESC";
+        }
+        $orderDetails = DB::connection('oracle')->select(DB::raw($sql));
+        return array_column($orderDetails,'orderno');
+    }
+
+    public function paginate(array $params){
+        $sql = $this->getSql($params,$params['page'] ?? 1, $params['paginate'] ?? 50);
+        $orders=DB::connection('oracle')->select(DB::raw($sql));
+        return $this->orderFormat($orders);
+    }
+
+    public function get(array $params){
+        $sql = $this->getSql($params);
+        $orders=DB::connection('oracle')->select(DB::raw($sql));
+        return $this->orderFormat($orders);
+    }
+
+    private function orderFormat($orders){
+        $commodities=[];
+        $picktotraceids=[];
+        /*
+         * 第二种扁平化方式(节省空间): 使用快慢指针,因拿到数据正常为顺序数据,自下标1开始与上一条对比orderno唯一标识,不同则更新慢指针下标,
+         *  相同则为指定下标map类型数组追加一个键值对属性来记录同类数量,如N条,每次追加属性时先看属性是否存在,存在+1
+         * */
+        foreach ($orders as $index=>$order){
+            if ($order->picktotraceid){
+                if (array_key_exists($order->orderno,$picktotraceids)){
+                    if (!in_array($order->picktotraceid,$picktotraceids[$order->orderno],true)){
+                        array_push($picktotraceids[$order->orderno],$order->picktotraceid);
+                    };
+                }else $picktotraceids[$order->orderno] = [$order->picktotraceid];
+            }
+            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]);
+                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]];
+        }
+        $picktotraceids=json_encode($picktotraceids);
+        $orders=array_values($orders);
+        $orders = new Collection($orders);
+        $commodities=new Collection($commodities);
+        return ['picktotraceids'=>$picktotraceids,'orders'=>$orders,'commodities'=>$commodities];
+    }
+
     public function findOrCreateByClientCode($clientCode)
     {
         /** @var OrderPackageService $orderPackageService */
@@ -54,9 +335,9 @@ class OrderService
                 try {
                     $logistics = Logistic::query()->create(['name' => $orderHeadAttr['carriername'], 'code' => $orderHeadAttr['carrierid']]);
                     $logistics_id = $logistics['id'];
-                    LogService::log(__METHOD__, __FUNCTION__, '创建承运商' . json_encode($logistics));
+                    LogService::log(__METHOD__,__FUNCTION__,'创建承运商'.json_encode($logistics));
                 } catch (\Exception $e) {
-                    LogService::log(__METHOD__, __FUNCTION__, '创建承运商失败' . $e->getMessage() . $e->getTraceAsString());
+                    LogService::log(__METHOD__,__FUNCTION__,'创建承运商失败'.$e->getMessage().$e->getTraceAsString());
                 }
             }
             $arr = [
@@ -370,7 +651,7 @@ class OrderService
 
         if ($orderHeader == null) return null;
 
-        /** @var OwnerService $owner */
+        /** @var OwnerService */
         $owner = app('ownerService')->first(['code' => $orderHeader->customerid]);
         if (!$owner) {
             $orderHeader->load('oracleBASCustomer');

+ 5 - 0
app/Services/OwnerService.php

@@ -58,6 +58,11 @@ Class OwnerService
         return $owner;
     }
 
+    public function firstOrCreate(array $params, array $values = null){
+        if (!$values) return Owner::query()->firstOrCreate($params);
+        return Owner::query()->firstOrCreate($params,$values);
+    }
+
     //  XXX 代码逻辑有待纠正
     public function 获取WMS订单列中对应的WAS货主列($WMSOrderHeaders)
     {

+ 7 - 0
app/Services/PackageService.php

@@ -14,6 +14,13 @@ Class PackageService
         $packages = OrderPackage::query()->with(['order'=>function($query){
             $query->with('owner','logistic');
         },'paperBox','measuringMachine'])->orderBy(TABLE.'id','DESC');
+        if ($params['owner_id'] ?? false){
+            $owner_id = explode(',',$params['owner_id']);
+            $packages->whereHas('order',function ($query)use($owner_id){
+                $query->whereIn('owner_id',$owner_id);
+            });
+            unset($params['owner_id']);
+        }
         $columnQueryRules=[
             'logistic_number' => ['like' => ''],
             'batch_number' => ['like' => ''],

+ 13 - 0
app/Services/RejectedBillItemService.php

@@ -0,0 +1,13 @@
+<?php 
+
+namespace App\Services; 
+
+use App\RejectedBillItem;
+
+Class RejectedBillItemService
+{ 
+    public function insert(array $params){
+        return RejectedBillItem::query()->insert($params);
+    }
+
+}

+ 25 - 0
app/Services/RejectedBillService.php

@@ -0,0 +1,25 @@
+<?php 
+
+namespace App\Services; 
+
+use App\RejectedBill;
+
+Class RejectedBillService
+{ 
+    private function conditionQuery(array $params){
+        $query = RejectedBill::query();
+        if ($params['order_number'] ?? false){
+            $query->whereIn('order_number',$params['order_number']);
+        }
+        return $query;
+    }
+    
+    public function get(array $params){
+        return $this->conditionQuery($params)->get();
+    }
+
+
+    public function create(array $params){
+        return RejectedBill::query()->create($params);
+    }
+}

+ 3 - 2
app/UserDutyCheck.php

@@ -41,13 +41,14 @@ class UserDutyCheck extends Model
         $mobile_phone=$userDetail['mobile_phone'];
         $identity_number=$userDetail['identity_number'];
         $labor_company_id=UserLabor::where('user_id',$this['user_id'])->value('labor_company_id');
-        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
+//        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
         $laborReport=new LaborReport([
             'user_id'=>$this['user_id'],
             'name'=>$name,
             'mobile_phone'=>$mobile_phone,
             'identity_number'=>$identity_number,
-            'labor_company'=>$labor_company,
+            'labor_company_id'=>$labor_company_id,
+//            'labor_company'=>$labor_company,
             'user_duty_check_id'=>$this['id'],
         ]);
         $laborReport->save();

+ 31 - 0
database/migrations/2020_09_11_102338_add_authorities_labor_reports.php

@@ -0,0 +1,31 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddAuthoritiesLaborReports extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        (new Authority(['name'=>'人事管理-临时工报表-删除','alias_name'=>'人事管理-临时工报表-删除']))->save();
+        (new Authority(['name'=>'人事管理-临时工报表-修改劳务所','alias_name'=>'人事管理-临时工报表-修改劳务所']))->save();
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Authority::where('name','人事管理-临时工报表-删除')->delete();
+        Authority::where('name','人事管理-临时工报表-修改劳务所')->delete();
+    }
+}

+ 52 - 0
database/migrations/2020_09_11_115414_change_labor_reports_labor_company_to_labor_company_id.php

@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeLaborReportsLaborCompanyToLaborCompanyId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->bigInteger('labor_company_id')->index()->comment('劳务所');
+        });
+        $laborReports=\App\LaborReport::query()->get();
+        foreach ($laborReports as $laborReport){
+            $laborCompanyId=\App\LaborCompany::query()->where('name',$laborReport->labor_company)->value('id');
+            $laborReport->update([
+                $laborReport->labor_company_id=$laborCompanyId
+            ]);
+        }
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->dropColumn('labor_company');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->string('labor_company')->nullable()->comment('劳务所');
+        });
+        $laborReports=\App\LaborReport::query()->get();
+        foreach ($laborReports as $laborReport){
+            $laborCompanyName=\App\LaborCompany::query()->where('id',$laborReport->labor_company_id)->value('name');
+            $laborReport->update([
+                $laborReport->labor_company=$laborCompanyName
+            ]);
+        }
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->dropColumn('labor_company_id');
+        });
+    }
+}

+ 35 - 0
database/migrations/2020_09_11_155001_create_inventory_blind_receive_excels_table.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateInventoryBlindReceiveExcelsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('inventory_blind_receive_excels', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('name')->nullable();
+            $table->string('file');
+            $table->integer('goods_amount');
+            $table->timestamps();
+            $table->timestamp('created_at')->nullable()->index()->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('inventory_blind_receive_excels');
+    }
+}

+ 31 - 0
database/migrations/2020_09_14_102338_add_authorities_order_generate_rejected_and_blind_receive.php

@@ -0,0 +1,31 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddAuthoritiesOrderGenerateRejectedAndBlindReceive extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        (new Authority(['name'=>'订单管理-订单-生成退货单','alias_name'=>'订单管理-订单-生成退货单']))->save();
+        (new Authority(['name'=>'入库管理-盲收','alias_name'=>'入库管理-盲收']))->save();
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Authority::where('name','订单管理-订单-生成退货单')->delete();
+        Authority::where('name','入库管理-盲收')->delete();
+    }
+}



Разница между файлами не показана из-за своего большого размера
+ 0 - 61994
public/js/app.js


BIN
public/sound/ding.mp3


BIN
public/sound/warning_otherBarcode.mp3


+ 7 - 2
resources/js/queryForm/queryForm.js

@@ -512,7 +512,7 @@ const query = function getQueryForm(data) {
         input.attr('title', controlJsType(condition.tip[1], 'undefined') ? '' : condition.tip[1]);
         input.attr('placeholder', controlJsType(condition.placeholder[1], 'undefined') ? '' : condition.placeholder[1])
 
-        let ul_div = $("<div class='pl-0' style='position: absolute;left: 100px;top:25px; max-height: 150px; overflow-y: scroll; border: 1px solid rgb(221, 221, 221); border-radius: 5px; text-align: center; transform: scale(0.9);z-index:1' tabindex='1'></div>");
+        let ul_div = $("<div class='pl-0 tooltipTarget' style='position: absolute;left: 100px;top:25px; max-height: 150px; overflow-y: scroll; border: 1px solid rgb(221, 221, 221); border-radius: 5px; text-align: center; transform: scale(0.9);z-index:1' tabindex='1'></div>");
         let ul = $("<ul name='" + condition.name + "' class='list-group pl-0 m-0 p-0 bg-white' style='list-style-type: none;width: 150px;top:35px; z-index: 100' ></ul>");
 
         select_div.append(input).append(ul_div.append(ul));
@@ -574,7 +574,12 @@ const query = function getQueryForm(data) {
                 ul_div.hide();
             }
         });
-
+        ul_div.mouseenter(function () {
+            setTimeout(function () {
+                ul_div.attr("title","移出多选区域即可自动提交");
+                ul_div.tooltip('show');
+            },1000);
+        });
         return div;
     }
 

+ 1 - 1
resources/js/utilities/tempTip.js

@@ -96,7 +96,7 @@ const tempTip={
         $('body').append(tiper);
     },
     inputVal:function(tipText,resultFunc){
-        let bg=$("<div style='opacity:0.4;position:fixed;top:0;width:100%;height:100%;z-index:"+this.index+";background-color:#000;'></div>" );
+        let bg=$("<div style='opacity:0.4;position:fixed;top:0;width:100%;height:100%;z-index:"+(this.index-1)+";background-color:#000;'></div>" );
         let tiper=$("<div class='row' style='color:#000;opacity:0.9;position:fixed;top:40%;transform:translateY(-50%);width:100%;z-index:"+this.index+"'>" +
             "<div class='col-8 offset-2'><div class='card'><div class='card-body'><div class='card-title h5'>" +
             tipText +

BIN
resources/sound/ding.mp3


BIN
resources/sound/warning_otherBarcode.mp3


+ 1 - 1
resources/views/inventory/statement/changeInventory.blade.php

@@ -54,7 +54,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue=new Vue({

+ 1 - 1
resources/views/inventory/statement/dailyLog.blade.php

@@ -80,7 +80,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({

+ 6 - 1
resources/views/inventory/statement/inventoryCompare.blade.php

@@ -134,7 +134,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({
@@ -259,6 +259,11 @@
                 flushView(){
                   window.location.reload();
                 },
+                inventoryCompareExport(checkAllSign){
+                    let url = '{{url('inventory/statement/inventoryCompare/export')}}'
+                    let token='{{ csrf_token() }}';
+                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                },
                 // 定位货主(e){
                 //     let target = $(e.target).val();
                 //     if(target === ''){

+ 101 - 26
resources/views/inventory/stockInventory/inventoryMission.blade.php

@@ -11,14 +11,30 @@
         <div class="mt-3">
 
             <span class="mt-3" >
-                <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=true'"><button class="btn btn-sm btn-outline-dark" v-if="!listMode">切换为列表</button></a>
-                <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=false'"><button class="btn btn-sm btn-outline-dark" v-if="listMode &&inventory.status!='已完成'">切换为盘点</button></a>
+{{--                <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=true'"><button class="btn btn-sm btn-outline-dark" v-if="!listMode">切换为列表</button></a>--}}
+                {{--                <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=false'"><button class="btn btn-sm btn-outline-dark" v-if="listMode &&inventory.status!='已完成'">切换为盘点</button></a>--}}
                 <span><button class="btn btn-sm btn-outline-info" v-if="inventory.status==='复盘中' &&!listMode" @click="完结盘点任务(inventory.id,inventory.owner.name,inventory.type)">完结</button></span>
-{{--                <button class="btn btn-sm" @click="listMode?listMode=false:listMode=true" :class="listMode?'btn-dark':'btn-outline-dark'">--}}
-                {{--                    <span v-if="!listMode">切换为列表</span>--}}
-                {{--                    <span v-if="listMode">切换为盘点</span>--}}
-                {{--                </button>--}}
+
+                @can('库存管理-盘点-查看')
+                    <button class="btn btn-sm" @click="listMode?listMode=false:listMode=true" :class="listMode?'btn-dark':'btn-outline-dark'" v-if="!listMode">切换为列表</button>
+                @endcan
+                @can('库存管理-盘点')
+                    <button class="btn btn-sm" @click="listMode?listMode=false:listMode=true" :class="listMode?'btn-dark':'btn-outline-dark'" v-if="listMode&&inventory.status!='已完成'">切换为盘点</button>
+                @endcan
+            </span>
+
+            <span class="dropdown">
+                <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                        data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
+                    导出Excel
+                </button>
+                <div class="dropdown-menu">
+                    <a class="dropdown-item" @click="inventoryAccountMissionExport(false)" href="javascript:">导出勾选内容</a>
+                    <a class="dropdown-item" @click="inventoryAccountMissionExport(true)" href="javascript:">导出所有</a>
+                </div>
             </span>
+
+
             <span class="form-group  mb-5">
             <label class="text-muted">货主:</label><span class="font-weight-bold">@{{ inventory.owner.name }}</span>
         </span>
@@ -94,7 +110,8 @@
             <span v-if="inventoryMissionRecord.difference_amount" class="font-weight-bold">@{{ inventoryMissionRecord.difference_amount }}</span>
         </span>
         </form>
-        <div class="row d-none d-xl-block" v-if="inventoryAccountMissions.length>=1">
+
+        <div class="row d-none d-xl-block" v-if="inventoryAccountMissions.length>=1&&!listMode">
             <div class="col-12 col-md-12 col-sm-12">
                 <table class="table table-sm table-bordered table-info mt-2">
                     <tr>
@@ -123,10 +140,10 @@
                         <td v-if="inventoryMission.commodity">@{{ inventoryMission.commodity.barcode }}</td>
                         <td v-if="inventoryMission.commodity">@{{ inventoryMission.commodity.sku }}</td>
                         <td>
-                            <input type="date"  class="form-control-sm" name="produced_at"  v-model="inventoryMission.produced_at" >
+                            <input type="date"  class="form-control-sm" name="produced_at"  v-model="inventoryMission.produced_at.substr(0,10)" >
                         </td>
                         <td>
-                            <input type="date"  class="form-control-sm" name="valid_at"  v-model="inventoryMission.valid_at" >
+                            <input type="date"  class="form-control-sm" name="valid_at"  v-model="inventoryMission.valid_at.substr(0,10)" >
                         </td>
                         <td class="text-muted">
                             <input type="text"  class="form-control-sm" name="batch_number"  v-model="inventoryMission.batch_number" >
@@ -178,7 +195,7 @@
                     inventoryMission.mark==='未盘'?'td-yellow':'',
                     ]">
                     <td>
-                        <input type="checkbox" :value="inventoryMission.id" v-model="checkData">
+                        <input type="checkbox" :value="inventoryMission" v-model="checkData">
                     </td>
                     <td>@{{ i+1 }}</td>
                     <td>@{{ inventoryMission.location }}</td>
@@ -222,14 +239,16 @@
                     <td>@{{ inventoryMission.re_checked_amount }}</td>
                     <td>@{{ inventoryMission.difference_amount }}</td>
                     <td>@{{ inventoryMission.occupied_amount }}</td>
-                    <td v-if="!listMode">
+                    @can('库存管理-盘点-删除')
+                    <td>
                         <span class="btn  btn-sm btn-outline-danger" @click="删除盘点记录(inventoryMission.id,inventory.id,inventoryMission.commodity.name)">删除</span>
                     </td>
+                    @endcan
                 </tr>
             </table>
         </div>
         <!--相同库位和条码-->
-        <table class="table table-striped table-sm table-bordered table-hover p-0 d-table  d-xl-none mt-2"  style="background: rgb(179, 214, 245);">
+        <table class="table table-striped table-sm table-bordered table-hover p-0 d-table  d-xl-none mt-2"  style="background: rgb(179, 214, 245);" v-if="!listMode">
             <tr v-for="inventoryMission in inventoryAccountMissions">
                 <td style="filter:grayscale(30%); ">
                     <div  class="mt-3">
@@ -239,11 +258,11 @@
                             <span class="mr-3 text-nowrap"><span class="font-weight-bold">产品条码:</span><span  v-if="inventoryMission.commodity">@{{ inventoryMission.commodity.barcode }}</span></span>
                             <span class="mr-3 text-nowrap"><span class="font-weight-bold">产品编码:</span><span  v-if="inventoryMission.commodity">@{{ inventoryMission.commodity.sku }}</span></span>
                             <span class="mr-3 text-nowrap"><span class="font-weight-bold">生产日期:</span>
-                               <input type="date"  class="form-control-sm" name="produced_at"  v-model="inventoryMission.produced_at">
+                               <input type="date"  class="form-control-sm" name="produced_at"  v-model="inventoryMission.produced_at.substr(0,10)">
                             </span>
 
                             <span class="mr-3 text-nowrap"><span class="font-weight-bold">失效时期:</span>
-                                <input type="date"  class="form-control-sm" name="valid_at"  v-model="inventoryMission.valid_at">
+                                <input type="date"  class="form-control-sm" name="valid_at"  v-model="inventoryMission.valid_at.substr(0,10)">
                             </span>
 
                             <span class="mr-3 text-nowrap"><span class="font-weight-bold">批号:</span>
@@ -319,11 +338,13 @@
                                 <span class="mr-3 text-nowrap"><span style="color:#783000" class="font-weight-bold">复盘数量:</span><span style="color:#af7651">@{{ inventoryMission.re_checked_amount }}</span></span>
                                 <span class="mr-3 text-nowrap"><span style="color:#783000" class="font-weight-bold">盘点差异:</span><span >@{{ inventoryMission.difference_amount }}</span></span>
                             </div>
-                            <div v-if="!listMode">
+                            @can('库存管理-盘点-删除')
+                            <div>
                                 <span  class="mr-3 text-nowrap"><span class="font-weight-bold">操作:</span>
                                 <span class="btn  btn-sm btn-outline-danger" @click="删除盘点记录(inventoryMission.id,inventory.id,inventoryMission.commodity.name)">删除</span>
                             </span>
                             </div>
+                            @endcan
                         </div>
                     </div>
                 </td>
@@ -381,7 +402,7 @@
 @endsection
 
 @section('lastScript')
-    {{--    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>--}}
+    <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     {{--    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200828a.js')}}"></script>--}}
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
@@ -405,11 +426,17 @@
                 inventoryMissions : [
                         @foreach($inventoryAccountMissions as $inventoryMission)
                     {id:'{{$inventoryMission->id}}',location:'{{$inventoryMission->location}}',
-                        created_at:'{{$inventoryMission->created_at}}', commodity:{!! $inventoryMission->commodity  !!},
+                        created_at:'{{$inventoryMission->created_at}}',
                         commodity_name:'{{$inventoryMission->commodity ? $inventoryMission->commodity->name : ''}}',
                         commodity_sku:'{{$inventoryMission->commodity ? $inventoryMission->commodity->sku : ''}}',
                         commodity_barcode:'{{$inventoryMission->commodity ? $inventoryMission->commodity->barcode : ''}}',
+                        commodity:{!! $inventoryMission->commodity  !!},
                         stockInventoryPersons:{!! $inventoryMission->stockInventoryPersons  !!},
+                        stock_persons:[
+                                @foreach($inventoryMission->stockInventoryPersons ? $inventoryMission->stockInventoryPersons ?? [] : [] as $person)
+                            {name:'{{$person->mark}}'},
+                            @endforeach
+                        ],
                         produced_at:'{{$inventoryMission->produced_at}}', valid_at:'{{$inventoryMission->valid_at}}', verified_amount:'{{$inventoryMission->verified_amount}}',
                         stored_amount:'{{$inventoryMission->stored_amount}}', valid_amount:'{{$inventoryMission->valid_amount}}',
                         stored_at:'{{$inventoryMission->stored_at}}', batch_number:'{{$inventoryMission->batch_number}}',
@@ -430,6 +457,20 @@
             beforeMount: function () {
                 this.重排序并标记全列表类型();
             },
+            watch:{
+                checkData:{
+                    handler(){
+                        if (this.checkData.length === this.inventoryMissions.length){
+                            document.querySelector('#all').checked = true;
+                            document.querySelector('#all_temp').checked = true;
+                        }else {
+                            document.querySelector('#all').checked = false;
+                            document.querySelector('#all_temp').checked = false;
+                        }
+                    },
+                    deep:true
+                }
+            },
             mounted: function () {
                 let _this=this;
                 $(".tooltipTarget").tooltip({'trigger': 'hover'});
@@ -465,7 +506,6 @@
                     {name: 're_checked_amount', value: '复盘数量', neglect: true},
                     {name: 'difference_amount', value: '复盘差异', neglect: true},
                     {name: 'occupied_amount', value: '分配数量', neglect: true},
-                    {name: 'remove', value: '', neglect: true},
                 ];
                 setTimeout(function () {
                     let header = new Header({
@@ -483,10 +523,9 @@
                 //全选事件
                 checkAll(e) {
                     if (e.target.checked) {
-                        this.inventoryMissions.forEach((el) => {
-                            if (!el.id) this.checkData.push(el.id);
-                            if (el.id && this.checkData.indexOf(el.id) === -1) {
-                                this.checkData.push(el.id);
+                        this.inventoryMissions.forEach((el,i)=>{
+                            if (this.checkData.indexOf(el) == '-1'){
+                                this.checkData.push(el);
                             }
                         });
                     } else {
@@ -556,9 +595,14 @@
                             });
                         }
                     }
-                    _this.inventoryMissions.forEach(function (inventoryMission,i) {
+                    //拷贝_this.inventoryMissions
+                    let allData=JSON.stringify(_this.inventoryMissions);
+                    let allData1=JSON.parse(allData);
+                    allData1.forEach(function (inventoryMission,i) {
                         if (inventoryMission.location===location && barcode===inventoryMission.commodity.barcode){
-                            _this.inventoryAccountMissions.push(inventoryMission);
+                            if (! _this.inventoryAccountMissions.includes(inventoryMission)){
+                                _this.inventoryAccountMissions.push(inventoryMission);
+                            }
                         }
                     });
                 },
@@ -724,7 +768,7 @@
                         function (response) {
                             if(!response.data.success){
                                 tempTip.setDuration(3000);
-                                tempTip.show('盘点单号:'+id+'删除失败!');
+                                tempTip.show('盘点单号:'+inventoryAccountMissionId+'删除失败!'+response.data.data);
                             }else {
                                 _this.inventoryMissions.every(function (inventoryAccountMission,i) {
                                     if (response.data.data>0&&inventoryAccountMission.id===inventoryAccountMissionId){
@@ -784,6 +828,7 @@
                                     return true
                                 });
                                 _this.重排序并标记全列表类型(_this.inventoryMissions);
+                                $("#form .input").val(' ');
                                 tempTip.setDuration(3000);
                                 tempTip.showSuccess('增加系统之外的库位记录成功!');
                             }
@@ -917,7 +962,7 @@
                                 tempTip.setDuration(3000);
                                 tempTip.showSuccess('盘点成功!');
                                 setTimeout(function () {
-                                    window.location.reload();
+                                    window.location.href='{{url('inventory/stockInventory/enterStockInventory')}}/'+inventoryId;
                                 },1000);
                             }else {
                                 _this.inventoryMissions.every(function (inventoryMission,i) {
@@ -943,6 +988,36 @@
                         tempTip.show('盘点失败!'+'网络错误'+err);
                     })
                 },
+                inventoryAccountMissionExport(checkAllSign){
+                    let url = '{{url('inventory/stockInventory/inventoryAccountMission/export')}}';
+                    let token='{{ csrf_token() }}';
+                    let allData=[];
+                    if (checkAllSign){
+                        allData=JSON.stringify(this.inventoryMissions);
+                        let allData1=JSON.parse(allData);
+                        allData1.forEach(function (inventoryMission) {
+                            if (inventoryMission.stock_persons.length>0){
+                                inventoryMission.stock_person=inventoryMission.stock_persons[inventoryMission.stock_persons.length-1].name;
+                            }
+                            delete inventoryMission.stock_persons;
+                            delete inventoryMission.stockInventoryPersons;
+                            delete inventoryMission.commodity;
+                        });
+                        let data=JSON.stringify(allData1);
+                        excelExport(false,data,url,this.sum,token);
+                    }else {
+                        this.checkData.forEach(function (inventoryMission) {
+                            if (inventoryMission.stock_persons.length>0){
+                                inventoryMission.stock_person=inventoryMission.stock_persons[inventoryMission.stock_persons.length-1].name;
+                            }
+                            delete inventoryMission.stock_persons;
+                            delete inventoryMission.stockInventoryPersons;
+                            delete inventoryMission.commodity;
+                        });
+                        let data=JSON.stringify(this.checkData);
+                        excelExport(checkAllSign,data,url,this.sum,token);
+                    }
+                },
 
 
 

+ 12 - 8
resources/views/inventory/stockInventory/mission.blade.php

@@ -42,8 +42,12 @@
                         <input class="checkItem" type="checkbox" :value="inventory.id" v-model="checkData">
                     </td>
                     <td>
-                        <span class="btn  btn-sm btn-outline-info" @click="enterStockInventory(inventory.id)" v-if="inventory.status!='已完成'">进入</span>
-                        <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=true'"><button class="btn btn-sm btn-outline-dark">查看</button></a>
+                        @can('库存管理-盘点')
+                            <span class="btn  btn-sm btn-outline-info" @click="enterStockInventory(inventory.id)" v-if="inventory.status!='已完成'">进入</span>
+                        @endcan
+                        @can('库存管理-盘点-查看')
+                            <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=true'"><button class="btn btn-sm btn-outline-dark">查看</button></a>
+                        @endcan
                     </td>
                     <td >@{{ i+1 }}</td>
                     <td >@{{ inventory.status }}</td>
@@ -83,7 +87,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({
@@ -232,10 +236,10 @@
                             location.href='{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id;
                         }
                     }).catch(function (err) {
-                            tempTip.cancelWaitingTip();
-                            tempTip.setDuration(3000);
-                            tempTip.show('生成盘点任务失败!'+'网络错误:' + err);
-                        });
+                        tempTip.cancelWaitingTip();
+                        tempTip.setDuration(3000);
+                        tempTip.show('生成盘点任务失败!'+'网络错误:' + err);
+                    });
                 },
                 //进入盘点中页面  或者复盘页面
                 enterStockInventory(id){
@@ -297,7 +301,7 @@
                     }
                 },
                 hasDateStart(){
-                  this.date_start=document.getElementById('date_start').value;
+                    this.date_start=document.getElementById('date_start').value;
                 },
                 hasDateEnd(){
                     this.date_end=document.getElementById('date_end').value;

+ 1 - 1
resources/views/layouts/menu.blade.php

@@ -7,7 +7,7 @@
                     <span class="fa fa-recycle" style="color: #721b6e"></span>
                     退货管理</a></li> @endcan
         @can('入库管理')
-            <li class="nav-item"><a href="{{url("store")}}" class="nav-link"
+            <li class="nav-item"><a href="{{url("store/fast/create")}}" class="nav-link"
                                     :class="{active:isActive('store',1)}">
                     <span class="fa fa-sign-in" style="color: #721b25"></span>
                     入库管理</a></li>

+ 19 - 2
resources/views/maintenance/owner/index.blade.php

@@ -7,12 +7,13 @@
         @component('maintenance.owner.menu')@endcomponent
     </span>
     <div class="container-fluid">
-        <div class="card">
+        <div class="card" id="list">
             <div class="card-body">
                 @if(Session::has('successTip'))
                     <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
                 @endif
-                <table class="table table-striped table-sm table-hover" id="list">
+                <span class="mb-1 btn btn-sm btn-outline-secondary tooltipTarget" @click="syncOwners">同步货主</span>
+                <table class="table table-striped table-sm table-hover">
                     <tr>
                         <th>ID</th>
                         <th>货主编码</th>
@@ -79,6 +80,22 @@
                             tempTip.show('停用货主失败!'+'网络错误:' + err);
                         });
                 },
+                syncOwners(){
+                    let url = '{{url('inventory/syncOwners')}}';
+                    axios.get(url).then(function (response) {
+                        if(!response.data.success){
+                            tempTip.setDuration(3000);
+                            tempTip.show(response.data.data);
+                        }else {
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess('同步货主成功!');
+                            location.reload();
+                        }
+                    }).catch(function (err) {
+                        tempTip.setDuration(3000);
+                        tempTip.show('同步货主失败,网络链接错误!'+err);
+                    })
+                },
             }
         });
     </script>

+ 1 - 1
resources/views/maintenance/role/index.blade.php

@@ -50,7 +50,7 @@
 @endsection
 
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         new Vue({

+ 39 - 3
resources/views/order/index/delivering.blade.php

@@ -31,7 +31,9 @@
                     @endcan
                     @can('订单管理-订单问题件生成')<button  @click="orderIssueTag()" type="button" class="btn btn-sm ml-2 btn-outline-primary "
                                                  :class="[checkData.length>0?'btn-dark':'btn-outline-primary']">标记问题件</button>@endcan
-
+                    @can('订单管理-订单-退货单生成')
+                        <button class="btn btn-sm ml-2" :class="[checkData.length>0?'btn-dark':'btn-outline-danger']" @click="isRejectedBillExist()">退货单生成</button>
+                    @endcan
                 </div>
                 <div class="modal fade " style="top: 20%" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                     <div class="modal-dialog">
@@ -180,7 +182,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue=new Vue({
@@ -385,7 +387,7 @@
                     },1);
                 },
                 orderExport(checkAllSign){
-                    let url = '{{url('order/index/delivering')}}';
+                    let url = '{{url('order/index/export')}}';
                     let token='{{ csrf_token() }}';
                     excelExport(checkAllSign,this.checkData,url,this.sum,token);
                 },
@@ -647,6 +649,40 @@
                 },
                 focusOnModal(e){
                     $(e.target).removeClass('is-invalid');
+                },
+                isRejectedBillExist(){
+                    let _this = this;
+                    axios.post('{{url('order/isRejectedBillExist')}}',{data:this.checkData})
+                        .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.confirm(response.data.data+',已存在,是否仍要生成退货单?',function () {
+                                    _this.createRejectedBill();
+                                });
+                                return;
+                            }
+                            _this.createRejectedBill();
+                        }).catch(function (error) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('网络错误:'+error);
+                        });
+
+                },
+                createRejectedBill() {
+                    let url = '{{url('order/createRejectedBill')}}';
+                    axios.post(url,{data:this.checkData})
+                        .then(res=>{
+                            if (res.data.success){
+                                tempTip.setDuration(2000);
+                                tempTip.showSuccess("退货单生成成功!");
+                            }else{
+                                tempTip.setDuration(3000);
+                                tempTip.show(res.data.data);
+                            }
+                        })
+                        .catch(err=>{
+                            tempTip.setDuration(3000);
+                            tempTip.show('网络错误:'+err);
+                        });
                 }
             }
         });

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

@@ -528,7 +528,7 @@
             -webkit-animation-play-state: running;
         }
     </style>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     <script>
         let listVue = new Vue({

+ 1 - 1
resources/views/order/issue/performance.blade.php

@@ -65,7 +65,7 @@
 
 @endsection
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     <script>
         let performance_vue = new Vue({

+ 1 - 1
resources/views/order/issue/workload.blade.php

@@ -74,7 +74,7 @@
 
 @endsection
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>

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

@@ -229,7 +229,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
 
     <script>

+ 1 - 1
resources/views/order/wave/search.blade.php

@@ -82,7 +82,7 @@
 @endsection
 
 @section("lastScript")
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script>
         let vueList = new Vue({
             el: "#wave_div",

+ 550 - 472
resources/views/personnel/laborReport/index.blade.php

@@ -3,9 +3,8 @@
 @section('title')临时工报表@endsection
 
 @section('content')
-    <div id="nav2">
-        @component('personnel.menu')@endcomponent
-    </div>
+    @component('personnel.laborReport.menu')@endcomponent
+
     <div class="d-none container-fluid" id="list">
         <div id="form_div"></div>
         <span class="dropdown">
@@ -32,25 +31,27 @@
                 <td >
                     @can('人事管理-门卫审核')
                         <span >
-                        <span v-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"  class="text-success">已审核</span>
+                            <b v-if="laborReport.isAdult==1"   class="text-danger">童工</b>
+                        <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"  class="text-success">已审核</span>
                         <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence"  class="text-black">&nbsp;&nbsp;&nbsp;@{{laborReport.sequence}}/@{{laborReport.amountOfJoined}}</span>
                         <button v-else class="btn btn-sm btn-outline-secondary"  @click="guardClockAudit(laborReport.id,laborReport.user_duty_check_id)">门卫审核</button>
                         </span>
                     @else
-                        <span v-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"  class="text-success">已审核</span>
+                        <b v-if="laborReport.isAdult==1"   class="text-danger">童工</b>
+                        <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"  class="text-success">已审核</span>
                         <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence"  class="text-black">&nbsp;&nbsp;&nbsp;@{{ laborReport.sequence }}/@{{ laborReport.amountOfJoined }}</span>
                         <span v-else class="text-center"><b class="text-danger">门卫未审核</b></span>
                     @endcan
                     &nbsp;&nbsp;&nbsp;&nbsp;
                     @can('人事管理-组长审核')
                         <span>
-                        <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup" @click="groupExport(laborReport.id,laborReport.name)" class="btn btn-sm btn-outline-danger">退组</button>
+                        <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export" @click="groupExport(laborReport.id,laborReport.name)" class="btn btn-sm btn-outline-danger">退组</button>
                         <span v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</span>
                             <span v-else-if="laborReport.is_export" class="text-black">已退场</span>
                         <button v-else-if="laborReport.user_workgroup_id" @click="groupClockAudit(laborReport.id,laborReport.userWorkgroupNeedRemark)" class="btn btn-sm btn-outline-primary">组长审核</button>
                         </span>
                     @else
-                        <span  v-if="laborReport.groupUserId&&!laborReport.is_exportGroup"><b class="text-success">在组</b></span>
+                        <span  v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export"><b class="text-success">在组</b></span>
                         <span v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</span>
                         <span v-else-if="laborReport.is_export" class="text-black">已退场</span>
                         <span v-else-if="laborReport.user_workgroup_id" class="text-center"><b class="text-danger">组长未审核</b></span>
@@ -61,7 +62,15 @@
                 <td >@{{laborReport.name}}</td>
                 <td class="text-muted">@{{laborReport.mobile_phone}}</td>
                 <td class="text-muted">@{{laborReport.identity_number}}</td>
-                <td class="text-muted">@{{laborReport.labor_company}}</td>
+                @can('人事管理-临时工报表-修改劳务所')
+                    <td class="text-muted">
+                        <select  class="form-control-sm" name="labor_company" id="labor_company"  @change="updateLaborCompany(laborReport.labor_company_id,laborReport.enter_number)" v-model="laborReport.labor_company_id">
+                            <option v-for="laborCompany in laborCompanies" :value="laborCompany.id">@{{ laborCompany.name }}</option>
+                        </select>
+                    </td>
+                @else
+                    <td class="text-muted">@{{laborReport.labor_company}}</td>
+                @endcan
                 <td class="text-muted">@{{laborReport.enter_at}}</td>
                 <td>@{{laborReport.checkInAt}}</td>
                 <td class="text-muted">@{{laborReport.checkOutAt}}</td>
@@ -74,6 +83,9 @@
                 <td><span v-if="laborReport.thisRecordWorkingTime">@{{laborReport.thisRecordWorkingTime}}</span></td>
                 {{--                        <td><span v-if="laborReport.workingDuration">@{{laborReport.workingDuration}}</span></td>--}}
                 <td><span v-if="laborReport.remark">@{{laborReport.remark}}</span></td>
+                @can('人事管理-临时工报表-删除')
+                    <td><span class="btn btn-sm btn-outline-danger" @click="删除(laborReport.id,laborReport.name)">删</span></td>
+                @endcan
             </tr>
         </table>
         <table id="listOnPad" class="table table-striped table-bordered table-hover p-0 d-table  d-xl-none" style="background: rgb(255, 255, 255);">
@@ -86,25 +98,27 @@
                                             <span >
                                                 @can('人事管理-门卫审核')
                                                     <span >
-                                <b v-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"   class="text-success">已审核</b>
+                                <b v-if="laborReport.isAdult==1"   class="text-danger">童工</b>
+                                <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"   class="text-success">已审核</b>
                                 <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence"  class="text-black">&nbsp;&nbsp;&nbsp;@{{laborReport.sequence}}/@{{laborReport.amountOfJoined}}</b>
                                 <button v-else style="transform:scale(1.1)" class="btn btn-lg btn-outline-secondary"  @click="guardClockAudit(laborReport.id,laborReport.user_duty_check_id)">门卫审核</button>
                                 </span>
                                                 @else
-                                                    <b v-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"  class="text-success">已审核</b>
+                                                    <b v-if="laborReport.isAdult==1"   class="text-danger">童工</b>
+                                                    <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1"  class="text-success">已审核</b>
                                                     <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence"  class="text-black">&nbsp;&nbsp;&nbsp;@{{ laborReport.sequence }}/@{{ laborReport.amountOfJoined }}</b>
                                                     <span v-else class="text-center"><b class="text-danger">门卫未审核</b></span>
                                                 @endcan
                                     &nbsp;&nbsp;&nbsp;&nbsp;
                                 @can('人事管理-组长审核')
                                                     <span>
-                                <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup" @click="groupExport(laborReport.id,laborReport.name)" style="transform:scale(1.1)" class="btn btn-lg btn-danger">退组</button>
+                                <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export" @click="groupExport(laborReport.id,laborReport.name)" style="transform:scale(1.1)" class="btn btn-lg btn-danger">退组</button>
                                 <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</b>
                                     <b v-else-if="laborReport.is_export" class="text-black">已退场</b>
                                 <button v-else-if="laborReport.user_workgroup_id" @click="groupClockAudit(laborReport.id,laborReport.userWorkgroupNeedRemark)" class="btn btn-lg btn-outline-primary" style="transform:scale(1.1)" >组长审核</button>
                                 </span>
                                                 @else
-                                                    <span  v-if="laborReport.groupUserId&&!laborReport.is_exportGroup"><b class="text-success">在组</b></span>
+                                                    <span  v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export"><b class="text-success">在组</b></span>
                                                     <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</b>
                                                     <b v-else-if="laborReport.is_export" class="text-black">已退场</b>
                                                     <span v-else-if="laborReport.user_workgroup_id" class="text-center"><b class="text-danger">组长未审核</b></span>
@@ -117,101 +131,104 @@
                             {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">进场编号:</span><span style="color:#af7651">@{{ laborReport.enter_number }}</span></span>--}}
                             <span class="mr-3  text-nowrap"><span class="text-black">小组:</span><span class="text-black-50">@{{laborReport.userWorkGroupName  }}</span></span>
                             <span class="mr-3   text-nowrap"><span class="text-black">临时工:</span><span class="text-black-50">@{{ laborReport.name }} </span></span>
-                                                                <span class="mr-3 text-nowrap"><span class="text-black">电话:</span><span style="color:#af7651" v-if="">@{{ laborReport.mobile_phone }} </span></span>
-                                                                <span class="text-nowrap"><span class="text-black">身份证号:</span><span style="color:#af7651" v-if="">@{{ laborReport.identity_number }} </span></span>
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">劳务所:</span><span style="color:#af7651" v-if="">@{{ laborReport.labor_company }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">进组时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.checkInAt }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">审核时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyAt }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">审核人:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyPerson }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">晚饭打卡(分):</span><span style="color:#af7651" v-if="">@{{ laborReport.relax_time }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">在线时长:</span><span style="color:#af7651" v-if="">@{{ laborReport.onlineDuration }} </span></span>--}}
-                            {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">本次工作时长:</span><span style="color:#af7651" v-if="">@{{ laborReport.workingDuration }} </span></span>--}}
+                            <span class="mr-3 text-nowrap"><span class="text-black">电话:</span><span style="color:#af7651" v-if="">@{{ laborReport.mobile_phone }} </span></span>
+                            <span class="text-nowrap"><span class="text-black">身份证号:</span><span style="color:#af7651" v-if="">@{{ laborReport.identity_number }} </span></span>
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">劳务所:</span><span style="color:#af7651" v-if="">@{{ laborReport.labor_company }} </span></span>--}}
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">进组时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.checkInAt }} </span></span>--}}
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">审核时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyAt }} </span></span>--}}
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">审核人:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyPerson }} </span></span>--}}
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">晚饭打卡(分):</span><span style="color:#af7651" v-if="">@{{ laborReport.relax_time }} </span></span>--}}
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">在线时长:</span><span style="color:#af7651" v-if="">@{{ laborReport.onlineDuration }} </span></span>--}}
+                {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">本次工作时长:</span><span style="color:#af7651" v-if="">@{{ laborReport.workingDuration }} </span></span>--}}
+                @can('人事管理-临时工报表-删除')
+                   <span style="transform:scale(1.1)" class="btn btn-sm btn-outline-danger" @click="删除(laborReport.id,laborReport.name)">删</span>
+                @endcan
+    </div>
+    </div>
+    </td>
+    </tr>
+    </table>
+    <div class="text-info h5 btn btn">{{$laborReports->count()}}/@{{ sum }}</div>
+    <div>{{$laborReports->appends($paginateParams)->links()}}</div>
+    {{--      选择晚饭时长弹框      --}}
+    <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="exampleModalLabel">晚餐时长</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <form>
+                        <div class="form-group">
+                            <label for="relax_time" class="col-form-label">选择晚饭时长:</label>
+                            <select class="form-control" id="relax_time" v-model="relax_time">
+                                <option value="30">30分</option>
+                                <option value="60">60分</option>
+                            </select>
                         </div>
-                    </div>
-                </td>
-            </tr>
-        </table>
-        <div class="text-info h5 btn btn">{{$laborReports->count()}}/@{{ sum }}</div>
-        <div>{{$laborReports->appends($paginateParams)->links()}}</div>
-        {{--      选择晚饭时长弹框      --}}
-        <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
-            <div class="modal-dialog">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title" id="exampleModalLabel">晚餐时长</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label for="relax_time" class="col-form-label">选择晚饭时长:</label>
-                                <select class="form-control" id="relax_time" v-model="relax_time">
-                                    <option value="30">30分</option>
-                                    <option value="60">60分</option>
-                                </select>
-                            </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span class="btn btn-block" aria-hidden="true">取消</span>
-                        </button>
-                        <button type="button" class="btn btn-primary" data-dismiss="modal" @click="makeSureRelax_time">确定</button>
-                    </div>
+                    </form>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span class="btn btn-block" aria-hidden="true">取消</span>
+                    </button>
+                    <button type="button" class="btn btn-primary" data-dismiss="modal" @click="makeSureRelax_time">确定</button>
                 </div>
             </div>
         </div>
-        {{--      特定组需要添加备注      --}}
-        <div class="modal fade" id="remarkModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
-            <div class="modal-dialog">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <h5 class="modal-title" id="exampleModalLabel">添加所需备注</h5>
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span aria-hidden="true">&times;</span>
-                        </button>
-                    </div>
-                    <div class="modal-body">
-                        <form>
-                            <div class="form-group">
-                                <label for="remark" class="col-form-label">备注:</label>
-                                <textarea class="form-control" id="remark"></textarea>
-                            </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span class="btn btn-block" aria-hidden="true">取消</span>
-                        </button>
-                        <button type="button" class="btn btn-primary" data-dismiss="modal" @click="addRemarkAndGroupClock">确定</button>
-                    </div>
+    </div>
+    {{--      特定组需要添加备注      --}}
+    <div class="modal fade" id="remarkModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="exampleModalLabel">添加所需备注</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <form>
+                        <div class="form-group">
+                            <label for="remark" class="col-form-label">备注:</label>
+                            <textarea class="form-control" id="remark"></textarea>
+                        </div>
+                    </form>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span class="btn btn-block" aria-hidden="true">取消</span>
+                    </button>
+                    <button type="button" class="btn btn-primary" data-dismiss="modal" @click="addRemarkAndGroupClock">确定</button>
                 </div>
             </div>
         </div>
-        <!-- 是否晚餐弹框 -->
-        <div class="modal fade" id="dinnerModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" >
-            <div class="modal-dialog">
-                <div class="modal-content">
-                    <div class="modal-body">
-                        <b class="font-weight-bold">是否晚餐?</b>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                            <span class="btn btn-block" @click="noDinner">否</span>
-                        </button>
-                        <button  type="button" class="btn btn-primary" data-dismiss="modal" @click="haveDinner">是</button>
-                    </div>
+    </div>
+    <!-- 是否晚餐弹框 -->
+    <div class="modal fade" id="dinnerModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" >
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-body">
+                    <b class="font-weight-bold">是否晚餐?</b>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span class="btn btn-block" @click="noDinner">否</span>
+                    </button>
+                    <button  type="button" class="btn btn-primary" data-dismiss="modal" @click="haveDinner">是</button>
                 </div>
             </div>
         </div>
     </div>
+    </div>
 @endsection
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let today=(new Date());
@@ -242,429 +259,490 @@
         };
         window.onresize= hideHeaderTitle;
         window.onscroll=hideHeaderTitle;
-        @if(isset($request))
+            @if(isset($request))
         let request={!! json_encode($request) !!};
-        @endif
+            @endif
         let vue = new Vue({
-            el:"#list",
-            data:{
-                laborReports:[
-                        @foreach($laborReports as $laborReport)
-                    {id:'{{$laborReport->id}}',enter_number:'{{$laborReport->enter_number}}'
-                        ,@if($laborReport->userWorkgroup)user_workgroup_id:'{{$laborReport->userWorkgroup->id}}',
-                        userWorkgroupNeedRemark:'{{$laborReport->userWorkgroup->isNeedRemark}}',
-                        userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
-                        userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
-                        ,mobile_phone:'{{$laborReport->mobile_phone}}',identity_number:'{{$laborReport->identity_number}}',labor_company:'{{$laborReport->labor_company}}'
-                        ,checkInAt:'{{$laborReport->check_in_at}}', relax_time:'{{$laborReport->relax_time}}',
-                        is_exportGroup:'{{$laborReport->is_exportGroup}}',is_export:'{{$laborReport->is_export}}',
-                        verifyAt:'{{$laborReport->verify_at}}',groupUserId:'{{$laborReport->group_user_id}}',verifyPerson:'{{$laborReport->user['name']}}',
-                        checkOutAt:'{{$laborReport->check_out_at}}',onlineDuration:'{{$laborReport->online_duration}}',
-                        workingDuration:'{{$laborReport->working_duration}}', created_at:'{{$laborReport->created_at}}',
-                        enter_at:'{{$laborReport->enter_at}}',exit_at:'{{$laborReport->exit_at}}',
-                        thisRecordOnlineTime:'{{$laborReport->thisRecordOnlineTime}}',
-                        thisRecordWorkingTime:'{{$laborReport->thisRecordWorkingTime}}',
-                        sequence:'{{$laborReport->sequence}}',amountOfJoined:'{{$laborReport->amountOfJoined}}',remark:'{{$laborReport->remark}}',
-                        @if($laborReport->userDutyCheck)user_duty_check_id:'{{$laborReport->userDutyCheck->id}}', userDutyCheckVerifyUserId:'{{$laborReport->userDutyCheck->verify_user_id}}'
-                        ,userDutyCheckType:'{{$laborReport->userDutyCheck->type}}',userDutyCheckAt:'{{$laborReport->userDutyCheck->checked_at}}',@endif},
-                    @endforeach
-                ],
-                i:0,
-                userWorkGroups:[
-                        @foreach($userWorkGroups as $userWorkGroup)
-                    {name:'{{$userWorkGroup->id}}',value:'{{$userWorkGroup->name}}'},
-                    @endforeach
-                ],
-                checkData:[],
-                permittingWorkgroups:{!! $permittingWorkgroups !!},
-                relax_time:'',dateTime:'',selectedStyle:'',
-                sum:{!! $laborReports->total() !!},
-            },
-            mounted:function(){
-                initEcho();
-                let _this=this;
-                let laborReports=_this.laborReports;
-                //进场
-                let tokenOfBroadcastEnterAndLeave='{{$tokenOfBroadcastEnterAndLeave}}';
-                if(tokenOfBroadcastEnterAndLeave){
-                    Echo.channel('{{$laravelEchoPrefix}}'+tokenOfBroadcastEnterAndLeave).listen('ImportEvent',(e)=>{
+                el:"#list",
+                data:{
+                    laborReports:[
+                            @foreach($laborReports as $laborReport)
+                        {id:'{{$laborReport->id}}',enter_number:'{{$laborReport->enter_number}}'
+                            ,@if($laborReport->userWorkgroup)user_workgroup_id:'{{$laborReport->userWorkgroup->id}}',
+                            userWorkgroupNeedRemark:'{{$laborReport->userWorkgroup->isNeedRemark}}',
+                            userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
+                            userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
+                            ,mobile_phone:'{{$laborReport->mobile_phone}}',identity_number:'{{$laborReport->identity_number}}',
+                            @if($laborReport->laborCompany)
+                            labor_company:'{{$laborReport->laborCompany->name}}',labor_company_id:'{{$laborReport->laborCompany->id}}',@endif
+                            checkInAt:'{{$laborReport->check_in_at}}', relax_time:'{{$laborReport->relax_time}}',
+                            is_exportGroup:'{{$laborReport->is_exportGroup}}',is_export:'{{$laborReport->is_export}}',
+                            verifyAt:'{{$laborReport->verify_at}}',groupUserId:'{{$laborReport->group_user_id}}',verifyPerson:'{{$laborReport->user['name']}}',
+                            checkOutAt:'{{$laborReport->check_out_at}}',onlineDuration:'{{$laborReport->online_duration}}',
+                            workingDuration:'{{$laborReport->working_duration}}', created_at:'{{$laborReport->created_at}}',
+                            enter_at:'{{$laborReport->enter_at}}',exit_at:'{{$laborReport->exit_at}}',
+                            thisRecordOnlineTime:'{{$laborReport->thisRecordOnlineTime}}',
+                            thisRecordWorkingTime:'{{$laborReport->thisRecordWorkingTime}}',isAdult:'{{$laborReport->isAdult}}',
+                            sequence:'{{$laborReport->sequence}}',amountOfJoined:'{{$laborReport->amountOfJoined}}',remark:'{{$laborReport->remark}}',
+                            @if($laborReport->userDutyCheck)user_duty_check_id:'{{$laborReport->userDutyCheck->id}}', userDutyCheckVerifyUserId:'{{$laborReport->userDutyCheck->verify_user_id}}'
+                            ,userDutyCheckType:'{{$laborReport->userDutyCheck->type}}',userDutyCheckAt:'{{$laborReport->userDutyCheck->checked_at}}',@endif},
+                        @endforeach
+                    ],
+                    i:0,
+                    userWorkGroups:[
+                            @foreach($userWorkGroups as $userWorkGroup)
+                        {name:'{{$userWorkGroup->id}}',value:'{{$userWorkGroup->name}}'},
+                        @endforeach
+                    ],
+                    checkData:[],
+                    permittingWorkgroups:{!! $permittingWorkgroups !!},
+                    laborCompanies:[
+                            @foreach($laborCompanies as $laborCompany)
+                        {id:'{{$laborCompany->id}}',name:'{{$laborCompany->name}}'},
+                        @endforeach
+                    ],
+                    relax_time:'',dateTime:'',selectedStyle:'',
+                    sum:{!! $laborReports->total() !!},
+                },
+                mounted:function(){
+                    initEcho();
+                    let _this=this;
+                    let laborReports=_this.laborReports;
+                    //进场
+                    let tokenOfBroadcastEnterAndLeave='{{$tokenOfBroadcastEnterAndLeave}}';
+                    if(tokenOfBroadcastEnterAndLeave){
+                        Echo.channel('{{$laravelEchoPrefix}}'+tokenOfBroadcastEnterAndLeave).listen('ImportEvent',(e)=>{
+                            let labor=e.laborReport;
+                            laborReports.push(labor);
+                        });
+                    }
+                    //退场
+                    Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('ExportEvent',(e)=>{
                         let labor=e.laborReport;
-                        laborReports.push(labor);
-                    });
-                }
-                //退场
-                Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('ExportEvent',(e)=>{
-                    let labor=e.laborReport;
-                    laborReports.every(function (laborReport) {
-                        if (laborReport.id==labor.id){
-                            laborReport.thisRecordOnlineTime=labor.thisRecordOnlineTime;
-                            laborReport.thisRecordWorkingTime=labor.thisRecordWorkingTime;
-                            laborReport.is_export=labor.is_export;
-                            laborReport.exit_at=labor.exit_at;
-                            return false
-                        }
-                        return true;
-                    });
-                });
-                //门卫审核
-                Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('GuardAuditEvent',(e)=>{
-                    let userDutyCheck=e.userDutyCheck;
-                    laborReports.every(function (laborReport) {
-                        if (laborReport.user_duty_check_id==userDutyCheck.id){
-                            laborReport.userDutyCheckVerifyUserId=userDutyCheck.verify_user_id;
-                            laborReport.user_duty_check_id=userDutyCheck.id;
-                            return false
-                        }
-                        return true;
-                    });
-                });
-                //组长审核
-                Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('TeamAuditEvent',(e)=>{
-                    let labor=e.laborReport;
-                    laborReports.every(function (laborReport) {
-                        if (laborReport.id==labor.id){
-                            if(labor.remark){
-                                laborReport.remark=labor.remark;
+                        laborReports.every(function (laborReport) {
+                            if (laborReport.id==labor.id){
+                                laborReport.thisRecordOnlineTime=labor.thisRecordOnlineTime;
+                                laborReport.thisRecordWorkingTime=labor.thisRecordWorkingTime;
+                                laborReport.is_export=labor.is_export;
+                                laborReport.exit_at=labor.exit_at;
+                                return false
                             }
-                            laborReport.verifyAt=labor.verify_at;
-                            laborReport.groupUserId=labor.group_user_id;
-                            laborReport.verifyPerson=labor.verifyPerson;
-                            return false
-                        }
-                        return true;
+                            return true;
+                        });
                     });
-                });
-                //进组
-                _this.permittingWorkgroups.forEach(function(workgroup){
-                    Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{
-                        setTimeout(function () {
-                            window.location.reload();
-                        },500);
+                    //门卫审核
+                    Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('GuardAuditEvent',(e)=>{
+                        let userDutyCheck=e.userDutyCheck;
+                        laborReports.every(function (laborReport) {
+                            if (laborReport.user_duty_check_id==userDutyCheck.id){
+                                laborReport.userDutyCheckVerifyUserId=userDutyCheck.verify_user_id;
+                                laborReport.user_duty_check_id=userDutyCheck.id;
+                                return false
+                            }
+                            return true;
+                        });
                     });
-                });
-                //退组
-                _this.permittingWorkgroups.forEach(function(workgroup){
-                    Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{
+                    //组长审核
+                    Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('TeamAuditEvent',(e)=>{
                         let labor=e.laborReport;
                         laborReports.every(function (laborReport) {
                             if (laborReport.id==labor.id){
-                                laborReport.thisRecordOnlineTime=labor.thisRecordOnlineTime;
-                                laborReport.thisRecordWorkingTime=labor.thisRecordWorkingTime;
-                                laborReport.is_exportGroup=labor.is_exportGroup;
-                                laborReport.checkOutAt=labor.check_out_at;
-                                if (labor.relax_time){
-                                    laborReport.relax_time=labor.relax_time;
+                                if(labor.remark){
+                                    laborReport.remark=labor.remark;
                                 }
+                                laborReport.verifyAt=labor.verify_at;
+                                laborReport.groupUserId=labor.group_user_id;
+                                laborReport.verifyPerson=labor.verifyPerson;
                                 return false
                             }
                             return true;
                         });
                     });
-                });
-                $(".tooltipTarget").tooltip({'trigger':'hover'});
-                $('#list').removeClass('d-none');
-                let data=[
-                    [
-                        {name:'created_at_start',type:'dateTime',tip:'选择显示指定日期的起始时间'},
-                        {name:'user_workgroup_id',type:'search_select',tip:['',''],placeholder:['小组',''],data:this.userWorkGroups},
-                        {name:'enter_number',type:'input',tip:'进场编号:支持15天内模糊搜索,15天外精确搜索',placeholder: '进场编号'},
-                        {name:'is_export',type:'checkbox',data:[{name:true,value:'显示已退场'}]},
-                    ],
-                    [
-                        {name:'created_at_end',type:'dateTime',tip:'选择显示指定日期的结束时间'},
-                        {name:'mobile_phone',type:'input',tip:'',placeholder: '电话号'},
-                        {name:'identity_number',type:'input',tip:'',placeholder: '身份证号'},
-                    ],
-                ];
-                this.form = new query({
-                    el:"#form_div",
-                    condition:data,
-                });
-                this.form.init();
-                let column = [
-                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
-                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
-                    {name:'index',value: '序号', neglect: true},
-                    {name:'operation',value: '操作', neglect: true},
-                    {name:'enter_number',value: '进厂编号', style:'background-color: rgb(241, 234, 190)'},
-                    {name:'userWorkGroupName',value: '小组', style:'background-color: rgb(241, 234, 190)'},
-                    {name:'name',value: '临时工', style:'background-color: rgb(241, 234, 190)'},
-                    {name:'mobile_phone',value: '电话', style:'background-color: rgb(241, 234, 190)'},
-                    {name:'identity_number',value: '身份证号', style:'background-color: rgb(241, 234, 190)'},
-                    {name:'labor_company',value: '劳务所', style:'background-color: rgb(241, 234, 190)'},
-                    {name:'enter_at',value: '进场时间'},
-                    {name:'checkInAt',value: '进组时间'},
-                    {name:'checkOutAt',value: '退组时间'},
-                    {name:'exit_at',value: '退场时间'},
-                    {name:'verifyAt',value: '审核时间'},
-                    {name:'verifyPerson',value: '审核人'},
-                    {name:'relax_time',value: '晚饭打卡(分)', neglect: true},
-                    {name:'thisRecordOnlineTime',value: '在线时长', neglect: true},
-                    {name:'thisRecordWorkingTime',value: '本次工作时长', neglect: true},
-                    {name:'remark',value: '备注'},
-                ];
-                setTimeout(function () {
-                    let header = new Header({
-                        el: "#header",
-                        column: column,
-                        data: _this.laborReports,
-                        restorationColumn: 'id',
-                        fixedTop:($('#form_div').height())+2,
-                        offset:0.5,
-                        vue:vue
-                    });
-                    header.init();
-                },0);
-            },
-            watch:{
-                checkData:{
-                    handler(){
-                        if (this.checkData.length === this.laborReports.length){
-                            document.querySelector('#all').checked = true;
-                            document.querySelector('#all_temp').checked = true;
-                        }else {
-                            document.querySelector('#all').checked = false;
-                            document.querySelector('#all_temp').checked = false;
-                        }
-                    },
-                    deep:true
-                }
-            },
-            methods:{
-                selectedColor(id){
-                    if (id==this.selectedStyle){
-                        this.selectedStyle='';
-                        return;
-                    }
-                    this.selectedStyle=id;
-                },
-                checkAll(e){
-                    if (e.target.checked){
-                        this.laborReports.forEach((el,i)=>{
-                            if (this.checkData.indexOf(el.id) == '-1'){
-                                this.checkData.push(el.id);
-                            }
+                    //进组
+                    _this.permittingWorkgroups.forEach(function(workgroup){
+                        Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{
+                            setTimeout(function () {
+                                window.location.reload();
+                            },500);
                         });
-                    }else {
-                        this.checkData = [];
-                    }
-                },
-                laborReportExport(checkAllSign){
-                    let url = '{{url('laborReport/export')}}';
-                    let token='{{ csrf_token() }}';
-                    excelExport(checkAllSign,this.checkData,url,this.sum,token);
-                },
-                //门卫审核
-                guardClockAudit(id,user_duty_check_id){
-                    let url='{{url("laborReport/guardClockAudit")}}';
-                    let _this=this;
-                    axios.post(url,{id:id,user_duty_check_id:user_duty_check_id})
-                        .then(function (response) {
-                            if (!response.data.success){
-                                tempTip.setDuration(3000);
-                                tempTip.show(response.data.data);
-                                return;
-                            }
-                            _this.laborReports.every(function (laborReport) {
-                                if (laborReport.id==id){
-                                    laborReport.userDutyCheckVerifyUserId=response.data.data;
-                                    tempTip.setDuration(3000);
-                                    tempTip.showSuccess('审核通过!');
+                    });
+                    //退组
+                    _this.permittingWorkgroups.forEach(function(workgroup){
+                        Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{
+                            let labor=e.laborReport;
+                            laborReports.every(function (laborReport) {
+                                if (laborReport.id==labor.id){
+                                    laborReport.thisRecordOnlineTime=labor.thisRecordOnlineTime;
+                                    laborReport.thisRecordWorkingTime=labor.thisRecordWorkingTime;
+                                    laborReport.is_exportGroup=labor.is_exportGroup;
+                                    laborReport.checkOutAt=labor.check_out_at;
+                                    if (labor.relax_time){
+                                        laborReport.relax_time=labor.relax_time;
+                                    }
                                     return false
                                 }
                                 return true;
                             });
-                        }).catch(function (err) {
-                        tempTip.setDuration(4000);
-                        tempTip.show('审核失败!网络错误:'+err);
+                        });
+                    });
+                    $(".tooltipTarget").tooltip({'trigger':'hover'});
+                    $('#list').removeClass('d-none');
+                    let data=[
+                        [
+                            {name:'created_at_start',type:'dateTime',tip:'选择显示指定日期的起始时间'},
+                            {name:'user_workgroup_id',type:'search_select',tip:['',''],placeholder:['小组',''],data:this.userWorkGroups},
+                            {name:'enter_number',type:'input',tip:'进场编号:支持15天内模糊搜索,15天外精确搜索',placeholder: '进场编号'},
+                            {name:'is_export',type:'checkbox',data:[{name:true,value:'显示已退场'}]},
+                        ],
+                        [
+                            {name:'created_at_end',type:'dateTime',tip:'选择显示指定日期的结束时间'},
+                            {name:'name',type:'input',tip:'',placeholder: '姓名'},
+                            {name:'mobile_phone',type:'input',tip:'',placeholder: '电话号'},
+                            {name:'identity_number',type:'input',tip:'',placeholder: '身份证号'},
+                        ],
+                    ];
+                    this.form = new query({
+                        el:"#form_div",
+                        condition:data,
                     });
+                    this.form.init();
+                    let column = [
+                        {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
+                            dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
+                        {name:'index',value: '序号', neglect: true},
+                        {name:'operation',value: '操作', neglect: true},
+                        {name:'enter_number',value: '进厂编号', style:'background-color: rgb(241, 234, 190)'},
+                        {name:'userWorkGroupName',value: '小组', style:'background-color: rgb(241, 234, 190)'},
+                        {name:'name',value: '临时工', style:'background-color: rgb(241, 234, 190)'},
+                        {name:'mobile_phone',value: '电话', style:'background-color: rgb(241, 234, 190)'},
+                        {name:'identity_number',value: '身份证号', style:'background-color: rgb(241, 234, 190)'},
+                        {name:'labor_company',value: '劳务所', style:'background-color: rgb(241, 234, 190)'},
+                        {name:'enter_at',value: '进场时间'},
+                        {name:'checkInAt',value: '进组时间'},
+                        {name:'checkOutAt',value: '退组时间'},
+                        {name:'exit_at',value: '退场时间'},
+                        {name:'verifyAt',value: '审核时间'},
+                        {name:'verifyPerson',value: '审核人'},
+                        {name:'relax_time',value: '晚饭打卡(分)', neglect: true},
+                        {name:'thisRecordOnlineTime',value: '在线时长', neglect: true},
+                        {name:'thisRecordWorkingTime',value: '本次工作时长', neglect: true},
+                        {name:'remark',value: '备注'},
+                    ];
+                    setTimeout(function () {
+                        let header = new Header({
+                            el: "#header",
+                            column: column,
+                            data: _this.laborReports,
+                            restorationColumn: 'id',
+                            fixedTop:($('#form_div').height())+2,
+                            offset:0.5,
+                            vue:vue
+                        });
+                        header.init();
+                    },0);
                 },
-                ////组长打卡审核(特定组添加备注)
-                addRemarkAndGroupClock(){
-                    let _this=this;
-                    let id = getSelectId();
-                    let remark=document.getElementById('remark').value;
-                    let url='{{url("laborReport/addRemarkAndGroupClock")}}';
-                    if (remark==null|| remark=='' || remark=="undefined"){
-                        tempTip.setDuration(3000);
-                        tempTip.show("您还未添加任何备注");
-                        return;
-                    }
-                    axios.post(url,{id:id,remark:remark})
-                        .then(function (response) {
-                            if (!response.data.success){
-                                tempTip.setDuration(3000);
-                                tempTip.show(response.data.data);
-                                return;
+                watch:{
+                    checkData:{
+                        handler(){
+                            if (this.checkData.length === this.laborReports.length){
+                                document.querySelector('#all').checked = true;
+                                document.querySelector('#all_temp').checked = true;
+                            }else {
+                                document.querySelector('#all').checked = false;
+                                document.querySelector('#all_temp').checked = false;
                             }
-                            _this.laborReports.every(function (laborReport) {
-                                if (laborReport.id==id){
-                                    laborReport.groupUserId=response.data.data.group_user_id;
-                                    laborReport.verifyAt=response.data.data.verify_at;
-                                    laborReport.verifyPerson=response.data.data.verifyPerson;
-                                    laborReport.remark=response.data.data.remark;
-                                    tempTip.setDuration(3000);
-                                    tempTip.showSuccess('审核通过!');
-                                    return false
+                        },
+                        deep:true
+                    }
+                },
+                methods:{
+                    selectedColor(id){
+                        if (id==this.selectedStyle){
+                            this.selectedStyle='';
+                            return;
+                        }
+                        this.selectedStyle=id;
+                    },
+                    checkAll(e){
+                        if (e.target.checked){
+                            this.laborReports.forEach((el,i)=>{
+                                if (this.checkData.indexOf(el.id) == '-1'){
+                                    this.checkData.push(el.id);
                                 }
-                                return true;
                             });
-                        }).catch(function (err) {
-                        tempTip.setDuration(4000);
-                        tempTip.show('审核失败!网络错误:'+err);
-                    });
+                        }else {
+                            this.checkData = [];
+                        }
+                    },
+                    laborReportExport(checkAllSign){
+                        let url = '{{url('laborReport/export')}}';
+                        let token='{{ csrf_token() }}';
+                        excelExport(checkAllSign,this.checkData,url,this.sum,token);
+                    },
+                    //门卫审核
+                    guardClockAudit(id,user_duty_check_id){
+                        let url='{{url("laborReport/guardClockAudit")}}';
+                        let _this=this;
+                        axios.post(url,{id:id,user_duty_check_id:user_duty_check_id})
+                            .then(function (response) {
+                                if (!response.data.success){
+                                    tempTip.setDuration(3000);
+                                    tempTip.show(response.data.data);
+                                    return;
+                                }
+                                _this.laborReports.every(function (laborReport) {
+                                    if (laborReport.id==id){
+                                        laborReport.userDutyCheckVerifyUserId=response.data.data;
+                                        tempTip.setDuration(3000);
+                                        tempTip.showSuccess('审核通过!');
+                                        return false
+                                    }
+                                    return true;
+                                });
+                            }).catch(function (err) {
+                            tempTip.setDuration(4000);
+                            tempTip.show('审核失败!网络错误:'+err);
+                        });
+                    },
+                    ////组长打卡审核(特定组添加备注)
+                    addRemarkAndGroupClock(){
+                        let _this=this;
+                        let id = getSelectId();
+                        let remark=document.getElementById('remark').value;
+                        let url='{{url("laborReport/addRemarkAndGroupClock")}}';
+                        if (remark==null|| remark=='' || remark=="undefined"){
+                            tempTip.setDuration(3000);
+                            tempTip.show("您还未添加任何备注");
+                            return;
+                        }
+                        axios.post(url,{id:id,remark:remark})
+                            .then(function (response) {
+                                if (!response.data.success){
+                                    tempTip.setDuration(3000);
+                                    tempTip.show(response.data.data);
+                                    return;
+                                }
+                                _this.laborReports.every(function (laborReport) {
+                                    if (laborReport.id==id){
+                                        laborReport.groupUserId=response.data.data.group_user_id;
+                                        laborReport.verifyAt=response.data.data.verify_at;
+                                        laborReport.verifyPerson=response.data.data.verifyPerson;
+                                        laborReport.remark=response.data.data.remark;
+                                        tempTip.setDuration(3000);
+                                        tempTip.showSuccess('审核通过!');
+                                        return false
+                                    }
+                                    return true;
+                                });
+                            }).catch(function (err) {
+                            tempTip.setDuration(4000);
+                            tempTip.show('审核失败!网络错误:'+err);
+                        });
 
-                },
-                //组长打卡审核
-                groupClockAudit(id,userWorkgroupNeedRemark){
-                    let url='{{url("laborReport/groupClockAudit")}}';
-                    let _this=this;
-                    if (userWorkgroupNeedRemark){
-                        $('#remarkModal').modal('show');
-                        selectId(id);
-                        return;
-                    }
-                    axios.post(url,{id:id})
-                        .then(function (response) {
-                            if (!response.data.success){
-                                tempTip.setDuration(3000);
-                                tempTip.show(response.data.data);
-                                return;
-                            }
-                            _this.laborReports.every(function (laborReport) {
-                                if (laborReport.id==id){
-                                    laborReport.groupUserId=response.data.data.group_user_id;
-                                    laborReport.verifyAt=response.data.data.verify_at;
-                                    laborReport.verifyPerson=response.data.data.verifyPerson;
+                    },
+                    //组长打卡审核
+                    groupClockAudit(id,userWorkgroupNeedRemark){
+                        let url='{{url("laborReport/groupClockAudit")}}';
+                        let _this=this;
+                        if (userWorkgroupNeedRemark){
+                            $('#remarkModal').modal('show');
+                            selectId(id);
+                            return;
+                        }
+                        axios.post(url,{id:id})
+                            .then(function (response) {
+                                if (!response.data.success){
                                     tempTip.setDuration(3000);
-                                    tempTip.showSuccess('审核通过!');
-                                    return false
+                                    tempTip.show(response.data.data);
+                                    return;
                                 }
-                                return true;
-                            });
-                        }).catch(function (err) {
-                        tempTip.setDuration(4000);
-                        tempTip.show('审核失败!网络错误:'+err);
-                    });
-                },
-                //有晚餐
-                haveDinner(){
-                    $('#exampleModal').modal('show');
-                },
-                noDinner(){
-                    let _this=this;
-                    let id = getSelectId();
-                    let url='{{url("laborReport/groupExport")}}';
-                    axios.post(url,{id:id})
-                        .then(function (response) {
-                            if (!response.data.success){
-                                tempTip.setDuration(3000);
-                                tempTip.show(response.data.data);
-                                return;
-                            }
-                            _this.laborReports.every(function (laborReport) {
-                                if (laborReport.id==id){
-                                    laborReport.checkOutAt=response.data.data.check_out_at;
-                                    laborReport.workingDuration=response.data.data.working_duration;
-                                    laborReport.is_exportGroup=response.data.data.is_exportGroup;
-                                    laborReport.onlineDuration=response.data.data.online_duration;
+                                _this.laborReports.every(function (laborReport) {
+                                    if (laborReport.id==id){
+                                        laborReport.groupUserId=response.data.data.group_user_id;
+                                        laborReport.verifyAt=response.data.data.verify_at;
+                                        laborReport.verifyPerson=response.data.data.verifyPerson;
+                                        tempTip.setDuration(3000);
+                                        tempTip.showSuccess('审核通过!');
+                                        return false
+                                    }
+                                    return true;
+                                });
+                            }).catch(function (err) {
+                            tempTip.setDuration(4000);
+                            tempTip.show('审核失败!网络错误:'+err);
+                        });
+                    },
+                    //有晚餐
+                    haveDinner(){
+                        $('#exampleModal').modal('show');
+                    },
+                    noDinner(){
+                        let _this=this;
+                        let id = getSelectId();
+                        let url='{{url("laborReport/groupExport")}}';
+                        axios.post(url,{id:id})
+                            .then(function (response) {
+                                if (!response.data.success){
                                     tempTip.setDuration(3000);
-                                    tempTip.showSuccess('退组成功!');
-                                    return false
+                                    tempTip.show(response.data.data);
+                                    return;
                                 }
-                                return true;
-                            });
-                        }).catch(function (err) {
-                        tempTip.setDuration(4000);
-                        tempTip.show('退组失败!网络错误:'+err);
-                    });
-                },
-                //退场有晚饭时间
-                makeSureRelax_time(){
-                    let url='{{url("laborReport/groupExportEnsure")}}';
-                    let _this=this;
-                    let id = getSelectId();
-                    axios.post(url,{id:id,relax_time:_this.relax_time})
-                        .then(function (response) {
-                            if (!response.data.success){
-                                tempTip.setDuration(3000);
-                                tempTip.show(response.data.data);
-                                return;
+                                _this.laborReports.every(function (laborReport) {
+                                    if (laborReport.id==id){
+                                        laborReport.checkOutAt=response.data.data.check_out_at;
+                                        laborReport.workingDuration=response.data.data.working_duration;
+                                        laborReport.is_exportGroup=response.data.data.is_exportGroup;
+                                        laborReport.onlineDuration=response.data.data.online_duration;
+                                        tempTip.setDuration(3000);
+                                        tempTip.showSuccess('退组成功!');
+                                        return false
+                                    }
+                                    return true;
+                                });
+                            }).catch(function (err) {
+                            tempTip.setDuration(4000);
+                            tempTip.show('退组失败!网络错误:'+err);
+                        });
+                    },
+                    //退场有晚饭时间
+                    makeSureRelax_time(){
+                        let url='{{url("laborReport/groupExportEnsure")}}';
+                        let _this=this;
+                        let id = getSelectId();
+                        axios.post(url,{id:id,relax_time:_this.relax_time})
+                            .then(function (response) {
+                                if (!response.data.success){
+                                    tempTip.setDuration(3000);
+                                    tempTip.show(response.data.data);
+                                    return;
+                                }
+                                _this.laborReports.every(function (laborReport) {
+                                    if (laborReport.id==id){
+                                        laborReport.checkOutAt=response.data.data.check_out_at;
+                                        laborReport.workingDuration=response.data.data.working_duration;
+                                        laborReport.relax_time=response.data.data.relax_time;
+                                        laborReport.is_exportGroup=response.data.data.is_exportGroup;
+                                        laborReport.onlineDuration=response.data.data.online_duration;
+                                        tempTip.setDuration(3000);
+                                        tempTip.showSuccess('退组成功!');
+                                        return false
+                                    }
+                                    return true;
+                                });
+                            }).catch(function (err) {
+                            tempTip.setDuration(4000);
+                            tempTip.show('退组失败!网络错误:'+err);
+                        });
+                    },
+                    //组长点击退组,
+                    groupExport(id,name){
+                        let _this=this;
+                        _this.laborReports.every(function (laborReport) {
+                            if (laborReport.id==id){
+                                _this.dateTime=new Date(new Date(laborReport.created_at).toLocaleDateString());
+                                return false;
                             }
-                            _this.laborReports.every(function (laborReport) {
-                                if (laborReport.id==id){
-                                    laborReport.checkOutAt=response.data.data.check_out_at;
-                                    laborReport.workingDuration=response.data.data.working_duration;
-                                    laborReport.relax_time=response.data.data.relax_time;
-                                    laborReport.is_exportGroup=response.data.data.is_exportGroup;
-                                    laborReport.onlineDuration=response.data.data.online_duration;
+                            return true;
+                        });
+                        const dateTime=new Date(_this.dateTime.setDate(_this.dateTime.getDate()+1));
+                        const start = new Date(new Date(new Date().toLocaleDateString()).getTime()+19*60*60*1000);
+                        if(!confirm("确定要临时工“"+name+"“退组吗?")){return}
+                        if (new Date()>=start || new Date()>dateTime){
+                            $('#dinnerModal').modal('show');
+                            selectId(id);
+                            return;
+                        }
+                        let url='{{url("laborReport/groupExport")}}';
+                        axios.post(url,{id:id})
+                            .then(function (response) {
+                                if (!response.data.success){
                                     tempTip.setDuration(3000);
-                                    tempTip.showSuccess('退组成功!');
-                                    return false
+                                    tempTip.show(response.data.data);
+                                    return;
+                                }
+                                _this.laborReports.every(function (laborReport) {
+                                    if (laborReport.id==id){
+                                        laborReport.checkOutAt=response.data.data.check_out_at;
+                                        laborReport.workingDuration=response.data.data.working_duration;
+                                        laborReport.is_exportGroup=response.data.data.is_exportGroup;
+                                        laborReport.onlineDuration=response.data.data.online_duration;
+                                        tempTip.setDuration(3000);
+                                        tempTip.showSuccess('退组成功!');
+                                        return false
+                                    }
+                                    return true;
+                                });
+                            }).catch(function (err) {
+                            tempTip.setDuration(5000);
+                            tempTip.show('退组失败!网络错误:'+err);
+                        });
+                    },
+                    owner_seek:function (e) {
+                        let _this=this;
+                        let $val=e.target.value;
+                        if($val==='')_this.filterData.user_workgroup_id='';
+                        else
+                            _this.userWorkGroups.forEach(function (userWorkGroup) {
+                                if (userWorkGroup.name.includes($val)){
+                                    _this.filterData.user_workgroup_id=userWorkGroup.id;
                                 }
-                                return true;
                             });
-                        }).catch(function (err) {
-                        tempTip.setDuration(4000);
-                        tempTip.show('退组失败!网络错误:'+err);
-                    });
-                },
-                //组长点击退组,
-                groupExport(id,name){
-                    let _this=this;
-                    _this.laborReports.every(function (laborReport) {
-                        if (laborReport.id==id){
-                            _this.dateTime=new Date(new Date(laborReport.created_at).toLocaleDateString());
-                            return false;
-                        }
-                        return true;
-                    });
-                    const dateTime=new Date(_this.dateTime.setDate(_this.dateTime.getDate()+1));
-                    const start = new Date(new Date(new Date().toLocaleDateString()).getTime()+19*60*60*1000);
-                    if(!confirm("确定要临时工“"+name+"“退组吗?")){return}
-                    if (new Date()>=start || new Date()>dateTime){
-                        $('#dinnerModal').modal('show');
-                        selectId(id);
-                        return;
-                    }
-                    let url='{{url("laborReport/groupExport")}}';
-                    axios.post(url,{id:id})
-                        .then(function (response) {
+                    },
+                    updateLaborCompany(laborCompanyId,enter_number){
+                        let _this=this;
+                        let url='{{url("laborReport/updateLaborCompany")}}';
+                        axios.post(url,{enter_number:enter_number,laborCompanyId:laborCompanyId}).then(function (response) {
                             if (!response.data.success){
                                 tempTip.setDuration(3000);
-                                tempTip.show(response.data.data);
+                                tempTip.show('修改劳务所失败'+response.data.data);
                                 return;
+                            }else {
+                                _this.laborReports.forEach(function (laborReport) {
+                                    if (laborReport.enter_number==response.data.data.enter_number){
+                                        laborReport.labor_company_id=response.data.data.labor_company_id;
+                                        laborReport.labor_company=response.data.labor_company;
+                                    }
+                                })
+                                tempTip.setDuration(3000);
+                                tempTip.showSuccess('修改劳务所成功!');
+
                             }
-                            _this.laborReports.every(function (laborReport) {
-                                if (laborReport.id==id){
-                                    laborReport.checkOutAt=response.data.data.check_out_at;
-                                    laborReport.workingDuration=response.data.data.working_duration;
-                                    laborReport.is_exportGroup=response.data.data.is_exportGroup;
-                                    laborReport.onlineDuration=response.data.data.online_duration;
+                        }).catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('修改劳务所失败!网络错误:'+err);
+                        });
+                    },
+                    删除(id,name){
+                        let _this=this;
+                        if(!confirm('确定要删除临时工为:“'+name+'”的报表记录吗?')){return};
+                        let url='{{url("laborReport/删除")}}/'+id;
+                        axios.delete(url).then(
+                            function (response) {
+                                if(!response.data.success){
                                     tempTip.setDuration(3000);
-                                    tempTip.showSuccess('退组成功!');
-                                    return false
+                                    tempTip.show('临时工报表记录删除失败!'+response.data.data);
+                                }else {
+                                    _this.laborReports.every(function (laborReport,i) {
+                                        if (response.data.data>0&&laborReport.id===id){
+                                            _this.laborReports.splice(i,1);
+                                            return false;
+                                        }else {
+                                            return true
+                                        }
+                                    });
+                                    tempTip.setDuration(3000);
+                                    tempTip.showSuccess('临时工报表记录删除成功!');
                                 }
-                                return true;
-                            });
-                        }).catch(function (err) {
-                        tempTip.setDuration(5000);
-                        tempTip.show('退组失败!网络错误:'+err);
-                    });
-                },
-                owner_seek:function (e) {
-                    let _this=this;
-                    let $val=e.target.value;
-                    if($val==='')_this.filterData.user_workgroup_id='';
-                    else
-                        _this.userWorkGroups.forEach(function (userWorkGroup) {
-                            if (userWorkGroup.name.includes($val)){
-                                _this.filterData.user_workgroup_id=userWorkGroup.id;
                             }
+                        ).catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('删除失败,网络链接错误!'+err);
                         });
+
+                    },
+
                 },
-            },
-        });
+            });
 
         let select_id = 0;
         function selectId(id) {

+ 19 - 0
resources/views/personnel/laborReport/menu.blade.php

@@ -0,0 +1,19 @@
+<div id="nav2">
+    @component('personnel.menu')
+    @endcomponent
+    <div class="container-fluid nav3">
+        <div class="card menu-third" >
+            <ul class="nav nav-pills">
+                @can('人事管理-临时工报表')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('personnel/laborReport')}}" :class="{active:isActive('laborReport',2)}">查看</a>
+                    </li> @endcan
+                @can('人事管理-临时工报表-删除')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('laborReport/recycle')}}" :class="{active:isActive('recycle',2)}">回收站</a>
+                    </li> @endcan
+            </ul>
+        </div>
+    </div>
+</div>
+

+ 156 - 0
resources/views/personnel/laborReport/recycle.blade.php

@@ -0,0 +1,156 @@
+@extends('layouts.app')
+@section('title')人事管理-临时工报表-回收站@endsection
+@section('content')
+<span id="nav2">
+    @component('personnel.laborReport.menu')@endcomponent
+</span>
+<div id="page" class="d-none container-fluid">
+    <div class="card">
+        <div class="card-header form-inline">
+            <select v-model="paginate" class="form-control form-control-sm" style="max-width: 100px">
+                <option value="50">显示50条</option>
+                <option value="100">显示100条</option>
+                <option value="200">显示200条</option>
+                <option value="500">显示500条</option>
+                <option value="1000">显示1000条</option>
+            </select>
+            <button class="btn btn-sm btn-outline-danger ml-2" @click="recover()">恢复</button>
+        </div>
+        <div class="card-body">
+            <table class="table table-hover table-striped text-nowrap table-bordered">
+                <tr>
+                    <th>
+                        <label for="all">
+                            <input id="all" type="checkbox" @click="checkAll($event)">全选
+                        </label>
+                    </th>
+                    <th>序号</th>
+                    <th>进场编号</th>
+                    <th>小组</th>
+                    <th>临时工</th>
+                    <th>电话</th>
+                    <th>身份证号</th>
+                    <th>劳务所</th>
+                    <th>进场时间</th>
+                    <th>进组时间</th>
+                    <th>退组时间</th>
+                    <th>退场时间</th>
+                    <th>审核时间</th>
+                    <th>审核人</th>
+                    <th>晚饭打卡</th>
+                    <th>在线时长</th>
+                    <th>本次工作时长</th>
+                    <th>备注</th>
+                </tr>
+                <tr v-for="(laborReport,i) in laborReports">
+                    <td v-if="laborReport.id">
+                        <input class="checkItem" type="checkbox" :value="laborReport.id" v-model="checkData">
+                    </td>
+                    <td>@{{ i+1 }}</td>
+                    <td class="text-muted">@{{laborReport.enter_number}}</td>
+                    <td>@{{laborReport.userWorkGroupName}}</td>
+                    <td >@{{laborReport.name}}</td>
+                    <td class="text-muted">@{{laborReport.mobile_phone}}</td>
+                    <td class="text-muted">@{{laborReport.identity_number}}</td>
+                    <td class="text-muted">@{{laborReport.labor_company}}</td>
+                    <td class="text-muted">@{{laborReport.enter_at}}</td>
+                    <td>@{{laborReport.checkInAt}}</td>
+                    <td class="text-muted">@{{laborReport.checkOutAt}}</td>
+                    <td >@{{ laborReport.exit_at }}</td>
+                    <td class="text-muted">@{{laborReport.verifyAt}}</td>
+                    <td class="text-muted"><span v-if="laborReport.verifyPerson">@{{laborReport.verifyPerson}}</span></td>
+                    <td class="text-muted"><span v-if="laborReport.relax_time">@{{laborReport.relax_time}}</span></td>
+                    <td class="text-muted"><span v-if="laborReport.thisRecordOnlineTime">@{{laborReport.thisRecordOnlineTime}}</span></td>
+                    <td><span v-if="laborReport.thisRecordWorkingTime">@{{laborReport.thisRecordWorkingTime}}</span></td>
+                    <td><span v-if="laborReport.remark">@{{laborReport.remark}}</span></td>
+                </tr>
+            </table>
+        </div>
+    </div>
+
+</div>
+@stop
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#page",
+            data:{
+                laborReports:[
+                        @foreach($laborReports as $laborReport)
+                    {id:'{{$laborReport->id}}',enter_number:'{{$laborReport->enter_number}}'
+                        ,@if($laborReport->userWorkgroup)user_workgroup_id:'{{$laborReport->userWorkgroup->id}}',
+                        userWorkgroupNeedRemark:'{{$laborReport->userWorkgroup->isNeedRemark}}',
+                        userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
+                        userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
+                        ,mobile_phone:'{{$laborReport->mobile_phone}}',identity_number:'{{$laborReport->identity_number}}',
+                        @if($laborReport->laborCompany)
+                        labor_company:'{{$laborReport->laborCompany->name}}',labor_company_id:'{{$laborReport->laborCompany->id}}',@endif
+                        checkInAt:'{{$laborReport->check_in_at}}', relax_time:'{{$laborReport->relax_time}}',
+                        is_exportGroup:'{{$laborReport->is_exportGroup}}',is_export:'{{$laborReport->is_export}}',
+                        verifyAt:'{{$laborReport->verify_at}}',groupUserId:'{{$laborReport->group_user_id}}',verifyPerson:'{{$laborReport->user['name']}}',
+                        checkOutAt:'{{$laborReport->check_out_at}}',onlineDuration:'{{$laborReport->online_duration}}',
+                        workingDuration:'{{$laborReport->working_duration}}', created_at:'{{$laborReport->created_at}}',
+                        enter_at:'{{$laborReport->enter_at}}',exit_at:'{{$laborReport->exit_at}}',
+                        thisRecordOnlineTime:'{{$laborReport->thisRecordOnlineTime}}',
+                        thisRecordWorkingTime:'{{$laborReport->thisRecordWorkingTime}}',isAdult:'{{$laborReport->isAdult}}',
+                        sequence:'{{$laborReport->sequence}}',amountOfJoined:'{{$laborReport->amountOfJoined}}',remark:'{{$laborReport->remark}}',
+                        @if($laborReport->userDutyCheck)user_duty_check_id:'{{$laborReport->userDutyCheck->id}}', userDutyCheckVerifyUserId:'{{$laborReport->userDutyCheck->verify_user_id}}'
+                        ,userDutyCheckType:'{{$laborReport->userDutyCheck->type}}',userDutyCheckAt:'{{$laborReport->userDutyCheck->checked_at}}',@endif},
+                    @endforeach
+                ],
+                paginate:50,
+                checkData:[],
+            },
+            mounted(){
+                $("#page").removeClass('d-none');
+            },
+            methods:{
+                //全选事件
+                checkAll(e){
+                    if (e.target.checked){
+                        this.laborReports.forEach((el,i)=>{
+                            if (this.checkData.indexOf(el.id) == '-1'){
+                                this.checkData.push(el.id);
+                            }
+                        });
+                    }else {
+                        this.checkData = [];
+                    }
+                },
+                recover(){
+                    tempTip.setDuration(3000);
+                    if (this.checkData.length<1){
+                        tempTip.showSuccess('尚未未选择需要恢复单!');
+                        return;
+                    }
+                    let checkData=this.checkData;
+                    let _this=this;
+                    let delArr=[];
+                    if (!confirm('确定要恢复所选内容吗?'))return;
+                    axios.post('{{url('laborReport/recover')}}',{checkData:checkData})
+                        .then(function (response) {
+                            if (response.data.success){
+                                checkData.forEach(function (data) {
+                                    _this.laborReports.every(function (laborReport,i) {
+                                        if (data===laborReport.id){
+                                            delArr.unshift(i);return false;
+                                        }
+                                        return true;
+                                    });
+                                });
+                                delArr.forEach(function (item) {
+                                    _this.$delete(_this.laborReports,item);
+                                });
+                                tempTip.showSuccess('恢复成功!');
+                                return;
+                            }
+                            tempTip.show('恢复失败,未知错误!');
+                        }).catch(function (err) {
+                            tempTip.show('恢复失败,网络错误:'+err);
+                        });
+                }
+            },
+        });
+    </script>
+@stop

+ 15 - 5
resources/views/process/create.blade.php

@@ -104,8 +104,9 @@
                         <div class="form-group row">
                             <div class="col-10 offset-1 p-1 border rounded bg-light" v-for="processContent in processContents" v-if="!processContent.addBtnShow && !processContent.type">
                                 <div class="col-12">
-                                    <div class="row small" style="background-color: white;opacity: 0.7"  @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,false)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,false)">
-                                        <span class="font-weight-bold border">单据号:</span>
+                                    <div class="row small" style="opacity: 0.7"  :style="{'background-color' : (processContent.asnstatus == '部分收货') ? '#fde300' : ((processContent.asnstatus == '订单创建') ? 'red' : 'white')}"
+                                         @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,false)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,false)">
+                                        <span class="font-weight-bold">单据号:</span>
                                         <span class="font-weight-bold">@{{ processContent.wms_code }}</span>
                                         <span class="ml-2 text-muted">单据类型:</span>
                                         <span class=" text-muted">@{{ processContent.bill_type }}</span>
@@ -119,8 +120,10 @@
                                             <span v-if="processContent.sign_commodity_sku_mark">@{{ processContent.sign_commodity_sku_mark }}</span>
                                             <span v-else>@{{ processContent.commodity_sku }}</span>
                                         </span>
-                                        <span class="ml-2 font-weight-bold">数量:</span>
+                                        <span class="ml-2 font-weight-bold"> 数量:</span>
                                         <span class="font-weight-bold">@{{ processContent.amount }}</span>
+                                        <span class="ml-2 font-weight-bold text-success" v-if="processContent.former_amount">原有数量:</span>
+                                        <span class="font-weight-bold text-success" v-if="processContent.former_amount">@{{ processContent.former_amount }}</span>
                                         <span class="ml-2 text-muted">条码:</span>
                                         <span class="text-muted">
                                             <span v-if="processContent.sign_commodity_barcode_mark">@{{ processContent.sign_commodity_barcode_mark }}</span>
@@ -199,7 +202,8 @@
                         <div class="form-group row">
                             <div class="col-10 offset-1 p-1 border rounded bg-light" v-for="processContent in processContents" v-if="!processContent.addBtnShow && processContent.type">
                                 <div class="col-12 border">
-                                    <div class="row small" style="background-color: white;opacity: 0.7" @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,true)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,true)">
+                                    <div class="row small" style="opacity: 0.7"  :style="{'background-color' : (processContent.asnstatus == '部分收货') ? '#fde300' : ((processContent.asnstatus == '订单创建') ? 'red' : 'white')}"
+                                         @mouseover="update_delBtn(true,processContent.wms_code,processContent.commodity_id,true)" @mouseleave="update_delBtn(false,processContent.wms_code,processContent.commodity_id,true)">
                                         <span class="font-weight-bold">单据号:</span>
                                         <span class="font-weight-bold">@{{ processContent.wms_code }}</span>
                                         <span class="ml-2 text-muted">单据类型:</span>
@@ -216,6 +220,8 @@
                                         </span>
                                         <span class="ml-2 font-weight-bold">数量:</span>
                                         <span class="font-weight-bold">@{{ processContent.amount }}</span>
+                                        <span class="ml-2 font-weight-bold text-success" v-if="processContent.former_amount">原有数量:</span>
+                                        <span class="font-weight-bold text-success" v-if="processContent.former_amount">@{{ processContent.former_amount }}</span>
                                         <span class="ml-2 text-muted">条码:</span>
                                         <span class="text-muted">
                                             <span v-if="processContent.sign_commodity_barcode_mark">@{{ processContent.sign_commodity_barcode_mark }}</span>
@@ -390,7 +396,7 @@
                         return;
                     }
                     _this.msg=true;
-                    axios.post('{{url("api/thirdPart/flux/process/getProcessContent")}}',{wms_code:wms_code})
+                    axios.post('{{url("api/thirdPart/flux/process/getProcessContent")}}',{wms_code:wms_code,is_finished_product:type})
                         .then(function (response) {
                             if (_this.msg)_this.msg=false;
                             tempTip.cancelWaitingTip();
@@ -411,9 +417,11 @@
                             processContent['commodity_sku']='';
                             processContent['bill_type']=response.data.bill_type;
                             processContent['amount']='';
+                            processContent['former_amount']='';
                             processContent['lineNo']='';
                             processContent['addBtnShow']=true;
                             processContent['type']=type;
+                            processContent['asnstatus'] = response.data.asnstatus;
                             _this.processContents.unshift(processContent);
                         }).catch(function (err) {
                         if (_this.msg)_this.msg=false;
@@ -523,6 +531,7 @@
                            processContent.commodity_sku=commodity.sku;
                            processContent.amount=commodity.amount;
                            processContent.lineNo=commodity.lineNo;
+                           processContent.former_amount = commodity.former_amount;
                            return false;
                        }
                        return  true;
@@ -655,6 +664,7 @@
                     content['commodity_id'] = commodity.id ;
                     content['wms_code'] = processContent.wms_code ;
                     content['amount'] = commodity.amount ;
+                    content['former_amount'] = commodity.former_amount;
                     content['commodity_name'] = commodity.name ;
                     content['commodity_barcodes'] = commodity.barcodes ;
                     content['commodity_sku'] = commodity.sku ;

+ 1 - 1
resources/views/process/index.blade.php

@@ -462,7 +462,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({

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

@@ -61,7 +61,7 @@
 
 @section('lastScript')
     <script src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({

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

@@ -176,7 +176,7 @@
         let csrfInput='@csrf';
     </script>
     <script src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({
@@ -220,7 +220,7 @@
                         {name:'mobile_sender',type:'input',tip:'寄件人手机:输入完成敲回车提交',placeholder:'寄件人手机'},
                         {name:'checked_numbers',type:'input',tip:'审核批次号:支持右位留空的模糊搜索',placeholder:'审核批次号'},
                         {name:'is_loaded',type:'select',placeholder: '是否入库',data:[{name:1,value:'是'},{name:0,value:'否'},
-                                {name:'null',value:'无需入库'},{name:2,value:'待推单'},{name:4,value:'待确认'}]},
+                                {name:'null',value:'无需入库'},{name:2,value:'待推单'},{name:4,value:'待确认'},{name:3,value:'交互异常'}]},
                     ]
                 ];
                 this.form=new query({

+ 33 - 0
resources/views/store/blindReceive/excel/index.blade.php

@@ -0,0 +1,33 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('store.menu')@endcomponent
+        @component('store.blindReceive.menu')@endcomponent
+    </div>
+    <div class="container">
+        <div class="row mt-2">
+            <div class="col-12">
+                <p><span class="h4">Excel文件列表</span><span class="text-muted">(仅保留三个月以内的文件)</span></p>
+                <table class="table table-striped">
+                    <tr>
+                        <th>序号</th>
+                        <th>名称</th>
+                        <th>时间</th>
+                        <th>条目数</th>
+                        <th>文件下载</th>
+                    </tr>
+                    @foreach($excels as $i=>$excel)
+                        <tr>
+                            <td>{{$i+1}}</td>
+                            <td>{{$excel['name']}}</td>
+                            <td>{{$excel['created_at']}}</td>
+                            <td>{{$excel['goods_amount']}}</td>
+                            <td><a href="{{asset('storage/'.$excel['file'])}}"><span class="fa fa-download"></span><span class="fa fa-download"></span><span class="fa fa-download"></span></a></td>
+                        </tr>
+                    @endforeach
+                </table>
+            </div>
+        </div>
+    </div>
+@endsection

+ 475 - 0
resources/views/store/blindReceive/index.blade.php

@@ -0,0 +1,475 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('store.menu')@endcomponent
+        @component('store.blindReceive.menu')@endcomponent
+    </div>
+    <div class="container">
+        <audio src="{{asset('sound/warning_otherBarcode.mp3')}}" controls="controls" preload id="soundWarning" hidden>
+        </audio>
+        <audio src="{{asset('sound/ding.mp3')}}" controls="controls" preload id="soundDing" hidden>
+        </audio>
+        <div class="row mt-2">
+            <div class="col-12" id="scanColumn">
+                <div class="card" :class="borderByMode">
+                    <div class="card-body">
+                        <div class="row">
+                            <div class="col-12">
+                                <p class="text-muted" style="font-size: 0.5em" v-if="inputMode=='regular'">常规:可输入效期,相同条码记录不会合并</p>
+                                <p class="text-muted" style="font-size: 0.5em" v-if="inputMode=='increasing'">逐一扫描:处理单一重复商品,每扫一次对应隔口总数量自动递增,扫到不同条码会提示</p>
+                                <p class="text-muted" style="font-size: 0.5em" v-if="inputMode=='multiIncreasing'">边扫边分:处理多种商品,自动将扫到的不同条码数量递增到各自隔口号</p>
+                                <ul class="nav nav-tabs mb-4 mt-n3">
+                                    <li class="nav-item"><a href="#" class="nav-link" :class="inputMode=='regular'?'active':''"
+                                                            @click="inputMode='regular';changeToManualInputAmount();cleanInputs();inputting.fromIncreasing=false">常规</a></li>
+                                    <li class="nav-item"><a href="#" class="nav-link" :class="inputMode=='increasing'?'active':''"
+                                                            @click="inputMode='increasing';changeToScanInputAmount();cleanInputs();inputting.fromIncreasing=true;">逐一扫描</a></li>
+                                    <li class="nav-item"><a href="#" class="nav-link" :class="inputMode=='multiIncreasing'?'active':''"
+                                                            @click="inputMode='multiIncreasing';changeToScanInputAmount();cleanInputs();inputting.fromIncreasing=true">边扫边分</a></li>
+                                </ul>
+                            </div>
+                            <div class="col-6">
+                                <div v-if="inputMode=='regular'">
+                                    <div class="btn btn-sm btn-outline-primary"
+                                         v-if="!isManualInputtingBarcode" @click="changeToManualInputBarcode">手动输入</div>
+                                    <div class="btn btn-sm btn-outline-danger"
+                                         @click="changeToScanInputBarcode" v-if="isManualInputtingBarcode">扫描输入</div>
+                                </div>
+                                <input type="text" id="barcode" class="form-control" :disabled="status.barcodeDisable" placeholder="扫入条码" @focusin="focusOutDocument" @focusout="focusDocument" v-model="inputting.barcode">
+                                <div v-if="inputMode=='regular'">
+                                    <div class="card-title">
+                                        生产日期:
+                                    </div>
+                                    <input type="date" class="form-control mb-2" v-model="inputting.produce_date" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter">
+                                </div>
+                                <div v-if="inputMode=='regular'">
+                                    <div class="card-title">
+                                        失效日期:
+                                    </div>
+                                    <input type="date" class="form-control mb-2" v-model="inputting.valid_date" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter">
+                                </div>
+                            </div>
+                            <div class="col-6">
+                                <div class="card-title" id="amountLabel">
+                                    手动输入数量:
+                                </div>
+                                <div class="input-group mt-n2 mb-2">
+                                    <input type="number" id="amount" class="form-control" placeholder="" :disabled="status.amountDisable"
+                                           v-model="inputting.amount" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"
+                                           style='height: 40px;font-size: 1.6em;color:blue;font-weight: bolder;padding: 3px;text-align: center'>
+                                </div>
+                                <div class="card-title">
+                                    格口号:
+                                </div>
+                                <input type="number" id="bin" class="form-control mt-n2 mb-2"
+                                       v-model="inputting.bin"
+                                       :disabled="status.binDisable" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter"
+                                       style='height: 80px;font-size: 5em;color:red;font-weight: bolder;padding: 3px;text-align: center'>
+                                <div v-if="inputMode=='regular'">
+                                    <div class="card-title">
+                                        批次号:
+                                    </div>
+                                    <input type="text" class="form-control mb-2" v-model="inputting.batch_number" @focusin="focusOutDocument" @focusout="focusDocument" @keyup="oninputEnter">
+                                </div>
+                            </div>
+                            <div class="col-12" v-if="commitButtonVisible && inputMode=='regular'" >
+                                <button class="btn btn-success btn form-control" @click="commitGoods">确定</button>
+                            </div>
+                        </div>
+                        <p class="card-text text-muted mt-3 mb-n3 text-center">
+                            已完成:
+                        </p>
+                        <hr>
+                        <table class="table table-sm  table-striped" v-if="goodses.length>0">
+                            <tr>
+                                <th>隔口号</th>
+                                <th>数量</th>
+                                <th>条码</th>
+                                <th>生产日期</th>
+                                <th>失效日期</th>
+                                <th>批次号</th>
+                                <th>操作</th>
+                            </tr>
+                            <tr v-for="goods in goodses">
+                                <td>@{{ goods.bin }}</td>
+                                <td>@{{ goods.amount }}</td>
+                                <td>@{{ goods.barcode }}</td>
+                                <td>@{{ goods.produce_date }}</td>
+                                <td>@{{ goods.valid_date }}</td>
+                                <td>@{{ goods.batch_number }}</td>
+                                <td><button class="btn btn-outline-danger btn-sm" @click="removeGoods($event,goods.barcode)">删</button></td>
+                            </tr>
+                        </table>
+                        <hr>
+                        <span class="btn btn-outline-dark btn form-control" style="cursor: pointer" @click="submitExcelData">结束并生成Excel</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el: '#app',
+            data:{
+                focusing:'document',
+                commitButtonVisible:false,
+                isManualInputtingBarcode:false,
+                isManualInputtingAmount:true,
+                lastScannedBarcode:'',
+                inputMode:'regular',//regular,increasing,multiIncreasing
+                inputting:{
+                    barcode:'',amount:'',bin:'',produce_date:'',valid_date:'',batch_number:'',fromIncreasing:false
+                },
+                status:{
+                    scanEndInputted:false,binDisable:false,barcodeDisable:true,amountDisable:false,
+                },
+                goodses:[],//{barcode,amount,bin,produce_date,valid_date,batch_number}
+            },
+            mounted() {
+                this.scanListening();
+            },
+            methods: {
+                changeToManualInputAmount:function(){
+                    this.status.amountDisable=false;
+                    this.isManualInputtingAmount=true;
+                    $('#amountLabel').text('输入数量:');
+                    // $('#amount').attr('placeholder','数字');
+                },
+                changeToScanInputAmount:function(){
+                    this.status.amountDisable=true;
+                    this.isManualInputtingAmount=false;
+                    $('#amountLabel').text('自动扫入数量:');
+                    // $('#amount').attr('placeholder','自动');
+                },
+                changeToManualInputBarcode:function(){
+                    this.status.barcodeDisable=false;
+                    this.isManualInputtingBarcode=true;
+                    $('#barcode').attr('placeholder','手工输入条码');
+                },
+                changeToScanInputBarcode:function(){
+                    let data = this;
+                    this.isManualInputtingBarcode=false;
+                    this.inputting.barcode='';
+
+                    let $barcode = $('#barcode');
+                    this.status.barcodeDisable=false;
+                    setTimeout(function () {
+                        $barcode.focus();
+                        data.status.barcodeDisable=true;
+                    },20);
+                    $barcode.attr('placeholder','扫入条码');
+                },
+                oninputEnter:function(e){
+                    if (e.key === 'Enter') {
+                        this.focusDocument();
+                    }
+                },
+                focusDocument: function () {
+                    this.focusing = 'document';
+                    this.showCommitButton();
+                },
+                focusOutDocument: function () {
+                    this.focusing = '';
+                    this.autoFillBin();
+                },
+                scanListening: function () {
+                    let data = this;
+                    $(document).on('keypress', function (e) {
+                        if(data.focusing!=='document'){return}
+                        if(data.isManualInputtingBarcode){return}
+                        if (e.keyCode !== 13) {
+                            if(data.status.scanEndInputted){
+                                data.lastScannedBarcode=data.inputting.barcode;
+                                data.inputting.barcode='';
+                                data.status.scanEndInputted=false;
+                            }
+                            data.inputting.barcode += String.fromCharCode(e.keyCode);
+                        } else {
+                            if(data.inputting.barcode.length<=1){
+                                window.tempTip.setDuration(4500);
+                                window.tempTip.show('未扫入条码,请检查扫码枪设置,尝试调至“直接键盘输出”模式');
+                                return;
+                            }
+                            data.status.scanEndInputted = true;
+                            data.showCommitButton();
+                            data.autoFillBin();
+                            switch(data.inputMode){
+                                case 'increasing': data.commitGoodsOnIncreasingMode();break;
+                                case 'multiIncreasing': data.commitGoodsOnMultiIncreasingMode();break;
+                            }
+                        }
+                    });
+                },
+                commitGoodsOnIncreasingMode: function () {
+                    let data = this;
+                    function doIt(){
+                        let repeatedBarcode=data.repeatedIncreasingBarcodeFromSaved();
+                        function increase(){
+                            data.inputting.bin=repeatedBarcode.bin;
+                            repeatedBarcode.amount++;
+                            data.inputting.amount=repeatedBarcode.amount;
+                            window.tempTip.setDuration(500);
+                            window.tempTip.showSuccess(repeatedBarcode.amount);
+                            data.focusDocument();
+                            data.audioDing();
+                        }
+                        if(!repeatedBarcode){
+                            data.focusOutDocument();
+                            data.alertVibrate();
+                            window.tempTip.setInputType('number');
+                            window.tempTip.inputVal('该商品第一件递增请输入隔口号:',function(bin){
+                                if(bin===''){
+                                    window.tempTip.setDuration(1500);
+                                    window.tempTip.show('未输入隔口号,请重新扫描');
+                                    data.alertVibrate();
+                                    data.focusDocument();return}
+                                data.inputting.bin=bin;
+                                data.inputting.amount=1;
+                                data.goodses.unshift(JSON.parse(JSON.stringify(data.inputting)));
+                                data.status.binDisable=true;
+                                window.tempTip.setDuration(500);
+                                window.tempTip.showSuccess('保存成功');
+                                data.focusDocument();
+                                data.audioDing();
+                            })
+                        }else{
+                            increase();
+                        }
+                    }
+                    if(data.lastScannedBarcode!==data.inputting.barcode && data.lastScannedBarcode){
+                        data.audioWarning_otherBarcode();
+                        data.focusOutDocument();
+                        window.tempTip.confirm('扫到其它条码,是否切换至新条码并记录?',doIt,function () {
+                            data.inputting.barcode=data.lastScannedBarcode;
+                            // data.cleanInputs();
+                            data.focusDocument();
+                        })
+                    }else{
+                        doIt()
+                    }
+                },
+                commitGoodsOnMultiIncreasingMode: function () {
+                    let data = this;
+                    let repeatedBarcode=this.repeatedIncreasingBarcodeFromSaved();
+                    function increase(){
+                        data.inputting.bin=repeatedBarcode.bin;
+                        repeatedBarcode.amount++;
+                        data.inputting.amount=repeatedBarcode.amount;
+                        window.tempTip.setDuration(500);
+                        window.tempTip.showSuccess(repeatedBarcode.amount);
+                        data.focusDocument();
+                        data.audioDing();
+                    }
+                    if(!repeatedBarcode){
+                        data.focusOutDocument();
+                        data.alertVibrate();
+                        window.tempTip.setInputType('number');
+                        window.tempTip.inputVal('该商品第一件递增请输入隔口号:',function(bin){
+                            if(bin===''){
+                                window.tempTip.setDuration(1500);
+                                window.tempTip.show('未输入隔口号,请重新扫描');
+                                data.alertVibrate();
+                                data.focusDocument();return}
+                            data.inputting.bin=bin;
+                            data.inputting.amount=1;
+                            data.goodses.unshift(JSON.parse(JSON.stringify(data.inputting)));
+                            data.status.binDisable=true;
+                            window.tempTip.setDuration(500);
+                            window.tempTip.showSuccess('保存成功');
+                            data.focusDocument();
+                            data.audioDing();
+                        })
+                    }else{
+                        increase();
+                    }
+                },
+                audioWarning_otherBarcode: function () {
+                    let audio = document.getElementById('soundWarning');
+                    audio.currentTime = 0;//重新播放
+                    if(audio.paused){
+                        audio.play();// 播放
+                    }
+                    this.alertVibrate();
+
+                },
+                audioDing: function () {
+                    let audio = document.getElementById('soundDing');
+                    audio.currentTime = 0;//重新播放
+                    audio.play();// 播放
+                    function startVibrate(duration) {
+                        if (navigator.vibrate) {
+                            navigator.vibrate(duration);
+                        } else if (navigator.webkitVibrate) {
+                            navigator.webkitVibrate(duration);
+                        }
+                    }
+                    startVibrate(500);
+                },
+                alertVibrate: function () {
+                    function startVibrate(duration) {
+                        if (navigator.vibrate) {
+                            navigator.vibrate(duration);
+                        } else if (navigator.webkitVibrate) {
+                            navigator.webkitVibrate(duration);
+                        }
+                    }
+                    let vibrateInterval = setInterval(function() {
+                        startVibrate(150);
+                    }, 50);
+                    setTimeout(function() {
+                        clearInterval(vibrateInterval)
+                    }, 2000);
+                },
+                autoFillBin: function () {
+                    let data = this;
+                    let isNotRepeatingBarcode=this.goodses.every(function(goods){
+                        if(goods.barcode===data.inputting.barcode){
+                            data.inputting.bin=goods.bin;
+                            data.status.binDisable=true;
+                            return false;
+                        }
+                        return true;
+                    });
+                    if(isNotRepeatingBarcode){
+                        data.status.binDisable=false;
+                    }
+                },
+                repeatedIncreasingBarcodeFromSaved: function () {
+                    let data = this;
+                    let repeatedGoods=null;
+                    data.goodses.every(function(goods){
+                        if(goods.barcode===data.inputting.barcode && goods.fromIncreasing){
+                            repeatedGoods=goods;
+                            return false;
+                        }
+                        return true;
+                    });
+                    return repeatedGoods;
+                },
+                commitGoods: function () {
+                    let data = this;
+                    window.tempTip.setDuration(3500);
+                    if(!data.inputting.barcode){window.tempTip.show('请扫入条码');return;}
+                    else if(!data.inputting.amount){window.tempTip.show('请输入数量');return;}
+                    else if(!data.inputting.bin){window.tempTip.show('请输入隔口号');return;}
+                    data.recordOrPlusGoods();
+                    window.tempTip.setDuration(1500);
+                    window.tempTip.showSuccess('成功提交:' + data.inputting.barcode);
+                    data.cleanInputs();
+                    data.audioDing();
+                },
+                cleanInputs: function () {
+                    this.changeToScanInputBarcode();
+                    this.inputting.barcode='';
+                    this.inputting.amount='';
+                    this.inputting.bin='';
+                    this.inputting.produce_date='';
+                    this.inputting.valid_date='';
+                    this.inputting.batch_number='';
+                    this.commitButtonVisible=false;
+                    this.status.binDisable=false;
+                    this.lastScannedBarcode='';
+                },
+                recordOrPlusGoods: function () {
+                    let data = this;
+                    if(this.inputMode==='regular'){
+                        data.goodses.unshift(JSON.parse(JSON.stringify(data.inputting)));
+                        return;
+                    }
+                    let isNotRepeating=data.goodses.every(function(goods){
+                        if(goods.barcode===data.inputting.barcode){
+                            goods.amount=parseInt(goods.amount)+parseInt(data.inputting.amount);
+                            return false;
+                        }
+                        return true;
+                    });
+                    if(isNotRepeating){
+                        data.goodses.unshift(JSON.parse(JSON.stringify(data.inputting)));
+                    }
+                },
+                removeGoods: function ($e,barcode) {
+                    if(!confirm('确定要删除条码为'+barcode+'的记录吗'))return;
+                    let data = this;
+                    data.goodses.every(function(goods,i){
+                        if(goods.barcode===barcode){
+                            data.goodses.splice(i,1)
+                            return false;
+                        }
+                        return true;
+                    })
+                },
+                showCommitButton: function () {
+                    let data = this;
+                    if(data.inputting.barcode && data.inputting.amount && data.inputting.bin){
+                        data.commitButtonVisible=true;
+                    }
+                },
+                submitExcelData: function () {
+                    let data = this;
+                    data.focusOutDocument();
+                    if(data.goodses.length===0){
+                        window.tempTip.show('请先录入数据再提交EXCEL');return;
+                    }
+                    window.tempTip.confirm('请检查表格,确定全部完成。提交后数据将全部清空,不能后退',
+                        function () {
+                            window.tempTip.setInputType('input');
+                            window.tempTip.setIndex(999999);
+                            window.tempTip.inputVal('请输入文件名:',function(val){
+                                if(val===''){
+                                    window.tempTip.setDuration(2500);
+                                    window.tempTip.show('失败!文件名不能为空,请重新点击生成');
+                                    return;
+                                }
+                                window.tempTip.setDuration(15500);
+                                window.tempTip.waitingTip('提交Excel中...');
+                                let expireHandler = setTimeout(function () {
+                                    window.tempTip.cancelWaitingTip();
+                                    window.tempTip.setDuration(1500);
+                                    window.tempTip.show('响应超时! 请检查网络,确保可以连接后再重试。');
+                                },9000);
+                                let url='{{url("store/blindReceive/excels/apiStore")}}';
+                                axios.post(url,{'goodses':data.goodses,'filename':val})
+                                    .then(function(response){
+                                        if(response.data.result==='success'){
+                                            data.goodses=[];
+                                            data.cleanInputs();
+                                            window.tempTip.cancelWaitingTip();
+                                            window.tempTip.setDuration(1500);
+                                            window.tempTip.showSuccess('成功生成EXCEL,可在列表页查看');
+                                            data.focusDocument();
+                                        }else{
+                                            window.tempTip.setDuration(1500);
+                                            window.tempTip.show('生成EXCEL失败:'+response.data.fail_info);
+                                            console.log(response);
+                                            data.focusDocument();
+                                            data.alertVibrate()
+                                        }
+                                        clearInterval(expireHandler);
+                                    })
+                                    .catch(function (err) {
+                                        window.tempTip.setDuration(3500);
+                                        window.tempTip.show('网络或系统错误,请将以下信息提交给开发者:'+err);
+                                        clearInterval(expireHandler);
+                                        data.alertVibrate();
+                                    });
+                            });
+                        },function () {
+                            data.focusDocument();
+                        })
+                }
+            },
+            computed: {
+                borderByMode: function () {
+                    return {
+                        // 'border-info':this.inputMode==='regular',
+                        'border-success':this.inputMode==='increasing',
+                        'border-danger':this.inputMode==='multiIncreasing'
+                    }
+                }
+            }
+        });
+    </script>
+@endsection

+ 58 - 0
resources/views/store/blindReceive/layout.blade.php

@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <!-- CSRF Token -->
+    <meta name="csrf-token" content="{{ csrf_token() }}">
+
+    <title>盲收神器</title>
+
+    <!-- Styles -->
+    <link rel="shortcut icon" href="{{asset('icon/WcsIcon_blindPack.ico')}}" />
+    <link rel="bookmark" href="{{asset('icon/WcsIcon_blindPack.ico')}}" />
+    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+</head>
+<body>
+<div id="app">
+    <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm" id="nav1">
+        <div class="container">
+            <span class="navbar-brand">
+                盲收神器
+            </span>
+        </div>
+    </nav>
+    @yield('content')
+</div>
+</body>
+<!-- Scripts -->
+@yield('script_before')
+{{-- 必须在app.js前边--}}
+<script src="{{ asset('js/app.js') }}"></script>
+<script>
+    let isActive=function (name,atSlashLevel) {
+        let uriWithNoParam=location.href.split('?')[0];
+        let uriParts=uriWithNoParam.split('//')[1].split('/');
+        if(!name){
+            return uriParts.length===atSlashLevel;
+        }
+        if(atSlashLevel>uriParts.length||!atSlashLevel)return false;
+        return uriParts[atSlashLevel]===name;
+    };
+    new Vue({
+        el:'#nav1',
+        methods:{
+            isActive:isActive,
+        }
+    });
+    if($('#nav2').length>0)
+        new Vue({
+            el:'#nav2',
+            methods:{
+                isActive:isActive,
+            }
+        });
+</script>
+@yield('script_after')
+</html>

+ 15 - 0
resources/views/store/blindReceive/menu.blade.php

@@ -0,0 +1,15 @@
+
+<div id="nav2">
+    <div class="container-fluid nav3">
+        <div class="card menu-third" >
+            <ul class="nav nav-pills">
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('store/blindReceive/excels')}}" :class="{active:isActive('excels',3)}">Excel下载</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('store/blindReceive')}}" :class="{active:isActive('',3)}">手持入口</a>
+                    </li>
+            </ul>
+        </div>
+    </div>
+</div>

+ 1 - 1
resources/views/store/fast/create.blade.php

@@ -4,7 +4,7 @@
 @section('content')
     <div id="nav2">
         @component('store.menu')@endcomponent
-        @component('store.fast.menuFast')@endcomponent
+        @component('store.fast.menu')@endcomponent
     </div>
     <div class="container-fluid" id="fast">
         <div class="card col-md-8 offset-md-2">

+ 1 - 0
resources/views/store/index.blade.php → resources/views/store/fast/index.blade.php

@@ -4,6 +4,7 @@
 @section('content')
     <span id="nav2">
         @component('store.menu')@endcomponent
+        @component('store.fast.menu')@endcomponent
     </span>
     <div class="d-none" id="fast">
         <div class="container-fluid">

+ 20 - 0
resources/views/store/fast/menu.blade.php

@@ -0,0 +1,20 @@
+<div id="nav2">
+    <div class="container-fluid nav3">
+        <div class="card menu-third" >
+            <ul class="nav nav-pills">
+                @can('入库管理-快速入库-录入')
+                    <li class="nav-item">
+                        <a class="nav-link text-dark" href="{{url('store/fast/create')}}" :class="{active:isActive('create',3)}">录入</a>
+                    </li> @endcan
+                @can('入库管理-快速入库')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('store/fast')}}" :class="{active:isActive('',3)}">记录</a>
+                    </li> @endcan
+                @can('入库管理-快速入库')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('store/fast/storeItem')}}" :class="{active:isActive('storeItem',3)}">明细</a>
+                    </li> @endcan
+            </ul>
+        </div>
+    </div>
+</div>

+ 0 - 12
resources/views/store/fast/menuFast.blade.php

@@ -1,12 +0,0 @@
-<div id="nav2">
-    <div class="container-fluid nav3">
-        <div class="card menu-third" >
-            <ul class="nav nav-pills">
-                @can('入库管理-快速入库-录入')
-                    <li class="nav-item">
-                        <a class="nav-link text-dark" href="{{url('store/fast/create')}}" :class="{active:isActive('create',3)}">录入</a>
-                    </li> @endcan
-            </ul>
-        </div>
-    </div>
-</div>

+ 1 - 1
resources/views/store/storeItem/index.blade.php → resources/views/store/fast/storeItem.blade.php

@@ -4,7 +4,7 @@
 @section('content')
     <span id="nav2">
         @component('store.menu')@endcomponent
-        @component('store.storeItem.menu')@endcomponent
+        @component('store.fast.menu')@endcomponent
     </span>
     <div class="d-none" id="item">
         <div class="container-fluid">

+ 4 - 8
resources/views/store/menu.blade.php

@@ -2,17 +2,13 @@
 <div class="container-fluid nav2" id="nav2">
     <div class="card">
         <ul class="nav nav-pills">
-            @can('仓库管理')
-                <li class="nav-item">
-                    <a class="nav-link" href="{{url('store')}}" :class="{active:isActive('',2)}">记录</a>
-                </li> @endcan
-            @can('仓库管理')
+            @can('入库管理-快速入库')
                 <li class="nav-item">
-                    <a class="nav-link" href="{{url('store/storeItem')}}" :class="{active:isActive('storeItem',2)}">子项</a>
+                    <a class="nav-link"  href="{{url('store/fast/create')}}" :class="{active:isActive('fast',2)}">快速入库</a>
                 </li> @endcan
-            @can('入库管理-快速入库')
+            @can('入库管理-盲收')
                 <li class="nav-item">
-                    <a class="nav-link"  href="{{url('store/fast/create')}}" :class="{active:isActive('create',3)}">快速入库</a>
+                    <a class="nav-link"  href="{{url('store/blindReceive/excels')}}" :class="{active:isActive('blindReceive',2)}">盲收</a>
                 </li> @endcan
         </ul>
     </div>

+ 0 - 12
resources/views/store/storeItem/menu.blade.php

@@ -1,12 +0,0 @@
-<div id="nav2">
-    <div class="container-fluid nav3">
-        <div class="card menu-third" >
-            <ul class="nav nav-pills">
-                @can('仓库管理')
-                    <li class="nav-item">
-                        <a class="nav-link text-dark" href="{{url('store/storeItem')}}" :class="{active:isActive('',3)}">查询</a>
-                    </li> @endcan
-            </ul>
-        </div>
-    </div>
-</div>

+ 1 - 1
resources/views/waybill/index.blade.php

@@ -252,7 +252,7 @@
         }
     </style>
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
         let vue = new Vue({

+ 3 - 2
resources/views/weight/package/index.blade.php

@@ -58,7 +58,7 @@
 
 @section('lastScript')
     <script type="text/javascript" src="{{asset('js/queryForm/export200818a.js')}}"></script>
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200901.js')}}"></script>
+    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200914.js')}}"></script>
     <script type="text/javascript" src="{{asset('js/queryForm/header200826b.js')}}"></script>
     <script>
             @if(isset($request))
@@ -98,7 +98,8 @@
                 let _this = this;
                 let data = [[
                     {name:'created_at_start',type:'dateTime',tip:'选择显示指定日期的起始时间'},
-                    {name:'owner_id',type:'search_select',tip:['',''],placeholder:['客户',''],data:_this.owners},
+                    {name:'owner_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的客户'],
+                        placeholder:['货主','定位或多选货主'],data:_this.owners},
                     {name:'logistic_number',type:'input',tip:'快递单号:可在两侧增加百分号(%)进行模糊搜索',placeholder:'快递单号'},
                 ],[
                     {name:'created_at_end',type:'dateTime',tip:'选择显示指定日期的结束时间'},

+ 24 - 5
routes/web.php

@@ -105,8 +105,8 @@ Route::get('maintenance', function () {return view('maintenance.index');});
 Route::group(['prefix'=>'waybill'],function(){
     /** 置顶 */
     Route::group(['prefix'=>'ontop'],function(){
-        Route::any('top','WaybillController@waybillOnTop');
-        Route::any('cancel','WaybillController@cancelOnTop');
+        Route::post('top','WaybillController@waybillOnTop');
+        Route::post('cancel','WaybillController@cancelOnTop');
     });
     /** 判断 */
     Route::group(['prefix'=>'is'],function(){
@@ -211,10 +211,16 @@ Route::resource('package','PackageController');
 
 /** 入库 */
 Route::group(['prefix'=>'store'],function(){
+    Route::resource('fast/storeItem','StoreItemsController');
     Route::resource('fast','StoreController');
-    Route::resource('storeItem','StoreItemsController');
+//    Route::get('fast/index','StoreController@index');
+    /** 盲收 */
+    Route::group(['prefix'=>'blindReceive'],function(){
+        Route::get('/', function () { return view('store.blindReceive.index');});
+        Route::get('excels', 'StoreBlindReceiveController@index');
+        Route::post('excels/apiStore', 'StoreBlindReceiveController@apiStore');
+    });
 });
-Route::get('store','StoreController@index');
 
 /** 二次加工 */
 Route::group(['prefix'=>'process'],function(){
@@ -298,13 +304,18 @@ Route::group(['prefix'=>'personnel'],function(){
 Route::get('getLaborReport','LaborReportController@getDailyLabor');
 
 /** 临时工报表 */
+
 Route::group(['prefix'=>'laborReport'],function(){
+    Route::post('recover','LaborReportController@recover');
+    Route::get('recycle','LaborReportController@recycle');
     Route::post('guardClockAudit','LaborReportController@guardClockAudit');
     Route::post('groupClockAudit','LaborReportController@groupClockAudit');
     Route::post('addRemarkAndGroupClock','LaborReportController@addRemarkAndGroupClock');
     Route::post('groupExport','LaborReportController@groupExport');
     Route::post('groupExportEnsure','LaborReportController@groupExportEnsure');
     Route::any('export','LaborReportController@export');
+    Route::post('updateLaborCompany','LaborReportController@updateLaborCompany');
+    Route::any('删除/{id}','LaborReportController@删除');
 });
 
 /** 库存 */
@@ -332,12 +343,16 @@ Route::group(['prefix'=>'inventory'],function(){
         Route::get('dailyLog','InventoryController@dailyLog');
 
         Route::get('inventoryCompare','InventoryCompareController@inventoryCompare');
+        Route::any('inventoryCompare/export','InventoryCompareController@exportInventoryCompare');
     });
     /** 库存盘点 */
     Route::group(['prefix'=>'stockInventory'],function(){
         Route::get('mission','InventoryAccountController@mission');
         Route::post('createStockInventoryMission','InventoryAccountController@createStockInventoryMission');
         Route::any('enterStockInventory/{id}','InventoryAccountController@enterStockInventory');
+        Route::any('inventoryAccountMission/export','InventoryAccountController@exportInventoryAccountMission');
+        Route::get('mission','InventoryAccountController@mission');
+        Route::post('createStockInventoryMission','InventoryAccountController@createStockInventoryMission');
     });
     /** 库存比对 */
     Route::group(['prefix'=>'inventoryCompare'],function(){
@@ -360,11 +375,13 @@ Route::group(['prefix'=>'inventory'],function(){
     Route::post('searchStockInventoryRecord','InventoryAccountController@searchStockInventoryRecord');
 });
 
+
 /** 订单 */
 Route::group(['prefix'=>'order'],function(){
     /** 主页 */
     Route::group(['prefix'=>'index'],function(){
-        Route::any('delivering','OrderController@delivering');
+        Route::get('delivering','OrderController@delivering');
+        Route::match(['get','post'],'export','OrderController@export');
     });
     /** 创建 */
     Route::group(['prefix'=>'create'],function(){
@@ -410,6 +427,8 @@ Route::group(['prefix'=>'order'],function(){
     Route::post('deAllocation','OrderController@deAllocation');
     Route::post('deAllocationAll','OrderController@deAllocationAll');
     Route::post('resetLogisticsGetMark','OrderController@resetLogisticsGetMark');
+    Route::post('createRejectedBill','OrderController@createRejectedBill');
+    Route::post('isRejectedBillExist','OrderController@isRejectedBillExist');
 });
 
 

+ 2 - 0
serves/excelExportGo/.gitignore

@@ -0,0 +1,2 @@
+vendor
+.idea

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

@@ -0,0 +1,188 @@
+package controller
+
+import (
+	"bswas/excel"
+	"bswas/orm"
+	"bswas/utilities"
+	"encoding/json"
+	"fmt"
+	"net/http"
+)
+
+func Export(w http.ResponseWriter,req *http.Request)  {
+	errorMsg := utilities.NewError()
+	decoder := json.NewDecoder(req.Body)
+	var params map[string]string
+	// 解析参数 存入map
+	e := decoder.Decode(&params)
+	if e != nil{
+		utilities.WriteLog("/api/controller/controller.go:17   参数解析失败!","ERROR")
+		return
+	}
+	file := excel.CreateFile(selectModule(params))
+	if errorMsg.GetMsg() != "" {
+		w.Header().Set("Msg",errorMsg.GetMsg())
+		w.WriteHeader(500)
+		return
+	}
+	if _, err := file.WriteTo(w); err != nil {
+		utilities.WriteLog("/api/controller/controller.go:22   返回二进制流失败!","ERROR")
+		return
+	}
+}
+
+func selectModule(params map[string]string) (row []interface{}, list [][]interface{}, mergeRow map[string]string, mergeColumn []string) {
+	var data []map[string]string
+	switch params["type"] {
+	case "waybill":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = WaybillFormat(data)
+	case "waybillDelivering":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = WaybillDeliveringFormat(data)
+	case "waybillFinancial":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = WaybillFinancialFormat(data)
+	case "rejected":
+		data = orm.GetMysqlData(params["sql"])
+		row, list, mergeRow = RejectedFormat(data)
+		mergeColumn = []string{
+			"A","B","C","D","E","F","G","H","I","J","K","T","U",
+		}
+	case "rejectedStatistics":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = RejectedStatisticsFormat(data)
+	case "order":
+		data = orm.GetOracleData(params["sql"])
+		row, list, mergeRow = OrderFormat(data)
+		mergeColumn = []string{
+			"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P",
+			"Q","R","S","Z","AA","AB","AC","AD",
+		}
+	case "orderWave":
+		data = orm.GetOracleData(params["sql"])
+		row, list = OrderWaveFormat(data)
+	case "package":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = PackageFormat(data)
+	case "packageIssuedException":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = PackageIssuedExceptionFormat(data)
+	case "packageCreateException":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = PackageCreateExceptionFormat(data)
+	case "inventory":
+		if params["sql"] != "" {
+			data = orm.GetOracleData(params["sql"])
+		}else{
+			err := json.Unmarshal([]byte(params["data"]), &data)
+			if err != nil {
+				utilities.WriteLog("/api/controller/controller.go:73   库存数据json解析失败!","ERROR")
+			}
+		}
+		row, list = InventoryFormat(data, true)
+	case "allInventory":
+		if params["sql"] != "" {
+			data = orm.GetOracleData(params["sql"])
+		}else{
+			err := json.Unmarshal([]byte(params["data"]), &data)
+			if err != nil {
+				utilities.WriteLog("/api/controller/controller.go:83   全部库存数据json解析失败!","ERROR")
+			}
+		}
+		row, list = InventoryFormat(data, false)
+	case "inventoryDailyLog":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = InventoryDailyLogFormat(data)
+	case "process":
+		data = orm.GetMysqlData(params["sql"])
+		row, list, mergeRow = ProcessFormat(data)
+		mergeColumn = []string{
+			"A","B","C","D","E","F","G","H","I",
+		}
+	case "processStatistic":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = ProcessStatisticFormat(data)
+	case "laborReport":
+		err := json.Unmarshal([]byte(params["data"]), &data)
+		if err != nil {
+			utilities.WriteLog("/api/controller/controller.go:102   临时工报表数据json解析失败!","ERROR")
+		}
+		row, list = LaborReportFormat(data)
+	case "orderIssue":
+		sqlList := make(map[string]string)
+		err := json.Unmarshal([]byte(params["sqlList"]), &sqlList)
+		if err != nil {
+			utilities.WriteLog("/api/controller/controller.go:110   订单问题件数据json解析失败!","ERROR")
+		}
+		if sqlList["orderPackageSql"] == "" || sqlList["secondOrderPackageSql"] == "" || sqlList["orderIssueSql"] == "" || sqlList["rejectedBillItemSql"] == "" || sqlList["logSql"] == ""{
+			return
+		}
+		orderIssues := orm.GetMysqlData(sqlList["orderIssueSql"])
+		if len(orderIssues) < 1 {
+			break
+		}
+		modelData, orderPackageConditionValue, secondOrderPackageConditionValue, rejectedBillItemConditionValue, logConditionValue := GetOrderIssuesModel(orderIssues)
+		orderPackages := make([]map[string]string,0)
+		secondOrderPackages := make([]map[string]string,0)
+		rejectedBillItems := make([]map[string]string,0)
+		logs := make([]map[string]string,0)
+		OP := len(orderPackageConditionValue)
+		SOP := len(secondOrderPackageConditionValue)
+		RB := len(rejectedBillItemConditionValue)
+		L := len(logConditionValue)
+		if  orderPackageConditionValue[OP-2:] != "()"{
+			if orderPackageConditionValue[OP-2:OP-1] == "," {
+				orderPackageConditionValue = orderPackageConditionValue[0:OP-2] + orderPackageConditionValue[OP-1:]
+			}
+			orderPackages = orm.GetMysqlData(sqlList["orderPackageSql"]+orderPackageConditionValue)
+		}
+		if  secondOrderPackageConditionValue[len(secondOrderPackageConditionValue)-2:] != "()"{
+			if secondOrderPackageConditionValue[SOP-2:SOP-1] == "," {
+				secondOrderPackageConditionValue = secondOrderPackageConditionValue[0:SOP-2] + secondOrderPackageConditionValue[SOP-1:]
+			}
+			secondOrderPackages = orm.GetMysqlData(sqlList["secondOrderPackageSql"]+secondOrderPackageConditionValue)
+		}
+		if  rejectedBillItemConditionValue[len(rejectedBillItemConditionValue)-2:] != "()"{
+			if rejectedBillItemConditionValue[RB-2:RB-1] == "," {
+				rejectedBillItemConditionValue = rejectedBillItemConditionValue[0:RB-2] + rejectedBillItemConditionValue[RB-1:]
+			}
+			rejectedBillItems = orm.GetMysqlData(sqlList["rejectedBillItemSql"]+rejectedBillItemConditionValue)
+		}
+		if  logConditionValue[len(logConditionValue)-2:] != "()"{
+			if logConditionValue[L-2:L-1] == "," {
+				logConditionValue = logConditionValue[0:L-2] + logConditionValue[L-1:]
+			}
+			logs = orm.GetMysqlData(sqlList["logSql"]+logConditionValue)
+		}
+		result := MergerOrderIssueData(modelData,orderPackages,secondOrderPackages,rejectedBillItems,logs)
+		row, list, mergeRow = OrderIssueFormat(result)
+		mergeColumn = []string{
+			"A","B","C","D","E","F","G","H","I","J","K","L",
+			"U","Y","Z","AA","AF","AG","AH","AI","AJ","AK",
+		}
+	case "packageStatistic":
+		type paramList struct {
+			ROW []interface{} `json:"row"`
+			LIST []map[int]string `json:"list"`
+		}
+		request := paramList{}
+		err := json.Unmarshal([]byte(params["data"]), &request)
+		if err != nil {
+			utilities.WriteLog("/api/controller/controller.go:137   称重统计数据json解析失败!","ERROR")
+		}
+		row, list = PackageStatisticFormat(request.ROW, request.LIST)
+	case "inventoryAccountMission":
+		fmt.Println(params["data"])
+		err := json.Unmarshal([]byte(params["data"]), &data)
+		if err != nil {
+			fmt.Println(err)
+			utilities.WriteLog("/api/controller/controller.go:178   库存盘点数据json解析失败!","ERROR")
+		}
+		row, list = InventoryAccountMissionFormat(data)
+	case "inventoryCompare":
+		data = orm.GetMysqlData(params["sql"])
+		row, list = InventoryCompareFormat(data)
+	}
+	return row,list,mergeRow,mergeColumn
+}

+ 130 - 0
serves/excelExportGo/api/controller/inventoryController.go

@@ -0,0 +1,130 @@
+package controller
+
+import (
+	"bswas/utilities"
+)
+
+func InventoryFormat(data []map[string]string, requestType bool) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"货主","库位","产品编码","产品条码","商品名称","属性仓	","质量状态","失效日期","批号",
+	}
+	if requestType == true {
+		row = append(row,"移出数量","移入数量")
+	}
+	row = append(row,"在库数量","占用数量")
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for index,column := range row {
+			line[index] = v[column.(string)]
+		}
+		list[k] = line
+	}
+	return row, list
+}
+
+func InventoryDailyLogFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"货主","日期","商品名称","商品编码","商品条码","在库数量","长","宽","高","体积","总占用体积",
+	}
+	column := map[string]int{
+		"owner_name" : 0,
+		"created_at" : 1,
+		"commodity_name" : 2,
+		"commodity_sku" : 3,
+		"commodity_barcode_code" : 4,
+		"amount" : 5,
+		"commodity_length" : 6,
+		"commodity_width" : 7,
+		"commodity_height" : 8,
+		"commodity_volumn" : 9,
+		"volumn_occupied" : 10,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "created_at" {
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row, list
+}
+func InventoryAccountMissionFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"库位","产品名","商品条码","商品编码","生产日期","失效日期","批号","盘点人","ERP属性仓","质量状态","库存数量",
+		"可用数量","盘点数量","复盘数量","复盘差异","分配数量","状态",
+	}
+		column := map[string]int{
+		"location" : 0,
+		"commodity_name" : 1,
+		"commodity_barcode" : 2,
+		"commodity_sku" : 3,
+		"produced_at" : 4,
+		"valid_at" : 5,
+		"batch_number" : 6,
+		"stock_person" : 7,
+		"erp_type_position" : 8,
+		"quality" : 9,
+		"stored_amount" : 10,
+		"valid_amount" : 11,
+		"verified_amount" : 12,
+		"re_checked_amount" : 13,
+		"difference_amount" : 14,
+		"occupied_amount" : 15,
+		"mark" : 16,
+
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "produced_at"{
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			if key == "valid_at"{
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row, list
+}
+func InventoryCompareFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"货主","任务号","生产时间","商品名称","商品编码","商品条码","属性仓","质量状态","宝时库存","参考库存","差值",
+	}
+	column := map[string]int{
+		"owner_name" : 0,
+		"mission_code" : 1,
+		"created_at" : 2,
+		"commodity_name" : 3,
+		"commodity_sku" : 4,
+		"commodity_barcode_code" : 5,
+		"custom_location" : 6,
+		"quality" : 7,
+		"amount_in_sys" : 8,
+		"amount_in_compare" : 9,
+		"differ" : 10,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "created_at" {
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row, list
+}

+ 35 - 0
serves/excelExportGo/api/controller/laborReportController.go

@@ -0,0 +1,35 @@
+package controller
+
+func LaborReportFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"进厂编号","小组","临时工","电话","身份证号","劳务所","进场时间","进组时间","退组时间",
+		"退场时间","审核时间","审核人","晚饭时间(分)","在线时长","本次工作时长","备注",
+	}
+	column := map[string]int{
+		"enter_number" : 0,
+		"user_workgroup_name" : 1,
+		"name" : 2,
+		"mobile_phone" : 3,
+		"identity_number" : 4,
+		"labor_company" : 5,
+		"enter_at" : 6,
+		"check_in_at" : 7,
+		"check_out_at" : 8,
+		"exit_at" : 9,
+		"verify_at" : 10,
+		"group_user_id" : 11,
+		"relax_time" : 12,
+		"online_duration" : 13,
+		"working_duration" : 14,
+		"remark" : 15,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row, list
+}

+ 432 - 0
serves/excelExportGo/api/controller/orderController.go

@@ -0,0 +1,432 @@
+package controller
+
+import (
+	"bswas/utilities"
+	"strconv"
+	"strings"
+)
+
+func OrderFormat(data []map[string]string) ([]interface{}, [][]interface{}, map[string]string) {
+	row := []interface{}{
+		"编号","订单状态","备注","接口下发时间","店铺名称","客户","客户订单号","承运人","快递单号","收货人名称","收货人电话",
+		"省","市","区","收货人地址","波次编号","仓库","快递获取标记","快递获取时间","产品代码","产品条码","明细状态",
+		"产品名称","订单数量","复核时间","接口取消标记","拣货单打印标记","接口回传标记","接口回传异常备注","订单冻结",
+	}
+	column := map[string]int{
+		"ORDERNO" : 0,
+		"ORDERCODENAME" : 1,
+		"NOTES" : 2,
+		"ADDTIME" : 3,
+		"ISSUEPARTYNAME" : 4,
+		"CUSTOMER_DESCR_C" : 5,
+		"SOREFERENCE1" : 6,
+		"CARRIERNAME" : 7,
+		"SOREFERENCE5" : 8,
+		"C_CONTACT" : 9,
+		"C_TEL2" : 10,
+		"C_PROVINCE" : 11,
+		"C_CITY" : 12,
+		"C_DISTRICT" : 13,
+		"C_ADDRESS1" : 14,
+		"WAVENO" : 15,
+		"WAREHOUSEID" : 16,
+		"EDISENDFLAG2" : 17,
+		"EDISENDTIME2" : 18,
+		"SKU" : 19,
+		"ALTERNATE_SKU1" : 20,
+		"ORDERDETAILCODENAME" : 21,
+		"DESCR_C" : 22,
+		"QTYORDERED" : 23,
+		"CHECKTIME" : 24,
+		"ERPCANCELFLAG" : 25,
+		"PICKING_PRINT_FLAG" : 26,
+		"EDISENDFLAG" : 27,
+		"EDIREMARKS2" : 28,
+		"RELEASESTATUS" : 29,
+	}
+	list := make([][]interface{},len(data))
+	mergeRow := make(map[string]string)
+	var columnName string
+	var startIndex int
+	rowAmount := 0
+	for k,v := range data{
+		if columnName == v["ORDERNO"] {
+			rowAmount++
+		}else{
+			if rowAmount != 0 {
+				mergeRow[strconv.Itoa(startIndex+2)] = strconv.Itoa(startIndex+2+rowAmount)
+			}
+			columnName = v["ORDERNO"]
+			startIndex = k
+			rowAmount = 0
+		}
+		if rowAmount != 0 {
+			mergeRow[strconv.Itoa(startIndex+2)] = strconv.Itoa(startIndex+2+rowAmount)
+		}
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "ADDTIME" || key == "EDISENDTIME2" || key == "CHECKTIME"{
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list,mergeRow
+}
+
+func OrderWaveFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"波次号","波次状态","波次规则","波次描述","承运人","操作员","创建时间","拣货单打印人","拣货单打印时间",
+		"快递单号打印人","快递单号打印时间",
+	}
+	column := map[string]int{
+		"WAVENO"  :  0,
+		"CODENAME_C"  :  1,
+		"WAVERULE"  :  2,
+		"DESCR"  :  3,
+		"DESCR_C"  :  4,
+		"ADDWHO"  :  5,
+		"ADDTIME"  :  6,
+		"pickerPrint"  :  7,
+		"pickerPrintTime"  :  8,
+		"expressPrinting"  :  9,
+		"expressPrintTime"  :  10,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			val := ""
+			if key == "pickerPrint" && v["USERDEFINE1"] != ""{
+				index := strings.IndexAny(v["USERDEFINE1"],"-PK")
+				if  index != -1{
+					val = v["USERDEFINE1"][0:index-1]
+				}
+			}
+			if key == "pickerPrintTime" && v["USERDEFINE1"] != ""{
+				index := strings.IndexAny(v["USERDEFINE1"],"-PK")
+				if  index != -1{
+					val = v["USERDEFINE1"][index+3:len(v["USERDEFINE1"])-1]
+				}
+			}
+			if key == "expressPrinting" && v["USERDEFINE2"] != ""{
+				index := strings.IndexAny(v["USERDEFINE2"],"-EX")
+				if  index != -1{
+					val = v["USERDEFINE2"][0:index-1]
+				}else{
+					index := strings.IndexAny(v["USERDEFINE2"],"-Auto")
+					if  index != -1{
+						val = v["USERDEFINE2"][0:index-1]
+					}
+				}
+			}
+			if key == "expressPrintTime" && v["USERDEFINE2"] != ""{
+				index := strings.IndexAny(v["USERDEFINE2"],"-EX")
+				if  index != -1{
+					val = v["USERDEFINE2"][index+3:len(v["USERDEFINE2"])-1]
+				}else{
+					index := strings.IndexAny(v["USERDEFINE2"],"-Auto")
+					if  index != -1{
+						val = v["USERDEFINE2"][index+5:len(v["USERDEFINE2"])-1]
+					}
+				}
+			}
+			if val != ""{
+				line[value] = val
+			}else{
+				line[value] = v[key]
+			}
+		}
+		list[k] = line
+	}
+	return row, list
+}
+func MergerOrderIssueData(data map[string]map[string]interface{}, orderPackages []map[string]string,
+						secondOrderPackages []map[string]string, rejectedBillItems []map[string]string, logs []map[string]string) map[string]map[string]interface{} {
+	if len(orderPackages) > 0{
+		data = mergerOrderPackage(data, orderPackages)
+	}
+	if len(secondOrderPackages) > 0{
+		data = mergerSecondOrderPackage(data, secondOrderPackages)
+	}
+	if len(rejectedBillItems) > 0{
+		data = mergerRejectedBillItem(data, rejectedBillItems)
+	}
+	if len(logs) > 0{
+		data = mergerLog(data, logs)
+	}
+	return data
+}
+
+func mergerOrderPackage(data map[string]map[string]interface{}, orderPackages []map[string]string) map[string]map[string]interface{} {
+	for _,orderPackage := range orderPackages {
+		_,isExist := data[orderPackage["order_issue_id"]]["orderPackages"]
+		if isExist {
+			data[orderPackage["order_issue_id"]]["orderPackages"] = append(data[orderPackage["order_issue_id"]]["orderPackages"].([]map[string]string),orderPackage)
+		}else{
+			sliced := []map[string]string{
+				orderPackage,
+			}
+			data[orderPackage["order_issue_id"]]["orderPackages"] = sliced
+		}
+	}
+	return data
+}
+func mergerSecondOrderPackage(data map[string]map[string]interface{}, secondOrderPackages []map[string]string) map[string]map[string]interface{} {
+	for _,secondOrderPackage := range secondOrderPackages {
+		_,isExist := data[secondOrderPackage["order_issue_id"]]["secondOrderPackages"]
+		if isExist {
+			data[secondOrderPackage["order_issue_id"]]["secondOrderPackages"] = append(data[secondOrderPackage["order_issue_id"]]["secondOrderPackages"].([]map[string]string),secondOrderPackage)
+		}else{
+			sliced := []map[string]string{
+				secondOrderPackage,
+			}
+			data[secondOrderPackage["order_issue_id"]]["secondOrderPackages"] = sliced
+		}
+	}
+	return data
+}
+func mergerRejectedBillItem(data map[string]map[string]interface{}, rejectedBillItems []map[string]string) map[string]map[string]interface{} {
+	for _,rejectedBillItem := range rejectedBillItems {
+		_,isExist := data[rejectedBillItem["order_issue_id"]]["rejectedBillItems"]
+		if isExist {
+			data[rejectedBillItem["order_issue_id"]]["rejectedBillItems"] = append(data[rejectedBillItem["order_issue_id"]]["rejectedBillItems"].([]map[string]string),rejectedBillItem)
+		}else{
+			sliced := []map[string]string{
+				rejectedBillItem,
+			}
+			data[rejectedBillItem["order_issue_id"]]["rejectedBillItems"] = sliced
+		}
+	}
+	return data
+}
+func mergerLog(data map[string]map[string]interface{}, logs []map[string]string) map[string]map[string]interface{} {
+	for _,log := range logs {
+		_,isExist := data[log["order_issue_id"]]["logs"]
+		if isExist {
+			data[log["order_issue_id"]]["logs"] = append(data[log["order_issue_id"]]["logs"].([]map[string]string),log)
+		}else{
+			sliced := []map[string]string{
+				log,
+			}
+			data[log["order_issue_id"]]["logs"] = sliced
+		}
+	}
+	return data
+}
+func OrderIssueFormat(dataMap map[string]map[string]interface{}) ([]interface{}, [][]interface{}, map[string]string)  {
+	row := []interface{}{
+		"登记日期","创建日期","客户","店铺","客户订单号","原始承运商","收货人",
+		"收货电话","省","市","区","收货人地址","原始运单号","原始商品条码","原始商品名称","原始商品数量",
+		"退单备注","退单商品名","退单商品条码","退单商品数量","退单状态",
+		"操作类型","说明","操作者","问题类别","二次订单号","二次承运商","二次运单号",
+		"二次商品条码","二次商品名","二次商品数量","最终状态",
+		"承运商赔偿金额","承运商快递减免",
+		"宝时赔偿金额","宝时快递减免","事故责任方",
+	}
+	column := map[string]int{
+		"order_created_at"  :  0,
+		"order_issues_created_at"  :  1,
+		"owner_name"  :  2,
+		"shop_name"  :  3,
+		"client_code"  :  4,
+		"logistic_name"  :  5,
+		"consignee_name"  :  6,
+		"consignee_phone"  :  7,
+		"province"  :  8,
+		"city"  :  9,
+		"district"  :  10,
+		"address"  :  11,
+		"order_package_logistic_number"  :  12,
+		"commodity_sku"  :  13,
+		"commodity_name"  :  14,
+		"commodity_amount" : 15,
+		"remark" : 16,
+		"name_goods"  :  17,
+		"barcode_goods"  :  18,
+		"rejected_bill_amount"  :  19,
+		"rejecting_status"  :  20,
+		"log_type"  :  21,
+		"log_content"  :  22,
+		"user_name"  :  23,
+		"order_issue_type_name"  :  24,
+		"s_o_client_code"  :  25,
+		"s_logistics_name"  :  26,
+		"logistic_number"  :  27,
+		"s_c_sku"  :  28,
+		"s_c_name"  :  29,
+		"s_o_p_c_amount"  :  30,
+		"final_status"  :  31,
+		"logistic_indemnity_money"  :  32,
+		"logistic_express_remission"  :  33,
+		"baoshi_indemnity_money"  :  34,
+		"baoshi_express_remission"  :  35,
+		"user_workgroup_name"  :  36,
+	}
+	data := make([]map[string]interface{},len(dataMap))
+	for _,value := range dataMap {
+		data[value["index"].(int)] = value
+	}
+	var list [][]interface{}
+	mergeRow := make(map[string]string)
+	rownum := 0
+	for _,v := range data{
+		var orderPackages []map[string]string
+		var secondOrderPackages []map[string]string
+		var rejectedBillItems []map[string]string
+		var logs []map[string]string
+		if v["orderPackages"] != nil {
+			orderPackages = v["orderPackages"].([]map[string]string)
+		}
+		orderPackagesLength := len(orderPackages)
+
+		if v["secondOrderPackages"] != nil {
+			secondOrderPackages = v["secondOrderPackages"].([]map[string]string)
+		}
+		secondOrderPackagesLength := len(secondOrderPackages)
+
+		if v["rejectedBillItems"] != nil {
+			rejectedBillItems = v["rejectedBillItems"].([]map[string]string)
+		}
+		rejectedBillItemsLength := len(rejectedBillItems)
+
+		if v["logs"] != nil {
+			logs = v["logs"].([]map[string]string)
+		}
+		logsLength := len(logs)
+
+		count := 1
+		if  orderPackagesLength> count {
+			count = orderPackagesLength
+		}
+		if secondOrderPackagesLength > count {
+			count = secondOrderPackagesLength
+		}
+		if rejectedBillItemsLength > count {
+			count = rejectedBillItemsLength
+		}
+		if logsLength > count {
+			count = logsLength
+		}
+		if count > 1{
+			mergeRow[strconv.Itoa(rownum+2)] = strconv.Itoa(rownum+1+count)
+		}
+		for i := 0; i<count; i++ {
+			line := make([]interface{},len(row))
+			for key,value := range column {
+				if key == "order_created_at" || key == "order_issues_created_at" {
+					line[value] = utilities.DateFormat(v[key].(string))
+					continue
+				}
+				if key == "order_package_logistic_number" || key == "commodity_sku" || key == "commodity_name" || key == "commodity_amount"{
+					if i < orderPackagesLength && orderPackages != nil{
+						line[value] = orderPackages[i][key]
+					}else{
+						line[value] = ""
+					}
+					continue
+				}
+				if key == "logistic_number" || key == "s_c_sku" || key == "s_c_name" || key == "s_o_p_c_amount"{
+					if i < secondOrderPackagesLength && secondOrderPackages != nil{
+						line[value] = secondOrderPackages[i][key]
+					}else{
+						line[value] = ""
+					}
+					continue
+				}
+				if key == "rejected_bill_amount" || key == "name_goods" || key == "barcode_goods" || key == "remark"{
+					if i < rejectedBillItemsLength && rejectedBillItems != nil{
+						line[value] = rejectedBillItems[i][key]
+					}else{
+						line[value] = ""
+					}
+					continue
+				}
+				if key == "log_type" || key == "log_content" || key == "user_name"{
+					if i < logsLength && logs != nil{
+						line[value] = logs[i][key]
+					}else{
+						line[value] = ""
+					}
+					continue
+				}
+				line[value] = v[key]
+			}
+			list = append(list,line)
+			rownum++
+		}
+	}
+	return row, list, mergeRow
+}
+
+func GetOrderIssuesModel(orderIssues []map[string]string)(modelData map[string]map[string]interface{}, orderPackageConditionValue string,
+	secondOrderPackageConditionValue string, rejectedBillItemConditionValue string, logConditionValue string){
+	modelData = make(map[string]map[string]interface{})
+	orderPackageConditionValue = " WHERE order_packages.order_id IN ("
+	secondOrderPackageConditionValue = " WHERE s_o_p.order_id IN ("
+	rejectedBillItemConditionValue = " WHERE rejected_bill_items.id_rejected_bill IN ("
+	logConditionValue = " WHERE order_issue_process_logs.order_issue_id IN ("
+	for index,value := range orderIssues{
+		orderIssue := map[string]interface{}{
+			"index": 					  index,
+			"id":                         value["id"],
+			"district":                   value["district"],
+			"address":                    value["address"],
+			"city":                       value["city"],
+			"province":                   value["province"],
+			"consignee_name":             value["consignee_name"],
+			"consignee_phone":            value["consignee_phone"],
+			"client_code":                value["client_code"],
+			"order_created_at":           value["order_created_at"],
+			"logistic_name":              value["logistic_name"],
+			"owner_name":                 value["owner_name"],
+			"s_o_client_code":            value["s_o_client_code"],
+			"logistic_number":            value["logistic_number"],
+			"order_issues_created_at":    value["order_issues_created_at"],
+			"shop_name":                  value["shop_name"],
+			"rejecting_status":           value["rejecting_status"],
+			"order_issue_type_name":      value["order_issue_type_name"],
+			"final_status":               value["final_status"],
+			"logistic_indemnity_money":   value["logistic_indemnity_money"],
+			"logistic_express_remission": value["logistic_express_remission"],
+			"baoshi_indemnity_money":     value["baoshi_indemnity_money"],
+			"baoshi_express_remission":   value["baoshi_express_remission"],
+			"user_workgroup_name":        value["user_workgroup_name"],
+		}
+		modelData[value["id"]] = orderIssue
+		if index < len(orderIssues)-1{
+			if value["order_id"] != "" {
+				orderPackageConditionValue += value["order_id"]+","
+			}
+			if value["s_o_id"] != "" {
+				secondOrderPackageConditionValue += value["s_o_id"]+","
+			}
+			if value["rejected_bill_id"] != "" {
+				rejectedBillItemConditionValue += value["rejected_bill_id"]+","
+			}
+			if value["id"] != "" {
+				logConditionValue += value["id"]+","
+			}
+		}else{
+			if value["order_id"] != "" {
+				orderPackageConditionValue += value["order_id"]
+			}
+			if value["s_o_id"] != "" {
+				secondOrderPackageConditionValue += value["s_o_id"]
+			}
+			if value["rejected_bill_id"] != "" {
+				rejectedBillItemConditionValue += value["rejected_bill_id"]
+			}
+			if value["id"] != "" {
+				logConditionValue += value["id"]
+			}
+		}
+	}
+	orderPackageConditionValue += ")"
+	secondOrderPackageConditionValue += ")"
+	rejectedBillItemConditionValue += ")"
+	logConditionValue += ")"
+	return
+}

+ 122 - 0
serves/excelExportGo/api/controller/packageController.go

@@ -0,0 +1,122 @@
+package controller
+
+import (
+	"bswas/utilities"
+	"strconv"
+)
+
+func PackageFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"货主","快递单号","发货单号","波次号","波次规则","操作时间","收件人","收件人电话","承运商","设备",
+		"重量(KG)","长(CM)","宽(CM)","高(CM)","体积(CM³)","纸箱","状态",
+	}
+	column := map[string]int{
+		"owner_name" : 0,
+		"logistic_number" : 1,
+		"delivery_number" : 2,
+		"batch_number" : 3,
+		"batch_rule" : 4,
+		"created_at" : 5,
+		"recipient" : 6,
+		"recipient_mobile" : 7,
+		"logistic_name" : 8,
+		"measuring_machine_name" : 9,
+		"weight" : 10,
+		"length" : 11,
+		"width" : 12,
+		"height" : 13,
+		"bulk" : 14,
+		"paper_box_name" : 15,
+		"status" : 16,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}
+
+func PackageCreateExceptionFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"快递单号","承运商","设备","称重时间","重(KG)","长(CM)","宽(CM)","高(CM)","体积(CM³)",
+		"纸箱","异常类型",
+	}
+	column := map[string]int{
+		"logistic_number" : 0,
+		"logistic_name" : 1,
+		"measuring_machine_name" : 2,
+		"weigh_time" : 3,
+		"weight" : 4,
+		"length" : 5,
+		"width" : 6,
+		"height" : 7,
+		"bulk" : 8,
+		"paper_box_name" : 9,
+		"status" : 10,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}
+func PackageIssuedExceptionFormat(data []map[string]string) ([]interface{}, [][]interface{})  {
+	row := []interface{}{
+		"快递单号","下发时间","发货单号","波次号","波次规则","收件人","收件人电话","承运商","异常类型",
+	}
+	column := map[string]int{
+		"logistic_number" : 0,
+		"created_at" : 1,
+		"delivery_number" : 2,
+		"batch_number" : 3,
+		"batch_rule" : 4,
+		"recipient" : 5,
+		"recipient_mobile" : 6,
+		"logistic_name" : 7,
+		"status" : 8,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "created_at"{
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}
+
+func PackageStatisticFormat(ROW []interface{},LIST []map[int]string) ([]interface{}, [][]interface{}) {
+	list := make([][]interface{},len(LIST))
+	for k,v := range LIST {
+		line := make([]interface{},len(ROW))
+		amount := 0
+		for index,_ := range ROW {
+			_,sign := v[index]
+			if sign {
+				if index > 1 {
+					number,_ := strconv.Atoi(v[index])
+					amount += number
+				}
+				line[index] = v[index]
+			}else{
+				line[index] = "0"
+			}
+		}
+		line[1] = amount
+		list[k] = line
+	}
+	return ROW,list
+}

+ 113 - 0
serves/excelExportGo/api/controller/processController.go

@@ -0,0 +1,113 @@
+package controller
+
+import (
+	"bswas/utilities"
+	"strconv"
+)
+
+func ProcessFormat(data []map[string]string) ([]interface{}, [][]interface{}, map[string]string) {
+	row := []interface{}{
+		"任务号","货主","加工类型","预期数量","实际数量","状态","备注",
+		"单价","提交日期","单据类型","单据号","商品编码","商品名称","商品条码","本次数量",
+	}
+	column := map[string]int{
+		"code" : 0,
+		"owner_name" : 1,
+		"process_method_name" : 2,
+		"amount" : 3,
+		"completed_amount" : 4,
+		"status" : 5,
+		"remark" : 6,
+		"unit_price" : 7,
+		"created_at" : 8,
+		"content_bill_type" : 9,
+		"content_wms_code" : 10,
+		"commodity_sku" : 11,
+		"commodity_name" : 12,
+		"commodity_barcode_code" : 13,
+		"content_amount" : 14,
+	}
+	list := make([][]interface{},len(data))
+	mergeRow := make(map[string]string)
+	var columnName string
+	var startIndex int
+	rowAmount := 0
+	for k,v := range data{
+		if columnName == v["code"]{
+			rowAmount++
+		}else{
+			if rowAmount != 0 {
+				mergeRow[strconv.Itoa(startIndex+2)] = strconv.Itoa(startIndex+2+rowAmount)
+			}
+			columnName = v["code"]
+			startIndex = k
+			rowAmount = 0
+		}
+		if rowAmount != 0 {
+			mergeRow[strconv.Itoa(startIndex+2)] = strconv.Itoa(startIndex+2+rowAmount)
+		}
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			val := v[key]
+			if key == "commodity_sku" && v["sign_commodity_sku_mark"] != "" {
+				val = v["sign_commodity_sku_mark"]
+			}
+			if key == "commodity_name" && v["sign_commodity_name_mark"] != "" {
+				val = v["sign_commodity_name_mark"]
+			}
+			if key == "commodity_barcode_code" && v["sign_commodity_barcode_mark"] != "" {
+				val = v["sign_commodity_barcode_mark"]
+			}
+			if key == "created_at"{
+				val = utilities.DateFormat(v[key])
+			}
+			line[value] = val
+		}
+		list[k] = line
+	}
+	return row,list,mergeRow
+}
+
+func ProcessStatisticFormat(data []map[string]string) ([]interface{}, [][]interface{}) {
+	row := []interface{}{
+		"任务号", "货主", "开始日期", "完成日期", "单价", "预期数量", "完成数量", "收入合计",
+		"完成时间(天)'", "总工时", "加工类型", "最高日产能", "最低日产能", "日均产能", "合计成本", "毛利润",
+		"毛利率", "状态",
+	}
+	column := map[string]int{
+		"process_code" : 0,
+		"owner_name" : 1,
+		"started_at" : 2,
+		"ended_at" : 3,
+		"process_unit_price" : 4,
+		"process_amount" : 5,
+		"process_completed_amount" : 6,
+		"revenue" : 7,
+		"duration_days" : 8,
+		"duration_man_hours" : 9,
+		"process_method_name" : 10,
+		"top_capacity" : 11,
+		"bottom_capacity" : 12,
+		"average_capacity" : 13,
+		"total_cost" : 14,
+		"gross_profit" : 15,
+		"gross_profit_rate" : 16,
+		"process_status" : 17,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "gross_profit_rate" {
+				rate,_ := strconv.ParseFloat(v[key],64)
+				if rate != 0 {
+					line[value] = strconv.FormatFloat(rate * 100, 'f', 2, 64)+"%"
+				}
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}

+ 120 - 0
serves/excelExportGo/api/controller/rejectedController.go

@@ -0,0 +1,120 @@
+package controller
+
+import (
+	"bswas/utilities"
+	"strconv"
+)
+
+func RejectedFormat(data []map[string]string) ([]interface{}, [][]interface{}, map[string]string) {
+	row := []interface{}{
+		"日期","审核号","客户名称","订单号","姓名",
+		"手机","原单单号","退回单号","退回公司","到付费用",
+		"是否入库","商品条码","商品名称",
+	}
+	column := map[string]int{
+		"created_at" : 0,
+		"checked_numbers" : 1,
+		"owner_name" : 2,
+		"order_number" : 3,
+		"sender" : 4,
+		"mobile_sender" : 5,
+		"logistic_number" : 6,
+		"logistic_number_return" : 7,
+		"logistic_name" : 8,
+		"fee_collected" : 9,
+		"is_loaded" : 10,
+		"item_barcode" : 11,
+		"item_name" : 12,
+	}
+	dataLength := len(data)
+	if  dataLength > 0 && data[0]["id_owner"] == "94"{
+		row = append(row, "寄件方省","重量")
+		column["common_01"] = 13
+		column["common_02"] = 14
+	}
+	thisRowLength := len(row)
+	column["item_amount"] = thisRowLength
+	column["quality_label_name"] = thisRowLength+1
+	column["item_batch_number"] = thisRowLength+2
+	column["item_made_at"] = thisRowLength+3
+	column["item_validity_at"] = thisRowLength+4
+	column["item_remark"] = thisRowLength+5
+	column["remark"] = thisRowLength+6
+	column["operator_name"] = thisRowLength+7
+	row = append(row ,"数量","是否正品", "批次号","生产日期","效期","备注","退单备注","录入人")
+	list := make([][]interface{},len(data))
+	mergeRow := make(map[string]string)
+	var columnName string
+	var startIndex int
+	rowAmount := 0
+	for k,v := range data{
+		if columnName == v["id"] {
+			rowAmount++
+		}else{
+			if rowAmount != 0 {
+				mergeRow[strconv.Itoa(startIndex+2)] = strconv.Itoa(startIndex+2+rowAmount)
+			}
+			columnName = v["id"]
+			startIndex = k
+			rowAmount = 0
+		}
+		if rowAmount != 0 {
+			mergeRow[strconv.Itoa(startIndex+2)] = strconv.Itoa(startIndex+2+rowAmount)
+		}
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "created_at"{
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			val := v[key]
+			if key == "is_loaded" {
+				switch v[key] {
+				case "":
+					val = "无需入库"
+				case "0":
+					val = "否"
+				case "1":
+					val = "是"
+				case "2":
+					val = "待推单"
+				case "3":
+					val = "上传异常"
+				}
+			}
+			line[value] = val
+		}
+		list[k] = line
+	}
+
+	return row,list,mergeRow
+}
+
+func RejectedStatisticsFormat(data []map[string]string) ([]interface{}, [][]interface{}){
+	row := []interface{}{
+		"货主名","退件单数","审核单数","未审核单数","入库单数","未入库单数",
+	}
+	column := map[string]int{
+		"owner_name" : 0,
+		"bounce_amount" : 1,
+		"check_amount" : 2,
+		"uncheck_amount" : 3,
+		"in_storage_count" : 4,
+		"not_in_storage_count" : 5,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "uncheck_amount" {
+				bounce,_ := strconv.Atoi(v["bounce_amount"])
+				check,_ := strconv.Atoi(v["check_amount"])
+				line[value] = strconv.Itoa(bounce - check)
+			}else{
+				line[value] = v[key]
+			}
+		}
+		list[k] = line
+	}
+	return row, list
+}

+ 170 - 0
serves/excelExportGo/api/controller/waybillController.go

@@ -0,0 +1,170 @@
+package controller
+
+import (
+	"bswas/utilities"
+	"encoding/json"
+)
+
+func WaybillFormat(data []map[string]string) ([]interface{}, [][]interface{}) {
+	row := []interface{}{
+		"运单类型", "货主", "上游单号", "wms订单号", "运单号", "运输收费",
+		"其他收费", "其他收费备注", "始发地", "目的地", "承运商", "承运商单号",
+		"仓库计抛", "承运商计抛", "仓库计重", "承运商计重", "车型", "车辆信息",
+		"计件", "里程数", "运费(元)", "提货费(元)", "其他费用(元)", "发货时间",
+		"调度备注", "创建时间",
+	}
+	column := map[string]int{
+		"type" : 0,
+		"owner_name" : 1,
+		"source_bill" : 2,
+		"wms_bill_number" : 3,
+		"waybill_number" : 4,
+		"charge" : 5,
+		"other_charge" : 6,
+		"other_charge_remark" : 7,
+		"origination" : 8,
+		"destination" : 9,
+		"carrier_name" : 10,
+		"carrier_bill" : 11,
+		"warehouse_weight" : 12,
+		"carrier_weight" : 13,
+		"warehouse_weight_other" : 14,
+		"carrier_weight_other" : 15,
+		"car_type_name" : 16,
+		"car_owner_info" : 17,
+		"amount" : 18,
+		"mileage" : 19,
+		"fee" : 20,
+		"pick_up_fee" : 21,
+		"other_fee" : 22,
+		"deliver_at" : 23,
+		"dispatch_remark" : 24,
+		"created_at" : 25,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "created_at" {
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}
+
+func WaybillDeliveringFormat(data []map[string]string) ([]interface{}, [][]interface{}) {
+	row := []interface{}{
+		"日期", "承运商", "宝时运单号", "提货仓", "货主", "预估重量",
+		"预估体积", "状态", "专线运单号", "查件电话", "件数", "重量",
+		"体积",
+	}
+	column := map[string]int{
+		"created_at" : 0,
+		"carrier_name" : 1,
+		"waybill_number" : 2,
+		"origination" : 3,
+		"owner_name" : 4,
+		"warehouse_weight_other" : 5,
+		"warehouse_weight" : 6,
+		"status" : 7,
+		"carrier_bill" : 8,
+		"inquire_tel" : 9,
+		"amount" : 10,
+		"carrier_weight_other" : 11,
+		"carrier_weight" : 12,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "status" {
+				if v[key] == "已完结" {
+					line[value] = "已完成"
+				}else{
+					if v["carrier_bill"] != "" {
+						line[value] = "已提交"
+					}else{
+						line[value] = "待提交"
+					}
+				}
+				continue
+			}
+			if key == "created_at" {
+				line[value] = utilities.DateFormat(v[key])
+				continue
+			}
+			line[value] = v[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}
+func WaybillFinancialFormat(data []map[string]string) ([]interface{}, [][]interface{}) {
+	row := []interface{}{
+		"运单类型", "运单号", "货主", "WMS单号", "始发地", "目的地", "收件人", "收件人电话",
+		"收费(元)", "下单备注", "承运商", "承运商单号", "始发市", "目的市", "仓库计数(抛)", "仓库计数二",
+		"承运商计数(抛)", "承运商计数二", "车型", "车辆信息","运费(元)", "提货费(元)", "其他费用(元)", "到付金额(元)",
+		"调度备注", "终审人员", "运单创建时间", "应收款(元)", "应付款(元)", "毛利(元)",
+		"毛利率(元)", "报表生成时间",
+	}
+	column := map[string]int{
+		"type" : 0,
+		"waybill_number" : 1,
+		"owner_name" : 2,
+		"wms_bill_number" : 3,
+		"origination" : 4,
+		"destination" : 5,
+		"recipient" : 6,
+		"recipient_mobile" : 7,
+		"charge" : 8,
+		"ordering_remark" : 9,
+		"carrier" : 10,
+		"carrier_bill" : 11,
+		"origination_city" : 12,
+		"destination_city" : 13,
+		"warehouse_weight" : 14,
+		"warehouse_weight_other" : 15,
+		"carrier_weight" : 16,
+		"carrier_weight_other" : 17,
+		"car_type_name" : 18,
+		"car_owner_info" : 19,
+		"fee" : 20,
+		"pick_up_fee" : 21,
+		"other_fee" : 22,
+		"collect_fee" : 23,
+		"dispatch_remark" : 24,
+		"auditLog_user_name" : 25,
+		"created_at" : 26,
+		"total_receivable" : 27,
+		"total_expense" : 28,
+		"gross_margin" : 29,
+		"gross_profit_rate" : 30,
+		"snapshotCreated_at" : 31,
+	}
+	list := make([][]interface{},len(data))
+	for k,v := range data{
+		m := make(map[string]string)
+		err := json.Unmarshal([]byte(v["json_content"]),&m)
+		if err != nil {
+			utilities.WriteLog("/api/controller/waybillController.go:145  运单财务记录内字段json解析失败!","ERROR")
+		}
+		line := make([]interface{},len(row))
+		for key,value := range column {
+			if key == "snapshotCreated_at" {
+				line[value] = utilities.DateFormat(v["created_at"])
+				continue
+			}
+			if key == "created_at"{
+				line[value] = utilities.DateFormat(m[key])
+				continue
+			}
+			line[value] = m[key]
+		}
+		list[k] = line
+	}
+	return row,list
+}

+ 41 - 0
serves/excelExportGo/excel/export.go

@@ -0,0 +1,41 @@
+package excel
+
+import (
+	"bswas/utilities"
+	"github.com/360EntSecGroup-Skylar/excelize/v2"
+)
+
+const SHEET  = "Sheet1"
+
+func CreateFile(row []interface{},list [][]interface{}, mergeRow map[string]string, mergeColumn []string) (excel *excelize.File) {
+	file := excelize.NewFile()
+	streamWriter, err := file.NewStreamWriter(SHEET)
+	if err != nil {
+		utilities.WriteLog("/excel/export.go:14   文件生成失败!","ERROR")
+	}
+	cell, _ := excelize.CoordinatesToCellName(1, 1)
+	if err := streamWriter.SetRow(cell, row); err != nil {
+		utilities.WriteLog("/excel/export.go:18  写入表头失败!","ERROR")
+	}
+	for index := 0; index < len(list); index++ {
+		cell, _ := excelize.CoordinatesToCellName(1, index+2)
+		if err := streamWriter.SetRow(cell, list[index]); err != nil {
+			utilities.WriteLog("/excel/export.go:23  数据写入文件失败!","ERROR")
+		}
+	}
+	if mergeRow != nil && mergeColumn != nil {
+		for start,end := range mergeRow {
+			for i := 0;i<len(mergeColumn); i++ {
+				err := file.MergeCell(SHEET,mergeColumn[i]+start,mergeColumn[i]+end)
+				if err != nil {
+					utilities.WriteLog("/excel/export.go:31  合并单元格失败!","ERROR")
+					return
+				}
+			}
+		}
+	}
+	if err := streamWriter.Flush(); err != nil {
+		utilities.WriteLog("/excel/export.go:38  文件流关闭失败!","ERROR")
+	}
+	return file
+}

+ 9 - 0
serves/excelExportGo/go.mod

@@ -0,0 +1,9 @@
+module bswas
+
+go 1.13
+
+require (
+	github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0
+	github.com/go-sql-driver/mysql v1.5.0
+	github.com/godror/godror v0.19.4
+)

+ 52 - 0
serves/excelExportGo/go.sum

@@ -0,0 +1,52 @@
+github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 h1:tDWYNCJrpNnlNg8mVdlzAzPjlPaRbsA/kS8H9LczleQ=
+github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0/go.mod h1:Uwb0d1GgxJieUWZG5WylTrgQ2SrldfjagAxheU8W6MQ=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
+github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/godror/godror v0.19.4 h1:uuv6MBcZ0X57Axaz1yiESCqQmEqJgNr7OB13rOhEmOs=
+github.com/godror/godror v0.19.4/go.mod h1:5fX2oe9jOfgNmzAUYWJ5TAQOpMgrme9622vmmjm7lb4=
+github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/xuri/efp v0.0.0-20191019043341-b7dc4fe9aa91 h1:gp02YctZuIPTk0t7qI+wvg3VQwTPyNmSGG6ZqOsjSL8=
+github.com/xuri/efp v0.0.0-20191019043341-b7dc4fe9aa91/go.mod h1:uBiSUepVYMhGTfDeBKKasV4GpgBlzJ46gXUBAqV8qLk=
+golang.org/dl v0.0.0-20200724191219-e4fbcf8a7a81/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
+golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 9 - 0
serves/excelExportGo/logs/2020-09-09.log

@@ -0,0 +1,9 @@
+
+[ERROR]   11:12:55
+   /api/controller/controller.go:17   参数解析失败!
+[ERROR]   11:12:56
+   /api/controller/controller.go:17   参数解析失败!
+[ERROR]   11:13:49
+   /api/controller/controller.go:17   参数解析失败!
+[ERROR]   11:13:49
+   /api/controller/controller.go:17   参数解析失败!

+ 37 - 0
serves/excelExportGo/logs/2020-09-10.log

@@ -0,0 +1,37 @@
+
+[ERROR]   09:29:38
+   /api/controller/controller.go:174   库存盘点数据json解析失败!
+[ERROR]   09:34:44
+   /api/controller/controller.go:174   库存盘点数据json解析失败!
+[ERROR]   09:36:14
+   /api/controller/controller.go:174   库存盘点数据json解析失败!
+[ERROR]   09:42:33
+   /api/controller/controller.go:174   库存盘点数据json解析失败!
+[ERROR]   09:47:43
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   09:48:19
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:23:27
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:24:52
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:29:22
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:31:32
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:33:15
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:44:56
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   10:46:42
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   11:01:44
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   11:06:02
+   /api/controller/controller.go:178   库存盘点数据json解析失败!
+[ERROR]   13:37:16
+   /orm/query.go:11   SQL执行错误!(select inventory_compares.mission_code,inventory_compares.custom_location,inventory_compares.quality,inventory_compares.amount_in_sys,inventory_compares.amount_in_compare,inventory_compares.differ,inventory_compares.created_at, owners.name owner_name, commodities.name commodity_name,commodities.sku commodity_sku, commodity_barcodes.code commodity_barcode_code from `inventory_compares` left join `owners` on `inventory_compares`.`owner_id` = `owners`.`id` left join `commodities` on `inventory_compares`.`commodity_id` = `commodities`.`id` left join `commodity_barcodes` on `commodity_barcodes`.`commodity_id` = `commodities`.`id` order by `id` desc)
+[ERROR]   13:44:31
+   /orm/query.go:11   SQL执行错误!(select inventory_compares.*, owners.name owner_name, commodities.name commodity_name,commodities.sku commodity_sku, commodity_barcodes.code commodity_barcode_code from `inventory_compares` left join `owners` on `inventory_compares`.`owner_id` = `owners`.`id` left join `commodities` on `inventory_compares`.`commodity_id` = `commodities`.`id` left join `commodity_barcodes` on `commodity_barcodes`.`commodity_id` = `commodities`.`id` where `id` = '530,529' order by `id` desc)
+[ERROR]   13:52:09
+   /orm/query.go:11   SQL执行错误!(select inventory_compares.*, owners.name owner_name, commodities.name commodity_name,commodities.sku commodity_sku, commodity_barcodes.code commodity_barcode_code from `inventory_compares` left join `owners` on `inventory_compares`.`owner_id` = `owners`.`id` left join `commodities` on `inventory_compares`.`commodity_id` = `commodities`.`id` left join `commodity_barcodes` on `commodity_barcodes`.`commodity_id` = `commodities`.`id` where `id` in ('680', '679') order by `id` desc)

BIN
serves/excelExportGo/main.exe


+ 14 - 0
serves/excelExportGo/main.go

@@ -0,0 +1,14 @@
+package main
+
+import (
+	"bswas/api/controller"
+	"net/http"
+)
+
+func main() {
+	http.HandleFunc("/", controller.Export)
+	err := http.ListenAndServe("127.0.0.1:8090", nil)
+	if err != nil {
+		panic("端口号已被占用!")
+	}
+}

+ 59 - 0
serves/excelExportGo/orm/query.go

@@ -0,0 +1,59 @@
+package orm
+
+import (
+	"bswas/utilities"
+	"database/sql"
+)
+
+func query(sqlStr string,db *sql.DB)(list []map[string]string) {
+	rows,err := db.Query(sqlStr)
+	if err != nil {
+		utilities.WriteLog("/orm/query.go:11   SQL执行错误!("+sqlStr+")","ERROR")
+		return
+	}
+	//字段名称
+	columns, _ := rows.Columns()
+	//多少个字段
+	length := len(columns)
+	//每一行字段的值
+	values := make([]sql.RawBytes, length)
+	//保存的是values的内存地址
+	pointer := make([]interface{}, length)
+	//
+	for i := 0; i < length; i++ {
+		pointer[i] = &values[i]
+	}
+	//
+	for rows.Next() {
+		//把参数展开,把每一行的值存到指定的内存地址去,循环覆盖,values也就跟着被赋值了
+		err := rows.Scan(pointer...)
+		if err != nil {
+			utilities.WriteLog("/orm/query.go:31   结果集转换错误!("+sqlStr+")","ERROR")
+			return
+		}
+		//每一行
+		row := make(map[string]string)
+		for i := 0; i < length; i++ {
+			row[columns[i]] = string(values[i])
+		}
+		list = append(list, row)
+	}
+	_ = rows.Close()
+	return
+}
+func GetMysqlData(sqlStr string)(list []map[string]string) {
+	db, err := utilities.Mysql()
+	if err != nil {
+		utilities.WriteLog("/orm/query.go:47   Mysql数据库连接错误!","ERROR")
+		return
+	}
+	return query(sqlStr, db)
+}
+func GetOracleData(sqlStr string)(list []map[string]string) {
+	db, err := utilities.Oracle()
+	if err != nil {
+		utilities.WriteLog("/orm/query.go:55   Oracle数据库连接错误!","ERROR")
+		return
+	}
+	return query(sqlStr, db)
+}

+ 61 - 0
serves/excelExportGo/utilities/connect.go

@@ -0,0 +1,61 @@
+package utilities
+
+import (
+	"database/sql"
+	_ "github.com/go-sql-driver/mysql"
+	_ "github.com/godror/godror"
+)
+
+var db *sql.DB
+type connect struct {
+	HOST string
+	PORT string
+	DATABASE string
+	USERNAME string
+	PASSWORD string
+	CHARSET string
+	PARSETIME string
+	SID string
+}
+
+func Mysql()(baseDB *sql.DB, err error)  {
+	mysql := connect{
+		HOST:     "was.baoshi56.com",
+		PORT:     "3306",
+		DATABASE: "bswas",
+		USERNAME: "developer",
+		PASSWORD: "developer",
+		CHARSET: "utf8mb4",
+		PARSETIME: "True",
+	}
+	driver := mysql.USERNAME+":"+mysql.PASSWORD+"@"+"tcp("+mysql.HOST+":"+mysql.PORT+")/"+mysql.DATABASE+"?charset="+mysql.CHARSET
+	if mysql.PARSETIME != "" {
+		driver += "&parseTime="+mysql.PARSETIME
+	}
+	db, err = sql.Open("mysql",driver)
+	if err != nil {
+		WriteLog("/utilities/connect.go:37   Mysql数据库连接错误!","ERROR")
+		return
+	}
+	db.SetMaxOpenConns(20)
+	db.SetMaxIdleConns(10)
+	return db,nil
+}
+
+func Oracle()(baseDB *sql.DB, err error){
+	oracle := connect{
+		HOST:      "47.103.12.61",
+		PORT:      "1521",
+		USERNAME:  "WMS_USER",
+		PASSWORD:  "WMS_USER",
+		SID: 	   "orcl",
+	}
+	db, err := sql.Open("godror",`user="`+oracle.USERNAME+`" password="`+oracle.PASSWORD+`" connectString="`+oracle.HOST+`:`+oracle.PORT+`/`+oracle.SID+`"`)
+	if err != nil {
+		WriteLog("/utilities/connect.go:55   Oracle数据库连接错误!","ERROR")
+		return
+	}
+	db.SetMaxOpenConns(20)
+	db.SetMaxIdleConns(10)
+	return db,nil
+}

+ 14 - 0
serves/excelExportGo/utilities/format.go

@@ -0,0 +1,14 @@
+package utilities
+
+import (
+	"time"
+)
+
+func DateFormat(date string)string{
+	if date == ""{
+		return ""
+	}
+	var LOC, _ = time.LoadLocation("Asia/Shanghai")
+	dateUTC,_ := time.ParseInLocation("2006-01-02T15:04:05Z",date,LOC)
+	return  dateUTC.Local().Format("2006-01-02 15:04:05")
+}

+ 61 - 0
serves/excelExportGo/utilities/log.go

@@ -0,0 +1,61 @@
+package utilities
+
+import (
+	"os"
+	"time"
+)
+type Error struct{
+	msg string
+}
+
+var err *Error
+
+func NewError()*Error{
+	err = &Error{}
+	return err
+}
+
+func (e *Error)GetMsg()string{
+	return e.msg
+}
+
+func todayFilename()string{
+	today := time.Now().Format("2006-01-02")
+	return today + ".log"
+}
+// 创建打开文件
+func getLogFile(content string){
+	path, _ := os.Getwd()
+	logsPath := path+"/logs"
+	if !isExist(logsPath) {
+		err := os.Mkdir(logsPath,os.ModePerm)
+		if err != nil {
+			panic(err)
+		}
+	}
+	filename := logsPath+"/"+todayFilename()
+	log,err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
+	defer log.Close()
+	if err != nil {
+		panic(err)
+	}
+	str := []byte(content)
+	// 写入文件
+	n, err := log.Write(str)
+	if err == nil && n != len(str) {
+		println(`错误代码:`, n)
+		panic(err)
+	}
+}
+
+func WriteLog(content string, grade string ){
+	grade = "["+grade+"]"
+	createTime := time.Now().Format("15:04:05")
+	getLogFile("\n"+grade+"   "+createTime+"\n"+"   "+content)
+	err.msg = content
+}
+
+func isExist(f string) bool {
+	_, err := os.Stat(f)
+	return err == nil || os.IsExist(err)
+}

+ 259 - 26
tests/Routes/WebTest.php

@@ -14,27 +14,228 @@ class WebTest extends TestCase
         "/homeTemp",
         "password/change",
         "password/update",
+        "maintenance/commodity/import",
+        "maintenance/owners/recycle",
+        "maintenance/paperBox/index/model",
+        "maintenance/paperBox/index/owner",
+        "maintenance/paperBox/excel/goImport",
+        "maintenance/waybillPriceModel/excel/goImport",
+        "maintenance/waybillPriceModel/cities/".self::PARAM,
+        "maintenance",
+        "waybill/relating",
+        "waybill/recycle",
+        "waybill/index",
+        "waybill/delivering",
+        "rejected/relating",
+        "rejected/recycle",
+        "rejected/import",
+        "package/weightExcepted/indexCreate",
+        "package/weightExcepted/indexIssued",
+        "package/statistics",
+        "package/relating",
+        "store",
+        "process/relating",
+        "process/statistic",
+        "process/recycle",
+        "personnel/checking-in/userDutyCheck/importAndExportClock",
+        "personnel/checking-in/userDutyCheck/clock",
+        "personnel/checking-in/userDutyCheck/createUserDetail/".self::PARAM,
+        "personnel/checking-in/userDutyCheck/updateUserLaborCompanies/".self::PARAM,
+        "personnel/checking-in/goGetQRCode",
+        "personnel/checking-in/QRCode",
+        "personnel/checking-in/importAndExportQRCode",
+        "personnel/checking-in/createReplenishClock",
+        "personnel/checking-in/clockAudit",
+        "personnel/checking-in/missionAudit",
+        "personnel/relating",
+        "getLaborReport",
+        "inventory/statement/changeInventory/downLoadExcel",
+        "inventory/statement/changeInventory",
+        "inventory/statement/allInventory",
+        "inventory/statement/dailyLog",
+        "inventory/statement/inventoryCompare",
+        "inventory/stockInventory/mission",
+        "inventory/syncOwners",
+        "inventory/完结盘点任务/".self::PARAM,
+        "order/wave/index",
+        "order/issue/workLoad/index",
+        "order/issue/orderIssuePerformance/index",
+        "order/issue/index",
+        "order/issue/create",
+        "order/issue/excelImport",
+        "order/issue/edit/".self::PARAM,
+        "order/tracking/index",
+        "order/tracking/export",
+        "order/tracking/update",
     ];
     const POST = [
-
+        "maintenance/commodity/import/excel",
+        "maintenance/tutorial/showContent/".self::PARAM,
+        "maintenance/userLabor/getWorkRecord",
+        "maintenance/userLabor/getClockRecord",
+        "maintenance/userLabor/relieve",
+        "maintenance/paperBox/excel/import",
+        "waybill/ontop/top",
+        "waybill/ontop/cancel",
+        "waybill/is/waybillPriceModel",
+        "waybill/deleteImg",
+        "waybill/upload",
+        "waybill/refreshWaveHouseWeight",
+        "waybill/storeCarrierBill",
+        "waybill/addCounty",
+        "waybillPriceModel/excel/import",
+        "rejectedBill/".self::PARAM."/edit",
+        "rejected/import/excel",
+        "rejected/analyze/exportExcelOnParams",
+        "rejected/analyze/exportAllExcelOnParams",
+        "rejected/ajaxCheck",
+        "rejected/ajaxCheckAll",
+        "rejected/ajaxFinishAll",
+        "rejected/ajaxGetRejected",
+        //"package/measureMonitor/data",
+        "process/getDailyParticipant",
+        "process/reject/".self::PARAM,
+        "process/receive/".self::PARAM,
+        "process/accomplish",
+        "process/updateDailyOutput",
+        "process/storeProcessDailyParticipant",
+        "process/verifyUserName",
+        "process/updateProcessDailyParticipant",
+        "process/processDailyParticipantAudit/".self::PARAM,
+        "process/getTutorials/".self::PARAM,
+        "process/selectedTutorial",
+        "process/deleteTutorial",
+        "process/ownerGetTutorials/".self::PARAM,
+        "process/rollback",
+        "process/recover",
+        "process/audit",
+        "process/processAccomplish",
+        "process/checkAndAccept",
+        "process/updateUnitPrice",
+        "process/workGroupVerify",
+        "process/accountantVerify",
+        "process/updateStartDate",
+        "process/updateEndDate",
+        "process/importPasteData",
+        "process/deleteProcessContent/".self::PARAM,
+        "personnel/checking-in/userDutyCheck/storeClock",
+        "personnel/checking-in/userDutyCheck/绑定临时工并进组",
+        "personnel/checking-in/userDutyCheck/importGroupClock",
+        "personnel/checking-in/userDutyCheck/storeUserDetail",
+        "personnel/checking-in/userDutyCheck/storeUpdateUserLaborCompanies",
+        "personnel/checking-in/refreshQRCode",
+        "personnel/checking-in/checkUserLabors",
+        "personnel/checking-in/storeReplenishClock",
+        "personnel/checking-in/storeClockAudit",
+        "personnel/checking-in/updateDutyCheckType",
+        "personnel/checking-in/storeGroupAudit",
+        "personnel/checking-in/isException",
+        "personnel/checking-in/storeMissionAudit",
+        "laborReport/guardClockAudit",
+        "laborReport/groupClockAudit",
+        "laborReport/addRemarkAndGroupClock",
+        "laborReport/groupExport",
+        "laborReport/groupExportEnsure",
+        "inventory/statement/changeInventory/deleteExcel",
+        "inventory/statement/dailyLog/getLoggingOwner",
+        "inventory/statement/dailyLog/addLoggingOwner",
+        "inventory/stockInventory/createStockInventoryMission",
+        "inventory/inventoryCompare/import/excel",
+        "inventory/修改质量状态",
+        "inventory/增加系统之外的库位记录",
+        "inventory/盘点选中任务",
+        "inventory/stockInventoryEnd",
+        "inventory/searchStockInventoryRecord",
+        "order/create/batchComments",
+        "order/wave/cancelPrinting",
+        "order/issue/store",
+        "order/issue/batchImport",
+        "order/freeze",
+        "order/freezeAll",
+        "order/thaw",
+        "order/deAllocation",
+        "order/deAllocationAll",
+        "order/resetLogisticsGetMark",
     ];
     const PUT = [
 
     ];
     const DELETE = [
-
+        "process/destroyDailyParticipant/".self::PARAM,
     ];
     const RESTFUL = [
-
+        "maintenance/log",
+        "maintenance/user",
+        "maintenance/role",
+        "maintenance/authority",
+        "maintenance/owner",
+        "maintenance/logistic",
+        "maintenance/qualityLabel",
+        "maintenance/carrier",
+        "maintenance/carType",
+        "maintenance/unit",
+        "maintenance/province",
+        "maintenance/city",
+        "maintenance/commodity",
+        "maintenance/measuringMachine",
+        "maintenance/userWorkgroup",
+        "maintenance/laborCompany",
+        "maintenance/warehouse",
+        "maintenance/jobType",
+        "maintenance/tutorial",
+        "maintenance/userLabor",
+        "maintenance/paperBox",
+        "maintenance/waybillPriceModel",
+        "waybill/waybillFinancialSnapshot",
+        "waybill/waybillFinancialExcepted",
+        "waybill",
+        "rejectedBill",
+        "rejected",
+        "package/measureMonitor",
+        "package",
+        "store/fast",
+        "store/storeItem",
+        "process",
+        "personnel/laborReport",
     ];
     const ANY = [
-
+        "waybill/deliveringExport",
+        "waybill/waybillAudit",
+        "waybill/waybillEdit/".self::PARAM,
+        "waybill/waybillRetreatAudit",
+        "waybill/waybillEndAudit",
+        "waybill/export",
+        "waybill/waybillUpdate/".self::PARAM,
+        "waybillFinancialSnapshot/export",
+        "rejected/index/general",
+        "rejected/index/analyze",
+        "rejected/exportAnalyze",
+        "rejected/export",
+        //"package/measureMonitor/speech",
+        "package/statistics/export",
+        "package/weightExcepted/export/".self::PARAM,
+        "package/export",
+        "process/statistic/export",
+        "process/export",
+        "laborReport/export",
+        "inventory/statement/changeInventory/export",
+        "inventory/statement/allInventory/export",
+        "inventory/statement/dailyLog/export",
+        "inventory/stockInventory/enterStockInventory/".self::PARAM,
+        "inventory/删除盘点记录",
+        "inventory/deleteStockInventoryMission/".self::PARAM,
+        "inventory/stockInventoryExport",
+        "inventory/stockInventory",
+        "order/index/delivering",
+        "order/wave/exportExcel",
+        "order/issue/workLoad/export",
+        "order/issue/orderIssuePerformance/export",
     ];
     const MATCH = [
-
+        "order/issue/export" => ['get','post'],
     ];
     public function testRoutes(){
-        $superAdmin = config('users.superAdmin');
+/*        $superAdmin = config('users.superAdmin');
         $user = User::query()->where('name',$superAdmin[0])->first();
         if (!$user){
             $user = User::query()->create([
@@ -43,34 +244,66 @@ class WebTest extends TestCase
                 'password' => "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
                 'remember_token' => Str::random(10),
             ]);
-        }
+        }*/
         $getMethod = self::GET;
         $postMethod = self::POST;
         $putMethod = self::PUT;
         $deleteMethod = self::DELETE;
-        foreach (self::MATCH as $method => $route){
-            if ($method == 'get'){
-                array_push($getMethod,$route);
-            }
-            if ($method == 'post'){
-                array_push($postMethod,$route);
-            }
-            if ($method == 'put'){
-                array_push($putMethod,$route);
-            }
-            if ($method == 'delete'){
-                array_push($deleteMethod,$route);
+        foreach (self::MATCH as $route => $methods){
+            foreach ($methods as $method){
+                if ($method == 'get'){
+                    array_push($getMethod,$route);
+                }
+                if ($method == 'post'){
+                    array_push($postMethod,$route);
+                }
+                if ($method == 'put'){
+                    array_push($putMethod,$route);
+                }
+                if ($method == 'delete'){
+                    array_push($deleteMethod,$route);
+                }
             }
         }
-        $urls = array_merge(self::GET,self::RESTFUL);
+        foreach (self::ANY as $route){
+            array_push($getMethod,$route);
+            array_push($postMethod,$route);
+            array_push($putMethod,$route);
+            array_push($deleteMethod,$route);
+        }
+        foreach (self::RESTFUL as $route){
+            array_push($getMethod,$route);
+            array_push($getMethod,$route.'/'.self::PARAM);
+            array_push($getMethod,$route.'/create');
+            array_push($postMethod,$route);
+            array_push($getMethod,$route.'/'.self::PARAM.'/edit');
+            array_push($putMethod,$route.'/'.self::PARAM);
+            array_push($deleteMethod,$route.'/'.self::PARAM);
+        }
+
+        /** @var User $user */
+        foreach ($getMethod as $url){
+            $response = $this/*->actingAs($user)*/->get($url);
+            if ($response->getStatusCode() == 404)echo $url."\n";
+            $this->assertNotEquals($response->getStatusCode(),404);
+        }
         /** @var User $user */
-        foreach ($urls as $url){
-            $response = $this->actingAs($user)->get($url);
+        foreach ($postMethod as $url){
+            $response = $this/*->actingAs($user)*/->post($url);
+            if ($response->getStatusCode() == 404)echo $url."\n";
+            $this->assertNotEquals($response->getStatusCode(),404);
+        }
+        /** @var User $user */
+        foreach ($putMethod as $url){
+            $response = $this/*->actingAs($user)*/->put($url);
+            if ($response->getStatusCode() == 404)echo $url."\n";
+            $this->assertNotEquals($response->getStatusCode(),404);
+        }
+        /** @var User $user */
+        foreach ($deleteMethod as $url){
+            $response = $this/*->actingAs($user)*/->delete($url);
+            if ($response->getStatusCode() == 404)echo $url."\n";
             $this->assertNotEquals($response->getStatusCode(),404);
         }
-    }
-
-    public function testPost(){
-
     }
 }

+ 2 - 1
webpack.mix.js

@@ -19,7 +19,8 @@ mix.copy('resources/images','public/images');
 mix.copy('resources/icon/faviconc.ico','public/faviconc.ico');
 mix.js('resources/js/trix.js','public/js/trix.js');
 mix.copy('resources/sass/trix.css','public/css/trix.css');
-mix.copy('resources/js/queryForm/queryForm.js','public/js/queryForm/queryForm200901.js');
+mix.copy('resources/js/queryForm/queryForm.js','public/js/queryForm/queryForm200914.js');
 mix.copy('resources/js/queryForm/export.js','public/js/queryForm/export200818a.js');
 mix.js('resources/js/queryForm/header.js','public/js/queryForm/header200826b.js');
 
+mix.copy('resources/sound/','public/sound');

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