作者 ZhengBing He

project_cate

@@ -8,6 +8,7 @@ use App\Models\Project\Project; @@ -8,6 +8,7 @@ use App\Models\Project\Project;
8 use App\Models\WorkOrder\TicketProject; 8 use App\Models\WorkOrder\TicketProject;
9 use Illuminate\Console\Command; 9 use Illuminate\Console\Command;
10 use Illuminate\Support\Facades\Http; 10 use Illuminate\Support\Facades\Http;
  11 +use Illuminate\Support\Str;
11 12
12 class FetchTicketProjects extends Command 13 class FetchTicketProjects extends Command
13 { 14 {
@@ -83,6 +84,7 @@ class FetchTicketProjects extends Command @@ -83,6 +84,7 @@ class FetchTicketProjects extends Command
83 'test_website' => $item['test_url'] ?? '', 84 'test_website' => $item['test_url'] ?? '',
84 'is_del' => 0, 85 'is_del' => 0,
85 'plan' => $item['plan'] ?? '', 86 'plan' => $item['plan'] ?? '',
  87 + 'project_cate' => 1,
86 ]; 88 ];
87 if (!$project) { 89 if (!$project) {
88 $new = new TicketProject(); 90 $new = new TicketProject();
@@ -177,6 +179,7 @@ class FetchTicketProjects extends Command @@ -177,6 +179,7 @@ class FetchTicketProjects extends Command
177 'test_website' => $item->deploy_build->test_domain ?? '', 179 'test_website' => $item->deploy_build->test_domain ?? '',
178 'version' => empty($item->version) ? 7 : $item->version, // 版本号 180 'version' => empty($item->version) ? 7 : $item->version, // 版本号
179 'plan' => $item->planMap()[$item->deploy_build->plan] ?? '', 181 'plan' => $item->planMap()[$item->deploy_build->plan] ?? '',
  182 + 'project_cate' => 2,
180 ]; 183 ];
181 if (!$project) { 184 if (!$project) {
182 $project = new TicketProject(); 185 $project = new TicketProject();
@@ -209,6 +212,97 @@ class FetchTicketProjects extends Command @@ -209,6 +212,97 @@ class FetchTicketProjects extends Command
209 } 212 }
210 } 213 }
211 214
  215 + public function fetchAICC()
  216 + {
  217 + $lastid = 0;
  218 + while (true) {
  219 + try {
  220 + $response = Http::withBasicAuth('bill', 'bill@ai.cc')
  221 + ->get('https://fob.ai.cc/api/tickets/projects', [
  222 + 'lastid' => $lastid,
  223 + ]);
  224 + $items = $response->json();
  225 + if (empty($items))
  226 + {
  227 + echo now() . " | INFO | not found items \n";
  228 + break;
  229 + }
  230 +
  231 + foreach ($items as $item) {
  232 + $uuid = md5("AICC{$item['id']}");
  233 + $project = TicketProject::where('uuid', $uuid)->first();
  234 + // 判断套餐是超迹还是域途, 如果 $item['plans'][0]['name'] 包含 '超迹' 则为超迹,否则为域途
  235 + $project_cate = Str::contains($item['plans'][0]['name'], '超迹') ? 3 : 4;
  236 + print_r($item['cj_assm']);
  237 + print_r($item['yutu_assm']);
  238 + if ($project_cate == 3)
  239 + {
  240 + // 售后服务经理
  241 + $assm_id = collect([
  242 + ManageHr::where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
  243 + 20, //徐莹
  244 + ])->first(fn($v) => $v !== null && $v !== 0, 0);
  245 + }else
  246 + {
  247 + // 域途
  248 + $assm_id = collect([
  249 + ManageHr::where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
  250 + 85, //黄小玉
  251 + ])->first(fn($v) => $v !== null && $v !== 0, 0);
  252 + }
  253 +
  254 + // 优化师
  255 + $seom_id = 0;
  256 + // 第一负责人
  257 + $engineer_id = $assm_id;
  258 + $is_del = 0;
  259 +
  260 + $fields = [
  261 + 'company_name' => $item['company'],
  262 + 'title' => $item['plan'],
  263 + 'assm_id' => $assm_id,
  264 + 'seom_id' => $seom_id,
  265 + 'engineer_id' => $engineer_id,
  266 + 'is_del' => $is_del,
  267 + 'website' => '',
  268 + 'test_website' => '',
  269 + 'version' => 1, // 版本号
  270 + 'plan' => $item['plans'][0]['name'] ?? '',
  271 + 'project_cate' => $project_cate,
  272 + 'wechat_group_id' => $item['chatroom'],
  273 + ];
  274 +
  275 + if (!$project) {
  276 + $project = new TicketProject();
  277 + $project->uuid = $uuid;
  278 + $project->post_id = $item['postid'];
  279 + $project->table_id = $item['id'];
  280 + foreach ($fields as $k => $v) {
  281 + $project->$k = $v;
  282 + }
  283 + $project->save();
  284 + } else {
  285 + $changed = false;
  286 + foreach ($fields as $k => $v) {
  287 + if ($project->$k != $v) {
  288 + $project->$k = $v;
  289 + $changed = true;
  290 + }
  291 + }
  292 + if ($changed) {
  293 + $project->save();
  294 + }
  295 + }
  296 + $lastid = $item['id'];
  297 + echo now() . " | INFO | AICC: {$item['id']} {$item['company']} fetch ok \n";
  298 + }
  299 + }catch (\Exception $exception){
  300 + echo now() . " | ERROR | " . $exception->getMessage() . "\n" . $exception->getTraceAsString() . "\n";
  301 + break;
  302 + }
  303 + }
  304 + }
  305 +
