123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- <?php
- namespace App\Http\Controllers\App;
- use App\Filters\WorkOrderFilter;
- use App\Http\Resources\App\WorkOrderResource;
- use App\Jobs\VerifyChargeWorkOrderJob;
- use App\Jobs\VerifyWatchWorkOrderJob;
- use App\Models\AdminUser;
- use App\Models\LocationsLog;
- use App\Models\WorkOrder;
- use App\Utils\Admin;
- use App\Utils\GaodeMaps;
- use App\Utils\RedisKeys;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Facades\Redis;
- class WorkOrderController extends AppBaseController
- {
- /**
- * workOrderList 工单列表
- *
- * @param WorkOrderFilter $workOrderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function workOrderList(WorkOrderFilter $workOrderFilter)
- {
- $area_ids = self::$areaIds;
- $workOrderList = WorkOrder::query()
- ->whereIn('area_id', $area_ids)
- ->filter($workOrderFilter)
- ->orderBy('planned')
- ->orderByDesc('id')
- ->paginate();
- return $this->ok(WorkOrderResource::collection($workOrderList));
- }
- /**
- * myWorkOrder 我的工单列表
- *
- * @param WorkOrderFilter $workOrderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function myWorkOrder(WorkOrderFilter $workOrderFilter)
- {
- $admin_id = Admin::user()->id;
- $area_ids = self::$areaIds;
- $workOrderList = WorkOrder::query()
- ->whereIn('area_id', $area_ids)
- ->filter($workOrderFilter)
- ->where('worker_id', $admin_id)
- ->orderByDesc('id')
- ->paginate();
- return $this->ok(WorkOrderResource::collection($workOrderList));
- }
- /**
- * workOrderDetail 工单详情
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function workOrderDetail(Request $request)
- {
- $work_order_id = $request->get('work_order_id') ?? '';
- if (empty($work_order_id)) return $this->error('参数错误');
- $worker_order = WorkOrder::query()->find($work_order_id);
- if (empty($worker_order)) return $this->error('找不到该工单信息,请联系管理员');
- // 创建者
- $created_at = $worker_order->created_at;
- $created_man = WorkOrder::$sourceMaps[$worker_order->source];
- // 进度
- $planneds = WorkOrder::$plannedMaps[$worker_order->planned];
- $planned = $worker_order->planned;
- // 接单着
- $received_name = $worker_order->worker->name ?? '';
- $received_at = $worker_order->fix_start_time ?? '';
- $position = LocationsLog::getNewestLocationByBikeNo($worker_order->bike_no);
- $reason = $worker_order->reason ?? '';
- $type = $worker_order->type;
- // if($type === WorkOrder::TYPE_TROUBLE){
- $str = '';
- if (is_serialized($reason)) {
- $reasonArr = unserialize($reason);
- foreach ($reasonArr as $k => $v) {
- if ($v == 1) {
- $str .= WorkOrder::$warningMaps[$k] . "、";
- }
- }
- $str = rtrim($str, '、');
- $reason = $str;
- }
- // }
- $data = [
- 'reason' => empty($reason) ? $worker_order->type_name : $reason,
- 'planned' => $planned,
- 'planneds' => $planneds,
- 'bike_no' => $worker_order->bike_no,
- 'location' => GaodeMaps::getAddress([$position['lng'], $position['lat']]),
- 'created_at' => Carbon::parse($created_at)->format('Y-m-d H:i:s'),
- 'created_man' => $created_man
- ];
- switch ($planned) {
- case WorkOrder::PLANNED_STATUS_MEET:
- $data += [
- 'received_name' => '',
- 'received_at' => '',
- 'work_over_time' => '',
- 'work_over_name' => '',
- ];
- break;
- case WorkOrder::PLANNED_STATUS_WORK:
- $data += [
- 'received_name' => $received_name,
- 'received_at' => Carbon::parse($received_at)->format('Y-m-d H:i:s'),
- 'work_over_time' => '',
- 'work_over_name' => '',
- ];
- break;
- case WorkOrder::PLANNED_STATUS_WORKED:
- $data += [
- 'received_name' => $received_name,
- 'received_at' => Carbon::parse($received_at)->format('Y-m-d H:i:s'),
- 'work_over_time' => Carbon::parse($worker_order->fix_end_time)->format('Y-m-d H:i:s'),
- 'work_over_name' => $worker_order->workerOver->name ?? '系统',
- ];
- break;
- case WorkOrder::PLANNED_STATUS_OVER:
- $data += [
- 'received_name' => $received_name,
- 'received_at' => Carbon::parse($received_at)->format('Y-m-d H:i:s'),
- 'work_over_time' => Carbon::parse($worker_order->fix_end_time)->format('Y-m-d H:i:s'),
- 'work_over_name' => $worker_order->workerOver->name ?? '系统',
- ];
- break;
- default :
- $data += [
- 'received_name' => '',
- 'received_at' => '',
- 'work_over_time' => '',
- 'work_over_name' => '',
- ];
- }
- return $this->ok($data);
- }
- /**
- * workOrderStatistics 工单统计
- *
- * @param WorkOrderFilter $filter
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function workOrderStatistics(WorkOrderFilter $filter)
- {
- $area_ids = self::$areaIds;
- $type_num = WorkOrder::query()
- ->whereIn('area_id', $area_ids)
- ->where('status', WorkOrder::STATUS_NO)
- ->filter($filter)
- ->groupBy(['type'])
- ->select('type', DB::raw('COUNT(id) as type_num'))
- ->get()
- ->toArray();
- $data = [
- 'charge_num' => 0,
- 'watch_num' => 0,
- 'power_failure_num' => 0,
- 'alert_num' => 0,
- 'steal_num' => 0,
- 'headman_num' => 0,
- 'trouble_num' => 0,
- 'help_num' => 0,
- 'other_num' => 0,
- 'offline_num' => 0,
- 'planned_meet_num' => 0, // 未认领
- 'planned_work_num' => 0, // 处理中
- 'planned_worked_num' => 0, // 已处理
- 'planned_over_num' => 0,// 完结
- ];
- foreach ($type_num as $v) {
- switch ($v['type']) {
- case WorkOrder::TYPE_CHARGE:
- $data['charge_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_WATCH:
- $data['watch_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_POWER_FAILURE:
- $data['power_failure_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_ALERT:
- $data['alert_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_STEAL:
- $data['steal_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_HEADMAN:
- $data['headman_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_TROUBLE:
- $data['trouble_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_HELP:
- $data['help_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_OFFLINE:
- $data['offline_num'] = $v['type_num'];
- break;
- case WorkOrder::TYPE_OTHER:
- $data['other_num'] = $v['type_num'];
- break;
- default;
- }
- }
- $planned_num = WorkOrder::query()
- ->filter($filter)
- ->groupBy('planned')
- ->select('planned', DB::raw('COUNT(id) as planned_num'))
- ->get()
- ->toArray();
- foreach ($planned_num as $v) {
- switch ($v['planned']) {
- case WorkOrder::PLANNED_STATUS_MEET:
- $data['planned_meet_num'] = $v['planned_num'];
- break;
- case WorkOrder::PLANNED_STATUS_WORK:
- $data['planned_work_num'] = $v['planned_num'];
- break;
- case WorkOrder::PLANNED_STATUS_WORKED:
- $data['planned_worked_num'] = $v['planned_num'];
- break;
- case WorkOrder::PLANNED_STATUS_OVER:
- $data['planned_over_num'] = $v['planned_num'];
- break;
- default;
- }
- }
- return $this->ok($data);
- }
- /**
- * workOrderType 筛选项工单类型
- *
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function workOrderType()
- {
- $types = WorkOrder::$typeMaps;
- $data = [];
- foreach ($types as $k => $v) {
- $dataItem['key'] = $k;
- $dataItem['value'] = $v;
- $data[] = $dataItem;
- }
- return $this->ok($types);
- }
- /**
- * receiveWorkOrder 接单
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function receiveWorkOrder(Request $request)
- {
- $work_order_id = $request->get('work_order_id') ?? '';
- if (empty($work_order_id)) return $this->error('参数错误');
- $worker_order = WorkOrder::query()->find($work_order_id);
- if (empty($worker_order)) return $this->error('找不到该工单信息,请联系管理员');
- // 加锁防止重复
- $lock = $this->makeReceiveWorkLock($work_order_id);
- if (!$lock) return $this->error('该工单已被认领');
- if ($worker_order->planned > WorkOrder::PLANNED_STATUS_MEET) return $this->error('该工单已被认领');
- $worker_id = Admin::user()->id;
- $worker_order->planned = WorkOrder::PLANNED_STATUS_WORK;
- $worker_order->fix_start_time = Carbon::now();
- $worker_order->worker_id = $worker_id;
- $bool = $worker_order->save();
- if ($bool) {
- return $this->ok('接单成功');
- } else {
- return $this->error('出现错误,请联系管理员');
- }
- }
- /**
- * makeReceiveWorkLock 接单锁 防止重复接单
- *
- * @param $work_order_id
- * @return bool
- * @author Fx
- *
- */
- public function makeReceiveWorkLock($work_order_id)
- {
- $key = sprintf(RedisKeys::LOCK_RECEIVE_WORK, $work_order_id);
- $res = app()->redis->incr($key);
- app()->redis->Expire($key, RedisKeys::LOCK_EXPIRE_RECEIVE_WORK);
- return $res > 1 ? false : true;
- }
- /**
- * updateWorkOrderStatus 更新工单状态已处理
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function updateWorkOrderStatus(Request $request)
- {
- $work_order_id = $request->get('work_order_id') ?? '';
- if (empty($work_order_id)) return $this->error('参数错误');
- //验证工单存在
- $work_order = WorkOrder::query()->find($work_order_id);
- if (empty($work_order)) return $this->error('找不到该工单信息,请联系管理员');
- $work_order_type = $work_order->type;
- $worker_id = $work_order->worker_id;
- // 验证是否有权限操作此工单
- $worker_type = Admin::user()->type;
- $admin_id = Admin::user()->id;
- if ($worker_type != AdminUser::TYPE_ADMIN) {
- if ($admin_id != $worker_id) {
- return $this->error('无权限操作此工单');
- }
- }
- if ($work_order->planned == WorkOrder::PLANNED_STATUS_MEET) return $this->error('该工单暂未认领');
- if ($work_order->planned == WorkOrder::PLANNED_STATUS_WORKED) return $this->error('该工单为已处理状态不可重复提交');
- if ($work_order->planned == WorkOrder::PLANNED_STATUS_OVER) return $this->error('该工单为已完成状态不可重复提交');
- // 判断工单类型 进行验证是否真正完成
- switch ($work_order_type) {
- case WorkOrder::TYPE_WATCH: // 查看类型工单
- $res = $this->updateWorkOrder($work_order);
- if ($res) {
- // 延时队列 验证是否完成工单
- VerifyWatchWorkOrderJob::dispatch($work_order->work_no)->delay(Carbon::now()->addMinutes(config('queue.delay.verifyWatchWorkOrder')));
- return $this->ok('操作成功');
- } else {
- return $this->error('更新失败,请重新尝试');
- }
- break;
- case WorkOrder::TYPE_CHARGE: // 充电类型工单
- $res = $this->updateWorkOrder($work_order);
- if ($res) {
- // 延时队列 验证是否完成工单
- VerifyChargeWorkOrderJob::dispatch($work_order->work_no)->delay(Carbon::now()->addMinutes(config('queue.delay.verifyChargeWorkOrder')));
- return $this->ok('操作成功');
- } else {
- return $this->error('更新失败,请重新尝试');
- }
- break;
- // case WorkOrder::TYPE_TROUBLE: // 故障工单
- // // 需要修改车辆故障表 以及更新车辆状态
- // break;
- default: // 其他工单了类型暂时不验证 直接赋值成功
- $res = $this->updateWorkOrderOver($work_order);
- if ($res) {
- return $this->ok('操作成功');
- } else {
- return $this->error('更新失败,请重新尝试');
- }
- }
- }
- /**
- * updateWorkOrder 更新工单状态为已处理
- *
- * @param $work_order
- * @return mixed
- * @author Fx
- *
- */
- private function updateWorkOrder($work_order)
- {
- $work_order->planned = WorkOrder::PLANNED_STATUS_WORKED;
- $work_order->work_over_id = Admin::user()->id;
- $bool = $work_order->save();
- return $bool;
- }
- /**
- * updateWorkOrderOver 更新工单状态为已完成
- *
- * @param $work_order
- * @return mixed
- * @author Fx
- *
- */
- private function updateWorkOrderOver($work_order)
- {
- $work_order->planned = WorkOrder::PLANNED_STATUS_OVER;
- $work_order->status = WorkOrder::STATUS_OK;
- $work_order->work_over_id = Admin::user()->id;
- $work_order->fix_end_time = Carbon::now();
- $bool = $work_order->save();
- return $bool;
- }
- /**
- * upgradeGroupWorkOrder 升级为组长工单
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author Fx
- *
- */
- public function upgradeGroupWorkOrder(Request $request)
- {
- $work_order_id = $request->get('work_order_id') ?? '';
- $remark = $request->get('remark') ?? '';
- if (empty($work_order_id) || empty($remark)) return $this->error('参数错误');
- //验证工单存在
- $work_order = WorkOrder::query()->find($work_order_id);
- if (empty($work_order)) return $this->error('找不到该工单信息,请联系管理员');
- $admin_id = Admin::user()->id;
- $worker_id = $work_order->worker_id;
- if ($work_order->planned == WorkOrder::PLANNED_STATUS_MEET) return $this->error('该工单暂未认领不能升级');
- if ($admin_id != $worker_id) {
- return $this->error('无权限操作此工单');
- }
- try {
- $work_order->type = WorkOrder::TYPE_HEADMAN;
- $work_order->type_name = WorkOrder::$typeMaps[WorkOrder::TYPE_HEADMAN];
- $work_order->remark = $remark; // 备注信息
- $work_order->save();
- return $this->ok('更改成功');
- } catch (\Exception $exception) {
- Log::error($exception->getMessage());
- return $this->error('更改失败,请联系管理员');
- }
- }
- }
|