Browse Source

Merge branch 'zzd' into zjTemp

# Conflicts:
#	app/Http/Controllers/ProcessController.php
#	app/Http/Controllers/TestController.php
#	public/js/app.js
#	resources/views/order/index/delivering.blade.php
#	resources/views/weight/package/index.blade.php
dream 5 years ago
parent
commit
e118074190
49 changed files with 2472 additions and 1365 deletions
  1. 6 5
      app/Events/ClockoutEvent.php
  2. 1 1
      app/Http/Controllers/Auth/LoginController.php
  3. 98 62
      app/Http/Controllers/LaborReportController.php
  4. 85 0
      app/Http/Controllers/LaborReportStatusController.php
  5. 5 5
      app/Http/Controllers/PackageController.php
  6. 70 62
      app/Http/Controllers/PersonnelController.php
  7. 159 53
      app/Http/Controllers/ProcessController.php
  8. 0 2
      app/Http/Controllers/TestController.php
  9. 277 417
      app/Http/Controllers/UserDutyCheckController.php
  10. 35 5
      app/Http/Controllers/UserWorkgroupController.php
  11. 7 4
      app/Http/Controllers/api/thirdPart/flux/StoreController.php
  12. 11 10
      app/Http/Controllers/api/thirdPart/weight/PackageController.php
  13. 213 97
      app/LaborReport.php
  14. 17 0
      app/LaborReportStatus.php
  15. 1 1
      app/OracleDocOrderPackingSummary.php
  16. 63 44
      app/Package.php
  17. 8 0
      app/Process.php
  18. 8 0
      app/ProcessDailyParticipant.php
  19. 125 0
      app/Services/LaborReportService.php
  20. 17 0
      app/Services/UserDutyCheckService.php
  21. 2 2
      app/User.php
  22. 2 2
      app/UserDetail.php
  23. 35 1
      app/UserDutyCheck.php
  24. 14 1
      app/UserLabor.php
  25. 9 1
      app/UserWorkgroup.php
  26. 240 303
      composer.lock
  27. 3 3
      database/migrations/2020_02_10_103905_change_package_column.php
  28. 33 0
      database/migrations/2020_07_17_104613_add_labor_reports_column_user_duty_check_id.php
  29. 34 0
      database/migrations/2020_07_17_104614_add_user_labors_columns_present_status_workgroup_id.php
  30. 33 0
      database/migrations/2020_07_20_162421_create_labor_report_statuses_table.php
  31. 40 0
      database/migrations/2020_07_21_104613_change_package_columns_decimal.php
  32. 38 0
      database/migrations/2020_07_23_113747_add_authorities_personnel.php
  33. 42 0
      database/migrations/2020_07_24_155909_change_process_daily_participants_delete_column_status.php
  34. 2 2
      public/js/app.js
  35. 9 5
      public/t.php
  36. 10 0
      resources/sass/text.scss
  37. 18 3
      resources/views/maintenance/userWorkgroup/create.blade.php
  38. 22 3
      resources/views/maintenance/userWorkgroup/edit.blade.php
  39. 7 1
      resources/views/maintenance/userWorkgroup/index.blade.php
  40. 11 10
      resources/views/order/index/delivering.blade.php
  41. 2 2
      resources/views/personnel/checking-in/clockAudit.blade.php
  42. 2 1
      resources/views/personnel/checking-in/importAndExportQRCode.blade.php
  43. 1 1
      resources/views/personnel/checking-in/missionAudit.blade.php
  44. 372 180
      resources/views/personnel/laborReport/index.blade.php
  45. 2 2
      resources/views/personnel/menu.blade.php
  46. 116 14
      resources/views/process/create.blade.php
  47. 160 58
      resources/views/process/index.blade.php
  48. 0 1
      resources/views/waybill/edit.blade.php
  49. 7 1
      routes/web.php

+ 6 - 5
app/Events/ClockoutEvent.php

@@ -3,6 +3,7 @@
 namespace App\Events;
 
 use App\Http\Controllers\Controller;
+use App\LaborReport;
 use App\UserDutyCheck;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
@@ -13,16 +14,16 @@ class ClockoutEvent implements ShouldBroadcast
 {
     use  SerializesModels;
 
-    public $userDutyCheck;
+    public $laborReport;
 
     /**
      * Create a new event instance.
      *
-     * @return void
+     * @param UserDutyCheck $userDutyCheck
      */
-    public function __construct(UserDutyCheck $userDutyCheck)
+    public function __construct(LaborReport $laborReport)
     {
-        $this->userDutyCheck=$userDutyCheck;
+        $this->laborReport=$laborReport;
     }
 
     /**
@@ -32,7 +33,7 @@ class ClockoutEvent implements ShouldBroadcast
      */
     public function broadcastOn()
     {
-        return new Channel($this->userDutyCheck->userWorkgroup->token);
+        return new Channel($this->laborReport->userWorkgroup->token);
     }
 
 }

+ 1 - 1
app/Http/Controllers/Auth/LoginController.php

@@ -43,7 +43,7 @@ class LoginController extends Controller
      */
     public function __construct()
     {
-//        $this->middleware('guest')->except('logout');
+        $this->middleware('guest')->except('logout');
     }
     public function username()
     {

+ 98 - 62
app/Http/Controllers/LaborReportController.php

@@ -2,17 +2,17 @@
 
 namespace App\Http\Controllers;
 
+use App\Events\ClockoutEvent;
 use App\Events\GuardAuditEvent;
 use App\Events\TeamAuditEvent;
 use App\Exports\Export;
 use App\LaborReport;
+use App\LaborReportStatus;
 use App\UserDutyCheck;
 use App\UserWorkgroup;
 use Carbon\Carbon;
-use Doctrine\DBAL\Schema\AbstractAsset;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Maatwebsite\Excel\Facades\Excel;
 
@@ -63,14 +63,14 @@ class LaborReportController extends Controller
      */
     public function index(Request $request)
     {
-        if(!Gate::allows('人事管理')){ return redirect(url('/'));  }
+        //if(!Gate::allows('人事管理')){ return redirect(url('/'));  }
+        if(!Gate::allows('人事管理-临时工报表')){ return redirect(url('/'));  }
         $user=Auth::user();
         if (!$user)return redirect('/');
-        $userWorkgroupIds=$user->getPermittingWorkgroupIds();
+        $userWorkgroupIds=$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组'));
         $permittingWorkgroups=UserWorkgroup::whereIn('id',$userWorkgroupIds)->get();
         if($permittingWorkgroups->isEmpty())$permittingWorkgroups="[]";
         $laravelEchoPrefix = config('database.redis.options.prefix');
-        if (!Gate::allows('人事管理-临时工报表-可见全部组')){return redirect(url('/')); }
         if ($request->input()){
             $laborReports=LaborReport::orderBy('id','DESC');
             $laborReports=$this->conditionQuery($request,$laborReports);
@@ -78,46 +78,34 @@ class LaborReportController extends Controller
             $userWorkGroups=UserWorkgroup::select('id','name')->get();
             return view('personnel.laborReport.index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,'request'=>$request->input(),'permittingWorkgroups'=>$permittingWorkgroups,'laravelEchoPrefix'=>$laravelEchoPrefix,]);
         }
-        $laborReports=LaborReport::with(['user','userDutyCheck','userWorkgroup'])->whereIn('user_workgroup_id',$userWorkgroupIds)->orderBy('id','DESC')->paginate(50);
+        $laborReportsBuilder=LaborReport::with(['user','userDutyCheck','userWorkgroup'])->whereIn('user_workgroup_id',$userWorkgroupIds);
+        if(Gate::allows('人事管理-临时工报表-可见全部组')||Gate::allows('人事管理-门卫审核')){
+            $laborReportsBuilder->orWhereNull('user_workgroup_id');
+        }
+        $laborReports=$laborReportsBuilder->orderBy('id','DESC')->paginate(50);
+        $laborReports=$laborReports->sortBy('name');
+        $laborReports->values()->all();
         foreach ($laborReports as $laborReport){
-            if (!$laborReport->group_user_id){
-                //十分钟之内组长未审核实行软删除
-                $tenMinutesLater=Carbon::parse($laborReport->created_at)->subMinutes(-10)->format('Y-m-d H:i:s');
-                if (Carbon::now()->format('Y-m-d H:i:s')>$tenMinutesLater){
-                    $laborReport->delete();
-                    $this->log(__METHOD__,"组长未审核该条记录将在10分钟后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
-                }
-            }
-            //换场登入(当天有进场 退场 又进场 情况)
-            //换组登入 (当天进场后  换组 )
-            if ($laborReport->user_workgroup_id){
-                $createdAtDate=Carbon::parse($laborReport->created_at)->format('Y-m-d');
-                $userDutyCheck=UserDutyCheck::where('user_id',$laborReport->user_id)->where('type','登入')->where('checked_at','like',$createdAtDate.'%')->first();
-                $this->guardClock($laborReport,$userDutyCheck);
-            }else if (!$laborReport->user_workgroup_id){
-                $createdAtDate=Carbon::parse($laborReport->created_at)->format('Y-m-d H:i');
-                $userDutyCheck=UserDutyCheck::where('user_id',$laborReport->user_id)->where('type','登入')->where('checked_at','like',$createdAtDate.'%')->first();
-                $this->guardClock($laborReport,$userDutyCheck);
+//            if (!$laborReport->group_user_id){
+//                //三十分钟之内组长未审核实行软删除
+//                $tenMinutesLater=Carbon::parse($laborReport->created_at)->subMinutes(-30)->format('Y-m-d H:i:s');
+//                if (Carbon::now()->format('Y-m-d H:i:s')>$tenMinutesLater){
+//                    $laborReport->delete();
+//                    $this->log(__METHOD__,"组长未审核该条记录将在10分钟后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
+//                }
+//            }
+            $addOneHourCheckedAt=Carbon::parse($laborReport->userDutyCheck['checked_at'])->subHours(-1)->format('Y-m-d H:i:s');
+            if (!$laborReport->userDutyCheck['verify_user_id']&&Carbon::now()->format('Y-m-d H:i:s')>$addOneHourCheckedAt){
+                $laborReport->delete();
+                $this->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
             }
         }
         $userWorkGroups=UserWorkgroup::select('id','name')->get();
         return view('personnel/laborReport/index',['laborReports'=>$laborReports,'userWorkGroups'=>$userWorkGroups,'laravelEchoPrefix'=>$laravelEchoPrefix,'permittingWorkgroups'=>$permittingWorkgroups]);
 
     }
-    public function guardClock($laborReport,$userDutyCheck){
-        if(!$userDutyCheck)$addOneHourCheckedAt=Carbon::parse($laborReport['created_at'])->subHours(-1)->format('Y-m-d H:i:s');
-        else $addOneHourCheckedAt=Carbon::parse($userDutyCheck['checked_at'])->subHours(-1)->format('Y-m-d H:i:s');
-        if ($userDutyCheck['verify_user_id']) $laborReport->userDutyCheck=$userDutyCheck;
-        if (!$userDutyCheck['verify_user_id']&&Carbon::now()->format('Y-m-d H:i:s')<$addOneHourCheckedAt){
-            $laborReport->userDutyCheck=$userDutyCheck;
-        }
-        else if (!$userDutyCheck['verify_user_id']&&Carbon::now()->format('Y-m-d H:i:s')>$addOneHourCheckedAt){
-            $laborReport->delete();
-            $this->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
-        }
-    }
     public function export($id,Request $request){
-        if (!Gate::allows('人事管理-临时工报表-可见全部组')){return redirect(url('/')); }
+        if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
         ini_set('max_execution_time',3500);
         ini_set('memory_limit','3526M');
         if ($id==-1){
@@ -132,27 +120,30 @@ class LaborReportController extends Controller
         if (!$id)return ;
         $row=[[
             'id'=>'ID',
-            'created_at'=>'创建时间',
+            'enter_at'=>'进场时间',
+            'exit_at'=>'退场时间',
             'enter_number'=>'进厂编号',
             'user_workgroup_name'=>'小组',
             'name'=>'临时工',
             'mobile_phone'=>'电话',
             'identity_number'=>'身份证号',
             'labor_company'=>'劳务所',
-            'check_in_at'=>'打卡时间',
+            'check_in_at'=>'进组时间',
+            'check_out_at'=>'退组时间',
             'verify_at'=>'审核时间',
             'group_user_id'=>'审核人',
-            'check_out_at'=>'退场时间',
-            'relax_time'=>'晚饭时间',
+            'relax_time'=>'晚饭时间(分)',
             'online_duration'=>'在线时长',
             'working_duration'=>'本次工作时长',
+            'remark'=>'备注',
         ]];
         $list=[];
         for ($i=0; $i<count($id);$i++){
             $laborReport=LaborReport::with(['userWorkgroup','user'])->find($id[$i]);
             $w=[
                 'id'=>isset($laborReport->id)?$laborReport->id:'',
-                'created_at'=>isset($laborReport->created_at)?$laborReport->created_at:'',
+                'enter_at'=>isset($laborReport->enter_at)?$laborReport->enter_at:'',
+                'exit_at'=>isset($laborReport->exit_at)?$laborReport->exit_at:'',
                 'enter_number'=>isset($laborReport->enter_number)?$laborReport->enter_number:'',
                 'user_workgroup_name'=>isset($laborReport->userWorkgroup->name)?$laborReport->userWorkgroup->name:'',
                 'name'=>isset($laborReport->name)?$laborReport->name:'',
@@ -160,37 +151,42 @@ class LaborReportController extends Controller
                 'identity_number'=>isset($laborReport->identity_number)?$laborReport->identity_number:'',
                 'labor_company'=>isset($laborReport->labor_company)?$laborReport->labor_company:'',
                 'check_in_at'=>isset($laborReport->check_in_at)?$laborReport->check_in_at:'',
+                'check_out_at'=>isset($laborReport->check_out_at)?$laborReport->check_out_at:'',
                 'verify_at'=>isset($laborReport->verify_at)?$laborReport->verify_at:'',
                 'group_user_id'=>isset($laborReport->user->name)?$laborReport->user->name:'',
-                'check_out_at'=>isset($laborReport->check_out_at)?$laborReport->check_out_at:'',
                 'relax_time'=>isset($laborReport->relax_time)?$laborReport->relax_time:'',
                 'online_duration'=>isset($laborReport->online_duration)?$laborReport->online_duration:'',
                 'working_duration'=>isset($laborReport->working_duration)?$laborReport->working_duration:'',
+                'remark'=>isset($laborReport->remark)?$laborReport->remark:'',
             ];
             $list[$i]=$w;
         }
         return Excel::download(new Export($row,$list),date('YmdHis', time()).'-临时工报表记录单.xlsx');
     }
 
-    //门卫打卡审核`
+    //门卫打卡审核
     public function guardClockAudit(Request $request){
         if(!Gate::allows('人事管理-门卫审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
         $id=$request->input('id');
-        $type=$request->input('type');
-        $userDutyCheck=UserDutyCheck::find($id);
-        $userDutyCheck->type=$type;
+        $userDutyCheckId=$request->input('userDutyCheckId');
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$id,
+            'status'=>'已入场',
+        ]);
+        $laborReportStatus->save();
+        $this->log(__METHOD__,"门卫打卡审核创建当前临时工报表状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
+        $userDutyCheck=UserDutyCheck::find($userDutyCheckId);
         $userDutyCheck->verify_user_id=Auth::user()['id'];
         $userDutyCheck->update();
         event(new GuardAuditEvent($userDutyCheck));
-        $this->log(__METHOD__,"打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        $this->log(__METHOD__,"门卫打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
         return ["success"=>true,"data"=>$userDutyCheck->verify_user_id];
     }
     //打卡组长审核
     public function groupClockAudit(Request $request){
-        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
         $id=$request->input('id');
         $laborReport=LaborReport::find($id);
-        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
         $laborReport->group_user_id=Auth::user()['id'];
         $laborReport->verify_at=date('Y-m-d H:i:s');
         $laborReport->update();
@@ -199,55 +195,95 @@ class LaborReportController extends Controller
         event(new TeamAuditEvent($laborReport));
         return ["success"=>true,"data"=>$laborReport];
     }
+    //打卡组长审核(特定组添加备注)
+    public function addRemarkAndGroupClock(Request $request){
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
+        $id=$request->input('id');
+        $remark=$request->input('remark');
+        if(!$remark){ return ["success"=>false,"data"=>"您还未添加任何备注,请返回添加备注!"];  }
+        $laborReport=LaborReport::find($id);
+        $laborReport->group_user_id=Auth::user()['id'];
+        $laborReport->verify_at=date('Y-m-d H:i:s');
+        $laborReport->update();
+        $laborReport->setRemarkAttribute($remark,$id);
+        $laborReport->verifyPerson=Auth::user()['name'];
+        $this->log(__METHOD__,"打卡组长审核并添加相应备注".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        event(new TeamAuditEvent($laborReport));
+        return ["success"=>true,"data"=>$laborReport];
+    }
 
-    //组长点击退场
+    //组长点击退
     public function groupExport(Request $request){
-        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
         $id=$request->input('id');
         $laborReport=LaborReport::find($id);
-        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$id,
+            'status'=>'已退组',
+        ]);
+        $laborReportStatus->save();
+        $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
         $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
         $check_in_at=$laborReport->check_in_at;
         $laborReport->check_out_at=$check_out_at;
         $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
-        $laborReport->online_duration=$online_duration;
         $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
+        if ($laborReport['enter_at']){
+            $enter_at=$laborReport['enter_at'];
+            $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
+        }else{
+            $laborReport->online_duration=$online_duration;
+        }
         $laborReport->update();
         $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
-        $this->log(__METHOD__,"退场".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        event(new ClockoutEvent($laborReport));
         return ["success"=>true,"data"=>$laborReport];
     }
 
     //晚19点后组长点击退场,判断是否有晚餐情况
     public function groupExportEnsure(Request $request){
-        if(!Gate::allows('人事管理')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"];  }
         $id=$request->input('id');
         $relax_time=$request->input('relax_time');
         if(!$relax_time){ return ["success"=>false,"data"=>"未选择确切晚饭时间,请重新选择!"];  }
         $laborReport=LaborReport::find($id);
-        if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"];  }
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$id,
+            'status'=>'已退组',
+        ]);
+        $laborReportStatus->save();
+        $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
         $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
         $check_in_at=$laborReport->check_in_at;
         $laborReport->check_out_at=$check_out_at;
         $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
-        $laborReport->online_duration=$online_duration;
         if ($relax_time){
             $laborReport->relax_time=$relax_time;
             $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration)-$relax_time/60;//减去晚饭时间
         }else{
             $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
         }
+        if ($laborReport->enter_at){
+            $enter_at=$laborReport['enter_at'];
+            $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
+        }else{
+            $laborReport->online_duration=$online_duration;
+        }
         $laborReport->update();
         $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
-        $this->log(__METHOD__,"退场".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
+        event(new ClockoutEvent($laborReport));
         return ["success"=>true,"data"=>$laborReport];
     }
 
     //工作时长减午饭休息时间
     public function minusLunchTime($laborReport,$hour){
-        $date=$laborReport->check_in_at;
-        $date=Carbon::parse($date)->format('H');
-        if ((int)$date<=12){
+        $checkInTime=$laborReport->check_in_at;
+        $checkOutTime=$laborReport->check_out_at;
+        $checkOutTime=Carbon::parse($checkOutTime)->format('H');
+        $checkInTime=Carbon::parse($checkInTime)->format('H');
+        if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
             $hour=$hour-1;
         }
         return $hour;

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

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

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

@@ -226,7 +226,7 @@ class PackageController extends Controller
             'length'=>'长(CM)',
             'width'=>'宽(CM)',
             'height'=>'高(CM)',
-            'bulk'=>'体积(CM³)',
+            'bulk'=>'体积(DM³)',
             'paperBox_name'=>'纸箱',
             'status'=>'状态',
         ]];
@@ -246,10 +246,10 @@ class PackageController extends Controller
                 'logistic_name'=>isset($package->logistic_name)?$package->logistic_name:'',
                 'measuringMachine_name'=>isset($package->measuringMachine_name)?$package->measuringMachine_name:'',
                 'weight'=>isset($package->weight)?$package->weight:'',
-                'length'=>isset($package->length)?$package->length:'',
-                'width'=>isset($package->width)?$package->width:'',
-                'height'=>isset($package->height)?$package->height:'',
-                'bulk'=>isset($package->bulk)?$package->bulk:'',
+                'length'=>isset($package->length)?$package->length/10:'',
+                'width'=>isset($package->width)?$package->width/10:'',
+                'height'=>isset($package->height)?$package->height/10:'',
+                'bulk'=>isset($package->bulk)?round($package->bulk/10000)/100:'',//立方毫米到立方分米带双小数
                 'paperBox_name'=>isset($package->paperBox_name)?$package->paperBox_name:'',
                 'status'=>isset($package->status)?$package->status:''
             ];

+ 70 - 62
app/Http/Controllers/PersonnelController.php

@@ -2,14 +2,12 @@
 
 namespace App\Http\Controllers;
 
-use App\Events\ClockinEvent;
-use App\Events\ClockoutEvent;
 use App\Events\ExportEvent;
 use App\Events\ImportEvent;
 use App\Events\TeamAuditEvent;
 use App\LaborReport;
 use App\ProcessDailyParticipant;
-use App\User;
+use App\Services\LaborReportService;
 use App\UserDetail;
 use App\UserDutyCheck;
 use App\UserWorkgroup;
@@ -17,13 +15,79 @@ use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Validator;
-use Ramsey\Uuid\Uuid;
+
 
 class PersonnelController extends Controller
 {
+    function __construct()
+    {
+        app()->bind('LaborReportService',LaborReportService::class);
+    }
+    //录入补卡
+    public function storeReplenishClock(Request $request){
+        if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }
+        $errors=$this->validatorUserDutyCheck($request)->errors();
+        if (count($errors)>0)return ['success'=>false,'error'=>$errors];
+        $user_id=$request->input('user_id');
+        $checked_at=$request->input('checked_at');
+        $type=$request->input('type');
+        $userDutyCheck=new UserDutyCheck([
+            'user_id'=>$user_id,
+            'checked_at'=>$checked_at,
+            'type'=>$type,
+            'source'=>'补入',
+        ]);
+        $checkedAtDate=Carbon::parse($checked_at)->format('Y-m-d');
+        $userDutyCheckImport=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$checkedAtDate.'%')->where('type','登入')->orderBy('id','desc')->first();
+        if ($userDutyCheckImport&&$userDutyCheck->type=='登入')return ['result'=>true,'data'=>'已存在进场记录!'];
+        $userDutyCheckExport=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$checkedAtDate.'%')->where('type','登出')->orderBy('id','desc')->first();
+        if ($userDutyCheckExport&&$userDutyCheck->type=='登出')return ['result'=>true,'data'=>'已存在出场记录!'];
+        if ($type=='登出')$userDutyCheck->verify_user_id=Auth::user()['id'];
+        $userDutyCheck->save();
+        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        $errorMessage=$this->makeOrUpdateLaborReport($userDutyCheck);
+        if ($errorMessage)return $errorMessage;
+        return ['success'=>true,'data'=>$userDutyCheck];
+    }
+    //补卡创建或修改临时工报表
+    public function makeOrUpdateLaborReport($userDutyCheck){
+        $checkedAtDate=Carbon::parse($userDutyCheck->checked_at)->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$checkedAtDate.'%')->orderBy('id','desc')->first();
+        $laborReportService = app('LaborReportService');
+        if (!$laborReport&&$userDutyCheck->type=='登入'){
+            $newReport=$userDutyCheck->makeEnteringRecord();
+            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport) event(new ImportEvent($userDutyCheck));
+        }
+        else if(!$laborReport&&$userDutyCheck->type=='登出'){
+            //退场时间跨天情况
+            $yesterdayDate=Carbon::parse($userDutyCheck->checked_at.':00')->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&&!$laborReportYesterday['check_out_at']){
+                UserDutyCheck::where('user_id',$laborReportYesterday['user_id'])->where('type','登出')->orderBy('id','desc')->delete();
+                return ['result'=>true,'data'=>'该临时工还未退组,暂不可补退场卡!'];
+            }
+            if ($laborReportYesterday){
+                $exportReport=$laborReportService->exportReplenishToCreateLaborReportData($laborReportYesterday,$userDutyCheck);
+                $this->log(__METHOD__,"补退场卡修改临时工报表记录__".__FUNCTION__,json_encode([$laborReportYesterday,$userDutyCheck]));
+                if ($exportReport) event(new ExportEvent($userDutyCheck));
+            }
+        }else if($laborReport){
+            if (!$laborReport->check_out_at){
+                UserDutyCheck::where('user_id',$laborReport->user_id)->where('type','登出')->orderBy('id','desc')->delete();
+                return ['result'=>true,'data'=>'该临时工还未退组,暂不可补退场卡!'];
+            }
+            $exportReport=$laborReportService->exportReplenishToCreateLaborReportData($laborReport,$userDutyCheck);
+            $this->log(__METHOD__,"补退场卡修改临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+            if ($exportReport) event(new ExportEvent($userDutyCheck));
+        }
+    }
+
+
+
+
     //任务审核
     public function storeMissionAudit(Request $request){
         if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
@@ -120,7 +184,7 @@ class PersonnelController extends Controller
     public function missionAudit(Request $request){
         if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
         $processDailyParticipants=ProcessDailyParticipant::with(['processDaily','user_detail'=>function($builder){
-            return $builder->with(['user'=>function($builder){return $builder->with(['userWorkgroups']);},'user_labor'=>function($builder){return $builder->with(['laborCompany']);}]);
+            return $builder->with(['user'=>function($builder){return $builder->with(['userWorkgroups']);},'userLabor'=>function($builder){return $builder->with(['laborCompany']);}]);
         }])->orderBy('id','DESC');
         $start_date=$request->input('start_date');
         $end_date=$request->input('end_date');
@@ -180,62 +244,6 @@ class PersonnelController extends Controller
         return view('personnel/checking-in/clockAudit',['userDutyChecks'=>$userDutyChecks,'laravelEchoPrefix'=>$laravelEchoPrefix,'permittingWorkgroups'=>$permittingWorkgroups]);
     }
 
-    //录入补卡
-    public function storeReplenishClock(Request $request){
-        if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }
-        $errors=$this->validatorUserDutyCheck($request)->errors();
-        if (count($errors)>0)return ['success'=>false,'error'=>$errors];
-        $user_id=$request->input('user_id');
-        $checked_at=$request->input('checked_at');
-        $type=$request->input('type');
-        $userDutyCheck=new UserDutyCheck([
-            'user_id'=>$user_id,
-            'checked_at'=>$checked_at,
-            'type'=>$type,
-            'source'=>'补入',
-        ]);
-        $checkedAtDate=Carbon::parse($checked_at)->format('Y-m-d');
-        $userDutyCheckImport=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$checkedAtDate.'%')->where('type','登入')->orderBy('id','desc')->first();
-        if ($userDutyCheckImport&&$userDutyCheck->type=='登入')return ['result'=>true,'data'=>'已存在进场记录!'];
-        $userDutyCheckExport=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$checkedAtDate.'%')->where('type','登出')->orderBy('id','desc')->first();
-        if ($userDutyCheckExport&&$userDutyCheck->type=='登出')return ['result'=>true,'data'=>'已存在出场记录!'];
-        $userDutyCheck->save();
-        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
-        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$checkedAtDate.'%')->orderBy('id','desc')->first();
-//        if (!$laborReport){
-//            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-//            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-//            if ($newReport) event(new ImportEvent($userDutyCheck));
-//        }
-        if (!$laborReport&&$userDutyCheck->type=='登入'){
-            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-            if ($newReport) event(new ImportEvent($userDutyCheck));
-        }
-        else if(!$laborReport&&$userDutyCheck->type=='登出'){
-            //退场时间跨天情况
-            $yesterdayDate=Carbon::parse($userDutyCheck->checked_at.':00')->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']){
-                UserDutyCheck::where('user_id',$laborReportYesterday['user_id'])->where('type','登出')->orderBy('id','desc')->delete();
-                return ['result'=>true,'data'=>'您还未退组,暂不可退场,请联系组长!'];
-            }
-            if ($laborReportYesterday){
-                $exportReport=LaborReport::exportReplenishToCreateLaborReportData($laborReportYesterday,$userDutyCheck);
-                $this->log(__METHOD__,"退场建临时工报表记录__".__FUNCTION__,json_encode([$laborReportYesterday,$userDutyCheck]));
-                if ($exportReport) event(new ExportEvent($userDutyCheck));
-            }
-        }else if($laborReport){
-            if (!$laborReport->check_out_at){
-                UserDutyCheck::where('user_id',$laborReport->user_id)->where('type','登出')->orderBy('id','desc')->delete();
-                return ['result'=>true,'data'=>'您还未退组,暂不可退场,请联系组长!'];
-            }
-            $exportReport=LaborReport::exportReplenishToCreateLaborReportData($laborReport,$userDutyCheck);
-            $this->log(__METHOD__,"退场建临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
-            if ($exportReport) event(new ExportEvent($userDutyCheck));
-        }
-        return ['success'=>true,'data'=>$userDutyCheck];
-    }
     //搜索临时工下打卡信息
     public function checkUserLabors(Request $request){
         if(!Gate::allows('人事管理-录入补卡')){ return redirect(url('/'));  }

+ 159 - 53
app/Http/Controllers/ProcessController.php

@@ -2,7 +2,10 @@
 
 namespace App\Http\Controllers;
 
+use App\Commodity;
+use App\CommodityBarcode;
 use App\Exports\Export;
+use App\LaborReport;
 use App\Owner;
 use App\Process;
 use App\ProcessDaily;
@@ -14,6 +17,7 @@ use App\Sign;
 use App\Tutorial;
 use App\UserDetail;
 use App\UserDutyCheck;
+use App\UserLabor;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
@@ -65,6 +69,9 @@ class ProcessController extends Controller
         if ($request->input('status')){
             $processes=$processes->where('status',$request->input('status'));
         }
+        if ($request->input('code')){
+            $processes=$processes->where('code','like',$request->input('code')."%");
+        }
         if ($request->input('wms_code')){
             $processesTem=clone $processes;
             $wms_code=$request->input('wms_code');
@@ -127,21 +134,20 @@ class ProcessController extends Controller
         $id=$request->input('id');
         $processDailies=ProcessDaily::with(['processDailyParticipants','process'])->orderBy('date','DESC')
             ->where('process_id',$id)->get();
-        $process=Process::with('automaticSupplementSign')->find($id);
+        $process=Process::find($id);
         if (count($processDailies)>0){
-            if ((($process->amount)-($process->completed_amount))<=0 || $process->status=='交接完成'
-                || $process->automaticSupplementSign)$result=true;
+            if ((($process->amount)-($process->completed_amount))<=0 || $process->status=='交接完成')$result=true;
             else $result=$this->createDeficiencyData($processDailies,$today);
             if ($result){
                 $processDailies=ProcessDaily::with(['processDailyParticipants','process'])
                     ->orderBy('date','DESC')->where('process_id',$id)->get();
             }
-            $processDailies=$this->countManHour($processDailies);
+            //$processDailies=$this->countManHour($processDailies);
         }
         return $processDailies;
     }
 
-    //根据参与人查找打卡记录计算工时信息
+    /*//根据参与人查找打卡记录计算工时信息
     public function countManHour($processDailies){
         foreach ($processDailies as $processDaily){
             $date=$processDaily->date;
@@ -152,19 +158,19 @@ class ProcessController extends Controller
             }
         }
         return $processDailies;
-    }
+    }*/
 
-    //计算单参与人工时信息
+    /*//计算单参与人工时信息
     public function countParticipantManHour($processDailyParticipant,$date){
-        $user=$processDailyParticipant->user_id;
-        $userDutyCheckStart=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
+        $user_id=$processDailyParticipant->user_id;
+        $userDutyCheckStart=UserDutyCheck::select('id','checked_at')->where('user_id',$user_id)
             ->where('checked_at','like',$date.'%')->where('type','登入')->orderBy('id')->first();
-        $userDutyCheckEnd=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
+        $userDutyCheckEnd=UserDutyCheck::select('id','checked_at')->where('user_id',$user_id)
             ->where('checked_at','like',$date.'%')->where('type','登出')->orderBy('id','desc')->first();
         //跨日情况寻找下一天
         if (!$userDutyCheckEnd){
             $date=date("Y-m-d",strtotime("+1 day",strtotime($date)));
-            $userDutyCheckEnd=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
+            $userDutyCheckEnd=UserDutyCheck::select('id','checked_at')->where('user_id',$user_id)
                 ->where('checked_at','like',$date.'%')->where('type','登出')->orderBy('id','desc')->first();
         }
         if (!$userDutyCheckStart || !$userDutyCheckEnd){
@@ -182,9 +188,9 @@ class ProcessController extends Controller
         }
 
         //计件工 保留
-        /*if ($processDailyParticipant->unit_count){
-            return $processDailyParticipant;
-        }*/
+        // if ($processDailyParticipant->unit_count){
+        //   return $processDailyParticipant;
+        //}
         if ($hour&&$hour>8){
             $processDailyParticipant->billingHour=8;
             return $processDailyParticipant;
@@ -193,9 +199,9 @@ class ProcessController extends Controller
             $processDailyParticipant->billingHour=round($hour,2);
         }
         return $processDailyParticipant;
-    }
+    }*/
 
