作者 lyh

超过120小时未处理的工单

@@ -141,6 +141,113 @@ class AsideTicketController extends BaseController @@ -141,6 +141,113 @@ class AsideTicketController extends BaseController
141 } 141 }
142 142
143 /** 143 /**
  144 + * @remark :列表数据
  145 + * @name :lists
  146 + * @author :lyh
  147 + * @method :post
  148 + * @time :2025/9/1 16:45
  149 + */
  150 + public function lists(AsideTicketListRequest $request)
  151 + {
  152 + $validated = $request->validated();
  153 + $ticketsModel = new Tickets();
  154 + $query = $ticketsModel->leftJoin('gl_ticket_projects', 'gl_ticket_projects.id', '=', 'gl_tickets.project_id')
  155 + ->leftJoin('gl_ticket_logs', 'gl_ticket_logs.ticket_id', '=', 'gl_tickets.id')
  156 + ->select([
  157 + 'gl_tickets.*',
  158 + 'gl_ticket_projects.title as project_title',
  159 + 'gl_ticket_projects.company_name as project_company',
  160 + 'gl_ticket_projects.status as project_status',
  161 + 'gl_ticket_projects.project_cate as project_cate',
  162 + ])
  163 + ->distinct(); // 避免多条 logs 时数据重复
  164 +
  165 + // 工程师过滤
  166 + if (!empty($validated['engineer_id'])) {
  167 + $engineerId = $validated['engineer_id'];
  168 + $query->where(function ($q) use ($engineerId) {
  169 + $q->where('gl_tickets.submit_user_id', $engineerId)
  170 + ->orWhere('gl_ticket_logs.engineer_id', $engineerId);
  171 + });
  172 + }
  173 + // project_id 过滤
  174 + if ($request->filled('project_id')) {
  175 + $query->where('gl_ticket_projects.uuid', $request->input('project_id'));
  176 + }
  177 + // status 过滤
  178 + if ($request->filled('status')) {
  179 + $status = $request->input('status');
  180 + if ($status == -1) {
  181 + $newTime = now()->subHours(120);
  182 + $query->where('gl_tickets.status', 0)
  183 + ->where('gl_tickets.plan_end_at', '<', $newTime);
  184 + } else {
  185 + $query->where('gl_tickets.status', $status);
  186 + }
  187 + }
  188 + // timeout 过滤
  189 + if ($request->filled('timeout')) {
  190 + $timeout = (int)$request->input('timeout');
  191 + switch ($timeout) {
  192 + case 1: $newTime = now()->subHours(24); break;
  193 + case 2: $newTime = now()->subHours(48); break;
  194 + case 3: $newTime = now()->subHours(72); break;
  195 + default: $newTime = now(); break;
  196 + }
  197 + $query->where('gl_tickets.status', 0)
  198 + ->where('gl_tickets.plan_end_at', '<', $newTime);
  199 + }
  200 + // star 过滤
  201 + if ($request->filled('star')) {
  202 + $query->where('gl_tickets.star', $request->input('star'));
  203 + }
  204 + // search 模糊搜索
  205 + if ($request->filled('search')) {
  206 + $search = $request->input('search');
  207 + $query->where(function ($q) use ($search) {
  208 + $q->where('gl_tickets.title', 'like', "%$search%")
  209 + ->orWhere('gl_ticket_projects.title', 'like', "%$search%")
  210 + ->orWhere('gl_ticket_projects.company_name', 'like', "%$search%");
  211 + });
  212 + }
  213 + // project_status
  214 + if ($request->filled('project_status')) {
  215 + $query->where('gl_ticket_projects.status', $request->input('project_status'));
  216 + }
  217 + // project_cate
  218 + if ($request->filled('project_cate')) {
  219 + $query->where('gl_ticket_projects.project_cate', $request->input('project_cate'));
  220 + }
  221 + // 部门搜索
  222 + if (!empty($this->param['dept_id'])) {
  223 + $manageHrModel = new ManageHr();
  224 + $manageIdArr = $manageHrModel->selectField(['dept_id'=>$this->param['dept_id'],'status'=>1],'manage_id');
  225 + $query->whereIn('gl_ticket_logs.engineer_id', $manageIdArr);
  226 + }
  227 + // 时间区间
  228 + if (!empty($this->param['start_at']) && !empty($this->param['end_at'])) {
  229 + $query->whereBetween('gl_tickets.created_at', [$this->param['start_at'], $this->param['end_at']]);
  230 + }
  231 + // 排序
  232 + $query->orderBy('gl_tickets.status', 'asc');
  233 + $sortField = $request->input('sort_field', 'gl_tickets.plan_end_at');
  234 + $sortOrder = strtolower($request->input('sort_order', 'asc'));
  235 + $query->orderBy($sortField, $sortOrder);
  236 + if ($sortField != 'gl_tickets.plan_end_at') {
  237 + $query->orderBy('gl_tickets.plan_end_at', 'asc');
  238 + }
  239 + // 分页 (建议用 simplePaginate 提速)
  240 + $lists = $query->simplePaginate($this->row, ['*'], 'page', $this->page);
  241 + // 计算超时小时数(也可以 SQL 里用 TIMESTAMPDIFF 算好)
  242 + foreach ($lists as $item) {
  243 + if ($item->status == 0 && $item->plan_end_at < now()) {
  244 + $item->plan_ent_time = diffInHours($item->plan_end_at, now());
  245 + }
  246 + }
  247 + $this->response('success', Code::SUCCESS, $lists);
  248 + }
  249 +
  250 + /**
144 * @param $search 251 * @param $search
145 * @return void 252 * @return void
146 * V5V6所有项目 253 * V5V6所有项目