AsideTicketLogController.php 3.9 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\AsideTicketLogUpdateRequest;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\Tickets;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class AsideTicketLogController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * A 端完结工单任务
     */
    public function update(AsideTicketLogUpdateRequest $request, $id)
    {
        $log = TicketLog::find($id);  // 拆分的子工单
        if (!$log) {
            $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
        }
        if ($log->engineer_id != $this->manage['id']) {
            // 只能操作自己的工单
            $this->response('没有权限操作该工单', Code::USER_PERMISSION_ERROE);
        }
        if ($log->status >= TicketLog::STATUS_COMPLETED) {
            // 已经完成的工单不能再操作
            $this->response('工单已完成,不能再操作', Code::USER_PERMISSION_ERROE);
        }
        $ticket = $log->ticket;
        $result = DB::transaction(function () use ($request, $ticket, $log) {
            if ($request->input('status') !== null)
            {
                $log->status = $request->input('status');
                if ($log->status >= TicketLog::STATUS_COMPLETED)
                {
                    // 我的工单标记为已完成
                    $log->end_at = now();
                    $log->end_time = diffInHours($ticket->created_at,now());
                }
            }
            if ($request->input('reply') !== null)
                $log->reply = $request->input('reply', '');
            $log->save();
            // 是否有未完成的子任务
            $pending = $ticket->logs()
                ->where('status', '<', TicketLog::STATUS_COMPLETED)
                ->where('is_engineer', 1)
                ->count();
            if ($pending)
            {
                $ticket->status = Tickets::STATUS_PROCESSING;
            }else
            {
                // 如果所有子任务都完成了,则将工单状态改为已完成
                // todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态
                if (!($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))
                {
                    $ticket->status = Tickets::STATUS_COMPLETED;
                    $ticket->end_at = now();
                    $ticket->end_time = diffInHours($ticket->created_at,$ticket->end_at);
                    $project = $ticket->project;
                    if ($project->wechat_switch && !$ticket->close_wechat)
                        $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
                    $ticket->pushDing('finish');
                }else{
                    $ticket->status = Tickets::STATUS_YANSHOU;
                }
            }
            $ticket->save();
            return $log;
        });
        $this->response('success', Code::SUCCESS, $result->toArray());

    }

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