ProcessController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Commodity;
  4. use App\Exports\WaybillExport;
  5. use App\Owner;
  6. use App\Process;
  7. use App\ProcessDaily;
  8. use App\User;
  9. use App\UserDutyCheck;
  10. use Carbon\Carbon;
  11. use Illuminate\Database\Eloquent\Builder;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Auth;
  14. use Illuminate\Support\Facades\Gate;
  15. use Maatwebsite\Excel\Facades\Excel;
  16. class ProcessController extends Controller
  17. {
  18. public function conditionQuery(Request $request,$processes){
  19. if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/')); }
  20. $today=Carbon::now()->subDays(15);
  21. if ($request->input('commodity_barcode')){
  22. $barcode=$request->input('commodity_barcode');
  23. $processes=$processes->with('commodity')->whereHas('commodity',function (Builder $query)use($barcode){
  24. $query->where('barcode','like',$barcode.'%');
  25. });
  26. }
  27. if ($request->input('date_start')){
  28. $processes=$processes->where('created_at','>=',$request->input('date_start'));
  29. }
  30. if ($request->input('date_end')){
  31. $processes=$processes->where('created_at','<=',$request->input('date_end'));
  32. }
  33. if ($request->input('owner_id')){
  34. $processes=$processes->where('owner_id',$request->input('owner_id'));
  35. }
  36. if ($request->input('wms_code')){
  37. $processes=$processes->where('wms_code','like','%'.$request->input('wms_code').'%')->where('created_at','>',$today->format('Y-m-d'));
  38. }
  39. $processes=$processes->paginate($request->input('paginate')??50);
  40. return $processes;
  41. }
  42. /**
  43. * Display a listing of the resource.
  44. * @param Request $request
  45. * @return \Illuminate\Http\Response
  46. */
  47. public function index(Request $request)
  48. {
  49. if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/')); }
  50. $processes=Process::with('tutorials')->orderBy('processes.id','DESC');
  51. if ($request->input('checkSign')){
  52. $excel=$this->isExport($request,$processes);
  53. return $excel;
  54. }
  55. $processes=$this->conditionQuery($request,$processes);
  56. $owners=Owner::select('id','name')->get();
  57. return view('process.index',['processes'=>$processes,'owners'=>$owners]);
  58. }
  59. //获取导出数据
  60. public function isExport(Request $request,$processes){
  61. if(!Gate::allows('二次加工管理-查询')){ return redirect(url('/')); }
  62. if ($request->input('checkSign')=="-1"){
  63. $processes=$this->conditionQuery($request,$processes);
  64. $excel=$this->export($processes);
  65. return $excel;
  66. }
  67. $id = explode( ',',$request->input('checkSign'));
  68. $processes=$processes->whereIn('id',$id)->get();
  69. $excel=$this->export($processes);
  70. return $excel;
  71. }
  72. //获取每日参与人
  73. public function getDailyParticipant(Request $request){
  74. if(!Gate::allows('二次加工管理-登记工时')){ return redirect(url('/')); }
  75. $id=$request->input('id');
  76. $processDailies=ProcessDaily::with('processDailyParticipants')->orderBy('time','DESC')
  77. ->where('process_id',$id)->get();
  78. if ($processDailies){
  79. $processDailies=$this->countManHour($processDailies);
  80. }
  81. return $processDailies;
  82. }
  83. //根据参与人查找打卡记录计算工时信息
  84. public function countManHour($processDailies){
  85. $today=Carbon::now()->format('Y-m-d');
  86. $date=date("Y-m-d",strtotime('+'.strval(5)." day",strtotime($today)));
  87. $processDailyOne=$processDailies[count($processDailies)-1];
  88. $startDate=Carbon::parse($processDailyOne->time);
  89. $diffDay=$startDate->diffInDays($today,true);
  90. foreach ($processDailies as $processDaily){
  91. $date=$processDaily->time;
  92. foreach ($processDaily->processDailyParticipants as $processDailyParticipant){
  93. $user=$processDailyParticipant->user_id;
  94. $userDutyCheckStart=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
  95. ->where('checked_at','like',$date.'%')->where('type','登入')->orderBy('id')->first();
  96. $userDutyCheckEnd=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
  97. ->where('checked_at','like',$date.'%')->where('type','登出')->orderBy('id','desc')->first();
  98. //跨日情况寻找下一天
  99. if (!$userDutyCheckEnd){
  100. $date=date("Y-m-d",strtotime("+1 day",strtotime($date)));
  101. $userDutyCheckEnd=UserDutyCheck::select('id','checked_at')->where('user_id',$user)
  102. ->where('checked_at','like',$date.'%')->where('type','登出')->orderBy('id','desc')->first();
  103. }
  104. if (!$userDutyCheckStart || !$userDutyCheckEnd){
  105. continue;
  106. }
  107. $dateStart=Carbon::parse($userDutyCheckStart->checked_at);
  108. $dateEnd=Carbon::parse($userDutyCheckEnd->checked_at);
  109. $hour=($dateEnd->diffInSeconds($dateStart))/3600; //打卡工时
  110. if ($processDailyParticipant->dinner_duration)$hour=$hour-(($processDailyParticipant->dinner_duration)/60); //减晚饭时间
  111. $hour=$this->isHour($userDutyCheckStart,$hour); //去除休息时间
  112. $processDailyParticipant->hour=round($hour,2);
  113. if ($hour&&$processDailyParticipant->hour_count){
  114. $diff=abs(round($processDailyParticipant->hour_count-$hour,2));
  115. $processDailyParticipant->diff=$diff;
  116. }
  117. //计件工
  118. if ($processDailyParticipant->unit_price){
  119. continue;
  120. }
  121. if ($hour&&$hour>8){
  122. $processDailyParticipant->billingHour=8;
  123. continue;
  124. }
  125. if ($hour&&$hour<=8){
  126. $processDailyParticipant->billingHour=round($hour,2);
  127. }
  128. }
  129. }
  130. return $processDailies;
  131. }
  132. //打卡工时减休息时间
  133. public function isHour($userDutyCheckStart,$hour){
  134. $date=$userDutyCheckStart->checked_at;
  135. $date=Carbon::parse($date)->format('H');
  136. if ((int)$date<=11){
  137. $hour=$hour-1;
  138. }
  139. return $hour;
  140. }
  141. //驳回二次加工单
  142. public function reject($id){
  143. if(!Gate::allows('二次加工管理-接单与驳回')){ return redirect(url('/')); }
  144. $process=Process::select('id','status')->find($id);
  145. $process->status="驳回";
  146. $process->update();
  147. $this->log(__METHOD__,"驳回二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
  148. return $process;
  149. }
  150. //接单
  151. public function receive($id){
  152. if(!Gate::allows('二次加工管理-接单与驳回')){ return redirect(url('/')); }
  153. $process=Process::select('id','status')->find($id);
  154. $process->status="接单";
  155. $process->update();
  156. $this->log(__METHOD__,"接单二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
  157. return $process;
  158. }
  159. //完成
  160. public function accomplish($id){
  161. if(!Gate::allows('二次加工管理-验收完成')){ return redirect(url('/')); }
  162. $process=Process::select('id','status')->find($id);
  163. $process->status="已完成";
  164. $process->update();
  165. $this->log(__METHOD__,"完成二次加工单_".__FUNCTION__,json_encode($process),Auth::user()['id']);
  166. return $process;
  167. }
  168. /**
  169. * Show the form for creating a new resource.
  170. *
  171. * @return \Illuminate\Http\Response
  172. */
  173. public function create()
  174. {
  175. //
  176. }
  177. /**
  178. * Store a newly created resource in storage.
  179. *
  180. * @param \Illuminate\Http\Request $request
  181. * @return \Illuminate\Http\Response
  182. */
  183. public function store(Request $request)
  184. {
  185. //
  186. }
  187. /**
  188. * Display the specified resource.
  189. *
  190. * @param int $id
  191. * @return \Illuminate\Http\Response
  192. */
  193. public function show($id)
  194. {
  195. //
  196. }
  197. /**
  198. * Show the form for editing the specified resource.
  199. *
  200. * @param int $id
  201. * @return \Illuminate\Http\Response
  202. */
  203. public function edit($id)
  204. {
  205. //
  206. }
  207. /**
  208. * Update the specified resource in storage.
  209. *
  210. * @param \Illuminate\Http\Request $request
  211. * @param int $id
  212. * @return \Illuminate\Http\Response
  213. */
  214. public function update(Request $request, $id)
  215. {
  216. //
  217. }
  218. /**
  219. * Remove the specified resource from storage.
  220. *
  221. * @param int $id
  222. * @return \Illuminate\Http\Response
  223. */
  224. public function destroy($id)
  225. {
  226. //
  227. }
  228. //执行
  229. public function export($processes){
  230. if(!Gate::allows('二次加工管理-查询')){ return '没有权限'; }
  231. $row=[[
  232. 'id'=>'ID',
  233. 'code'=>'任务号',
  234. 'owner_name'=>'货主',
  235. 'bill_type'=>'单据类型',
  236. 'wms_code'=>'单据号',
  237. 'process_method_name'=>'加工类型',
  238. 'amount'=>'预期数量',
  239. 'unit_price'=>'单价',
  240. 'created_at'=>'提交日期',
  241. 'commodity_barcode'=>'商品编码',
  242. 'commodity_name'=>'商品名称',
  243. 'completed_amount'=>'实际数量',
  244. 'status'=>'状态',
  245. ]];
  246. $list=[];
  247. $i=0;
  248. foreach ($processes as $process){
  249. $w=[
  250. 'id'=>$process->id,
  251. 'code'=>$process->code ,
  252. 'owner_name'=>$process->owner_name ,
  253. 'bill_type'=>$process->bill_type ,
  254. 'wms_code'=>$process->wms_code ,
  255. 'process_method_name'=>$process->process_method_name,
  256. 'amount'=>$process->amount,
  257. 'unit_price'=>$process->unit_price,
  258. 'created_at'=>$process->created_at ,
  259. 'commodity_barcode'=>$process->commodity_barcode,
  260. 'commodity_name'=>$process->commodity_name ,
  261. 'completed_amount'=>$process->completed_amount,
  262. 'status'=>$process->status,
  263. ];
  264. $list[$i]=$w;
  265. $i++;
  266. }
  267. return Excel::download(new WaybillExport($row,$list),date('YmdHis', time()).'-二次加工单.xls');
  268. }
  269. }