TicketController.php 4.2 KB
<?php

namespace App\Http\Controllers\Api\WorkOrder;

use App\Http\Controllers\Api\BaseController;
use App\Http\Requests\Api\WorkOrder\TicketStoreRequest;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TicketController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index($project_id, Request $request)
    {
        $project = TicketProject::where('uuid', $project_id)->first();
        if (!$project) return $this->error('未找到项目', 404);
        $page = (int)$request->input('page', 1);
        $size = (int)$request->input('size', 10);

        $tickets = Tickets::with([
            'project:*',
            'logs.engineer:id,name',
        ])
            ->where('project_id', $project->id)
//            ->where('submit_side', 2)
            ->orderBy('id', 'desc')
            ->paginate($size, ['*'], 'page', $page);
        return response()->json(['data' => $tickets]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     * B端用户在企微群里提交工单
     */
    public function store($project_id, TicketStoreRequest $request)
    {
        $request->validated();
        $project = TicketProject::where('uuid', $project_id)->first();
        if (!$project) return response('未找到项目', 404);
        if ($project->is_del) return response('项目状态异常', 400);
        if (empty($project->first_engineer)) return response('项目未分配工单负责人', 400);

        $result = DB::transaction(function () use ($request, $project) {
            $ticket = new Tickets();
            $ticket->project_id = $project->id;
            $ticket->title = $request->input('title');
            $ticket->content = $request->input('content');
            // $files = [NULL]
            $files = $request->input('files');
            if (empty($files) || (is_array($files) && count(array_filter($files, function($v){ return !is_null($v); })) === 0)) {
                $ticket->files = null;
            } else {
                $ticket->files = json_encode($files);
            }
            $ticket->submit_side = 2; // 2 for B-side submission
            $ticket->submit_username = $request->input('submit_username');
            $ticket->save();
            $log = new TicketLog();
            $log->engineer_id = $project->engineer_id; // 默认第一负责人
            $ticket->logs()->save($log);
            return $ticket;
        });
        return response()->json(['data' => $result]);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($project_id, $id)
    {
        $ticket = Tickets::with([
            'logs.engineer:id,name',
            'project.projectV6:id,company',
        ])
        ->find($id);

        if (!$ticket) return response('工单未找到', 404);

        if ($ticket->project->uuid !== $project_id) return response('无权限查看该工单', 403);

        if ($ticket->project->is_del) return response('项目状态异常', 400);

        return response()->json(['data' => $ticket]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

    public function projectInfo($project_id)
    {
        $project = TicketProject::with([
            'projectV6:id,company',
            'assm:id,name',
            'seom:id,name',
            'first_engineer:id,name',
        ])
            ->where('uuid', $project_id)->first();
        if (!$project) return $this->response('未找到项目', 404);
        return response()->json(['data' => $project]);
    }
}