作者 lyh

Merge branch 'master' of http://47.244.231.31:8099/zhl/globalso-v6 into lyh-server

... ... @@ -15,7 +15,7 @@ class FetchTicketProjects extends Command
*
* @var string
*/
protected $signature = 'workorder:fetch-ticket-projects {version}';
protected $signature = 'workorder:fetch-ticket-projects {action}}';
/**
* The console command description.
... ... @@ -41,15 +41,8 @@ class FetchTicketProjects extends Command
*/
public function handle()
{
$version = $this->argument('version');
if ($version == 'v5') {
$this->fetch_v5();
} elseif ($version == 'v6') {
$this->fetch_v6();
} else {
$this->error('Invalid action. Use "v5" or "v6".');
return 1;
}
$action = $this->argument('action');
$this->$action();
return 0;
}
... ... @@ -58,7 +51,7 @@ class FetchTicketProjects extends Command
* @return void
* 请求:https://www.quanqiusou.cn/extend_api/webs/globalso_all.php
*/
public function fetch_v5()
public function fetchV5()
{
# pm 项目经理 assm 售后服务经理
$response = Http::get('https://www.quanqiusou.cn/extend_api/webs/globalso_all.php');
... ... @@ -68,22 +61,25 @@ class FetchTicketProjects extends Command
# V5: 版本号+postid
$uuid = md5("V5{$item['postid']}");
$project = TicketProject::where('uuid', $uuid)->first();
$item['pm'] = $item['pm'] == '未安排' ? '杨长远' : $item['pm'];
$item['assm'] = $item['assm'] == '未安排' ? '杨长远' : $item['assm'];
$item['yhs'] = $item['yhs'] == '未安排' ? '杨长远' : $item['yhs'];
// 如果 $item['cate'] 包含”推广“字符,则$engineer_name = $item['assm']
$engineer_name = (strpos($item['cate'], '推广') !== false) ? $item['yhs'] : $item['assm'];
$assm_id = Manage::where('name', $item['assm'])->value('id') ?? Manage::where('name', '张鸿飞')->value('id') ?? 0; //售后服务经理
$seom_id = Manage::where('name', $item['yhs'])->value('id') ?? Manage::where('name', '陶婵')->value('id') ?? 0; //优化师
// 如果 $item['cate'] 包含”推广“字符,则 $engineer_name = $item['assm']
/**
* 第一负责人逻即说明:
* 优化推广项目:找售后服务经理??鸿飞
* 建站类项目: 找杨长远
*/
$engineer_id = (strpos($item['cate'], '推广') !== false) ? $assm_id : Manage::where('name', '杨长远')->value('id') ?? 0;
$fields = [
'post_id' => $item['postid'],
'company_name' => $item['company'],
'title' => $item['title'],
'engineer_id' => Manage::where('name', $engineer_name)->value('id') ?? 0, // 第一负责人
'assm_id' => Manage::where('name', $item['assm'])->value('id') ?? 0, //售后服务经理
'seom_id' => Manage::where('name', $item['yhs'])->value('id') ?? 0, //售后服务经理
'website' => $item['main_url'] ?? '',
'post_id' => $item['postid'],
'company_name' => $item['company'],
'title' => $item['title'],
'engineer_id' => $engineer_id, // 第一负责人
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'website' => $item['main_url'] ?? '',
'is_del' => 0,
];
if (!$project) {
$new = new TicketProject();
... ... @@ -106,8 +102,13 @@ class FetchTicketProjects extends Command
$project->save();
}
}
echo "V5: {$item['postid']} - {$item['title']} - {$item['company']} - {$item['main_url']}\n";
}
$postids = collect($items)->pluck('postid')->toArray();
// 软删除 gl_ticket_projects 中不存在的项目
TicketProject::where('version', 5)
->whereNotIn('post_id', $postids)
->update(['is_del' => 1]);
echo date("Y-m-d H:i:s") . " V5: fetch completed, total " . count($items) . " items\n";
}
}
... ... @@ -116,12 +117,15 @@ class FetchTicketProjects extends Command
* 1. 按照ID升序查询 gl_project 表 limit 10
* 2。同步到 TicketProject 后,redis 缓存 ID
*/
public function fetch_v6()
public function fetchV6()
{
$lastid = 0;
while (true) {
try {
$items = Project::where('id', '>', intval($lastid))
// ->where('delete_status', 0)
// ->where('extend_type', '!=', 5) // 排除归档项目
// ->where('type', '!=', 8) // 排除归档项目
->orderBy('id', 'asc')
->limit(10)
->get();
... ... @@ -130,16 +134,47 @@ class FetchTicketProjects extends Command
break;
}
foreach ($items as $item) {
$uuid = md5("V5{$item->id}");
$uuid = md5("V6{$item->id}");
$project = TicketProject::where('uuid', $uuid)->first();
// 售后服务经理
$assm_id = collect([
$item->deploy_optimize->manager_mid ?? 0,
$item->deploy_optimize->tech_leader ?? 0,
Manage::where('name', '张鸿飞')->value('id') ?? 0,
0
])->first(fn($v) => $v !== null && $v !== 0, 0);
$seom_id = !empty($item->deploy_optimize->optimist_mid) ? $item->deploy_optimize->optimist_mid : $assm_id;
/**
* 第一负责人逻辑
* 建站类项目:找杨长远
* 推广类:找售后
*/
if (in_array($item->type, [Project::TYPE_TWO, Project::TYPE_FOUR, Project::TYPE_SIX])) {
// 优化推广项目
$engineer_id = $assm_id;
} elseif ($item->type == Project::TYPE_THREE) {
$engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0; // 建站类项目找杨长远
} else {
$engineer_id = collect([
$item->deploy_build->manager_mid ?? 0,
$item->deploy_build->leader_mid ?? 0,
0
])->first(fn($v) => $v !== null && $v !== 0, 0);
}
$is_del = (
$item->extend_type == 5
|| $item->type == 8
|| $item->delete_status == 1
|| $item->site_status == 1
) ? 1 : 0;
$fields = [
'company_name' => $item->company,
'title' => $item->title,
'assm_id' => $item->type ==3 ? $item->deploy_optimize->manager_mid ?? 0 : $item->deploy_build->manager_mid ?? 0, // 售后服务经理
'seom_id' => $item->deploy_optimize->optimist_mid ?? $item->deploy_optimize->manager_mid ?? $item->deploy_optimize->tech_leader ?? 0, // 优化推广负责人
'engineer_id' => $item->type == 3 ?
$item->deploy_optimize->optimist_mid ?? $item->deploy_optimize->manager_mid ?? $item->deploy_optimize->tech_leader ?? 0
: $item->deploy_build->manager_mid ?? $item->deploy_build->leader_mid ?? 0, // 技术组长
'company_name' => $item->company,
'title' => $item->title,
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'engineer_id' => $engineer_id,
'is_del' => $is_del
];
if (!$project) {
$project = new TicketProject();
... ... @@ -151,7 +186,7 @@ class FetchTicketProjects extends Command
$project->$k = $v;
}
$project->save();
}else{
} else {
$changed = false;
foreach ($fields as $k => $v) {
if ($project->$k != $v) {
... ... @@ -166,7 +201,35 @@ class FetchTicketProjects extends Command
$lastid = $item->id;
echo date('Y-m-d H:i:s') . " V6: $item->id {$item->company} fetch ok \n";
}
}catch (\Exception $exception) {
} catch (\Exception $exception) {
echo $exception;
break;
}
}
}
public function fetch_uuid()
{
$lastid = 0;
while (true) {
try {
$items = TicketProject::where('id', '>', $lastid)
->where('version', 6)
->orderBy('id', 'asc')
->limit(10)
->get();
if ($items->isEmpty()) {
echo "not found items \n";
break;
}
foreach ($items as $item) {
$uuid = md5("V6{$item->table_id}");
$item->uuid = $uuid;
$item->save();
$lastid = $item->id;
echo date('Y-m-d H:i:s') . " V6: $item->id fetch ok \n";
}
} catch (\Exception $exception) {
echo $exception;
break;
}
... ...
<?php
namespace App\Console\Commands;
namespace App\Console\Commands\WorkOrder;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\WorkOrderLog;
use App\Services\DingTalkService;
use Illuminate\Console\Command;
... ... @@ -42,12 +43,12 @@ class WorkOrderDing extends Command
{
while (true) {
try {
$log = WorkOrderLog::where('ding', 0)->first();
$log = TicketLog::where('ding', 0)->first();
if (!$log) {
sleep(3);
continue;
}
$mobile = $log->manager->mobile;
$mobile = $log->engineer->mobile;
$response = Http::withBasicAuth(
env('DINGDING_BASIC_USER'),
env('DINGDING_BASIC_PASS')
... ...
... ... @@ -46,12 +46,9 @@ class TicketController extends BaseController
$request->validated();
$project = TicketProject::where('uuid', $project_id)->first();
if (!$project) return $this->error('未找到项目', 404);
if ($project->version == 6){
if ($project->project->projectV6->delete_status) return $this->error('该项目已被删除', 400);
if ($project->project->projectV6->extend_type == 5) return $this->error('未续费', 400);
if ($project->project->projectV6->type == 8) return $this->error('项目已归档', 400);
if ($project->project->projectV6->site_status == 1) return $this->error('站点已关闭', 400);
}
if ($project->is_del) return $this->error('项目状态异常', 400);
if (empty($project->engineer_id)) return $this->error('项目未分配工单负责人', 400);
$result = DB::transaction(function () use ($request, $project) {
$ticket = new Tickets();
$ticket->project_id = $project->id;
... ... @@ -68,21 +65,7 @@ class TicketController extends BaseController
$ticket->submit_username = $request->input('submit_username');
$ticket->save();
$log = new TicketLog();
if ($project->version == 5){
# V5
$log->engineer_id = $project->engineer_id;
}else{
# V6 的项目
if ($project->projectV6->type == 3){
// 项目类型是优化推广,项目负责人找优化
$seo = $project->projectV6->deploy_optimize;
$log->engineer_id = $seo->manager_mid ?? $seo->optimist_mid ?? 0;
}else{
// 非优化推广项目,项目负责人找技术组长
$build = $project->projectV6->deploy_build;
$log->engineer_id = $build->leader_mid ?? 0;
}
}
$log->engineer_id = $project->engineer_id; // 默认第一负责人
$ticket->logs()->save($log);
return $ticket;
});
... ... @@ -107,12 +90,8 @@ class TicketController extends BaseController
if ($ticket->project->uuid !== $project_id) return $this->error('无权限查看该工单', 403);
if ($ticket->project->version == 6){
if ($ticket->project->projectV6->delete_status) return $this->error('该项目已被删除', 400);
if ($ticket->project->projectV6->extend_type == 5) return $this->error('未续费', 400);
if ($ticket->project->projectV6->type == 8) return $this->error('项目已归档', 400);
if ($ticket->project->projectV6->site_status == 1) return $this->error('站点已关闭', 400);
}
if ($ticket->project->is_del) return $this->error('项目状态异常', 400);
return response()->json(['data' => $ticket]);
}
... ...
... ... @@ -73,6 +73,7 @@ class AsideTicketController extends BaseController
$projects = TicketProject::with([
'projectV6:id,company,title',
])
->where('is_del', 0)
->where(function ($query) use ($search) {
$query->where('title', 'like', '%' . $search . '%')
->orWhere('company_name', 'like', '%' . $search . '%')
... ... @@ -95,12 +96,7 @@ class AsideTicketController extends BaseController
{
$request->validated();
$project = TicketProject::where('uuid', $request->input('project_id'))->first();
if ($project->version == 6){
if ($project->projectV6->delete_status) $this->response('该项目已被删除', Code::USER_MODEL_NOTFOUND_ERROE);
if ($project->projectV6->extend_type == 5) $this->response('未续费', Code::USER_MODEL_NOTFOUND_ERROE);
if ($project->projectV6->type == 8) $this->response('项目已归档', Code::USER_MODEL_NOTFOUND_ERROE);
if ($project->projectV6->site_status == 1) $this->response('站点已关闭', Code::USER_MODEL_NOTFOUND_ERROE);
}
if ($project->is_del) $this->response('该项目状态异常', Code::USER_MODEL_NOTFOUND_ERROE);
$result = DB::transaction(function () use ($request, $project) {
$ticket = new Tickets();
$ticket->project_id = $project->id;
... ...