作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

... ... @@ -58,6 +58,25 @@ class AsideTicketController extends BaseController
}
})
->when($request->input('timeout') !== null, function ($query) use ($request) {
// status 查 gl_tickets.status
$timeout = $request->input('timeout');
switch ($timeout) {
case 1:
$newTime = date("Y-m-d H:i:s", strtotime("-24 hours"));
break;
case 2:
$newTime = date("Y-m-d H:i:s", strtotime("-48 hours"));
break;
case 3:
$newTime = date("Y-m-d H:i:s", strtotime("-72 hours"));
break;
default:
$newTime = date("Y-m-d H:i:s");
break;
}
return $query->where('status', 0)->where('plan_end_at','<',$newTime);//超过120个小时未处理的工单
})
->when($request->input('star') !== null, function ($query) use ($request) {
$star = $request->input('star');
return $query->where('star', $star);
... ... @@ -106,11 +125,131 @@ class AsideTicketController extends BaseController
$sortOrder = strtolower($request->input('sort_order', 'asc'));
$query->orderBy($sortField, $sortOrder);
if ($sortField != 'plan_end_at') $query->orderBy('plan_end_at', 'asc');
$lists = $query->paginate($this->row, ['*'], 'page', $this->page);
$lists = $query->paginate($this->row, ['*'], 'page', $this->page)->toArray();
if(!empty($lists) && !empty($lists['list'])){
foreach ($lists['list'] as $key => $item){
//计算超时多少个小时
if($item['status'] == 0){
$end = date('Y-m-d H:i:s');
$start = $item['plan_end_at'];
if($start < $end){
$item['plan_ent_time'] = diffInHours($start,$end);
}
}
$lists['list'][$key] = $item;
}
}
$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_projects.title as project_title',
'gl_ticket_projects.company_name as project_company',
'gl_ticket_projects.status as project_status',
'gl_ticket_projects.project_cate as project_cate',
])
->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);
});
}
// 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%");
});
}
// 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']]);
}
// 排序
$query->orderBy('gl_tickets.status', 'asc');
$sortField = $request->input('sort_field', 'gl_tickets.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()) {
$item->plan_ent_time = diffInHours($item->plan_end_at, now());
}
}
$this->response('success', Code::SUCCESS, $lists);
}
/**
* @param $search
* @return void
* V5V6所有项目
... ...
... ... @@ -253,6 +253,7 @@ Route::middleware(['aloginauth'])->group(function () {
// 售后工单改版
Route::prefix('tickets')->group(function () {
Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表');
Route::post('/lists', [Aside\WorkOrder\AsideTicketController::class, 'lists'])->name('admin.tickets.lists')->summary('A端工单列表2');
Route::post('/', [Aside\WorkOrder\AsideTicketController::class, 'store'])->name('admin.tickets.store')->summary('A端创建工单');
Route::get('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'show'])->name('admin.tickets.show')->summary('A端工单详情');
Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');
... ...