Tickets.php 4.2 KB
<?php

namespace App\Models\WorkOrder;

use App\Models\Base;
use App\Models\Manage\ManageHr;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Support\Facades\Log;

class Tickets extends Base
{
    use HasFactory;

    protected $table = 'gl_tickets';

    const STATUS_PEDDING = 0; // 待处理
    const STATUS_PROCESSING = 1; // 处理中
    const STATUS_COMPLETED = 2; // 已完成
    const STATUS_CLOSED = 3; // 已关闭

    /**
     * @return void
     * 关联的工单日志
     */
    public function logs()
    {
        return $this->hasMany(TicketLog::class, 'ticket_id', 'id');
    }

    /**
     * 关联项目
     */
    public function project()
    {
        return $this->belongsTo(TicketProject::class, 'project_id', 'id');
    }

    /**
     * 当前工单,保存参与的人员到 gl_ticket_logs 表
     * 逻辑说明:
     * 1. 如果当前项目是超迹,要把徐莹和第一负责人加进去,为参与人
     * 2. 若是域途项目,把黄小玉和第一负责人加进去,为参与人
     */
    public function saveEngineers($engineer_ids = [])
    {
        $canyu = [
            $this->project->engineer_id, // 第一负责人
        ];

        if ($this->project->project_cate == 3)
            $canyu[] = 20; // 徐莹
         elseif ($this->project->project_cate == 4)
             $canyu[] = 85; // 黄小玉

        $all_engineer_ids = array_unique(array_merge($canyu, $engineer_ids));

        foreach ($all_engineer_ids as $engineer_id)
        {
            try {
                // 利用唯一索引去重
                $log = new TicketLog();
                $log->engineer_id = $engineer_id;
                $log->is_engineer = in_array($engineer_id, $engineer_ids);
                $this->logs()->save($log);
            }catch (\Exception $exception){}
        }

        // 删除没有参与当前工单的人员(若之前已有)
        $this->logs()->whereNotIn('engineer_id', $all_engineer_ids)->delete();
    }

    /**
     * 推送钉钉通知任务
     * 1. 客户提交了工单
     *  - 通知第一负责人
     * 2. 客户补充了工单
     *  - 通知最近的聊天技术
     * 3. 技术完成了工单
     *  - 通知第一负责人,通知企微群
     */
    public function pushDing($action = 'create')
    {
        try {
            $ding = new TicketDing();
            $ding->msgKey = 'sampleLink';
            $ding->table_name = 'gl_tickets';
            $ding->table_id = $this->id;

            if ($action == 'create')
            {
                // 客户提交了工单
                $ding->userIds = [$this->project->engineer_id];
                $ding->msgParam = json_encode([
                    'text' => "您有新的工单(ID: {$this->id}),请及时处理!",
                    'title' => 'AI协同工单 - ' . $this->project->title,
                    'picUrl' => 'https://hub.globalso.com/logocm.png',
                    'messageUrl' => 'https://oa.quanqiusou.cn/afterorder?project_id=' . $this->project->uuid,
                ], JSON_UNESCAPED_UNICODE);
                $ding->save();
            }elseif ($action == 'chat'){
                // 客户补充了工单
                $ding = new TicketDing();
                $lastChat = TicketChat::where('ticket_id', $this->id)
                    ->where('submit_side', 1)
                    ->orderBy('id', 'desc')
                    ->first();

                $ding->userIds = [!empty($lastChat) ? $lastChat->manage_id : $this->project->engineer_id];
                $ding->msgParam = json_encode([
                    'text' => "客户补充了工单(ID: {$this->id}),请及时处理!",
                    'title' => 'AI协同工单 - ' . $this->project->title,
                    'picUrl' => 'https://hub.globalso.com/logocm.png',
                    'messageUrl' => 'https://oa.quanqiusou.cn/afterorder?project_id=' . $this->project->uuid,
                ], JSON_UNESCAPED_UNICODE);
                $ding->save();
            }elseif ($action == 'finish'){
                // 完成工单

            }
        }catch (\Exception $exception){
            Log::error(" | ERRPR | Ticket {$exception->getMessage()} \n {$exception->getTraceAsString()}");
        }
    }

}