|
@@ -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,7 +125,127 @@ class AsideTicketController extends BaseController |
|
@@ -106,7 +125,127 @@ 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');
|
|
|
|
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
|
+ }
|
|
|
|
142
|
+ $this->response('success', Code::SUCCESS, $lists);
|
|
|
|
143
|
+ }
|
|
|
|
144
|
+
|
|
|
|
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 提速)
|
|
109
|
$lists = $query->paginate($this->row, ['*'], 'page', $this->page);
|
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
|
+ }
|
|
110
|
$this->response('success', Code::SUCCESS, $lists);
|
249
|
$this->response('success', Code::SUCCESS, $lists);
|
|
111
|
}
|
250
|
}
|
|
112
|
|
251
|
|