AsideTicketController.php 10.1 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\AsideTicketStoreRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest;
use App\Models\Workchat\MessagePush;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Illuminate\Support\Facades\DB;


class AsideTicketController extends BaseController
{
    /**
     * A端查看所有工单
     *
     * @return \Illuminate\Http\Response
     */
    public function index(AsideTicketListRequest $request)
    {
        $validated = $request->validated();
        $lists = Tickets::with([
            'logs.engineer:id,name',
            'project',
        ])
            ->when(!empty($validated['engineer_id']), function ($query) use ($validated) {
                // 查 gl_tickets 表 submit_user_id 或 gl_ticket_logs 表 engineer_id
                $engineerId = $validated['engineer_id'];
                return $query->where(function ($q) use ($engineerId) {
                    $q->where('submit_user_id', $engineerId)
                        ->orWhereHas('logs', function ($q1) use ($engineerId) {
                            $q1->where('engineer_id', $engineerId);
                        });
                });
            })
            ->when($request->input('project_id') !== null, function ($query) use ($request) {
                // project_id 查 gl_ticket_projects.uuid
                $projectId = $request->input('project_id');
                return $query->whereHas('project', function ($q) use ($projectId) {
                    $q->where('uuid', $projectId);
                });
            })
            ->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($this->row, ['*'], 'page', $this->page);
        $this->response('success', Code::SUCCESS, $lists);
    }

    /**
     * @param $search
     * @return void
     * V5V6所有项目
     */
    public function getProjects($search)
    {
        $projects = TicketProject::where('is_del', 0)
            ->where(function ($query) use ($search) {
                // 查找项目名称或公司名称
                $query->where('title', 'like', '%' . $search . '%')
                    ->orWhere('company_name', 'like', '%' . $search . '%');
            })
            ->get();
        $this->response('success', Code::SUCCESS, $projects);
    }

    /**
     * @param TicketProjectListRequest $request
     * @return void
     * A端V5V6项目列表
     */
    public function projectList(TicketProjectListRequest $request)
    {
        $validated = $request->validated();
        $lists = TicketProject::where('is_del', 0)
            ->when(!empty($validated['search']), function ($query) use ($validated) {
                // 查找项目名称或公司名称
                $search = $validated['search'];
                return $query->where(function ($q) use ($search) {
                    $q->where('title', 'like', '%' . $search . '%')
                        ->orWhere('company_name', 'like', '%' . $search . '%');
                });
            })
            ->when(!empty($validated['version']), function ($query) use ($validated) {
                // 版本号筛选
                $version = $validated['version'];
                return $query->where('version', $version);
            })
            ->when(!empty($validated['project_cate']), function ($query) use ($validated) {
                // 版本号筛选
                $project_cate = $validated['project_cate'];
                return $query->where('project_cate', $project_cate);
            })
            ->paginate($this->row, ['*'], 'page', $this->page);
        $this->response('success', Code::SUCCESS, $lists);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(AsideTicketStoreRequest $request)
    {
        $request->validated();
        $project = TicketProject::where('uuid', $request->input('project_id'))->first();
        if ($project->is_del) $this->response('该项目状态异常', Code::USER_MODEL_NOTFOUND_ERROE);
        $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 = 1; // 1 for A-side submission
            $ticket->submit_user_id = $this->manage['id'];
            $ticket->submit_username = $this->manage['name'];
            $ticket->save();
            // A 端提工单,都是针对客户提的需求等开发任务;比如翻译,修改页面等。。。
            foreach ($request->input('engineer_ids', []) as $engineer_id) {
                $log = new TicketLog();
                $log->engineer_id = $engineer_id;
                $ticket->logs()->save($log);
            }
            return $ticket;
        });
        $this->response('success', Code::SUCCESS, $result->toArray());
    }

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

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

        $this->response('success', Code::SUCCESS, $ticket->toArray());
    }

    /**
     * A端负责人修改工单
     * 1. 邀请同事
     * 2. 修改工单状态
     */
    public function update(AsideTicketUpdateRequest $request, $id)
    {
        $request->validated();
        $ticket = Tickets::find($id);
        if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);

        // 开始修改
        $result = DB::transaction(function () use ($request, $ticket) {
            if ($request->input('engineer_ids'))
            {
                // 有邀请工程师协同处理
                foreach ($request->input('engineer_ids') as $engineer_id)
                {
                    try {
                        // 利用唯一索引去重
                        $new_log = new TicketLog();
                        $new_log->engineer_id = $engineer_id;
                        $ticket->logs()->save($new_log);
                    }catch (\Exception $exception){}
                }
            }

            $ticket->reply = $request->input('reply', null);
            $ticket->status = $request->input('status', $ticket->status);
            if ($ticket->status == Tickets::STATUS_COMPLETED)
            {
                // 完成工单,把子任务里面未完成的工单改为完成
                $ticket->end_at = now();
                $ticket->logs()->where('status', '<', TicketLog::STATUS_COMPLETED)
                    ->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]);
            }
            $ticket->save();
            return $ticket;
        });
        $this->response('success', Code::SUCCESS, $result->toArray());
    }

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


    /**
     * 手动触发,推送工单到企微群
     */
    public function pushNotify($id)
    {
        $project = TicketProject::where('uuid', $id)
            ->where('is_del', 0)
            ->first();

        if (empty($project))
            $this->response('工单项目不存在', Code::USER_MODEL_NOTFOUND_ERROE);

        if (empty($project->wechat_group_id)) {
            $this->response('该工单没有绑定的企微群', Code::USER_MODEL_NOTFOUND_ERROE);
        }

        $message_push = new MessagePush();
        $message_push->project_id = $project->table_id;
        $message_push->friend_id = $project->wechat_group_id;
        $message_push->content_type = 'Link';
        $message_push->content = json_encode([
            'title' => "AI协同工单 - " . $project->company_name,
            'desc' => "可提交新的工单、查询工单进度、AI会同步通知售后人员!",
            'size' => 0,
            'thumbSize' => 0,
            'thumbUrl' => 'https://hub.globalso.com/logocm.png',
            'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid
        ], JSON_UNESCAPED_UNICODE);
        $message_push->send_time = now();
        $message_push->type = MessagePush::TYPE_TICKET;
        $message_push->save();
        $this->response('success', Code::SUCCESS);
    }

}