WorkOrderController.php 6.5 KB
<?php

namespace App\Http\Controllers\Aside\WorkOrder;

use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Requests\Aside\WorkOrder\WorkOrderListRequest;
use App\Http\Requests\Aside\WorkOrder\WorkOrderUpdateRequest;
use App\Models\WorkOrder\WorkOrder;
use App\Models\WorkOrder\WorkOrderLog;
use Illuminate\Support\Facades\DB;

class WorkOrderController extends BaseController
{
    /**
     * A端工单列表
     * 显示有我参与的工单列表
     */
    public function index(WorkOrderListRequest $request)
    {
        /*
         * A端工程师工单列表, 查询我的工单
         */
        $request->validated();
        # manage_id 或 engineer_id 是我
        $lists = WorkOrderLog::with([
            'workOrder.logs.manager:id,name',
            'workOrder.project:id,company',
        ])
            ->where('manage_id', $this->manage['id'])
            ->when($request->input('project_id') !== null, function ($query) use ($request) {
                // project_id 查 workOrder
                return $query->whereHas('workOrder', function ($q) use ($request) {
                    $q->where('project_id', $request->input('project_id'));
                });
            })
            ->when($request->input('status') !== null, function ($query) use ($request) {
                // status 查 WorkOrderLog
                return $query->where('status', $request->input('status'));
            })
            ->when($request->input('search'), function ($query) use ($request) {
                // search 查 workOrder
                return $query->whereHas('workOrder', function ($q) use ($request) {
                    $q->where('product', 'like', '%' . $request->input('search') . '%')
                        ->orWhere('content', 'like', '%' . $request->input('search') . '%');
                });
            })
            ->orderBy('id', 'desc')
            ->paginate($this->row, ['*'], 'page', $this->page);
        $this->response('success', Code::SUCCESS, $lists);
    }


    /**
     * @param WorkOrderListRequest $request
     * @return void
     * A端管理员的工单列表
     */
    public function manager(WorkOrderListRequest $request)
    {
        $request->validated();
        // 管理员查看所有工单
        $lists = WorkOrder::with([
            'user:id,name',
            'manager:id,name',
            'engineer:id,name',
            'logs.manager:id,name',
            'project:id,company',
        ])
            ->when($request->input('project_id') !== null, function ($query) use ($request) {
                return $query->where('project_id', $request->input('project_id'));
            })
            ->when($request->input('status') !== null, function ($query) use ($request) {
                return $query->where('status', $request->input('status'));
            })
            ->when($request->input('search'), function ($query) use ($request) {
                return $query->where('product', 'like', '%' . $request->input('search') . '%')
                    ->orWhere('content', 'like', '%' . $request->input('search') . '%');
            })
            ->orderBy('id', 'desc')
            ->paginate($this->row, ['*'], 'page', $this->page);
        $this->response('success', Code::SUCCESS, $lists);
    }

    /**
     * A端工单详情
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $workOrder = WorkOrder::with([
            'logs.manager:id,name',
            'user:id,name',
            'manager:id,name',
            'engineer:id,name',
            'project:id,company',
        ])->find($id);

        if (!$workOrder)
            $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);

        // TODO 判断是否有查看工单详情权限,待添加
        $this->response('success', Code::SUCCESS, $workOrder->toArray());
    }

    /**
     * A端操作工单,工程师操作的是工单日志
     * - 工程师:回复工单,自动��拆分给自己的子任务改为完成
     * - 工单第一对接人:
     *   - 邀请工程师处理工单
     *   - 修改工单状态
     * 若全部子任务完成,则将工单状态改为完成
     */
    public function update(WorkOrderUpdateRequest $request, $id)
    {
        $request->validated();
        $log = WorkOrderLog::find($id);  // 拆分的子工单
        if (!$log) {
            $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
        }
        if ($log->manage_id != $this->manage['id']) {
            // 只能操作自己的工单
            $this->response('没有权限操作该工单', Code::USER_PERMISSION_ERROE);
        }
        $workOrder = $log->workOrder;
        $result = DB::transaction(function () use ($request, $workOrder, $log) {
            if ($request->input('engineer_ids'))
            {
                // 有邀请工程师协同处理
                foreach ($request->input('engineer_ids') as $engineer_id)
                {
                    try {
                        // 利用唯一索引去重
                        $new_log = new WorkOrderLog();
                        $new_log->manage_id = $engineer_id;
                        $workOrder->logs()->save($new_log);
                        $workOrder->engineer_id = $engineer_id;
                        $workOrder->save();
                    }catch (\Exception $exception){}
                }
            }
            if ($request->input('content'))
                $log->content = $request->input('content');
            if ($request->input('files'))
                $log->files = $request->input('files');
            if ($request->input('status') !== null)
            {
                $log->status = $request->input('status');
                if ($log->status == WorkOrder::STATUS_COMPLETED)
                {
                    // 我的工单标记为已完成
                    $log->status = WorkOrderLog::STATUS_COMPLETED;
                    $log->end_at = now();
                }
            }
            $log->save();
            // 是否有未完成的子任务
            $pending = $workOrder->logs()
                ->where('status', '<', WorkOrderLog::STATUS_COMPLETED)
                ->count();
            $workOrder->status = $pending == 0 ? WorkOrderLog::STATUS_COMPLETED : WorkOrderLog::STATUS_PROCESSING;
            $workOrder->save();
            return $log;
        });
        $this->response('success', Code::SUCCESS, $result->toArray());
    }

}