TicketLogic.php 6.2 KB
<?php
/**
 * @remark :
 * @name   :TicketLogic.php
 * @author :lyh
 * @method :post
 * @time   :2025/8/11 10:54
 */

namespace App\Http\Logic\Aside\Ticket;

use App\Http\Logic\Aside\BaseLogic;
use App\Models\Manage\ManageHr;
use App\Models\Project\Project;
use App\Models\Ticket\TicketDailyCount;
use App\Models\Ticket\TicketDailyDeptCount;
use App\Models\Ticket\TicketDailyManageCount;
use App\Models\Ticket\TicketMonthDeptCount;
use App\Models\Ticket\TicketMonthManageCount;
use App\Models\Ticket\TicketWeekDeptCount;
use App\Models\Ticket\TicketWeekManageCount;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Illuminate\Support\Carbon;

class TicketLogic extends BaseLogic
{
    public function __construct()
    {
        parent::__construct();
        $this->param = $this->requestAll;
    }

    /**
     * @remark :获取今日统计数据
     * @name   :getTicketCount
     * @author :lyh
     * @method :post
     * @time   :2025/8/11 10:54
     */
    public function getTicketCount(){
        $data = [];
        $ticketModel = new Tickets();
        $data['ticket_num'] = $ticketModel->count();//工单总数
        $date = date('Y-m-d');//今日时间
        $data['add_num'] = $ticketModel->counts(['created_at'=>['between',[$date.' 00:00:00',$date.' 23:59:59']]]);//今日新增工单
        $data['processed_num'] = $ticketModel->counts(['end_at'=>['between',[$date.' 00:00:00',$date.' 23:59:59']]]);//今日已处理工单
        $data['untreated_num'] = $ticketModel->counts(['end_at'=>null]);//未处理工单
        $submit_a_side = $ticketModel->formatQuery(['submit_side'=>1])->sum('submit_side');
        $submit_b_side = $ticketModel->formatQuery(['submit_side'=>2])->sum('submit_side');
        $data['source'] = ['a'=>$submit_a_side,'b'=>$submit_b_side];
        return $this->success($data);
    }

    /**
     * @remark :按日统计数据
     * @name   :getDailyTicketCount
     * @author :lyh
     * @method :post
     * @time   :2025/8/11 10:57
     */
    public function getDailyTicketCount(){
        $date = Carbon::yesterday()->toDateString(); //昨日时间
        $dailyModel = new TicketDailyCount();
        $dailyList = $dailyModel->list([],'date',['*'],'desc',5);//取最近5条数据
        $manageModel  = new TicketDailyManageCount();
        $manageList = $manageModel->list(['dept_id'=>1,'date'=>$date,'ticket_num'=>['!=',0],'average_time'=>['!=','']],'average_time',['*'],'asc');
        $manage2List = $manageModel->list(['dept_id'=>2,'date'=>$date,'ticket_num'=>['!=',0],'average_time'=>['!=','']],'average_time',['*'],'asc');
        $deptModel = new TicketDailyDeptCount();
        $deptList = $deptModel->list(['date'=>$date,'ticket_num'=>['!=',0]],'average_time',['*'],'asc');
        $data = ['daily'=>$dailyList,'manage'=>$manageList,'manage2'=>$manage2List,'dept'=>$deptList];
        return $this->success($data);
    }

    /**
     * @remark :获取随机工单列表(20条)
     * @name   :ticketList
     * @author :lyh
     * @method :post
     * @time   :2025/8/12 11:06
     */
    public function getTicketList(){
        $ticketsList = Tickets::select(['project_id','title','end_at','end_time','id'])->inRandomOrder()->limit(20)->get();
        $projectModel = new TicketProject();
        $ticketLogModel = new TicketLog();
        $manageModel = new ManageHr();
        foreach ($ticketsList as $key => $item){
            $item['project_name'] = $projectModel->getValue(['id'=>$item['project_id']],'title');
            $engineer_id = $ticketLogModel->getValue(['ticket_id'=>$item['id'],'is_engineer'=>1],'engineer_id');
            if(!empty($engineer_id)){
                $item['manage_name'] = $manageModel->getValue(['manage_id'=>$engineer_id],'name');
            }else{
                $item['manage_name'] = '未分配';
            }
            $ticketsList[$key] = $item;
            $item['status'] = (empty($item['end_at']) ? '未完成' : '完成');
        }
        return $this->success($ticketsList);
    }

    /**
     * @remark :根据技术组获取
     * @name   :getManageTicketCount
     * @author :lyh
     * @method :post
     * @time   :2025/8/11 14:41
     */
    public function getManageTicketCount($map,$order = 'ticket_num',$desc = 'desc'){
        $manageModel  = new TicketDailyManageCount();
        unset($map['sort']);
        $map['date'] = Carbon::yesterday()->toDateString();
        $manageList = $manageModel->list($map,$order,['*'],$desc);
        return $this->success($manageList);
    }

    /**
     * @remark :按月统计数据
     * @name   :getWeekManageList
     * @author :lyh
     * @method :post
     * @time   :2025/8/30 16:02
     */
    public function getWeekManageList($start,$end,$dept_id = 1,$order = 'complete_num',$sort){
        if(empty($start) || empty($end)){
            $start = Carbon::now()->subWeek()->startOfWeek(); // 上周一 00:00:00
            $end = Carbon::now()->subWeek()->endOfWeek();   // 上周日 23:59:59
        }
        $manageWeekModel = new TicketWeekManageCount();
        $manageWeekList = $manageWeekModel->list(['start_at'=>$start,'end_at'=>$end,'dept_id'=>$dept_id],$order,['*'],$sort);
        $deptWeekModel = new TicketWeekDeptCount();
        $deptWeekList = $deptWeekModel->list(['start_at'=>$start,'end_at'=>$end]);
        return $this->success(['manage'=>$manageWeekList,'dept'=>$deptWeekList ?? []]);
    }

    /**
     * @remark :按月统计数据
     * @name   :getMonthManageList
     * @author :lyh
     * @method :post
     * @time   :2025/8/30 16:27
     */
    public function getMonthManageList($start,$end,$dept_id = 1,$order = 'complete_num',$sort = 'desc'){
        if(empty($start) || empty($end)){
            $start = Carbon::now()->subMonth()->startOfMonth(); // 上个月 1号 00:00:00
            $end = Carbon::now()->subMonth()->endOfMonth();   // 上个月最后一天 23:59:59
        }
        $manageWeekModel = new TicketMonthManageCount();
        $manageWeekList = $manageWeekModel->list(['start_at'=>$start,'end_at'=>$end,'dept_id'=>$dept_id],$order,['*'],$sort);
        $deptWeekModel = new TicketMonthDeptCount();
        $deptWeekList = $deptWeekModel->list(['start_at'=>$start,'end_at'=>$end]);
        return $this->success(['manage'=>$manageWeekList,'dept'=>$deptWeekList]);
    }
}