|
...
|
...
|
@@ -24,7 +24,9 @@ class AsideTicketController extends BaseController |
|
|
|
*/
|
|
|
|
public function index(AsideTicketListRequest $request)
|
|
|
|
{
|
|
|
|
|
|
|
|
$validated = $request->validated();
|
|
|
|
|
|
|
|
$query = Tickets::with([
|
|
|
|
'logs.engineer',
|
|
|
|
'project.pm',
|
|
...
|
...
|
@@ -141,106 +143,111 @@ class AsideTicketController extends BaseController |
|
|
|
}
|
|
|
|
$this->response('success', Code::SUCCESS, $lists);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @remark :列表数据
|
|
|
|
* @name :lists
|
|
|
|
* @author :lyh
|
|
|
|
* @method :post
|
|
|
|
* @time :2025/9/1 16:45
|
|
|
|
*/
|
|
|
|
public function lists(AsideTicketListRequest $request)
|
|
|
|
{
|
|
|
|
$validated = $request->validated();
|
|
|
|
$ticketsModel = new Tickets();
|
|
|
|
$query = $ticketsModel->leftJoin('gl_ticket_projects', 'gl_ticket_projects.id', '=', 'gl_tickets.project_id')
|
|
|
|
->leftJoin('gl_ticket_logs', 'gl_ticket_logs.ticket_id', '=', 'gl_tickets.id')
|
|
|
|
->select('gl_tickets.*', 'gl_ticket_logs.*', 'gl_ticket_projects.*')
|
|
|
|
->distinct(); // 避免多条 logs 时数据重复
|
|
|
|
|
|
|
|
// 工程师过滤
|
|
|
|
if (!empty($validated['engineer_id'])) {
|
|
|
|
$engineerId = $validated['engineer_id'];
|
|
|
|
$query->where(function ($q) use ($engineerId) {
|
|
|
|
$q->where('gl_tickets.submit_user_id', $engineerId)
|
|
|
|
->orWhere('gl_ticket_logs.engineer_id', $engineerId);
|
|
|
|
// 1️⃣ 先构建主表查询(只查票据ID用于分页)
|
|
|
|
$ticketQuery = Tickets::query()
|
|
|
|
->when(!empty($validated['engineer_id']), function ($query) use ($validated) {
|
|
|
|
$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) {
|
|
|
|
$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 = $request->input('status');
|
|
|
|
if($status == '-1'){
|
|
|
|
$newTime = now()->subHours(120);
|
|
|
|
return $query->where('status', 0)->where('plan_end_at', '<', $newTime);
|
|
|
|
} else {
|
|
|
|
return $query->where('status', $status);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
->when($request->input('timeout') !== null, function ($query) use ($request) {
|
|
|
|
$timeout = $request->input('timeout');
|
|
|
|
switch ($timeout) {
|
|
|
|
case 1: $newTime = now()->subHours(24); break;
|
|
|
|
case 2: $newTime = now()->subHours(48); break;
|
|
|
|
case 3: $newTime = now()->subHours(72); break;
|
|
|
|
default: $newTime = now(); break;
|
|
|
|
}
|
|
|
|
return $query->where('status', 0)->where('plan_end_at','<',$newTime);
|
|
|
|
})
|
|
|
|
->when($request->input('star') !== null, function ($query) use ($request) {
|
|
|
|
return $query->where('star', $request->input('star'));
|
|
|
|
})
|
|
|
|
->when($request->input('search'), function ($query) use ($request) {
|
|
|
|
$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}%");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
})
|
|
|
|
->when($request->input('project_status') !== null, function ($query) use ($request) {
|
|
|
|
return $query->whereHas('project', function ($q) use ($request) {
|
|
|
|
$q->where('status', $request->input('project_status'));
|
|
|
|
});
|
|
|
|
})
|
|
|
|
->when($request->input('project_cate') !== null, function ($query) use ($request) {
|
|
|
|
return $query->whereHas('project', function ($q) use ($request) {
|
|
|
|
$q->where('project_cate', $request->input('project_cate'));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// project_id 过滤
|
|
|
|
if ($request->filled('project_id')) {
|
|
|
|
$query->where('gl_ticket_projects.uuid', $request->input('project_id'));
|
|
|
|
}
|
|
|
|
// status 过滤
|
|
|
|
if ($request->filled('status')) {
|
|
|
|
$status = $request->input('status');
|
|
|
|
if ($status == -1) {
|
|
|
|
$newTime = now()->subHours(120);
|
|
|
|
$query->where('gl_tickets.status', 0)
|
|
|
|
->where('gl_tickets.plan_end_at', '<', $newTime);
|
|
|
|
} else {
|
|
|
|
$query->where('gl_tickets.status', $status);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// timeout 过滤
|
|
|
|
if ($request->filled('timeout')) {
|
|
|
|
$timeout = (int)$request->input('timeout');
|
|
|
|
switch ($timeout) {
|
|
|
|
case 1: $newTime = now()->subHours(24); break;
|
|
|
|
case 2: $newTime = now()->subHours(48); break;
|
|
|
|
case 3: $newTime = now()->subHours(72); break;
|
|
|
|
default: $newTime = now(); break;
|
|
|
|
}
|
|
|
|
$query->where('gl_tickets.status', 0)
|
|
|
|
->where('gl_tickets.plan_end_at', '<', $newTime);
|
|
|
|
}
|
|
|
|
// star 过滤
|
|
|
|
if ($request->filled('star')) {
|
|
|
|
$query->where('gl_tickets.star', $request->input('star'));
|
|
|
|
}
|
|
|
|
// search 模糊搜索
|
|
|
|
if ($request->filled('search')) {
|
|
|
|
$search = $request->input('search');
|
|
|
|
$query->where(function ($q) use ($search) {
|
|
|
|
$q->where('gl_tickets.title', 'like', "%$search%")
|
|
|
|
->orWhere('gl_ticket_projects.title', 'like', "%$search%")
|
|
|
|
->orWhere('gl_ticket_projects.company_name', 'like', "%$search%");
|
|
|
|
|
|
|
|
// 部门筛选
|
|
|
|
if(isset($this->param['dept_id']) && !empty($this->param['dept_id'])){
|
|
|
|
$manageIdArr = (new ManageHr())->selectField(['dept_id'=>$this->param['dept_id'],'status'=>1],'manage_id');
|
|
|
|
$ticketQuery->whereHas('logs', function ($q) use ($manageIdArr) {
|
|
|
|
$q->whereIn('engineer_id', $manageIdArr);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// project_status
|
|
|
|
if ($request->filled('project_status')) {
|
|
|
|
$query->where('gl_ticket_projects.status', $request->input('project_status'));
|
|
|
|
}
|
|
|
|
// project_cate
|
|
|
|
if ($request->filled('project_cate')) {
|
|
|
|
$query->where('gl_ticket_projects.project_cate', $request->input('project_cate'));
|
|
|
|
}
|
|
|
|
// 部门搜索
|
|
|
|
if (!empty($this->param['dept_id'])) {
|
|
|
|
$manageHrModel = new ManageHr();
|
|
|
|
$manageIdArr = $manageHrModel->selectField(['dept_id'=>$this->param['dept_id'],'status'=>1],'manage_id');
|
|
|
|
$query->whereIn('gl_ticket_logs.engineer_id', $manageIdArr);
|
|
|
|
}
|
|
|
|
// 时间区间
|
|
|
|
if (!empty($this->param['start_at']) && !empty($this->param['end_at'])) {
|
|
|
|
$query->whereBetween('gl_tickets.created_at', [$this->param['start_at'], $this->param['end_at']]);
|
|
|
|
|
|
|
|
// 时间区间筛选
|
|
|
|
if(!empty($this->param['start_at']) && !empty($this->param['end_at'])){
|
|
|
|
$ticketQuery->whereBetween('created_at', [$this->param['start_at'], $this->param['end_at']]);
|
|
|
|
}
|
|
|
|
// 排序
|
|
|
|
$query->orderBy('gl_tickets.status', 'asc');
|
|
|
|
$sortField = $request->input('sort_field', 'gl_tickets.plan_end_at');
|
|
|
|
$sortField = $request->input('sort_field', 'plan_end_at');
|
|
|
|
$sortOrder = strtolower($request->input('sort_order', 'asc'));
|
|
|
|
$query->orderBy($sortField, $sortOrder);
|
|
|
|
if ($sortField != 'gl_tickets.plan_end_at') {
|
|
|
|
$query->orderBy('gl_tickets.plan_end_at', 'asc');
|
|
|
|
}
|
|
|
|
// 分页 (建议用 simplePaginate 提速)
|
|
|
|
$lists = $query->paginate($this->row, ['*'], 'page', $this->page);
|
|
|
|
// 计算超时小时数(也可以 SQL 里用 TIMESTAMPDIFF 算好)
|
|
|
|
foreach ($lists as $item) {
|
|
|
|
if ($item->status == 0 && $item->plan_end_at < now()) {
|
|
|
|
$ticketQuery->orderBy('status', 'asc')
|
|
|
|
->orderBy($sortField, $sortOrder);
|
|
|
|
if ($sortField != 'plan_end_at') $ticketQuery->orderBy('plan_end_at', 'asc');
|
|
|
|
// 2️⃣ 分页只获取主表ID
|
|
|
|
$page = $this->page;
|
|
|
|
$row = $this->row;
|
|
|
|
$ticketIds = $ticketQuery->clone()->paginate($row, ['id'], 'page', $page);
|
|
|
|
// 3️⃣ 批量加载关联表
|
|
|
|
$lists = Tickets::with([
|
|
|
|
'logs.engineer',
|
|
|
|
'project.pm',
|
|
|
|
'project.projectV6'
|
|
|
|
])->whereIn('id', $ticketIds->pluck('id'))->get();
|
|
|
|
// 4️⃣ 计算 plan_ent_time
|
|
|
|
$lists->transform(function($item){
|
|
|
|
if($item->status == 0 && $item->plan_end_at && $item->plan_end_at < now()){
|
|
|
|
$item->plan_ent_time = diffInHours($item->plan_end_at, now());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$this->response('success', Code::SUCCESS, $lists);
|
|
|
|
return $item;
|
|
|
|
});
|
|
|
|
$this->response('success', Code::SUCCESS, [
|
|
|
|
'current_page' => $page,
|
|
|
|
'last_page' => $ticketIds->lastPage(),
|
|
|
|
'total' => $ticketIds->total(),
|
|
|
|
'list' => $lists
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
...
|
...
|
|