index.blade.php 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. @extends('layouts.app')
  2. @section('title')临时工报表-人事管理@endsection
  3. @section('content')
  4. <div class="d-none container-fluid modal-open" id="list" style="overflow: visible">
  5. <div id="form_div"></div>
  6. <span class="dropdown">
  7. <button class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget mt-1 mb-1"
  8. data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
  9. 导出Excel
  10. </button>
  11. <div class="dropdown-menu">
  12. <a class="dropdown-item" @click="laborReportExport(false)" href="javascript:">导出勾选内容</a>
  13. <a class="dropdown-item" @click="laborReportExport(true)" href="javascript:">导出所有页</a>
  14. </div>
  15. </span>
  16. <div class=" d-none d-xl-block">
  17. <table class="table table-sm table-hover table-striped p-0 text-nowrap table-bordered td-min-width-80" id="table">
  18. <tr v-for="(laborReport,i) in laborReports" @click="selectedColor(laborReport.id)" :style="{'font-weight': laborReport.id==selectedStyle?'bold':''}" @click="selectTableRow(i,$event)">
  19. <td>
  20. <label><input class="checkItem" type="checkbox" :value="laborReport.id"/></label>
  21. </td>
  22. <td><span>@{{ i+1 }}</span></td>
  23. <td >
  24. @can('人事管理-门卫审核')
  25. <span >
  26. <b v-if="laborReport.isAdult==1" class="text-danger">童工</b>
  27. <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1" class="text-success">已审核</span>
  28. <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence" class="text-black">&nbsp;&nbsp;&nbsp;@{{laborReport.sequence}}/@{{laborReport.amountOfJoined}}</span>
  29. <button v-else class="btn btn-sm btn-outline-secondary" @click="guardClockAudit(laborReport.id,laborReport.user_duty_check_id)">门卫审核</button>
  30. </span>
  31. @else
  32. <b v-if="laborReport.isAdult==1" class="text-danger">童工</b>
  33. <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1" class="text-success">已审核</span>
  34. <span v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence" class="text-black">&nbsp;&nbsp;&nbsp;@{{ laborReport.sequence }}/@{{ laborReport.amountOfJoined }}</span>
  35. <span v-else class="text-center"><b class="text-danger">门卫未审核</b></span>
  36. @endcan
  37. <span>&nbsp;&nbsp;&nbsp;</span>
  38. @can('人事管理-组长审核')
  39. <span>
  40. <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export&&laborReport.has_group_verify_right" @click="groupExport(laborReport.id,laborReport.name)" class="btn btn-sm btn-outline-danger">退组</button>
  41. <span v-else-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export&&!laborReport.has_group_verify_right"><b class="text-success">在组</b></span>
  42. <span v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</span>
  43. <span v-else-if="laborReport.is_export" class="text-black">已退场</span>
  44. <button v-else-if="laborReport.user_workgroup_id&&laborReport.has_group_verify_right" @click="groupClockAudit(laborReport.id,laborReport.userWorkgroupNeedRemark)" class="btn btn-sm btn-outline-primary">组长审核</button>
  45. </span>
  46. @else
  47. <span v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export"><b class="text-success">在组</b></span>
  48. <span v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</span>
  49. <span v-else-if="laborReport.is_export" class="text-black">已退场</span>
  50. <span v-else-if="laborReport.user_workgroup_id" class="text-center"><b class="text-danger">组长未审核</b></span>
  51. @endcan
  52. </td>
  53. <td><span v-if="laborReport.thisRoundRecordWorkingTime">@{{laborReport.thisRoundRecordWorkingTime}}</span></td>
  54. <td><span>@{{laborReport.userWorkGroupName}}</span></td>
  55. <td><span>@{{laborReport.name}}</span></td>
  56. <td class="text-muted"><span>@{{laborReport.mobile_phone}}</span></td>
  57. <td class="text-muted"><span>@{{laborReport.identity_number}}</span></td>
  58. @can('人事管理-临时工报表-修改劳务所')
  59. <td class="text-muted">
  60. <select class="form-control-sm" name="labor_company" id="labor_company" @change="updateLaborCompany(laborReport.labor_company_id,laborReport.enter_number)" v-model="laborReport.labor_company_id">
  61. <option v-for="laborCompany in laborCompanies" :value="laborCompany.name">@{{ laborCompany.value }}</option>
  62. </select>
  63. </td>
  64. @else
  65. <td class="text-muted"><span>@{{laborReport.labor_company}}</span></td>
  66. @endcan
  67. <td class="text-muted"><span>@{{laborReport.enter_at}}</span></td>
  68. <td><span>@{{laborReport.checkInAt}}</span></td>
  69. <td class="text-muted"><span>@{{laborReport.checkOutAt}}</span></td>
  70. <td class="text-muted"><span>@{{laborReport.round_check_in_at}}</span></td>
  71. <td class="text-muted"><span>@{{laborReport.round_check_out_at}}</span></td>
  72. <td><span>@{{ laborReport.exit_at }}</span></td>
  73. <td class="text-muted"><span>@{{laborReport.verifyAt}}</span></td>
  74. <td class="text-muted"><span v-if="laborReport.verifyPerson">@{{laborReport.verifyPerson}}</span></td>
  75. <td class="text-muted"><span v-if="laborReport.relax_time">@{{laborReport.relax_time}}</span></td>
  76. {{-- <td class="text-muted"><span v-if="laborReport.onlineDuration">@{{laborReport.onlineDuration}}</span></td>--}}
  77. <td class="text-muted"><span v-if="laborReport.thisRecordOnlineTime">@{{laborReport.thisRecordOnlineTime}}</span></td>
  78. <td class="text-muted"><span>@{{laborReport.enter_number}}</span></td>
  79. {{-- <td><span v-if="laborReport.workingDuration">@{{laborReport.workingDuration}}</span></td>--}}
  80. <td>
  81. @can('人事管理-临时工报表-编辑备注')
  82. <span v-if="laborReport.remark" class="btn-sm btn-outline-secondary btn" @click="laborReportRemarkCheck($event)" :data_id="laborReport.id">@{{laborReport.remark}}</span>
  83. <input type="text" v-else class="form-control form-control-sm" @blur="addLaborReportRemark($event)" onfocus="$(this).css('width','85px')" :value="laborReport.remark" :data_id="laborReport.id" >
  84. <input type="text" class="form-control form-control-sm" @blur="updateLaborReportRemark($event)" :value="laborReport.remark" :data_id="laborReport.id" style="min-width:85px;display: none">
  85. @else
  86. <span v-if="laborReport.remark">@{{laborReport.remark}}</span>
  87. @endcan
  88. </td>
  89. @can('人事管理-临时工报表-删除')
  90. <td><span class="btn btn-sm btn-outline-danger" @click="删除(laborReport.id,laborReport.name)">删</span></td>
  91. @endcan
  92. </tr>
  93. </table>
  94. </div>
  95. <table id="listOnPad" class="table table-striped table-bordered table-hover p-0 d-table d-xl-none" style="background: rgb(255, 255, 255);">
  96. <tr v-for="laborReport in laborReports">
  97. <td style="filter:grayscale(30%);">
  98. <div class="pl-3 mt-1">
  99. <div style="transform:scale(1)" class="pl-0">
  100. <span class="mr-3 text-nowrap">
  101. <span >操作:</span>
  102. <span >
  103. @can('人事管理-门卫审核')
  104. <span >
  105. <b v-if="laborReport.isAdult==1" class="text-danger">童工</b>
  106. <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1" class="text-success">已审核</b>
  107. <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence" class="text-black">&nbsp;&nbsp;&nbsp;@{{laborReport.sequence}}/@{{laborReport.amountOfJoined}}</b>
  108. <button v-else style="transform:scale(1.1)" class="btn btn-lg btn-outline-secondary" @click="guardClockAudit(laborReport.id,laborReport.user_duty_check_id)">门卫审核</button>
  109. </span>
  110. @else
  111. <b v-if="laborReport.isAdult==1" class="text-danger">童工</b>
  112. <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined==1" class="text-success">已审核</b>
  113. <b v-else-if="laborReport.userDutyCheckVerifyUserId&&laborReport.amountOfJoined&&laborReport.sequence" class="text-black">&nbsp;&nbsp;&nbsp;@{{ laborReport.sequence }}/@{{ laborReport.amountOfJoined }}</b>
  114. <span v-else class="text-center"><b class="text-danger">门卫未审核</b></span>
  115. @endcan
  116. &nbsp;&nbsp;&nbsp;&nbsp;
  117. @can('人事管理-组长审核')
  118. <span>
  119. <button v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export&&laborReport.has_group_verify_right" @click="groupExport(laborReport.id,laborReport.name)" style="transform:scale(1.1)" class="btn btn-lg btn-danger">退组</button>
  120. <span v-else-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export&&!laborReport.has_group_verify_right"><b class="text-success">在组</b></span>
  121. <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</b>
  122. <b v-else-if="laborReport.is_export" class="text-black">已退场</b>
  123. <button v-else-if="laborReport.user_workgroup_id&&laborReport.has_group_verify_right" @click="groupClockAudit(laborReport.id,laborReport.userWorkgroupNeedRemark)" class="btn btn-lg btn-outline-primary" style="transform:scale(1.1)" >组长审核</button>
  124. </span>
  125. @else
  126. <span v-if="laborReport.groupUserId&&!laborReport.is_exportGroup&&!laborReport.is_export"><b class="text-success">在组</b></span>
  127. <b v-else-if="laborReport.groupUserId&&laborReport.is_exportGroup&&!laborReport.is_export" class="text-info">已退组</b>
  128. <b v-else-if="laborReport.is_export" class="text-black">已退场</b>
  129. <span v-else-if="laborReport.user_workgroup_id" class="text-center"><b class="text-danger">组长未审核</b></span>
  130. @endcan
  131. </span>
  132. </span>
  133. <span class="mr-3 text-nowrap"><span class="text-black">进场时间:</span><span class="text-black-50">@{{laborReport.enter_at }}</span></span>
  134. <span class="mr-3 text-nowrap"><span class="text-muted">退组时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.checkOutAt }} </span></span>
  135. <span class="mr-3 text-nowrap"><span class="text-black">退场时间:</span><span style="color:#af7651">@{{ laborReport.exit_at }}</span></span>
  136. {{-- <span class="mr-3 text-nowrap"><span class="text-black">进场编号:</span><span style="color:#af7651">@{{ laborReport.enter_number }}</span></span>--}}
  137. <span class="mr-3 text-nowrap"><span class="text-black">小组:</span><span class="text-black-50">@{{laborReport.userWorkGroupName }}</span></span>
  138. <span class="mr-3 text-nowrap"><span class="text-black">临时工:</span><span class="text-black-50">@{{ laborReport.name }} </span></span>
  139. <span class="mr-3 text-nowrap"><span class="text-black">电话:</span><span style="color:#af7651" v-if="">@{{ laborReport.mobile_phone }} </span></span>
  140. <span class="text-nowrap"><span class="text-black">身份证号:</span><span style="color:#af7651" v-if="">@{{ laborReport.identity_number }} </span></span>
  141. {{-- <span class="mr-3 text-nowrap"><span class="text-black">劳务所:</span><span style="color:#af7651" v-if="">@{{ laborReport.labor_company }} </span></span>--}}
  142. {{-- <span class="mr-3 text-nowrap"><span class="text-black">进组时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.checkInAt }} </span></span>--}}
  143. {{-- <span class="mr-3 text-nowrap"><span class="text-black">审核时间:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyAt }} </span></span>--}}
  144. {{-- <span class="mr-3 text-nowrap"><span class="text-black">审核人:</span><span style="color:#af7651" v-if="">@{{ laborReport.verifyPerson }} </span></span>--}}
  145. {{-- <span class="mr-3 text-nowrap"><span class="text-black">晚饭打卡(分):</span><span style="color:#af7651" v-if="">@{{ laborReport.relax_time }} </span></span>--}}
  146. {{-- <span class="mr-3 text-nowrap"><span class="text-black">在线时长:</span><span style="color:#af7651" v-if="">@{{ laborReport.onlineDuration }} </span></span>--}}
  147. {{-- <span class="mr-3 text-nowrap"><span class="text-black">本次工作时长:</span><span style="color:#af7651" v-if="">@{{ laborReport.workingDuration }} </span></span>--}}
  148. @can('人事管理-临时工报表-删除')
  149. <span style="transform:scale(1.1)" class="btn btn-sm btn-outline-danger" @click="删除(laborReport.id,laborReport.name)">删</span>
  150. @endcan
  151. </div>
  152. </div>
  153. </td>
  154. </tr>
  155. </table>
  156. <div class="text-info h5 btn btn">{{$laborReports->count()}}/@{{ sum }}</div>
  157. <div>{{$laborReports->appends($paginateParams)->links()}}</div>
  158. {{-- 选择晚饭时长弹框 --}}
  159. <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  160. <div class="modal-dialog">
  161. <div class="modal-content">
  162. <div class="modal-header">
  163. <h5 class="modal-title" id="exampleModalLabel">用餐时长</h5>
  164. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  165. <span aria-hidden="true">&times;</span>
  166. </button>
  167. </div>
  168. <div class="modal-body">
  169. <form>
  170. <div class="form-group">
  171. <label for="relax_time" class="col-form-label">选择用餐时长:</label>
  172. <select class="form-control" id="relax_time" v-model="relax_time">
  173. <option value="30">30分</option>
  174. <option value="60">60分</option>
  175. </select>
  176. </div>
  177. </form>
  178. </div>
  179. <div class="modal-footer">
  180. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  181. <span class="btn btn-block" aria-hidden="true">取消</span>
  182. </button>
  183. <button type="button" class="btn btn-primary" data-dismiss="modal" @click="makeSureRelax_time">确定</button>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. {{-- 特定组需要添加备注 --}}
  189. <div class="modal fade" id="remarkModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  190. <div class="modal-dialog">
  191. <div class="modal-content">
  192. <div class="modal-header">
  193. <h5 class="modal-title" id="exampleModalLabel">添加所需备注</h5>
  194. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  195. <span aria-hidden="true">&times;</span>
  196. </button>
  197. </div>
  198. <div class="modal-body">
  199. <form>
  200. <div class="form-group">
  201. <label for="remark" class="col-form-label">备注:</label>
  202. <textarea class="form-control" id="remark"></textarea>
  203. </div>
  204. </form>
  205. </div>
  206. <div class="modal-footer">
  207. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  208. <span class="btn btn-block" aria-hidden="true">取消</span>
  209. </button>
  210. <button type="button" class="btn btn-primary" data-dismiss="modal" @click="addRemarkAndGroupClock">确定</button>
  211. </div>
  212. </div>
  213. </div>
  214. </div>
  215. <!-- 是否晚餐弹框 -->
  216. <div class="modal fade" id="dinnerModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" >
  217. <div class="modal-dialog">
  218. <div class="modal-content">
  219. <div class="modal-body">
  220. <b class="font-weight-bold">是否用餐?</b>
  221. </div>
  222. <div class="modal-footer">
  223. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  224. <span class="btn btn-block" @click="noDinner">否</span>
  225. </button>
  226. <button type="button" class="btn btn-primary" data-dismiss="modal" @click="haveDinner">是</button>
  227. </div>
  228. </div>
  229. </div>
  230. </div>
  231. </div>
  232. @endsection
  233. @section('lastScript')
  234. <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
  235. <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
  236. <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
  237. <script>
  238. let today=(new Date());
  239. function isTomorrow(){
  240. let now=(new Date());
  241. const dateTime=new Date(now.setDate(now.getDate()+1));
  242. if(dateTime<=today)return true;
  243. else return false;
  244. }
  245. function reloadOnTomorrow(){
  246. if(isTomorrow()){
  247. window.location.reload();
  248. }
  249. }
  250. window.onfocus=reloadOnTomorrow;
  251. setInterval(reloadOnTomorrow,1000*60*60)
  252. </script>
  253. <script>
  254. let hideHeaderTitle = function (){
  255. let $listOnPad = $('#listOnPad');
  256. let $headerRoll = $('#headerRoll');
  257. if($listOnPad.css('display')!=='none'){
  258. $headerRoll.attr('hidden',true)
  259. }else{
  260. $headerRoll.attr('hidden',false)
  261. $headerRoll.find('tr').css('width',$(document).width());
  262. }
  263. };
  264. window.onresize= hideHeaderTitle;
  265. window.onscroll=hideHeaderTitle;
  266. @if(isset($request))
  267. let request={!! json_encode($request) !!};
  268. @endif
  269. let vue = new Vue({
  270. el:"#list",
  271. data:{
  272. laborReports:[
  273. @foreach($laborReports as $laborReport)
  274. {id:'{{$laborReport->id}}',enter_number:'{{$laborReport->enter_number}}'
  275. ,@if($laborReport->userWorkgroup)user_workgroup_id:'{{$laborReport->userWorkgroup->id}}',
  276. userWorkgroupNeedRemark:'{{$laborReport->userWorkgroup->isNeedRemark}}',
  277. userWorkGroupName:'{{$laborReport->userWorkgroup->name}}',@endif
  278. userId:'{{$laborReport->user_id}}',name:'{{$laborReport->name}}'
  279. ,mobile_phone:'{{$laborReport->mobile_phone}}',identity_number:'{{$laborReport->identity_number}}',
  280. @if($laborReport->laborCompany)
  281. labor_company:'{{$laborReport->laborCompany->name}}',labor_company_id:'{{$laborReport->laborCompany->id}}',@endif
  282. checkInAt:'{{$laborReport->check_in_at}}', relax_time:'{{$laborReport->relax_time}}',
  283. is_exportGroup:'{{$laborReport->is_exportGroup}}',is_export:'{{$laborReport->is_export}}',
  284. verifyAt:'{{$laborReport->verify_at}}',groupUserId:'{{$laborReport->group_user_id}}',verifyPerson:'{{$laborReport->user['name']}}',
  285. checkOutAt:'{{$laborReport->check_out_at}}',onlineDuration:'{{$laborReport->online_duration}}',
  286. round_check_in_at:'{{$laborReport->round_check_in_at}}',round_check_out_at:'{{$laborReport->round_check_out_at}}',
  287. workingDuration:'{{$laborReport->working_duration}}', created_at:'{{$laborReport->created_at}}',
  288. enter_at:'{{$laborReport->enter_at}}',exit_at:'{{$laborReport->exit_at}}',
  289. thisRecordOnlineTime:'{{$laborReport->thisRecordOnlineTime}}',
  290. thisRecordWorkingTime:'{{$laborReport->thisRecordWorkingTime}}',
  291. thisRoundRecordWorkingTime:'{{$laborReport->thisRoundRecordWorkingTime}}',
  292. isAdult:'{{$laborReport->isAdult}}',has_group_verify_right:'{{$laborReport->has_group_verify_right}}',
  293. sequence:'{{$laborReport->sequence}}',amountOfJoined:'{{$laborReport->amountOfJoined}}',remark:'{{$laborReport->remark}}',
  294. @if($laborReport->userDutyCheck)user_duty_check_id:'{{$laborReport->userDutyCheck->id}}', userDutyCheckVerifyUserId:'{{$laborReport->userDutyCheck->verify_user_id}}'
  295. ,userDutyCheckType:'{{$laborReport->userDutyCheck->type}}',userDutyCheckAt:'{{$laborReport->userDutyCheck->checked_at}}',@endif},
  296. @endforeach
  297. ],
  298. i:0,
  299. userWorkGroups:[
  300. @foreach($userWorkGroups as $userWorkGroup)
  301. {name:'{{$userWorkGroup->id}}',value:'{{$userWorkGroup->name}}'},
  302. @endforeach
  303. ],
  304. permittingWorkgroups:{!! $permittingWorkgroups !!},
  305. totalWorkingHours:{!! $totalWorkingHours !!},
  306. laborCompanies:[
  307. @foreach($laborCompanies as $laborCompany)
  308. {name:'{{$laborCompany->id}}',value:'{{$laborCompany->name}}'},
  309. @endforeach
  310. ],
  311. relax_time:'',dateTime:'',selectedStyle:'',laborReportId:null,
  312. sum:{!! $laborReports->total() !!},
  313. selectTr:''
  314. },
  315. mounted:function(){
  316. initEcho();
  317. let _this=this;
  318. let laborReports=_this.laborReports;
  319. //进场
  320. let tokenOfBroadcastEnterAndLeave='{{$tokenOfBroadcastEnterAndLeave}}';
  321. if(tokenOfBroadcastEnterAndLeave){
  322. Echo.channel('{{$laravelEchoPrefix}}'+tokenOfBroadcastEnterAndLeave).listen('ImportEvent',(e)=>{
  323. let labor=e.laborReport;
  324. laborReports.unshift(labor);
  325. });
  326. }
  327. //退场
  328. Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('ExportEvent',(e)=>{
  329. setTimeout(function () {
  330. window.location.reload();
  331. },500);
  332. });
  333. //门卫审核
  334. Echo.channel('{{$laravelEchoPrefix}}userDutyCheck').listen('GuardAuditEvent',(e)=>{
  335. let userDutyCheck=e.userDutyCheck;
  336. laborReports.every(function (laborReport) {
  337. if (laborReport.user_duty_check_id==userDutyCheck.id){
  338. laborReport.userDutyCheckVerifyUserId=userDutyCheck.verify_user_id;
  339. laborReport.user_duty_check_id=userDutyCheck.id;
  340. laborReport.amountOfJoined=1;
  341. return false
  342. }
  343. return true;
  344. });
  345. });
  346. //组长审核
  347. Echo.channel('{{$laravelEchoPrefix}}laborReport').listen('TeamAuditEvent',(e)=>{
  348. let labor=e.laborReport;
  349. laborReports.every(function (laborReport) {
  350. if (laborReport.id==labor.id){
  351. if(labor.remark){
  352. laborReport.remark=labor.remark;
  353. }
  354. laborReport.verifyAt=labor.verify_at;
  355. laborReport.groupUserId=labor.group_user_id;
  356. laborReport.verifyPerson=labor.verifyPerson;
  357. return false
  358. }
  359. return true;
  360. });
  361. });
  362. //进组
  363. _this.permittingWorkgroups.forEach(function(workgroup){
  364. Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockinEvent',(e)=>{
  365. setTimeout(function () {
  366. window.location.reload();
  367. },500);
  368. });
  369. });
  370. //退组
  371. _this.permittingWorkgroups.forEach(function(workgroup){
  372. Echo.channel('{{$laravelEchoPrefix}}'+workgroup.token).listen('ClockoutEvent',(e)=>{
  373. let labor=e.laborReport;
  374. laborReports.every(function (laborReport) {
  375. if (laborReport.id==labor.id){
  376. laborReport.thisRecordOnlineTime=labor.thisRecordOnlineTime;
  377. laborReport.thisRecordWorkingTime=labor.thisRecordWorkingTime;
  378. laborReport.is_exportGroup=labor.is_exportGroup;
  379. laborReport.checkOutAt=labor.check_out_at;
  380. laborReport.round_check_out_at=labor.round_check_out_at;
  381. if (labor.relax_time){
  382. laborReport.relax_time=labor.relax_time;
  383. }
  384. return false
  385. }
  386. return true;
  387. });
  388. });
  389. });
  390. $(".tooltipTarget").tooltip({'trigger':'hover'});
  391. $('#list').removeClass('d-none');
  392. let data=[
  393. [
  394. {name:'created_at_start',type:'dateTime',tip:'选择显示指定日期的起始时间'},
  395. {name:'user_workgroup_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的小组'],
  396. placeholder:['小组','定位或多选小组'],data:this.userWorkGroups},
  397. {name:'labor_company_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的劳务所'],
  398. placeholder:['劳务所','定位或多选劳务所'],data:this.laborCompanies},
  399. {name:'enter_number',type:'input',tip:'可支持多进场编号:支持15天内模糊搜索',placeholder: '进场编号'},
  400. {name:'is_export',type:'checkbox',data:[{name:true,value:'显示已退场'}]},
  401. ],
  402. [
  403. {name:'created_at_end',type:'dateTime',tip:'选择显示指定日期的结束时间'},
  404. {name:'name',type:'input',tip:'可支持多姓名,模糊搜索可在两侧增加百分号(%)进行',placeholder: '姓名'},
  405. {name:'mobile_phone',type:'input',tip:'可支持多电话号,模糊搜索可在两侧增加百分号(%)进行',placeholder: '电话号'},
  406. {name:'identity_number',type:'input',tip:'可支持多身份证号:支持15天内模糊搜索',placeholder: '身份证号'},
  407. ],
  408. ];
  409. this.form = new query({
  410. el:"#form_div",
  411. condition:data,
  412. });
  413. this.form.init();
  414. let column = [
  415. {name:'index',value: '序号', neglect: true,class: 'text-center'},
  416. {name:'operation',value: '操作', neglect: true,class: 'text-center'},
  417. {name:'thisRoundRecordWorkingTime',value:'本次工作时长', neglect: true,class: 'text-center'},
  418. {name:'userWorkGroupName',value: '小组', style:'background-color: rgb(241, 234, 190)',class: 'text-center'},
  419. {name:'name',value: '临时工', style:'background-color: rgb(241, 234, 190)',class: 'text-center'},
  420. {name:'mobile_phone',value: '电话', style:'background-color: rgb(241, 234, 190)',class: 'text-center'},
  421. {name:'identity_number',value: '身份证号', style:'background-color: rgb(241, 234, 190)',class: 'text-center'},
  422. {name:'labor_company',value: '劳务所', style:'background-color: rgb(241, 234, 190)',class: 'text-center'},
  423. {name:'enter_at',value: '进场时间',class: 'text-center'},
  424. {name:'checkInAt',value: '进组时间',class: 'text-center'},
  425. {name:'checkOutAt',value: '退组时间',class: 'text-center'},
  426. {name:'round_check_in_at',value: '进组取整时间',class: 'text-center'},
  427. {name:'round_check_out_at',value: '退组取整时间',class: 'text-center'},
  428. {name:'exit_at',value: '退场时间',class: 'text-center'},
  429. {name:'verifyAt',value: '审核时间',class: 'text-center'},
  430. {name:'verifyPerson',value: '审核人',class: 'text-center'},
  431. {name:'relax_time',value: '晚饭打卡(分)', neglect: true,class: 'text-center'},
  432. {name:'thisRecordOnlineTime',value:'在线时长', neglect: true,class: 'text-center'},
  433. {name:'enter_number',value: '进厂编号', style:'background-color: rgb(241, 234, 190)',class: 'text-center'},
  434. {name:'remark',value: '备注',class: 'text-center'},
  435. @can('人事管理-临时工报表-删除')
  436. {name:'remove',value: '操作',class: 'text-center'},
  437. @endcan
  438. ];
  439. if (window.innerWidth > 543){
  440. new Header({
  441. el: "table",
  442. name:"laborReport",
  443. column: column,
  444. data: this.laborReports,
  445. fixedTop:($('#form_div').height())+2,
  446. }).init();
  447. }
  448. setTimeout(function () {
  449. let $dom_thisRecordWorkingTime=$('#dom_thisRoundRecordWorkingTime');
  450. $dom_thisRecordWorkingTime.attr('title','用工总工时:'+_this.totalWorkingHours);
  451. $dom_thisRecordWorkingTime.tooltip({'trigger':'manual'});
  452. $dom_thisRecordWorkingTime.tooltip('show')
  453. },0);
  454. },
  455. methods:{
  456. selectTableRow(id,e){
  457. $('#headerParent tr[class=focusing]').removeClass('focusing')
  458. if (id === this.selectTr) {
  459. this.selectTr = '';
  460. return;
  461. }
  462. this.selectTr = id;
  463. $(e.target).parent('tr').addClass('focusing')
  464. },
  465. //备注修改
  466. laborReportRemarkCheck:function (e) {
  467. let target = $(e.target);
  468. target.hide();
  469. let input = target.next();
  470. input.show();
  471. input.focus();
  472. },
  473. // 失焦事件
  474. updateLaborReportRemark:function (e) {
  475. let target = $(e.target);
  476. let _this = this;
  477. let span = target.prev();
  478. let id = target.attr('data_id');
  479. let oldRemark = span.text();
  480. let remark = target.val();
  481. if(remark !== span.text()){
  482. let ajaxUrl= '{{url("personnel/laborReport/changeLaborReportRemark")}}';
  483. axios.post(ajaxUrl,{'id':id,'remark':remark}).then(function (response) {
  484. if(response.data.success){
  485. _this.updateLaborReports(id,remark);
  486. tempTip.setDuration(2000);
  487. tempTip.showSuccess('备注修改成功');
  488. }else{
  489. tempTip.setDuration(3000);
  490. tempTip.show('备注修改失败!'+response.data.fail_info);
  491. _this.updateLaborReports(id,oldRemark);
  492. }
  493. }).catch(function (err) {
  494. tempTip.setDuration(3000);
  495. tempTip.show('备注修改失败!网络异常:'+err);
  496. _this.updateLaborReports(id,oldRemark);
  497. });
  498. }
  499. span.show();
  500. target.hide();
  501. },
  502. addLaborReportRemark(e){
  503. let target = $(e.target);
  504. target.css('width','85px');
  505. let _this = this;
  506. let id = target.attr('data_id');
  507. let remark = target.val();
  508. let ajaxUrl= '{{url("personnel/laborReport/changeLaborReportRemark")}}';
  509. if(remark === ''|| remark === null){
  510. target.css('width','75px');
  511. return;
  512. }else{
  513. axios.post(ajaxUrl,{'id':id,'remark':remark}).then(function (response) {
  514. if(response.data.success){
  515. tempTip.setDuration(2000);
  516. tempTip.showSuccess('备注添加成功');
  517. _this.updateLaborReports(id,remark);
  518. }else{
  519. tempTip.setDuration(3000);
  520. tempTip.show('备注添加失败!'+response.data.fail_info);
  521. }
  522. }).catch(function (err) {
  523. tempTip.setDuration(3000);
  524. tempTip.show('备注添加失败!网络异常:'+response.data.fail_info);
  525. });
  526. target.css('width','75px');
  527. }
  528. },
  529. // 更新表格数据
  530. updateLaborReports(id,newFee){
  531. this.laborReports.some(function(laborReport){
  532. if(laborReport.id === id){
  533. laborReport.remark = newFee;
  534. return true;
  535. }
  536. })
  537. },
  538. selectedColor(id){
  539. if (id==this.selectedStyle){
  540. this.selectedStyle='';
  541. return;
  542. }
  543. this.selectedStyle=id;
  544. },
  545. laborReportExport(checkAllSign){
  546. let url = '{{url('personnel/laborReport/export')}}';
  547. let token='{{ csrf_token() }}';
  548. excelExport(checkAllSign,checkData,url,this.sum,token);
  549. },
  550. //门卫审核
  551. guardClockAudit(id,user_duty_check_id){
  552. let url='{{url("personnel/laborReport/guardClockAudit")}}';
  553. let _this=this;
  554. axios.post(url,{id:id,user_duty_check_id:user_duty_check_id})
  555. .then(function (response) {
  556. if (!response.data.success){
  557. tempTip.setDuration(3000);
  558. tempTip.show(response.data.data);
  559. return;
  560. }
  561. _this.laborReports.every(function (laborReport) {
  562. if (laborReport.id==id){
  563. laborReport.userDutyCheckVerifyUserId=response.data.data;
  564. laborReport.amountOfJoined=1;
  565. tempTip.setDuration(1000);
  566. tempTip.showSuccess('审核通过!');
  567. return false
  568. }
  569. return true;
  570. });
  571. }).catch(function (err) {
  572. tempTip.setDuration(4000);
  573. tempTip.show('审核失败!网络错误:'+err);
  574. });
  575. },
  576. //组长打卡审核(特定组添加备注)
  577. addRemarkAndGroupClock(){
  578. let _this=this;
  579. let id = getSelectId();
  580. let remark=document.getElementById('remark').value;
  581. let url='{{url("personnel/laborReport/addRemarkAndGroupClock")}}';
  582. if (remark==null|| remark=='' || remark=="undefined"){
  583. tempTip.setDuration(3000);
  584. tempTip.show("您还未添加任何备注");
  585. return;
  586. }
  587. axios.post(url,{id:id,remark:remark})
  588. .then(function (response) {
  589. if (!response.data.success){
  590. tempTip.setDuration(3000);
  591. tempTip.show(response.data.data);
  592. return;
  593. }
  594. _this.laborReports.every(function (laborReport) {
  595. if (laborReport.id==id){
  596. laborReport.groupUserId=response.data.data.group_user_id;
  597. laborReport.verifyAt=response.data.data.verify_at;
  598. laborReport.verifyPerson=response.data.data.verifyPerson;
  599. laborReport.remark=response.data.data.remark;
  600. tempTip.setDuration(1000);
  601. tempTip.showSuccess('审核通过!');
  602. return false
  603. }
  604. return true;
  605. });
  606. }).catch(function (err) {
  607. tempTip.setDuration(4000);
  608. tempTip.show('审核失败!网络错误:'+err);
  609. });
  610. },
  611. //组长打卡审核
  612. groupClockAudit(id,userWorkgroupNeedRemark){
  613. let url='{{url("personnel/laborReport/groupClockAudit")}}';
  614. let _this=this;
  615. if (userWorkgroupNeedRemark){
  616. selectId(id);
  617. $('#remarkModal').modal('show');
  618. return;
  619. }
  620. axios.post(url,{id:id})
  621. .then(function (response) {
  622. if (!response.data.success){
  623. tempTip.setDuration(3000);
  624. tempTip.show(response.data.data);
  625. return;
  626. }
  627. _this.laborReports.every(function (laborReport) {
  628. if (laborReport.id==id){
  629. laborReport.groupUserId=response.data.data.group_user_id;
  630. laborReport.verifyAt=response.data.data.verify_at;
  631. laborReport.verifyPerson=response.data.data.verifyPerson;
  632. tempTip.setDuration(1000);
  633. tempTip.showSuccess('审核通过!');
  634. return false
  635. }
  636. return true;
  637. });
  638. }).catch(function (err) {
  639. tempTip.setDuration(4000);
  640. tempTip.show('审核失败!网络错误:'+err);
  641. });
  642. },
  643. //有晚餐
  644. haveDinner(){
  645. $('#exampleModal').modal('show');
  646. },
  647. noDinner(){
  648. let _this=this;
  649. let id = _this.laborReportId;
  650. let url='{{url("personnel/laborReport/groupExport")}}';
  651. axios.post(url,{id:id})
  652. .then(function (response) {
  653. if (!response.data.success){
  654. tempTip.setDuration(3000);
  655. tempTip.show(response.data.data);
  656. return;
  657. }
  658. _this.laborReports.every(function (laborReport) {
  659. if (laborReport.id==id){
  660. laborReport.checkOutAt=response.data.data.check_out_at;
  661. laborReport.workingDuration=response.data.data.working_duration;
  662. laborReport.is_exportGroup=response.data.data.is_exportGroup;
  663. laborReport.onlineDuration=response.data.data.online_duration;
  664. tempTip.setDuration(2000);
  665. tempTip.showSuccess('退组成功!');
  666. return false
  667. }
  668. return true;
  669. });
  670. }).catch(function (err) {
  671. tempTip.setDuration(4000);
  672. tempTip.show('退组失败!网络错误:'+err);
  673. });
  674. },
  675. //退场有晚饭时间
  676. makeSureRelax_time(){
  677. let url='{{url("personnel/laborReport/groupExportEnsure")}}';
  678. let _this=this;
  679. let id = _this.laborReportId;
  680. axios.post(url,{id:id,relax_time:_this.relax_time})
  681. .then(function (response) {
  682. if (!response.data.success){
  683. tempTip.setDuration(3000);
  684. tempTip.show(response.data.data);
  685. return;
  686. }
  687. _this.laborReports.every(function (laborReport) {
  688. if (laborReport.id==id){
  689. laborReport.checkOutAt=response.data.data.check_out_at;
  690. laborReport.workingDuration=response.data.data.working_duration;
  691. laborReport.relax_time=response.data.data.relax_time;
  692. laborReport.is_exportGroup=response.data.data.is_exportGroup;
  693. laborReport.onlineDuration=response.data.data.online_duration;
  694. tempTip.setDuration(2000);
  695. tempTip.showSuccess('退组成功!');
  696. return false
  697. }
  698. return true;
  699. });
  700. }).catch(function (err) {
  701. tempTip.setDuration(4000);
  702. tempTip.show('退组失败!网络错误:'+err);
  703. });
  704. },
  705. //组长点击退组,
  706. groupExport(id,name){
  707. let _this=this;
  708. _this.laborReports.every(function (laborReport) {
  709. if (laborReport.id==id){
  710. _this.dateTime=new Date(new Date(laborReport.created_at).toLocaleDateString());
  711. return false;
  712. }
  713. return true;
  714. });
  715. const dateTime=new Date(_this.dateTime.setDate(_this.dateTime.getDate()+1));
  716. const start = new Date(new Date(new Date().toLocaleDateString()).getTime()+19*60*60*1000);
  717. if(!confirm("确定要临时工“"+name+"“退组吗?")){return}
  718. if (new Date()>=start || new Date()>dateTime){
  719. _this.laborReportId=id;
  720. $('#dinnerModal').modal('show');
  721. return;
  722. }
  723. let url='{{url("personnel/laborReport/groupExport")}}';
  724. axios.post(url,{id:id})
  725. .then(function (response) {
  726. if (!response.data.success){
  727. tempTip.setDuration(3000);
  728. tempTip.show(response.data.data);
  729. return;
  730. }
  731. _this.laborReports.every(function (laborReport) {
  732. if (laborReport.id==id){
  733. laborReport.checkOutAt=response.data.data.check_out_at;
  734. laborReport.workingDuration=response.data.data.working_duration;
  735. laborReport.is_exportGroup=response.data.data.is_exportGroup;
  736. laborReport.onlineDuration=response.data.data.online_duration;
  737. tempTip.setDuration(2000);
  738. tempTip.showSuccess('退组成功!');
  739. return false
  740. }
  741. return true;
  742. });
  743. }).catch(function (err) {
  744. tempTip.setDuration(5000);
  745. tempTip.show('退组失败!网络错误:'+err);
  746. });
  747. },
  748. owner_seek:function (e) {
  749. let _this=this;
  750. let $val=e.target.value;
  751. if($val==='')_this.filterData.user_workgroup_id='';
  752. else
  753. _this.userWorkGroups.forEach(function (userWorkGroup) {
  754. if (userWorkGroup.name.includes($val)){
  755. _this.filterData.user_workgroup_id=userWorkGroup.id;
  756. }
  757. });
  758. },
  759. updateLaborCompany(laborCompanyId,enter_number){
  760. let _this=this;
  761. let url='{{url("personnel/laborReport/updateLaborCompany")}}';
  762. axios.post(url,{enter_number:enter_number,laborCompanyId:laborCompanyId}).then(function (response) {
  763. if (!response.data.success){
  764. tempTip.setDuration(3000);
  765. tempTip.show('修改劳务所失败'+response.data.data);
  766. return;
  767. }else {
  768. _this.laborReports.forEach(function (laborReport) {
  769. if (laborReport.enter_number==response.data.data.enter_number){
  770. laborReport.labor_company_id=response.data.data.labor_company_id;
  771. laborReport.labor_company=response.data.labor_company;
  772. }
  773. })
  774. tempTip.setDuration(3000);
  775. tempTip.showSuccess('修改劳务所成功!');
  776. }
  777. }).catch(function (err) {
  778. tempTip.setDuration(3000);
  779. tempTip.show('修改劳务所失败!网络错误:'+err);
  780. });
  781. },
  782. 删除(id,name){
  783. let _this=this;
  784. if(!confirm('确定要删除临时工为:“'+name+'”的报表记录吗?')){return};
  785. let url='{{url("personnel/laborReport/删除")}}/'+id;
  786. axios.delete(url).then(
  787. function (response) {
  788. if(!response.data.success){
  789. tempTip.setDuration(3000);
  790. tempTip.show('临时工报表记录删除失败!'+response.data.data);
  791. }else {
  792. _this.laborReports.every(function (laborReport,i) {
  793. if (response.data.data>0&&laborReport.id===id){
  794. _this.laborReports.splice(i,1);
  795. return false;
  796. }else {
  797. return true
  798. }
  799. });
  800. tempTip.setDuration(3000);
  801. tempTip.showSuccess('临时工报表记录删除成功!');
  802. }
  803. }
  804. ).catch(function (err) {
  805. tempTip.setDuration(3000);
  806. tempTip.show('删除失败,网络链接错误!'+err);
  807. });
  808. },
  809. },
  810. });
  811. let select_id = 0;
  812. function selectId(id) {
  813. select_id = id;
  814. }
  815. function getSelectId() {
  816. return select_id;
  817. }
  818. </script>
  819. @endsection