LaborReportController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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\LaborCompany;
  7. use App\LaborReport;
  8. use App\LaborReportStatus;
  9. use App\Services\common\ExportService;
  10. use App\Services\LaborReportService;
  11. use App\UserDutyCheck;
  12. use App\UserWorkgroup;
  13. use Carbon\Carbon;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Auth;
  16. use Illuminate\Support\Facades\Gate;
  17. use Oursdreams\Export\Export;
  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('人事管理-临时工报表')){ view('personnel/index'); }
  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. LaborReport::processing($laborReports);
  46. foreach ($laborReports as $laborReport){
  47. if (!$laborReport->group_user_id){
  48. //2小时之内组长未审核实行软删除
  49. $tenMinutesLater=Carbon::parse($laborReport->created_at)->subHours(-2)->format('Y-m-d H:i:s');
  50. if (Carbon::now()->format('Y-m-d H:i:s')>$tenMinutesLater){
  51. $laborReport->delete();
  52. app('LogService')->log(__METHOD__,"组长未审核该条记录将在2小时后实行软删除__".__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. app('LogService')->log(__METHOD__,"进场门卫未审核该条记录将在1小时后实行软删除__".__FUNCTION__,$laborReport->toJson(),Auth::user()['id']);
  59. }
  60. }
  61. $totalWorkingHours=$this->getTotalWorkingHours($request->input());
  62. if($user->isSuperAdmin()|| Gate::allows('劳务所-可见全部')){
  63. $laborCompanies=LaborCompany::query()->get();
  64. }else{
  65. $userId=$user['id'];
  66. $laborCompanies=LaborCompany::query()->whereIn('id',function ($query)use($userId){
  67. $query->from('role_labor_company')->selectRaw('labor_company_id')->whereIn('role_id',function ($builder)use ($userId){
  68. $builder->from('user_role')->selectRaw('id_role')->where('id_user',$userId);
  69. });
  70. })->get();
  71. }
  72. $userWorkGroups=UserWorkgroup::query()->select('id','name')->get();
  73. return view('personnel/laborReport/index',compact('laborReports','userWorkGroups','laborCompanies','laravelEchoPrefix','permittingWorkgroups','paginateParams','tokenOfBroadcastEnterAndLeave','totalWorkingHours'));
  74. }
  75. public function getTotalWorkingHours($param){
  76. $totalLaborReports=app('laborReportService')->get($param);
  77. $totalWorkingHours=0;
  78. foreach ($totalLaborReports as $totalLaborReport){
  79. $totalWorkingHours=$totalWorkingHours+$totalLaborReport->thisRoundRecordWorkingTime;
  80. }
  81. return $totalWorkingHours;
  82. }
  83. public function export(Request $request){
  84. if (!Gate::allows('人事管理-临时工报表')){return redirect(url('/')); }
  85. if ($request->checkAllSign){
  86. $params = $request->input();
  87. unset($params["checkAllSign"]);
  88. $laborReports=app('laborReportService')->get($params);
  89. LaborReport::processing($laborReports);
  90. }else{
  91. $laborReports=app('laborReportService')->get(["id"=>$request->data]);
  92. LaborReport::processing($laborReports);
  93. }
  94. $row = ['本次工作时长','小组','临时工','电话','身份证号','劳务所','进场时间','进组时间','退组时间','进组取整时间','退组取整时间','退场时间','审核时间','审核人','晚饭时间(分)','在线时长','进场编号','备注'];
  95. $list = [];
  96. foreach ($laborReports as $laborReport){
  97. $list[] = [
  98. $laborReport->working_duration,
  99. $laborReport->userWorkgroup ? $laborReport->userWorkgroup->name : null,
  100. $laborReport->name,
  101. $laborReport->mobile_phone,
  102. $laborReport->identity_number,
  103. $laborReport->laborCompany ? $laborReport->laborCompany->name : null,
  104. $laborReport->enter_at,
  105. $laborReport->check_in_at,
  106. $laborReport->check_out_at,
  107. $laborReport->round_check_in_at,
  108. $laborReport->round_check_out_at,
  109. $laborReport->exit_at,
  110. $laborReport->verify_at,
  111. $laborReport->user ? $laborReport->user->name : null,
  112. (string)$laborReport->relax_time,
  113. $laborReport->online_duration,
  114. $laborReport->enter_number,
  115. $laborReport->remark,
  116. ];
  117. }
  118. return Export::make($row,$list,"临时工报表记录");
  119. //return app(ExportService::class)->json($row,$list,"临时工报表记录");
  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('user_duty_check_id');
  126. $laborReportStatus=new LaborReportStatus([
  127. 'labor_report_id'=>$id,
  128. 'status'=>'已入场',
  129. ]);
  130. $laborReportStatus->save();
  131. app('LogService')->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. app('LogService')->log(__METHOD__,"门卫打卡审核".__FUNCTION__,json_encode($userDutyCheck),Auth::user()['id']);
  136. event(new GuardAuditEvent($userDutyCheck));
  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. app('LogService')->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. /**
  163. * @var LaborReportService $laborReportService
  164. */
  165. $laborReportService=app(LaborReportService::class);
  166. $laborReportService->addOrUpdateRemark($remark,$id);
  167. $laborReport->verifyPerson=Auth::user()['name'];
  168. app('LogService')->log(__METHOD__,"打卡组长审核并添加相应备注".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  169. event(new TeamAuditEvent($laborReport));
  170. return ["success"=>true,"data"=>$laborReport];
  171. }
  172. //组长点击退组
  173. public function groupExport(Request $request){
  174. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  175. $id=$request->input('id');
  176. $laborReport=LaborReport::query()->find($id);
  177. $laborReportStatus=new LaborReportStatus([
  178. 'labor_report_id'=>$id,
  179. 'status'=>'已退组',
  180. ]);
  181. $laborReportStatus->save();
  182. app('LogService')->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  183. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  184. $check_in_at=$laborReport->check_in_at;
  185. $laborReport->check_out_at=$check_out_at;
  186. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  187. $round_time=round(Carbon::parse($laborReport->round_check_out_at)->diffInSeconds(Carbon::parse($laborReport->round_check_in_at))/3600,2);
  188. $laborReport->working_duration=$this->minusLunchTime($laborReport,$round_time);
  189. if ($laborReport['enter_at']){
  190. $enter_at=$laborReport['enter_at'];
  191. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  192. }else{
  193. $laborReport->online_duration=$online_duration;
  194. }
  195. $laborReport->update();
  196. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  197. app('LogService')->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  198. event(new ClockoutEvent($laborReport));
  199. return ["success"=>true,"data"=>$laborReport];
  200. }
  201. //晚19点后组长点击退场,判断是否有晚餐情况
  202. public function groupExportEnsure(Request $request){
  203. if(!Gate::allows('人事管理-组长审核')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  204. $id=$request->input('id');
  205. $relax_time=$request->input('relax_time');
  206. if(!$relax_time){ return ["success"=>false,"data"=>"未选择确切晚饭时间,请重新选择!"]; }
  207. $laborReport=LaborReport::find($id);
  208. $laborReportStatus=new LaborReportStatus([
  209. 'labor_report_id'=>$id,
  210. 'status'=>'已退组',
  211. ]);
  212. $laborReportStatus->save();
  213. app('LogService')->log(__METHOD__,"报表记录退组对应状态".__FUNCTION__,json_encode($laborReportStatus),Auth::user()['id']);
  214. $check_out_at=Carbon::now()->format('Y-m-d H:i:s');
  215. $check_in_at=$laborReport->check_in_at;
  216. $laborReport->check_out_at=$check_out_at;
  217. $online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2);
  218. $round_time=round(Carbon::parse($laborReport->round_check_out_at)->diffInSeconds(Carbon::parse($laborReport->round_check_in_at))/3600,2);
  219. if ($relax_time){
  220. $laborReport->relax_time=$relax_time;
  221. $laborReport->working_duration=$this->minusLunchTime($laborReport,$round_time)-$relax_time/60;//减去晚饭时间
  222. }else{
  223. $laborReport->working_duration=$this->minusLunchTime($laborReport,$round_time);
  224. }
  225. if ($laborReport->enter_at){
  226. $enter_at=$laborReport['enter_at'];
  227. $laborReport->online_duration=round(Carbon::parse($check_out_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2);
  228. }else{
  229. $laborReport->online_duration=$online_duration;
  230. }
  231. $laborReport->update();
  232. $laborReport->is_exportGroup=$laborReport->getIsExportGroupAttribute();
  233. app('LogService')->log(__METHOD__,"退组".__FUNCTION__,json_encode($laborReport),Auth::user()['id']);
  234. event(new ClockoutEvent($laborReport));
  235. return ["success"=>true,"data"=>$laborReport];
  236. }
  237. //工作时长减午饭休息时间
  238. public function minusLunchTime($laborReport,$hour){
  239. $checkInTime=$laborReport->check_in_at;
  240. $checkOutTime=$laborReport->check_out_at;
  241. $checkOutTime=Carbon::parse($checkOutTime)->format('H');
  242. $checkInTime=Carbon::parse($checkInTime);
  243. if ($checkInTime->lessThanOrEqualTo($checkInTime->clone()->setHours(11)->setMinutes(30))&&(int)$checkOutTime>=13){
  244. $hour=$hour-1;
  245. }
  246. return $hour;
  247. }
  248. public function updateLaborCompany(Request $request){
  249. if(!Gate::allows('人事管理-临时工报表-修改劳务所')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  250. $param=$request->input();
  251. $enter_number=$request->enter_number;
  252. app('laborReportService')->修改劳务所($param);
  253. $laborReport=LaborReport::query()->where('enter_number',$enter_number)->first();
  254. if ($laborReport->labor_company_id==$request->input('laborCompanyId')){
  255. $labor_company=LaborCompany::query()->find($request->input('laborCompanyId'))->value('name');
  256. return ['success'=>true,'data'=>$laborReport,'labor_company'=>$labor_company];
  257. }else{
  258. return ['success'=>true,'data'=>'修改劳务所失败'];
  259. }
  260. }
  261. public function 删除($id){
  262. if(!Gate::allows('人事管理-临时工报表-删除')){return['success'=>false,'data'=>'没有权限'];}
  263. if(is_null($id)){return ['success'=>false,'data'=>'传入id为空'];}
  264. $laborReport=app('laborReportService')->删除($id);
  265. if ($laborReport>0)return ['success'=>true,'data'=>$laborReport];
  266. return ['success'=>true,'data'=>'删除报表失败'];
  267. }
  268. //回收站
  269. function recycle(Request $request){
  270. if(!Gate::allows('人事管理-临时工报表-删除')){ return redirect('/'); }
  271. $paginateParams=$request->input();
  272. $laborReports=LaborReport::query()->with(['user','userDutyCheck','userWorkgroup','laborCompany'])->onlyTrashed()->paginate($request->paginate??50);
  273. return view('personnel.laborReport.recycle',compact('laborReports','paginateParams'));
  274. }
  275. //回收站恢复
  276. function recover(Request $request){
  277. if(!Gate::allows('人事管理-临时工报表-删除')){ return redirect('/'); }
  278. $checkData=$request->checkData;
  279. app('LogService')->log(__METHOD__,"回收站恢复临时工报表记录_".__FUNCTION__,json_encode($request->input()),Auth::user()['id']);
  280. return ['success'=>LaborReport::withTrashed()->whereIn('id',$checkData)->restore()];
  281. }
  282. public function changeLaborReportRemark(Request $request){
  283. if(!Gate::allows('人事管理-临时工报表-编辑备注')){return ['success'=>'false','fail_info'=>'没有权限'];}
  284. $laborReportId = $request->input('id');
  285. $laborReportRemark = $request->input('remark');
  286. if(is_null($laborReportId) ){
  287. return ['success'=>false,'fail_info'=>'参数异常'];
  288. }
  289. $laborReport=LaborReport::find($laborReportId);
  290. /**
  291. * @var LaborReportService $laborReportService
  292. */
  293. $laborReportService=app(LaborReportService::class);
  294. $laborReportService->addOrUpdateRemark($laborReportRemark,$laborReportId);
  295. app('LogService')->log(__METHOD__,'添加或者修改临时工报表备注'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
  296. return ['success'=>true,'status'=>$laborReport];
  297. }
  298. }