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