Эх сурвалжийг харах

二次加工功能补全,BUG待测试

Zhouzhendong 6 жил өмнө
parent
commit
3da7a65ca5
50 өөрчлөгдсөн 3089 нэмэгдсэн , 375 устгасан
  1. 406 51
      app/Http/Controllers/ProcessController.php
  2. 124 0
      app/Http/Controllers/ProcessStatisticController.php
  3. 12 8
      app/Http/Controllers/TestController.php
  4. 148 0
      app/Http/Controllers/UserDutyCheckController.php
  5. 166 0
      app/Http/Controllers/UserLaborController.php
  6. 34 0
      app/Http/Controllers/api/thirdPart/flux/ProcessController.php
  7. 3 0
      app/Process.php
  8. 8 0
      app/ProcessDaily.php
  9. 7 2
      app/ProcessDailyParticipant.php
  10. 5 0
      app/ProcessStatistic.php
  11. 12 0
      app/UserDetail.php
  12. 4 9
      app/UserDutyCheck.php
  13. 3 2
      app/UserLabor.php
  14. 10 12
      bootstrap/cache/services.php
  15. 1 0
      composer.json
  16. 532 58
      composer.lock
  17. 0 151
      config/UEditorUpload.php
  18. 0 1
      config/app.php
  19. 7 0
      config/hr.php
  20. 1 1
      database/migrations/2020_03_25_164138_create_process_statistics_table.php
  21. 1 1
      database/migrations/2020_03_25_164322_create_user_duty_checks_table.php
  22. 5 0
      database/migrations/2020_04_09_111337_add_tutorial_authority.php
  23. 6 0
      database/migrations/2020_04_09_111540_change_tutorial_table.php
  24. 1 1
      resources/js/utilities/datetimeRelating.js
  25. 29 49
      resources/views/maintenance/city/create.blade.php
  26. 4 0
      resources/views/maintenance/menu.blade.php
  27. 99 0
      resources/views/maintenance/userLabor/edit.blade.php
  28. 191 0
      resources/views/maintenance/userLabor/index.blade.php
  29. 59 0
      resources/views/maintenance/userLabor/show.blade.php
  30. 22 0
      resources/views/process/checking-in/clock.blade.php
  31. 105 0
      resources/views/process/checking-in/clockAudit.blade.php
  32. 131 0
      resources/views/process/checking-in/createReplenishClock.blade.php
  33. 44 0
      resources/views/process/checking-in/createUserDetail.blade.php
  34. 16 0
      resources/views/process/checking-in/menuChecking-in.blade.php
  35. 184 0
      resources/views/process/checking-in/missionAudit.blade.php
  36. 13 0
      resources/views/process/checking-in/success.blade.php
  37. 302 6
      resources/views/process/create.blade.php
  38. 61 15
      resources/views/process/index.blade.php
  39. 2 2
      resources/views/process/menu.blade.php
  40. 4 0
      resources/views/process/menuProcess.blade.php
  41. 276 0
      resources/views/process/statistic.blade.php
  42. 0 0
      resources/views/vendor/UEditor/.gitkeep
  43. 0 4
      resources/views/vendor/UEditor/head.blade.php
  44. 6 0
      routes/api/thirdPart/flux.php
  45. 41 2
      routes/web.php
  46. 4 0
      tests/webApi/test.http
  47. BIN
      其它.mp3
  48. BIN
      圆通快递.mp3
  49. BIN
      韵达快递.mp3
  50. BIN
      顺丰.mp3

+ 406 - 51
app/Http/Controllers/ProcessController.php

@@ -7,6 +7,9 @@ use App\Owner;
 use App\Process;
 use App\ProcessDaily;
 use App\ProcessDailyParticipant;
+use App\ProcessesContent;
+use App\ProcessMethod;
+use App\ProcessStatistic;
 use App\Tutorial;
 use App\UserDetail;
 use App\UserDutyCheck;
@@ -18,6 +21,7 @@ use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Validator;
 use Maatwebsite\Excel\Facades\Excel;
+use Ramsey\Uuid\Uuid;
 
 class ProcessController extends Controller
 {
@@ -41,7 +45,12 @@ class ProcessController extends Controller
             $processes=$processes->where('owner_id',$request->input('owner_id'));
         }
         if ($request->input('wms_code')){
-            $processes=$processes->where('wms_code','like','%'.$request->input('wms_code').'%')->where('created_at','>',$today->format('Y-m-d'));
+            $wms_code=$request->input('wms_code');
+            $date=$today->format('Y-m-d');
+            $processes=$processes->whereHas('processesContents',function (Builder $builder)use ($wms_code,$date){
+                $builder->where('wms_code','like','%'.$wms_code.'%')
+                    ->where('created_at','>',$date);
+            });
         }
         $processes=$processes->paginate($request->input('paginate')??50);
         return $processes;
@@ -62,7 +71,7 @@ class ProcessController extends Controller
         }
         $processes=$this->conditionQuery($request,$processes);
         $owners=Owner::select('id','name')->get();
-        return view('process.index',['processes'=>$processes,'owners'=>$owners]);
+        return view('process.index',['processes'=>$processes,'owners'=>$owners,'request'=>$request->input()]);
     }
 
 
@@ -87,7 +96,7 @@ class ProcessController extends Controller
         $id=$request->input('id');
         $processDailies=ProcessDaily::with(['processDailyParticipants','process'])->orderBy('date','DESC')
             ->where('process_id',$id)->get();