-    //打卡工时减休息时间
+/*    //打卡工时减休息时间
     private function isHour($userDutyCheckStart,$hour){
 
         $date=$userDutyCheckStart->checked_at;
@@ -204,18 +210,16 @@ class ProcessController extends Controller
             $hour=$hour-1;
         }
         return $hour;
-    }
+    }*/
     //生成二次加工单缺失时间记录及本日记录
     private function createDeficiencyData($processDailies,$today){
-        $today=Carbon::parse($today);
         $processDailiesArr=[];
         foreach ($processDailies as $processDaily){
             $processDailiesArr[$processDaily->date]=$processDaily;
         }
         $processDailyOne=$processDailies[count($processDailies)-1];
         $startDate=Carbon::parse($processDailyOne->date);
-        $diffDay=$startDate->diffInDays($today,false);
-        if ($diffDay<1)return true;
+        $diffDay=$startDate->diffInDays($today,true);
         $remain=$processDailyOne->remain;
         $processId=$processDailyOne->process_id;
         for ($i=1;$i<=$diffDay;$i++){
@@ -274,10 +278,10 @@ class ProcessController extends Controller
         if(!Gate::allows('二次加工管理-交接完成')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
         $process=Process::with('processDailies')->find($request->id);
         if (!$process)return ['success'=>false];
-        $process->update(['status'=>'交接完成']);
-        $process->createOperatorLog('交接完成');
         $result=$this->statistic($process);
         if (!$result['success'])return $result;
+        $process->update(['status'=>'交接完成']);
+        $process->createOperatorLog('交接完成');
         $processStatistic=$result['data'];
         $this->log(__METHOD__,"完成二次加工单_".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
         return ['success'=>true,'data'=>'交接完成'];
@@ -298,13 +302,13 @@ class ProcessController extends Controller
         $total_cost=0;              //合计成本
         foreach ($processDailies as $processDailyOne){
             foreach ($processDailyOne->processDailyParticipants as $processDailyParticipant){
-                $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyOne->date);
-                $duration_man_hours=$duration_man_hours+($processDailyParticipant->billingHour);
+                //$processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyOne->date);
+                $duration_man_hours += $processDailyParticipant->hour_count;
                 if ($processDailyParticipant->unit_count){
-                    $total_cost=$total_cost+(($processDailyParticipant->unit_count)*($processDailyParticipant->unit_price));
+                    $total_cost += ($processDailyParticipant->unit_count)*($processDailyParticipant->unit_price);
                     continue;
                 }
-                $total_cost=$total_cost+(($processDailyParticipant->billingHour)*($processDailyParticipant->hour_price));
+                $total_cost += ($processDailyParticipant->hour_count)*($processDailyParticipant->hour_price);
             }
         };
         $gross_profit=$revenue-$total_cost; //毛利润
@@ -385,7 +389,7 @@ class ProcessController extends Controller
         }
         return $process_id;
     }
-    public function shortProcessDailyParticipant(Request $request){
+    public function storeProcessDailyParticipant(Request $request){
         if(!Gate::allows('二次加工管理-登记工时')){ return redirect(url('/'));  }
         $errors=$this->validatorProcessDailyParticipant($request)->errors();
         if (count($errors)>0)return ['status'=>"error",'data'=>$errors];
@@ -399,6 +403,11 @@ class ProcessController extends Controller
         $unit_price=$request->input('unit_price');
         $dinner_duration=$request->input('dinner_duration');
         $remark=$request->input('remark');
+        $userLabor=UserLabor::find($user_id);
+        $processDaily=processDaily::find($daily_id);
+        if ($userLabor->isOccupiedAt($processDaily->date,$ended_at)){
+            ['status'=>"warning",'data'=>'该临时工此时间段已存在工作记录!'];
+        };
         $processDailyParticipant=new ProcessDailyParticipant([
             'process_daily_id'=>$daily_id,
             'user_id'=>$user_id,
@@ -413,10 +422,17 @@ class ProcessController extends Controller
         ]);
         $processDailyParticipant->save();
         $this->log(__METHOD__,"添加新参与人".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
+        $processDailyParticipant->load(['processDaily'=>function($query){
+            $query->with('process');
+        }]);
+        if ($processDailyParticipant->processDaily && $processDailyParticipant->processDaily->process &&
+            $processDailyParticipant->processDaily->process->status=='交接完成'){
+            $this->statistic($processDailyParticipant->processDaily->process);
+        }
         $result=[];
         $processDaily=ProcessDaily::with('process')->select('process_id','date')->find($daily_id);
-        $date=$processDaily->date;
-        $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$date);
+        //$date=$processDaily->date;
+        //$processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$date);
         if ($processDaily->process && $processDaily->process->status=="待加工"){
             $process=Process::find($processDaily->process_id);
             $process->status="加工中";
@@ -435,26 +451,41 @@ class ProcessController extends Controller
     //验证参与人
     public function verifyUserName(Request $request){
         $userName=$request->input('userName');
-        if (!$userName) return;
-        $result=$this->seekUserLabor($userName);
-        return $result;
+        if (!$userName) return ['success'=>false,'data'=>'未输入参与者!'];
+        $date = $request->date;
+        if (!$date){
+            $processDailyParticipant=ProcessDailyParticipant::query()->find($request->id);
+            $date=$processDailyParticipant->process_daily_date;
+        }
+        return $this->seekUserLabor($userName,$date);
+
     }
 
     //根据全名查询临时工
-    public function seekUserLabor($userName){
-        $userDetails=UserDetail::with('user_labor')->where('type','临时工')->where('full_name',$userName)->get();
-        if (!$userDetails)return;
+    public function seekUserLabor($userName,$date){
+        $userDetails=UserDetail::with('userLabor')->where('type','临时工')->where('full_name',$userName)->get();
+        if (!$userDetails)return ['success'=>false,'data'=>'未找到临时工信息!'];
         if (count($userDetails)==1){
-            if (!$userDetails[0]->user_labor)return;
-            return $userDetails[0];
+            if (!$userDetails[0]->userLabor)return ['success'=>false,'data'=>'该员工非临时工身份!'];
+            $laborReport=LaborReport::where('check_in_at','like',$date.'%')->where('user_id',$userDetails[0]->user_id)->first();
+            if ($laborReport){
+                $userDetails[0]->started_at=Carbon::parse($laborReport->thisRoundOnlineStartTime)->format('H:i');
+                $userDetails[0]->ended_at=Carbon::parse($laborReport->thisRoundOnlineEndTime)->format('H:i');
+            }
+            return ['success'=>true,'data'=>$userDetails[0]];
         }
         //多个同名
         foreach ($userDetails as $userDetail){
             $userDutyCheck=UserDutyCheck::select('checked_at')->where("user_id",$userDetail->user_id)->orderBy('checked_at','DESC')->first();
+            $laborReport=LaborReport::where('check_in_at','like',$date.'%')->where('user_id',$userDetail->user_id)->first();
+            if ($laborReport) {
+                $userDetail->started_at = Carbon::parse($laborReport->thisRoundOnlineStartTime)->format('H:i');
+                $userDetail->ended_at = Carbon::parse($laborReport->thisRoundOnlineEndTime)->format('H:i');
+            }
             if ($userDutyCheck)$userDetail->checked_at=$userDutyCheck->checked_at;
         }
-        if (!$userDetails)return;
-        return $userDetails;
+        if (!$userDetails)return ['success'=>false,'data'=>'未找到临时工信息!'];
+        return ['success'=>true,'data'=>$userDetails];
     }
     //修改参与人
     public function updateProcessDailyParticipant(Request $request){
@@ -463,8 +494,14 @@ class ProcessController extends Controller
         if (!$id) return ['status'=>"error",'data'=>"修改失败,ID未传递"];
         $errors=$this->validatorProcessDailyParticipant($request)->errors();
         if (count($errors)>0)return ['status'=>"error",'data'=>$errors];
-        $processDailyParticipant=ProcessDailyParticipant::with('processDaily')->find($id);
-        if (!$processDailyParticipant || ! $processDailyParticipant->processDaily) return ['status'=>"error",'data'=>"修改失败,该信息不存在"];
+        $processDailyParticipant=ProcessDailyParticipant::with(['processDaily'=>function($query){
+            $query->with('process');
+        },'userLabor'])->find($id);
+        if (!$processDailyParticipant || !$processDailyParticipant->processDaily
+            || !$processDailyParticipant->processDaily->process || !$processDailyParticipant->userLabor) return ['status'=>"error",'data'=>"修改失败,该信息不存在"];
+        if ($processDailyParticipant->userLabor->isOccupiedAt($processDailyParticipant->processDaily->date,$request->started_at)){
+            ['status'=>"error",'data'=>"该临时工此时间段已存在工作记录"];
+        }
         $processDailyParticipant->user_id=$request->input('user_id');
         $processDailyParticipant->started_at=$request->input('started_at');
         $processDailyParticipant->ended_at=$request->input('ended_at');
@@ -476,10 +513,13 @@ class ProcessController extends Controller
         $processDailyParticipant->remark=$request->input('remark');
         $processDailyParticipant->update();
         $this->log(__METHOD__,"修改参与人".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
-        $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyParticipant->processDaily->date);
+        if ($processDailyParticipant->processDaily->process->status=='交接完成'){
+            $this->statistic($processDailyParticipant->processDaily->process);
+        }
+        //$processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyParticipant->processDaily->date);
         return ['status'=>"success",'data'=>$processDailyParticipant];
     }
-    //参与人审核
+    /*//参与人审核
     public function processDailyParticipantAudit($id){
         if(!Gate::allows('人事管理-任务审核')){ return redirect(url('/'));  }
         $processDailyParticipant=ProcessDailyParticipant::select('id','status')->find($id);
@@ -488,7 +528,7 @@ class ProcessController extends Controller
         $processDailyParticipant->update();
         $this->log(__METHOD__,"登记工时参与人审核".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
         return ['success'=>true,'processDailyParticipant'=>$processDailyParticipant];
-    }
+    }*/
     //获取全部教程
     public function getTutorials($id){
         $process=Process::with('tutorials')->find($id);
@@ -618,7 +658,7 @@ class ProcessController extends Controller
         $process->createSignUnitPrice($request->unit_price);
         $sign=$process->createSign('发起修改');
         $this->log(__METHOD__,"修改二次加工单价格_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
-        return ['success'=>true,'data'=>$process->unit_price,'sign'=>$sign];
+        return ['success'=>true,'sign'=>$sign];
     }
 
     //二次加工组审核   两个方法大体相同 拆分原因是为了精确区分权限
@@ -806,15 +846,15 @@ class ProcessController extends Controller
     }
     //加工完成
     function processAccomplish(Request $request){
-       if(!Gate::allows('二次加工管理-登记工时')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
-       $process= Process::find($request->id);
-       if (!$process)return ['success'=>false];
-       $process->update([
-           'status'=>'待验收'
-       ]);
-       $process->createOperatorLog('加工完成');
+        if(!Gate::allows('二次加工管理-登记工时')){ return ['success'=>false,'data'=>'您无权进行该操作!'];  }
+        $process= Process::find($request->id);
+        if (!$process)return ['success'=>false];
+        $process->update([
+            'status'=>'待验收'
+        ]);
+        $process->createOperatorLog('加工完成');
         $this->log(__METHOD__,"标记加工完成_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
-       return ['success'=>true,'data'=>'待验收'];
+        return ['success'=>true,'data'=>'待验收'];
     }
 
     //质量验收
@@ -926,6 +966,72 @@ class ProcessController extends Controller
         ]);
     }
 
+    //删除临时工工作记录
+    public function destroyDailyParticipant($id){
+        if (ProcessDailyParticipant::destroy($id)) return ['success'=>true];
+        return ['success'=>false , 'data'=>'记录不存在!'];
+    }
+    //导入商品数据
+    public function importPasteData(Request $request){
+        $commodities = explode("\n",$request->data); //拆分行
+        $owner='';
+        $processContents=[];
+        foreach ($commodities as $commodity){
+            $commodity = array_filter(preg_split('/[\t]+/is',$commodity)); //拆分列
+            if (count($commodity)<count($request->rows)){
+                unset($commodity);
+                continue;
+            }
+            $commodityData=[];
+            $wmsCode='';
+            $barcode='';
+            $amount=0;
+            foreach ($request->rows as $index => $row){
+                if ($row == '货主'){
+                    if (isset($commodity[$index]) && $commodity[$index] && !$owner){
+                        $owner=Owner::where('code',$commodity[$index])->orWhere('name',$commodity[$index])->first();
+                        if (!$owner){
+                            $owner = Owner::create([
+                                'code' => $commodity[$index],
+                                'name' => $commodity[$index]
+                            ]);
+                        }
+                    }
+                }
+                if ($row == '单据'){
+                    $wmsCode = isset($commodity[$index]) ? $commodity[$index] : '';
+                }
+                if ($row == 'SKU'){
+                    $commodityData['sku'] = isset($commodity[$index]) ? $commodity[$index] : '';
+                }
+                if ($row == '品名'){
+                    $commodityData['name'] = isset($commodity[$index]) ? $commodity[$index] : '';
+                }
+                if ($row == '条码'){
+                    $barcode = isset($commodity[$index]) ? $commodity[$index] : '';
+                }
+                if ($row == '数量'){
+                    $amount = isset($commodity[$index]) ? $commodity[$index] : '';
+                }
+            }
+            $commodity = Commodity::query()->whereNull('owner_id')
+                ->where('sku',$commodityData['sku'])->where('name',$commodityData['name'])->first();
+            if (!$commodity)$commodity = Commodity::create($commodityData);
+            $commodityBarCode=CommodityBarcode::create([
+                'code' => $barcode,
+                'commodity_id' => $commodity->id
+            ]);
+            $processContent=['bill_type'=>'入库单','commodity_id'=>$commodity->id,'wms_code'=>$wmsCode,'amount'=>$amount,
+                'commodity_name'=>$commodity->name,'commodity_barcodes'=>[$commodityBarCode],'commodity_sku'=>$commodity->sku,
+                'lineNo'=>1,'owner_id'=>$owner->id,'owner_name'=>$owner->name,'addBtnShow'=>false,'type'=>false];
+            array_push($processContents,$processContent);
+            $processContent['type']=true;
+            array_push($processContents,$processContent);
+        }
+        return ['success'=>true,'data'=>$processContents];
+    }
+
+
     //执行
     public function export($processes){
         if(!Gate::allows('二次加工管理-查询')){ return '没有权限';  }

+ 0 - 2
app/Http/Controllers/TestController.php

@@ -288,8 +288,6 @@ class TestController extends Controller
     /*1*/
     function test()
     {/**/
-        $waybill=Waybill::selectRaw('waybills.*')->where('type','专线');
-        dd($waybill->getTable());
     }
 
 }

+ 277 - 417
app/Http/Controllers/UserDutyCheckController.php

@@ -8,6 +8,8 @@ use App\Events\ExportEvent;
 use App\Events\ImportEvent;
 use App\LaborCompany;
 use App\LaborReport;
+use App\Services\LaborReportService;
+use App\Services\UserDutyCheckService;
 use App\User;
 use App\UserDetail;
 use App\UserDutyCheck;
@@ -22,394 +24,309 @@ use Ramsey\Uuid\Uuid;
 
 class UserDutyCheckController extends Controller
 {
-
+    function __construct()
+    {
+        app()->bind('LaborReportService', LaborReportService::class);
+    }
 
     //校验二维码进入进出场打卡页面
-    public function importAndExportClock(Request $request){
-        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
-        $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
-        $qrCode_refresh=config('hr.qrCode_refresh');
-        if ($qrCode_refresh_everyday){
-            $key=$request->input('key');
+    public function importAndExportClock(Request $request)
+    {
+        $importAndExportQRCodeType = $request->input('importAndExportQRCodeType');
+        $qrCode_refresh_everyday = config('hr.qrCode_refresh_everyday');
+        $qrCode_refresh = config('hr.qrCode_refresh');
+        if ($qrCode_refresh_everyday) {
+            $key = $request->input('key');
             if (!$key) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
-            $date=md5(date('Y-m-d'));
-            if ($key!=$date) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
+            $date = md5(date('Y-m-d'));
+            if ($key != $date) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
         }
-        if ($qrCode_refresh){
-            $key=$request->input('key');
+        if ($qrCode_refresh) {
+            $key = $request->input('key');
             if (!$key) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
-            $date=date('Y-m-d H:i:s');
-            if ($key<$date) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
+            $date = date('Y-m-d H:i:s');
+            if ($key < $date) return "<h1 style='color: red;text-align:center'>当前二维码失效,请重新扫码!</h1>";
         }
-        $userLaborToken=$request->cookie('userLaborToken');
-        if ($userLaborToken && Cache::has('dutyCheckTokenStr_'.$userLaborToken)) {
-            $user_id=Cache::get('dutyCheckTokenStr_'.$userLaborToken);
-            $userDetail=UserDetail::find($user_id);
-            if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$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>";
-            if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
-            if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
-            if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-            $dateNow=Carbon::now()->format('Y-m-d');
-            $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-            //判断当前日期下临时工是否有临时工报表记录并且是进场打卡
-            if ($userDutyCheck->type=='登入'&&$importAndExportQRCodeType=='import'){
-                $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-                $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-                if ($newReport) event(new ImportEvent($userDutyCheck));
-            }
-            else if(!$laborReport&&$importAndExportQRCodeType=='export'){
-                //退场时间跨天情况
-                $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){
-                    UserDutyCheck::where('user_id',$laborReportYesterday->user_id)->where('type','登出')->orderBy('id','desc')->where('checked_at','like',Carbon::now()->format('Y-m-d H:i').'%')->delete();
-                    return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可退场,请联系组长!</h1>";
-                }
-                if ($laborReportYesterday){
-                    $exportReport=LaborReport::exportToCreateLaborReportData($laborReportYesterday,$userDutyCheck);
-                    $this->log(__METHOD__,"退场建临时工报表记录__".__FUNCTION__,json_encode([$laborReportYesterday,$userDutyCheck]));
-                    if ($exportReport) event(new ExportEvent($userDutyCheck));
-                }
-            }else if($laborReport&&$importAndExportQRCodeType=='export'){
-                if (!$laborReport->check_out_at){
-                    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::exportToCreateLaborReportData($laborReport,$userDutyCheck);
-                $this->log(__METHOD__,"退场建临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
-                if ($exportReport) event(new ExportEvent($userDutyCheck));
-            }
+        $userLaborToken = $request->cookie('userLaborToken');
+        if ($userLaborToken && Cache::has('dutyCheckTokenStr_' . $userLaborToken)) {
+            $user_id = Cache::get('dutyCheckTokenStr_' . $userLaborToken);
+            $userDetail = UserDetail::find($user_id);
+            if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/' . $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>";
+            if ($userDutyCheck && $userDutyCheck->import == true) return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+            if ($userDutyCheck && $userDutyCheck->export == true) return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
+            if (!$userDutyCheck) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+            $laborReportService = app('LaborReportService');
+            $errorMessage = $laborReportService->makeOrChangeLaborReportByUserDutyCheck($userDutyCheck, $importAndExportQRCodeType);
+            if ($errorMessage) return $errorMessage;
             $laravelEchoPrefix = config('database.redis.options.prefix');
-            return response()->view('personnel/checking-in/importAndExportSuccess',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]);
+            return response()->view('personnel/checking-in/importAndExportSuccess', ['full_name' => $userDetail->full_name, 'checked_at' => $userDutyCheck->checked_at, 'type' => $userDutyCheck->type, 'laravelEchoPrefix' => $laravelEchoPrefix]);
         }
-        return view("personnel/checking-in/importAndExportClock",compact('importAndExportQRCodeType'));
+        return view("personnel/checking-in/importAndExportClock", compact('importAndExportQRCodeType'));
     }
 
     //提交进出场打卡
-    public function storeClock(Request $request){
-        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
-        $mobile_phone=$request->input('mobile_phone');
+    public function storeClock(Request $request)
+    {
+        $importAndExportQRCodeType = $request->input('importAndExportQRCodeType');
+        $mobile_phone = $request->input('mobile_phone');
         $this->validator($request)->validate();
-        $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')->limit(10)->first();
-        $date=date('Y-m-d H:i:s');
-        $lastDate=Carbon::parse($userDutyCheckOld['checked_at']);
-        $thisDate=Carbon::parse($date);
-        $diffDate=$thisDate->diffInMinutes($lastDate);
+        $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')->limit(10)->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>7*1440){
-            return redirect('personnel/checking-in/userDutyCheck/updateUserDetail/'.$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>";
-        if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
-        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
-        if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-        $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
-        $dateNow=Carbon::now()->format('Y-m-d');
-        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-//        if (!$laborReport){
-//            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-//            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-//            if ($newReport) event(new ImportEvent($userDutyCheck));
-//        }
-        //判断当前日期下临时工是否有临时工报表记录并且是进场打卡
-        if ($userDutyCheck->type=='登入'&&$importAndExportQRCodeType=='import'){
-            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-            if ($newReport) event(new ImportEvent($userDutyCheck));
-        }
-        else if(!$laborReport&&$importAndExportQRCodeType=='export'){
-            //退场时间跨天情况
-            $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){
-                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){
-                $exportReport=LaborReport::exportToCreateLaborReportData($laborReportYesterday,$userDutyCheck);
-                $this->log(__METHOD__,"退场建临时工报表记录__".__FUNCTION__,json_encode([$laborReportYesterday,$userDutyCheck]));
-                if ($exportReport) event(new ExportEvent($userDutyCheck));
-            }
-        }else if($laborReport&&$importAndExportQRCodeType=='export'){
-            if (!$laborReport->check_out_at){
-                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::exportToCreateLaborReportData($laborReport,$userDutyCheck);
-            $this->log(__METHOD__,"退场建临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
-            if ($exportReport) event(new ExportEvent($userDutyCheck));
+        if ($diffDate > 7 * 1440) {
+            return redirect('personnel/checking-in/userDutyCheck/updateUserDetail/' . $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>";
+        if ($userDutyCheck && $userDutyCheck->import == true) return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
+        if ($userDutyCheck && $userDutyCheck->export == true) return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
+        if (!$userDutyCheck) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+        $userLaborToken = $userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
+        $laborReportService = app('LaborReportService');
+        $errorMessage = $laborReportService->makeOrChangeLaborReportByUserDutyCheck($userDutyCheck, $importAndExportQRCodeType);
+        if ($errorMessage) return $errorMessage;
         $laravelEchoPrefix = config('database.redis.options.prefix');
-        return response()->view('personnel/checking-in/importAndExportSuccess',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
-            ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
+        return response()->view('personnel/checking-in/importAndExportSuccess', ['full_name' => $userDetail->full_name, 'checked_at' => $userDutyCheck->checked_at, 'type' => $userDutyCheck->type, 'laravelEchoPrefix' => $laravelEchoPrefix])
+            ->cookie('userLaborToken', $userLaborToken, config('users.token_check_in_expire_minutes'), '/');
     }
 
     //根据用户提交进出场打卡记录
-    public  function  importAndExportDutyCheck($user_id,$importAndExportQRCodeType){
-        $dateNow=Carbon::now()->format('Y-m-d');
-        $userDutyCheckOld=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$dateNow.'%')->orderBy('id','desc')->limit(10)->first();
-        $date=date('Y-m-d H:i:s');
-        $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode([$user_id,$date]));
-        $userDutyCheck=new UserDutyCheck([
-            'user_id'=>$user_id,
-            'checked_at'=>$date,
-            'source'=>'正常',
+    public function importAndExportDutyCheck($user_id, $importAndExportQRCodeType)
+    {
+        $dateNow = Carbon::now()->format('Y-m-d');
+        $userDutyCheckOld = UserDutyCheck::where('user_id', $user_id)->where('checked_at', 'like', $dateNow . '%')->orderBy('id', 'desc')->limit(10)->first();
+        $date = date('Y-m-d H:i:s');
+        $this->log(__METHOD__, "提交打卡记录__" . __FUNCTION__, json_encode([$user_id, $date]));
+        $userDutyCheck = new UserDutyCheck([
+            'user_id' => $user_id,
+            'checked_at' => $date,
+            'source' => '正常',
         ]);
-        if (!$userDutyCheckOld){
+        if (!$userDutyCheckOld) {
             //跨天登出情况
-            if ($importAndExportQRCodeType&&$importAndExportQRCodeType=='export'){
+            if ($importAndExportQRCodeType && $importAndExportQRCodeType == 'export') {
                 //当前日期的前一天
-                $yesterday=Carbon::yesterday()->format('Y-m-d');
-                $userDutyCheckYesterday=UserDutyCheck::where('user_id',$user_id)->where('checked_at','like',$yesterday.'%')->orderBy('id','desc')->limit(10)->first();
-                if ($userDutyCheckYesterday&&$userDutyCheckYesterday->type=='登入'){
-                    $userDutyCheck->type='登出';
+                $yesterday = Carbon::yesterday()->format('Y-m-d');
+                $userDutyCheckYesterday = UserDutyCheck::where('user_id', $user_id)->where('checked_at', 'like', $yesterday . '%')->orderBy('id', 'desc')->limit(10)->first();
+                if ($userDutyCheckYesterday && $userDutyCheckYesterday->type == '登入') {
+                    $userDutyCheck->verify_user_id = $userDutyCheckYesterday->verify_user_id;
+                    $userDutyCheck->type = '登出';
                     $userDutyCheck->save();
                     return $userDutyCheck;
                 }
             }
-            if ($importAndExportQRCodeType=='export'){
-                $userDutyCheck->isNotImport=true;//还未进场,不可出场
-                return$userDutyCheck;
+            if ($importAndExportQRCodeType == 'export') {
+                $userDutyCheck->isNotImport = true;//还未进场,不可出场
+                return $userDutyCheck;
             }
-            $userDutyCheck->type="登入";
+            $userDutyCheck->type = "登入";
             $userDutyCheck->save();
             return $userDutyCheck;
         }
-        if ($importAndExportQRCodeType&&$importAndExportQRCodeType=='import'){
-            if ($userDutyCheckOld->type=='登入'){
-                $userDutyCheck->import=true;//已入场的不能再入场
+        if ($importAndExportQRCodeType && $importAndExportQRCodeType == 'import') {
+            if ($userDutyCheckOld->type == '登入') {
+                $userDutyCheck->import = true;//已入场的不能再入场
                 return $userDutyCheck;
             }
-            $userDutyCheck->type='登入';
+            $userDutyCheck->type = '登入';
         }
-        if ($importAndExportQRCodeType&&$importAndExportQRCodeType=='export'){
-            if ($userDutyCheckOld->type=='登出'){
-                $userDutyCheck->export=true;//已出场的不能再出场
+        if ($importAndExportQRCodeType && $importAndExportQRCodeType == 'export') {
+            if ($userDutyCheckOld->type == '登出') {
+                $userDutyCheck->export = true;//已出场的不能再出场
                 return $userDutyCheck;
             }
-            $userDutyCheck->type='登出';
+            $userDutyCheck->verify_user_id = $userDutyCheckOld->verify_user_id;
+            $userDutyCheck->type = '登出';
         }
         $userDutyCheck->save();
         return $userDutyCheck;
     }
 
     //去往登记资料页面
-    public function createUserDetail($mobile_phone){
-        $importAndExportQRCodeType=session("importAndExportQRCodeType");
-        $laborCompanies=LaborCompany::select('id','name')->get();
-        return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'importAndExportQRCodeType'=>$importAndExportQRCodeType,'laborCompanies'=>$laborCompanies]);
+    public function createUserDetail($mobile_phone)
+    {
+        $importAndExportQRCodeType = session("importAndExportQRCodeType");
+        $laborCompanies = LaborCompany::select('id', 'name')->get();
+        return view('personnel/checking-in/createUserDetail', ['mobile_phone' => $mobile_phone, 'importAndExportQRCodeType' => $importAndExportQRCodeType, 'laborCompanies' => $laborCompanies]);
     }
+
     //七天未打卡去往选择劳务所页面
-    public function updateUserDetail($mobile_phone){
-        $importAndExportQRCodeType=session("importAndExportQRCodeType");
-        $laborCompanies=LaborCompany::select('id','name')->get();
-        return view('personnel/checking-in/updateUserDetail',['mobile_phone'=>$mobile_phone,'importAndExportQRCodeType'=>$importAndExportQRCodeType,'laborCompanies'=>$laborCompanies]);
+    public function updateUserDetail($mobile_phone)
+    {
+        $importAndExportQRCodeType = session("importAndExportQRCodeType");
+        $laborCompanies = LaborCompany::select('id', 'name')->get();
+        return view('personnel/checking-in/updateUserDetail', ['mobile_phone' => $mobile_phone, 'importAndExportQRCodeType' => $importAndExportQRCodeType, 'laborCompanies' => $laborCompanies]);
     }
-    //提交临时工修改资料
-    public  function storeUpdateUserDetail(Request $request){
+
+    //打卡修改临时工劳务所信息并生成进场记录 AndMakeEnterRecord
+    public function storeUpdateUserDetail(Request $request)
+    {
         $this->updateValidator($request)->validate();
-        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
-        $mobile_phone=$request->input('mobile_phone');
-        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
-        if (!$userDetail)return view('exception.404',['error'=>'临时工信息不存在!']);
-        $labor_company_id=$request->input('labor_company_id');
-        $userLabor=UserLabor::where('user_id',$userDetail->user_id)->first();
+        $importAndExportQRCodeType = $request->input('importAndExportQRCodeType');
+        $mobile_phone = $request->input('mobile_phone');
+        $userDetail = UserDetail::where('mobile_phone', $mobile_phone)->first();
+        if (!$userDetail) return view('exception.404', ['error' => '临时工信息不存在!']);
+        $labor_company_id = $request->input('labor_company_id');
+        $userLabor = UserLabor::where('user_id', $userDetail->user_id)->first();
         $userLabor->update([
-            'labor_company_id'=>$labor_company_id,
+            'labor_company_id' => $labor_company_id,
         ]);
-        $this->log(__METHOD__,"更改临时工劳务所信息".__FUNCTION__,json_encode($userLabor),Auth::user()['id']);
+        $this->log(__METHOD__, "更改临时工劳务所信息" . __FUNCTION__, json_encode($userLabor), Auth::user()['id']);
         $userDutyCheck=$this->importAndExportDutyCheck($userDetail->user_id,$importAndExportQRCodeType);
-        $dateNow=Carbon::now()->format('Y-m-d');
-        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-        if (!$laborReport){
-            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-            if ($newReport){
-                event(new ImportEvent($userDutyCheck));
-            }
-        }
-        if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
-        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
-        if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-        $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
-        $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all()));
+        $laborReportService = app('LaborReportService');
+        $laborReportService->makeLaborReportByUserDutyCheck($userDutyCheck);
         $laravelEchoPrefix = config('database.redis.options.prefix');
+        $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
         return response()->view('personnel/checking-in/importAndExportSuccess',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
             ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
     }
 
-    public function updateValidator(Request $request){
-        $updateValidator=Validator::make($request->input(),[
-            'mobile_phone'=>['required','integer','digits:11'],
-            'labor_company_id'=>['filled'],
-        ],[
+    public function updateValidator(Request $request)
+    {
+        $updateValidator = Validator::make($request->input(), [
+            'mobile_phone' => ['required', 'integer', 'digits:11'],
+            'labor_company_id' => ['filled'],
+        ], [
             'filled' => ':attribute 不能为空',
-            'required'=>':attribute 为必填项',
-            'integer'=>':attribute 数字类型',
-            'digits'=>':attribute 必须是11位',
-        ],[
-            'mobile_phone'=>'手机号',
-            'labor_company_id'=>'劳务所',
+            'required' => ':attribute 为必填项',
+            'integer' => ':attribute 数字类型',
+            'digits' => ':attribute 必须是11位',
+        ], [
+            'mobile_phone' => '手机号',
+            'labor_company_id' => '劳务所',
         ]);
         return $updateValidator;
     }
 
-    //提交登记资料
-    public  function storeUserDetail(Request $request){
+    //打卡创建临时工资料并生成进场记录
+    public function storeUserDetail(Request $request)
+    {
         $this->validator($request)->validate();
-        $importAndExportQRCodeType=$request->input('importAndExportQRCodeType');
-        $mobile_phone=$request->input('mobile_phone');
-        $full_name=$request->input('full_name');
-        $identity_number=$request->input('identity_number');
-        $user=new User([
-            'name'=>$mobile_phone,
-            'password'=>Uuid::uuid1(),
+        $importAndExportQRCodeType = $request->input('importAndExportQRCodeType');
+        $mobile_phone = $request->input('mobile_phone');
+        $full_name = $request->input('full_name');
+        $identity_number = $request->input('identity_number');
+        $gender = $request->input('gender');
+        $labor_company_id = $request->input('labor_company_id');
+        $user = new User([
+            'name' => $mobile_phone,
+            'password' => Uuid::uuid1(),
         ]);
         $user->save();
-        $userDetail=new UserDetail([
-            'user_id'=>$user->id,
-            'full_name'=>$full_name,
-            'identity_number'=>$identity_number,
-            'gender'=>$request->input('gender'),
-            'mobile_phone'=>$mobile_phone,
-            'type'=>'临时工',
+        $userDetail = new UserDetail([
+            'user_id' => $user->id,
+            'full_name' => $full_name,
+            'identity_number' => $identity_number,
+            'gender' => $gender,
+            'mobile_phone' => $mobile_phone,
+            'type' => '临时工',
         ]);
         $userDetail->save();
-        $labor_company_id=$request->input('labor_company_id');
-        $userLabor=new UserLabor([
-            'user_id'=>$user->id,
-            'labor_company_id'=>$labor_company_id,
+        $userLabor = new UserLabor([
+            'user_id' => $user->id,
+            'labor_company_id' => $labor_company_id,
         ]);
         $userLabor->save();
-        $userDutyCheck=$this->importAndExportDutyCheck($user->id,$importAndExportQRCodeType);
-        $dateNow=Carbon::now()->format('Y-m-d');
-        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-        if (!$laborReport){
-            $newReport=LaborReport::importToCreateLaborReportData($userDutyCheck);
-            $this->log(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
-            if ($newReport){
-                event(new ImportEvent($userDutyCheck));
-            }
-        }
+        $laborReportService = app('LaborReportService');
+        $userDutyCheck=$this->importAndExportDutyCheck($userDetail->user_id,$importAndExportQRCodeType);
+        $laborReportService->makeLaborReportByUserDutyCheck($userDutyCheck);
         if ($userDutyCheck&&$userDutyCheck->import==true)return "<h1 style='color: darkred;text-align:center'>您已入场,不可再次入场!</h1>";
-        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!!</h1>";
+        if ($userDutyCheck&&$userDutyCheck->export==true)return "<h1 style='color: darkred;text-align:center'>您已出场,不可再次出场!</h1>";
         if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
         $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
-        $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all()));
+        Controller::logS(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($userDetail));
         $laravelEchoPrefix = config('database.redis.options.prefix');
         return response()->view('personnel/checking-in/importAndExportSuccess',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
             ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
+
     }
-    public function validator(Request $request){
-        $validator=Validator::make($request->input(),[
-            'full_name'=>['filled'],
-            'gender'=>['filled'],
-            'mobile_phone'=>['required','integer','digits:11'],
-            'identity_number' => ['filled','identity_cards','unique:user_details,identity_number'],
-            'labor_company_id'=>['filled'],
-        ],[
-            'unique'=>':attribute 已经存在,不能重复!',
+
+    public function validator(Request $request)
+    {
+        $validator = Validator::make($request->input(), [
+            'full_name' => ['filled'],
+            'gender' => ['filled'],
+            'mobile_phone' => ['required', 'integer', 'digits:11'],
+            'identity_number' => ['filled', 'identity_cards', 'unique:user_details,identity_number'],
+            'labor_company_id' => ['filled'],
+        ], [
+            'unique' => ':attribute 已经存在,不能重复!',
             'filled' => ':attribute 不能为空',
-            'required'=>':attribute 为必填项',
-            'integer'=>':attribute 数字类型',
-            'digits'=>':attribute 必须是11位',
-        ],[
-            'full_name'=>'姓名',
-            'gender'=>'性别',
-            'mobile_phone'=>'手机号',
+            'required' => ':attribute 为必填项',
+            'integer' => ':attribute 数字类型',
+            'digits' => ':attribute 必须是11位',
+        ], [
+            'full_name' => '姓名',
+            'gender' => '性别',
+            'mobile_phone' => '手机号',
             'identity_number' => '身份证号',
-            'labor_company_id'=>'劳务所',
+            'labor_company_id' => '劳务所',
         ]);
         return $validator;
     }
 
-    //校验工作组二维码进入打卡页面
-    public function clock(Request $request){
-        $userWorkgroupID=$request->input('userWorkgroupID');
-        $userLaborToken=$request->cookie('userLaborToken');
-        if ($userLaborToken && Cache::has('dutyCheckTokenStr_'.$userLaborToken)) {
-            $user_id=Cache::get('dutyCheckTokenStr_'.$userLaborToken);
-            $userDetail=UserDetail::find($user_id);
-            $dateNow=Carbon::now()->format('Y-m-d');
-            $group_name=UserWorkgroup::where('id',$userWorkgroupID)->value('name');
-            $laravelEchoPrefix = config('database.redis.options.prefix');
-            $userDutyCheck=UserDutyCheck::where('user_id',$userDetail->user_id)->where('checked_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-            if(!$userDutyCheck->verify_user_id)return "<h1 style='color: red;text-align:center'>进场门卫还未审核,暂无法进组!</h1>";
-            if($userDutyCheck->type=='登出')return "<h1 style='color: red;text-align:center'>进场是否未打卡?如若未打,请先返回打进场卡!</h1>";
-            //判断是否是第一次进组
-            $laborReport=LaborReport::where('user_id',$user_id)->where('user_workgroup_id',null)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-            if ($laborReport){
-                $newLaborReport=LaborReport::intoGroupAndUpdateLaborReportData($laborReport,$userWorkgroupID);
-                $this->log(__METHOD__,"当日首次进组更新临时工报表记录__".__FUNCTION__,json_encode($request->all()));
-                if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-                if ($newLaborReport){
-                    event(new ClockinEvent($newLaborReport));
-                }
-                return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix]);
-            }else{
-                //换组判断上一条临时工报表信息是否退组
-                $laborReportNow=LaborReport::where('user_id',$user_id)->whereNotNull('group_user_id')->orderBy('id','desc')->first();
-                if ($laborReportNow&&!$laborReportNow['check_out_at'])return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可换组,请联系之前组长!</h1>";
-                $laborReport=LaborReport::where('user_id',$user_id)->where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-                //此处表示临时工当日换组操作
-                if (!$laborReport){
-                    $newLaborReport=LaborReport::changeGroupAndCreateLaborReportData($user_id,$userWorkgroupID);
-                    $this->log(__METHOD__,"当日临时工换组新建临时工报表记录__".__FUNCTION__,json_encode([$user_id,$userWorkgroupID]));
-                    if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-                    if ($newLaborReport){
-                        event(new ClockinEvent($newLaborReport));
-                    }
-                    return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix]);
-                }else{
-                    return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
-                }
-            }
+    //扫工作组二维码
+    public function clock(Request $request)
+    {
+        $userWorkgroupID = $request->input('userWorkgroupID');
+        $userLaborToken = $request->cookie('userLaborToken');
+        if ($userLaborToken && Cache::has('dutyCheckTokenStr_' . $userLaborToken)) {
+            $user_id = Cache::get('dutyCheckTokenStr_' . $userLaborToken);
+            $dateNow = Carbon::now()->format('Y-m-d');
+            $userDutyCheck = UserDutyCheck::where('user_id', $user_id)->where('checked_at', 'like', $dateNow. '%')->orderBy('id', 'desc')->first();
+            if (!$userDutyCheck->verify_user_id) return "<h1 style='color: red;text-align:center'>进场门卫还未审核,暂无法进组!</h1>";
+            if ($userDutyCheck->type == '登出') return "<h1 style='color: red;text-align:center'>进场是否未打卡?如若未打,请先返回打进场卡!</h1>";
+            $html=$this->updateLaborReport($user_id,$userWorkgroupID);
+            if ($html)return $html;
         }
-        return view("personnel/checking-in/clock",compact('userWorkgroupID'));
+        //return view("personnel/checking-in/clock", compact('userWorkgroupID'));
     }
-    //进组提交打卡
-    public function importGroupClock(Request $request){
-        $mobile_phone=$request->input('mobile_phone');
-        $userWorkgroupID=$request->input('userWorkgroupID');
-        $this->validator($request)->validate();
-        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
-        if (Cache::has('dutyCheckTokenUser_'.$userDetail->user_id))return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
-        $dateNow=Carbon::now()->format('Y-m-d');
-        $group_name=UserWorkgroup::where('id',$userWorkgroupID)->value('name');
+    public function updateLaborReport($user_id,$userWorkgroupID){
+        $userDetail = UserDetail::find($user_id);
+        $group_name = UserWorkgroup::where('id', $userWorkgroupID)->value('name');
         $laravelEchoPrefix = config('database.redis.options.prefix');
-        $userDutyCheck=UserDutyCheck::where('user_id',$userDetail->user_id)->where('checked_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-        if(!$userDutyCheck->verify_user_id)return "<h1 style='color: red;text-align:center'>进场门卫还未审核,暂无法进组!</h1>";
-        if($userDutyCheck->type=='登出')return "<h1 style='color: red;text-align:center'>进场是否未打卡?如若未打,请先返回打进场卡!</h1>";
-        $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
+        $laborReportService = app('LaborReportService');
         //判断是否是第一次进组
-        $laborReport=LaborReport::where('user_id',$userDetail->user_id)->where('user_workgroup_id',null)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
-        if ($laborReport){
-            $newLaborReport=LaborReport::intoGroupAndUpdateLaborReportData($laborReport,$userWorkgroupID);
-            $this->log(__METHOD__,"当日首次进组更新临时工报表记录__".__FUNCTION__,json_encode($request->all()));
-            if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-            if ($newLaborReport){
+        $laborReport = LaborReport::where('user_id', $user_id)->where('user_workgroup_id', null)->where('created_at', 'like',Carbon::now()->format('Y-m-d'). '%')->orderBy('id', 'desc')->first();
+        if ($laborReport) {
+            $newLaborReport = $laborReportService->enterGroupAndUpdateLaborReport($laborReport, $userWorkgroupID);
+            $this->log(__METHOD__, "当日首次进组更新临时工报表记录__" . __FUNCTION__, json_encode($userWorkgroupID));
+            if (!$newLaborReport) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+            if ($newLaborReport) {
                 event(new ClockinEvent($newLaborReport));
             }
-            return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix]);
-        }else{
-            $laborReport=LaborReport::where('user_id',$userDetail->user_id)->where('user_workgroup_id',$userWorkgroupID)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+            return response()->view('personnel/checking-in/success', ['group_name' => $group_name ?? '', 'full_name' => $userDetail->full_name, 'check_in_at' => $newLaborReport->check_in_at, 'laravelEchoPrefix' => $laravelEchoPrefix]);
+        } else {
+            //换组判断上一条临时工报表信息是否退组
+            $laborReportNow = LaborReport::where('user_id', $user_id)->whereNotNull('group_user_id')->orderBy('id', 'desc')->first();
+            if ($laborReportNow && !$laborReportNow['check_out_at']) return "<h1 style='color: darkred;text-align:center'>您还未退组,暂不可换组,请联系之前组长!</h1>";
+            $laborReport = LaborReport::where('user_id', $user_id)->where('user_workgroup_id', $userWorkgroupID)->where('created_at', 'like', Carbon::now()->format('Y-m-d'). '%')->orderBy('id', 'desc')->first();
             //此处表示临时工当日换组操作
-            if (!$laborReport){
-                $newLaborReport=LaborReport::changeGroupAndCreateLaborReportData($userDetail->user_id,$userWorkgroupID);
-                $this->log(__METHOD__,"当日临时工换组新建临时工报表记录__".__FUNCTION__,json_encode([$userDetail->user_id,$userWorkgroupID]));
-                if (!$newLaborReport)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-                if ($newLaborReport){
+            if (!$laborReport) {
+                $newLaborReport = $laborReportService->changeGroupAndMakeLaborReport($user_id, $userWorkgroupID);
+                $this->log(__METHOD__, "当日临时工换组新建临时工报表记录__" . __FUNCTION__, json_encode([$user_id, $userWorkgroupID]));
+                if (!$newLaborReport) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+                if ($newLaborReport) {
                     event(new ClockinEvent($newLaborReport));
                 }
-                return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'check_in_at'=>$newLaborReport->check_in_at,'laravelEchoPrefix'=>$laravelEchoPrefix])
-                    ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
-            }else{
+                return response()->view('personnel/checking-in/success', ['group_name' => $group_name ?? '', 'full_name' => $userDetail->full_name, 'check_in_at' => $newLaborReport->check_in_at, 'laravelEchoPrefix' => $laravelEchoPrefix]);
+            } else if ($laborReport['enter_number'] != $laborReportNow['enter_number']) {
+                $newLaborReport = $laborReportService->changeGroupAndMakeLaborReport($user_id, $userWorkgroupID);
+                $this->log(__METHOD__, "当日临时工换组新建临时工报表记录__" . __FUNCTION__, json_encode([$user_id, $userWorkgroupID]));
+                if (!$newLaborReport) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+                if ($newLaborReport) {
+                    event(new ClockinEvent($newLaborReport));
+                }
+                return response()->view('personnel/checking-in/success', ['group_name' => $group_name ?? '', 'full_name' => $userDetail->full_name, 'check_in_at' => $newLaborReport->check_in_at, 'laravelEchoPrefix' => $laravelEchoPrefix]);
+            } else {
                 return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
             }
         }
@@ -417,123 +334,66 @@ class UserDutyCheckController extends Controller
 
 
 
-//    //根据用户提交打卡记录
-//    public function dutyCheck($user_id,$userWorkgroupID){
-//        $userDutyCheckOld=UserDutyCheck::where('user_id',$user_id)->orderBy('checked_at','DESC')->limit(10)->first();
-//        if ($userWorkgroupID!=$userDutyCheckOld['workgroup_id']){
-//            $user=User::find($user_id);
-//            $user->userWorkgroups()->sync([$userWorkgroupID]);
-//        }
-//        $date=date('Y-m-d H:i:s');
-//        $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode([$user_id,$userWorkgroupID,$date]));
-//        $userDutyCheck=new UserDutyCheck([
-//            'user_id'=>$user_id,
-//            'checked_at'=>$date,
-//            'source'=>'正常',
-//            'verify_user_id'=>'',
-//            'workgroup_id'=>$userWorkgroupID,
-//        ]);
-//        if (!$userDutyCheckOld){
-//            $userDutyCheck->type="登入";
-//            $userDutyCheck->save();
-//            return $userDutyCheck;
-//        }
-//        $lastDate=Carbon::parse($userDutyCheckOld->checked_at);
-//        $thisDate=Carbon::parse($date);
-//        $diffDate=$thisDate->diffInMinutes($lastDate);
-////        if ($userDutyCheckOld->type=="登出"&&$diffDate<7*1440){
-////            $userDutyCheck->type="登入";
-////            $userDutyCheck->verify_user_id=0;
-////            $userDutyCheck->save();
-////            return $userDutyCheck;
-////        }
-//        if($diffDate<=5){
-//            $userDutyCheck->error=true;//重复打卡
-//            if($userWorkgroupID!=$userDutyCheckOld['workgroup_id']&&$userDutyCheckOld->type=='登入'){
-//                if ($userDutyCheck->error){
-//                    $userDutyCheck->error=false;
-//                }
-//                $userDutyCheckOld->checked_at=$date;
-//                $userDutyCheckOld->verify_user_id=null;
-//                $userDutyCheckOld->workgroup_id=$userWorkgroupID;
-//                $userDutyCheckOld->group_user_id=null;
-//                $userDutyCheckOld->update();
-//                return $userDutyCheckOld;
-//            }
-//            return $userDutyCheck;
-//        }
-//        if ($userWorkgroupID!=$userDutyCheckOld['workgroup_id']&&$userDutyCheckOld->type=="登入"&&$userDutyCheck->type="登出"){
-//            if ($diffDate>=1380){
-//                $userDutyCheck->type="登入";
-//            }else{
-//                $userDutyCheck->workgroup_id=$userDutyCheckOld['workgroup_id'];
-//            }
-//
-//        }
-//        if ($userDutyCheckOld->type=="登入"){
-//            switch ($diffDate){
-//                case $diffDate<=20:
-//                    $userDutyCheck->type="登入";
-//                    $userDutyCheck->workgroup_id=$userDutyCheckOld->workgroup_id;
-//                    break;
-//                case $diffDate>=1380:
-//                    $userDutyCheck->type="登入";
-//                    break;
-//                default:
-//                    $userDutyCheck->type="登出";
-//                    $userDutyCheck->verify_user_id=0;
-//            }
-//        }
-//        if ($userDutyCheckOld->type=="登出"){
-//            switch ($diffDate){
-//                case $diffDate<=20:
-//                    $userDutyCheck->type="登出";
-//                    $userDutyCheck->verify_user_id=0;
-//                    $userDutyCheck->workgroup_id=$userDutyCheckOld->workgroup_id;
-//                    break;
-//                default:
-//                    $userDutyCheck->type="登入";
-//            }
-//        }
-//        $userDutyCheck->save();
-//        return $userDutyCheck;
-//    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     //进组提交打卡
-//    public function importGroupClock(Request $request){
-//        $mobile_phone=$request->input('mobile_phone');
-//        $userWorkgroupID=$request->input('userWorkgroupID');
+//    public function importGroupClock(Request $request)
+//    {
+//        $mobile_phone = $request->input('mobile_phone');
+//        $userWorkgroupID = $request->input('userWorkgroupID');
+//        $laborReportService = app('LaborReportService');
 //        $this->validator($request)->validate();
-//        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
-//        if (!$userDetail)   return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
-//        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')->limit(10)->first();
-//        $date=date('Y-m-d H:i:s');
-//        $lastDate=Carbon::parse($userDutyCheckOld['checked_at']);
-//        $thisDate=Carbon::parse($date);
-//        $diffDate=$thisDate->diffInMinutes($lastDate);
-//        $dateNow=Carbon::now()->format('Y-m-d');
-//        //七天未登录从新选择劳务所
-//        if ($diffDate>7*1440){
-//            return redirect('personnel/checking-in/userDutyCheck/updateUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID);
-//        }
-//        $userDutyCheck=$this->dutyCheck($userDetail->user_id,$userWorkgroupID);
-//        if ($userDutyCheck&&$userDutyCheck->type=='登入'){
-//            event(new ClockinEvent($userDutyCheck));
-//        }else if ($userDutyCheck&&$userDutyCheck->type=='登出'){
-//            event(new ClockoutEvent($userDutyCheck));
-//        }
-//        //正常情况
-//        $laborReport=LaborReport::where('user_workgroup_id',$userDutyCheck->workgroup_id)->where('user_id',$userDutyCheck->user_id)->orderBy('id','desc')->first();
-//        if ($laborReport&&$userDutyCheck->type=='登出'){
-//            LaborReport::updateLaborReportData($laborReport,$userDutyCheck);
-//            $this->log(__METHOD__,"更新临时工报表记录__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
-//        }
-//        if ($userDutyCheck&&$userDutyCheck->error==true)return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
-//        if (!$userDutyCheck)return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
-//        $userLaborToken=$userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
-//        $group_name=$userDutyCheck->userWorkgroup['name'];
+//        $userDetail = UserDetail::where('mobile_phone', $mobile_phone)->first();
+//        if (Cache::has('dutyCheckTokenUser_' . $userDetail->user_id)) return "<h1 style='color: red;text-align:center'>请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!</h1>";
+//        $dateNow = Carbon::now()->format('Y-m-d');
+//        $group_name = UserWorkgroup::where('id', $userWorkgroupID)->value('name');
 //        $laravelEchoPrefix = config('database.redis.options.prefix');
-//        return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix])
-//            ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/');
+//        $userDutyCheck = UserDutyCheck::where('user_id', $userDetail->user_id)->where('checked_at', 'like', $dateNow . '%')->orderBy('id', 'desc')->first();
+//        if (!$userDutyCheck->verify_user_id) return "<h1 style='color: red;text-align:center'>进场门卫还未审核,暂无法进组!</h1>";
+//        if ($userDutyCheck->type == '登出') return "<h1 style='color: red;text-align:center'>进场是否未打卡?如若未打,请先返回打进场卡!</h1>";
+//        $userLaborToken = $userDetail->getDutyCheckToken(config('users.token_check_in_expire_minutes'));
+//        //判断是否是第一次进组
+//        $laborReport = LaborReport::where('user_id', $userDetail->user_id)->where('user_workgroup_id', null)->where('created_at', 'like', $dateNow . '%')->orderBy('id', 'desc')->first();
+//        if ($laborReport) {
+//            $newLaborReport = $laborReportService->enterGroupAndUpdateLaborReport($laborReport, $userWorkgroupID);
+//            $this->log(__METHOD__, "当日首次进组更新临时工报表记录__" . __FUNCTION__, json_encode($request->all()));
+//            if (!$newLaborReport) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+//            if ($newLaborReport) {
+//                event(new ClockinEvent($newLaborReport));
+//            }
+//            return response()->view('personnel/checking-in/success', ['group_name' => $group_name ?? '', 'full_name' => $userDetail->full_name, 'check_in_at' => $newLaborReport->check_in_at, 'laravelEchoPrefix' => $laravelEchoPrefix]);
+//        } else {
+//            $laborReport = LaborReport::where('user_id', $userDetail->user_id)->where('user_workgroup_id', $userWorkgroupID)->where('created_at', 'like', $dateNow . '%')->orderBy('id', 'desc')->first();
+//            //此处表示临时工当日换组操作
+//            if (!$laborReport) {
+//                $newLaborReport = $laborReportService->changeGroupAndMakeLaborReport($userDetail->user_id, $userWorkgroupID);
+//                $this->log(__METHOD__, "当日临时工换组新建临时工报表记录__" . __FUNCTION__, json_encode([$userDetail->user_id, $userWorkgroupID]));
+//                if (!$newLaborReport) return "<h1 style='color: red;text-align:center'>打卡异常,请联系相关人员!</h1>";
+//                if ($newLaborReport) {
+//                    event(new ClockinEvent($newLaborReport));
+//                }
+//                return response()->view('personnel/checking-in/success', ['group_name' => $group_name ?? '', 'full_name' => $userDetail->full_name, 'check_in_at' => $newLaborReport->check_in_at, 'laravelEchoPrefix' => $laravelEchoPrefix])
+//                ->cookie('userLaborToken', $userLaborToken, config('users.token_check_in_expire_minutes'), '/');
+//            } else {
+//                return "<h1 style='color: darkred;text-align:center'>重复打卡!</h1>";
+//            }
+//        }
 //    }
+
+
 }

+ 35 - 5
app/Http/Controllers/UserWorkgroupController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Authority;
+use App\Sign;
 use App\UserWorkgroup;
 use App\Warehouse;
 use Illuminate\Http\Request;
@@ -15,7 +16,7 @@ class UserWorkgroupController extends Controller
     public function index()
     {
         if(!Gate::allows('工作组-查询')){ return redirect(url('/'));  }
-        $UserWorkgroups=UserWorkgroup::with('wareHouse')->orderBy('id',"DESC")->paginate(50);
+        $UserWorkgroups=UserWorkgroup::with(['wareHouse','signs'])->orderBy('id',"DESC")->paginate(50);
         return view('maintenance.userWorkgroup.index',['userWorkgroups'=>$UserWorkgroups]);
     }
 
@@ -36,6 +37,14 @@ class UserWorkgroupController extends Controller
         $warehouseId=$request->input('warehouse_id');
         $UserWorkgroup['warehouse_id']=$warehouseId;
         $UserWorkgroup->save();
+        $remark=$request->input('remark');
+        $sign=new Sign([
+            'signable_type'=>'user_workgroups',
+            'signable_id'=>$UserWorkgroup['id'],
+            'field'=>'is_need_remark',
+            'mark'=>$remark,
+        ]);
+        $sign->save();
         $this->storeAuthority($UserWorkgroup['name'],$UserWorkgroup->id);
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return redirect('maintenance/userWorkgroup')->with('successTip','新工作组“'.$request->input('name').'”添加成功');
@@ -53,7 +62,7 @@ class UserWorkgroupController extends Controller
     public function edit($id)
     {
         if(!Gate::allows('工作组-编辑')){ return redirect(url('/'));  }
-        $userWorkgroup=UserWorkgroup::find($id);
+        $userWorkgroup=UserWorkgroup::with('signs')->find($id);
         if (!$userWorkgroup)return view('exception.404',['error'=>'工作组不存在!']);
         $warehouses=Warehouse::select('id','name')->get();
         return view('maintenance.userWorkgroup.edit',['userWorkgroup'=>$userWorkgroup,'warehouses'=>$warehouses]);
@@ -64,7 +73,24 @@ class UserWorkgroupController extends Controller
         if(!Gate::allows('工作组-编辑')){ return redirect(url('/'));  }
         $this->validatorUserWorkgroup($request,$id)->validate();
         $data=$request->input();
-        $userWorkgroup=UserWorkgroup::find($id);
+        $userWorkgroup=UserWorkgroup::with('signs')->find($id);
+        $sign=$userWorkgroup->signs;
+        $mark=$request->input('remark');
+        if ($sign){
+            $sign->mark=$mark;
+            $sign->update();
+            $this->log(__METHOD__,'工作组是否需要录入备注'.__FUNCTION__,json_encode($sign),Auth::user()['id']);
+        }
+        if(!$sign){
+            $newSign=new Sign([
+                'signable_type'=>'user_workgroups',
+                'signable_id'=>$id,
+                'field'=>'is_need_remark',
+                'mark'=>$mark,
+            ]);
+            $newSign->save();
+            $this->log(__METHOD__,'工作组是否需要录入备注'.__FUNCTION__,json_encode($sign),Auth::user()['id']);
+        }
         $userWorkgroup['warehouse_id']= $data['warehouse_id'];
         if ($data['name']!=$userWorkgroup->name){
             $authority=Authority::where("name",$userWorkgroup->name)->first();
@@ -89,17 +115,20 @@ class UserWorkgroupController extends Controller
     public function destroy($id)
     {
         if(!Gate::allows('工作组-删除')){ return redirect(url('/'));  }
-        $UserWorkgroup=UserWorkgroup::find($id);
+        $UserWorkgroup=UserWorkgroup::with('signs')->find($id);
         $this->log(__METHOD__,__FUNCTION__,json_encode($UserWorkgroup),Auth::user()['id']);
+        $sign=$UserWorkgroup->signs;
+        $sign->delete();
         $result=$UserWorkgroup->delete();
         return ['success'=>$result];
     }
 
-    protected function validatorUserWorkgroup(Request $request,$id){
+    public function validatorUserWorkgroup(Request $request,$id){
         if ($id){$name=$id;}
         $validator=Validator::make($request->input(),[
             'name'=>['required','max:10',isset($name)?"unique:user_workgroups,name,$name":'unique:user_workgroups,name'],
             'warehouse_id'=>['required'],
+            'remark'=>['required'],
         ],[
             'required'=>':attribute 为必填项',
             'max'=>':attribute 过长',
@@ -107,6 +136,7 @@ class UserWorkgroupController extends Controller
         ],[
             'name'=>'工作组名称',
             'warehouse_id'=>'仓库名称',
+            'remark'=>'是否录入备注',
         ]);
         return $validator;
     }

+ 7 - 4
app/Http/Controllers/api/thirdPart/flux/StoreController.php

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
 use App\Store;
 use App\WMSReflectReceive;
 use App\WMSReflectReceiveSku;
+use Illuminate\Support\Facades\Auth;
 use Zttp\Zttp;
 
 class StoreController extends Controller
@@ -21,6 +22,7 @@ class StoreController extends Controller
     {
         $METHOD=__METHOD__;
         $FUNCTION=__FUNCTION__;
+        Controller::logS(__METHOD__, __FUNCTION__, '快递入库进入WMS接口:' . $store['asn_code']);
         $wmsReceiveds=WMSReflectReceive::where('ASNNO',$store['asn_code'])->get();
         if($wmsReceiveds->isEmpty()){
             (new Controller())->log(__METHOD__,'error_'.__FUNCTION__,'没有本地WMS入库单');
@@ -89,6 +91,7 @@ class StoreController extends Controller
 
             $sendingJson = json_decode($json,true);
             $url=url(config('api.flux.receive.new'));
+//            (new Controller())->log($METHOD,$FUNCTION,$store['asn_code'].'||' .json_encode($sendingJson));
             $response = Zttp::post($url, $sendingJson);
             $noIssues=true;
             $json = $response->json();
@@ -98,7 +101,7 @@ class StoreController extends Controller
             }
             if($json&&isset($json['Response'])){
                 if($json['Response']['return']['returnFlag']=='2'){
-                    (new Controller())->log($METHOD,'error_'.$FUNCTION,$response->body());
+                    (new Controller())->log($METHOD,'error_'.$FUNCTION,$store['asn_code'].'||' . $response->body());
                     return true;
                 }
 //                if(isset($json['Response']['return']['returnDesc'])&&strpos($json['Response']['return']['returnDesc'],'唯一约束')!==false){
@@ -106,18 +109,18 @@ class StoreController extends Controller
 //                    return true;
 //                }
                 if(isset($json['Response']['return']['errordescr'])&&strpos($json['Response']['return']['errordescr'],'已完成')!==false){
-                    (new Controller())->log($METHOD,'error_'.$FUNCTION,$response->body());
+                    (new Controller())->log($METHOD,'error_'.$FUNCTION,$store['asn_code'].'||' . $response->body());
                     return true;
                 }
             }
             if($noIssues&&$json['Response']['return']['returnFlag']=='1'){
                 $wmsReceived['is_uploaded']=1;
                 $wmsReceived->save();
-                (new Controller())->log($METHOD, 'success_' . $FUNCTION, $response->body());
+                (new Controller())->log($METHOD, 'success_' .$FUNCTION,  $store['asn_code'].'||' .$response->body());
                 return true;
             }else {
                 $success = false;
-                (new Controller())->log($METHOD, 'error_' . $FUNCTION, $response->body());
+                (new Controller())->log($METHOD, 'error_'.$FUNCTION, $store['asn_code'].'||' . $response->body());
             }
         });
 

+ 11 - 10
app/Http/Controllers/api/thirdPart/weight/PackageController.php

@@ -185,14 +185,15 @@ class PackageController extends Controller
         rsort($edges);
         $fluxController=new \App\Http\Controllers\Api\thirdPart\flux\PackageController();
         if ($package){
-            $package->fetchPaperBox($edges[0],$edges[1],$edges[2]);
-            $package['bulk']=$edges[0]*$edges[1]*$edges[2];
             $package['measuring_machine_id']=$measuringMachine->id;
             $package['weight']=$request['weight'];
             $package['length']=$edges[0];
             $package['width']=$edges[1];
             $package['height']=$edges[2];
             $package['weighed_at']=$reqDate;
+            $package->fetchAllFromOracle();
+            $package->fetchPaperBox();
+            $package['bulk']=$edges[0]*$edges[1]*$edges[2];
             if ($package->isActivityBatch()){//处理活动波次
                 $this->log(__METHOD__,__FUNCTION__,"依波次号同步所有包裹:".json_encode($package),null);
                 $package->unifyThisMeasureUnderSameBatch();
@@ -230,7 +231,14 @@ class PackageController extends Controller
                 'status'=>"无",
             ]);
             $package->fetchAllFromOracle();
-            $package->fetchPaperBox($edges[0], $edges[1], $edges[2]);
+            $package->fetchPaperBox();
+            try{
+                $package->save();
+            }catch (\Exception $e){
+                $response=["msg"=>"保存时发生错误(未下发)!","code"=>500,"data"=>null];
+                $this->log(__METHOD__,'weightApi(ERROR)'.__FUNCTION__,json_encode($request).'||'.json_encode($response).'||'.json_encode($e),null);
+                return json_encode($response,JSON_UNESCAPED_UNICODE);
+            }
             $result=$fluxController->accomplishToWMS($package);
             if(!$package['batch_number'])
                 FetchPackageFromOracle::dispatch($package)->delay(Carbon::now()->addMinutes(1440));
@@ -239,13 +247,6 @@ class PackageController extends Controller
                 $response=["msg"=>"写入WMS失败!","code"=>500,"data"=>null];
                 return json_encode($response,JSON_UNESCAPED_UNICODE);
             }
-            try{
-                $package->save();
-            }catch (\Exception $e){
-                $response=["msg"=>"保存时发生错误(未下发)!","code"=>500,"data"=>null];
-                $this->log(__METHOD__,'weightApi(ERROR)'.__FUNCTION__,json_encode($request).'||'.json_encode($response),null);
-                return json_encode($response,JSON_UNESCAPED_UNICODE);
-            }
         }
         if(!empty($package->order_code))
             Waybill::setWeightByOrderCode($package->order_code,$package->weight);

+ 213 - 97
app/LaborReport.php

@@ -3,13 +3,12 @@
 namespace App;
 
 use Carbon\Carbon;
-use DemeterChain\C;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Date;
-use Ramsey\Uuid\Uuid;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Collection;
+use function Matrix\add;
 
 class LaborReport extends Model
 {
@@ -18,9 +17,16 @@ class LaborReport extends Model
     protected $fillable=[
         'id','enter_number','user_workgroup_id','user_id','name','mobile_phone','identity_number','labor_company',
         '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','is_exportReplenish'
+        'is_exportGroup','is_export', 'exit_at','enter_at','sequence', 'amountOfJoined','remark','thisRecordOnlineTime','thisRecordWorkingTime',
+        'totalOnlineTime',
+    ];
+    protected $tempFields = [
+        'temEnteringRecord',
+        'sequence',
+        'amountOfJoined',
     ];
 
     public function userWorkgroup(){
@@ -30,111 +36,229 @@ class LaborReport extends Model
         return $this->belongsTo('App\User','group_user_id','id');
     }
     public function userDutyCheck(){
-        return $this->belongsTo('App\UserDutyCheck','user_id','user_id');
+        return $this->belongsTo('App\UserDutyCheck');
+    }
+    public function laborReportStatus(){
+        return $this->belongsTo('App\LaborReportStatus','id','labor_report_id');
+    }
+    public function getRemarkAttribute(){
+        return $this->hasOne('App\Sign','signable_id','id')
+            ->where('field','remark')->where('signable_type','labor_reports')->value('mark');
+    }
+    public function setRemarkAttribute($remark,$id){
+        Sign::updateOrCreate(['signable_type'=>'labor_reports','signable_id'=>$id,'field'=>'remark'],['mark'=>$remark]);
+
     }
     public function getIsExportGroupAttribute(){
         return $this['check_out_at']? true:false;
     }
-    public function getIsExportAttribute(){
-        $userDutyChecks=UserDutyCheck::where('user_id',$this['user_id'])->where('type','登出')->get();
-            $updated_at = Carbon::parse($this['updated_at'])->format('Y-m-d H:i');
-            foreach ($userDutyChecks as $userDutyCheck){
-                $checked_at = Carbon::parse($userDutyCheck['checked_at'])->format('Y-m-d H:i');
-                if ($updated_at == $checked_at){
-                    return true;
-                }
-//                if($userDutyCheck['checked_at']==$this['updated_at']){
-//                    return true;
-//                }
-                continue;
-            }
-        return false;
+    //总在线时长
+    public function getTotalOnlineTimeAttribute(){
+        $laborReports=LaborReport::where('enter_number',$this['enter_number'])->get();
+        $totalOnlineTime=$laborReports->reduce(function ($value,$laborReport){
+            return $value+$laborReport['thisRecordOnlineTime'];
+        },0);
+        return $totalOnlineTime;
     }
-    public function getIsExportReplenishAttribute()
+    //总工作时长
+    public function getTotalWorkingTimeAttribute(){
+        $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get();
+        $totalWorkingTime=$laborReports->reduce(function ($value,$laborReport){
+            return ($value??0)+$laborReport['thisRecordWorkingTime'];
+        });
+        return $totalWorkingTime;
+    }
+    //本轮工作起始时间
+    public function getThisRoundOnlineStartTimeAttribute(){
+        $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get();
+        foreach ($laborReports as $laborReport){
+            if ($laborReport['enter_at']&&$laborReport['check_in_at'])
+                return $laborReport['check_in_at'];
+        }
+    }
+    //本轮工作结束时间
+    public function getThisRoundOnlineEndTimeAttribute(){
+        $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get();
+        foreach ($laborReports as $laborReport){
+            if ($laborReport['exit_at']&&$laborReport['check_out_at'])
+                return $laborReport['check_out_at'];
+        }
+    }
+    //本次在线时长
+    public function getThisRecordOnlineTimeAttribute(){
+        if($this['enter_at']&&!$this['check_out_at']&&!$this['exit_at'])
+            return round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['enter_at']))/3600,2);
+        if ($this['enter_at']&&$this['check_out_at']&&!$this['exit_at'])
+            return round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['enter_at']))/3600,2);
+        if ($this['enter_at']&&$this['exit_at'])
+            return round(Carbon::parse($this['exit_at'])->diffInSeconds(Carbon::parse($this['enter_at']))/3600,2);
+        if ($this['check_in_at']&&!$this['enter_at']&&!$this['check_out_at']&&!$this['exit_at'])
+            return round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
+        if ($this['check_in_at']&&!$this['enter_at']&&$this['check_out_at']&&!$this['exit_at'])
+            return round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
+        if ($this['check_in_at']&&!$this['enter_at']&&$this['exit_at'])
+            return round(Carbon::parse($this['exit_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
+    }
+    //本次工作时长
+    public function getThisRecordWorkingTimeAttribute(){
+        if ($this['check_in_at']&&!$this['check_out_at']&&!$this['relax_time']){
+            $workingTime=round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
+            $checkInTime=Carbon::parse($this['check_in_at'])->format('H');
+            $checkOutTime=Carbon::parse(Carbon::now())->format('H');
+            return  $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime);
+        }
+        if ($this['check_in_at']&&$this['check_out_at']&&!$this['relax_time']){
+            $workingTime=round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
+            $checkInTime=Carbon::parse($this['check_in_at'])->format('H');
+            $checkOutTime=Carbon::parse($this['check_out_at'])->format('H');
+            return  $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime);
+        }
+        if ($this['check_in_at']&&$this['check_out_at']&&$this['relax_time']){
+            $workingTime=round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2);
+            $checkInTime=Carbon::parse($this['check_in_at'])->format('H');
+            $checkOutTime=Carbon::parse($this['check_out_at'])->format('H');
+            return  $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime)-$this['relax_time']/60;
+        }
+    }
+
+    //工作时长减午饭休息时间
+    public function minusLunchTime($checkInTime,$checkOutTime,$hour){
+        if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
+            $hour=$hour-1;
+        }
+        return $hour;
+    }
+
+    //转场序号
+    public function getSequenceAttribute()
     {
-        $userDutyCheck = UserDutyCheck::where('user_id', $this['user_id'])->orderBy('id', 'desc')->first();
-        if ($userDutyCheck['type'] == '登出') {
-            return $userDutyCheck['source']=='补入' ? true : false;
+        if(Arr::has($this->tempFields,'sequence'))return $this->tempFields['sequence'];
+        $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get();
+        foreach($laborReports as $i=>$laborReport){
+            if($laborReport['id']==$this['id']){
+                $this->tempFields['sequence']=$i+1;
+                return $this->tempFields['sequence'];
+            }
         }
     }
+    public function getAmountOfJoinedAttribute()
+    {
+        if(Arr::has($this->tempFields,'amountOfJoined'))return $this->tempFields['amountOfJoined'];
+        $this->tempFields['amountOfJoined']=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->count();
+        return $this->tempFields['amountOfJoined'];
+    }
 
+    //进场时间
+    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 $laborReportStatus['created_at'];
+    }
 
-    //进场创建临时工报表信息
-    static function importToCreateLaborReportData($userDutyCheck){
-        $userDetail=UserDetail::find($userDutyCheck->user_id);
-        $name=$userDetail['full_name'];
-        $mobile_phone=$userDetail['mobile_phone'];
-        $identity_number=$userDetail['identity_number'];
-        $labor_company_id=UserLabor::where('user_id',$userDutyCheck->user_id)->value('labor_company_id');
-        $labor_company=LaborCompany::where('id',$labor_company_id)->value('name');
-        $laborReport=new LaborReport([
-            'enter_number'=>$userDutyCheck->user_id,
-            'user_id'=>$userDutyCheck->user_id,
-            'name'=>$name,
-            'mobile_phone'=>$mobile_phone,
-            'identity_number'=>$identity_number,
-            'labor_company'=>$labor_company,
-        ]);
-        $laborReport->save();
+    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();
+        if(empty($laborReport))return null;
         return $laborReport;
+
     }
-    //出场更新临时工报表信息
-    static function exportToCreateLaborReportData($laborReport,$userDutyCheck){
-        $check_in_at=$laborReport->check_in_at;
-        $check_out_at=$userDutyCheck->checked_at;
-        $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
-        $laborReport->online_duration=$online_duration;
-        $laborReport->update();
-        $laborReport->is_export=$laborReport->getIsExportAttribute();
-        return $laborReport;
+
+    public function getExitAtAttribute()
+    {
+        $laborReportStatus=LaborReportStatus::where('labor_report_id',$this['id'])->where('status','已退场')->orderBy('id','desc')->first();
+        if (empty($laborReportStatus))return null;
+        return $laborReportStatus['created_at'];
     }
-    //出场更新临时工报表信息
-    static function exportReplenishToCreateLaborReportData($laborReport,$userDutyCheck){
-        $check_in_at=$laborReport->check_in_at;
-        $check_out_at=$userDutyCheck->checked_at;
-        $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
-        $laborReport->online_duration=$online_duration;
-        $laborReport->update();
-        $laborReport->is_exportReplenish=$laborReport->getIsExportReplenishAttribute();
-        return $laborReport;
+
+    //创建或获取进场编号
+    public function makeOrGetEnteringNumber()
+    {
+        if($this['enteringRecord']&&$this['enteringRecord']['enter_number'])
+            return $this['enteringRecord']['enter_number'];
+        $enteringNumber=date("ymd").str_pad($this['id']>99999?$this['id']%99999:$this['id'],4,"0",STR_PAD_LEFT);
+        $this['enter_number']=$enteringNumber;
+        return $enteringNumber;
     }
-    //当天第一次进工作组更新临时工报表
-    static function intoGroupAndUpdateLaborReportData($laborReport,$userWorkgroupID){
-        $laborReport->user_workgroup_id=$userWorkgroupID;
-        $laborReport->check_in_at=date('Y-m-d H:i:s');
-        $number_id=$laborReport->id;
-        $enter_number=$userWorkgroupID.date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
-        $laborReport->enter_number=$enter_number;
-        $laborReport->update();
-        return $laborReport;
+
+    public function getIsExportAttribute(){
+        $laborReportStatus=LaborReportStatus::where('labor_report_id',$this['id'])->orderBy('id','desc')->first();
+        return $laborReportStatus['status']=='已退场'?true:false;
     }
 
-    //换组添加临时工报表数据
-    static function changeGroupAndCreateLaborReportData($user_id,$userWorkgroupID){
-        $userDetail=UserDetail::find($user_id);
-        $name=$userDetail['full_name'];
-        $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');
-        $laborReport=new LaborReport([
-            'enter_number'=>Uuid::uuid1(),
-            'user_workgroup_id'=>$userWorkgroupID,
-            'user_id'=>$user_id,
-            'name'=>$name,
-            'mobile_phone'=>$mobile_phone,
-            'identity_number'=>$identity_number,
-            'labor_company'=>$labor_company,
-            'check_in_at'=>date('Y-m-d H:i:s'),
+//出场更新临时工报表信息
+    static function exitAndChangeLaborReport($laborReport,$userDutyCheck){
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$laborReport['id'],
+            'status'=>'已退场',
         ]);
-        $laborReport->save();
-        $number_id=$laborReport->id;
-        $enter_number=$userWorkgroupID.date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
-        $laborReport->enter_number=$enter_number;
+        $laborReportStatus->save();
+        $check_in_at=$laborReport->check_in_at;
+        $exit_at=$userDutyCheck->checked_at;
+        $online_duration=round(Carbon::parse($exit_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
+        $laborReport->user_duty_check_id=$userDutyCheck->id;
+        if ($laborReport->enter_at){
+            $enter_at=$laborReport['enter_at'];
+            $laborReport->online_duration=round(Carbon::parse($exit_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
+        }else{
+            $laborReport->online_duration=$online_duration;
+        }
         $laborReport->update();
+        $laborReport->is_export=$laborReport->getIsExportAttribute();
         return $laborReport;
     }
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//修改临时工报表审核时间
+//    static function updateLaborReportVerify($laborReport,$userDutyCheck){
+//        $date=date('Y-m-d H:i:s');
+//        $laborReport['verify_at']=$date;
+//        $laborReport['group_user_id']=$userDutyCheck->group_user_id;
+//        $laborReport->update();
+//        return;
+//    }
 //    //添加临时工报表数据
 //    static function createLaborReportData($userDutyCheck){
 //        $userDetail=UserDetail::find($userDutyCheck->user_id);
@@ -225,12 +349,4 @@ class LaborReport extends Model
 //        }
 //        return;
 //    }
-    //修改临时工报表审核时间
-    static function updateLaborReportVerify($laborReport,$userDutyCheck){
-        $date=date('Y-m-d H:i:s');
-        $laborReport['verify_at']=$date;
-        $laborReport['group_user_id']=$userDutyCheck->group_user_id;
-        $laborReport->update();
-        return;
-    }
 }

+ 17 - 0
app/LaborReportStatus.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+
+class LaborReportStatus extends Model
+{
+    use ModelTimeFormat;
+    protected $fillable=[
+        'id','status','labor_report_id','created_at',
+    ];
+//    public function laborReport(){
+//        return $this->hasMany('App\LaborReport','id','labor_report_id');
+//    }
+}

+ 1 - 1
app/OracleDocOrderPackingSummary.php

@@ -20,7 +20,7 @@ class OracleDocOrderPackingSummary extends Model
             ->leftJoin('act_allocation_details','doc_wave_details.orderno','act_allocation_details.orderno')->get();
         $numbersesOfBatch=$numbersesOfBatch->unique('logistic_number');
         $numbersUseful=$numbersesOfBatch->map(function($numbers){return $numbers['logistic_number'];});
-        $oneIdxAsrsReceive=OracleDocOrderPackingSummary::whereIn('traceid',$numbersUseful)->first();
+        $oneIdxAsrsReceive=OracleDocOrderPackingSummary::whereIn('traceid',$numbersUseful)->get();
         if($oneIdxAsrsReceive->count()<$numbersesOfBatch->count()){
             $numbersUseful=[];
             foreach($numbersesOfBatch as $numbers){//跳过idx_asrs_receive已有快递单号

+ 63 - 44
app/Package.php

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
+use Illuminate\Support\Arr;
 
 class Package extends Model
 {
@@ -24,14 +25,16 @@ class Package extends Model
         'WMSReflectPackage_name'
     ];
     static protected $oracleOrderHeaderFields = [
-    'doc_order_header.userdefine1',
-    'doc_order_header.userdefine2',
-    'doc_order_header.soreference5',
-    'doc_order_header.waveno',
-    'doc_order_header.orderno',
-    'doc_order_header.customerid',
-    'doc_order_header.consigneename',
-    'doc_order_header.carrierid'
+        'doc_order_header.userdefine1',
+        'doc_order_header.soreference5',
+        'doc_order_header.waveno',
+        'doc_order_header.orderno',
+        'doc_order_header.customerid',
+        'doc_order_header.consigneename',
+        'doc_order_header.carrierid',
+        'doc_order_header.c_tel1',
+        'doc_order_header.c_tel2',
+        'doc_wave_header.descr',
     ];
     protected $tempFields=[
         'temOracleInfo','temOwner','temLogistic',
@@ -55,18 +58,22 @@ class Package extends Model
     public function WMSReflectPackage(){
         return $this->hasOne('App\WMSReflectPackage','SOReference5','logistic_number');
     }
-    public function save(array $options=[]){
-        foreach ($this->tempFields as $field){
-            unset($this->$field);
-        }
-        parent::save($options);
-    }
 
-    public function update(array $attributes=[],array $options=[]){
-        foreach ($this->tempFields as $field){
-            unset($this->$field);
-        }
-        parent::update($attributes,$options);
+    public function setLengthAttribute($value){
+        if(empty((int)($value)))return;
+        $this->attributes['length'] = $value;
+    }
+    public function setWidthAttribute($value){
+        if(empty((int)($value)))return;
+        $this->attributes['width'] = $value;
+    }
+    public function setHeightAttribute($value){
+        if(empty((int)($value)))return;
+        $this->attributes['height'] = $value;
+    }
+    public function setBulkAttribute($value){
+        if(empty((int)($value)))return;
+        $this->attributes['bulk'] = $value;
     }
 
     public function isActivityBatch(){
@@ -103,58 +110,67 @@ class Package extends Model
     }
 
     public function fetchLogisticFromOracle(){
-        if(!$this['oracleInfo'])return null;
-        if($this['temLogistic'])return $this['temLogistic'];
-        Controller::logs(__METHOD__, __FUNCTION__, "tempPackage:{$this['oracleInfo']['carrierid']}||SOR:{$this['oracleInfo']['SOReference5']}||sor:{$this['oracleInfo']['soreference5']}||orderno:{$this['orderno']}" , null);
-        if(!$this['oracleInfo']['carrierid'])return null;
-        $logistic= Logistic::where('code',$this['oracleInfo']['carrierid'])->first();
+        if(empty($this->oracleInfo))return null;
+        if(Arr::exists($this->tempFields,'temLogistic'))return $this->tempFields['temLogistic'];
+        Controller::logs(__METHOD__, __FUNCTION__, "tempPackage:{$this->oracleInfo['carrierid']}||SOR:{$this->oracleInfo['SOReference5']}||sor:{$this->oracleInfo['soreference5']}||orderno:{$this['orderno']}" , null);
+        if(!$this->oracleInfo['carrierid'])return null;
+        $logistic= Logistic::where('code',$this->oracleInfo['carrierid'])->first();
         if(!$logistic){
-            Logistic::create(['code'=>$this['oracleInfo']['carrierid'],'name'=>$this['oracleInfo']['carrierid']]);
-            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到快递公司,添加{$this['oracleInfo']['carrierid']}" , null);
+            $logistic=Logistic::create(['code'=>$this->oracleInfo['carrierid'],'name'=>$this->oracleInfo['carrierid']]);
+            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到快递公司,添加{$this->oracleInfo['carrierid']}" , null);
         }
         Controller::logs(__METHOD__, __FUNCTION__, "tempPackage2:{$logistic->id}" , null);
         if(!$logistic)return null;
-        $this['temLogistic']=$logistic;
+        $this->tempFields['temLogistic']=$logistic;
         $this['logistic_id'] = $logistic['id'];
         return $logistic;
     }
     public function fetchOwnerFromOracle(){
-        if(!$this['oracleInfo'])return null;
-        if($this['temOwner'])return $this['temOwner'];
-        $owner= Owner::where('code',$this['oracleInfo']['customerid'])->first();
+        if(empty($this->oracleInfo))return null;
+        if(Arr::exists($this->tempFields,'temOwner'))return $this->tempFields['temOwner'];
+        $owner= Owner::where('code',$this->oracleInfo['customerid'])->first();
         if(!$owner){
-            Owner::create(['code'=>$this['oracleInfo']['customerid'],'name'=>$this['oracleInfo']['customerid']]);
-            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到货主,添加{$this['oracleInfo']['customerid']}" , null);
+            $owner=Owner::create(['code'=>$this->oracleInfo['customerid'],'name'=>$this->oracleInfo['customerid']]);
+            Controller::logs(__METHOD__, __FUNCTION__, "富勒下发找不到货主,添加{$this->oracleInfo['customerid']}" , null);
         }
         if(!$owner)return null;
-        $this['temOwner']=$owner;
+        $this->tempFields['temOwner']=$owner;
         $this['owner_id'] = $owner['id'];
         return $owner;
     }
     public function fetchAllFromOracle(){
-        if(!$this['oracleInfo'])return null;
+        if(empty($this->oracleInfo))return null;
         $this->fetchOwnerFromOracle();
         $this->fetchLogisticFromOracle();
-        $this['recipient'] = $this['oracleInfo']['consigneename'];
-        if($this['oracleInfo']['SOReference5'])
-            $this['logistic_number'] = $this['oracleInfo']['SOReference5'];
-        $this['batch_rule'] = $this['oracleInfo']['userdefine2']??null;
-        $this['batch_number'] = $this['oracleInfo']['waveno']??null;
+        $this['recipient'] = $this->oracleInfo['consigneename'];
+        $this['order_code'] = $this->oracleInfo['orderno'];
+        $this['batch_rule'] = $this->oracleInfo['descr'];
+        $this['recipient_mobile'] = $this->oracleInfo['c_tel2']??$this->oracleInfo['c_tel1'];
+        if($this->oracleInfo['soreference5'])
+            $this['logistic_number'] = $this->oracleInfo['soreference5'];
+        $this['batch_number'] = $this->oracleInfo['waveno']??null;
     }
 
     public function getOracleInfoAttribute()
     {
-        if(isset($this->temOracleInfo)&&$this->temOracleInfo)return $this->temOracleInfo;
-        if(!$this['logistic_number']&&!$this['order_code'])return '';
+        if(isset($this->tempFields['temOracleInfo']))return $this->tempFields['temOracleInfo'];
+        if(empty($this['logistic_number'])&&empty($this['order_code']))return '';
         if($this['order_code']){
             $resultOracleObjs=OracleDOCOrderHeader::select(self::$oracleOrderHeaderFields)->where('orderno',$this['order_code']);
+            $resultOracleObjs->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
         }else{
             $resultOracleObjs=OracleActAllocationDetails::select(self::$oracleOrderHeaderFields);
             $resultOracleObjs->where('picktotraceid',$this['logistic_number']);
             $resultOracleObjs->leftJoin('DOC_Order_Header','act_allocation_details.orderno','doc_order_header.orderno');
+            $resultOracleObjs->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
+        }
+        $this->tempFields['temOracleInfo']=$resultOracleObjs->first();
+        if(empty($this->tempFields['temOracleInfo'])) {
+            $resultOracleObjs=OracleDOCOrderHeader::select(self::$oracleOrderHeaderFields)->where('soreference5',$this['logistic_number']);
+            $resultOracleObjs->leftJoin('doc_wave_header','doc_wave_header.waveno','doc_order_header.waveno');
         }
-        $this->temOracleInfo=$resultOracleObjs->first();
-        return $this->temOracleInfo;
+        $this->tempFields['temOracleInfo']=$resultOracleObjs->first();
+        return $this->tempFields['temOracleInfo'];
     }
     public function getOwnerNameAttribute()
     {
@@ -178,11 +194,14 @@ class Package extends Model
 
 
     //寻找相近纸箱ID
-    public  function fetchPaperBox($max, $centre, $min, $owner_id=null){
+    public  function fetchPaperBox($max=null, $centre=null, $min=null, $owner_id=null){
         if($this['paper_box_id'])return $this['paper_box_id'];
         $sumDiffer=0;
         $maxDiffer=0;
         $paperBox_id=null;
+        if(!$max)$max=$this['length'];
+        if(!$centre)$centre=$this['width'];
+        if(!$min)$min=$this['height'];
         if(!$owner_id) $owner_id = $this['owner_id'];
         if(!$owner_id) {
             $owner = $this->fetchOwnerFromOracle();

+ 8 - 0
app/Process.php

@@ -17,6 +17,14 @@ class Process extends Model
     protected $appends=[
         'owner_name','process_method_name',
     ];
+    public static function filterAuthorities(){
+        $user=Auth::user();
+        if(!$user){
+            return (new static)->newQuery()->where('id','0');
+        }
+        $ownerIds=$user->getPermittingOwnerIdsAttribute();
+        return (new static)->newQuery()->whereIn('id',$ownerIds);
+    }
 
     public static function filterAuthorities(){
         $user=Auth::user();

+ 8 - 0
app/ProcessDailyParticipant.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 
@@ -16,6 +17,10 @@ class ProcessDailyParticipant extends Model
         'user_detail_full_name',
         'process_daily_date',
     ];
+    protected $casts = [
+        'started_at' => 'datetime:H:i',
+        'ended_at' => 'datetime:H:i',
+    ];
 
     public function user_detail(){
         return $this->belongsTo('App\UserDetail','user_id','user_id');
@@ -23,6 +28,9 @@ class ProcessDailyParticipant extends Model
     public function processDaily(){
         return $this->belongsTo('App\ProcessDaily','process_daily_id','id');
     }
+    public function userLabor(){
+        return $this->belongsTo('App\UserLabor','user_id','user_id');
+    }
 
 
     public function getUserDetailFullNameAttribute()

+ 125 - 0
app/Services/LaborReportService.php

@@ -0,0 +1,125 @@
+<?php
+
+
+namespace App\Services;
+
+
+use App\Events\ExportEvent;
+use App\Events\ImportEvent;
+use App\Http\Controllers\Controller;
+use App\Http\Controllers\UserDutyCheckController;
+use App\LaborReportStatus;
+use App\LaborCompany;
+use App\LaborReport;
+use App\UserDetail;
+use App\UserDutyCheck;
+use App\UserLabor;
+use Carbon\Carbon;
+
+class LaborReportService
+{
+    //根据进场记录创建临时工报表
+    public function makeLaborReportByUserDutyCheck($userDutyCheck){
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        if (!$laborReport){
+            $newReport=$userDutyCheck->laborEnterCheck();
+            Controller::logS(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport){
+                event(new ImportEvent($userDutyCheck));
+            }
+        }
+    }
+    //根据进出场打卡记录 创建或者更新临时工报表记录
+    public function makeOrChangeLaborReportByUserDutyCheck($userDutyCheck,$importAndExportQRCodeType){
+        $dateNow=Carbon::now()->format('Y-m-d');
+        $laborReport=LaborReport::where('user_id',$userDutyCheck->user_id)->where('created_at','like',$dateNow.'%')->orderBy('id','desc')->first();
+        //判断当前日期下临时工是否有临时工报表记录并且是进场打卡
+        if ($userDutyCheck->type=='登入'&&$importAndExportQRCodeType=='import'){
+            $newReport=$userDutyCheck->makeEnteringRecord();
+            Controller::logS(__METHOD__,"进场创建临时工报表记录__".__FUNCTION__,json_encode([$userDutyCheck]));
+            if ($newReport) event(new ImportEvent($userDutyCheck));
+        }
+        if(!$laborReport&&$importAndExportQRCodeType=='export'){
+            //退场时间跨天情况
+            $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>";
+            }
+                $exportReport=LaborReport::exitAndChangeLaborReport($laborReportYesterday,$userDutyCheck);
+                Controller::logS(__METHOD__,"退场更改临时工报表信息__".__FUNCTION__,json_encode([$laborReportYesterday,$userDutyCheck]));
+                if ($exportReport) event(new ExportEvent($userDutyCheck));
+        }
+        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>";
+            }
+            $exportReport=LaborReport::exitAndChangeLaborReport($laborReport,$userDutyCheck);
+            Controller::logS(__METHOD__,"退场更改临时工报表信息__".__FUNCTION__,json_encode([$laborReport,$userDutyCheck]));
+            if ($exportReport) event(new ExportEvent($userDutyCheck));
+        }
+    }
+
+    //补卡出场更新临时工报表信息
+    public function exportReplenishToCreateLaborReportData($laborReport,$userDutyCheck){
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$laborReport['id'],
+            'status'=>'已退场',
+            'created_at'=>$userDutyCheck['checked_at'],
+        ]);
+        $laborReportStatus->save();
+        $check_in_at=$laborReport->check_in_at;
+        $exit_at=$userDutyCheck->checked_at;
+        $online_duration=round(Carbon::parse($exit_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
+        if ($laborReport->enter_at){
+            $enter_at=$laborReport['enter_at'];
+            $laborReport->online_duration=round(Carbon::parse($exit_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
+        }else{
+            $laborReport->online_duration=$online_duration;
+        }
+        $laborReport->update();
+        $laborReport->is_export=$laborReport->getIsExportAttribute();
+        return $laborReport;
+    }
+    //当天第一次进工作组更新临时工报表
+    public function enterGroupAndUpdateLaborReport($laborReport,$userWorkgroupID){
+        $laborReport->user_workgroup_id=$userWorkgroupID;
+        $laborReport->check_in_at=date('Y-m-d H:i:s');
+        $laborReport->update();
+        return $laborReport;
+    }
+
+    //换组添加临时工报表数据
+    public function changeGroupAndMakeLaborReport($user_id,$userWorkgroupID){
+        $laborReportBefore=LaborReport::where('user_id',$user_id)->orderby('id','desc')->first();
+        if ($laborReportBefore&&$laborReportBefore['status']!='已退场')$userDutyCheck=$laborReportBefore->userDutyCheck;
+        $userDetail=UserDetail::find($user_id);
+        $name=$userDetail['full_name'];
+        $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');
+        $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,
+            'check_in_at'=>date('Y-m-d H:i:s'),
+            'user_duty_check_id'=>$userDutyCheck->id,
+        ]);
+        $laborReport['enter_number']=$laborReport->makeOrGetEnteringNumber();
+        $laborReport->save();
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$laborReport['id'],
+            'status'=>'已换组',
+        ]);
+        $laborReportStatus->save();
+        return $laborReport;
+    }
+
+}

+ 17 - 0
app/Services/UserDutyCheckService.php

@@ -0,0 +1,17 @@
+<?php
+
+
+namespace App\Services;
+use App\Http\Controllers\Controller;
+use App\Events\ExportEvent;
+use App\Events\ImportEvent;
+use App\Http\Controllers\UserDutyCheckController;
+use App\LaborReport;
+use App\UserDutyCheck;
+use Carbon\Carbon;
+use phpDocumentor\Reflection\DocBlock\Tags\Return_;
+
+class UserDutyCheckService
+{
+
+}

+ 2 - 2
app/User.php

@@ -119,9 +119,9 @@ class User extends Authenticatable
         });
         return array_unique($ownerIds);
     }
-    function getPermittingWorkgroupIds(){
+    function getPermittingWorkgroupIds($allowAll=false){
         $workgroupIds=[];
-        if ($this->isSuperAdmin()){
+        if ($this->isSuperAdmin()||$allowAll){
             $workgroups=UserWorkgroup::all();
             $workgroups->each(function (UserWorkgroup $workgroup)use(&$workgroupIds){
                 array_push($workgroupIds,$workgroup['id']);

+ 2 - 2
app/UserDetail.php

@@ -22,7 +22,7 @@ class UserDetail extends Model
     public function user(){
         return $this->belongsTo('App\User','user_id','id');
     }
-    public function user_labor(){
+    public function userLabor(){
         return $this->belongsTo('App\UserLabor','user_id','user_id');
     }
     public function userDutyChecks(){
@@ -30,7 +30,7 @@ class UserDetail extends Model
     }
     public function getUserLaborCompanyAttribute()
     {
-        $laborCompanyId=$this['user_labor']['labor_company_id']??0;
+        $laborCompanyId=$this['userLabor']['labor_company_id']??0;
         $laborCompany=LaborCompany::find($laborCompanyId);
         return $this['user_labor_company']=$laborCompany['name'];
     }

+ 35 - 1
app/UserDutyCheck.php

@@ -5,6 +5,7 @@ namespace App;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
+use Illuminate\Support\Facades\Date;
 
 class UserDutyCheck extends Model
 {
@@ -13,7 +14,7 @@ class UserDutyCheck extends Model
     public $timestamps=false;
 
     protected $fillable=[
-        'user_id','checked_at','confirmed_by','type','source','workgroup_id'
+        'user_id','checked_at','confirmed_by','type','source','workgroup_id',
     ];
 
     public function userDetail(){
@@ -26,5 +27,38 @@ class UserDutyCheck extends Model
     public function userWorkgroup(){
         return $this->belongsTo('App\UserWorkgroup','workgroup_id','id');
     }
+    public function laborReport(){
+        return $this->hasOne('App\LaborReport');
+    }
 
+    public function laborEnterCheck(){
+        $this->makeEnteringRecord();
+    }
+    //进场创建临时工报表信息
+     function makeEnteringRecord(){
+        $userDetail=UserDetail::find($this['user_id']);
+        $name=$userDetail['full_name'];
+        $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');
+        $laborReport=new LaborReport([
+            'user_id'=>$this['user_id'],
+            'name'=>$name,
+            'mobile_phone'=>$mobile_phone,
+            'identity_number'=>$identity_number,
+            'labor_company'=>$labor_company,
+            'user_duty_check_id'=>$this['id'],
+        ]);
+        $laborReport->save();
+        $laborReportStatus=new LaborReportStatus([
+            'labor_report_id'=>$laborReport['id'],
+            'status'=>'未审核',
+            'created_at'=>$this['checked_at'],
+        ]);
+        $laborReportStatus->save();
+        $laborReport['enter_number']=$laborReport->makeOrGetEnteringNumber();
+        $laborReport->update();
+        return $laborReport;
+    }
 }

+ 14 - 1
app/UserLabor.php

@@ -2,6 +2,7 @@
 
 namespace App;
 
+use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
 use Illuminate\Support\Facades\Cache;
@@ -14,7 +15,7 @@ class UserLabor extends Model
     public $timestamps=false;
 
     protected $fillable=[
-        'user_id','default_hour_price','labor_company_id'
+        'user_id','default_hour_price','labor_company_id','present_status','user_workgroup_id'
     ];
     protected $appends = [
         'is_relieve_facility',
@@ -30,4 +31,16 @@ class UserLabor extends Model
         return Cache::has('dutyCheckTokenUser_'.$this['user_id']);
     }
 
+    public function isOccupiedAt($date,$time):bool{
+        $processDailyParticipants=ProcessDailyParticipant::query()->select('ended_at')->where('user_id',$this['user_id'])
+            ->whereHas('processDaily', function ($query) use($date){
+            $query->where('date',$date);
+        })->get();
+        foreach ($processDailyParticipants as $processDailyParticipant){
+            if (Carbon::parse($processDailyParticipant->ended_at)->lt(Carbon::parse($time))){
+                return true;
+            }
+        }
+        return false;
+    }
 }

+ 9 - 1
app/UserWorkgroup.php

@@ -9,7 +9,9 @@ class UserWorkgroup extends Model
 {
     protected $table="user_workgroups";
     protected $fillable=['name','warehouse_id'];
-    protected $appends=['token'];
+    protected $appends=[
+        'token','isNeedRemark',
+    ];
 
     public function users(){
         return $this->belongsToMany('App\User','user_workgroup_user','user_workgroup_id','user_id');
@@ -17,8 +19,14 @@ class UserWorkgroup extends Model
     public  function wareHouse(){
         return $this->belongsTo('App\Warehouse','warehouse_id','id');
     }
+    public  function signs(){
+        return $this->hasOne('App\Sign','signable_id','id');
+    }
     public  function getTokenAttribute(){
         return md5($this['name'].Carbon::now()->format('Y-m-d'));
     }
+    public  function getIsNeedRemarkAttribute(){
+        return $this['signs']['mark']=='是'? true:false;
+    }
 
 }

File diff suppressed because it is too large
+ 240 - 303
composer.lock


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

@@ -26,9 +26,9 @@ class ChangePackageColumn extends Migration
             $table->bigInteger('logistic_id')->nullable()->index()->comment('外键物流公司');
             $table->bigInteger('measuring_machine_id')->nullable()->index()->comment('外键设备');
             $table->decimal('weight')->nullable()->comment('重KG');
-            $table->decimal('length')->nullable()->index()->comment('长(cm)');
-            $table->decimal('width')->nullable()->index()->comment('宽(cm)');
-            $table->decimal('height')->nullable()->index()->comment('高(cm)');
+            $table->decimal('length')->nullable()->comment('长(cm)');
+            $table->decimal('width')->nullable()->comment('宽(cm)');
+            $table->decimal('height')->nullable()->comment('高(cm)');
             $table->decimal('bulk')->nullable()->comment('体积(cm³)');
             $table->bigInteger('paper_box_id')->nullable()->index()->comment('外键纸箱');
             $table->dateTime('weighed_at')->nullable()->comment('称重时间');

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

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddLaborReportsColumnUserDutyCheckId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('labor_reports',function (Blueprint $table){
+            $table->integer('user_duty_check_id')->nullable();
+            //$table->enum('status',['未审核','已入场','已退场','已换组','已退组'])->default('未审核');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('labor_reports', function (Blueprint $table) {
+            $table->dropColumn('user_duty_check_id');
+        });
+    }
+}

+ 34 - 0
database/migrations/2020_07_17_104614_add_user_labors_columns_present_status_workgroup_id.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddUserLaborsColumnsPresentStatusWorkgroupId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('user_labors',function (Blueprint $table){
+            $table->enum('present_status',['未审核','入场中','已退场','已换组','已退组'])->nullable()->index();
+            $table->integer('user_workgroup_id')->nullable()->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('user_labors', function (Blueprint $table) {
+            $table->dropColumn('present_status');
+            $table->dropColumn('user_workgroup_id');
+        });
+    }
+}

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

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateLaborReportStatusesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('labor_report_statuses', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->bigInteger('labor_report_id')->index()->comment('外键临时工报表')->nullable();
+            $table->enum('status',['未审核','已入场','已退场','已换组','已退组'])->default('未审核')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('labor_report_statuses');
+    }
+}

+ 40 - 0
database/migrations/2020_07_21_104613_change_package_columns_decimal.php

@@ -0,0 +1,40 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangePackageColumnsDecimal extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('packages',function (Blueprint $table){
+            $table->decimal('weight',10,2)->comment('重KG')->change();
+            $table->decimal('length',10,2)->comment('长(cm)')->change();
+            $table->decimal('width',10,2)->comment('宽(cm)')->change();
+            $table->decimal('height',10,2)->comment('高(cm)')->change();
+            $table->decimal('bulk',16,2)->nullable()->comment('体积(cm³)')->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('packages', function (Blueprint $table) {
+            $table->decimal('weight',8,2)->nullable()->comment('重KG')->change();
+            $table->decimal('length',8,2)->nullable()->comment('长(cm)')->change();
+            $table->decimal('width',8,2)->nullable()->comment('宽(cm)')->change();
+            $table->decimal('height',8,2)->nullable()->comment('高(cm)')->change();
+            $table->decimal('bulk',8,2)->nullable()->comment('体积(cm³)')->change();
+        });
+    }
+}

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

@@ -0,0 +1,38 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddAuthoritiesPersonnel extends Migration
+{
+    protected $authNames=[
+        '人事管理-临时工报表',
+        '人事管理-打卡相关',
+    ];
+
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->authNames as $name){
+            if(!Authority::where('name',$name)->first())(new Authority(['name'=>$name,'alias_name'=>$name]))->save();
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        foreach ($this->authNames as $name){
+            Authority::where('name',$name)->delete();
+        }
+    }
+}

+ 42 - 0
database/migrations/2020_07_24_155909_change_process_daily_participants_delete_column_status.php

@@ -0,0 +1,42 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeProcessDailyParticipantsDeleteColumnStatus extends Migration
+{
+
+    protected $authNamesDel=[
+        '人事管理-任务审核'
+    ];
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('process_daily_participants',function (Blueprint $table){
+            $table->dropColumn('status');
+        });
+        foreach ($this->authNamesDel as $name){
+            \App\Authority::where(['name'=>$name,'alias_name'=>$name])->delete();
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('process_daily_participants',function (Blueprint $table){
+            $table->enum('status',['已审核','未审核'])->after('remark')->default('未审核')->comment('状态');
+        });
+        foreach ($this->authNamesDel as $name){
+            \App\Authority::create(['name'=>$name,'alias_name'=>$name]);
+        }
+    }
+}

+ 2 - 2
public/js/app.js

@@ -61945,8 +61945,8 @@ module.exports = tempTip;
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(/*! D:\Demo\bswas\resources\js\app.js */"./resources/js/app.js");
-module.exports = __webpack_require__(/*! D:\Demo\bswas\resources\sass\app.scss */"./resources/sass/app.scss");
+__webpack_require__(/*! D:\wamp64\www\bswas\resources\js\app.js */"./resources/js/app.js");
+module.exports = __webpack_require__(/*! D:\wamp64\www\bswas\resources\sass\app.scss */"./resources/sass/app.scss");
 
 
 /***/ }),

+ 9 - 5
public/t.php

@@ -1,7 +1,11 @@
 <?php
 ;
-
-$str = '123';
-var_dump(json_encode($str));
-$i = 222;
-var_dump(json_encode($i));
+$arr=['a'=>'1', 'b',
+];
+var_dump(empty((int)('0.00')));
+var_dump((int)('0.00'));
+var_dump(empty((int)('1.00')));
+var_dump((int)('1.00'));
+var_dump(empty(0));
+var_dump(empty(0.00));
+var_dump(empty(1));

+ 10 - 0
resources/sass/text.scss

@@ -38,3 +38,13 @@
     50%{ text-shadow: 0 0 40px red}
     100%{ text-shadow: 0 0 4px red}
 }
+
+
+.noselect {
+    -webkit-touch-callout: none; /* iOS Safari */
+    -webkit-user-select: none; /* Chrome/Safari/Opera */
+    -khtml-user-select: none; /* Konqueror */
+    -moz-user-select: none; /* Firefox */
+    -ms-user-select: none; /* Internet Explorer/Edge */
+    user-select: none;
+}

+ 18 - 3
resources/views/maintenance/userWorkgroup/create.blade.php

@@ -14,8 +14,8 @@
                     <div class="form-group row">
                         <label for="warehouse_id" class="col-2 col-form-label text-right">仓库名称</label>
                         <div class="col-8">
-                            <select id="warehouse_id" type="text" class="form-control @error('warehouse_id') is-invalid @enderror" name="warehouse_id" autocomplete="off"  required>
-                                <option> </option>
+                            <select id="warehouse_id" type="text" class="form-control @error('warehouse_id') is-invalid @enderror" name="warehouse_id" autocomplete="off"  >
+                                <option></option>
                                 <option v-for="warehouse in warehouses" :value="warehouse.id">@{{ warehouse.name }}</option>
                             </select>
                             @error('warehouse_id')
@@ -29,7 +29,7 @@
                         <label for="name" class="col-2 col-form-label text-right">工作组名称</label>
                         <div class="col-8">
                             <input type="text" class="form-control @error('name') is-invalid @enderror"
-                                   name="name" autocomplete="off" value="{{ old('name') }}" required>
+                                   name="name" autocomplete="off" value="{{ old('name') }}" >
                             @error('name')
                             <span class="invalid-feedback" role="alert">
                                         <strong>{{ $message }}</strong>
@@ -37,6 +37,21 @@
                             @enderror
                         </div>
                     </div>
+                    <div class="form-group row">
+                        <label for="remark" class="col-2 col-form-label text-right">需要录入备注</label>
+                        <div class="col-8">
+                            <select id="remark" type="text" class="form-control @error('remark') is-invalid @enderror" name="remark" autocomplete="off"  >
+                                <option></option>
+                                <option value="是">是</option>
+                                <option value="否">否</option>
+                            </select>
+                            @error('remark')
+                            <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                            @enderror
+                        </div>
+                    </div>
                     <div class="form-group row">
                         <div class="col-8 offset-2">
                             <input type="submit" class="btn btn-success form-control">

+ 22 - 3
resources/views/maintenance/userWorkgroup/edit.blade.php

@@ -19,7 +19,7 @@
                     <div class="form-group row">
                         <label for="warehouse_id" class="col-2 col-form-label text-right">仓库名称</label>
                         <div class="col-8">
-                            <select id="warehouse_id" type="text" v-model="userWorkgroup.warehouse_id" class="form-control" name="warehouse_id" autocomplete="off"  required>
+                            <select id="warehouse_id" type="text" v-model="userWorkgroup.warehouse_id" class="form-control" name="warehouse_id" autocomplete="off"  >
                                 <option  v-for="warehouse in warehouses" :value="warehouse.id">@{{ warehouse.name }}</option>
                             </select>
                         </div>
@@ -28,7 +28,7 @@
                         <label for="name" class="col-2 col-form-label text-right">工作组名称</label>
                         <div class="col-8">
                             <input type="text" class="form-control @error('name') is-invalid @enderror"
-                                   name="name" autocomplete="off" :value="userWorkgroup.name" required>
+                                   name="name" autocomplete="off" :value="userWorkgroup.name" >
                             @error('name')
                             <span class="invalid-feedback" role="alert">
                                 <strong>{{ $message }}</strong>
@@ -36,6 +36,21 @@
                             @enderror
                         </div>
                     </div>
+                    <div class="form-group row">
+                        <label for="remark" class="col-2 col-form-label text-right">需要录入备注</label>
+                        <div class="col-8">
+                            <select id="remark" type="text" class="form-control @error('remark') is-invalid @enderror" name="remark" autocomplete="off"  >
+                                <option :value="userWorkgroup.remark">@{{ userWorkgroup.remark }}</option>
+                                <option value="是">是</option>
+                                <option value="否">否</option>
+                            </select>
+                            @error('remark')
+                            <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                            @enderror
+                        </div>
+                    </div>
                     <div class="form-group row">
                         <div class="col-8 offset-2">
                             <input type="submit" class="btn btn-outline-dark form-control">
@@ -51,7 +66,11 @@
         new Vue({
             el:'#list',
             data:{
-                userWorkgroup:{name:'{{old('name')?old('name'):$userWorkgroup->name}}',warehouse_id:'{{old('warehouse_id')?old('warehouse_id'):$userWorkgroup->warehouse_id}}'},
+                userWorkgroup:{
+                    name:'{{old('name')?old('name'):$userWorkgroup->name}}',
+                    warehouse_id:'{{old('warehouse_id')?old('warehouse_id'):$userWorkgroup->warehouse_id}}',
+                    @if($userWorkgroup->signs)remark:'{{old('remark')?old('remark'):$userWorkgroup->signs['mark']}}',@endif
+                },
                 warehouses:[
                     @foreach($warehouses as $warehouse)
                     {id:'{{$warehouse->id}}',name:'{{$warehouse->name}}'},

+ 7 - 1
resources/views/maintenance/userWorkgroup/index.blade.php

@@ -18,6 +18,7 @@
                         <th>仓库</th>
                         <th>名称</th>
                         <th>录入时间</th>
+                        <th>需要录入备注</th>
                         <th>操作</th>
                     </tr>
                     <tr v-for="userWorkgroup in userWorkgroups">
@@ -25,6 +26,7 @@
                         <td ><span v-if="userWorkgroup.warehouse">@{{userWorkgroup.warehouseName}}</span></td>
                         <td>@{{userWorkgroup.name}}</td>
                         <td class="text-muted">@{{userWorkgroup.created_at}}</td>
+                        <td >@{{userWorkgroup.remark}}</td>
                         <td>
                             @can('工作组-编辑')
                                 <button class="btn btn-sm btn-outline-primary" @click="edit(userWorkgroup.id)">改</button> @endcan
@@ -46,7 +48,11 @@
             data:{
                 userWorkgroups:[
                     @foreach($userWorkgroups as $userWorkgroup)
-                    {id:'{{$userWorkgroup->id}}',name:'{{$userWorkgroup->name}}',warehouse:'{{$userWorkgroup->warehouse}}',created_at:'{{$userWorkgroup->created_at}}',warehouseName:'{{$userWorkgroup->warehouse['name']}}'},
+                    {id:'{{$userWorkgroup->id}}',name:'{{$userWorkgroup->name}}',warehouse:'{{$userWorkgroup->warehouse}}',
+                        created_at:'{{$userWorkgroup->created_at}}',
+                        @if($userWorkgroup->warehouse)warehouseName:'{{$userWorkgroup->warehouse['name']}}',@endif
+                            @if($userWorkgroup->signs)remark:'{{$userWorkgroup->signs['mark']}}',@endif
+                        },
                     @endforeach
                 ],
             },

+ 11 - 10
resources/views/order/index/delivering.blade.php

@@ -87,16 +87,14 @@
                         <td class="text-nowrap">@{{ order.soreference1 }}</td>
                         <td class="text-muted text-nowrap">@{{ order.carriername }}</td>
                         <td class="text-nowrap">
-                            <div v-if="order.picktotraceid && order.picktotraceid.length>1">
-                                <span>@{{ order.picktotraceid[0] }}
-                                    <button class="btn btn-sm" :class="order.is_unfold ? 'btn-outline-dark' : 'btn-outline-info'" @click="isUnfold(order)">
-                                        <span v-if="order.is_unfold">收起</span>
-                                        <span v-else>分箱 @{{ order.picktotraceid.length }} 件,展开单号</span>
-                                    </button>
-                                </span>
-                                <span v-for="(picktotraceid,i) in order.picktotraceid" v-if="order.is_unfold && i!=0">
-                                    <br>@{{ picktotraceid }}
+                            <div v-if="order.picktotraceid && order.picktotraceid.length>1" class="text-center">
+                                <span v-for="(picktotraceid,i) in order.picktotraceid" v-if="order.is_unfold">
+                                    @{{ picktotraceid }}<br>
                                 </span>
+                                <button class="btn btn-sm btn-outline-info" :style="order.is_unfold ? 'opacity:0.7' : ''" @click="isUnfold(order)">
+                                    <span v-if="order.is_unfold" class="mt-1">收起</span>
+                                    <span v-else>分箱 @{{ order.picktotraceid.length }} 件,展开单号</span>
+                                </button>
                             </div>
                             <span v-else>@{{ order.soreference5 }}</span>
                         </td>
@@ -163,11 +161,14 @@
 @endsection
 
 @section('lastScript')
-    <script type="text/javascript" src="{{asset('js/queryForm/queryForm200724.js')}}"></script>
     <script>
         new Vue({
             el:"#list",
             data:{
+                filterData:{
+                    paginate:50,ordertime_start:'',orderdate_start:'',orderdate_end:'',ordertime_end:'',customerid:'',orderno:'',soreference5:'',codename_c:'',
+                    carriername:'',issuepartyname:'',soreference1:'',notes:'',addtime:'1',alternate_sku1:'',waveno:'',edisendflag2:'',
+                },
                 page:Number('{{$page}}'),
                 maxPage:1,
                 sum:0,

+ 2 - 2
resources/views/personnel/checking-in/clockAudit.blade.php

@@ -62,7 +62,7 @@
                                 @endcan
                             </td>
                             <td  class="text-muted"><span v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.mobile_phone }}</span></td>
-                            <td ><span v-if="userDutyCheck.user_labor">@{{ userDutyCheck.user_labor.labor_company.name }}</span></td>
+                            <td ><span v-if="userDutyCheck.userLabor">@{{ userDutyCheck.userLabor.labor_company.name }}</span></td>
                             <td class="font-weight-bold"><span v-if="userDutyCheck.user_workgroup">
                                 @{{ userDutyCheck.user_workgroup.name }}</span></td>
                             <td>@{{ userDutyCheck.exception }}</td>
@@ -94,7 +94,7 @@
                         type:'{{$userDutyCheck->type}}',verify_user_id:'{{$userDutyCheck->verify_user_id}}',group_user_id:'{{$userDutyCheck->group_user_id}}',
                         exception:'',duration_man_hour:'',@if($userDutyCheck->userWorkgroup)user_workgroup:{!! $userDutyCheck->userWorkgroup !!}, @endif
                             @if($userDutyCheck->userDetail)user_detail:{!! $userDutyCheck->userDetail !!}, @endif
-                            @if($userDutyCheck->userLabor)user_labor:{!! $userDutyCheck->userLabor !!}, @endif},
+                            @if($userDutyCheck->userLabor)userLabor:{!! $userDutyCheck->userLabor !!}, @endif},
                     @endforeach
                 ],
                 permittingWorkgroups:{!! $permittingWorkgroups !!},

+ 2 - 1
resources/views/personnel/checking-in/importAndExportQRCode.blade.php

@@ -59,7 +59,8 @@
                         .then(function (response) {
                             _this.importAndExportQRCodes=response.data.importAndExportQRCodes;
                             _this.last_refresh_date=response.data.last_refresh_date;
-                            $("meta[name='csrf-token']").attr('content', response.data.csrf_Token);
+                            document.querySelector("meta[name='csrf-token']").setAttribute('content',response.data.csrf_Token);
+                             //$("meta[name='csrf-token']").attr('content', response.data.csrf_Token);
                             setTimeout(refreshQRCode,computeDiffMicroTime_fromNow(_this.last_refresh_date));
                         }).catch(function (err) {
                         setTimeout(refreshQRCode,computeDiffMicroTime_fromNow(_this.last_refresh_date));

+ 1 - 1
resources/views/personnel/checking-in/missionAudit.blade.php

@@ -77,7 +77,7 @@
                     <td><p v-if="processDailyParticipant.user_detail">
                             @{{ processDailyParticipant.user_detail.mobile_phone }}</p></td>
                     <td><p v-if="processDailyParticipant.user_detail">
-                            @{{ processDailyParticipant.user_detail.user_labor.labor_company.name}}</p></td>
+                            @{{ processDailyParticipant.user_detail.userLabor.labor_company.name}}</p></td>
                     <td>@{{ processDailyParticipant.hour_count }}</td>
                     <td class="text-danger">@{{ processDailyParticipant.hour }}</td>
                     <td class="text-danger">@{{ processDailyParticipant.diff }}</td>

+ 372 - 180
resources/views/personnel/laborReport/index.blade.php

@@ -6,62 +6,53 @@
     <div id="nav2">
         @component('personnel.menu')@endcomponent
     </div>
-    <div class="d-none" id="list">
-        <div class="container-fluid">
-            <div class="">
-                <div>
-                    <form  method="GET" action="{{url('personnel/laborReport/')}}" id="optionSubmit">
-                        <table class="table table-sm table-bordered m-0">
-                            <tr v-if="isBeingFilterConditions">
-                                <td colspan="10"><div class="col" style="padding:0">
-                                        <a  href="{{url('personnel/laborReport')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
-                                    </div></td>
-                            </tr>
-                            <tr>
-
-                                <td  colspan="7">
-                                    <select name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="setPaginate">
-                                        <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></td>
-                            </tr>
-                            <tr>
-                                <td >
-                                    <input style="width: 140px" name="created_at_start" type="date" v-model="filterData.created_at_start" :class="filterData.created_at_start?'bg-warning':''" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的起始时间">
-                                </td>
-                                <td>
-                                    <div class="form-inline">
-                                        <input type="text" class="form-control form-control-sm tooltipTarget" placeholder="小组"
-                                               style="width:70px" @input="owner_seek"
-                                               title="输入关键词快速定位下拉列表,回车确定">
-                                        <select name="user_workgroup_id" id="user_workgroup_id" :class="filterData.user_workgroup_id?'bg-warning':''" v-model="filterData.user_workgroup_id" @change="setUserWorkGroup"
-                                                class="form-control form-control-sm tooltipTarget"  title="选择要显示的工作组">
-                                            @foreach($userWorkGroups as $userWorkGroup)
-                                                <option value="{{$userWorkGroup->id}}">{{$userWorkGroup->name}}</option>
-                                            @endforeach
-                                        </select>
-                                        <input hidden type="submit" >
-                                    </div>
-                                </td>
+    <div class="d-none container-fluid" id="list">
+        <div class="">
+            <div>
+                <form  method="GET" action="{{url('personnel/laborReport/')}}" id="optionSubmit">
+                    <table class="table table-sm table-bordered m-0 text-nowrap">
+                        <tr v-if="isBeingFilterConditions">
+                            <td colspan="10"><div class="col" style="padding:0">
+                                    <a  href="{{url('personnel/laborReport')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
+                                </div></td>
+                        </tr>
+                        <tr>
+                            <td  colspan="9">
+                                <select name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="setPaginate">
+                                    <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></td>
+                        </tr>
+                        <tr>
+                            <td >
+                                <input style="max-width: 200px" name="created_at_start" type="date" v-model="filterData.created_at_start" :class="filterData.created_at_start?'bg-warning':''" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的起始时间">
+                                <input style="max-width: 200px" type="date" name="created_at_end" v-model="filterData.created_at_end" :class="filterData.created_at_end?'bg-warning':''" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的结束时间">
+                            </td>
+                            <td>
+                                <div class="form-inline">
+                                    <input type="text" class="form-control form-control-sm tooltipTarget" placeholder="小组"
+                                           style="width:70px" @input="owner_seek"
+                                           title="输入关键词快速定位下拉列表,回车确定">
+                                    <select name="user_workgroup_id" id="user_workgroup_id" :class="filterData.user_workgroup_id?'bg-warning':''" v-model="filterData.user_workgroup_id" @change="setUserWorkGroup"
+                                            class="form-control form-control-sm tooltipTarget"  title="选择要显示的工作组">
+                                        @foreach($userWorkGroups as $userWorkGroup)
+                                            <option value="{{$userWorkGroup->id}}">{{$userWorkGroup->name}}</option>
+                                        @endforeach
+                                    </select>
+                                    <input hidden type="submit" >
+                                </div>
+                                <input type="text"  name="mobile_phone" class="form-control form-control-sm tooltipTarget" v-model="filterData.mobile_phone"  :class="filterData.mobile_phone?'bg-warning':''" style="max-width: 200px" placeholder="电话号">
+                            </td>
 
-                                <td >
-                                    <input :class="filterData.enter_number?'bg-warning':''" type="text" title="支持15内模糊搜索与15天外精确搜索" name="enter_number" class="form-control form-control-sm  tooltipTarget" style="width: 150px" v-model="filterData.enter_number"  placeholder="进厂编号"></td>
-                                <td >
-                                    <input :class="filterData.identity_number?'bg-warning':''" type="text" title="支持15内模糊搜索与15天外精确搜索" name="identity_number" class="form-control form-control-sm  tooltipTarget" style="width: 150px"  v-model="filterData.identity_number"  placeholder="身份证号"></td>
-                                <td colspan="5"></td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input style="width: 140px" type="date" name="created_at_end" v-model="filterData.created_at_end" :class="filterData.created_at_end?'bg-warning':''" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的结束时间">
-                                </td>
-                                <td >
-                                    <input type="text"  name="mobile_phone" class="form-control form-control-sm tooltipTarget" v-model="filterData.mobile_phone"  :class="filterData.mobile_phone?'bg-warning':''" style="width: 150px" placeholder="电话号"></td>
-                            </tr>
-                            <tr>
-                                <td colspan="9">
+                            <td >
+                                <input :class="filterData.enter_number?'bg-warning':''" type="text" title="支持15内模糊搜索与15天外精确搜索" name="enter_number" class="form-control form-control-sm  tooltipTarget" style="max-width: 200px" v-model="filterData.enter_number"  placeholder="进厂编号">
+                                <input :class="filterData.identity_number?'bg-warning':''" type="text" title="支持15内模糊搜索与15天外精确搜索" name="identity_number" class="form-control form-control-sm  tooltipTarget" style="max-width: 200px"  v-model="filterData.identity_number"  placeholder="身份证号"></td>
+                        </tr>
+                        <tr>
+                            <td colspan="9">
                                     <span class="dropdown">
                                         <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData>0?'btn-dark text-light':'']"
                                                 data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
@@ -72,122 +63,224 @@
                                             <a class="dropdown-item" @click="laborReportExport(2)" href="javascript:">导出所有页</a>
                                         </div>
                                     </span>
-                                    <input hidden type="submit" >
-                                </td>
-                            </tr>
-                        </table>
-                    </form>
-                </div>
-                <div class="">
-                    <table class="table table-sm table-striped table-bordered text-nowrap table-hover">
-                        <tr>
-                            <th>
-                                <label for="all">
-                                    <input id="all" type="checkbox" @click="checkAll($event)">全选
-                                </label>
-                            </th>
-                            <th>序号</th>
-                            {{--                            <th>ID</th>--}}
-                            <th>操作</th>
-                            <th>创建日期</th>
-                            <th  style="background-color: rgb(241, 234, 190)">进厂编号</th>
-                            <th style="background-color: rgb(241, 234, 190)">小组</th>
-                            <th style="background-color: rgb(241, 234, 190)">临时工</th>
-                            <th style="background-color: rgb(241, 234, 190)">电话</th>
-                            <th style="background-color: rgb(241, 234, 190)">身份证号</th>
-                            <th style="background-color: rgb(241, 234, 190)">劳务所</th>
-                            <th>进组时间</th>
-                            <th>审核时间</th>
-                            <th>审核人</th>
-                            <th>退组时间</th>
-                            <th>晚饭打卡(分)</th>
-                            <th>在线时长</th>
-                            <th>本次工作时长</th>
-                        </tr>
-                        <tr v-for="(laborReport,i) in laborReports">
-                            <td>
-                                <input class="checkItem" type="checkbox" :value="laborReport.id" v-model="checkData">
+                                <input hidden type="submit" >
                             </td>
-                            <td>@{{ i+1  }}</td>
-                            <td >
-                                @can('人事管理-门卫审核')
-                                 <span >
-                                <b v-if="laborReport.userDutyCheckVerifyUserId"  class="text-success">门卫已审核</b>
-                                <button v-else class="btn btn-sm btn-outline-secondary"  @click="guardClockAudit(laborReport.userDutyCheckId,laborReport.userDutyCheckType)">门卫审核</button>
+                        </tr>
+                    </table>
+                </form>
+            </div>
+            <div class="">
+                <table class="table table-sm table-hover table-striped table-bordered d-none d-sm-block p-0 text-nowrap" >
+                    <tr>
+                        <th>
+                            <label for="all">
+                                <input id="all" type="checkbox" @click="checkAll($event)">全选
+                            </label>
+                        </th>
+                        <th>序号</th>
+                        {{--                            <th>ID</th>--}}
+                        <th>操作</th>
+                        <th>进场时间</th>
+                        <th>退场时间</th>
+                        <th  style="background-color: rgb(241, 234, 190)">进厂编号</th>
+                        <th style="background-color: rgb(241, 234, 190)">小组</th>
+                        <th style="background-color: rgb(241, 234, 190)">临时工</th>
+                        <th style="background-color: rgb(241, 234, 190)">电话</th>
+                        <th style="background-color: rgb(241, 234, 190)">身份证号</th>
+                        <th style="background-color: rgb(241, 234, 190)">劳务所</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>
+                            <input class="checkItem" type="checkbox" :value="laborReport.id" v-model="checkData">
+                        </td>
+                        <td>@{{ i+1  }}</td>
+                        <td >
+                            @can('人事管理-门卫审核')
+                                <span >
+                                <span v-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.userDutyCheckId)">门卫审核</button>
                                 </span>
-                                @else
-                                    <b v-if="laborReport.userDutyCheckVerifyUserId"  class="text-success">已审核</b>
-                                    <span v-else class="text-center"><b class="text-danger">门卫未审核</b></span>
-                                @endcan
-                                    &nbsp;&nbsp;&nbsp;&nbsp;
-                                @can('人事管理-组长审核')
+                            @else
+                                <span v-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>
-                                <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export&&!laborReport.is_exportReplenish" class="text-info">已退组</b>
-{{--                                 --}}{{-- 正常打卡记录是否已退场--}}
-{{--                                <b v-else-if="laborReport.is_export&&!laborReport.is_exportReplenish" class="text-success">已退场</b>--}}
-{{--                                    --}}{{-- 补卡记录是否已退场--}}
-{{--                                <b v-else-if="laborReport.is_exportReplenish&&!laborReport.is_export" class="text-success">已退场</b>--}}
-                                    <b v-else-if="laborReport.is_exportReplenish || laborReport.is_export" class="text-success">已退场</b>
-                                <button v-else-if="laborReport.userWorkGroupId" @click="groupClockAudit(laborReport.id)" class="btn btn-sm btn-outline-primary">组长审核</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.userWorkGroupId" @click="groupClockAudit(laborReport.id,laborReport.userWorkgroupNeedRemark)" class="btn btn-sm btn-outline-primary">组长审核</button>
                                 </span>
-                                @else
-{{--                                        !laborReport.is_exportReplenish&&!laborReport.is_export   !laborReport.is_exportGroup--}}
-                                        <span  v-if="laborReport.groupUserId&&!laborReport.is_exportGroup"><b class="text-success">在组</b></span>
-                                        <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export&&!laborReport.is_exportReplenish" class="text-info">已退组</b>
-                                        <b v-else-if="laborReport.is_exportReplenish || laborReport.is_export" class="text-success">已退场</b>
-                                        <span v-else-if="laborReport.userWorkGroupId" class="text-center"><b class="text-danger">组长未审核</b></span>
-                                @endcan
-                            </td>
-                            <td class="text-muted">@{{laborReport.created_at}}</td>
-                            <td class="text-muted">@{{laborReport.enterNumber}}</td>
-                            <td>@{{laborReport.userWorkGroupName}}</td>
-                            <td >@{{laborReport.name}}</td>
-                            <td class="text-muted">@{{laborReport.mobilePhone}}</td>
-                            <td class="text-muted">@{{laborReport.identityNumber}}</td>
-                            <td class="text-muted">@{{laborReport.laborCompany}}</td>
-                            <td>@{{laborReport.checkInAt}}</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">@{{laborReport.checkOutAt}}</td>
-                            <td class="text-muted"><span v-if="laborReport.relax_time">@{{laborReport.relax_time}}</span></td>
-                            <td class="text-muted"><span v-if="laborReport.onlineDuration">@{{laborReport.onlineDuration}}</span></td>
-                            <td><span v-if="laborReport.workingDuration">@{{laborReport.workingDuration}}</span></td>
-                        </tr>
-                    </table>
+                            @else
+                                <span  v-if="laborReport.groupUserId&&!laborReport.is_exportGroup"><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.userWorkGroupId" class="text-center"><b class="text-danger">组长未审核</b></span>
+                            @endcan
+                        </td>
+                        <td class="text-muted">@{{laborReport.enter_at}}</td>
+                        <td >@{{ laborReport.exit_at }}</td>
+                        <td class="text-muted">@{{laborReport.enterNumber}}</td>
+                        <td>@{{laborReport.userWorkGroupName}}</td>
+                        <td >@{{laborReport.name}}</td>
+                        <td class="text-muted">@{{laborReport.mobilePhone}}</td>
+                        <td class="text-muted">@{{laborReport.identityNumber}}</td>
+                        <td class="text-muted">@{{laborReport.laborCompany}}</td>
+                        <td>@{{laborReport.checkInAt}}</td>
+                        <td class="text-muted">@{{laborReport.checkOutAt}}</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.onlineDuration">@{{laborReport.onlineDuration}}</span></td>--}}
+                        <td class="text-muted"><span v-if="laborReport.thisRecordOnlineTime">@{{laborReport.thisRecordOnlineTime}}</span></td>
+                        thisRecordWorkingTime
+                        <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>
+                    </tr>
+                </table>
+                <table class="table table-striped table-sm table-bordered table-hover p-0 d-block d-sm-none" style="background: rgb(255, 255, 255);">
+                    <tbody>
+                    <tr v-for="laborReport in laborReports">
+                        <td style="filter:grayscale(30%); ">
+                            <div  class="pl-3 mt-1">
+                                <div style="transform:scale(1)" class="pl-0">
+                                        <span class="mr-3 text-nowrap">
+                                            <span >操作:</span>
+                                            <span >
+                                                @can('人事管理-门卫审核')
+                                                    <span >
+                                <b v-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.userDutyCheckId)">门卫审核</button>
+                                </span>
+                                                @else
+                                                    <b v-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>
+                                <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.userWorkGroupId" @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>
+                                                    <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.userWorkGroupId" class="text-center"><b class="text-danger">组长未审核</b></span>
+                                                @endcan
+                                            </span>
+                                        </span>
+                                    <span class="mr-3   text-nowrap"><span class="text-black">进场时间:</span><span class="text-black-50">@{{laborReport.enter_at  }}</span></span>
+                                    {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">退场时间:</span><span style="color:#af7651">@{{ laborReport.exit_at }}</span></span>--}}
+                                    {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">进场编号:</span><span style="color:#af7651">@{{ laborReport.enterNumber }}</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.mobilePhone }} </span></span>--}}
+                                    {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">身份证号:</span><span style="color:#af7651" v-if="">@{{ laborReport.identityNumber }} </span></span>--}}
+                                    {{--                                    <span class="mr-3 text-nowrap"><span class="text-black">劳务所:</span><span style="color:#af7651" v-if="">@{{ laborReport.laborCompany }} </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.checkOutAt }} </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>--}}
+                                </div>
+                            </div>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </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>
                 </div>
             </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>
+        </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>
+        <!-- 是否晚餐弹框 -->
+        <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
@@ -203,15 +296,20 @@
                 laborReports:[
                         @foreach($laborReports as $laborReport)
                     {id:'{{$laborReport->id}}',enterNumber:'{{$laborReport->enter_number}}'
-                        ,@if($laborReport->userWorkgroup)userWorkGroupId:'{{$laborReport->userWorkgroup->id}}', userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
+                        ,@if($laborReport->userWorkgroup)userWorkGroupId:'{{$laborReport->userWorkgroup->id}}',
+                        userWorkgroupNeedRemark:'{{$laborReport->userWorkgroup->isNeedRemark}}',
+                        userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
                         userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
                         ,mobilePhone:'{{$laborReport->mobile_phone}}',identityNumber:'{{$laborReport->identity_number}}',laborCompany:'{{$laborReport->labor_company}}'
                         ,checkInAt:'{{$laborReport->check_in_at}}', relax_time:'{{$laborReport->relax_time}}',
                         is_exportGroup:'{{$laborReport->is_exportGroup}}',is_export:'{{$laborReport->is_export}}',
-                        is_exportReplenish:'{{$laborReport->is_exportReplenish}}',
                         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)userDutyCheckId:'{{$laborReport->userDutyCheck->id}}', userDutyCheckVerifyUserId:'{{$laborReport->userDutyCheck->verify_user_id}}'
                         ,userDutyCheckType:'{{$laborReport->userDutyCheck->type}}',userDutyCheckAt:'{{$laborReport->userDutyCheck->checked_at}}',@endif},
 
@@ -231,17 +329,40 @@
             },
             mounted:function(){
                 initEcho();
+                //进场
                 Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('ImportEvent',(e)=>{
                     window.location.reload();
                 });
+                //退场
                 Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('ExportEvent',(e)=>{
                     window.location.reload();
                 });
+                //门卫审核
+                Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('GuardAuditEvent',(e)=>{
+                    setTimeout(function (){
+                        window.location.reload();
+                    }, 500);
+                });
+                //组长审核
+                Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('TeamAuditEvent',(e)=>{
+                    setTimeout(function (){
+                        window.location.reload();
+                    }, 500);
+                });
+                //进组
                 this.permittingWorkgroups.forEach(function(workgroup){
                     Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{
                         window.location.reload();
                     });
                 });
+                //退组
+                this.permittingWorkgroups.forEach(function(workgroup){
+                    Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{
+                        setTimeout(function (){
+                            window.location.reload();
+                        }, 500);
+                    });
+                });
                 this.initInputs();
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
                 $('#list').removeClass('d-none');
@@ -325,10 +446,10 @@
                     }
                 },
                 //门卫审核
-                guardClockAudit(id,type){
+                guardClockAudit(id,userDutyCheckId){
                     let url='{{url("laborReport/guardClockAudit")}}';
                     let _this=this;
-                    axios.post(url,{id:id,type:type})
+                    axios.post(url,{id:id,userDutyCheckId:userDutyCheckId})
                         .then(function (response) {
                             if (!response.data.success){
                                 tempTip.setDuration(3000);
@@ -336,7 +457,7 @@
                                 return;
                             }
                             _this.laborReports.every(function (laborReport) {
-                                if (laborReport.userDutyCheckId==id){
+                                if (laborReport.id==id){
                                     laborReport.userDutyCheckVerifyUserId=response.data.data;
                                     tempTip.setDuration(3000);
                                     tempTip.showSuccess('审核通过!');
@@ -349,10 +470,51 @@
                         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){
+                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){
@@ -376,6 +538,38 @@
                         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;
+                                    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")}}';
@@ -396,17 +590,17 @@
                                     laborReport.is_exportGroup=response.data.data.is_exportGroup;
                                     laborReport.onlineDuration=response.data.data.online_duration;
                                     tempTip.setDuration(3000);
-                                    tempTip.showSuccess('退成功!');
+                                    tempTip.showSuccess('退成功!');
                                     return false
                                 }
                                 return true;
                             });
                         }).catch(function (err) {
                         tempTip.setDuration(4000);
-                        tempTip.show('退失败!网络错误:'+err);
+                        tempTip.show('退失败!网络错误:'+err);
                     });
                 },
-                //组长点击退场,不包含晚饭时长情况
+                //组长点击退组,
                 groupExport(id,name){
                     let _this=this;
                     _this.laborReports.every(function (laborReport) {
@@ -418,13 +612,11 @@
                     });
                     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){
-                        if (confirm('是否晚餐')){
-                            selectId(id);
-                            $('#exampleModal').modal('show');
-                            return;
-                        }
+                    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})
@@ -441,14 +633,14 @@
                                     laborReport.is_exportGroup=response.data.data.is_exportGroup;
                                     laborReport.onlineDuration=response.data.data.online_duration;
                                     tempTip.setDuration(3000);
-                                    tempTip.showSuccess('退成功!');
+                                    tempTip.showSuccess('退成功!');
                                     return false
                                 }
                                 return true;
                             });
                         }).catch(function (err) {
-                        tempTip.setDuration(4000);
-                        tempTip.show('退失败!网络错误:'+err);
+                        tempTip.setDuration(5000);
+                        tempTip.show('退失败!网络错误:'+err);
                     });
                 },
                 owner_seek:function (e) {

+ 2 - 2
resources/views/personnel/menu.blade.php

@@ -2,11 +2,11 @@
 <div class="container-fluid nav2" id="nav2">
     <div class="card">
         <ul class="nav nav-pills">
-            @can('人事管理')
+            @can('人事管理-临时工报表')
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('personnel/laborReport')}}" :class="{active:isActive('laborReport',2)}">临时工报表</a>
                 </li> @endcan
-            @can('人事管理')
+            @can('人事管理-打卡相关')
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('personnel/checking-in/createReplenishClock')}}" :class="{active:isActive('checking-in',2)}">打卡相关</a>
                 </li> @endcan

+ 116 - 14
resources/views/process/create.blade.php

@@ -7,19 +7,47 @@
     <div class="container-fluid" id="list">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">
+                <div class="modal fade" id="pasteData" tabindex="-1" role="dialog" aria-labelledby="pasteDataTitle" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
+                        <div class="modal-content">
+                            <div class="modal-header">
+                                <div class="row modal-title font-weight-bold w-100 text-nowrap ml-1 noselect" id="pasteDataTitle">
+                                    <span v-for="(row,i) in rows" draggable="true"
+                                          @drop="drop($event,i)" @dragover="dragover($event)" @dragstart="dragstart($event,i)"
+                                          :class="row=='货主' || row=='品名' || row=='数量' ? 'text-danger' : ''"
+                                          class="col-2 border" style="cursor: move">@{{ row }}</span>
+                                </div>
+                            </div>
+                            <div class="modal-body">
+                                <textarea class="w-100" style="height: 400px;" v-model="pasteData"
+                                placeholder="内容必须为EXCEL复制,请注意表头顺序,可拖拽调整顺序,以该顺序为准"
+                                ></textarea>
+                            </div>
+                            <div class="modal-footer">
+                                <button class="btn btn-dark" @click="importPasteData()">开始导入</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
                 <div class="row">
                     <div class="col-6  rounded mb-2 border" style="background: #efe3d9;">
                         <div class="form-group row mt-2">
                             <label class="col-2 text-right mt-2">原料单据</label>
-                            <input class="form-control col-7" v-model="process.wms_code">&nbsp;&nbsp;&nbsp;
+                            <input class="form-control col-6" v-model="process.wms_code">&nbsp;&nbsp;&nbsp;
                             <button class="btn btn-info btn-sm col-2"  type="button" @click="addProcessContent(false)"> 新增库单据</button>
+                            <button class="btn btn-sm btn-dark col-1 ml-1"
+                                    data-toggle="modal" data-target="#pasteData"><small>外部导入</small></button>
                         </div>
                         <div class="form-group row">
                             <div class="col-10 offset-1 pl-0 pt-2 border rounded bg-light">
                                 <div class="row pt-2 small"><label class="col-3 text-right" >单据号</label>
                                     <b class="col-8" v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type">@{{ processContents[0].wms_code }}</b></div> <!---->
                                 <div class="row pt-2" v-if="processContents.length>0 && processContents[0].addBtnShow && !processContents[0].type">
-                                    <span class="col-12 text-center text-muted small">双击选择商品:</span>
+                                    <span class="col-12 text-center text-muted small">双击选择商品:
+                                        <button class="btn btn-sm btn-outline-info ml-1 mt-0" style="transform: scale(0.8)"
+                                            @click="addAll(processContents[0])"
+                                            >添加所有</button>
+                                    </span>
                                     <span class=" col-11 offset-1 input-group" style=" border-radius: 5px; opacity: 1.5; text-align: center;">
                                         <ul onselectstart="return false;" class="list-group tooltipTarget" style="width: 100%; max-height: 130px; overflow-y: scroll;">
                                             <li  v-for="commodity in processContents[0].commodities" :id="commodity.id"  :style="[{'background-color':processContents[0].commodity_id==commodity.id ? '#9fcdff':'' },{'text-decoration':commodityIds.includes(commodity.id+'_false')? 'line-through red' : ''}]"
@@ -64,9 +92,9 @@
                         </div>
                         <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="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">单据号:</span>
+                                        <span class="font-weight-bold border">单据号:</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>
@@ -194,7 +222,7 @@
                     <label class="col-3 col-form-label text-right" >备注(选填)</label>
                     <textarea v-model="process.remark" type="text" class="form-control col-8"></textarea>
                 </div>
-                <div class="form-group row">
+                {{--<div class="form-group row">
                     <label class="col-3 col-form-label text-right" >引用教程(选填)</label>
                     <span class=" col-8 input-group p-0" style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.7;text-align: center;">
                         <ul class="list-group" style="width: 100%" onselectstart="return false;">
@@ -207,7 +235,7 @@
                             <button type="button" @click="refreshTutorial()" class="btn btn-sm btn-outline-secondary ml-2">刷新</button>
                         </div>
                     </span>
-                </div>
+                </div>--}}
                 <div class="form-group row">
                     <div class="col-8 offset-3 p-0">
                         <input type="button" @click="submit()" class="btn btn-success form-control" value="提交">
@@ -237,14 +265,16 @@
                 msg:false,
                 commodityIds:[],
                 is_delBtn:[],
-                sum:0
+                sum:0,
+                pasteData:'',
+                rows:['货主','单据','品名','SKU','条码','数量'],
             },
             watch:{
                 processContents:{
                     handler(){
                         if (this.processContents.length===1){
                             this.process.owner_id=this.processContents[(this.processContents.length)-1].owner_id;
-                            this.getTutorial(this.processContents[(this.processContents.length)-1].owner_id);
+                            //this.getTutorial(this.processContents[(this.processContents.length)-1].owner_id);
                         }
                     }
                 },
@@ -373,7 +403,7 @@
                         _this.processContents.splice(data,1);
                     });
                 },
-                //获取教程
+                /*//获取教程
                 getTutorial(owner_id){
                     let _this=this;
                     axios.post("{{url('process/ownerGetTutorials')}}"+"/"+owner_id)
@@ -390,7 +420,7 @@
                         tempTip.setDuration(5000);
                         tempTip.show('获取教程失败!网络错误:'+err);
                         });
-                },
+                },*/
                 //选择商品
                 selectedCommodity(commodity,wms_code,type){
                     let _this=this;
@@ -411,7 +441,7 @@
                        return  true;
                     });
                 },
-                //选择教程
+               /* //选择教程
                 selectedTutorial(tutorial){
                     let _this=this;
                     if (tutorial.style){
@@ -441,7 +471,7 @@
                     setTimeout(function(){
                         $(".tooltipTarget").tooltip({'trigger':'hover'});
                     },10);
-                },
+                },*/
                 //异补提交
                 submit(){
                     let _this=this;
@@ -484,7 +514,7 @@
                         tempTip.show('提交失败!网络错误:'+err);
                     });
                 },
-                //去往新增教程
+                /*//去往新增教程
                 addTutorial(){
                     window.open("{{url('maintenance/tutorial/create?owner_id=')}}"+this.process.owner_id);
                 },
@@ -493,7 +523,7 @@
                     if (this.processContents.length>=1 && this.processContents[(this.processContents.length)-1].owner_id){
                         this.getTutorial(this.processContents[(this.processContents.length)-1].owner_id);
                     }
-                },
+                },*/
                 //删除按钮的显示
                 update_delBtn(is_type,wms_code,commodity_id,type){
                     if (is_type) this.$set(this.is_delBtn,wms_code+'_'+commodity_id+'_'+type,true);
@@ -502,6 +532,78 @@
                 update_commodity_name(processContent){
                     this.$set(processContent,'is_update_commodity_name',true);
                 },
+                //添加所有
+                addAll(processContent){
+                    let _this=this;
+                    processContent.commodities.forEach(function (commodity) {
+                        if (!_this.commodityIds.includes(commodity.id+"_"+false)){
+                            let content={};
+                            content['bill_type'] = processContent.bill_type ;
+                            content['commodity_id'] = commodity.id ;
+                            content['wms_code'] = processContent.wms_code ;
+                            content['amount'] = commodity.amount ;
+                            content['commodity_name'] = commodity.name ;
+                            content['commodity_barcodes'] = commodity.barcodes ;
+                            content['commodity_sku'] = commodity.sku ;
+                            content['lineNo'] = commodity.lineNo ;
+                            content['owner_id'] = commodity.owner_id ;
+                            content['owner_name'] = commodity.owner_name ;
+                            content['addBtnShow'] = false ;
+                            content['type'] = false ;
+                            _this.processContents.unshift(content);
+                            _this.commodityIds.push(commodity.id+"_"+content['type']);
+                            _this.sum += Number(commodity.amount);
+                            if (!_this.commodityIds.includes(commodity.id+"_"+true)){
+                                let contentTemp={};
+                                Object.assign(contentTemp,content);
+                                contentTemp['type'] = true;
+                                _this.processContents.unshift(contentTemp);
+                                _this.commodityIds.push(commodity.id+"_"+contentTemp['type']);
+                                _this.sum += Number(commodity.amount);
+                            }
+                        }
+                    });
+                    _this.$delete(_this.processContents,(_this.processContents.length)-1);
+                },
+                importPasteData(){
+                    let _this=this;
+                    if (!this.pasteData){
+                        tempTip.setDuration(3000);
+                        tempTip.show('文本为空!');
+                    }
+                    axios.post('{{url('process/importPasteData')}}',{data:this.pasteData,rows:this.rows})
+                        .then(res=>{
+                            if (res.data.success){
+                                res.data.data.forEach(function (processContent) {
+                                    _this.processContents.unshift(processContent);
+                                    _this.commodityIds.push(processContent.commodity_id+"_"+processContent.type);
+                                    _this.sum += Number(processContent.amount);
+                                });
+                                $('#pasteData').modal('hide');
+                                tempTip.setDuration(2000);
+                                tempTip.showSuccess('导入完毕');
+                            } 
+                        }).catch(err=>{
+                            tempTip.setDuration(4000);
+                            tempTip.showSuccess('网络错误:'+err);
+                        });
+                },
+                dragover(e){
+                    e.preventDefault();
+                },
+                dragstart(e,index){
+                    this.dom = e.target.innerHTML;
+                    e.dataTransfer.setData("text/html",index);
+                },
+                drop(e,index){
+                    e.preventDefault();
+                    if (this.dom != e.target.innerHTML){
+                        this.dom.innerHTML = e.target.innerHTML;
+                        let temp=JSON.parse(JSON.stringify(this.rows[index]));
+                        this.$set(this.rows,index,this.rows[e.dataTransfer.getData('text/html')]);
+                        this.$set(this.rows,Number(e.dataTransfer.getData('text/html')),temp);
+                    }
+                }
             },
         });
     </script>

+ 160 - 58
resources/views/process/index.blade.php

@@ -42,17 +42,7 @@
                            <td>
                                <input id="wms_code" name="wms_code" style="max-width: 200px" title="单据号:支持15内模糊搜索与15天外精确搜索" v-model="filterData.wms_code" class="form-control form-control-sm tooltipTarget" placeholder="单据号" :class="filterData.wms_code?'bg-warning':''">
                            </td>
-                           <td colspan="6"></td>
-                       </tr>
-                       <tr>
-                           <td >
-                               <input id="date_end" name="date_end" style="max-width: 200px" v-model="filterData.date_end" type="date" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的结束时间" :class="filterData.date_end?'bg-warning':''">
-                           </td>
                            <td>
-                               <input name="commodity_barcode" style="max-width: 200px" title="商品条码:支持15内模糊搜索与15天外精确搜索" v-model="filterData.commodity_barcode" class="form-control form-control-sm tooltipTarget" placeholder="商品条码" :class="filterData.commodity_barcode?'bg-warning':''">
-                           </td>
-                           <td >
-                                <div class="form-inline">
                                <select id="status" name="status" v-model="filterData.status" @change="submit" style="max-width: 100px" class="form-control form-control-sm tooltipTarget" :class="filterData.status?'bg-warning':''" >
                                    <option value="" selected>状态</option>
                                    <option value="待审核">待审核</option>
@@ -63,10 +53,24 @@
                                    <option value="待验收">待验收</option>
                                    <option value="交接完成">交接完成</option>
                                </select>
-                                <input hidden name="is_accomplish" v-model="filterData.is_accomplish">
-                               <button class="btn btn-sm btn-outline-dark pull-left ml-5" type="submit">按条件搜索</button></div>
+                               <input hidden name="is_accomplish" v-model="filterData.is_accomplish">
+                           </td>
+                           <td colspan="5"></td>
+                       </tr>
+                       <tr>
+                           <td >
+                               <input id="date_end" name="date_end" style="max-width: 200px" v-model="filterData.date_end" type="date" class="form-control form-control-sm tooltipTarget" title="选择显示指定日期的结束时间" :class="filterData.date_end?'bg-warning':''">
+                           </td>
+                           <td>
+                               <input name="commodity_barcode" style="max-width: 200px" title="商品条码:支持15内模糊搜索与15天外精确搜索" v-model="filterData.commodity_barcode" class="form-control form-control-sm tooltipTarget" placeholder="商品条码" :class="filterData.commodity_barcode?'bg-warning':''">
+                           </td>
+                           <td>
+                               <input name="code" style="max-width: 200px" title="任务号:支持15内模糊搜索与15天外精确搜索" v-model="filterData.code" class="form-control form-control-sm tooltipTarget" placeholder="任务号" :class="filterData.code?'bg-warning':''">
                            </td>
-                           <td colspan="6"></td>
+                           <td >
+                               <button class="btn btn-sm btn-outline-dark pull-left" type="submit">按条件搜索</button>
+                           </td>
+                           <td colspan="5"></td>
                        </tr>
                        <tr>
                            <td colspan="9">
@@ -138,7 +142,7 @@
                         <div class="form-group row">
                             <label for="initial_weight" class="col-3 col-form-label text-right">参与者</label>
                             <div class="col-7">
-                                <input :class="{ 'is-invalid' : errors.user_id }" @change="verifyUserName($event,null,null)" type="text" class="form-control" autocomplete="off" v-model="processDailyParticipantOne.user_detail_full_name" >
+                                <input :class="{ 'is-invalid' : errors.user_id }" @change="verifyUserName($event,null,null,processDailyParticipantOne)" type="text" class="form-control" autocomplete="off" v-model="processDailyParticipantOne.user_detail_full_name" >
                             </div>
                         </div>
                         <div v-if="errors.started_at" class="row"><label class="col-3"></label><small  class="text-danger col-7">@{{ errors.started_at[0] }}</small></div>
@@ -173,7 +177,8 @@
                         <div class="form-group row">
                             <label for="initial_weight" class="col-3 col-form-label text-right">晚饭时间</label>
                             <div class="col-7">
-                                <select :class="{ 'is-invalid' : errors.dinner_duration }" v-model="processDailyParticipantOne.dinner_duration" class="form-control">
+                                <select :class="{ 'is-invalid' : errors.dinner_duration }" :data-old-value="processDailyParticipantOne.dinner_duration" v-model="processDailyParticipantOne.dinner_duration"
+                                        @change="updateDinnerDuration(processDailyParticipantOne,$event)" class="form-control">
                                     <option value="0">无</option>
                                     <option value="30">30分钟</option>
                                     <option value="60">60分钟</option>
@@ -221,12 +226,12 @@
                                 <th>最近打卡时间</th>
                                 <th></th>
                             </tr>
-                            <tr v-for="userLabor in userLabors" v-if="userLabor.user_labor">
+                            <tr v-for="userLabor in userLabors" v-if="userLabor.userLabor">
                                 <td>@{{ userLabor.full_name }}</td>
                                 <td>@{{ userLabor.gender }}</td>
                                 <td>@{{ userLabor.mobile_phone }}</td>
                                 <td>@{{ userLabor.checked_at }}</td>
-                                <td><button @click="selectedUser(userLabor.user_id,userLabor.user_labor.default_hour_price)" class="btn btn-sm btn-success">选择</button></td>
+                                <td><button @click="selectedUser(userLabor)" class="btn btn-sm btn-success">选择</button></td>
                             </tr>
                         </table>
                     </div>
@@ -450,13 +455,11 @@
                                 <td>计时工时</td>
                                 <td>计件数量</td>
                                 <td>备注</td>
-                                <td>打卡工时</td>
-                                <td>工时差</td>
-                                <td>计费工时</td>
-                                <td>审核</td>
-                                <td>详情</td>
+                                <td>当日工资</td>
+                                {{--<td>审核</td>--}}
+                                <td>操作</td>
                             </tr>
-                            <tr  v-for="processDailyParticipant in processDailyParticipants" :id="'processDailyParticipant'+processDailyParticipant.id">
+                            <tr  v-for="(processDailyParticipant,i) in processDailyParticipants" :id="'processDailyParticipant'+processDailyParticipant.id">
                                 <td v-if="processDailyParticipant.rowspan" :rowspan="processDailyParticipant.rowspan"><p >@{{ processDailyParticipant.date }}</p></td>
                                 <td v-if="processDailyParticipant.rowspan"  :rowspan="processDailyParticipant.rowspan">
                                     <div  class="form-inline">
@@ -476,12 +479,12 @@
                                 </td>
                                 <td>
                                     @can("二次加工管理-登记工时")<button v-if="!processDailyParticipant.isAddProcessDailyParticipant && processDailyParticipant.isConfirmBtn" class="btn btn-sm btn-success" @click="submitProcessDailyParticipant(processDailyParticipant.daily_id)">确定</button>
-                                    <button v-if="processDailyParticipant.id && processDailyParticipant.status=='未审核'" class="btn btn-sm btn-outline-info" @click="updateProcessDailyParticipant(processDailyParticipant)">改</button>
+                                    <button v-if="processDailyParticipant.id" class="btn btn-sm btn-outline-info" @click="updateProcessDailyParticipant(processDailyParticipant)">改</button>
                                     @endcan
                                 </td>
                                 <td>
                                     <span v-if="!processDailyParticipant.user_detail_full_name && processDailyParticipant.isAddProcessDailyParticipant==false" >
-                                        <input :class="{ 'is-invalid' : errors.user_id }" :data-original-title="errors.user_id ? errors.user_id : ''"  :id="processDailyParticipant.daily_id+'user_detail_full_name'" class="form-control tooltipTargetError" style="width: 100px" type="text" @change="verifyUserName($event,processDailyParticipant.daily_id,processDailyParticipant.isConfirmBtn)">
+                                        <input :class="{ 'is-invalid' : errors.user_id }" :data-original-title="errors.user_id ? errors.user_id : ''"  :id="processDailyParticipant.daily_id+'user_detail_full_name'" class="form-control tooltipTargetError" style="width: 100px" type="text" @change="verifyUserName($event,processDailyParticipant.daily_id,processDailyParticipant.isConfirmBtn,processDailyParticipant)">
                                         <input hidden  :id="processDailyParticipant.daily_id+'user_id'"/>
                                     </span><span v-else>@{{ processDailyParticipant.user_detail_full_name }}</span></td>
                                 <td>
@@ -501,7 +504,8 @@
                                     </span><span v-else>@{{ processDailyParticipant.unit_price }}</span></td>
                                 <td>
                                     <span v-if="!processDailyParticipant.user_detail_full_name && processDailyParticipant.isAddProcessDailyParticipant==false">
-                                        <select :class="{ 'is-invalid' : errors.dinner_duration }" :data-original-title="errors.dinner_duration ? errors.dinner_duration[0] : ''" :id="processDailyParticipant.daily_id+'dinner_duration'" class="form-control tooltipTargetError" style="width:80px">
+                                        <select :class="{ 'is-invalid' : errors.dinner_duration }" @input="hourFilter(processDailyParticipant.daily_id,true)" :data-original-title="errors.dinner_duration ? errors.dinner_duration[0] : ''"
+                                                :id="processDailyParticipant.daily_id+'dinner_duration'" class="form-control tooltipTargetError" style="width:80px">
                                             <option value="0">无</option>
                                             <option value="30">30分钟</option>
                                             <option value="60">60分钟</option>
@@ -519,14 +523,23 @@
                                     <span v-if="!processDailyParticipant.user_detail_full_name && processDailyParticipant.isAddProcessDailyParticipant==false">
                                         <input :id="processDailyParticipant.daily_id+'remark'" class="form-control" style="width: 100px" type="text">
                                     </span><span v-else>@{{ processDailyParticipant.remark }}</span></td>
-                                <td class="text-danger">@{{ processDailyParticipant.hour }}</td>
-                                <td class="text-danger">@{{ processDailyParticipant.diff }}</td>
-                                <td class="text-danger">@{{ processDailyParticipant.billingHour }}</td>
                                 <td class="text-danger">
+                                    <div v-if="processDailyParticipant.unit_count || processDailyParticipant.hour_count">
+                                        <span v-if="processDailyParticipant.unit_count">@{{ (processDailyParticipant.unit_count)*(processDailyParticipant.unit_price) }}</span>
+                                        <span v-else>@{{ (processDailyParticipant.hour_count)*(processDailyParticipant.hour_price) }}</span>
+                                    </div>
+                                </td>
+                            {{--    <td class="text-danger">
                                     @can("人事管理-任务审核")<button @click="processDailyParticipantAudit(processDailyParticipant.id)" v-if="processDailyParticipant.status=='未审核'" class="btn btn-sm btn-outline-success">审核</button>@endcan
                                     <b v-else class="text-success">@{{ processDailyParticipant.status }}</b>
+                                </td>--}}
+                                <td>
+                                    <div v-if="processDailyParticipant.user_detail_full_name">
+                                        @can("二次加工管理-临时工资料管理")<u class="text-info" style="cursor:pointer"
+                                                                 @click="showUserDetail(processDailyParticipant.user_id)">详情</u>@endcan
+                                        <button class="btn btn-sm btn-outline-danger" @click="deleteDailyParticipant(i)">删</button>
+                                    </div>
                                 </td>
-                                @can("二次加工管理-临时工资料管理")<td class="text-info"><u v-if="processDailyParticipant.user_detail_full_name" style="cursor:pointer" @click="showUserDetail(processDailyParticipant.user_id)">详情</u></td>@endcan
                             </tr>
                         </table>
                     </td>
@@ -564,7 +577,7 @@
                 ],
                 errors:{},
                 checkData:[],
-                filterData:{paginate:50,date_start:'',date_end:'',owner_id:'',commodity_barcode:'',wms_code:'',status:'',is_accomplish:''},
+                filterData:{paginate:50,date_start:'',date_end:'',owner_id:'',commodity_barcode:'',wms_code:'',status:'',is_accomplish:'',code:''},
                 processDailies:[],
                 processDailyParticipants:[],
                 isShow:{
@@ -612,8 +625,21 @@
                 this.resetProcessData();
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
                 $('#process').removeClass('d-none');
-                var today=new Date();
+                let today=new Date();
                 this.today = today.getFullYear() + "-" + ((today.getMonth() + 1) < 10 ? "0"+(today.getMonth() + 1) : (today.getMonth() + 1)) + "-" + today.getDate();
+                function focusin() {
+                    if(isJustBack())location.reload();
+                }
+                window.enterAt=(new Date()).getTime();
+                function isJustBack() {
+                    let nowAt=(new Date()).getTime();
+                    return (nowAt-window.enterAt)<600;
+                }
+                if ("onfocusin" in document){//for IE
+                    document.onfocusin = focusin;
+                } else {
+                    window.onfocus= focusin;
+                }
             },
             methods: {
                 arrayFilter: function (processesContents, process) {
@@ -849,7 +875,6 @@
                 },
                 //取消录入参与人
                 deleteProcessDailyParticipant($event, daily_id, processDailyParticipant_name, isConfirmBtn) {
-                    console.log($event, daily_id, processDailyParticipant_name, isConfirmBtn);
                     if (!isConfirmBtn) {
                         this.processDailyParticipants.every(function (processDailyParticipant) {
                             if (processDailyParticipant.daily_id == daily_id) {
@@ -1019,35 +1044,44 @@
                     });
                 },
                 //验证临时工
-                verifyUserName(e, daily_id, isConfirmBtn) {
+                verifyUserName(e, daily_id, isConfirmBtn,processDailyParticipant) {
                     let user = e.target.value;
                     let _this = this;
-                    axios.post('{{url('process/verifyUserName')}}', {userName: user})
+                    axios.post('{{url('process/verifyUserName')}}',
+                        {userName: user,id:processDailyParticipant.id,date:processDailyParticipant.date})
                         .then(function (response) {
+                            if (!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
                             //修改时验证
                             if (!daily_id) {
                                 //验证失败
-                                if (response.data.length < 1) {
+                                if (response.data.data.length < 1) {
                                     _this.isShow.isUpdateConfirmBtn = false;
                                     _this.errors['user_id'] = "查无此人,请检查您的输入";
                                     return;
                                 }
                                 //验证成功且结果仅有一个
-                                if (response.data.user_id) {
+                                if (response.data.data.user_id) {
                                     _this.isShow.isUpdateConfirmBtn = true;
                                     _this.errors['user_id'] = "";
-                                    _this.processDailyParticipantOne.user_id = response.data.user_id;
+                                    _this.processDailyParticipantOne.user_id = response.data.data.user_id;
+                                    _this.processDailyParticipantOne.started_at = response.data.data.started_at;
+                                    _this.processDailyParticipantOne.ended_at = response.data.data.ended_at;
+                                    _this.hourFilter(_this.processDailyParticipantOne,false);
                                     return;
                                 }
                                 //验证成功多结果
-                                if (response.data.length > 1) {
-                                    _this.userLabors = response.data;
+                                if (response.data.data.length > 1) {
+                                    _this.userLabors = response.data.data;
                                     $("#myModal").modal('show');
                                     return;
                                 }
                             }
                             //验证失败
-                            if (response.data.length < 1) {
+                            if (response.data.data.length < 1) {
                                 _this.processDailyParticipants.every(function (processDailyParticipant) {
                                     if (processDailyParticipant.daily_id == daily_id) {
                                         _this.errors['user_id'] = "查无此人,请检查您的输入";
@@ -1073,14 +1107,17 @@
                             }
                             _this.modalDaily_id = daily_id;
                             //验证成功且结果仅有一个
-                            if (response.data.user_id) {
+                            if (response.data.data.user_id) {
                                 _this.errors['user_id'] = "";
-                                $("#" + daily_id + "user_id").val(response.data.user_id);
-                                $("#" + daily_id + "hour_price").val(response.data.user_labor.default_hour_price);
+                                $("#" + daily_id + "user_id").val(response.data.data.user_id);
+                                $("#" + daily_id + "hour_price").val(response.data.data.user_labor.default_hour_price);
+                                if (response.data.data.started_at) $("#" + daily_id + "started_at").val(response.data.data.started_at);
+                                if (response.data.data.ended_at) $("#" + daily_id + "ended_at").val(response.data.data.ended_at);
+                                _this.hourFilter(daily_id,true);
                             }
                             //验证成功多结果
                             if (response.data.length > 1) {
-                                _this.userLabors = response.data;
+                                _this.userLabors = response.data.data;
                                 $("#myModal").modal('show');
                             }
                         }).catch(function (err) {
@@ -1097,14 +1134,16 @@
                         let ended_at = new Date('2020/1/1 ' + $('#' + processDailyParticipant + 'ended_at')[0].value).getTime();
                         let hour_count = (ended_at - started_at) / 3600000;
                         if (started_at < start && ended_at > end) hour_count -= 1;
-                        $('#' + processDailyParticipant + 'hour_count')[0].value = hour_count;
+                        let dinner_duration=Number($('#' + processDailyParticipant + 'dinner_duration')[0].value)/60;
+                        $('#' + processDailyParticipant + 'hour_count')[0].value = (hour_count - dinner_duration).toFixed(1);
                         return;
                     }
                     let started_at = new Date('2020/1/1 ' + processDailyParticipant.started_at).getTime();
                     let ended_at = new Date('2020/1/1 ' + processDailyParticipant.ended_at).getTime();
                     let hour_count = (ended_at - started_at) / 3600000;
                     if (started_at < start && ended_at > end) hour_count -= 1;
-                    processDailyParticipant.hour_count = hour_count;
+                    let dinner_duration=Number(processDailyParticipant.dinner_duration) / 60;
+                    processDailyParticipant.hour_count = (hour_count - dinner_duration).toFixed(1);
                 },
                 //提交参与人
                 submitProcessDailyParticipant(e) {
@@ -1126,10 +1165,14 @@
                     if (remark) request['remark'] = remark;
                     request['daily_id'] = this.modalDaily_id;
                     let _this = this;
-                    axios.post("{{url('process/shortProcessDailyParticipant')}}", request)
+                    axios.post("{{url('process/storeProcessDailyParticipant')}}", request)
                         .then(function (response) {
-                            if (response.data.status == "error") {
+                            if (response.data.status === 'warning'){
                                 tempTip.setDuration(3000);
+                                tempTip.show(response.data.data);
+                                return;
+                            }
+                            if (response.data.status === "error") {
                                 _this.errors = response.data.data;
                                 setTimeout(function () {
                                     $(".tooltipTargetError").tooltip('show');
@@ -1181,14 +1224,18 @@
                     })
                 },
                 //同名临时工选择
-                selectedUser(user_id, hour_price) {
+                selectedUser(userLabor) { // TODO:此处如返回开始与结束时间 计时工时并不会发生改变
                     $("#myModal").modal('hide');
                     this.errors['user_id'] = "";
-                    this.processDailyParticipantOne['user_id'] = user_id;
-                    this.processDailyParticipantOne['hour_price'] = hour_price;
+                    this.processDailyParticipantOne['user_id'] = userLabor.user_id;
+                    this.processDailyParticipantOne['hour_price'] = userLabor.userLabor.default_hour_price;
+                    this.processDailyParticipantOne['started_at'] = userLabor.started_at;
+                    this.processDailyParticipantOne['ended_at'] = userLabor.ended_at;
                     this.isShow.isUpdateConfirmBtn = true;
-                    $("#" + this.modalDaily_id + "user_id").val(user_id);
-                    $("#" + this.modalDaily_id + "hour_price").val(hour_price);
+                    $("#" + this.modalDaily_id + "user_id").val(userLabor.user_id);
+                    $("#" + this.modalDaily_id + "hour_price").val(userLabor.userLabor.default_hour_price);
+                    $("#" + this.modalDaily_id + "started_at").val(userLabor.started_at);
+                    $("#" + this.modalDaily_id + "ended_at").val(userLabor.ended_at);
                 },
                 //修改参与人
                 updateProcessDailyParticipant(processDailyParticipant) {
@@ -1245,7 +1292,7 @@
                         tempTip.show('修改参与人发生了一些严重错误:' + err);
                     })
                 },
-                //登记工时参与人审核
+                {{--//登记工时参与人审核
                 processDailyParticipantAudit(id) {
                     if (!confirm('审核后不能撤销及修改,确定通过审核吗?')) {
                         return
@@ -1272,7 +1319,7 @@
                         tempTip.setDuration(5000);
                         tempTip.show('审核参与人发生了一些严重错误:' + err);
                     });
-                },
+                },--}}
                 //临时工详情
                 showUserDetail(id) {
                     window.open("{{url('maintenance/userLabor')}}/" + id);
@@ -1489,11 +1536,10 @@
                     axios.post('{{url('process/updateUnitPrice')}}', {id: process.id, unit_price: unit_price})
                         .then(function (response) {
                             if (response.data.success) {
-                                process.unit_price = response.data.data;
                                 process.signs.push(response.data.sign);
                                 process.is_update_unit_price = false;
                                 tempTip.setDuration(2000);
-                                tempTip.showSuccess('“' + process.code + "”价格修改成功!");
+                                tempTip.showSuccess('“' + process.code + "”价格修改成功,确认通过后生效!");
                                 return;
                             }
                             tempTip.setDuration(3000);
@@ -1577,6 +1623,62 @@
                             tempTip.show('网络错误:'+err);
                         })
                 },
+                resetProcessDailyParticipants(index){
+                    if (this.processDailyParticipants[index].daily_id){
+                        if (this.processDailyParticipants[index+1] && !this.processDailyParticipants[index+1].daily_id){
+                            this.processDailyParticipants[index+1].daily_id=this.processDailyParticipants[index].daily_id;
+                            this.processDailyParticipants[index+1].date=this.processDailyParticipants[index].date;
+                            this.processDailyParticipants[index+1].isAddProcessDailyParticipant=this.processDailyParticipants[index].isAddProcessDailyParticipant;
+                            this.processDailyParticipants[index+1].isConfirmBtn=this.processDailyParticipants[index].isConfirmBtn;
+                            this.processDailyParticipants[index+1].output=this.processDailyParticipants[index].output;
+                            this.processDailyParticipants[index+1].process_id=this.processDailyParticipants[index].process_id;
+                            this.processDailyParticipants[index+1].readonly=this.processDailyParticipants[index].readonly;
+                            this.processDailyParticipants[index+1].remain=this.processDailyParticipants[index].remain;
+                            this.processDailyParticipants[index+1].rowspan=this.processDailyParticipants[index].rowspan - 1;
+                            this.processDailyParticipants[index+1].submitOutput=this.processDailyParticipants[index].submitOutput;
+                            this.$delete(this.processDailyParticipants,index);
+                        }else{
+                            let processDailyParticipant = {
+                                'daily_id': this.processDailyParticipants[index].daily_id,
+                                'date': this.processDailyParticipants[index].date,
+                                'isAddProcessDailyParticipant': this.processDailyParticipants[index].isAddProcessDailyParticipant,
+                                'isConfirmBtn': this.processDailyParticipants[index].isConfirmBtn,
+                                'output': this.processDailyParticipants[index].output,
+                                'process_id': this.processDailyParticipants[index].process_id,
+                                'readonly': this.processDailyParticipants[index].readonly,
+                                'remain': this.processDailyParticipants[index].remain,
+                                'rowspan': this.processDailyParticipants[index].rowspan,
+                                'submitOutput': this.processDailyParticipants[index].submitOutput,
+                            };
+                            this.$set(this.processDailyParticipants,index,processDailyParticipant);
+                        }
+                    }
+                    else this.$delete(this.processDailyParticipants,index);
+                },
+                deleteDailyParticipant(index){
+                    let _this=this;
+                    if (!confirm('确定要删除“' + _this.processDailyParticipants[index].user_detail_full_name + "”的工作记录吗?"))return;
+                    axios.delete('{{url('process/destroyDailyParticipant')}}/'+_this.processDailyParticipants[index].id)
+                        .then(res=>{
+                            if (res.data.success){
+                                _this.resetProcessDailyParticipants(index);
+                                tempTip.setDuration(2000);
+                                tempTip.showSuccess('删除“'+_this.processDailyParticipants[index].user_detail_full_name+'”的工作记录成功!');
+                                return;
+                            }
+                            tempTip.setDuration(3000);
+                            tempTip.show(res.data.data);
+                        }).catch(err=>{
+                            tempTip.setDuration(4000);
+                            tempTip.show('网络错误:'+err);
+                        })
+                },
+                //修改时的晚饭时间改变计时工时
+                updateDinnerDuration(processDailyParticipantOne,e){
+                    let oldValue=Number(e.target.dataset.oldValue) / 60;
+                    let newValue=Number(processDailyParticipantOne.dinner_duration) / 60;
+                    processDailyParticipantOne.hour_count += (oldValue-newValue);
+                },
             },
         });
     </script>

+ 0 - 1
resources/views/waybill/edit.blade.php

@@ -540,7 +540,6 @@
                             function (response) {
 
                                 if (response.data.error){
-                                    //console.log(response.data.error);
                                     _this.errors=response.data.error;return;}
 
                                 if (!response.data.success) {

+ 7 - 1
routes/web.php

@@ -187,7 +187,7 @@ Route::group(['prefix'=>'process'],function(){
     //修改每日产量
     Route::post('updateDailyOutput','ProcessController@updateDailyOutput');
     //添加参与人
-    Route::post('shortProcessDailyParticipant','ProcessController@shortProcessDailyParticipant');
+    Route::post('storeProcessDailyParticipant','ProcessController@storeProcessDailyParticipant');
     //验证参与人
     Route::post('verifyUserName','ProcessController@verifyUserName');
     //修改参与人
@@ -228,6 +228,10 @@ Route::group(['prefix'=>'process'],function(){
     Route::post('updateStartDate','ProcessController@updateStartDate');
     //修改终止日期
     Route::post('updateEndDate','ProcessController@updateEndDate');
+    //删除临时工工作记录
+    Route::delete('destroyDailyParticipant/{id}','ProcessController@destroyDailyParticipant');
+    //导入粘贴商品数据
+    Route::post('importPasteData','ProcessController@importPasteData');
 });
 //process主方法 restful
 Route::resource('process','ProcessController');
@@ -244,6 +248,8 @@ Route::group(['prefix'=>'laborReport'],function(){
     Route::post('guardClockAudit','LaborReportController@guardClockAudit');
     //组长打卡审核
     Route::post('groupClockAudit','LaborReportController@groupClockAudit');
+    //组长打卡审核(特定组添加备注)
+    Route::post('addRemarkAndGroupClock','LaborReportController@addRemarkAndGroupClock');
     //组长点击退场
     Route::post('groupExport','LaborReportController@groupExport');
     //组长点击退场,是否包含晚饭时间情况

Some files were not shown because too many files changed in this diff