作者 ZhengBing He

project_cate

... ... @@ -8,6 +8,7 @@ use App\Models\Project\Project;
use App\Models\WorkOrder\TicketProject;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class FetchTicketProjects extends Command
{
... ... @@ -83,6 +84,7 @@ class FetchTicketProjects extends Command
'test_website' => $item['test_url'] ?? '',
'is_del' => 0,
'plan' => $item['plan'] ?? '',
'project_cate' => 1,
];
if (!$project) {
$new = new TicketProject();
... ... @@ -177,6 +179,7 @@ class FetchTicketProjects extends Command
'test_website' => $item->deploy_build->test_domain ?? '',
'version' => empty($item->version) ? 7 : $item->version, // 版本号
'plan' => $item->planMap()[$item->deploy_build->plan] ?? '',
'project_cate' => 2,
];
if (!$project) {
$project = new TicketProject();
... ... @@ -209,6 +212,97 @@ class FetchTicketProjects extends Command
}
}
public function fetchAICC()
{
$lastid = 0;
while (true) {
try {
$response = Http::withBasicAuth('bill', 'bill@ai.cc')
->get('https://fob.ai.cc/api/tickets/projects', [
'lastid' => $lastid,
]);
$items = $response->json();
if (empty($items))
{
echo now() . " | INFO | not found items \n";
break;
}
foreach ($items as $item) {
$uuid = md5("AICC{$item['id']}");
$project = TicketProject::where('uuid', $uuid)->first();
// 判断套餐是超迹还是域途, 如果 $item['plans'][0]['name'] 包含 '超迹' 则为超迹,否则为域途
$project_cate = Str::contains($item['plans'][0]['name'], '超迹') ? 3 : 4;
print_r($item['cj_assm']);
print_r($item['yutu_assm']);
if ($project_cate == 3)
{
// 售后服务经理
$assm_id = collect([
ManageHr::where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
20, //徐莹
])->first(fn($v) => $v !== null && $v !== 0, 0);
}else
{
// 域途
$assm_id = collect([
ManageHr::where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
85, //黄小玉
])->first(fn($v) => $v !== null && $v !== 0, 0);
}
// 优化师
$seom_id = 0;
// 第一负责人
$engineer_id = $assm_id;
$is_del = 0;
$fields = [
'company_name' => $item['company'],
'title' => $item['plan'],
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'engineer_id' => $engineer_id,
'is_del' => $is_del,
'website' => '',
'test_website' => '',
'version' => 1, // 版本号
'plan' => $item['plans'][0]['name'] ?? '',
'project_cate' => $project_cate,
'wechat_group_id' => $item['chatroom'],
];
if (!$project) {
$project = new TicketProject();
$project->uuid = $uuid;
$project->post_id = $item['postid'];
$project->table_id = $item['id'];
foreach ($fields as $k => $v) {
$project->$k = $v;
}
$project->save();
} else {
$changed = false;
foreach ($fields as $k => $v) {
if ($project->$k != $v) {
$project->$k = $v;
$changed = true;
}
}
if ($changed) {
$project->save();
}
}
$lastid = $item['id'];
echo now() . " | INFO | AICC: {$item['id']} {$item['company']} fetch ok \n";
}
}catch (\Exception $exception){
echo now() . " | ERROR | " . $exception->getMessage() . "\n" . $exception->getTraceAsString() . "\n";
break;
}
}
}
public function fetch_uuid()
{
$lastid = 0;
... ...
... ... @@ -8,8 +8,10 @@ use App\Http\Requests\Api\WorkOrder\TicketStoreRequest;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Darabonba\GatewaySpi\Models\InterceptorContext\response;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
class TicketController extends BaseController
{
... ... @@ -149,4 +151,33 @@ class TicketController extends BaseController
if (!$project) return $this->response('未找到项目', 404);
return response()->json(['data' => $project]);
}
/**
* @param $friend_id
* @return void
* 企微群里@小超或艾丝,触发推送工单
* 接收群ID
*/
public function pushNotifyByBot($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());
}
}
... ...
... ... @@ -13,6 +13,7 @@ use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Models\Domain\DomainInfo;
use App\Models\Project\CountAllProject;
use Illuminate\Support\Facades\DB;
/**
* @remark :统计所有项目(4.0,5.0,6.0)
... ... @@ -46,6 +47,27 @@ class AllProjectController extends BaseController
$this->map['company'] = ['like','%'.$this->map['company'].'%'];
}
$data = $allProject->lists($this->map,$this->page,$this->row);
if (!empty($data['data'])) {
foreach ($data['data'] as $key => $value) {
$ticketProject = null;
if ($value['version'] == 1) {
// version 为 1:6.0
$ticketProject = DB::table('gl_ticket_projects')
->where('table_id', $value['project_id'])
->where('project_cate', 2)
->first();
} else {
// version 不为 1
$ticketProject = DB::table('gl_ticket_projects')
->where('post_id', $value['project_id'])
->where('project_cate', 1)
->first();
}
$data['data'][$key]['uuid'] = $ticketProject ? $ticketProject->uuid : null;
}
}
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
... ... @@ -8,13 +8,13 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Models\Workchat\MessagePush;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Illuminate\Support\Facades\DB;
class AsideTicketController extends BaseController
{
/**
... ... @@ -249,7 +249,7 @@ class AsideTicketController extends BaseController
'desc' => $ticket ? $ticket->title : "工单列表",
'size' => 0,
'thumbSize' => 0,
'thumbUrl' => 'https://oa.quanqiusou.cn/logo.ico',
'thumbUrl' => 'https://hub.globalso.com/logocm.png',
'url' => 'https://oa.quanqiusou.cn/afterorder?project_id='.$project->uuid
], JSON_UNESCAPED_UNICODE);
$message_push->send_time = now();
... ... @@ -262,4 +262,5 @@ class AsideTicketController extends BaseController
}
$this->response('success', Code::SUCCESS);
}
}
... ...
... ... @@ -25,7 +25,8 @@ class TicketProjectListRequest extends FormRequest
{
return [
'search' => 'nullable|string', // 搜索关键词
'version' => 'nullable|in:5,6,7', // 版本号
'project_cate' => 'nullable|in:1,2,3,4', // 项目分类:1V5,2V6,3超迹,4域途
'version' => 'nullable|integer', // 版本号
];
}
}
... ...
... ... @@ -85,4 +85,5 @@ Route::prefix('tickets')->group(function () {
Route::get('/{project_id}/{id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'show'])->summary('B端,渠道-工单详情')->name('tickets.show');
Route::get('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'index'])->summary('B端,渠道-工单聊天记录')->name('tickets.chat.index');
Route::post('/chat/{project_id}/{ticket_id}', [\App\Http\Controllers\Api\WorkOrder\TicketChatController::class, 'store'])->summary('B端,渠道-工单聊天记录提交')->name('tickets.chat.store');
Route::get('/pushNotifyByBot/{friend_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'pushNotifyByBot'])->summary('企微群@机器人触发工单推送')->name('tickets.pushNotifyByBot');
});
... ...
... ... @@ -256,7 +256,8 @@ Route::middleware(['aloginauth'])->group(function () {
Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');
Route::get('/pushNotify/{id}', [Aside\WorkOrder\AsideTicketController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群');
Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表');
Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表');
Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表')
->description("project_cate[项目分类1]: 1 V5, 2 V6, 3 超迹, 4 域途");
Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单');
Route::get('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'index'])->name('admin.tickets.chat.index')->summary('A端工单聊天记录');
Route::post('/chat/{ticket_id}', [Aside\WorkOrder\TicketChatController::class, 'store'])->name('admin.tickets.chat.store')->summary('A端工单聊天记录创建');
... ...