-        if ($processDailies){
+        if (count($processDailies)>0){
             $result=$this->createDeficiencyData($processDailies,$today);
             if ($result){
                 $processDailies=ProcessDaily::with(['processDailyParticipants','process'])
@@ -137,10 +146,11 @@ class ProcessController extends Controller
             $diff=abs(round($processDailyParticipant->hour_count-$hour,2));
             $processDailyParticipant->diff=$diff;
         }
-        //计件工
-        if ($processDailyParticipant->unit_price){
+
+        //计件工 保留
+        /*if ($processDailyParticipant->unit_count){
             return $processDailyParticipant;
-        }
+        }*/
         if ($hour&&$hour>8){
             $processDailyParticipant->billingHour=8;
             return $processDailyParticipant;
@@ -163,7 +173,6 @@ class ProcessController extends Controller
     }
     //生成二次加工单缺失时间记录及本日记录
     public function createDeficiencyData($processDailies,$today){
-        if (!$processDailies||!$today)return false;
         $processDailiesArr=[];
         foreach ($processDailies as $processDaily){
             $processDailiesArr[$processDaily->date]=$processDaily;
@@ -203,7 +212,16 @@ class ProcessController extends Controller
     //接单
     public function receive($id){
         if(!Gate::allows('二次加工管理-接单与驳回')){ return redirect(url('/'));  }
-        $process=Process::select('id','status')->find($id);
+        $process=Process::select('id','status','amount')->find($id);
+        $amount=$process->amount;
+        $today=Carbon::now()->format('Y-m-d');
+        $processDaily=new ProcessDaily([
+            'process_id'=>$id,
+            'date'=>$today,
+            'output'=>0,
+            'remain'=>$amount,
+        ]);
+        $processDaily->save();
         $process->status="待加工";
         $process->update();
         $this->log(__METHOD__,"接单二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
@@ -212,12 +230,48 @@ class ProcessController extends Controller
     //完成
     public function accomplish($id){
         if(!Gate::allows('二次加工管理-验收完成')){ return redirect(url('/'));  }
-        $process=Process::select('id','status')->find($id);
+        $process=Process::with('processDailies')->find($id);
+        if (count($process->processDailies)>0){
+            $completed_amount=0;
+            foreach ($process->processDailies as $processDaily){
+                $completed_amount=$completed_amount+($processDaily->output);
+            }
+            $process->completed_amount=$completed_amount;
+        }
         $process->status="已完成";
         $process->update();
-        $this->log(__METHOD__,"完成二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
+
+        //统计:
+        $revenue=($process->unit_price)*($process->completed_amount);   //收入合计
+        $processDailies=ProcessDaily::with('processDailyParticipants')->where('process_id',$id)->where('output','>',0)->get();
+        $duration_days=count($processDailies);      //完成天数
+        $duration_man_hours=0;      //总工时
+        $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);
+                if ($processDailyParticipant->unit_count){
+                    $total_cost=$total_cost+(($processDailyParticipant->unit_count)*($processDailyParticipant->unit_price));
+                    continue;
+                }
+                $total_cost=$total_cost+(($processDailyParticipant->billingHour)*($processDailyParticipant->hour_price));
+            }
+        };
+        $gross_profit=$revenue-$total_cost; //毛利润
+        $gross_profit_rate=$gross_profit/$revenue;  //毛利率
+        $processStatistic=ProcessStatistic::find($id);
+        $processStatistic->revenue=$revenue;
+        $processStatistic->duration_days=$duration_days;
+        $processStatistic->duration_man_hours=$duration_man_hours;
+        $processStatistic->total_cost=$total_cost;
+        $processStatistic->gross_profit=$gross_profit;
+        $processStatistic->gross_profit_rate=$gross_profit_rate;
+        $processStatistic->update();
+        $this->log(__METHOD__,"完成二次加工单_".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
         return $process;
     }
+
     //修改当日产量
     public function updateDailyOutput(Request $request){
         if(!Gate::allows('二次加工管理-登记工时')){ return redirect(url('/'));  }
@@ -226,15 +280,64 @@ class ProcessController extends Controller
         $id=$request->input('id');
         $output=$request->input('output');
         $processDaily=ProcessDaily::with('process')->find($id);
-        $remain=$this->countRemain($processDaily);
         $processDaily->output=$output;
-        $processDaily->remain=$remain;
         $processDaily->update();
+        $result=$this->countRemains($processDaily);
+        $processDailies=$result['processDailies'];
+        //$remain=$this->countRemain($processDaily);
+        //$processDaily->remain=$remain;
         $this->log(__METHOD__,"修改当日产量".__FUNCTION__,json_encode($processDaily),Auth::user()['id']);
-        return ['status'=>"success",'data'=>$processDaily];
+        $response=[];
+        $response['status']='success';
+        $response['data']=$processDailies;
+        if (isset($result['process'])){$response['process']=$result['process'];}
+        return $response;
     }
+    //每次修改,去查询该单下全部日期,逐个替换,前一天剩余减当天产量为当天剩余,无前天记录去拿单子预期产量
+    public function countRemains($processDaily){
+        if (!$processDaily || !$processDaily->process) return;
+        $processDailies=ProcessDaily::where('process_id',$processDaily->process_id)->orderBy('date')->get();
+        for ($i=0;$i<count($processDailies);$i++){
+            if ($i==0&&$processDailies[$i]->date>=$processDaily->date){
+                $processDailies[$i]->remain=($processDaily->process->amount)-$processDailies[$i]->output;
+                $processDailies[$i]->update();
+            }
+            if ($i>0&&$processDailies[$i]->date>=$processDaily->date){
+                $processDailies[$i]->remain=($processDailies[$i-1]->remain)-$processDailies[$i]->output;
+                $processDailies[$i]->update();
+            }
+        }
 
-    //计算当日剩余  根据日期
+        //同步二次加工单统计
+        $processDailiesStatistic=$processDailies->where('output'>0);
+        $processStatistic=ProcessStatistic::find($processDaily->process_id);
+        $processStatistic->top_capacity=$processDailiesStatistic->max('output');
+        $processStatistic->bottom_capacity=$processDailiesStatistic->min('output');
+        $processStatistic->average_capactiy=$processDailiesStatistic->avg('output');
+        $processStatistic->update();
+        //修改二次加工单状态
+        $result=[];
+        if (count($processDailies)>0 && ($processDailies[(count($processDailies)-1)]->remain)<=0){
+            $result['process']=$this->changeProcessCheck($processDaily->process_id);
+        }
+        $result['processDailies']=$processDailies;
+        return $result;
+    }
+
+    //剩余小于等于0,状态待验收
+    public function changeProcessCheck($process_id){
+        $process=Process::select('id','status')->find($process_id);
+        if ($process->status=="加工中"){
+            $process->ended_at="待验收";
+            $process->update();
+            $processStatistic=ProcessStatistic::find($process_id);
+            $processStatistic->started_at=date('Y-m-d H:i:s');
+            $processStatistic->update();
+            $this->log(__METHOD__,"二次加工单待验收".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
+        }
+        return $process_id;
+    }
+    /*//计算当日剩余  根据日期
     public function countRemain($processDaily){
         if (!$processDaily || !$processDaily->process) return;
         $processDailies=ProcessDaily::where('process_id',$processDaily->process_id)
@@ -244,7 +347,7 @@ class ProcessController extends Controller
             $sum=$sum+($processDaily->output);
         }
         return ($processDaily->process->amount)-$sum;
-    }
+    }*/
     //添加参与人
     public function shortProcessDailyParticipant(Request $request){
         if(!Gate::allows('二次加工管理-登记工时')){ return redirect(url('/'));  }
@@ -274,10 +377,23 @@ class ProcessController extends Controller
         ]);
         $processDailyParticipant->save();
         $this->log(__METHOD__,"添加新参与人".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
-        $processDaily=ProcessDaily::select('date')->find($daily_id);
+        $result=[];
+        $processDaily=ProcessDaily::with('process')->select('process_id','date')->find($daily_id);
         $date=$processDaily->date;
         $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$date);
-        return ['status'=>"success",'data'=>$processDailyParticipant];
+        if ($processDaily->process && $processDaily->process->status=="待加工"){
+            $process=Process::find($processDaily->process_id);
+            $process->status="加工中";
+            $process->update();
+            $result['process']=$processDaily->process_id;
+            $processStatistic=ProcessStatistic::find($processDaily->process_id);
+            $processStatistic->started_at=date('Y-m-d H:i:s');
+            $processStatistic->update();
+            $this->log(__METHOD__,"二次加工单加工中".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
+        }
+        $result['status']="success";
+        $result['data']=$processDailyParticipant;
+        return $result;
     }
 
     //验证参与人
@@ -311,8 +427,8 @@ 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('process_daily')->find($id);
-        if (!$processDailyParticipant || ! $processDailyParticipant->process_daily) return ['status'=>"error",'data'=>"修改失败,该信息不存在"];
+        $processDailyParticipant=ProcessDailyParticipant::with('processDaily')->find($id);
+        if (!$processDailyParticipant || ! $processDailyParticipant->processDaily) return ['status'=>"error",'data'=>"修改失败,该信息不存在"];
         $processDailyParticipant->user_id=$request->input('user_id');
         $processDailyParticipant->started_at=$request->input('started_at');
         $processDailyParticipant->ended_at=$request->input('ended_at');
@@ -324,7 +440,7 @@ 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->process_daily->date);
+        $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyParticipant->processDaily->date);
         return ['status'=>"success",'data'=>$processDailyParticipant];
     }
     //参与人审核
@@ -337,13 +453,13 @@ class ProcessController extends Controller
         $this->log(__METHOD__,"登记工时参与人审核".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
         return ['success'=>'true','processDailyParticipant'=>$processDailyParticipant];
     }
-    //临时工详情
+    /*//临时工详情
     public function showUserDetail(Request $request){
         $id=$request->input('user_id');
         $userDetail=UserDetail::with('user_labor')->find($id);
         if (!$userDetail) return ['success'=>'false'];
         return ['success'=>'true','userDetail'=>$userDetail];
-    }
+    }*/
     //获取全部教程
     public function getTutorials($id){
         $process=Process::with('tutorials')->find($id);
@@ -365,6 +481,7 @@ class ProcessController extends Controller
         $tutorial=Tutorial::find($tutorial_id);
         if (!$tutorial)return ['success'=>'false','data'=>'未找到相关教程!'];
         $tutorial->processes()->syncWithoutDetaching([$process_id]);
+        $this->log(__METHOD__,"添加教程关联".__FUNCTION__,json_encode($process_id),Auth::user()['id']);
         return ['success'=>'true','data'=>$tutorial];
     }
     //删除教程关联
@@ -373,6 +490,7 @@ class ProcessController extends Controller
         $tutorial_id=$request->input('tutorial_id');
         if (!$process_id || !$tutorial_id) return ['success'=>'false','data'=>'二次加工或教程传递错误!'];
         DB::table('process_tutorial')->where('process_id',$process_id)->where('tutorial_id',$tutorial_id)->delete();
+        $this->log(__METHOD__,"删除教程关联".__FUNCTION__,json_encode($process_id),Auth::user()['id']);
         return ['success'=>'true'];
     }
     /**
@@ -382,18 +500,181 @@ class ProcessController extends Controller
      */
     public function create()
     {
-        return view('process/create');
+        $processMethods=ProcessMethod::get();
+        return view('process/create',['processMethods'=>$processMethods]);
+    }
+
+    //货主ID获取教程
+    public function ownerGetTutorials($owner_id){
+        $tutorials=Tutorial::where('owner_id',$owner_id)->get();
+        return $tutorials;
+    }
+
+    //考勤
+    public function createReplenishClock(){
+        return view('process/checking-in/createReplenishClock');
+    }
+    //搜索临时工下打卡信息
+    public function checkUserLabors(Request $request){
+        $full_name=$request->input('full_name');
+        $userDetail=UserDetail::with(['userDutyChecks'=>function ($query){
+            return $query->orderBy('checked_at','DESC')->limit(5);
+        }])->where('full_name',$full_name)->get();
+        return ['success'=>'true','data'=>$userDetail];
+    }
+    //录入补卡
+    public function storeReplenishClock(Request $request){
+        $errors=$this->validatorUserDutyCheck($request)->errors();
+        if (count($errors)>0)return ['success'=>'false','data'=>$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'=>'补入',
+        ]);
+        $userDutyCheck->save();
+        $this->log(__METHOD__,"录入补卡".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        return ['success'=>'true','data'=>$userDutyCheck];
+    }
+
+    //去往打卡审核
+    public function clockAudit(){
+        $date=date('Y-m-d');
+        $userDutyChecks=UserDutyCheck::with('userDetail')->where('checked_at','like',$date."%")->get();
+        return view('process/checking-in/clockAudit',['userDutyChecks'=>$userDutyChecks]);
+    }
+    //打卡审核
+    public function storeClockAudit(Request $request){
+        $id=$request->input('id');
+        $type=$request->input('type');
+        $userDutyCheck=UserDutyCheck::find($id);
+        $userDutyCheck->type=$type;
+        $userDutyCheck->verify_user_id=Auth::user()['id'];
+        $userDutyCheck->update();
+        $this->log(__METHOD__,"打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
+        return $userDutyCheck->verify_user_id;
+    }
+    //打卡审核时判断是否异常
+    public function isException(Request $request){
+        $id=$request->input('id');
+        $checked_at=$request->input('checked_at');
+        $type=$request->input('type');
+        $user_id=$request->input('user_id');
+        if (!$id || !$checked_at || !$type || !$user_id)return ['exception'=>'数据异常!','duration_man_hour'=>''];
+        $userDutyCheck=UserDutyCheck::where('user_id',$user_id)->where('checked_at','<',$checked_at)->first();
+        if (!$userDutyCheck)return ['exception'=>'','duration_man_hour'=>''];
+        $dateStart=Carbon::parse($userDutyCheck->checked_at);
+        $dateEnd=Carbon::parse($checked_at);
+        $minute=($dateEnd->diffInMinutes($dateStart));
+        if ($type=="登入"&&$userDutyCheck->type=="登入"&&$minute>30){
+            return ['exception'=>'无出场纪录!','duration_man_hour'=>''];
+        }
+        if ($type=="登出"&&$userDutyCheck->type=="登出"&&$minute>30){
+            return ['exception'=>'无入场纪录!','duration_man_hour'=>''];
+        }
+        if ($type=="登出"&&$userDutyCheck->type=="登入"&&$minute>=720){
+            return ['exception'=>'时间异常!','duration_man_hour'=>''];
+        }
+        if ($type=="登出"&&$userDutyCheck->type=="登入"){
+            return ['exception'=>'','duration_man_hour'=>$minute/60];
+        }
+        return ['exception'=>'','duration_man_hour'=>''];
+    }
+
+    //去往任务审核
+    public function missionAudit(Request $request){
+        $processDailyParticipants=ProcessDailyParticipant::with(['processDaily','user_detail'])
+            ->orderBy('id','DESC');
+        $start_date=$request->input('start_date');
+        $end_date=$request->input('end_date');
+        $full_name=$request->input('full_name');
+        $mobile_phone=$request->input('mobile_phone');
+        if ($start_date) {
+            $processDailyParticipants->whereHas('processDaily',function (Builder $builder)use($start_date){
+                $builder->where('date','>=',$start_date);
+            });
+        }
+        if ($end_date) {
+            $processDailyParticipants->whereHas('processDaily',function (Builder $builder)use($end_date){
+                $builder->where('date','<=',$end_date);
+            });
+        }
+        if ($full_name){
+            $processDailyParticipants->whereHas('user_detail',function (Builder $builder)use($full_name){
+                $builder->where('full_name',$full_name);
+            });
+        }
+        if ($mobile_phone){
+            $processDailyParticipants->whereHas('user_detail',function (Builder $builder)use($mobile_phone){
+                $builder->where('mobile_phone',$mobile_phone);
+            });
+        }
+        $processDailyParticipants=$processDailyParticipants->paginate($request->input('paginate')?$request->input('paginate'):50);
+        foreach ($processDailyParticipants as $processDailyParticipant){
+            if ($processDailyParticipant->processDaily){
+                $processDailyParticipant=$this->countParticipantManHour($processDailyParticipant,$processDailyParticipant->processDaily->date);
+            }
+        }
+        return view('process/checking-in/missionAudit',['processDailyParticipants'=>$processDailyParticipants,'request'=>$request->input()]);
+    }
+
+    //任务审核
+    public function storeMissionAudit(Request $request){
+        $id=$request->input('id');
+        if (!$id)return ['error'=>'提交审核失败!'];
+        $processDailyParticipant=ProcessDailyParticipant::find($id);
+        if (!$id)return ['error'=>'未找到对应记录!'];
+        $processDailyParticipant->status='已审核';
+        $processDailyParticipant->update();
+        $this->log(__METHOD__,"任务审核".__FUNCTION__,json_encode($processDailyParticipant),Auth::user()['id']);
+        return;
     }
 
-    /**
-     * Store a newly created resource in storage.
-     *
-     * @param  \Illuminate\Http\Request  $request
-     * @return \Illuminate\Http\Response
-     */
     public function store(Request $request)
     {
-        //
+        if(!Gate::allows('二次加工管理-录入')){ return redirect(url('/'));  }
+        $errors=$this->validatorProcess($request)->errors();
+        if (count($errors)>0)return ['error'=>$errors,'data'=>"process"];
+        $errors=[];
+        foreach ($request->input('processContents') as $processContent){
+            if ($processContent['addBtnShow'])continue;
+            $error=$this->validatorProcessContent($processContent)->errors();
+            if (count($error)>0)$errors[$processContent['wms_code']]=$error;
+        }
+        if (count($errors)>0)return ['error'=>$errors];
+        $process=new Process([
+            'code'=>Uuid::uuid1(),
+            'owner_id'=>$request->input('owner_id'),
+            'process_method_id'=>$request->input('process_method_id'),
+            'unit_price'=>$request->input('unit_price'),
+            'remark'=>$request->input('remark'),
+            'amount'=>$request->input('amount'),
+        ]);
+        $process->save();
+        $process->code='P'.date ("Ymd").str_pad($process->id,3,"0");
+        $process->update();
+        $processStatistic=new ProcessStatistic([
+            'process_id'=>$process->id,
+        ]);
+        $processStatistic->save();
+        $this->log(__METHOD__,"录入二次加工单".__FUNCTION__,json_encode($process)." || ".json_encode($processStatistic),Auth::user()['id']);
+        foreach ($request->input('processContents') as $processContent){
+            if ($processContent['addBtnShow'])continue;
+            $processContentOne=new ProcessesContent([
+                'process_id'=>$process->id,
+                'bill_type'=>$processContent['bill_type'],
+                'commodity_id'=>$processContent['commodity_id'],
+                'wms_code'=>$processContent['wms_code'],
+                'amount'=>$processContent['amount'],
+            ]);
+            $processContentOne->save();
+            $this->log(__METHOD__,"录入二次加工单内容单".__FUNCTION__,json_encode($processContentOne),Auth::user()['id']);
+        }
+        if ($request->input('tutorials'))$process->tutorials()->sync($request->input('tutorials'));
+        return;
     }
 
     /**
@@ -448,41 +729,104 @@ class ProcessController extends Controller
             'id'=>'ID',
             'code'=>'任务号',
             'owner_name'=>'货主',
-            'bill_type'=>'单据类型',
-            'wms_code'=>'单据号',
             'process_method_name'=>'加工类型',
             'amount'=>'预期数量',
+            'completed_amount'=>'实际数量',
+            'status'=>'状态',
             'unit_price'=>'单价',
             'created_at'=>'提交日期',
+            'bill_type'=>'单据类型',
+            'wms_code'=>'单据号',
             'commodity_barcode'=>'商品编码',
             'commodity_name'=>'商品名称',
-            'completed_amount'=>'实际数量',
-            'status'=>'状态',
+            'thisAmount'=>'本次数量',
         ]];
         $list=[];
         $i=0;
         foreach ($processes as $process){
-            $w=[
-                'id'=>$process->id,
-                'code'=>$process->code ,
-                'owner_name'=>$process->owner_name ,
-                'bill_type'=>$process->bill_type ,
-                'wms_code'=>$process->wms_code ,
-                'process_method_name'=>$process->process_method_name,
-                'amount'=>$process->amount,
-                'unit_price'=>$process->unit_price,
-                'created_at'=>$process->created_at ,
-                'commodity_barcode'=>$process->commodity_barcode,
-                'commodity_name'=>$process->commodity_name ,
-                'completed_amount'=>$process->completed_amount,
-                'status'=>$process->status,
-            ];
-            $list[$i]=$w;
-            $i++;
+            if (!$process->processesContents){
+                $w=[
+                    'id'=>$process->id,
+                    'code'=>$process->code ,
+                    'owner_name'=>$process->owner_name ,
+                    'process_method_name'=>$process->process_method_name,
+                    'amount'=>$process->amount,
+                    'unit_price'=>$process->unit_price,
+                    'created_at'=>$process->created_at ,
+                    'completed_amount'=>$process->completed_amount,
+                    'status'=>$process->status,
+                ];
+                $list[$i]=$w;
+                $i++;
+                continue;
+            }
+            foreach($process->processesContents as $processesContent){
+                $w=[
+                    'id'=>$process->id,
+                    'code'=>$process->code ,
+                    'owner_name'=>$process->owner_name ,
+                    'bill_type'=>$processesContent->bill_type ,
+                    'wms_code'=>$processesContent->wms_code ,
+                    'process_method_name'=>$process->process_method_name,
+                    'amount'=>$process->amount,
+                    'thisAmount'=>$processesContent->amount,
+                    'unit_price'=>$process->unit_price,
+                    'created_at'=>$process->created_at ,
+                    'commodity_barcode'=>$processesContent->commodity_barcode ,
+                    'commodity_name'=>$processesContent->commodity_name ,
+                    'completed_amount'=>$process->completed_amount,
+                    'status'=>$process->status,
+                ];
+                $list[$i]=$w;
+                $i++;
+            }
         }
         return Excel::download(new WaybillExport($row,$list),date('YmdHis', time()).'-二次加工单.xls');
     }
 
+    public function validatorProcessContent(array $processContent){
+        $validator=Validator::make($processContent,[
+            'wms_code'=>['required'],
+            'owner_id'=>['required','integer'],
+            'commodity_id'=>['required','integer'],
+            'bill_type'=>['required'],
+            'amount'=>['required','min:0','max:999999','integer']
+        ],[
+            'required'=>':attribute 不应为空',
+            'min'=>':attribute 不得为0或为负',
+            'integer'=>':attribute 必须为整数',
+            'max'=>':attribute 输入值过大',
+        ],[
+            'owner_id'=>'货主',
+            'wms_code'=>'单据号',
+            'commodity_id'=>'商品',
+            'bill_type'=>'单据类型',
+            'amount'=>'商品数量',
+        ]);
+        return $validator;
+    }
+
+    public function validatorProcess(Request $request){
+        $validator=Validator::make($request->input(),[
+            'owner_id'=>['required'],
+            'process_method_id'=>['required','integer'],
+            'amount'=>['required','integer'],
+            'unit_price'=>['required','min:0','max:999999','numeric'],
+        ],[
+            'required'=>':attribute 不应为空',
+            'min'=>':attribute 不得为0或为负',
+            'numeric'=>':attribute 必须为数字',
+            'max'=>':attribute 输入值过大',
+            'integer' =>':attribute 必须为整数',
+        ],[
+            'owner_id'=>'货主',
+            'process_method_id'=>'加工类型',
+            'amount'=>'数量',
+            'unit_price'=>'单价',
+        ]);
+        return $validator;
+    }
+
     public function validator(Request $request){
         $validator=Validator::make($request->input(),[
             'id'=>['required','integer'],
@@ -498,6 +842,17 @@ class ProcessController extends Controller
         return $validator;
     }
 
+    public function validatorUserDutyCheck(Request $request){
+        $validator=Validator::make($request->input(),[
+            'user_id'=>'required',
+            'checked_at'=>'required|date_format:Y-m-d H:i',
+            'type'=>'required',
+        ],[
+            'date_format'=>':attribute 格式错误',
+        ],['checked_at'=>'日期']);
+        return $validator;
+    }
+
     //参与人信息校验
     public function validatorProcessDailyParticipant(Request $request){
         $validator=Validator::make($request->input(),[

+ 124 - 0
app/Http/Controllers/ProcessStatisticController.php

@@ -0,0 +1,124 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Exports\WaybillExport;
+use App\Owner;
+use App\ProcessMethod;
+use App\ProcessStatistic;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Gate;
+use Maatwebsite\Excel\Facades\Excel;
+
+class ProcessStatisticController extends Controller
+{
+    public function conditionQuery(Request $request,$processStatistics){
+        if ($request->input('started_at')){
+            $processStatistics=$processStatistics->where('started_at','>=',$request->input('started_at'));
+        }
+        if ($request->input('owner_id')){
+            $owner_id=$request->input('owner_id');
+            $processStatistics=$processStatistics->whereHas('process',function (Builder $query)use($owner_id){
+                $query->where('owner_id',$owner_id);
+            });
+        }
+        if ($request->input('ended_at')){
+            $processStatistics=$processStatistics->where('ended_at','<=',$request->input('ended_at'));
+        }
+        if ($request->input('code')){
+            $code=$request->input('code');
+            $processStatistics=$processStatistics->whereHas('process',function (Builder $query)use($code){
+                $query->where('code','like',$code."%");
+            });
+        }
+        if ($request->input('status')){
+            $status=$request->input('status');
+            $processStatistics=$processStatistics->whereHas('process',function (Builder $query)use($status){
+                $query->where('status',$status);
+            });
+        }
+        $processStatistics=$processStatistics->paginate($request->input('paginate')?$request->input('paginate'):50);
+        return $processStatistics;
+    }
+
+    public function index(Request $request){
+        $processStatistics=ProcessStatistic::with('process')->orderBy('process_id','DESC');
+        if ($request->input('checkSign')){
+            $excel=$this->isExport($request,$processStatistics);
+            return $excel;
+        }
+        $processStatistics=$this->conditionQuery($request,$processStatistics);
+        $owners=Owner::get();
+        $processMethods=ProcessMethod::get();
+        return view('process.statistic',['processStatistics'=>$processStatistics,'owners'=>$owners,'processMethods'=>$processMethods]);
+    }
+
+    //获取导出数据
+    public function isExport(Request $request,$processStatistics){
+        if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/'));  }
+        if ($request->input('checkSign')=="-1"){
+            $processStatistics=$this->conditionQuery($request,$processStatistics);
+            $excel=$this->export($processStatistics);
+            return $excel;
+        }
+        $id = explode( ',',$request->input('checkSign'));
+        $processStatistics=$processStatistics->whereIn('process_id',$id)->get();
+        $excel=$this->export($processStatistics);
+        return $excel;
+    }
+
+    //执行
+    public function export($processStatistics){
+        if(!Gate::allows('二次加工管理-查询')){ return '没有权限';  }
+        $row=[[
+            'process_id'=>'ID',
+            'code'=>'任务号',
+            'owner_name'=>'货主',
+            'started_at'=>'开始日期',
+            'ended_at'=>'完成日期',
+            'unit_price'=>'单价',
+            'amount'=>'预期数量',
+            'completed_amount'=>'完成数量',
+            'revenue'=>'收入合计',
+            'duration_days'=>'完成时间(天)',
+            'duration_man_hours'=>'总工时',
+            'process_method_name'=>'加工类型',
+            'top_capacity'=>'最高日产能',
+            'bottom_capacity'=>'最低日产能',
+            'average_capacity'=>'日均产能',
+            'total_cost'=>'合计成本',
+            'gross_profit'=>'毛利润',
+            'gross_profit_rate'=>'毛利率',
+            'status'=>'状态',
+        ]];
+        $list=[];
+        $i=0;
+        foreach ($processStatistics as $processStatistic){
+            $w=[
+                'process_id'=>$processStatistic->process_id,
+                'code'=>$processStatistic->process?$processStatistic->process->code:'',
+                'owner_name'=>$processStatistic->process?$processStatistic->process->owner_name:'',
+                'started_at'=>$processStatistic->started_at,
+                'ended_at'=>$processStatistic->ended_at,
+                'unit_price'=>$processStatistic->process?$processStatistic->process->unit_price:'',
+                'amount'=>$processStatistic->process?$processStatistic->process->amount:'',
+                'completed_amount'=>$processStatistic->process?$processStatistic->process->completed_amount:'',
+                'revenue'=>$processStatistic->revenue,
+                'duration_days'=>$processStatistic->duration_days,
+                'duration_man_hours'=>$processStatistic->duration_man_hours,
+                'process_method_name'=>$processStatistic->process?$processStatistic->process->process_method_name:'',
+                'top_capacity'=>$processStatistic->top_capacity,
+                'bottom_capacity'=>$processStatistic->bottom_capacity,
+                'average_capacity'=>$processStatistic->average_capacity,
+                'total_cost'=>$processStatistic->total_cost,
+                'gross_profit'=>$processStatistic->gross_profit,
+                'gross_profit_rate'=>round(($processStatistic->gross_profit_rate)*100,2).'%',
+                'status'=>$processStatistic->process?$processStatistic->process->status:'',
+            ];
+            $list[$i]=$w;
+            $i++;
+        }
+        return Excel::download(new WaybillExport($row,$list),date('YmdHis', time()).'-二次加工单.xls');
+    }
+}

+ 12 - 8
app/Http/Controllers/TestController.php

@@ -18,6 +18,7 @@ use App\Package;
 use App\Process;
 use App\ProcessDaily;
 use App\ProcessDailyParticipant;
+use App\ProcessStatistic;
 use App\Rejected;
 use App\RejectedBill;
 use App\RejectedBillItem;
@@ -28,8 +29,12 @@ use App\UserDetail;
 use App\UserDutyCheck;
 use App\WMSReflectReceive;
 use Carbon\Carbon;
+use Endroid\QrCode\QrCode;
+use Endroid\QrCode\Response\QrCodeResponse;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Te7aHoudini\LaravelTrix\Models\TrixAttachment;
 use Zttp\Zttp;
@@ -137,16 +142,15 @@ class TestController extends Controller
     }
 
     public function test1(Request $request){
-/*        $attachment = TrixAttachment::where('attachment', basename('yHHxWX8Hujm3Smf2aBAUnYzHHCpgerpn1GKiIazm.png'))->first();
+        $a=100/650;
+        DB::table('tests')->insert([
+            'number'=>$a,
+        ]);
+        dd($a);
+        return view('process/checking-in/success',['full_name'=>'lxg','checked_at'=>'2222-02-22 22:22:22']);
+
 
-        dd(response()->json(optional($attachment)->purge()));*/
 
-        //$a=Process::with('tutorials')->find(1);
-        //$a->tutorials()->syncWithoutDetaching([25]);
-        $tutorials=Tutorial::with('owner')->where('owner_id',2)->get();
-        $tutorials=$tutorials->except([27]);
-        echo ini_get('post_max_size');
-        dd();
 
     }
 }

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

@@ -0,0 +1,148 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\User;
+use App\UserDetail;
+use App\UserDutyCheck;
+use App\UserLabor;
+use Carbon\Carbon;
+use Endroid\QrCode\QrCode;
+use Endroid\QrCode\Response\QrCodeResponse;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use Ramsey\Uuid\Uuid;
+
+class UserDutyCheckController extends Controller
+{
+    //获取二维码
+    public function getQRCode(){
+        $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
+        if ($qrCode_refresh_everyday){
+            $date=md5(date('Y-m-d'));
+            $url="bswas/userDutyCheck/clock?key=".$date;
+        }else{
+            $url="bswas/userDutyCheck/clock";
+        }
+        $qrCode=new QrCode($url);
+        header('Content-Type: '.$qrCode->getContentType());
+        $response=new QrCodeResponse($qrCode);
+        return $response;
+    }
+
+    //校验二维码进入打卡页面
+    public function clock(Request $request){
+        $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday');
+        if ($qrCode_refresh_everyday){
+            $key=$request->input('key');
+            if (!$key) return "二维码失效!";
+            $date=md5(date('Y-m-d'));
+            if ($key!=$date) return "二维码失效!";
+        }
+        $mobile_phone=$request->cookie('mobile_phone');
+        if ($mobile_phone) {
+            $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
+            if (!$userDetail)   return redirect('userDutyCheck/createUserDetail/'.$mobile_phone);
+            $userDutyCheck=$this->dutyCheck($userDetail->user_id);
+            if (!$userDutyCheck)return "<h1 style='color: red'>打卡异常,请联系相关人员!</h1>";
+            return response()->view('process/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at]);
+        }
+        return view("process/checking-in/clock");
+    }
+
+    //提交打卡
+    public function storeClock(Request $request){
+        $mobile_phone=$request->input('mobile_phone');
+        $this->validator($request)->validate();
+        $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first();
+        if (!$userDetail)   return redirect('userDutyCheck/createUserDetail/'.$mobile_phone);
+        $userDutyCheck=$this->dutyCheck($userDetail->user_id);
+        if (!$userDutyCheck)return "<h1 style='color: red'>打卡异常,请联系相关人员!</h1>";
+        return response()->view('process/checking-in/success',['full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at])
+            ->cookie('mobile_phone',$mobile_phone,43200,'/');
+    }
+    //去往登记资料页面
+    public function createUserDetail($mobile_phone){
+        return view('process/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone]);
+    }
+
+    //提交登记资料
+    public  function storeUserDetail(Request $request){
+        $this->validator($request)->validate();
+        $mobile_phone=$request->input('mobile_phone');
+        $full_name=$request->input('full_name');
+        $user=new User([
+            'name'=>$mobile_phone,
+            'password'=>Uuid::uuid1(),
+        ]);
+        $user->save();
+        $userDetail=new UserDetail([
+            'user_id'=>$user->id,
+            'full_name'=>$full_name,
+            'gender'=>$request->input('gender'),
+            'mobile_phone'=>$mobile_phone,
+            'type'=>'临时工',
+        ]);
+        $userDetail->save();
+        $userLabor=new UserLabor([
+            'user_id'=>$user->id,
+            'company'=>$request->input('company'),
+        ]);
+        $userLabor->save();
+        $userDutyCheck=$this->dutyCheck($user->id);
+        if (!$userDutyCheck)return "<h1 style='color: red'>打卡异常,请联系相关人员!</h1>";
+        return response()->view('process/checking-in/success',['full_name'=>$full_name,'checked_at'=>$userDutyCheck->checked_at])
+            ->cookie('mobile_phone',$mobile_phone,43200,'/');
+    }
+
+    //根据用户提交打卡记录
+    public function dutyCheck($user_id){
+        $userDutyCheckOld=UserDutyCheck::where('user_id',$user_id)->orderBy('checked_at','DESC')->limit(10)->first();
+        $date=date('Y-m-d H:i:s');
+        $userDutyCheck=new UserDutyCheck([
+            'user_id'=>$user_id,
+            'checked_at'=>$date,
+            'source'=>'正常',
+        ]);
+        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=="登入"){
+            switch ($diffDate){
+                case $diffDate<=20:
+                    $userDutyCheck->type="登入";
+                    break;
+                case $diffDate>=1380:
+                    $userDutyCheck->type="登入";
+                    break;
+                default:
+                    $userDutyCheck->type="登出";
+            }
+        }
+        if ($userDutyCheckOld->type=="登出"){
+            switch ($diffDate){
+                case $diffDate<=20:
+                    $userDutyCheck->type="登出";
+                    break;
+                default:
+                    $userDutyCheck->type="登入";
+            }
+        }
+        $userDutyCheck->save();
+        return $userDutyCheck;
+    }
+
+    public function validator(Request $request){
+        $validator=Validator::make($request->input(),[
+            'full_name'=>['filled'],
+            'gender'=>['filled'],
+            'mobile_phone'=>['required','integer','digits:11'],
+        ],[],[]);
+        return $validator;
+    }
+}

+ 166 - 0
app/Http/Controllers/UserLaborController.php

@@ -0,0 +1,166 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\ProcessDailyParticipant;
+use App\User;
+use App\UserDetail;
+use App\UserDutyCheck;
+use App\UserLabor;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Validation\Rule;
+
+class UserLaborController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        $userLabors=UserLabor::with('userDetail')->paginate(50);
+        return view('maintenance.userLabor.index',['userLabors'=>$userLabors]);
+    }
+
+    /**
+     * 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  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function show($id)
+    {
+        if(!Gate::allows('临时工-查询')){ return redirect(url('/'));  }
+        $userLabor=UserLabor::with('userDetail')->find($id);
+        return view('maintenance.userLabor.show',['userLabor'=>$userLabor]);
+    }
+    //获取劳务记录
+    public function getWorkRecord(Request $request){
+        if(!Gate::allows('临时工-查询')){ return redirect(url('/'));  }
+        $user_id=$request->input('user_id');
+        if (!$user_id)return ['error'=>'提交ID失败!'];
+        $processDailyParticipants=ProcessDailyParticipant::with('processDaily')
+            ->where('user_id',$user_id)->orderBy('created_at','DESC')->limit(20)->get();
+        return $processDailyParticipants;
+    }
+    //获取打卡记录
+    public function getClockRecord(Request $request){
+        if(!Gate::allows('临时工-查询')){ return redirect(url('/'));  }
+        $user_id=$request->input('user_id');
+        if (!$user_id)return ['error'=>'提交ID失败!'];
+        $userDutyChecks=UserDutyCheck::orderBy('checked_at','DESC')->where('user_id',$user_id)->limit(20)->get();
+        return $userDutyChecks;
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function edit($id)
+    {
+        if(!Gate::allows('临时工-编辑')){ return redirect(url('/'));  }
+        $userLabor=UserLabor::with('userDetail')->find($id);
+        return view('maintenance.userLabor.edit',['userLabor'=>$userLabor]);
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, $id)
+    {
+        if(!Gate::allows('临时工-编辑')){ return redirect(url('/'));  }
+        Validator::make($request->input(),[
+            'full_name'=>'required|max:10',
+            'mobile_phone'=>['required','integer','digits:11'],
+            'gender'=>['required',Rule::in(['男', '女']),],
+            'identity_number'=>'nullable',
+            'default_hour_price'=>'nullable|min:0|max:999999|numeric',
+            'company'=>'nullable',
+        ],[
+            'required'=>':attribute 不应为空',
+            'min'=>':attribute 不得为0或为负',
+            'numeric'=>':attribute 必须为数字',
+            'max'=>':attribute 输入值过大或过长',
+            'integer'=>':attribute 选择错误',
+        ],[
+            'full_name'=>'姓名',
+            'mobile_phone'=>'电话',
+            'gender'=>'性别',
+            'identity_number'=>'身份证号',
+            'default_hour_price'=>'默认计时工资',
+            'company'=>'劳务所',
+        ])->validate();
+        $userDetail=UserDetail::find($id);
+        $userDetail->full_name=$request->input('full_name');
+        $userDetail->mobile_phone=$request->input('mobile_phone');
+        $userDetail->gender=$request->input('gender');
+        $userDetail->identity_number=$request->input('identity_number');
+        $userDetail->update();
+        $this->log(__METHOD__,"修改用户详情".__FUNCTION__,json_encode($userDetail),Auth::user()['id']);
+        $default_hour_price=$request->input('default_hour_price');
+        $company=$request->input('company');
+        $userLabor=UserLabor::find($id);
+        if ($userLabor->default_hour_price!=$default_hour_price || $userLabor->company!=$company){
+            $userLabor->default_hour_price=$default_hour_price;
+            $userLabor->company=$company;
+            $userLabor->update();
+            $this->log(__METHOD__,"修改临时工".__FUNCTION__,json_encode($userLabor),Auth::user()['id']);
+        }
+        return redirect('maintenance/userLabor')->with('successTip','临时工“'.$userDetail->full_name.'”信息修改成功!');
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy($id)
+    {
+        if(!Gate::allows('临时工-删除')){ return redirect(url('/'));  }
+        $userDetail=UserDetail::find($id);
+        $user=User::find($id);
+        $userLabor=UserLabor::find($id);
+        if (!$userDetail || !$user || !$userLabor){
+            return ['error'=>'未找到对应临时工'];
+        }
+        $userDetail->delete();
+        $this->log(__METHOD__,"删除用户详情".__FUNCTION__,json_encode($userDetail),Auth::user()['id']);
+        $user->delete();
+        $this->log(__METHOD__,"删除临时工用户".__FUNCTION__,json_encode($user),Auth::user()['id']);
+        $userLabor->delete();
+        $this->log(__METHOD__,"删除临时工".__FUNCTION__,json_encode($userLabor),Auth::user()['id']);
+        return ['success'=>'true'];
+    }
+}

+ 34 - 0
app/Http/Controllers/api/thirdPart/flux/ProcessController.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Http\Controllers\Api\thirdPart\flux;
+
+
+use App\Http\Controllers\Controller;
+use Illuminate\Http\Request;
+
+class ProcessController extends Controller
+{
+    public function getProcessContent(Request $request){
+        $wms_code=$request->input('wms_code');
+        if (!$wms_code)return ['error'=>'提交的单据号为空'];
+        $processContent=[
+            'wms_code'=>$wms_code,
+            'owner_name'=>'TestOwner',
+            'owner_id'=>'2',
+            'commodities'=>[[
+                'id'=>'1',
+                'name'=>'TestCommodityName',
+                'barcode'=>'TestCommodityBarcode',
+                'sku'=>'TestCommoditySKU',
+            ],[
+                'id'=>'2',
+                'name'=>'TestCommodityName1',
+                'barcode'=>'TestCommodityBarcode1',
+                'sku'=>'TestCommoditySKU1',
+            ]],
+            'bill_type'=>'移库单',
+            'amount'=>'50',
+        ];
+        return json_encode($processContent);
+    }
+}

+ 3 - 0
app/Process.php

@@ -25,6 +25,9 @@ class Process extends Model
     public function processesContents(){
         return $this->hasMany('App\ProcessesContent','process_id','id');
     }
+    public function processDailies(){
+        return $this->hasMany('App\ProcessDaily','process_id','id');
+    }
 
 
     public function getOwnerNameAttribute()

+ 8 - 0
app/ProcessDaily.php

@@ -9,6 +9,9 @@ class ProcessDaily extends Model
     protected $fillable=[
         'process_id','date','output','remain'
     ];
+    protected $appends=[
+        'process_code'
+    ];
 
 
     public function process(){
@@ -17,4 +20,9 @@ class ProcessDaily extends Model
     public function processDailyParticipants(){
         return $this->hasMany('App\ProcessDailyParticipant','process_daily_id','id');
     }
+
+    public function getProcessCodeAttribute()
+    {
+        return $this['process'] ? $this['process']['code'] : null;
+    }
 }

+ 7 - 2
app/ProcessDailyParticipant.php

@@ -11,13 +11,14 @@ class ProcessDailyParticipant extends Model
         'hour_count','unit_price','unit_count','dinner_duration','remark','status'
     ];
     protected $appends=[
-        'user_detail_full_name'
+        'user_detail_full_name',
+        'process_daily_date',
     ];
 
     public function user_detail(){
         return $this->belongsTo('App\UserDetail','user_id','user_id');
     }
-    public function process_daily(){
+    public function processDaily(){
         return $this->belongsTo('App\ProcessDaily','process_daily_id','id');
     }
 
@@ -26,4 +27,8 @@ class ProcessDailyParticipant extends Model
     {
         return $this['user_detail']?$this['user_detail']['full_name']:null;
     }
+    public function getProcessDailyDateAttribute()
+    {
+        return $this['processDaily'] ? $this['processDaily']['date'] : null;
+    }
 }

+ 5 - 0
app/ProcessStatistic.php

@@ -9,9 +9,14 @@ class ProcessStatistic extends Model
     //重新约定主键且不允许自增
     protected $primaryKey='process_id';
     public $incrementing=false;
+    public $timestamps=false;
 
     protected $fillable=[
         'process_id','started_at','ended_at','revenue','duration_days',
         'duration_man_hours','top_capacity','bottom_capacity','average_capacity','total_cost','gross_profit','gross_profit_rate'
     ];
+
+    public function process(){
+        return $this->belongsTo('App\Process','process_id','id');
+    }
 }

+ 12 - 0
app/UserDetail.php

@@ -12,6 +12,9 @@ class UserDetail extends Model
     protected $fillable=[
         'user_id','full_name','gender','identity_number','mobile_phone','type'
     ];
+    protected $appends=[
+        'user_labor_company'
+    ];
 
     public function user(){
         return $this->belongsTo('App\User','user_id','id');
@@ -19,6 +22,15 @@ class UserDetail extends Model
     public function user_labor(){
         return $this->belongsTo('App\UserLabor','user_id','user_id');
     }
+    public function userDutyChecks(){
+        return $this->hasMany('App\UserDutyCheck','user_id','user_id');
+    }
+
+
+    public function getUserLaborCompanyAttribute()
+    {
+        return $this['user_labor'] ?$this['user_labor']['company'] : null;
+    }
 
 
 }

+ 4 - 9
app/UserDutyCheck.php

@@ -6,19 +6,14 @@ use Illuminate\Database\Eloquent\Model;
 
 class UserDutyCheck extends Model
 {
+    public $timestamps=false;
+
     protected $fillable=[
         'user_id','checked_at','confirmed_by','type','source'
     ];
-    protected $appends=[
-        'user_name'
-    ];
 
-    public function user(){
-        return $this->belongsTo('App\User','user_id','id');
+    public function userDetail(){
+        return $this->belongsTo('App\UserDetail','user_id','user_id');
     }
 
-    public function getUserNameAttribute()
-    {
-        return $this['user']?$this['user']['name']:null;
-    }
 }

+ 3 - 2
app/UserLabor.php

@@ -8,13 +8,14 @@ class UserLabor extends Model
 {
     protected $primaryKey='user_id';
     public $incrementing=false;
+    public $timestamps=false;
 
     protected $fillable=[
         'user_id','default_hour_price','company'
     ];
 
-    public function user(){
-        return $this->belongsTo('App\User','user_id','id');
+    public function userDetail(){
+        return $this->belongsTo('App\UserDetail','user_id','user_id');
     }
 
 }

+ 10 - 12
bootstrap/cache/services.php

@@ -32,12 +32,11 @@
     28 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
     29 => 'Overtrue\\LaravelPinyin\\ServiceProvider',
     30 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    31 => 'Stevenyangecho\\UEditor\\UEditorServiceProvider',
-    32 => 'App\\Providers\\AppServiceProvider',
-    33 => 'App\\Providers\\AuthServiceProvider',
-    34 => 'App\\Providers\\BroadcastServiceProvider',
-    35 => 'App\\Providers\\EventServiceProvider',
-    36 => 'App\\Providers\\RouteServiceProvider',
+    31 => 'App\\Providers\\AppServiceProvider',
+    32 => 'App\\Providers\\AuthServiceProvider',
+    33 => 'App\\Providers\\BroadcastServiceProvider',
+    34 => 'App\\Providers\\EventServiceProvider',
+    35 => 'App\\Providers\\RouteServiceProvider',
   ),
   'eager' => 
   array (
@@ -57,12 +56,11 @@
     13 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
     14 => 'Carbon\\Laravel\\ServiceProvider',
     15 => 'Te7aHoudini\\LaravelTrix\\LaravelTrixServiceProvider',
-    16 => 'Stevenyangecho\\UEditor\\UEditorServiceProvider',
-    17 => 'App\\Providers\\AppServiceProvider',
-    18 => 'App\\Providers\\AuthServiceProvider',
-    19 => 'App\\Providers\\BroadcastServiceProvider',
-    20 => 'App\\Providers\\EventServiceProvider',
-    21 => 'App\\Providers\\RouteServiceProvider',
+    16 => 'App\\Providers\\AppServiceProvider',
+    17 => 'App\\Providers\\AuthServiceProvider',
+    18 => 'App\\Providers\\BroadcastServiceProvider',
+    19 => 'App\\Providers\\EventServiceProvider',
+    20 => 'App\\Providers\\RouteServiceProvider',
   ),
   'deferred' => 
   array (

+ 1 - 0
composer.json

@@ -13,6 +13,7 @@
         "ext-mbstring": "*",
         "ext-openssl": "*",
         "doctrine/dbal": "^2.10",
+        "endroid/qr-code": "^3.7",
         "fideloper/proxy": "^4.0",
         "kitetail/zttp": "^0.6.0",
         "laravel/framework": "5.8.*",

+ 532 - 58
composer.lock

@@ -4,8 +4,111 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "e22b4feb8c41b821065d6aa4fecd20be",
+    "content-hash": "b9213c3eb483a7331f226d8bf402b828",
     "packages": [
+        {
+            "name": "bacon/bacon-qr-code",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Bacon/BaconQrCode.git",
+                "reference": "eaac909da3ccc32b748a65b127acd8918f58d9b0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/eaac909da3ccc32b748a65b127acd8918f58d9b0",
+                "reference": "eaac909da3ccc32b748a65b127acd8918f58d9b0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "dasprid/enum": "^1.0",
+                "ext-iconv": "*",
+                "php": "^7.1"
+            },
+            "require-dev": {
+                "phly/keep-a-changelog": "^1.4",
+                "phpunit/phpunit": "^6.4",
+                "squizlabs/php_codesniffer": "^3.1"
+            },
+            "suggest": {
+                "ext-imagick": "to generate QR code images"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "BaconQrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "mail@dasprids.de",
+                    "homepage": "http://www.dasprids.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "BaconQrCode is a QR code generator for PHP.",
+            "homepage": "https://github.com/Bacon/BaconQrCode",
+            "time": "2018-04-25T17:53:56+00:00"
+        },
+        {
+            "name": "dasprid/enum",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/DASPRiD/Enum.git",
+                "reference": "631ef6e638e9494b0310837fa531bedd908fc22b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/631ef6e638e9494b0310837fa531bedd908fc22b",
+                "reference": "631ef6e638e9494b0310837fa531bedd908fc22b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.4",
+                "squizlabs/php_codesniffer": "^3.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DASPRiD\\Enum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "mail@dasprids.de",
+                    "homepage": "https://dasprids.de/"
+                }
+            ],
+            "description": "PHP 7.1 enum implementation",
+            "keywords": [
+                "enum",
+                "map"
+            ],
+            "time": "2017-10-25T22:45:27+00:00"
+        },
         {
             "name": "dnoegel/php-xdg-base-dir",
             "version": "0.1",
@@ -578,6 +681,72 @@
             ],
             "time": "2019-08-13T17:33:27+00:00"
         },
+        {
+            "name": "endroid/qr-code",
+            "version": "3.7.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/endroid/qr-code.git",
+                "reference": "bfb64f163628b59ba250a6a1da95b6252b5718c3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/endroid/qr-code/zipball/bfb64f163628b59ba250a6a1da95b6252b5718c3",
+                "reference": "bfb64f163628b59ba250a6a1da95b6252b5718c3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "bacon/bacon-qr-code": "^2.0",
+                "ext-gd": "*",
+                "khanamiryan/qrcode-detector-decoder": "^1.0.2",
+                "myclabs/php-enum": "^1.5",
+                "php": ">=7.2",
+                "symfony/http-foundation": "^3.4||^4.2.12||^5.0",
+                "symfony/options-resolver": "^3.4||^4.0||^5.0",
+                "symfony/property-access": "^3.4||^4.0||^5.0"
+            },
+            "require-dev": {
+                "endroid/test": "dev-master"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Endroid\\QrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jeroen van den Enden",
+                    "email": "info@endroid.nl"
+                }
+            ],
+            "description": "Endroid QR Code",
+            "homepage": "https://github.com/endroid/qr-code",
+            "keywords": [
+                "bundle",
+                "code",
+                "endroid",
+                "php",
+                "qr",
+                "qrcode"
+            ],
+            "time": "2020-03-10T08:32:43+00:00"
+        },
         {
             "name": "erusev/parsedown",
             "version": "1.7.3",
@@ -997,6 +1166,62 @@
             "abandoned": "php-parallel-lint/php-console-highlighter",
             "time": "2018-09-29T18:48:56+00:00"
         },
+        {
+            "name": "khanamiryan/qrcode-detector-decoder",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/khanamiryan/php-qrcode-detector-decoder.git",
+                "reference": "a75482d3bc804e3f6702332bfda6cccbb0dfaa76"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/a75482d3bc804e3f6702332bfda6cccbb0dfaa76",
+                "reference": "a75482d3bc804e3f6702332bfda6cccbb0dfaa76",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.6|^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Zxing\\": "lib/"
+                },
+                "files": [
+                    "lib/Common/customFunctions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ashot Khanamiryan",
+                    "email": "a.khanamiryan@gmail.com",
+                    "homepage": "https://github.com/khanamiryan",
+                    "role": "Developer"
+                }
+            ],
+            "description": "QR code decoder / reader",
+            "homepage": "https://github.com/khanamiryan/php-qrcode-detector-decoder/",
+            "keywords": [
+                "barcode",
+                "qr",
+                "zxing"
+            ],
+            "time": "2018-04-26T11:41:33+00:00"
+        },
         {
             "name": "kitetail/zttp",
             "version": "v0.6.0",
@@ -1696,6 +1921,58 @@
             ],
             "time": "2019-09-06T13:49:17+00:00"
         },
+        {
+            "name": "myclabs/php-enum",
+            "version": "1.7.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/php-enum.git",
+                "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c",
+                "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7",
+                "squizlabs/php_codesniffer": "1.*",
+                "vimeo/psalm": "^3.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MyCLabs\\Enum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP Enum contributors",
+                    "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
+                }
+            ],
+            "description": "PHP Enum implementation",
+            "homepage": "http://github.com/myclabs/php-enum",
+            "keywords": [
+                "enum"
+            ],
+            "time": "2020-02-14T08:15:52+00:00"
+        },
         {
             "name": "nesbot/carbon",
             "version": "2.25.3",
@@ -2716,63 +2993,6 @@
             ],
             "time": "2019-12-03T13:29:13+00:00"
         },
-        {
-            "name": "qiniu/php-sdk",
-            "version": "v7.2.10",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/qiniu/php-sdk.git",
-                "reference": "d89987163f560ebf9dfa5bb25de9bd9b1a3b2bd8"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/d89987163f560ebf9dfa5bb25de9bd9b1a3b2bd8",
-                "reference": "d89987163f560ebf9dfa5bb25de9bd9b1a3b2bd8",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "~2.3"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Qiniu\\": "src/Qiniu"
-                },
-                "files": [
-                    "src/Qiniu/functions.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Qiniu",
-                    "email": "sdk@qiniu.com",
-                    "homepage": "http://www.qiniu.com"
-                }
-            ],
-            "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
-            "homepage": "http://developer.qiniu.com/",
-            "keywords": [
-                "cloud",
-                "qiniu",
-                "sdk",
-                "storage"
-            ],
-            "time": "2019-10-28T10:23:23+00:00"
-        },
         {
             "name": "ralouphie/getallheaders",
             "version": "3.0.3",
@@ -3531,6 +3751,70 @@
             "homepage": "https://symfony.com",
             "time": "2019-10-07T15:06:41+00:00"
         },
+        {
+            "name": "symfony/inflector",
+            "version": "v5.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/inflector.git",
+                "reference": "70c25c66427e2bb6ba0827d668366d60b0a90cbf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/inflector/zipball/70c25c66427e2bb6ba0827d668366d60b0a90cbf",
+                "reference": "70c25c66427e2bb6ba0827d668366d60b0a90cbf",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Inflector\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Inflector Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "inflection",
+                "pluralize",
+                "singularize",
+                "string",
+                "symfony",
+                "words"
+            ],
+            "time": "2020-03-27T16:56:45+00:00"
+        },
         {
             "name": "symfony/mime",
             "version": "v4.3.5",
@@ -3596,6 +3880,66 @@
             ],
             "time": "2019-09-19T17:00:15+00:00"
         },
+        {
+            "name": "symfony/options-resolver",
+            "version": "v5.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/options-resolver.git",
+                "reference": "09dccfffd24b311df7f184aa80ee7b61ad61ed8d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/09dccfffd24b311df7f184aa80ee7b61ad61ed8d",
+                "reference": "09dccfffd24b311df7f184aa80ee7b61ad61ed8d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\OptionsResolver\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony OptionsResolver Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "config",
+                "configuration",
+                "options"
+            ],
+            "time": "2020-03-27T16:56:45+00:00"
+        },
         {
             "name": "symfony/polyfill-ctype",
             "version": "v1.12.0",
@@ -4038,6 +4382,79 @@
             "homepage": "https://symfony.com",
             "time": "2019-09-26T21:17:10+00:00"
         },
+        {
+            "name": "symfony/property-access",
+            "version": "v5.0.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/property-access.git",
+                "reference": "6b14bd5e184fc3bbbd35e378692c61af765515b8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/property-access/zipball/6b14bd5e184fc3bbbd35e378692c61af765515b8",
+                "reference": "6b14bd5e184fc3bbbd35e378692c61af765515b8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5",
+                "symfony/inflector": "^4.4|^5.0"
+            },
+            "require-dev": {
+                "symfony/cache": "^4.4|^5.0"
+            },
+            "suggest": {
+                "psr/cache-implementation": "To cache access methods."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\PropertyAccess\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony PropertyAccess Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "access",
+                "array",
+                "extraction",
+                "index",
+                "injection",
+                "object",
+                "property",
+                "property path",
+                "reflection"
+            ],
+            "time": "2020-03-27T16:56:45+00:00"
+        },
         {
             "name": "symfony/routing",
             "version": "v4.3.5",
@@ -6009,6 +6426,63 @@
             ],
             "time": "2019-09-14T09:08:39+00:00"
         },
+        {
+            "name": "qiniu/php-sdk",
+            "version": "v7.2.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/qiniu/php-sdk.git",
+                "reference": "d89987163f560ebf9dfa5bb25de9bd9b1a3b2bd8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/d89987163f560ebf9dfa5bb25de9bd9b1a3b2bd8",
+                "reference": "d89987163f560ebf9dfa5bb25de9bd9b1a3b2bd8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Qiniu\\": "src/Qiniu"
+                },
+                "files": [
+                    "src/Qiniu/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Qiniu",
+                    "email": "sdk@qiniu.com",
+                    "homepage": "http://www.qiniu.com"
+                }
+            ],
+            "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
+            "homepage": "http://developer.qiniu.com/",
+            "keywords": [
+                "cloud",
+                "qiniu",
+                "sdk",
+                "storage"
+            ],
+            "time": "2019-10-28T10:23:23+00:00"
+        },
         {
             "name": "sebastian/code-unit-reverse-lookup",
             "version": "1.0.1",

+ 0 - 151
config/UEditorUpload.php

@@ -1,151 +0,0 @@
-<?php
-
-/* 前后端通信相关的配置,注释只允许使用多行方式 */
-return [
-
-
-    /*
-    |--------------------------------------------------------------------------
-    | 新增配置,route
-    |--------------------------------------------------------------------------
-    |
-    |注意权限验证,请自行添加middleware
-    |middleware 相当重要,请根据自己的项目设置,比如如果在后台使用,请设置为后台的auth middleware.
-    |如果是单纯本机测试,请将
-    |`// 'middleware' => 'auth',` 直接注释掉,如果留 `'middleware'=>''`空值,会产生bug,原因不详.
-    |
-    |
-    */
-    'core' => [
-        'route' => [
-            // 'middleware' => 'auth',
-        ],
-
-        'mode' => 'storage',//上传方式,local 为本地   qiniu 为七牛,oss为阿里云oss,storage 为使用laravel的storage
-
-        //七牛配置,若mode='qiniu',以下为必填.
-        'qiniu' => [
-            'accessKey' => '',
-            'secretKey' => '',
-            'bucket' => '',
-            'url' => 'http://xxx.clouddn.com',//七牛分配的CDN域名,注意带上http://
-
-        ],
-
-
-        'oss' => [
-            'driver' => 'oss',
-            'access_id' => env('ALI_ACCESS_KEY_ID', ''),//'<Your Aliyun OSS AccessKeyId>',
-            'access_key' => env('ALI_ACCESS_KEY_SECRET', ''),//'<Your Aliyun OSS AccessKeySecret>',
-            'bucket' => env('ALI_OSS_BUCKET', ''),//'<OSS bucket name>',
-            'endpoint' => env('ALI_OSS_ENDPOINT', 'oss-cn-hangzhou.aliyuncs.com'),//'<the endpoint of OSS, E.g: oss-cn-hangzhou.aliyuncs.com | custom domain, E.g:img.abc.com>', // OSS 外网节点或自定义外部域名
-//                'endpoint_internal' => env('ALI_OSS_ENDPOINT_INTERNAL','oss-cn-hangzhou-internal.aliyuncs.com'),//'<internal endpoint [OSS内网节点] 如:oss-cn-shenzhen-internal.aliyuncs.com>', // v2.0.4 新增配置属性,如果为空,则默认使用 endpoint 配置(由于内网上传有点小问题未解决,请大家暂时不要使用内网节点上传,正在与阿里技术沟通中)
-            'cdnDomain' => env('ALI_OSS_CDN_DOMAIN', ''),//'<CDN domain, cdn域名>', // 如果isCName为true, getUrl会判断cdnDomain是否设定来决定返回的url,如果cdnDomain未设置,则使用endpoint来生成url,否则使用cdn
-            'ssl' => env('ALI_OSS_SSL', false),//<true|false> // true to use 'https://' and false to use 'http://'. default is false,
-            'isCName' => env('ALI_OSS_IS_CNAME', true),//<true|false> // 是否使用自定义域名,true: 则Storage.url()会使用自定义的cdn或域名生成文件url, false: 则使用外部节点生成url
-            'debug' => false//<true|false>
-        ],
-        'storage' => [
-            'folder' => 'files',//注意不要加'/'
-            'classifyByFileType' => false,//是否根据文件类型拆分到子文件夹
-
-        ],
-
-
-    ],
-    /**
-     * 和原 UEditor /php/config.json 配置完全相同
-     *
-     */
-    /* 上传图片配置项 */
-    'upload' => [
-        "imageActionName" => "uploadimage", /* 执行上传图片的action名称 */
-        "imageFieldName" => "upfile", /* 提交的图片表单名称 */
-        "imageMaxSize" => 2048000, /* 上传大小限制,单位B */
-        "imageAllowFiles" => [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
-        "imageCompressEnable" => true, /* 是否压缩图片,默认是true */
-        "imageCompressBorder" => 1600, /* 图片压缩最长边限制 */
-        "imageInsertAlign" => "none", /* 插入的图片浮动方式 */
-        "imageUrlPrefix" => "", /* 图片访问路径前缀 */
-        "imagePathFormat" => "/uploads/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
-        /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */
-        /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */
-        /* {time} 会替换成时间戳 */
-        /* {yyyy} 会替换成四位年份 */
-        /* {yy} 会替换成两位年份 */
-        /* {mm} 会替换成两位月份 */
-        /* {dd} 会替换成两位日期 */
-        /* {hh} 会替换成两位小时 */
-        /* {ii} 会替换成两位分钟 */
-        /* {ss} 会替换成两位秒 */
-        /* 非法字符 \ : * ? " < > | */
-        /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */
-
-        /* 涂鸦图片上传配置项 */
-        "scrawlActionName" => "uploadscrawl", /* 执行上传涂鸦的action名称 */
-        "scrawlFieldName" => "upfile", /* 提交的图片表单名称 */
-        "scrawlPathFormat" => "/uploads/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
-        "scrawlMaxSize" => 2048000, /* 上传大小限制,单位B */
-        "scrawlUrlPrefix" => "", /* 图片访问路径前缀 */
-        "scrawlInsertAlign" => "none",
-
-        /* 截图工具上传 */
-        "snapscreenActionName" => "uploadimage", /* 执行上传截图的action名称 */
-        "snapscreenPathFormat" => "/uploads/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
-        "snapscreenUrlPrefix" => "", /* 图片访问路径前缀 */
-        "snapscreenInsertAlign" => "none", /* 插入的图片浮动方式 */
-
-        /* 抓取远程图片配置 */
-        "catcherLocalDomain" => ["127.0.0.1", "localhost", "img.baidu.com"],
-        "catcherActionName" => "catchimage", /* 执行抓取远程图片的action名称 */
-        "catcherFieldName" => "source", /* 提交的图片列表表单名称 */
-        "catcherPathFormat" => "/uploads/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
-        "catcherUrlPrefix" => "", /* 图片访问路径前缀 */
-        "catcherMaxSize" => 2048000, /* 上传大小限制,单位B */
-        "catcherAllowFiles" => [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
-
-        /* 上传视频配置 */
-        "videoActionName" => "uploadvideo", /* 执行上传视频的action名称 */
-        "videoFieldName" => "upfile", /* 提交的视频表单名称 */
-        "videoPathFormat" => "/uploads/ueditor/php/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
-        "videoUrlPrefix" => "", /* 视频访问路径前缀 */
-        "videoMaxSize" => 102400000, /* 上传大小限制,单位B,默认100MB */
-        "videoAllowFiles" => [
-            ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
-            ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */
-
-        /* 上传文件配置 */
-        "fileActionName" => "uploadfile", /* controller里,执行上传视频的action名称 */
-        "fileFieldName" => "upfile", /* 提交的文件表单名称 */
-        "filePathFormat" => "/uploads/ueditor/php/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
-        "fileUrlPrefix" => "", /* 文件访问路径前缀 */
-        "fileMaxSize" => 51200000, /* 上传大小限制,单位B,默认50MB */
-        "fileAllowFiles" => [
-            ".png", ".jpg", ".jpeg", ".gif", ".bmp",
-            ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
-            ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
-            ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
-            ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
-        ], /* 上传文件格式显示 */
-
-        /* 列出指定目录下的图片 */
-        "imageManagerActionName" => "listimage", /* 执行图片管理的action名称 */
-        "imageManagerListPath" => "/uploads/ueditor/php/upload/image/", /* 指定要列出图片的目录 */
-        "imageManagerListSize" => 20, /* 每次列出文件数量 */
-        "imageManagerUrlPrefix" => "", /* 图片访问路径前缀 */
-        "imageManagerInsertAlign" => "none", /* 插入的图片浮动方式 */
-        "imageManagerAllowFiles" => [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
-
-        /* 列出指定目录下的文件 */
-        "fileManagerActionName" => "listfile", /* 执行文件管理的action名称 */
-        "fileManagerListPath" => "/uploads/ueditor/php/upload/file/", /* 指定要列出文件的目录 */
-        "fileManagerUrlPrefix" => "", /* 文件访问路径前缀 */
-        "fileManagerListSize" => 20, /* 每次列出文件数量 */
-        "fileManagerAllowFiles" => [
-            ".png", ".jpg", ".jpeg", ".gif", ".bmp",
-            ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
-            ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
-            ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
-            ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
-        ]] /* 列出的文件类型 */
-];

+ 0 - 1
config/app.php

@@ -161,7 +161,6 @@ return [
         Illuminate\Translation\TranslationServiceProvider::class,
         Illuminate\Validation\ValidationServiceProvider::class,
         Illuminate\View\ViewServiceProvider::class,
-        \Stevenyangecho\UEditor\UEditorServiceProvider::class,
 
         /*
          * Package Service Providers...

+ 7 - 0
config/hr.php

@@ -0,0 +1,7 @@
+<?php
+
+return [
+
+    'qrCode_refresh_everyday' =>true,
+
+];

+ 1 - 1
database/migrations/2020_03_25_164138_create_process_statistics_table.php

@@ -17,7 +17,7 @@ class CreateProcessStatisticsTable extends Migration
     {
         Schema::create('process_statistics', function (Blueprint $table) {
             $table->bigInteger('process_id')->unique()->comment('外键二次加工单');
-            $table->timestamp('started_at')->comment('开始日期');
+            $table->timestamp('started_at')->nullable()->comment('开始日期');
             $table->timestamp('ended_at')->nullable()->comment('结束日期');
             $table->decimal('revenue')->nullable()->comment('收入合计');
             $table->integer('duration_days')->nullable()->comment('完成天数');

+ 1 - 1
database/migrations/2020_03_25_164322_create_user_duty_checks_table.php

@@ -18,7 +18,7 @@ class CreateUserDutyChecksTable extends Migration
         Schema::create('user_duty_checks', function (Blueprint $table) {
             $table->bigIncrements('id');
             $table->bigInteger('user_id')->index()->comment('外键用户');
-            $table->timestamp('checked_at')->comment('打卡时间');
+            $table->timestamp('checked_at')->index()->comment('打卡时间');
             $table->bigInteger('verify_user_id')->nullable()->comment('外键用户(确认人)');
             $table->enum('type',['无','登出','登入'])->default('无')->comment('打卡类型');
             $table->enum('source',['正常','补入'])->default('正常')->comment('来源');

+ 5 - 0
database/migrations/2020_04_09_111337_add_tutorial_authority.php

@@ -12,6 +12,11 @@ class AddTutorialAuthority extends Migration
         '教程-录入',
         '教程-编辑',
         '教程-删除',
+        '临时工',
+        '临时工-查询',
+        '临时工-录入',
+        '临时工-编辑',
+        '临时工-删除',
     ];
     /**
      * Run the migrations.

+ 6 - 0
database/migrations/2020_04_09_111539_change_tutorial_table.php → database/migrations/2020_04_09_111540_change_tutorial_table.php

@@ -16,6 +16,9 @@ class ChangeTutorialTable extends Migration
         Schema::table('tutorials', function (Blueprint $table) {
             $table->dropColumn('content');
         });
+        Schema::table('users', function (Blueprint $table) {
+            $table->string('email')->nullable()->change();
+        });
     }
 
     /**
@@ -28,5 +31,8 @@ class ChangeTutorialTable extends Migration
         Schema::table('tutorials', function (Blueprint $table) {
             $table->longText('content')->after('name')->nullable()->comment('富文本内容');
         });
+        Schema::table('users', function (Blueprint $table) {
+            $table->string('email')->unique()->change();
+        });
     }
 }

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

@@ -21,7 +21,7 @@ const datetime={
             time.target.value=time.target.value.replace(/^([3-9])([\d]{1})/,"2$2");
             time.target.value=time.target.value.replace(/^([2-9]{1})([4-9]{1})/,"$13");
             time.target.value=time.target.value.replace(/^([\d]{1})([\d]{1}):([6-9]{1})/,"$1$2:5");
-        },1);
+        },10);
     },
 };
 module.exports=datetime;

+ 29 - 49
resources/views/maintenance/city/create.blade.php

@@ -1,62 +1,42 @@
 @extends('layouts.app')
 @section('title')创建城市@endsection
-@section('head')
-    @include('UEditor::head');
-@endsection
 @section('content')
     <div id="nav2">
         @component('maintenance.menu')@endcomponent
         @component('maintenance.city.menu')@endcomponent
     </div>
-    <div class="container-fluid mt-3">
-        <!-- 加载编辑器的容器 -->
-        <script id="containerx" name="content" type="text/plain">
-    富文本编辑器演示,使用后记得删除
-</script>
-        <script>setTimeout(function () {
-                alert(ue.getContent())
-            },1000)</script>
-
-        <!-- 实例化编辑器 -->
-        <script type="text/javascript">
-            var ue = UE.getEditor('containerx');
-            ue.ready(function() {
-                ue.execCommand('serverparam', '_token', '{{ csrf_token() }}');//此处为支持laravel5 csrf ,根据实际情况修改,目的就是设置 _token 值.
-            });
-        </script>
-        <div class="card col-md-8 offset-md-2">
-            <div class="card-body">
-                <form method="POST" action="{{ url('maintenance/city') }}">
-                    @csrf
-                    <div class="form-group row">
-                        <label for="province_id" class="col-2 col-form-label text-right">所属省份</label>
-                        <div class="col-8">
-                            <select name="City[province_id]" class="form-control" style="width: 30%;">
-                                @foreach($provinces as $province)
-                                    <option value="{{$province->id}}">{{$province->name}}</option>
-                                @endforeach
-                            </select>
-                        </div>
+    <div class="card col-md-8 offset-md-2">
+        <div class="card-body">
+            <form method="POST" action="{{ url('maintenance/city') }}">
+                @csrf
+                <div class="form-group row">
+                    <label for="province_id" class="col-2 col-form-label text-right">所属省份</label>
+                    <div class="col-8">
+                        <select name="City[province_id]" class="form-control" style="width: 30%;">
+                            @foreach($provinces as $province)
+                                <option value="{{$province->id}}">{{$province->name}}</option>
+                            @endforeach
+                        </select>
                     </div>
-                    <div class="form-group row">
-                        <label for="name" class="col-2 col-form-label text-right">城市名称</label>
-                        <div class="col-8">
-                            <input type="text" class="form-control @error('City.name') is-invalid @enderror"
-                                   name="City[name]" autocomplete="off" value="{{ old('City')['name'] }}" required>
-                            @error('City.name')
-                            <span class="invalid-feedback" role="alert">
-                                        <strong>{{ $errors->first('City.name') }}</strong>
-                                    </span>
-                            @enderror
-                        </div>
+                </div>
+                <div class="form-group row">
+                    <label for="name" class="col-2 col-form-label text-right">城市名称</label>
+                    <div class="col-8">
+                        <input type="text" class="form-control @error('City.name') is-invalid @enderror"
+                               name="City[name]" autocomplete="off" value="{{ old('City')['name'] }}" required>
+                        @error('City.name')
+                        <span class="invalid-feedback" role="alert">
+                                    <strong>{{ $errors->first('City.name') }}</strong>
+                                </span>
+                        @enderror
                     </div>
-                    <div class="form-group row">
-                        <div class="col-8 offset-2">
-                            <input type="submit" class="btn btn-success form-control">
-                        </div>
+                </div>
+                <div class="form-group row">
+                    <div class="col-8 offset-2">
+                        <input type="submit" class="btn btn-success form-control">
                     </div>
-                </form>
-            </div>
+                </div>
+            </form>
         </div>
     </div>
 @endsection

+ 4 - 0
resources/views/maintenance/menu.blade.php

@@ -66,6 +66,10 @@
                 <li class="nav-item">
                     <a class="nav-link text-muted" href="{{url('maintenance/tutorial')}}" :class="{active:isActive('tutorial',2)}">教程</a>
                 </li> @endcan
+            @can('临时工')
+                <li class="nav-item">
+                    <a class="nav-link text-muted" href="{{url('maintenance/userLabor')}}" :class="{active:isActive('userLabor',2)}">临时工</a>
+                </li> @endcan
             @can('日志')
                 <li class="nav-item">
                     <a class="nav-link text-muted" href="{{url('maintenance/log')}}" :class="{active:isActive('log',2)}">日志</a>

+ 99 - 0
resources/views/maintenance/userLabor/edit.blade.php

@@ -0,0 +1,99 @@
+@extends('layouts.app')
+@section('title')临时工@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+    </span>
+
+    <div class="card col-md-8 offset-md-2 mt-5" id="edit">
+        <div class="card-body">
+            <form method="POST" action="{{url("maintenance/userLabor/{$userLabor->user_id}")}}">
+                @csrf
+                @method('PUT')
+                <div class="form-group row pt-0">
+                    <label for="full_name" class="form-check-label col-3 pull-left">姓名:</label>
+                    <input name="full_name" :value="userLabor.full_name" id="full_name" class="@error('full_name') is-invalid @enderror col-7 form-control" type="text">
+                    @error('full_name')
+                    <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                    <strong>{{ $errors->first('full_name') }}</strong>
+                    </span>
+                    @enderror
+                </div>
+                <div class="form-group row">
+                    <label for="mobile_phone" class="form-check-label col-3 pull-left">电话:</label>
+                    <input name="mobile_phone" :value="userLabor.mobile_phone"  id="mobile_phone" class="@error('mobile_phone') is-invalid @enderror col-7 form-control" type="text">
+                    @error('mobile_phone')
+                    <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                    <strong>{{ $errors->first('mobile_phone') }}</strong>
+                    </span>
+                    @enderror
+                </div>
+                <div class="form-group row">
+                    <label for="gender" class="form-check-label col-3 pull-left">性别:</label>
+                    <div class="custom-control custom-radio col-4">
+                        <input v-if="userLabor.gender=='男'" checked name="gender" value="男"  type="radio" id="boy" class=" custom-control-input" >
+                        <input v-else name="gender" value="男"  type="radio" id="boy" class=" custom-control-input" >
+                        <label class="custom-control-label" for="boy">男</label>
+                    </div>
+                    <div class="custom-control custom-radio col-4">
+                        <input v-if="userLabor.gender=='女'" checked name="gender" value="女"  type="radio" id="girl" class=" custom-control-input" >
+                        <input v-else name="gender" value="女"  type="radio" id="girl" class=" custom-control-input" >
+                        <label  class="custom-control-label" for="girl">女</label>
+                    </div>
+                    @error('gender')
+                    <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                    <strong>{{ $errors->first('gender') }}</strong>
+                    </span>
+                    @enderror
+                </div>
+                <div class="form-group row">
+                    <label for="identity_number"  class="@error('identity_number') is-invalid @enderror form-check-label col-3 pull-left">身份证号:</label>
+                    <input name="identity_number" :value="userLabor.identity_number" id="identity_number" class="col-7 form-control" type="text">
+                    @error('identity_number')
+                    <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                    <strong>{{ $errors->first('identity_number') }}</strong>
+                    </span>
+                    @enderror
+                </div>
+                <div class="form-group row">
+                    <label for="default_hour_price" class="form-check-label col-3 pull-left">默认计时工资/小时:</label>
+                    <input name="default_hour_price" :value="userLabor.default_hour_price" id="default_hour_price" class="@error('default_hour_price') is-invalid @enderror col-7 form-control" type="text">
+                    @error('default_hour_price')
+                    <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                    <strong>{{ $errors->first('default_hour_price') }}</strong>
+                    </span>
+                    @enderror
+                </div>
+                <div class="form-group row">
+                    <label for="company" class="form-check-label col-3 pull-left">劳务所:</label>
+                    <input name="company" :value="userLabor.company" id="company" class="@error('company') is-invalid @enderror col-7 form-control" type="text">
+                    @error('company')
+                    <span class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                    <strong>{{ $errors->first('company') }}</strong>
+                    </span>
+                    @enderror
+                </div>
+                <div class="form-group row pt-3">
+                    <button type="submit" class="col-7 offset-2 btn btn-success">提交更改</button>
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+<script>
+    new Vue({
+        el:"#edit",
+        data:{
+            userLabor:{full_name:"{{old('full_name')??$userLabor->userDetail->full_name}}",
+                mobile_phone:'{{old('mobile_phone')??$userLabor->userDetail->mobile_phone}}',
+                gender:'{{old('gender')??$userLabor->userDetail->gender}}',
+                identity_number:'{{old('identity_number')??$userLabor->userDetail->identity_number}}',
+                default_hour_price:'{{old('default_hour_price')??$userLabor->default_hour_price}}',
+                company:'{{old('company')??$userLabor->company}}'},
+        },
+    });
+</script>
+@endsection

+ 191 - 0
resources/views/maintenance/userLabor/index.blade.php

@@ -0,0 +1,191 @@
+@extends('layouts.app')
+@section('title')临时工@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('maintenance.menu')@endcomponent
+    </span>
+    <div class="container-fluid mt-3 card" id="list">
+        <div class="card-body">
+            @if(Session::has('successTip'))
+                <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
+            @endif
+            <div class="modal fade" id="workRecord" tabindex="-1" role="dialog" aria-hidden="true">
+                <div class="modal-dialog">
+                    <div class="modal-content" style="width: 800px">
+                        <div class="modal-header">
+                            <button type="button" class="close pull-right" data-dismiss="modal" aria-hidden="true">&times;</button>
+                        </div>
+                        <div class="modal-body m-auto">
+                            <table class="table-sm table-bordered table-striped text-nowrap">
+                                <thead class="thead-light">
+                                <tr>
+                                    <td>二次加工单号</td>
+                                    <td>开始时间</td>
+                                    <td>结束时间</td>
+                                    <td>计件数</td>
+                                    <td>计件工资</td>
+                                    <td>计时数</td>
+                                    <td>计时工资</td>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                <tr v-for="processDailyParticipant in processDailyParticipants">
+                                    <td v-if="processDailyParticipant.process_daily">@{{ processDailyParticipant.process_daily.process_code }}</td>
+                                    <td>@{{ processDailyParticipant.started_at }}</td>
+                                    <td>@{{ processDailyParticipant.ended_at }}</td>
+                                    <td>@{{ processDailyParticipant.unit_count }}</td>
+                                    <td>@{{ processDailyParticipant.unit_price }}</td>
+                                    <td>@{{ processDailyParticipant.hour_count }}</td>
+                                    <td>@{{ processDailyParticipant.hour_price }}</td>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="modal-footer">
+                            <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                        </div>
+                    </div><!-- /.modal-content -->
+                </div><!-- /.modal -->
+            </div>
+            <div class="modal fade" id="clockRecord" tabindex="-1" role="dialog" aria-hidden="true">
+                <div class="modal-dialog">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <button type="button" class="close pull-right" data-dismiss="modal" aria-hidden="true">&times;</button>
+                        </div>
+                        <div class="modal-body m-auto">
+                            <table class="table-sm table-bordered table-striped text-nowrap">
+                                <thead class="thead-light">
+                                <tr>
+                                    <td>打卡时间</td>
+                                    <td>打卡类型</td>
+                                    <td>记录类型</td>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                <tr v-for="userDutyCheck in userDutyChecks">
+                                    <td>@{{ userDutyCheck.checked_at }}</td>
+                                    <td>@{{ userDutyCheck.type }}</td>
+                                    <td>@{{ userDutyCheck.source }}</td>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="modal-footer">
+                            <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                        </div>
+                    </div><!-- /.modal-content -->
+                </div><!-- /.modal -->
+            </div>
+            <table class="table table-striped table-sm" >
+                <tr>
+                    <th>序号</th>
+                    <th>姓名</th>
+                    <th>电话</th>
+                    <th>详情</th>
+                    <th>操作</th>
+                </tr>
+                <tr v-for="(userLabor,i) in userLabors">
+                    <td>@{{ i+1 }}</td>
+                    <td class="text-muted" v-if="userLabor.user_detail">@{{userLabor.user_detail.full_name}}</td>
+                    <td v-if="userLabor.user_detail">@{{userLabor.user_detail.mobile_phone}}</td>
+                    <td><u class="text-info" style="cursor:pointer" @click="show(userLabor.user_id)">查看详情</u></td>
+                    <td>
+                        @can('临时工-编辑')
+                            <button class="btn btn-sm btn-outline-primary" @click="edit(userLabor.user_id)">改</button>@endcan
+                        @can('临时工-删除')
+                            <button class="btn btn-sm btn-outline-dark" @click="destroy(userLabor)">删</button> @endcan
+                            <button class="btn btn-sm btn-outline-dark" @click="workRecord(userLabor.user_id)">劳务记录</button>
+                            <button class="btn btn-sm btn-outline-dark" @click="clockRecord(userLabor.user_id)">打卡记录</button>
+                    </td>
+                </tr>
+            </table>
+            {{$userLabors->links()}}
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                userLabors:[
+                    @foreach( $userLabors as $userLabor )
+                    {!! $userLabor !!},
+                    @endforeach
+                ],
+                processDailyParticipants:[],
+                userDutyChecks:[],
+            },
+            methods:{
+                show(user_id){
+                    window.open("{{url('maintenance/userLabor')}}/"+user_id);
+                },
+                workRecord(user_id){
+                    let _this=this;
+                    axios.post("{{url('maintenance/userLabor/getWorkRecord')}}",{user_id:user_id})
+                        .then(function (response) {
+                            if (response.data.error){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.error);
+                                return;
+                            }
+                            _this.processDailyParticipants=response.data;
+                            $("#workRecord").modal('show');
+                        }).catch(function (err) {
+                        tempTip.setDuration(3000);
+                        tempTip.show('获取劳务记录失败!网络错误:' + err);
+                        });
+                },
+                clockRecord(user_id){
+                    let _this=this;
+                    axios.post("{{url('maintenance/userLabor/getClockRecord')}}",{user_id:user_id})
+                        .then(function (response) {
+                            if (response.data.error){
+                                tempTip.setDuration(3000);
+                                tempTip.show(response.data.error);
+                                return;
+                            }
+                            _this.userDutyChecks=response.data;
+                            $("#clockRecord").modal('show');
+                        }).catch(function (err) {
+                        tempTip.setDuration(3000);
+                        tempTip.show('获取打卡记录失败!网络错误:' + err);
+                    });
+                },
+                edit:function(id){
+                    location.href = "{{url('maintenance/userLabor')}}/"+id+"/edit";
+                },
+                destroy:function(userLabor){
+                    if(!confirm('确定要删除临时工“' + userLabor.user_detail.full_name + '”吗?')){return};
+                    let _this=this;
+                    let user_id=userLabor.user_id;
+                    let url = "{{url('maintenance/userLabor')}}/"+user_id;
+                    axios.delete(url)
+                        .then(function (response) {
+                            if(response.data.success=="true"){
+                                _this.userLabors.every(function (userLabor,i) {
+                                    if (userLabor.user_id==user_id){
+                                        _this.userLabors.splice(i,1);
+                                        return false;
+                                    }
+                                    return true;
+                                });
+                                tempTip.setDuration(3000);
+                                tempTip.showSuccess('删除临时工成功!');
+                                return;
+                            }
+                            tempTip.setDuration(3000);
+                            tempTip.show('删除临时工失败!');
+                        })
+                        .catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('删除临时工失败!'+'网络错误:' + err);
+                        });
+                },
+            }
+        });
+    </script>
+@endsection

+ 59 - 0
resources/views/maintenance/userLabor/show.blade.php

@@ -0,0 +1,59 @@
+@extends('layouts.app')
+@section('title')临时工详情@endsection
+
+@section('content')
+    <div id="nav2">
+        @component('maintenance.menu')@endcomponent
+    </div>
+    <div class="container-fluid mt-3" id="show">
+        <div class="card ">
+            <div class="card-body">
+                <table class="table table-striped">
+                    <tr>
+                        <td>ID</td>
+                        <td>@{{ userLabor.user_id }}</td>
+                    </tr>
+                    <tr>
+                        <td>姓名</td>
+                        <td><b v-if="userLabor.user_detail">@{{ userLabor.user_detail.full_name }}</b></td>
+                    </tr>
+                    <tr>
+                        <td>电话</td>
+                        <td><b v-if="userLabor.user_detail">@{{ userLabor.user_detail.mobile_phone }}</b></td>
+                    </tr>
+                    <tr>
+                        <td>性别</td>
+                        <td><b v-if="userLabor.user_detail">@{{ userLabor.user_detail.gender }}</b></td>
+                    </tr>
+                    <tr>
+                        <td>身份证号</td>
+                        <td><b class="text-muted" v-if="userLabor.user_detail">@{{ userLabor.user_detail.identity_number }}</b></td>
+                    </tr>
+                    <tr>
+                        <td>劳务所</td>
+                        <td>@{{ userLabor.company }}</td>
+                    </tr>
+                    <tr>
+                        <td>工资/工时</td>
+                        <td>@{{ userLabor.default_hour_price }}</td>
+                    </tr>
+                    <tr>
+                        <td>创建时间</td>
+                        <td><b v-if="userLabor.user_detail">@{{ userLabor.user_detail.created_at }}</b></td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+<script>
+    new Vue({
+        el:"#show",
+        data:{
+            userLabor:{!! $userLabor !!},
+        },
+    });
+</script>
+@endsection

+ 22 - 0
resources/views/process/checking-in/clock.blade.php

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+    </head>
+    <body>
+        <div class="card col-md-8 offset-md-2 mt-5">
+            <div class="card-body">
+                <form method="post" action="{{url('userDutyCheck/storeClock')}}">
+                    @csrf
+                    <div class="form-group row">
+                        <label for="mobile_phone" class="form-check-label col-3 pull-right">手机号:</label>
+                        <input name="mobile_phone" id="mobile_phone" class="@error('mobile_phone') is-invalid @enderror col-7 form-control" type="text">
+                    </div>
+                    <div class="form-group row pt-3">
+                        <button type="submit" class="col-7 offset-2 btn btn-success">提交</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </body>
+</html>

+ 105 - 0
resources/views/process/checking-in/clockAudit.blade.php

@@ -0,0 +1,105 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('process.menu')@endcomponent
+        @component('process.checking-in.menuChecking-in')@endcomponent
+    </div>
+    <div class="container-fluid mt-3" id="list">
+        <div class="card col-md-10 offset-md-1">
+            <div class="card-body p-0">
+                <table class="table table-striped table-bordered text-nowrap">
+                    <thead class="thead-light">
+                    <tr>
+                        <td>序号</td>
+                        <td>姓名</td>
+                        <td>手机号</td>
+                        <td>劳务所</td>
+                        <td>打卡时间</td>
+                        <td>打卡类型</td>
+                        <td>操作</td>
+                        <td>异常</td>
+                        <td>合计工时</td>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr v-for="(userDutyCheck,i) in userDutyChecks">
+                        <td>@{{ i+1 }}</td>
+                        <td ><p v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.full_name }}</p></td>
+                        <td ><p v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.mobile_phone }}</p></td>
+                        <td ><p v-if="userDutyCheck.user_detail">@{{ userDutyCheck.user_detail.user_labor_company }}</p></td>
+                        <td>@{{ userDutyCheck.checked_at }}</td>
+                        <td>
+                            <div v-if="userDutyCheck.verify_user_id" class="text-center">@{{ userDutyCheck.type }}</div>
+                            <select v-else v-model="userDutyCheck.type" @change="isException(userDutyCheck.id,userDutyCheck.user_id,userDutyCheck.checked_at,userDutyCheck.type)" class="form-control" style="width: 100px">
+                                <option value="登入">登入</option>
+                                <option value="登出">登出</option>
+                            </select>
+                        </td>
+                        <td>
+                            <b v-if="userDutyCheck.verify_user_id" class="text-success">已审核</b>
+                            <button v-else @click="storeClockAudit(userDutyCheck.id,userDutyCheck.type)" class="btn btn-primary w-80">审核</button>
+                        </td>
+                        <td>@{{ userDutyCheck.exception }}</td>
+                        <td>@{{ userDutyCheck.duration_man_hour }}</td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                userDutyChecks:[
+                    @foreach($userDutyChecks as $userDutyCheck)
+                    {id:'{{$userDutyCheck->id}}',user_id:'{{$userDutyCheck->user_id}}',checked_at:'{{$userDutyCheck->checked_at}}',
+                    type:'{{$userDutyCheck->type}}',verify_user_id:'{{$userDutyCheck->verify_user_id}}',
+                    exception:'',duration_man_hour:'',@if($userDutyCheck->userDetail)user_detail:{!! $userDutyCheck->userDetail !!} @endif },
+                    @endforeach
+                ],
+            },
+            methods:{
+                storeClockAudit(id,type){
+                    let _this=this;
+                    axios.post('{{url("process/storeClockAudit")}}',{id:id,type:type})
+                        .then(function (response) {
+                            _this.userDutyChecks.every(function (userDutyCheck) {
+                                if (userDutyCheck.id==id){
+                                    userDutyCheck.verify_user_id=response.data;
+                                    tempTip.setDuration(4000);
+                                    tempTip.showSuccess('审核通过!');
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('审核失败!网络错误:'+err);
+                        });
+                },
+                isException(id,user_id,checked_at,type){
+                    let _this=this;
+                    axios.post('{{url("process/isException")}}',{id:id,user_id:user_id,checked_at:checked_at,type:type})
+                        .then(function (response) {
+                            _this.userDutyChecks.every(function (userDutyCheck) {
+                                if (userDutyCheck.id==id){
+                                    userDutyCheck.exception=response.data.exception;
+                                    userDutyCheck.duration_man_hour=response.data.duration_man_hour;
+                                    return false
+                                }
+                                return true;
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('校验失败!网络错误:'+err);
+                        });
+                }
+            },
+        });
+    </script>
+@endsection

+ 131 - 0
resources/views/process/checking-in/createReplenishClock.blade.php

@@ -0,0 +1,131 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('process.menu')@endcomponent
+        @component('process.checking-in.menuChecking-in')@endcomponent
+    </div>
+    <div class="container-fluid mt-3" id="list">
+        <div class="card col-md-10 offset-md-1">
+            <div class="card-body">
+                <div class="form-group row">
+                    <input v-model="full_name" class="col-6 offset-2 form-control" type="text" placeholder="按名称搜索临时工">
+                    <button @click="checkUserLabors()" class="col-2 btn btn-info">搜索</button>
+                </div>
+                <table v-if="userLabors.length>0" class="col-10 offset-1 mt-3 table table-bordered table-hover text-nowrap">
+                    <thead class="thead-light">
+                    <tr>
+                        <th>名称</th>
+                        <th>电话</th>
+                        <th>劳务所</th>
+                        <th>最近打卡时间</th>
+                        <th>输入补卡时间</th>
+                        <th>类型</th>
+                        <th>操作</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr v-for="userLabor in userLabors">
+                        <td>@{{ userLabor.full_name }}</td>
+                        <td>@{{ userLabor.mobile_phone }}</td>
+                        <td>@{{ userLabor.user_labor_company }}</td>
+                        <td>
+                            <ul class="p-0 m-0 list-unstyled list-inline">
+                                <li v-for="user_duty_check in userLabor.user_duty_checks"><small>@{{ user_duty_check.checked_at }}</small></li>
+                            </ul>
+                        </td>
+                        <td >
+                            <input  v-model="userLabor.userDutyCheck_date" type="date" class="form-control-sm" style="width: 150px"><br>
+                            <input  v-model="userLabor.userDutyCheck_time" @input="hourVerify($event)"  placeholder="时:分" type="text" class="form-control-sm mt-2" style="width: 150px" ><br>
+                            <small v-if="errors.checked_at && errors.checked_at.length>0 " class="text-danger">@{{ errors.checked_at[0] }}</small>
+                        </td>
+                        <td>
+                            <select :class="{ 'is-invalid' : errors.type && errors.type.length>0 }" v-model="userLabor.userDutyCheck_type" class="form-control">
+                                <option value="">请选择</option>
+                                <option value="登入">登入</option>
+                                <option value="登出">登出</option>
+                            </select>
+                        </td>
+                        <td><button @click="storeReplenishClock(userLabor)" class="btn btn-info w-100">提交补卡</button></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#list",
+            data:{
+                full_name:'',
+                userLabors:[],
+                errors:{'checked_at':[],'type':[],},
+            },
+            methods:{
+                checkUserLabors(){
+                    let full_name=this.full_name;
+                    let _this=this;
+                    if (!full_name){
+                        tempTip.setDuration(3000);
+                        tempTip.show('请输入临时工全名进行搜索!');
+                        return;
+                    }
+                    axios.post("{{url('process/checkUserLabors')}}",{full_name:full_name})
+                        .then(function (response) {
+                            if (response.data.success){
+                                if (response.data.data.length<1){
+                                    tempTip.setDuration(3000);
+                                    tempTip.show('暂无此人打卡信息!');
+                                    return;
+                                }
+                                response.data.data.every(function (userLabor) {
+                                    userLabor['userDutyCheck_type']='';
+                                    userLabor['userDutyCheck_date']='';
+                                    userLabor['userDutyCheck_time']='';
+                                    return true;
+                                });
+                                _this.userLabors=response.data.data;
+                            }
+                        }).catch(function (err) {
+                        tempTip.setDuration(4000);
+                        tempTip.show('搜索临时工打卡记录失败!网络错误:'+err);
+                        });
+                },
+                storeReplenishClock(userLabor){
+                    let checked_at=userLabor.userDutyCheck_date+" "+userLabor.userDutyCheck_time;
+                    if(!confirm('确定要提交'+userLabor.full_name+"在“"+userLabor.userDutyCheck_date+'”的补卡吗?')){return};
+                    let user_id=userLabor.user_id;
+                    let type=userLabor.userDutyCheck_type;
+                    let _this=this;
+                    axios.post("{{url('process/storeReplenishClock')}}",{user_id:user_id,checked_at:checked_at,type:type})
+                        .then(function (response) {
+                            if (response.data.success=="true"){
+                                _this.userLabors.every(function (userLabor) {
+                                    if (userLabor.user_id==userLabor.user_id) {
+                                        userLabor.user_duty_checks.splice((userLabor.user_duty_checks.length)-1,1);
+                                        userLabor.user_duty_checks.unshift(response.data.data);
+                                        return false;
+                                    }
+                                    return  true;
+                                });
+                                tempTip.setDuration(3000);
+                                tempTip.showSuccess(userLabor.full_name+'的补卡成功!');
+                                _this.errors={'checked_at':[],'type':[],};
+                                return;
+                            }
+                            _this.errors=response.data.data;
+                        }).catch(function (err) {
+                            tempTip.setDuration(4000);
+                            tempTip.show('录入补卡失败!网络错误:'+err);
+                        });
+                },
+                hourVerify:function(e){
+                    datetimeRelating.verifyTime(e);
+                },
+            },
+        });
+    </script>
+@endsection

+ 44 - 0
resources/views/process/checking-in/createUserDetail.blade.php

@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+</head>
+<body>
+<div class="card col-md-8 offset-md-2 mt-5">
+    <div class="card-body">
+        <form method="POST" action="{{url('userDutyCheck/storeUserDetail')}}">
+            @csrf
+            <div class="form-group row pb-0 m-auto">
+                <h6 class="col-6 offset-4 text-danger">未查询到您的信息,请登记您的资料!</h6>
+            </div>
+            <div class="form-group row pt-0">
+                <label for="full_name" class="form-check-label col-3 pull-left">姓名:</label>
+                <input name="full_name" id="full_name" class="@error('full_name') is-invalid @enderror col-7 form-control" type="text">
+            </div>
+            <div class="form-group row">
+                <label for="mobile_phone" class="form-check-label col-3 pull-left">电话:</label>
+                <input name="mobile_phone" @if($mobile_phone) value="{{$mobile_phone}}" @endif readonly id="mobile_phone" class="@error('mobile_phone') is-invalid @enderror col-7 form-control" type="text">
+            </div>
+            <div class="form-group row">
+                <label for="gender" class="form-check-label col-3 pull-left">性别:</label>
+                <div class="custom-control custom-radio col-4">
+                    <input checked name="gender" value="男"  type="radio" id="boy" class=" custom-control-input" >
+                    <label class="custom-control-label" for="boy">男</label>
+                </div>
+                <div class="custom-control custom-radio col-4">
+                    <input name="gender" value="女"  type="radio" id="girl" class=" custom-control-input" >
+                    <label class="custom-control-label" for="girl">女</label>
+                </div>
+            </div>
+            <div class="form-group row">
+                <label for="company" class="form-check-label col-3 pull-left">劳务所:</label>
+                <input name="company" id="company" class="col-7 form-control" type="text">
+            </div>
+            <div class="form-group row pt-3">
+                <button type="submit" class="col-7 offset-2 btn btn-success">登记</button>
+            </div>
+        </form>
+    </div>
+</div>
+</body>
+</html>

+ 16 - 0
resources/views/process/checking-in/menuChecking-in.blade.php

@@ -0,0 +1,16 @@
+<div class="container-fluid">
+    <div class="card menu-third" style="background: #f9f0f0;transform: scale(0.95)">
+        <ul class="nav nav-pills">
+            @can('二次加工管理')
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('process/checking-in/createReplenishClock')}}" :class="{active:isActive('createReplenishClock',3)}">录入补卡</a>
+                </li> @endcan
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('process/checking-in/clockAudit')}}" :class="{active:isActive('clockAudit',3)}">打卡审核</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('process/checking-in/missionAudit')}}" :class="{active:isActive('missionAudit',3)}">任务审核</a>
+                </li>
+        </ul>
+    </div>
+</div>

+ 184 - 0
resources/views/process/checking-in/missionAudit.blade.php

@@ -0,0 +1,184 @@
+@extends('layouts.app')
+
+@section('content')
+    <div id="nav2">
+        @component('process.menu')@endcomponent
+        @component('process.checking-in.menuChecking-in')@endcomponent
+    </div>
+
+    <div class="container-fluid card" id="list">
+        <div class="card-header">
+            <form method="GET" action="{{url('process/checking-in/missionAudit')}}" id="form">
+                <table class="table-sm text-nowrap table-bordered" style="width: 100%">
+                    <tbody>
+                    <tr v-if="isBeingFilterConditions">
+                        <td colspan="4">
+                            <div class="col" style="padding:0">
+                                <a  href="{{url('process/checking-in/missionAudit')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
+                            </div></td>
+                        <td></td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <span class="text-muted">每页显示记录:</span>
+                        </td>
+                        <td colspan="3">
+                            <select name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="submit">
+                                <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>
+                        <td></td>
+                    </tr>
+                    <tr>
+                        <td style="width: 200px">
+                            <span class="text-muted">根据条件过滤:</span>
+                        </td>
+                        <td class="col" style="width: 300px">
+                            <div class="col p-0">
+                                <label class="form-check-label col-2 pull-left p-0">日期:</label>
+                                <input v-model="filterData.start_date" name="start_date" type="date" class="form-control-sm m-0 col-7" style="width: 130px">
+                            </div>
+                            <input v-model="filterData.end_date" name="end_date" type="date" class="form-control-sm col-7 offset-md-2 mt-2" style="width: 130px">
+                        </td>
+                        <td style="width: 300px">
+                            <label class="form-check-label">姓名</label>
+                            <input v-model="filterData.full_name" name="full_name" class="form-control-sm" type="text">
+                        </td>
+                        <td style="width: 300px">
+                            <label class="form-check-label">电话</label>
+                            <input v-model="filterData.mobile_phone" name="mobile_phone" class="form-control-sm" type="text">
+                        </td>
+                        <td><input hidden type="submit"></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </form>
+        </div>
+        <div class="card-body">
+            <table class="table table-striped">
+                <thead class="thead-light">
+                <tr>
+                    <td>序号</td>
+                    <td>日期</td>
+                    <td>姓名</td>
+                    <td>电话</td>
+                    <td>劳务所</td>
+                    <td>登记工时</td>
+                    <td>打卡工时</td>
+                    <td>工时差</td>
+                    <td>计费工时</td>
+                    <td>计件数量</td>
+                    <td>查看</td>
+                    <td>审核</td>
+                </tr>
+                </thead>
+                <tbody>
+                <tr v-for="(processDailyParticipant,i) in processDailyParticipants">
+                    <td>@{{ i+1 }}</td>
+                    <td><p v-if="processDailyParticipant.process_daily">
+                            @{{ processDailyParticipant.process_daily.date }}</p></td>
+                    <td><p v-if="processDailyParticipant.user_detail">
+                            @{{ processDailyParticipant.user_detail.full_name }}</p></td>
+                    <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_company }}</p></td>
+                    <td>@{{ processDailyParticipant.hour_count }}</td>
+                    <td class="text-danger">@{{ processDailyParticipant.hour }}</td>
+                    <td class="text-danger">@{{ processDailyParticipant.diff }}</td>
+                    <td class="text-danger">@{{ processDailyParticipant.billingHour }}</td>
+                    <td>@{{ processDailyParticipant.unit_count }}</td>
+                    <td><button v-if="processDailyParticipant.user_detail" @click="showUserDetail(processDailyParticipant.user_id)" class="btn btn-info">查看</button></td>
+                    <td><b v-if="processDailyParticipant.status=='已审核'" class="text-success">已审核</b>
+                        <button v-else class="btn btn-primary" @click="storeMissionAudit(processDailyParticipant.id)">审核</button>
+                    </td>
+                </tr>
+                </tbody>
+            </table>
+            {{$processDailyParticipants->appends($request)->links()}}
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+<script>
+    new Vue({
+        el:"#list",
+        data:{
+            processDailyParticipants:[
+                @foreach($processDailyParticipants as $processDailyParticipant)
+                {!! $processDailyParticipant !!},
+                @endforeach
+            ],
+            filterData:{paginate:50,start_date:'',end_date:'',full_name:'',mobile_phone:''}
+        },
+        mounted:function () {
+            this.initInputs();
+        },
+        computed:{
+            isBeingFilterConditions:function(){
+                for(let key in this.filterData){
+                    if(this.filterData[key]){
+                        if(key==='paginate')continue;
+                        return true
+                    }
+                }
+                return false;
+            },
+
+        },
+        methods:{
+            //回显条件参数
+            initInputs:function(){
+                let data=this;
+                let uriParts =decodeURI(location.href).split("?");
+                if(uriParts.length>1){
+                    let params = uriParts[1].split('&');
+                    params.forEach(function(paramPair){
+                        let pair=paramPair.split('=');
+                        let key = pair[0], val = pair[1];
+                        $('input[name="'+key+'"]').val(val);
+                        $('select[name="'+key+'"]').val(val);
+                        decodeURI(data.filterData[key]=val);
+                    });
+                }
+            },
+            //提交表单
+            submit:function(){
+                let form = $("#form");
+                form.submit();
+            },
+            //提交审核
+            storeMissionAudit(id){
+                let _this=this;
+                axios.post('{{url("process/storeMissionAudit")}}',{id:id})
+                    .then(function (response) {
+                        if (response.data.error){
+                            tempTip.setDuration(3000);
+                            tempTip.show('审核失败:'+response.data.error);
+                            return;
+                        }
+                        _this.processDailyParticipants.every(function (processDailyParticipant) {
+                            if (processDailyParticipant.id==id){
+                                processDailyParticipant.status="已审核";
+                                tempTip.setDuration(3000);
+                                tempTip.showSuccess('审核通过!');
+                                return false;
+                            }
+                            return  true;
+                        });
+                    }).catch(function (err) {
+                    tempTip.setDuration(3000);
+                    tempTip.show('审核失败!网络错误:' + err);
+                    });
+            },
+            showUserDetail(user_id){
+                window.open("{{url('maintenance/userLabor')}}/"+user_id);
+            }
+        },
+    });
+</script>
+@endsection

+ 13 - 0
resources/views/process/checking-in/success.blade.php

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+</head>
+<body>
+    <div style="text-align: center">
+        <h2 style="margin-bottom: 0">宝时物流 二次加工管理</h2><br/>
+        <h5 style="margin-top: 0;color:#B8860B ">临时工作人员</h5><br/>
+        <h3 style="margin-bottom: 0">姓名:@if($full_name)<b style="color: #2a9055">{{$full_name}}</b>@endif&nbsp;&nbsp;&nbsp;&nbsp;打卡时间:@if($checked_at)<b style="color: #2a9055">{{$checked_at}}</b> @endif</h3><br/>
+        <h5 style="margin-top: 0;color: #B8860B">打卡请求已提交!等待确认</h5>
+    </div>
+</body>
+</html>

+ 302 - 6
resources/views/process/create.blade.php

@@ -7,15 +7,114 @@
     <div class="container-fluid mt-3" id="list">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">
-                <form method="POST" action="{{ url('process') }}">
-                    @csrf
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >单据号</label>
+                    <input v-model="process.wms_code" class="form-control col-6" :class="error.wms_code.length>0 ? 'is-invalid' :''">&nbsp;&nbsp;&nbsp;
+                    <input class="btn btn-info col-2" type="button" @click="addProcessContent()" value="新增库单据">
+                    <span v-if="error.wms_code.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                        <strong>@{{ error.wms_code[0] }}</strong>
+                    </span>
+                </div>
+                <div class="form-group row" v-if="processContents.length>0" v-for="processContent in processContents">
+                    <div class="col-8 offset-md-3 pl-0 pt-2 border  rounded">
+                        <div class="row pt-2">
+                            <label class="col-3 col-form-label text-right">单据号@{{ processContent.i }}</label>
+                            <b class="col-7">@{{ processContent.wms_code }}</b>
+                        </div>
+                        <div class="row pt-2" v-if="processContent.addBtnShow">
+                            <label class="col-3 col-form-label text-right">选择商品</label>
+                            <span class=" col-9 input-group" style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:1.5;text-align: center;">
+                                <ul class="list-group tooltipTarget" title="双击选择商品" style="width: 100%" onselectstart="return false;">
+                                    <li v-for="commodity in processContent.commodities" :id="commodity.id" class="list-group-item list-group-item-action p-0 m-0"
+                                         @dblclick="selectedCommodity(commodity,processContent.wms_code)" :class="processContent.commodity_id==commodity.id ? 'active' :''">
+                                        <p class="form-inline" style="cursor: default;"><small class="text-left col-6">@{{ commodity.name }}</small><small class="text-left  col-6">@{{ commodity.barcode }}</small></p></li>
+                                </ul>
+                            </span>
+                        </div>
+                        <div class="row pt-2">
+                            <label class="col-3 col-form-label text-right">商品名</label>
+                            <b  class="col-7">@{{ processContent.commodity_name }}</b>
+                        </div>
+                        <div class="row pt-2">
+                            <label class="col-3 col-form-label text-right">条码</label>
+                            <b  class="col-7">@{{ processContent.commodity_barcode }}</b>
+                        </div>
 
-                    <div class="form-group row">
-                        <div class="col-8 offset-2">
-                            <input type="submit" class="btn btn-success form-control">
+                        <div class="row pt-2">
+                            <label class="col-3 col-form-label text-right">SKU</label>
+                            <b  class="col-7">@{{ processContent.commodity_sku }}</b>
+                        </div>
+                        <div class="row pt-2">
+                            <label class="col-3 col-form-label text-right">单据类型</label>
+                            <select  :disabled="!processContent.addBtnShow" v-model="processContent.bill_type" class="col-7 form-control"
+                                     :class="processContentError[processContent.wms_code] && processContentError[processContent.wms_code].bill_type ? 'is-invalid' :''">
+                                <option value="移库单">移库单</option>
+                                <option value="入库单">入库单</option>
+                                <option value="出库单">出库单</option>
+                            </select>
+                        </div>
+                        <div  class="row pt-2">
+                            <label class="col-3 col-form-label text-right">数量</label>
+                            <input :readonly="!processContent.addBtnShow" v-model="processContent.amount" type="text" class="form-control col-7"
+                                   :class="processContentError[processContent.wms_code] && processContentError[processContent.wms_code].amount ? 'is-invalid' :''">
+                            <span v-if="processContentError[processContent.wms_code] && processContentError[processContent.wms_code].amount" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                                <strong>@{{ processContentError[processContent.wms_code].amount[0] }}</strong>
+                            </span>
                         </div>
+                        <div class="col-8 offset-2 pt-2" v-if="processContent.addBtnShow">
+                            <input type="button" @click="confirmStore(processContent.wms_code,processContent.commodity_id,processContent.amount)" value="确定新增" class="btn btn-primary form-control">
+                        </div>
+                        <div class="col-8 offset-2 pt-2 pb-2">
+                            <input type="button" @click="deleteProcessContent(processContent.wms_code)" value="删除" class="btn btn-danger form-control">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >货主</label>
+                    <input readonly v-if="processContents.length>0" :value="processContents[processContents.length-1].owner_name" class="form-control col-7" :class="error.owner_id.length>0 ? 'is-invalid' :''">
+                    <span v-if="error.owner_id.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                        <strong>@{{ error.owner_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >加工类型</label>
+                    <select v-model="process.process_method_id" class="form-control col-7" :class="error.process_method_id.length>0 ? 'is-invalid' :''">
+                        <option  v-for="processMethod in processMethods" :value="processMethod.id">@{{ processMethod.name }}</option>
+                    </select>
+                </div>
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >加工数量</label>
+                    <input v-model="process.amount" type="text" class="form-control col-7" :class="error.amount.length>0 ? 'is-invalid' :''">
+                    <span v-if="error.amount.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                        <strong>@{{ error.amount[0] }}</strong>
+                    </span>
+                </div>
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >单价</label>
+                    <input v-model="process.unit_price" type="text" class="form-control col-7" :class="error.unit_price.length>0 ? 'is-invalid' :''">
+                    <span v-if="error.unit_price.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
+                        <strong>@{{ error.unit_price[0] }}</strong>
+                    </span>
+                </div>
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >备注(选填)</label>
+                    <textarea v-model="process.remark" type="text" class="form-control col-7"></textarea>
+                </div>
+                <div class="form-group row">
+                    <label class="col-3 col-form-label text-right" >引用教程(选填)</label>
+                    <span class=" col-7 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;">
+                            <li v-for="tutorial in tutorials" :data-original-title="tutorial.style ? '双击删除教程' :'双击添加教程'"  :id="tutorial.id" class="tooltipTarget list-group-item list-group-item-action p-0 m-0"
+                                @dblclick="selectedTutorial(tutorial)" :class="tutorial.style ? 'active' :''">
+                                <p class="form-inline" style="cursor: default;">@{{ tutorial.name }}</p></li>
+                        </ul>
+                    </span>
+                </div>
+                <div class="form-group row">
+                    <div class="col-8 offset-2">
+                        <input type="button" @click="submit()" class="btn btn-success form-control" value="提交">
                     </div>
-                </form>
+                </div>
             </div>
         </div>
     </div>
@@ -26,6 +125,203 @@
         let vueList=new Vue({
             el:'#list',
             data:{
+                process:{wms_code:'',owner_id:'',process_method_id:'',unit_price:'',remark:'',amount:''},
+                error:{wms_code:[],owner_id:[],process_method_id:[],unit_price:[],amount:[]},
+                processContentError:[],
+                processContents:[],
+                processMethods:[
+                    @foreach($processMethods as $processMethod)
+                    {!! $processMethod !!},
+                    @endforeach
+                ],
+                tutorials:[],
+                selectedTutorials:[],
+            },
+            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);
+                        }
+                    }
+                },
+            },
+            mounted:function(){
+                $(".tooltipTarget").tooltip({'trigger':'hover'});
+            },
+            methods:{
+                //新增库单据
+                addProcessContent(){
+                    let _this=this;
+                    let wms_code=_this.process.wms_code;
+                    if (!wms_code){
+                        tempTip.setDuration(3000);
+                        tempTip.show('未输入单据号!');
+                        return;
+                    }
+                    if (_this.processContents.length>0 && _this.processContents[_this.processContents.length-1].addBtnShow) return;
+                    let isUnique=true;
+                    _this.processContents.every(function (processContent) {
+                        if (processContent.wms_code==wms_code){
+                            isUnique=false;
+                            return false;
+                        }
+                        return  true;
+                    });
+                    if (!isUnique){
+                        tempTip.setDuration(3000);
+                        tempTip.show('下方已添加该单据!');
+                        return;
+                    }
+                    axios.post('{{url("api/thirdPart/flux/process/getProcessContent")}}',{wms_code:wms_code})
+                        .then(function (response) {
+                            let processContent={};
+                            processContent['wms_code']=response.data.wms_code;
+                            processContent['owner_name']=response.data.owner_name;
+                            processContent['owner_id']=response.data.owner_id;
+                            processContent['commodities']=response.data.commodities;
+                            processContent['commodity_id']='';
+                            processContent['commodity_name']='';
+                            processContent['commodity_barcode']='';
+                            processContent['commodity_sku']='';
+                            processContent['bill_type']=response.data.bill_type;
+                            processContent['amount']=response.data.amount;
+                            processContent['addBtnShow']=true;
+                            _this.processContents.unshift(processContent);
+                        }).catch(function (err) {
+                            tempTip.setDuration(3000);
+                            tempTip.show('查询单据号失败!网络错误:'+err);
+                        });
+                },
+                //确定新增
+                confirmStore(wms_code,commodity_id,amount){
+                    if (!commodity_id) {
+                        tempTip.setDuration(2000);
+                        tempTip.show("尚未选择商品!");
+                        return;
+                    }
+                    if (!amount) {
+                        tempTip.setDuration(2000);
+                        tempTip.show("尚未填写数量!");
+                        return;
+                    }
+                    let _this=this;
+                    _this.processContents.every(function (processContent) {
+                        if (processContent.wms_code==wms_code) {
+                            processContent.addBtnShow=false;
+                            return false;
+                        }
+                        return  true;
+                    });
+                },
+                //删除新增
+                deleteProcessContent(wms_code){
+                    let _this=this;
+                    _this.processContents.every(function (processContent,i) {
+                        if (processContent.wms_code==wms_code) {
+                            _this.processContents.splice(i,1);
+                            return false;
+                        }
+                        return  true;
+                    });
+                },
+                //获取教程
+                getTutorial(owner_id){
+                    let _this=this;
+                    axios.post("{{url('process/ownerGetTutorials')}}"+"/"+owner_id)
+                        .then(function (response) {
+                            _this.tutorials=[];
+                            response.data.forEach(function (tutorialOne) {
+                                let tutorial={};
+                                tutorial['id']=tutorialOne.id;
+                                tutorial['name']=tutorialOne.name;
+                                tutorial['style']=false;
+                                _this.tutorials.push(tutorial);
+                            });
+                        }).catch(function (err) {
+                        tempTip.setDuration(5000);
+                        tempTip.show('获取教程失败!网络错误:'+err);
+                        });
+                },
+                //选择商品
+                selectedCommodity(commodity,wms_code){
+                    let _this=this;
+                    _this.processContents.every(function (processContent) {
+                       if (processContent.wms_code==wms_code){
+                           processContent.commodity_id=commodity.id;
+                           processContent.commodity_name=commodity.name;
+                           processContent.commodity_barcode=commodity.barcode;
+                           processContent.commodity_sku=commodity.sku;
+                           return false;
+                       }
+                       return  true;
+                    });
+                },
+                //选择教程
+                selectedTutorial(tutorial){
+                    let _this=this;
+                    if (tutorial.style){
+                        for (let i=0;i<_this.selectedTutorials.length;i++){
+                            if (_this.selectedTutorials[i]==tutorial.id) {
+                                _this.selectedTutorials.splice(i,1);
+                                break;
+                            }
+                        }
+                        _this.tutorials.every(function (tutorialOne) {
+                            if (tutorialOne.id==tutorial.id){
+                                tutorialOne.style=false;
+                                return false;
+                            }
+                            return  true;
+                        });
+                    }else {
+                        _this.selectedTutorials.push(tutorial.id);
+                        _this.tutorials.every(function (tutorialOne) {
+                            if (tutorialOne.id==tutorial.id){
+                                tutorialOne.style=true;
+                                return false;
+                            }
+                            return  true;
+                        });
+                    }
+                    setTimeout(function(){
+                        $(".tooltipTarget").tooltip({'trigger':'hover'});
+                    },10);
+                },
+                //异补提交
+                submit(){
+                    let _this=this;
+                    let owner_id=_this.process.owner_id;
+                    let process_method_id=_this.process.process_method_id;
+                    let unit_price=_this.process.unit_price;
+                    let remark=_this.process.remark;
+                    let amount=_this.process.amount;
+                    if (!owner_id || !process_method_id || !unit_price || !amount) {
+                        tempTip.setDuration(5000);
+                        tempTip.show('请确认您信息输入的完整性!');
+                        return;
+                    }
+                    _this.processContentError=[];
+                    axios.post('{{url("process")}}',{
+                        owner_id:owner_id,process_method_id:process_method_id,unit_price:unit_price,
+                        remark:remark,amount:amount,processContents:_this.processContents,tutorials:_this.selectedTutorials
+                    }).then(function (response) {
+                        if (response.data.error && response.data.data=="process"){
+                            _this.error=response.data.error;
+                            return;
+                        }
+                        _this.error={wms_code:[],owner_id:[],process_method_id:[],unit_price:[],amount:[]};
+                        if (response.data.error){
+                            _this.processContentError=response.data.error;
+                            return;
+                        }
+                        location.href="{{url('process')}}";
+                    }).catch(function (err) {
+                        tempTip.setDuration(5000);
+                        tempTip.show('提交失败!网络错误:'+err);
+                    });
+                }
             },
         });
     </script>

+ 61 - 15
resources/views/process/index.blade.php

@@ -39,7 +39,7 @@
                            <td >
                                <label>&nbsp;客&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;户&nbsp;:</label>
                                <input type="text" class="form-control-sm tooltipTarget" placeholder="查找"
-                                      style="width:70px" {{--@input="owner_seek"--}}
+                                      style="width:70px" @input="owner_seek"
                                       title="输入关键词快速定位下拉列表,回车确定">
                                <select name="owner_id" v-model="filterData.owner_id" @change="submit" class="form-control-sm tooltipTarget">
                                    <option >    </option>
@@ -73,7 +73,9 @@
                                    <option value="已完成">已完成</option>
                                </select>
                            </td>
-                           <td colspan="6"></td>
+                           <td colspan="6">
+                               <input hidden type="submit" >
+                           </td>
                        </tr>
                        <tr>
                            <td>
@@ -90,7 +92,6 @@
                                             <a class="dropdown-item" @click="processExport(2)" href="javascript:">导出所有页</a>
                                         </div>
                                     </span>
-                               <input hidden type="submit" >
                            </td>
                        </tr>
                    </table>
@@ -236,7 +237,7 @@
                 </div><!-- /.modal-content -->
             </div><!-- /.modal -->
         </div>
-        <!-- 临时工详情modal -->
+        {{--<!-- 临时工详情modal -->
         <div class="modal fade" id="userDetailModal" tabindex="-1" role="dialog" aria-labelledby="userDetailModal" aria-hidden="true">
             <div class="modal-dialog">
                 <div class="modal-content">
@@ -275,7 +276,7 @@
                 </div><!-- /.modal-content -->
             </div><!-- /.modal -->
         </div>
-        <div>
+        <div>--}}
             <table class="table table-striped table-sm text-nowrap table-hover">
                 <tr>
                     <th>
@@ -296,6 +297,7 @@
                     <th>状态</th>
                     <th>单据类型</th>
                     <th>单据号</th>
+                    <th>本单数量</th>
                     <th>商品编码</th>
                     <th>商品名称 </th>
                 </tr>
@@ -358,6 +360,7 @@
 
                     <td class="text-muted">@{{ processOne.bill_type }}</td>
                     <td class="text-muted">@{{ processOne.wms_code }}</td>
+                    <td class="text-muted">@{{ processOne.thisAmount }}</td>
                     <td class="text-muted">@{{ processOne.commodity_barcode }}</td>
                     <td class="text-muted">@{{ processOne.commodity_name }}</td>
 
@@ -456,13 +459,14 @@
                                     @can("二次加工管理-登记工时-审核")<button @click="processDailyParticipantAudit(processDailyParticipant.id)" v-if="processDailyParticipant.status=='未审核'" class="btn-sm btn-outline-success">审核</button>@endcan
                                     <b v-else class="text-success">@{{ processDailyParticipant.status }}</b>
                                 </td>
-                                @can("二次加工管理-临时工资料管理")<td class="text-info"><u style="cursor:pointer" @click="showUserDetail(processDailyParticipant.user_id)">详情</u></td>@endcan
+                                @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>
                 </tr>
                 </template>
             </table>
+            {{$processes->appends($request)->links()}}
         </div>
     </div>
 </div>
@@ -503,7 +507,7 @@
                 modalDaily_id:'',
                 processDailyParticipantOne:{id:'',user_id:'',user_detail_full_name:'',started_at:"",ended_at:"",
                                         hour_price:'',unit_price:'',dinner_duration:'',hour_count:'',unit_count:'',remark:''},
-                userDetail:{full_name:'',gender:'',identity_number:'',mobile_phone:'',default_hour_price:'',company:''},
+                //userDetail:{full_name:'',gender:'',identity_number:'',mobile_phone:'',default_hour_price:'',company:''},
                 processTutorial:{id:'',tutorials:[],},
             },
             watch:{
@@ -548,6 +552,7 @@
                             processOne['code']=process.code;
                             processOne['owner_name']=process.owner_name;
                             processOne['process_method_name']=process.process_method_name;
+                            processOne['amount']=process.amount;
                             processOne['tutorials']=process.tutorials;
                             processOne['unit_price']=process.unit_price;
                             processOne['created_at']=process.created_at;
@@ -566,6 +571,7 @@
                             if (_this.processesList[process.code]) {
                                 processOne['bill_type'] = processesContent.bill_type;
                                 processOne['wms_code'] = processesContent.wms_code;
+                                processOne['thisAmount']=processesContent.amount;
                                 processOne['commodity_barcode'] = processesContent.commodity_barcode;
                                 processOne['commodity_name'] = processesContent.commodity_name;
                                 _this.processes.push(processOne);
@@ -577,6 +583,7 @@
                                 processOne['owner_name']=process.owner_name;
                                 processOne['process_method_name']=process.process_method_name;
                                 processOne['tutorials']=process.tutorials;
+                                processOne['amount']=process.amount;
                                 processOne['unit_price']=process.unit_price;
                                 processOne['created_at']=process.created_at;
                                 processOne['status']=process.status;
@@ -585,6 +592,7 @@
                                 processOne['openProcessHour']=false;
                                 processOne['bill_type']=processesContent.bill_type;
                                 processOne['wms_code']=processesContent.wms_code;
+                                processOne['thisAmount']=processesContent.amount;
                                 processOne['commodity_barcode']=processesContent.commodity_barcode;
                                 processOne['commodity_name']=processesContent.commodity_name;
                                 processOne['count']=process.processesContents.length;
@@ -662,7 +670,7 @@
                     }else{
                         _this.isShow.isOpenProcessHour=true;
                     }
-                    axios.post("{{url("process/getDailyParticipant")}}",{id:e})
+                    axios.post("{{url("process/getDailyParticipant")}}",{id:e,amount:process.amount})
                         .then(function (response) {
                             let processDailies=response.data;
                             for (let i=0;i<processDailies.length;i++){
@@ -857,6 +865,7 @@
                             _this.processes.every(function (process) {
                                 if (process.id==response.data.id){
                                     process.status=response.data.status;
+                                    process.completed_amount=response.data.completed_amount;
                                     return false;
                                 }
                                 return true;
@@ -868,6 +877,18 @@
                         tempTip.show('验收时发生了一些严重错误:'+err);
                     })
                 },
+                //定位客户
+                owner_seek:function (e) {
+                    let _this=this;
+                    let $val=e.target.value;
+                    if($val==='')_this.filterData.owner_id='';
+                    else
+                        _this.owners.forEach(function (owner) {
+                            if (owner.name.includes($val)){
+                                _this.filterData.owner_id=owner.id;
+                            }
+                        });
+                },
                 //修改每日产量
                 submitOutputData(daily_id,data,id){
                     let url="{{url('process/updateDailyOutput')}}";
@@ -879,16 +900,30 @@
                                 tempTip.show('输入有误:'+response.data.data.output);
                             }
                             if (response.data.status=="success"){
+                                let processDailies=response.data.data;
                                 _this.processDailyParticipants.every(function (processDailyParticipant) {
                                     if (processDailyParticipant.id==id) {
-                                        processDailyParticipant.output=response.data.data.output;
-                                        processDailyParticipant.submitOutput=response.data.data.output;
-                                        processDailyParticipant.remain=response.data.data.remain;
                                         processDailyParticipant.readonly=true;
-                                        return false;
                                     }
+                                    processDailies.every(function (processDaily) {
+                                        if (processDailyParticipant.date==processDaily.date){
+                                            processDailyParticipant.output=processDaily.output;
+                                            processDailyParticipant.remain=processDaily.remain;
+                                            return  false;
+                                        }
+                                        return true;
+                                    });
                                     return  true;
                                 });
+                                if (response.data.process) {
+                                    _this.processes.every(function (process) {
+                                        if(process.id==response.data.process){
+                                            process.status="待验收";
+                                            return false;
+                                        }
+                                        return  true;
+                                    });
+                                }
                                 tempTip.setDuration(3000);
                                 tempTip.showSuccess('每日产量修改成功!');
                             }
@@ -999,6 +1034,7 @@
                                 setTimeout(function(){
                                     $(".tooltipTargetError").tooltip('show');
                                 },1);
+                                return;
                             }
                             if (response.data.status=="success"){
                                 _this.processDailyParticipants.every(function (processDailyParticipant) {
@@ -1024,6 +1060,15 @@
                                     }
                                     return  true;
                                 });
+                                if (response.data.process){
+                                    _this.processes.every(function (process) {
+                                        if (process.id==response.data.process){
+                                            process.status="加工中";
+                                            return false;
+                                        }
+                                        return  true;
+                                    });
+                                }
                                 tempTip.setDuration(3000);
                                 tempTip.showSuccess('参与人新增成功!');
                             }
@@ -1124,8 +1169,9 @@
                 },
                 //临时工详情
                 showUserDetail(id){
-                    let _this=this;
-                    axios.post("{{url('process/showUserDetail')}}",{user_id:id})
+                    window.open("{{url('maintenance/userLabor')}}/"+id);
+                    /*let _this=this;
+                    axios.post("{{--{{url('process/showUserDetail')}}--}}",{user_id:id})
                         .then(function (response) {
                             if (response.data.success){
                                 let userDetail=response.data.userDetail;
@@ -1142,7 +1188,7 @@
                         }).catch(function (err) {
                             tempTip.setDuration(5000);
                             tempTip.show('获取临时工详情发生了一些严重错误:'+err);
-                        })
+                        })*/
                 },
                 //显示教程
                 showTutorial(id) {

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

@@ -12,11 +12,11 @@
             </li> @endcan
             @can('二次加工管理-查询')
                 <li class="nav-item">
-                    <a class="nav-link" href="{{url('process/')}}" :class="{active:isActive('',2)}">统计</a>
+                    <a class="nav-link" href="{{url('process/statistic')}}" :class="{active:isActive('statistic',2)}">统计</a>
                 </li> @endcan
             @can('二次加工管理-查询')
                 <li class="nav-item">
-                    <a class="nav-link" href="{{url('process/create')}}" :class="{active:isActive('create',2)}">考勤</a>
+                    <a class="nav-link" href="{{url('process/checking-in/createReplenishClock')}}" :class="{active:isActive('checking-in',2)}">考勤</a>
                 </li> @endcan
             <li class="nav-item">
                 <a class="nav-link text-dark" href="{{url('process/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>

+ 4 - 0
resources/views/process/menuProcess.blade.php

@@ -11,6 +11,10 @@
                         <li class="nav-item">
                             <a class="nav-link text-dark" href="{{url('maintenance/tutorial')}}" :class="{active:isActive('tutorial',2)}">教程管理</a>
                         </li> @endcan
+                    @can('二次加工管理-临时工资料管理')
+                        <li class="nav-item">
+                            <a class="nav-link text-dark" href="{{url('maintenance/userLabor')}}" :class="{active:isActive('tutorial',2)}">临时工</a>
+                        </li> @endcan
                 </ul>
             </div>
         </div>

+ 276 - 0
resources/views/process/statistic.blade.php

@@ -0,0 +1,276 @@
+
+@extends('layouts.app')
+@section('title')入库管理@endsection
+
+@section('content')
+    <span id="nav2">
+        @component('process.menu')@endcomponent
+    </span>
+    <div class="d-none container-fluid mt-3" id="statistics" style="width: 2070px">
+
+                <form  method="GET" action="{{url('process/statistic')}}" style="margin-top: 1%" id="optionSubmit">
+                    <table class="table  table-sm table-bordered text-nowrap ">
+                        <tr v-if="isBeingFilterConditions">
+                            <td colspan="10"><div class="col" style="padding:0" >
+                                    <a  href="{{url('process/statistic')}}"><span class="btn btn-warning text-dark">清除过滤条件</span></a>
+                                </div></td>
+                        </tr>
+                        <tr>
+                            <td >
+                                <span class="text-muted">每页显示记录:</span>
+                            </td>
+                            <td >
+                                <select name="paginate" v-model="filterData.paginate" class="tooltipTarget form-control-sm" style="vertical-align: middle" @change="submit()">
+                                    <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 rowspan="2" style="width: 100px">
+                                <span class="text-muted">根据条件过滤:</span>
+                            </td>
+                            <td style="width: 400px">
+                                <label for="started_at" style="width: 35px">时间:</label>
+                                <input id="started_at" name="started_at" v-model="filterData.started_at" type="date" class="form-control-sm ">
+                            </td>
+                            <td style="width: 400px">
+                                <label>&nbsp;客&nbsp;&nbsp;户&nbsp;:</label>
+                                <input type="text" class="form-control-sm tooltipTarget" placeholder="查找"
+                                       style="width:70px" @input="owner_seek"
+                                       title="输入关键词快速定位下拉列表,回车确定">
+                                <select name="owner_id" v-model="filterData.owner_id" @change="submit" class="form-control-sm tooltipTarget">
+                                    <option >    </option>
+                                    <option v-for="owner in owners" :value="owner.id">@{{owner.name}}</option>
+                                </select>
+                            </td>
+                            <td >
+                                <label>加工类型:</label>
+                                <select name="processMethod_id" v-model="filterData.processMethod_id" style="width: 80px" @change="submit" class="form-control-sm tooltipTarget">
+                                    <option >    </option>
+                                    <option v-for="processMethod in processMethods" :value="processMethod.id">@{{processMethod.name}}</option>
+                                </select>
+                            </td>
+                            <td colspan="6"></td>
+                        </tr>
+                        <tr>
+                            <td >
+                                <label for="ended_at" style="width: 35px"></label>
+                                <input id="ended_at" name="ended_at" v-model="filterData.ended_at" type="date" class="form-control-sm ">
+                            </td>
+                            <td >
+                                <label for="code">任务号:</label>
+                                <input id="code" name="code" v-model="filterData.code" class="form-control-sm">
+                            </td>
+                            <td >
+                                <label for="status">&nbsp;状&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;态&nbsp;:</label>
+                                <select id="status" name="status" style="width: 80px" v-model="filterData.status" @change="submit" class="form-control-sm tooltipTarget">
+                                    <option >    </option>
+                                    <option value="待接单">待接单</option>
+                                    <option value="待加工">待加工</option>
+                                    <option value="驳回">驳回</option>
+                                    <option value="加工中">加工中</option>
+                                    <option value="待验收">待验收</option>
+                                    <option value="已完成">已完成</option>
+                                </select>
+                            </td>
+                            <td colspan="6"><input hidden type="submit"></td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div>
+                                    <span class="text-muted">操作选定记录:</span>
+                                </div>
+                            </td>
+                            <td colspan="3">
+                                <span class="dropdown">
+                                    <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget"
+                                    data-toggle="dropdown" title="导出所有页将会以搜索条件得到的过滤结果,将其全部记录(每一页)导出">
+                                        导出Excel
+                                    </button>
+                                    <div class="dropdown-menu">
+                                        <a class="dropdown-item" @click="processStatisticExport(1)"  href="javascript:">导出勾选内容</a>
+                                        <a class="dropdown-item" @click="processStatisticExport(2)"  href="javascript:">导出所有页</a>
+                                    </div>
+                                </span>
+                            </td>
+                        </tr>
+                    </table>
+                </form>
+                <table class="table table-striped text-nowrap table-hover" style="background: #fff;">
+                    <tr>
+                        <th>
+                            <label for="all">
+                                <input id="all" type="checkbox" @click="checkAll($event)">全选
+                            </label>
+                        </th>
+                        <th>序号</th>
+                        <th>任务号</th>
+                        <th>货主</th>
+                        <th>开始日期</th>
+                        <th>完成日期</th>
+                        <th>单价</th>
+                        <th>预期数量</th>
+                        <th>完成数量</th>
+                        <th>收入合计</th>
+                        <th>完成时间(天)</th>
+                        <th>总工时</th>
+                        <th>加工类型</th>
+                        <th>最高日产能</th>
+                        <th>最低日产能</th>
+                        <th>日均产能</th>
+                        <th>合计成本</th>
+                        <th>毛利润</th>
+                        <th>毛利率</th>
+                        <th>状态</th>
+                    </tr>
+                    <tr v-for="(processStatistic,i) in processStatistics" :class="processStatistic.gross_profit_rate?'text-success':''">
+                        <td><input class="checkItem" type="checkbox" :value="processStatistic.process_id" v-model="checkData"></td>
+                        <td>@{{ i+1 }}</td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.code }}</td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.owner_name }}</td>
+                        <td>@{{ processStatistic.started_at }}</td>
+                        <td>@{{ processStatistic.ended_at }}</td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.unit_price }}</td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.amount }}</td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.completed_amount }}</td>
+                        <td>@{{ processStatistic.revenue }}</td>
+                        <td>@{{ processStatistic.duration_days }}</td>
+                        <td>@{{ processStatistic.duration_man_hours }}</td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.process_method_name }}</td>
+                        <td>@{{ processStatistic.top_capacity }}</td>
+                        <td>@{{ processStatistic.bottom_capacity }}</td>
+                        <td>@{{ processStatistic.average_capactiy }}</td>
+                        <td>@{{ processStatistic.total_cost }}</td>
+                        <td>@{{ processStatistic.gross_profit }}</td>
+                        <td><b v-if="processStatistic.gross_profit_rate">@{{ (processStatistic.gross_profit_rate)*100 | money}}%</b></td>
+                        <td v-if="processStatistic.process">@{{ processStatistic.process.status }}</td>
+                    </tr>
+                </table>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#statistics",
+            data:{
+                processStatistics:[
+                    @foreach($processStatistics as $processStatistic)
+                    {!! $processStatistic !!},
+                    @endforeach
+                ],
+                owners:[
+                    @foreach($owners as $owner)
+                    {!! $owner !!},
+                    @endforeach
+                ],
+                processMethods:[
+                    @foreach($processMethods as $processMethod)
+                    {!! $processMethod !!},
+                    @endforeach
+                ],
+                checkData:[],
+                filterData:{paginate:'50',started_at:'',ended_at:'',owner_id:'',code:'',status:''},
+            },
+            computed:{
+                isBeingFilterConditions:function(){
+
+                    for(let key in this.filterData){
+                        if(this.filterData[key]){
+                            if(key==='paginate')continue;
+                            return true
+                        }
+                    }
+                    return false;
+                },
+
+            },
+            watch:{
+                checkData:{
+                    handler(){
+                        if (this.checkData.length === this.processStatistics.length){
+                            document.querySelector('#all').checked = true;
+                        }else {
+                            document.querySelector('#all').checked = false;
+                        }
+                    },
+                    deep:true
+                }
+            },
+            mounted:function(){
+                this.initInputs();
+                $(".tooltipTarget").tooltip({'trigger':'hover'});
+                $('#statistics').removeClass('d-none');
+            },
+            methods: {
+                initInputs:function(){
+                    let data=this;
+                    let uriParts =decodeURI(location.href).split("?");
+                    if(uriParts.length>1){
+                        let params = uriParts[1].split('&');
+                        params.forEach(function(paramPair){
+                            let pair=paramPair.split('=');
+                            let key = pair[0], val = pair[1];
+                            $('input[name="'+key+'"]').val(val);
+                            $('select[name="'+key+'"]').val(val);
+                            decodeURI(data.filterData[key]=val);
+                        });
+                    }
+                },
+                checkAll(e){
+                    if (e.target.checked){
+                        this.processStatistics.forEach(el=>{
+                            if (this.checkData.indexOf(el.process_id) == '-1'){
+                                this.checkData.push(el.process_id);
+                            }
+                        });
+                    }else {
+                        this.checkData = [];
+                    }
+                },
+                //提交表单
+                submit:function(){
+                    let form = $("#optionSubmit");
+                    form.submit();
+                },
+                //定位客户
+                owner_seek:function (e) {
+                    let _this=this;
+                    let $val=e.target.value;
+                    if($val==='')_this.filterData.owner_id='';
+                    else
+                        _this.owners.forEach(function (owner) {
+                            if (owner.name.includes($val)){
+                                _this.filterData.owner_id=owner.id;
+                            }
+                        });
+                },
+                //导出excel,因同步问题不使用formData
+                processStatisticExport(e){
+                    let val=e;
+                    let data=this.filterData;
+                    if (val==1){
+                        if (this.checkData&&this.checkData.length<=0){
+                            tempTip.setDuration(4000);
+                            tempTip.showSuccess('没有勾选任何记录');
+                        }else{
+                            location.href="{{url('process/statistic?checkSign=')}}"+this.checkData;
+                        }
+                    } else {
+                        location.href="{{url('process/statistic?checkSign=-1&started_at=')}}"+
+                            data.started_at+"&ended_at="+data.ended_at+"&owner_id="+
+                            data.owner_id+"&code="+data.code+"&status="+data.status;
+                    }
+                },
+            },
+            filters:{
+                money:function(value){
+                    return _.round(value,2);
+                }
+            }
+        });
+    </script>
+@endsection

