index.blade.php 57 KB

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