212 public function fetch_uuid() 306 public function fetch_uuid()
213 { 307 {
214 $lastid = 0; 308 $lastid = 0;
@@ -8,8 +8,10 @@ use App\Http\Requests\Api\WorkOrder\TicketStoreRequest; @@ -8,8 +8,10 @@ use App\Http\Requests\Api\WorkOrder\TicketStoreRequest;
8 use App\Models\WorkOrder\TicketLog; 8 use App\Models\WorkOrder\TicketLog;
9 use App\Models\WorkOrder\TicketProject; 9 use App\Models\WorkOrder\TicketProject;
10 use App\Models\WorkOrder\Tickets; 10 use App\Models\WorkOrder\Tickets;
  11 +use Darabonba\GatewaySpi\Models\InterceptorContext\response;
11 use Illuminate\Http\Request; 12 use Illuminate\Http\Request;
12 use Illuminate\Support\Facades\DB; 13 use Illuminate\Support\Facades\DB;
  14 +use Illuminate\Support\Facades\Http;
13 15
14 class TicketController extends BaseController 16 class TicketController extends BaseController
15 { 17 {
@@ -149,4 +151,33 @@ class TicketController extends BaseController @@ -149,4 +151,33 @@ class TicketController extends BaseController
149 if (!$project) return $this->response('未找到项目', 404); 151 if (!$project) return $this->response('未找到项目', 404);
150 return response()->json(['data' => $project]); 152 return response()->json(['data' => $project]);
151 } 153 }
  154 +
  155 + /**
  156 + * @param $friend_id
  157 + * @return void
  158 + * 企微群里@小超或艾丝,触发推送工单
  159 + * 接收群ID
  160 + */
  161 + public function pushNotifyByBot($friend_id)
  162 + {
  163 + $project = TicketProject::where('wechat_group_id', $friend_id)->where('is_del', 0)->first();
  164 + if (!$project)
  165 + return response()->json(['message' => '未找到对应的工单项目'], 404);
  166 +
  167 + $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';
  168 + $response = Http::post($url, [
  169 + 'type' => 'Link',
  170 + 'friend_id' => $friend_id,
  171 + 'content' => json_encode([
  172 + 'title' => 'AI协同工单 - ' . $project->company_name,
  173 + 'desc' => "您好,我们同事没有及时回复,你可以查看工单进度!",
  174 + 'size' => 0,
  175 + 'thumbSize' => 0,
  176 + 'thumbUrl' => 'https://hub.globalso.com/logocm.png',
  177 + 'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid
  178 + ], JSON_UNESCAPED_UNICODE)
  179 + ]);
  180 + // 返回 $response 的相应内容以及网络状态码
  181 + return response($response->body(), $response->status());
  182 + }
152 } 183 }
@@ -13,6 +13,7 @@ use App\Enums\Common\Code; @@ -13,6 +13,7 @@ use App\Enums\Common\Code;
13 use App\Http\Controllers\Aside\BaseController; 13 use App\Http\Controllers\Aside\BaseController;
14 use App\Models\Domain\DomainInfo; 14 use App\Models\Domain\DomainInfo;
15 use App\Models\Project\CountAllProject; 15 use App\Models\Project\CountAllProject;
  16 +use Illuminate\Support\Facades\DB;
