作者 刘锟

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

@@ -58,6 +58,25 @@ class AsideTicketController extends BaseController @@ -58,6 +58,25 @@ class AsideTicketController extends BaseController
58 } 58 }
59 59
60 }) 60 })
  61 + ->when($request->input('timeout') !== null, function ($query) use ($request) {
  62 + // status 查 gl_tickets.status
  63 + $timeout = $request->input('timeout');
  64 + switch ($timeout) {
  65 + case 1:
  66 + $newTime = date("Y-m-d H:i:s", strtotime("-24 hours"));
  67 + break;
  68 + case 2:
  69 + $newTime = date("Y-m-d H:i:s", strtotime("-48 hours"));
  70 + break;
  71 + case 3:
  72 + $newTime = date("Y-m-d H:i:s", strtotime("-72 hours"));
  73 + break;
  74 + default:
  75 + $newTime = date("Y-m-d H:i:s");
  76 + break;
  77 + }
  78 + return $query->where('status', 0)->where('plan_end_at','<',$newTime);//超过120个小时未处理的工单
  79 + })
61 ->when($request->input('star') !== null, function ($query) use ($request) { 80 ->when($request->input('star') !== null, function ($query) use ($request) {
62 $star = $request->input('star'); 81 $star = $request->input('star');
63 return $query->where('star', $star); 82 return $query->where('star', $star);
@@ -106,11 +125,131 @@ class AsideTicketController extends BaseController @@ -106,11 +125,131 @@ class AsideTicketController extends BaseController
106 $sortOrder = strtolower($request->input('sort_order', 'asc')); 125 $sortOrder = strtolower($request->input('sort_order', 'asc'));
107 $query->orderBy($sortField, $sortOrder); 126 $query->orderBy($sortField, $sortOrder);
108 if ($sortField != 'plan_end_at') $query->orderBy('plan_end_at', 'asc'); 127 if ($sortField != 'plan_end_at') $query->orderBy('plan_end_at', 'asc');
109 - $lists = $query->paginate($this->row, ['*'], 'page', $this->page); 128 + $lists = $query->paginate($this->row, ['*'], 'page', $this->page)->toArray();
  129 + if(!empty($lists) && !empty($lists['list'])){
  130 + foreach ($lists['list'] as $key => $item){
  131 + //计算超时多少个小时
  132 + if($item['status'] == 0){
  133 + $end = date('Y-m-d H:i:s');
  134 + $start = $item['plan_end_at'];
  135 + if($start < $end){
  136 + $item['plan_ent_time'] = diffInHours($start,$end);
  137 + }
  138 + }
  139 + $lists['list'][$key] = $item;
  140 + }
  141 + }
110 $this->response('success', Code::SUCCESS, $lists); 142 $this->response('success', Code::SUCCESS, $lists);
111 } 143 }
112 144
113 /** 145 /**
  146 + * @remark :列表数据
  147 + * @name :lists
  148 + * @author :lyh
  149 + * @method :post
  150 + * @time :2025/9/1 16:45
  151 + */
  152 + public function lists(AsideTicketListRequest $request)
  153 + {
  154 + $validated = $request->validated();
  155 + $ticketsModel = new Tickets();
  156 + $query = $ticketsModel->leftJoin('gl_ticket_projects', 'gl_ticket_projects.id', '=', 'gl_tickets.project_id')
  157 + ->leftJoin('gl_ticket_logs', 'gl_ticket_logs.ticket_id', '=', 'gl_tickets.id')
  158 + ->select([
  159 + 'gl_tickets.*',
  160 + 'gl_ticket_projects.title as project_title',
  161 + 'gl_ticket_projects.company_name as project_company',
  162 + 'gl_ticket_projects.status as project_status',
  163 + 'gl_ticket_projects.project_cate as project_cate',
  164 + ])
  165 + ->distinct(); // 避免多条 logs 时数据重复
  166 +
  167 + // 工程师过滤
  168 + if (!empty($validated['engineer_id'])) {
  169 + $engineerId = $validated['engineer_id'];
  170 + $query->where(function ($q) use ($engineerId) {
  171 + $q->where('gl_tickets.submit_user_id', $engineerId)
  172 + ->orWhere('gl_ticket_logs.engineer_id', $engineerId);
  173 + });
  174 + }
  175 + // project_id 过滤
  176 + if ($request->filled('project_id')) {
  177 + $query->where('gl_ticket_projects.uuid', $request->input('project_id'));
  178 + }
  179 + // status 过滤
  180 + if ($request->filled('status')) {
  181 + $status = $request->input('status');
  182 + if ($status == -1) {
  183 + $newTime = now()->subHours(120);
  184 + $query->where('gl_tickets.status', 0)
  185 + ->where('gl_tickets.plan_end_at', '<', $newTime);
  186 + } else {
  187 + $query->where('gl_tickets.status', $status);
  188 + }
  189 + }
  190 + // timeout 过滤
  191 + if ($request->filled('timeout')) {
  192 + $timeout = (int)$request->input('timeout');
  193 + switch ($timeout) {
  194 + case 1: $newTime = now()->subHours(24); break;
  195 + case 2: $newTime = now()->subHours(48); break;
  196 + case 3: $newTime = now()->subHours(72); break;
  197 + default: $newTime = now(); break;
  198 + }
  199 + $query->where('gl_tickets.status', 0)
  200 + ->where('gl_tickets.plan_end_at', '<', $newTime);
  201 + }
  202 + // star 过滤
  203 + if ($request->filled('star')) {
  204 + $query->where('gl_tickets.star', $request->input('star'));
  205 + }
  206 + // search 模糊搜索
  207 + if ($request->filled('search')) {
  208 + $search = $request->input('search');
  209 + $query->where(function ($q) use ($search) {
  210 + $q->where('gl_tickets.title', 'like', "%$search%")
  211 + ->orWhere('gl_ticket_projects.title', 'like', "%$search%")
  212 + ->orWhere('gl_ticket_projects.company_name', 'like', "%$search%");
  213 + });
  214 + }
  215 + // project_status
  216 + if ($request->filled('project_status')) {
  217 + $query->where('gl_ticket_projects.status', $request->input('project_status'));
  218 + }
  219 + // project_cate
  220 + if ($request->filled('project_cate')) {
  221 + $query->where('gl_ticket_projects.project_cate', $request->input('project_cate'));
  222 + }
  223 + // 部门搜索
  224 + if (!empty($this->param['dept_id'])) {
  225 + $manageHrModel = new ManageHr();
  226 + $manageIdArr = $manageHrModel->selectField(['dept_id'=>$this->param['dept_id'],'status'=>1],'manage_id');
  227 + $query->whereIn('gl_ticket_logs.engineer_id', $manageIdArr);
  228 + }
  229 + // 时间区间
  230 + if (!empty($this->param['start_at']) && !empty($this->param['end_at'])) {
  231 + $query->whereBetween('gl_tickets.created_at', [$this->param['start_at'], $this->param['end_at']]);
  232 + }
  233 + // 排序
  234 + $query->orderBy('gl_tickets.status', 'asc');
  235 + $sortField = $request->input('sort_field', 'gl_tickets.plan_end_at');
  236 + $sortOrder = strtolower($request->input('sort_order', 'asc'));
  237 + $query->orderBy($sortField, $sortOrder);
  238 + if ($sortField != 'gl_tickets.plan_end_at') {
  239 + $query->orderBy('gl_tickets.plan_end_at', 'asc');
  240 + }
  241 + // 分页 (建议用 simplePaginate 提速)
  242 + $lists = $query->paginate($this->row, ['*'], 'page', $this->page);
  243 + // 计算超时小时数(也可以 SQL 里用 TIMESTAMPDIFF 算好)
  244 + foreach ($lists as $item) {
  245 + if ($item->status == 0 && $item->plan_end_at < now()) {
  246 + $item->plan_ent_time = diffInHours($item->plan_end_at, now());
  247 + }
  248 + }
  249 + $this->response('success', Code::SUCCESS, $lists);
  250 + }
  251 +
  252 + /**
114 * @param $search 253 * @param $search
115 * @return void 254 * @return void
116 * V5V6所有项目 255 * V5V6所有项目
@@ -253,6 +253,7 @@ Route::middleware(['aloginauth'])->group(function () { @@ -253,6 +253,7 @@ Route::middleware(['aloginauth'])->group(function () {
253 // 售后工单改版 253 // 售后工单改版
254 Route::prefix('tickets')->group(function () { 254 Route::prefix('tickets')->group(function () {
255 Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表'); 255 Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表');
  256 + Route::post('/lists', [Aside\WorkOrder\AsideTicketController::class, 'lists'])->name('admin.tickets.lists')->summary('A端工单列表2');
256 Route::post('/', [Aside\WorkOrder\AsideTicketController::class, 'store'])->name('admin.tickets.store')->summary('A端创建工单'); 257 Route::post('/', [Aside\WorkOrder\AsideTicketController::class, 'store'])->name('admin.tickets.store')->summary('A端创建工单');
257 Route::get('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'show'])->name('admin.tickets.show')->summary('A端工单详情'); 258 Route::get('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'show'])->name('admin.tickets.show')->summary('A端工单详情');
258 Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事'); 259 Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');