LaborReportController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 Illuminate\Support\Facades\Http;
  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. $paginateParams=$request->input();
  34. $user=Auth::user();
  35. if (!$user)return redirect('/');
  36. $laravelEchoPrefix = config('database.redis.options.prefix');
  37. $tokenOfBroadcastEnterAndLeave='';
  38. if(Gate::allows('人事管理-临时工报表-可见全部组')||Gate::allows('人事管理-门卫审核')){
  39. $tokenOfBroadcastEnterAndLeave=LaborReport::tokenOfBroadcastEnterAndLeave();
  40. }
  41. $userWorkgroupIds=$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组'));
  42. $permittingWorkgroups=UserWorkgroup::whereIn('id',$userWorkgroupIds)->get();
  43. if($permittingWorkgroups->isEmpty())$permittingWorkgroups="[]";
  44. $laborReports=app('laborReportService')->paginate($request->input());
  45. foreach ($laborReports as $laborReport){
  46. if (!$laborReport->group_user_id){
  47. //2小时之内组长未审核实行软删除
  48. $tenMinutesLater=Carbon::parse($laborReport->created_at)->subHours(-2)->format('Y-m-d H:i:s');
  49. if (Carbon::now()->format('Y-m-d H:i:s')>$tenMinutesLater){
  50. $laborReport->delete();
  51. $this->log(__METHOD__,"组长未审核该条记录将在10分钟后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
  52. }
  53. }
  54. $addOneHourCheckedAt=Carbon::parse($laborReport->userDutyCheck['checked_at'])->subHours(-1)->format('Y-m-d H:i:s');
  55. if (!$laborReport->userDutyCheck['verify_user_id']&&Carbon::now()->format('Y-m-d H:i:s')>$addOneHourCheckedAt){
  56. $laborReport->delete();
  57. $this->log(__METHOD__,"进场门卫未审核该条记录将在一小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
  58. }
  59. }
  60. $userWorkGroups=UserWorkgroup::query()->select('id','name')->get();
  61. return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave'));
  62. }
  63. public function export(Request $request){
  64. if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
  65. if ($request->checkAllSign){
  66. $params = $request->input();
  67. unset($params["checkAllSign"]);
  68. $laborReports=app('laborReportService')->get($params);
  69. }else{
  70. $laborReports=app('laborReportService')->get(["id"=>$request->data]);
  71. }
  72. $data = [];
  73. foreach ($laborReports as $laborReport){
  74. $row = [
  75. "enter_number" => $laborReport->enter_number,
  76. "user_workgroup_name" => $laborReport->userWorkgroup ? $laborReport->userWorkgroup->name : null,
  77. "name" => $laborReport->name,
  78. "mobile_phone" => $laborReport->mobile_phone,
  79. "identity_number" => $laborReport->identity_number,
  80. "labor_company" => $laborReport->labor_company,
  81. "enter_at" => $laborReport->enter_at,
  82. "check_in_at" => $laborReport->check_in_at,
  83. "check_out_at" => $laborReport->check_out_at,
  84. "exit_at" => $laborReport->exit_at,
  85. "verify_at" => $laborReport->verify_at,
  86. "group_user_id" => $laborReport->user ? $laborReport->user->name : null,
  87. "relax_time" => $laborReport->relax_time,
  88. "online_duration" => $laborReport->online_duration,
  89. "working_duration" => $laborReport->working_duration,
  90. "remark" => $laborReport->remark,
  91. ];
  92. array_push($data,$row);
  93. }
  94. return response(Http::post(config('go.export.url'),['type'=>'laborReport','data'=>json_encode($data,JSON_UNESCAPED_UNICODE)]),200, [
  95. "Content-type"=>"application/octet-stream",
  96. "Content-Disposition"=>"attachment; filename=临时工报表记录-".date('ymdHis').'.xlsx',
  97. ]);
  98. }
  99. //门卫打卡审核
  100. public function guardClockAudit(Request $request){
  101. if(!Gate::allows('人事管理-门卫审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"]; }
  102. $id=$request->input('id');
  103. $userDutyCheckId=$request->input('user_duty_check_id');
  104. $laborReportStatus=new LaborReportStatus([
  105. 'labor_report_id'=>$id,
  106. 'status'=>'已入场',
  107. ]);
  108. $laborReportStatus->save();
  109. $this->log(__METHOD__,"门卫打卡审核创建当前临时工报表状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  110. $userDutyCheck=UserDutyCheck::find($userDutyCheckId);
  111. $userDutyCheck->verify_user_id=Auth::user()['id'];
  112. $userDutyCheck->update();
  113. event(new GuardAuditEvent($userDutyCheck));
  114. $this->log(__METHOD__,"门卫打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
  115. return ["success"=>true,"data"=>$userDutyCheck->verify_user_id];
  116. }
  117. //打卡组长审核
  118. public function groupClockAudit(Request $request){
  119. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  120. $id=$request->input('id');
  121. $laborReport=LaborReport::find($id);
  122. $laborReport->group_user_id=Auth::user()['id'];
  123. $laborReport->verify_at=date('Y-m-d H:i:s');
  124. $laborReport->update();
  125. $laborReport->verifyPerson=Auth::user()['name'];
  126. $this->log(__METHOD__,"打卡组长审核".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  127. event(new TeamAuditEvent($laborReport));
  128. return ["success"=>true,"data"=>$laborReport];
  129. }
  130. //打卡组长审核(特定组添加备注)
  131. public function addRemarkAndGroupClock(Request $request){
  132. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  133. $id=$request->input('id');
  134. $remark=$request->input('remark');
  135. if(!$remark){ return ["success"=>false,"data"=>"您还未添加任何备注,请返回添加备注!"]; }
  136. $laborReport=LaborReport::find($id);
  137. $laborReport->group_user_id=Auth::user()['id'];
  138. $laborReport->verify_at=date('Y-m-d H:i:s');
  139. $laborReport->update();
  140. $laborReport->setRemarkAttribute($remark,$id);
  141. $laborReport->verifyPerson=Auth::user()['name'];
  142. $this->log(__METHOD__,"打卡组长审核并添加相应备注".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  143. event(new TeamAuditEvent($laborReport));
  144. return ["success"=>true,"data"=>$laborReport];
  145. }
  146. //组长点击退组
  147. public function groupExport(Request $request){
  148. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  149. $id=$request->input('id');
  150. $laborReport=LaborReport::find($id);
  151. $laborReportStatus=new LaborReportStatus([
  152. 'labor_report_id'=>$id,
  153. 'status'=>'已退组',
  154. ]);
  155. $laborReportStatus->save();
  156. $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  157. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  158. $check_in_at=$laborReport->check_in_at;
  159. $laborReport->check_out_at=$check_out_at;
  160. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  161. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
  162. if ($laborReport['enter_at']){
  163. $enter_at=$laborReport['enter_at'];
  164. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  165. }else{
  166. $laborReport->online_duration=$online_duration;
  167. }
  168. $laborReport->update();
  169. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  170. $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  171. event(new ClockoutEvent($laborReport));
  172. return ["success"=>true,"data"=>$laborReport];
  173. }
  174. //晚19点后组长点击退场,判断是否有晚餐情况
  175. public function groupExportEnsure(Request $request){
  176. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  177. $id=$request->input('id');
  178. $relax_time=$request->input('relax_time');
  179. if(!$relax_time){ return ["success"=>false,"data"=>"未选择确切晚饭时间,请重新选择!"]; }
  180. $laborReport=LaborReport::find($id);
  181. $laborReportStatus=new LaborReportStatus([
  182. 'labor_report_id'=>$id,
  183. 'status'=>'已退组',
  184. ]);
  185. $laborReportStatus->save();
  186. $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  187. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  188. $check_in_at=$laborReport->check_in_at;
  189. $laborReport->check_out_at=$check_out_at;
  190. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  191. if ($relax_time){
  192. $laborReport->relax_time=$relax_time;
  193. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration)-$relax_time/60;//减去晚饭时间
  194. }else{
  195. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
  196. }
  197. if ($laborReport->enter_at){
  198. $enter_at=$laborReport['enter_at'];
  199. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  200. }else{
  201. $laborReport->online_duration=$online_duration;
  202. }
  203. $laborReport->update();
  204. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  205. $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  206. event(new ClockoutEvent($laborReport));
  207. return ["success"=>true,"data"=>$laborReport];
  208. }
  209. //工作时长减午饭休息时间
  210. public function minusLunchTime($laborReport,$hour){
  211. $checkInTime=$laborReport->check_in_at;
  212. $checkOutTime=$laborReport->check_out_at;
  213. $checkOutTime=Carbon::parse($checkOutTime)->format('H');
  214. $checkInTime=Carbon::parse($checkInTime)->format('H');
  215. if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
  216. $hour=$hour-1;
  217. }
  218. return $hour;
  219. }
  220. }