WorkOrderController.php 5.2 KB
<?php

namespace App\Http\Controllers\Bside\WorkOrder;

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

class WorkOrderController extends BaseController
{
    /**
     * B端售后工单列表
     *
     * @return \Illuminate\Http\Response
     */
    public function index(WorkOrderListRequest $request)
    {
        $request->validated();
        $where = [
            'project_id' => $this->user['project_id'],
        ];
        // 分页查询
        $lists = WorkOrder::with([
                'manager:id,name',
            ])
            ->where($where)
            ->when($request->input('status'), 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);
    }

    /**
     * B端用户提交工单
     *
     * @return \Illuminate\Http\Response
     */
    public function store(WorkOrderCreateRequest $request)
    {
        $request->validated();
        $result = DB::transaction(function () use ($request) {
            $workOrder = new WorkOrder;
            $workOrder->product = $request->input('product');
            $workOrder->content = $request->input('content');
            $workOrder->files = json_encode($request->input('files'));
            $workOrder->project_user_id = $this->user['id'];
            $workOrder->project_id = $this->user['project_id'];
            $workOrder->engineer_id = 0;
            if ($this->project['type'] == 3){
                // 项目类型是优化推广,项目负责人找优化
                $seo = Project::find($this->user['project_id'])->deploy_optimize;
                $workOrder->manage_id = $seo->manager_mid ?? $seo->optimist_mid ?? 0;
            }else{
                // 非优化推广项目,项目负责人找技术组长
                $build = Project::find($this->user['project_id'])->deploy_build;
                $workOrder->manage_id = $build->leader_mid ?? 0;
            }
            $workOrder->save();
            // 添加工单日志
            $log = new WorkOrderLog();
            $log->manage_id = $workOrder->manage_id;
            $workOrder->logs()->save($log);
            return $workOrder;
        });
        $this->response('success', Code::SUCCESS, $result->toArray());
    }

    /**
     * Display the specified resource.
     *
     * @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',
        ])->find($id);
        if (!$workOrder) {
            $this->response('工单未找到', 404);
        }
        if ($workOrder->project_id != $this->user['project_id'] && $workOrder->engineer_id != $this->user['id']) {
            $this->response('无权限查看该工单', 403);
        }
        $this->response('success', Code::SUCCESS, $workOrder->toArray());
    }

    /**
     * B端用户修改工单,只能是修改工单状态
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(WorkOrderUpdateRequest $request, $id)
    {
        $request->validated();
        $workOrder = WorkOrder::find($id);
        if (!$workOrder) {
            $this->response('工单未找到', 404);
        }
        // b端只有自己项目下的账号可以更新工单
        if ($workOrder->project_id != $this->user['project_id']) {
            $this->response('无权限更新该工单', 403);
        }
        // 更新工单状态
        $workOrder->status = WorkOrder::STATUS_COMPLETED;
        $workOrder->save();
        // B端完成工单,将所有子任务标记为完成
        $workOrder->logs()->update(['status' => WorkOrderLog::STATUS_COMPLETED]);
        $this->response('success', Code::SUCCESS);
    }

    public function destroy($id)
    {
        $workOrder = WorkOrder::find($id);
        if (!$workOrder) {
            $this->response('工单未找到', 404);
        }
        if ($workOrder->status >= WorkOrder::STATUS_COMPLETED)
            $this->response('已完结的工单不能删除', 403);

        if ($this->user['type'] != 1 && $workOrder->project_user_id != $this->user['id']) {
            // 只有项目负责人可以删除工单
            $this->response('无权限删除该工单', 403);
        }
        # 删除工单
        $workOrder->delete();
        $this->response('工单已删除', Code::SUCCESS);

    }

}