TicketController.php 6.9 KB
<?php

namespace App\Http\Controllers\Api\WorkOrder;

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

class TicketController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(TicketListRequest $request, $project_id)
    {
        $validated = $request->validated();
        $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)
            ->when($request->input('status') !== null, function ($query) use ($request) {
                // status 查 gl_tickets.status
                $status = $request->input('status');
                return $query->where('status', $status);
            })
            ->when($request->input('search'), function ($query) use ($request) {
                // search 查 gl_tickets.title 或 gl_ticket_projects.title 或 gl_ticket_projects.company_name
                $search = $request->input('search');
                return $query->where(function ($q) use ($search) {
                    $q->where('title', 'like', '%' . $search . '%')
                        ->orWhereHas('project', function ($q1) use ($search) {
                            $q1->where('title', 'like', '%' . $search . '%')
                                ->orWhere('company_name', 'like', '%' . $search . '%');
                        });
                });
            })
            ->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);
            $project->pushWechatGroupMsg("客户新增了工单(ID:{$ticket->id}),请及时处理!");
            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]);
    }

    /**
     * @param $friend_id
     * @return void
     * 企微群里@小超或艾丝,触发推送工单
     * 接收群ID
     */
    public function pushTicketByBot($friend_id)
    {
        $project = TicketProject::where('wechat_group_id', $friend_id)->where('is_del', 0)->first();
        if (!$project)
            return response()->json(['message' => '未找到对应的工单项目'], 404);

//        $url = in_array($project->project_cate, [3,4]) ? 'https://hub.ai.cc/api/fob_ai_customer_service/push_message' : 'https://hub.ai.cc/api/globalso_ai_customer_service/send_msg';
//        $response = Http::post($url, [
//            'type' => 'Link',
//            'friend_id' => $friend_id,
//            'content' => json_encode([
//                'title' => 'AI协同工单 - ' . $project->company_name,
//                'desc' => "您好,我们同事没有及时回复,你可以查看工单进度!",
//                'size' => 0,
//                'thumbSize' => 0,
//                'thumbUrl' => 'https://hub.globalso.com/logocm.png',
//                'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid
//            ], JSON_UNESCAPED_UNICODE)
//        ]);
//        // 返回 $response 的相应内容以及网络状态码
//        return response($response->body(), $response->status());

        $project->pushWechatGroupMsg("您好,我们同事没有及时回复,你可以查看工单进度!");
        return response()->json(['message' => '工单推送成功']);
    }
}