LaborReportController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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\LaborCompany;
  8. use App\LaborReport;
  9. use App\LaborReportStatus;
  10. use App\Services\LaborReportService;
  11. use App\UserDutyCheck;
  12. use App\UserWorkgroup;
  13. use Carbon\Carbon;
  14. use Exception;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Auth;
  17. use Illuminate\Support\Facades\Gate;
  18. use Illuminate\Support\Facades\Http;
  19. use Maatwebsite\Excel\Facades\Excel;
  20. class LaborReportController extends Controller
  21. {
  22. public function __construct()
  23. {
  24. app()->singleton('laborReportService',LaborReportService::class);
  25. }
  26. /**
  27. * Display a listing of the resource.
  28. * @param Request $request
  29. * @return void
  30. * 临时工报表
  31. */
  32. public function index(Request $request)
  33. {
  34. if(!Gate::allows('人事管理-临时工报表')){ return redirect(url('/')); }
  35. $paginateParams=$request->input();
  36. $user=Auth::user();
  37. if (!$user)return redirect('/');
  38. $laravelEchoPrefix = config('database.redis.options.prefix');
  39. $tokenOfBroadcastEnterAndLeave='';
  40. if(Gate::allows('人事管理-临时工报表-可见全部组')||Gate::allows('人事管理-门卫审核')){
  41. $tokenOfBroadcastEnterAndLeave=LaborReport::tokenOfBroadcastEnterAndLeave();
  42. }
  43. $userWorkgroupIds=$user->getPermittingWorkgroupIds(Gate::allows('人事管理-临时工报表-可见全部组'));
  44. $permittingWorkgroups=UserWorkgroup::whereIn('id',$userWorkgroupIds)->get();
  45. if($permittingWorkgroups->isEmpty())$permittingWorkgroups="[]";
  46. $laborReports=app('laborReportService')->paginate($request->input());
  47. foreach ($laborReports as $laborReport){
  48. if (!$laborReport->group_user_id){
  49. //2小时之内组长未审核实行软删除
  50. $tenMinutesLater=Carbon::parse($laborReport->created_at)->subHours(-2)->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. $laborCompanies=LaborCompany::query()->get();
  63. $userWorkGroups=UserWorkgroup::query()->select('id','name')->get();
  64. return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laborCompanies','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave'));
  65. }
  66. public function export(Request $request){
  67. if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
  68. if ($request->checkAllSign){
  69. $params = $request->input();
  70. unset($params["checkAllSign"]);
  71. $laborReports=app('laborReportService')->get($params);
  72. }else{
  73. $laborReports=app('laborReportService')->get(["id"=>$request->data]);
  74. dd($laborReports);
  75. }
  76. $data = [];
  77. foreach ($laborReports as $laborReport){
  78. $row = [
  79. "enter_number" => $laborReport->enter_number,
  80. "user_workgroup_name" => $laborReport->userWorkgroup ? $laborReport->userWorkgroup->name : null,
  81. "name" => $laborReport->name,
  82. "mobile_phone" => $laborReport->mobile_phone,
  83. "identity_number" => $laborReport->identity_number,
  84. "labor_company" => $laborReport->laborCompany ? $laborReport->laborCompany->name : null,
  85. "enter_at" => $laborReport->enter_at,
  86. "check_in_at" => $laborReport->check_in_at,
  87. "check_out_at" => $laborReport->check_out_at,
  88. "exit_at" => $laborReport->exit_at,
  89. "verify_at" => $laborReport->verify_at,
  90. "group_user_id" => $laborReport->user ? $laborReport->user->name : null,
  91. "relax_time" => $laborReport->relax_time,
  92. "online_duration" => $laborReport->online_duration,
  93. "working_duration" => $laborReport->working_duration,
  94. "remark" => $laborReport->remark,
  95. ];
  96. array_push($data,$row);
  97. }
  98. $post = Http::post(config('go.export.url'),['type'=>'laborReport','data'=>json_encode($data,JSON_UNESCAPED_UNICODE)]);
  99. if ($post->status() == 500){
  100. throw new Exception($post->header("Msg"));
  101. }
  102. return response($post,200, [
  103. "Content-type"=>"application/octet-stream",
  104. "Content-Disposition"=>"attachment; filename=临时工报表记录-".date('ymdHis').'.xlsx',
  105. ]);
  106. }
  107. //门卫打卡审核
  108. public function guardClockAudit(Request $request){
  109. if(!Gate::allows('人事管理-门卫审核')){ return ["success"=>false,"data"=>"您无此权限操作!!!"]; }
  110. $id=$request->input('id');
  111. $userDutyCheckId=$request->input('user_duty_check_id');
  112. $laborReportStatus=new LaborReportStatus([
  113. 'labor_report_id'=>$id,
  114. 'status'=>'已入场',
  115. ]);
  116. $laborReportStatus->save();
  117. $this->log(__METHOD__,"门卫打卡审核创建当前临时工报表状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  118. $userDutyCheck=UserDutyCheck::find($userDutyCheckId);
  119. $userDutyCheck->verify_user_id=Auth::user()['id'];
  120. $userDutyCheck->update();
  121. event(new GuardAuditEvent($userDutyCheck));
  122. $this->log(__METHOD__,"门卫打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
  123. return ["success"=>true,"data"=>$userDutyCheck->verify_user_id];
  124. }
  125. //打卡组长审核
  126. public function groupClockAudit(Request $request){
  127. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  128. $id=$request->input('id');
  129. $laborReport=LaborReport::find($id);
  130. $laborReport->group_user_id=Auth::user()['id'];
  131. $laborReport->verify_at=date('Y-m-d H:i:s');
  132. $laborReport->update();
  133. $laborReport->verifyPerson=Auth::user()['name'];
  134. $this->log(__METHOD__,"打卡组长审核".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  135. event(new TeamAuditEvent($laborReport));
  136. return ["success"=>true,"data"=>$laborReport];
  137. }
  138. //打卡组长审核(特定组添加备注)
  139. public function addRemarkAndGroupClock(Request $request){
  140. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  141. $id=$request->input('id');
  142. $remark=$request->input('remark');
  143. if(!$remark){ return ["success"=>false,"data"=>"您还未添加任何备注,请返回添加备注!"]; }
  144. $laborReport=LaborReport::find($id);
  145. $laborReport->group_user_id=Auth::user()['id'];
  146. $laborReport->verify_at=date('Y-m-d H:i:s');
  147. $laborReport->update();
  148. $laborReport->setRemarkAttribute($remark,$id);
  149. $laborReport->verifyPerson=Auth::user()['name'];
  150. $this->log(__METHOD__,"打卡组长审核并添加相应备注".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  151. event(new TeamAuditEvent($laborReport));
  152. return ["success"=>true,"data"=>$laborReport];
  153. }
  154. //组长点击退组
  155. public function groupExport(Request $request){
  156. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  157. $id=$request->input('id');
  158. $laborReport=LaborReport::find($id);
  159. $laborReportStatus=new LaborReportStatus([
  160. 'labor_report_id'=>$id,
  161. 'status'=>'已退组',
  162. ]);
  163. $laborReportStatus->save();
  164. $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  165. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  166. $check_in_at=$laborReport->check_in_at;
  167. $laborReport->check_out_at=$check_out_at;
  168. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  169. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
  170. if ($laborReport['enter_at']){
  171. $enter_at=$laborReport['enter_at'];
  172. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  173. }else{
  174. $laborReport->online_duration=$online_duration;
  175. }
  176. $laborReport->update();
  177. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  178. $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  179. event(new ClockoutEvent($laborReport));
  180. return ["success"=>true,"data"=>$laborReport];
  181. }
  182. //晚19点后组长点击退场,判断是否有晚餐情况
  183. public function groupExportEnsure(Request $request){
  184. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  185. $id=$request->input('id');
  186. $relax_time=$request->input('relax_time');
  187. if(!$relax_time){ return ["success"=>false,"data"=>"未选择确切晚饭时间,请重新选择!"]; }
  188. $laborReport=LaborReport::find($id);
  189. $laborReportStatus=new LaborReportStatus([
  190. 'labor_report_id'=>$id,
  191. 'status'=>'已退组',
  192. ]);
  193. $laborReportStatus->save();
  194. $this->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  195. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  196. $check_in_at=$laborReport->check_in_at;
  197. $laborReport->check_out_at=$check_out_at;
  198. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  199. if ($relax_time){
  200. $laborReport->relax_time=$relax_time;
  201. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration)-$relax_time/60;//减去晚饭时间
  202. }else{
  203. $laborReport->working_duration=$this->minusLunchTime($laborReport,$online_duration);
  204. }
  205. if ($laborReport->enter_at){
  206. $enter_at=$laborReport['enter_at'];
  207. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  208. }else{
  209. $laborReport->online_duration=$online_duration;
  210. }
  211. $laborReport->update();
  212. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  213. $this->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  214. event(new ClockoutEvent($laborReport));
  215. return ["success"=>true,"data"=>$laborReport];
  216. }
  217. //工作时长减午饭休息时间
  218. public function minusLunchTime($laborReport,$hour){
  219. $checkInTime=$laborReport->check_in_at;
  220. $checkOutTime=$laborReport->check_out_at;
  221. $checkOutTime=Carbon::parse($checkOutTime)->format('H');
  222. $checkInTime=Carbon::parse($checkInTime)->format('H');
  223. if ((int)$checkInTime<=12&&(int)$checkOutTime>=13){
  224. $hour=$hour-1;
  225. }
  226. return $hour;
  227. }
  228. public function updateLaborCompany(Request $request){
  229. if(!Gate::allows('人事管理-临时工报表-修改劳务所')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  230. $param=$request->input();
  231. $enter_number=$request->enter_number;
  232. app('laborReportService')->修改劳务所($param);
  233. $laborReport=LaborReport::query()->where('enter_number',$enter_number)->first();
  234. if ($laborReport->labor_company_id==$request->input('laborCompanyId')){
  235. $labor_company=LaborCompany::query()->find($request->input('laborCompanyId'))->value('name');
  236. return ['success'=>true,'data'=>$laborReport,'labor_company'=>$labor_company];
  237. }else{
  238. return ['success'=>true,'data'=>'修改劳务所失败'];
  239. }
  240. }
  241. public function 删除($id){
  242. if(!Gate::allows('人事管理-临时工报表-删除')){return['success'=>false,'data'=>'没有权限'];}
  243. if(is_null($id)){return ['success'=>false,'data'=>'传入id为空'];}
  244. $laborReport=app('laborReportService')->删除($id);
  245. if ($laborReport>0)return ['success'=>true,'data'=>$laborReport];
  246. return ['success'=>true,'data'=>'删除报表失败'];
  247. }
  248. //回收站
  249. function recycle(Request $request){
  250. if(!Gate::allows('人事管理-临时工报表-删除')){ return redirect('/'); }
  251. $laborReports=LaborReport::query()->with(['user','userDutyCheck','userWorkgroup','laborCompany'])->onlyTrashed()->paginate($request->paginate??50);
  252. return view('personnel.laborReport.recycle',compact('laborReports'));
  253. }
  254. //回收站恢复
  255. function recover(Request $request){
  256. if(!Gate::allows('人事管理-临时工报表-删除')){ return redirect('/'); }
  257. $checkData=$request->checkData;
  258. $this->log(__METHOD__,"回收站恢复临时工报表记录_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
  259. return ['success'=>LaborReport::withTrashed()->whereIn('id',$checkData)->restore()];
  260. }
  261. }