+ 0 - 0
resources/views/vendor/UEditor/.gitkeep


+ 0 - 4
resources/views/vendor/UEditor/head.blade.php

@@ -1,4 +0,0 @@
-<script src="{!!asset('/laravel-u-editor/ueditor.config.js')!!}"></script>
-<script src="{!!asset('/laravel-u-editor/ueditor.all.min.js')!!}"></script>
-{{-- 载入语言文件,根据laravel的语言设置自动载入 --}}
-<script src="{!!asset($UeditorLangFile)!!}"></script>

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

@@ -14,3 +14,9 @@ Route::post('receive/new', "ReceiveController@new_");//增加新波次消息
 */
 Route::post('package/new', "PackageController@new_");//增加新波次消息
 //accomplishToWMS() 发往WMS的称重和纸条包裹信息
+
+/*
+文件地址前缀:/api/thirdPart/flux/process
+*/
+//请求数据,查询库单据是否存在
+Route::post('process/getProcessContent', "ProcessController@getProcessContent");//增加新波次消息

+ 41 - 2
routes/web.php

@@ -41,6 +41,12 @@ Route::resource('maintenance/measuringMachine', 'MeasuringMachineController');
 Route::resource('maintenance/tutorial', 'TutorialController');
 //教程展示
 Route::post('maintenance/tutorial/showContent/{id}', 'TutorialController@showContent');
