LaborReportController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Events\ClockoutEvent;
  4. use App\Events\GuardAuditEvent;
  5. use App\Events\TeamAuditEvent;
  6. use App\Exports\Export;
  7. use App\LaborReport;
  8. use App\LaborReportStatus;
  9. use App\Services\LaborReportService;
  10. use App\UserDutyCheck;
  11. use App\UserWorkgroup;
  12. use Carbon\Carbon;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Collection;
  15. use Illuminate\Support\Facades\Auth;
  16. use Illuminate\Support\Facades\Gate;
  17. use Maatwebsite\Excel\Facades\Excel;
  18. class LaborReportController extends Controller
  19. {
  20. public function __construct()
  21. {
  22. app()->singleton('laborReportService',LaborReportService::class);
  23. }
  24. /**
  25. * Display a listing of the resource.
  26. * @param Request $request
  27. * @return void
  28. * 临时工报表
  29. */
  30. public function index(Request $request)
  31. {
  32. //if(!Gate::allows('人事管理')){ return redirect(url('/')); }
  33. if(!Gate::allows('人事管理-临时工报表')){ return redirect(url('/')); }
  34. $user=Auth::user();
  35. if (!$user)return redirect('/');
  36. $userWorkgroupIds=$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组'));
  37. $permittingWorkgroups=UserWorkgroup::whereIn('id',$userWorkgroupIds)->get();
  38. if($permittingWorkgroups->isEmpty())$permittingWorkgroups="[]";
  39. $laravelEchoPrefix = config('database.redis.options.prefix');
  40. $laborReportsBuilder=LaborReport::with(['user','userDutyCheck','userWorkgroup'])->whereIn('user_workgroup_id',$userWorkgroupIds);
  41. if(Gate::allows('人事管理-临时工报表-可见全部组')||Gate::allows('人事管理-门卫审核')){
  42. $laborReportsBuilder->orWhereNull('user_workgroup_id');
  43. }
  44. $laborReports=app('laborReportService')->paginate($request);
  45. // $laborReportsPaginate = $laborReports;
  46. // $laborReports=$laborReports->sortBy('name');
  47. foreach ($laborReports as $laborReport){
  48. // if (!$laborReport->group_user_id){
  49. // //三十分钟之内组长未审核实行软删除
  50. // $tenMinutesLater=Carbon::parse($laborReport->created_at)->subMinutes(-30)->format('Y-m-d H:i:s');
  51. // if (Carbon::now()->format('Y-m-d H:i:s')>$tenMinutesLater){
  52. // $laborReport->delete();
  53. // $this->log(__METHOD__,"组长未审核该条记录将在10分钟后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
  54. // }
  55. // }
  56. $addOneHourCheckedAt=Carbon::parse($laborReport->userDutyCheck['checked_at'])->subHours(-1)->format('Y-m-d H:i:s');
  57. if (!$laborReport->userDutyCheck['verify_user_id']&&Carbon::now()->format('Y-m-d H:i:s')>$addOneHourCheckedAt){
  58. $laborReport->delete();
  59. $this->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
  60. }
  61. }
  62. $request=$request->input();
  63. $userWorkGroups=UserWorkgroup::select('id','name')->get();
  64. return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laravelEchoPrefix','permittingWorkgroups','request'));
  65. }
  66. public function export(Request $request){
  67. if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
  68. ini_set('max_execution_time',3500);
  69. ini_set('memory_limit','3526M');
  70. if ($request->checkAllSign){
  71. $request->offsetUnset('checkAllSign');
  72. $laborReports=app('laborReportService')->get($request);
  73. }else{
  74. $laborReports=app('laborReportService')->some($request);
  75. }
  76. $row=[[
  77. 'id'=>'ID',
  78. 'enter_at'=>'进场时间',
  79. 'exit_at'=>'退场时间',
  80. 'enter_number'=>'进厂编号',
  81. 'user_workgroup_name'=>'小组',
  82. 'name'=>'临时工',
  83. 'mobile_phone'=>'电话',
  84. 'identity_number'=>'身份证号',
  85. 'labor_company'=>'劳务所',
  86. 'check_in_at'=>'进组时间',
  87. 'check_out_at'=>'退组时间',
  88. 'verify_at'=>'审核时间',
  89. 'group_user_id'=>'审核人',
  90. 'relax_time'=>'晚饭时间(分)',
  91. 'online_duration'=>'在线时长',
  92. 'working_duration'=>'本次工作时长',
  93. 'remark'=>'备注',
  94. ]];
  95. $list=[];
  96. for ($i=0; $i<count($laborReports);$i++){
  97. $laborReport=$laborReports[$i];
  98. $w=[
  99. 'id'=>isset($laborReport->id)?$laborReport->id:'',
  100. 'enter_at'=>isset($laborReport->enter_at)?$laborReport->enter_at:'',
  101. 'exit_at'=>isset($laborReport->exit_at)?$laborReport->exit_at:'',
  102. 'enter_number'=>isset($laborReport->enter_number)?$laborReport->enter_number:'',
  103. 'user_workgroup_name'=>isset($laborReport->userWorkgroup->name)?$laborReport->userWorkgroup->name:'',
  104. 'name'=>isset($laborReport->name)?$laborReport->name:'',
  105. 'mobile_phone'=>isset($laborReport->mobile_phone)?$laborReport->mobile_phone:'',
  106. 'identity_number'=>isset($laborReport->identity_number)?$laborReport->identity_number:'',
  107. 'labor_company'=>isset($laborReport->labor_company)?$laborReport->labor_company:'',
  108. 'check_in_at'=>isset($laborReport->check_in_at)?$laborReport->check_in_at:'',
  109. 'check_out_at'=>isset($laborReport->check_out_at)?$laborReport->check_out_at:'',
  110. 'verify_at'=>isset($laborReport->verify_at)?$laborReport->verify_at:'',
  111. 'group_user_id'=>isset($laborReport->user->name)?$laborReport->user->name:'',
  112. 'relax_time'=>isset($laborReport->relax_time)?$laborReport->relax_time:'',
  113. 'online_duration'=>isset($laborReport->online_duration)?$laborReport->online_duration:'',
  114. 'working_duration'=>isset($laborReport->working_duration)?$laborReport->working_duration:'',
  115. 'remark'=>isset($laborReport->remark)?$laborReport->remark:'',
  116. ];
  117. $list[$i]=$w;
  118. }
  119. return Excel::download(new Export($row,$list),date('YmdHis', time()).'-临时工报表记录单.xlsx');
  120. }
  121. //门卫打卡审核
  122. public function guardClockAudit(Request $request){
  123. if(!Gate::allows('人事管理-门卫审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"]; }
  124. $id=$request->input('id');
  125. $userDutyCheckId=$request->input('userDutyCheckId');
  126. $laborReportStatus=new LaborReportStatus([
  127. 'labor_report_id'=>$id,
  128. 'status'=>'已入场',
  129. ]);
  130. $laborReportStatus->save();
  131. $this->log(__METHOD__,"门卫打卡审核创建当前临时工报表状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  132. $userDutyCheck=UserDutyCheck::find($userDutyCheckId);
  133. $userDutyCheck->verify_user_id=Auth::user()['id'];
  134. $userDutyCheck->update();
  135. event(new GuardAuditEvent($userDutyCheck));
  136. $this->log(__METHOD__,"门卫打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
  137. return ["success"=>true,"data"=>$userDutyCheck->verify_user_id];
  138. }
  139. //打卡组长审核
  140. public function groupClockAudit(Request $request){
  141. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  142. $id=$request->input('id');
  143. $laborReport=LaborReport::find($id);
  144. $laborReport->group_user_id=Auth::user()['id'];
  145. $laborReport->verify_at=date('Y-m-d H:i:s');
  146. $laborReport->update();
  147. $laborReport->verifyPerson=Auth::user()['name'];
  148. $this->log(__METHOD__,"打卡组长审核".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  149. event(new TeamAuditEvent($laborReport));
  150. return ["success"=>true,"data"=>$laborReport];
  151. }
  152. //打卡组长审核(特定组添加备注)
  153. public function addRemarkAndGroupClock(Request $request){
  154. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  155. $id=$request->input('id');
  156. $remark=$request->input('remark');
  157. if(!$remark){ return ["success"=>false,"data"=>"您还未添加任何备注,请返回添加备注!"]; }
  158. $laborReport=LaborReport::find($id);
  159. $laborReport->group_user_id=Auth::user()['id'];
  160. $laborReport->verify_at=date('Y-m-d H:i:s');
  161. $laborReport->update();
  162. $laborReport->setRemarkAttribute($remark,$id);
  163. $laborReport->verifyPerson=Auth::user()['name'];
  164. $this->log(__METHOD__,"打卡组长审核并添加相应备注".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  165. event(new TeamAuditEvent($laborReport));
  166. return ["success"=>true,"data"=>$laborReport];
  167. }
  168. //组长点击退组
  169. public function groupExport(Request $request){
  170. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  171. $id=$request->input('id');
  172. $laborReport=LaborReport::find($id);
  173. $laborReportStatus=new LaborReportStatus([
  174. 'labor_report_id'=>$id,
  175. 'status'=>'已退组',
  176. ]);
  177. $laborReportStatus->save();
  178. $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  179. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  180. $check_in_at=$laborReport->check_in_at;
  181. $laborReport->check_out_at=$check_out_at;
  182. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  183. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
  184. if ($laborReport['enter_at']){
  185. $enter_at=$laborReport['enter_at'];
  186. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  187. }else{
  188. $laborReport->online_duration=$online_duration;
  189. }
  190. $laborReport->update();
  191. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  192. $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  193. event(new ClockoutEvent($laborReport));
  194. return ["success"=>true,"data"=>$laborReport];
  195. }
  196. //晚19点后组长点击退场,判断是否有晚餐情况
  197. public function groupExportEnsure(Request $request){
  198. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  199. $id=$request->input('id');
  200. $relax_time=$request->input('relax_time');
  201. if(!$relax_time){ return ["success"=>false,"data"=>"未选择确切晚饭时间,请重新选择!"]; }
  202. $laborReport=LaborReport::find($id);
  203. $laborReportStatus=new LaborReportStatus([
  204. 'labor_report_id'=>$id,
  205. 'status'=>'已退组',
  206. ]);
  207. $laborReportStatus->save();
  208. $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  209. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  210. $check_in_at=$laborReport->check_in_at;
  211. $laborReport->check_out_at=$check_out_at;
  212. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  213. if ($relax_time){
  214. $laborReport->relax_time=$relax_time;
  215. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration)-$relax_time/60;//减去晚饭时间
  216. }else{
  217. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
  218. }
  219. if ($laborReport->enter_at){
  220. $enter_at=$laborReport['enter_at'];
  221. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  222. }else{
  223. $laborReport->online_duration=$online_duration;
  224. }
  225. $laborReport->update();
  226. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  227. $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  228. event(new ClockoutEvent($laborReport));
  229. return ["success"=>true,"data"=>$laborReport];
  230. }
  231. //工作时长减午饭休息时间
  232. public function minusLunchTime($laborReport,$hour){
  233. $checkInTime=$laborReport->check_in_at;
  234. $checkOutTime=$laborReport->check_out_at;
  235. $checkOutTime=Carbon::parse($checkOutTime)->format('H');
  236. $checkInTime=Carbon::parse($checkInTime)->format('H');
  237. if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
  238. $hour=$hour-1;
  239. }
  240. return $hour;
  241. }
  242. }