16 17
17 /** 18 /**
18 * @remark :统计所有项目(4.0,5.0,6.0) 19 * @remark :统计所有项目(4.0,5.0,6.0)
@@ -46,6 +47,27 @@ class AllProjectController extends BaseController @@ -46,6 +47,27 @@ class AllProjectController extends BaseController
46 $this->map['company'] = ['like','%'.$this->map['company'].'%']; 47 $this->map['company'] = ['like','%'.$this->map['company'].'%'];
47 } 48 }
48 $data = $allProject->lists($this->map,$this->page,$this->row); 49 $data = $allProject->lists($this->map,$this->page,$this->row);
  50 +
  51 + if (!empty($data['data'])) {
  52 + foreach ($data['data'] as $key => $value) {
  53 + $ticketProject = null;
  54 + if ($value['version'] == 1) {
  55 + // version 为 1:6.0
  56 + $ticketProject = DB::table('gl_ticket_projects')
  57 + ->where('table_id', $value['project_id'])
  58 + ->where('project_cate', 2)
  59 + ->first();
  60 + } else {
  61 + // version 不为 1
  62 + $ticketProject = DB::table('gl_ticket_projects')
  63 + ->where('post_id', $value['project_id'])
  64 + ->where('project_cate', 1)
  65 + ->first();
  66 + }
  67 + $data['data'][$key]['uuid'] = $ticketProject ? $ticketProject->uuid : null;
  68 + }
  69 + }
  70 +
49 $this->response('success',Code::SUCCESS,$data); 71 $this->response('success',Code::SUCCESS,$data);
50 } 72 }
51 } 73 }
@@ -8,13 +8,13 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest; @@ -8,13 +8,13 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest;
8 use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest; 8 use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
9 use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest; 9 use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
10 use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest; 10 use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest;
11 -use App\Models\ProjectAssociation\ProjectAssociation;  
12 use App\Models\Workchat\MessagePush; 11 use App\Models\Workchat\MessagePush;
13 use App\Models\WorkOrder\TicketLog; 12 use App\Models\WorkOrder\TicketLog;
14 use App\Models\WorkOrder\TicketProject; 13 use App\Models\WorkOrder\TicketProject;
15 use App\Models\WorkOrder\Tickets; 14 use App\Models\WorkOrder\Tickets;
16 use Illuminate\Support\Facades\DB; 15 use Illuminate\Support\Facades\DB;
17 16
  17 +
18 class AsideTicketController extends BaseController 18 class AsideTicketController extends BaseController
19 { 19 {
20 /** 20 /**
@@ -249,7 +249,7 @@ class AsideTicketController extends BaseController @@ -249,7 +249,7 @@ class AsideTicketController extends BaseController
249 'desc' => $ticket ? $ticket->title : "工单列表", 249 'desc' => $ticket ? $ticket->title : "工单列表",
250 'size' => 0, 250 'size' => 0,
251 'thumbSize' => 0, 251 'thumbSize' => 0,
252 - 'thumbUrl' => 'https://oa.quanqiusou.cn/logo.ico', 252 + 'thumbUrl' => 'https://hub.globalso.com/logocm.png',
253 'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid 253 'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid
254 ], JSON_UNESCAPED_UNICODE); 254 ], JSON_UNESCAPED_UNICODE);
255 $message_push->send_time = now(); 255 $message_push->send_time = now();
@@ -262,4 +262,5 @@ class AsideTicketController extends BaseController @@ -262,4 +262,5 @@ class AsideTicketController extends BaseController
262 } 262 }
263 $this->response('success', Code::SUCCESS); 263 $this->response('success', Code::SUCCESS);
264 } 264 }
  265 +
265 } 266 }
@@ -25,7 +25,8 @@ class TicketProjectListRequest extends FormRequest @@ -25,7 +25,8 @@ class TicketProjectListRequest extends FormRequest
25 { 25 {
26 return [ 26 return [
27 'search' => 'nullable|string', // 搜索关键词 27 'search' => 'nullable|string', // 搜索关键词
28 - 'version' => 'nullable|in:5,6,7', // 版本号 28 + 'project_cate' => 'nullable|in:1,2,3,4', // 项目分类:1V5,2V6,3超迹,4域途
  29 + 'version' => 'nullable|integer', // 版本号
29 ]; 30 ];
30 } 31 }
31 } 32 }
@@ -85,4 +85,5 @@ Route::prefix('tickets')->group(function () { @@ -85,4 +85,5 @@ Route::prefix('tickets')->group(function () {
85 Route::get('/{project_id}/{id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'show'])->summary('B端,渠道-工单详情')->name('tickets.show'); 85 Route::get('/{project_id}/{id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'show'])->summary('B端,渠道-工单详情')->name('tickets.show');
86 Route::get('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'index'])->summary('B端,渠道-工单聊天记录')->name('tickets.chat.index'); 86 Route::get('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'index'])->summary('B端,渠道-工单聊天记录')->name('tickets.chat.index');
87 Route::post('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'store'])->summary('B端,渠道-工单聊天记录提交')->name('tickets.chat.store'); 87 Route::post('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'store'])->summary('B端,渠道-工单聊天记录提交')->name('tickets.chat.store');
  88 + Route::get('/pushNotifyByBot/{friend_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'pushNotifyByBot'])->summary('企微群@机器人触发工单推送')->name('tickets.pushNotifyByBot');
88 }); 89 });
@@ -256,7 +256,8 @@ Route::middleware(['aloginauth'])->group(function () { @@ -256,7 +256,8 @@ Route::middleware(['aloginauth'])->group(function () {
256 Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事'); 256 Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');
257 Route::get('/pushNotify/{id}', [Aside\WorkOrder\AsideTicketController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群'); 257 Route::get('/pushNotify/{id}', [Aside\WorkOrder\AsideTicketController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群');
258 Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表'); 258 Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表');
259 - Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表'); 259 + Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表')
  260 + ->description("project_cate[项目分类1]: 1 V5, 2 V6, 3 超迹, 4 域途");
260 Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单'); 261 Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单');
261 Route::get('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'index'])->name('admin.tickets.chat.index')->summary('A端工单聊天记录'); 262 Route::get('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'index'])->name('admin.tickets.chat.index')->summary('A端工单聊天记录');
262 Route::post('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'store'])->name('admin.tickets.chat.store')->summary('A端工单聊天记录创建'); 263 Route::post('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'store'])->name('admin.tickets.chat.store')->summary('A端工单聊天记录创建');