+//临时工管理
+Route::resource('maintenance/userLabor','UserLaborController');
+//获取劳务记录
+Route::post('maintenance/userLabor/getWorkRecord', 'UserLaborController@getWorkRecord');
+//获取打卡记录
+Route::post('maintenance/userLabor/getClockRecord', 'UserLaborController@getClockRecord');
 
 Route::get('maintenance/paperBox/index/model', 'PaperBoxController@indexModel');
 Route::get('maintenance/paperBox/index/owner', 'PaperBoxController@indexOwner');
@@ -115,6 +121,8 @@ Route::resource('store/storeItem','StoreItemsController');
 
 //相关设置
 Route::get('process/relating',function (){return view('process.menuProcess');});
+//统计页面
+Route::get('process/statistic','ProcessStatisticController@index');
 //process主方法 restful
 Route::resource('process','ProcessController');
 //获取每日参与人
@@ -136,10 +144,41 @@ Route::post('process/updateProcessDailyParticipant','ProcessController@updatePro
 //参与人审核
 Route::post('process/processDailyParticipantAudit/{id}','ProcessController@processDailyParticipantAudit');
 //临时工详情
-Route::post('process/showUserDetail','ProcessController@showUserDetail');
+//Route::post('process/showUserDetail','ProcessController@showUserDetail');
 //获取全部教程
 Route::post('process/getTutorials/{id}','ProcessController@getTutorials');
 //添加教程关联
 Route::post('process/selectedTutorial','ProcessController@selectedTutorial');
 //删除教程关联
-Route::post('process/deleteTutorial','ProcessController@deleteTutorial');
+Route::post('process/deleteTutorial','ProcessController@deleteTutorial');
+//根据货主获取教程
+Route::post('process/ownerGetTutorials/{owner_id}','ProcessController@ownerGetTutorials');
+//录入补卡
+Route::get('process/checking-in/createReplenishClock','ProcessController@createReplenishClock');
+//搜索临时工下打卡信息
+Route::post('process/checkUserLabors','ProcessController@checkUserLabors');
+//录入补卡
+Route::post('process/storeReplenishClock','ProcessController@storeReplenishClock');
+//去往打卡审核
+Route::get('process/checking-in/clockAudit','ProcessController@clockAudit');
+//去往任务审核
+Route::get('process/checking-in/missionAudit','ProcessController@missionAudit');
+//打卡审核
+Route::post('process/storeClockAudit','ProcessController@storeClockAudit');
+//打卡审核登出类型判断异常
+Route::post('process/isException','ProcessController@isException');
+//任务审核
+Route::post('process/storeMissionAudit','ProcessController@storeMissionAudit');
+/**
+ *  用户打卡
+ */
+//获取当日二维码
+Route::get('userDutyCheck/getQRCode','UserDutyCheckController@getQRCode');
+//进入打卡接口
+Route::get('userDutyCheck/clock','UserDutyCheckController@clock');
+//提交打卡
+Route::post('userDutyCheck/storeClock','UserDutyCheckController@storeClock');
+//去往登记资料页面
+Route::get('userDutyCheck/createUserDetail/{mobile_phone}','UserDutyCheckController@createUserDetail');
+//提交登记资料
+Route::post('userDutyCheck/storeUserDetail','UserDutyCheckController@storeUserDetail');

+ 4 - 0
tests/webApi/test.http

@@ -25,3 +25,7 @@ Content-Type: application/json
 
 ###
 
+POST http://bswas/userDutyCheck/storeUserDetail
+
+###
+

BIN
其它.mp3


BIN
圆通快递.mp3


BIN
韵达快递.mp3


BIN
顺丰.mp3