TicketController.php
6.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
<?php
namespace App\Http\Controllers\Api\WorkOrder;
use App\Http\Controllers\Api\BaseController;
use App\Http\Requests\Api\WorkOrder\TicketListRequest;
use App\Http\Requests\Api\WorkOrder\TicketStoreRequest;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class TicketController extends BaseController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(TicketListRequest $request, $project_id)
{
$validated = $request->validated();
$project = TicketProject::where('uuid', $project_id)->first();
if (!$project) return $this->error('未找到项目', 404);
$page = (int)$request->input('page', 1);
$size = (int)$request->input('size', 10);
$tickets = Tickets::with([
'project.pm',
'project.assm',
'project.seom',
'project.first_engineer',
'logs.engineer',
])
->where('project_id', $project->id)
// ->where('submit_side', 2)
->when($request->input('status') !== null, function ($query) use ($request) {
// status 查 gl_tickets.status
$status = $request->input('status');
return $query->where('status', $status);
})
->when($request->input('search'), function ($query) use ($request) {
// search 查 gl_tickets.title 或 gl_ticket_projects.title 或 gl_ticket_projects.company_name
$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 . '%');
});
});
})
->orderBy('id', 'desc')
->paginate($size, ['*'], 'page', $page);
return response()->json(['data' => $tickets]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* B端用户在企微群里提交工单
*/
public function store($project_id, TicketStoreRequest $request)
{
$request->validated();
$project = TicketProject::where('uuid', $project_id)->first();
if (!$project) return response('未找到项目', 404);
if ($project->is_del) return response('项目状态异常', 400);
if (empty($project->first_engineer)) return response('项目未分配工单负责人', 400);
$result = DB::transaction(function () use ($request, $project) {
$ticket = new Tickets();
$ticket->project_id = $project->id;
$ticket->title = $request->input('title');
$ticket->content = $request->input('content');
// $files = [NULL]
$files = $request->input('files');
if (empty($files) || (is_array($files) && count(array_filter($files, function($v){ return !is_null($v); })) === 0)) {
$ticket->files = null;
} else {
$ticket->files = json_encode($files);
}
$ticket->submit_side = 2; // 2 for B-side submission
$ticket->submit_username = $request->input('submit_username');
$ticket->save();
$ticket->saveEngineers();
$project->pushWechatGroupMsg("客户新增了工单(ID:{$ticket->id}),请及时处理!");
return $ticket;
});
return response()->json(['data' => $result]);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($project_id, $id)
{
$ticket = Tickets::with([
'logs.engineer:id,name',
'project.projectV6:id,company',
])
->find($id);
if (!$ticket) return response('工单未找到', 404);
if ($ticket->project->uuid !== $project_id) return response('无权限查看该工单', 403);
if ($ticket->project->is_del) return response('项目状态异常', 400);
return response()->json(['data' => $ticket]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
public function projectInfo($project_id)
{
$project = TicketProject::with([
'pm',
'assm',
'seom',
'first_engineer',
])
->where('uuid', $project_id)->first();
if (!$project) return $this->response('未找到项目', 404);
return response()->json(['data' => $project]);
}
/**
* @param $friend_id
* @return void
* 企微群里@小超或艾丝,触发推送工单
* 接收群ID
*/
public function pushTicketByBot($friend_id)
{
$project = TicketProject::where('wechat_group_id', $friend_id)->where('is_del', 0)->first();
if (!$project)
return response()->json(['message' => '未找到对应的工单项目'], 404);
// $url = in_array($project->project_cate, [3,4]) ? 'https://hub.ai.cc/api/fob_ai_customer_service/push_message' : 'https://hub.ai.cc/api/globalso_ai_customer_service/send_msg';
// $response = Http::post($url, [
// 'type' => 'Link',
// 'friend_id' => $friend_id,
// 'content' => json_encode([
// 'title' => 'AI协同工单 - ' . $project->company_name,
// 'desc' => "您好,我们同事没有及时回复,你可以查看工单进度!",
// 'size' => 0,
// 'thumbSize' => 0,
// 'thumbUrl' => 'https://hub.globalso.com/logocm.png',
// 'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid
// ], JSON_UNESCAPED_UNICODE)
// ]);
// // 返回 $response 的相应内容以及网络状态码
// return response($response->body(), $response->status());
$project->pushWechatGroupMsg("您好,我们同事没有及时回复,你可以查看工单进度!");
return response()->json(['message' => '工单推送成功']);
}
}