作者 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 @@ -15,7 +15,7 @@ class FetchTicketProjects extends Command
15 * 15 *
16 * @var string 16 * @var string
17 */ 17 */
18 - protected $signature = 'workorder:fetch-ticket-projects {version}'; 18 + protected $signature = 'workorder:fetch-ticket-projects {action}}';
19 19
20 /** 20 /**
21 * The console command description. 21 * The console command description.
@@ -41,15 +41,8 @@ class FetchTicketProjects extends Command @@ -41,15 +41,8 @@ class FetchTicketProjects extends Command
41 */ 41 */
42 public function handle() 42 public function handle()
43 { 43 {
44 - $version = $this->argument('version');  
45 - if ($version == 'v5') {  
46 - $this->fetch_v5();  
47 - } elseif ($version == 'v6') {  
48 - $this->fetch_v6();  
49 - } else {  
50 - $this->error('Invalid action. Use "v5" or "v6".');  
51 - return 1;  
52 - } 44 + $action = $this->argument('action');
  45 + $this->$action();
53 return 0; 46 return 0;
54 } 47 }
55 48
@@ -58,7 +51,7 @@ class FetchTicketProjects extends Command @@ -58,7 +51,7 @@ class FetchTicketProjects extends Command
58 * @return void 51 * @return void
59 * 请求:https://www.quanqiusou.cn/extend_api/webs/globalso_all.php 52 * 请求:https://www.quanqiusou.cn/extend_api/webs/globalso_all.php
60 */ 53 */
61 - public function fetch_v5() 54 + public function fetchV5()
62 { 55 {
63 # pm 项目经理 assm 售后服务经理 56 # pm 项目经理 assm 售后服务经理
64 $response = Http::get('https://www.quanqiusou.cn/extend_api/webs/globalso_all.php'); 57 $response = Http::get('https://www.quanqiusou.cn/extend_api/webs/globalso_all.php');
@@ -68,22 +61,25 @@ class FetchTicketProjects extends Command @@ -68,22 +61,25 @@ class FetchTicketProjects extends Command
68 # V5: 版本号+postid 61 # V5: 版本号+postid
69 $uuid = md5("V5{$item['postid']}"); 62 $uuid = md5("V5{$item['postid']}");
70 $project = TicketProject::where('uuid', $uuid)->first(); 63 $project = TicketProject::where('uuid', $uuid)->first();
71 -  
72 - $item['pm'] = $item['pm'] == '未安排' ? '杨长远' : $item['pm'];  
73 - $item['assm'] = $item['assm'] == '未安排' ? '杨长远' : $item['assm'];  
74 - $item['yhs'] = $item['yhs'] == '未安排' ? '杨长远' : $item['yhs'];  
75 -  
76 - // 如果 $item['cate'] 包含”推广“字符,则$engineer_name = $item['assm']  
77 - $engineer_name = (strpos($item['cate'], '推广') !== false) ? $item['yhs'] : $item['assm']; 64 + $assm_id = Manage::where('name', $item['assm'])->value('id') ?? Manage::where('name', '张鸿飞')->value('id') ?? 0; //售后服务经理
  65 + $seom_id = Manage::where('name', $item['yhs'])->value('id') ?? Manage::where('name', '陶婵')->value('id') ?? 0; //优化师
  66 + // 如果 $item['cate'] 包含”推广“字符,则 $engineer_name = $item['assm']
  67 + /**
  68 + * 第一负责人逻即说明:
  69 + * 优化推广项目:找售后服务经理??鸿飞
  70 + * 建站类项目: 找杨长远
  71 + */
  72 + $engineer_id = (strpos($item['cate'], '推广') !== false) ? $assm_id : Manage::where('name', '杨长远')->value('id') ?? 0;
78 73
79 $fields = [ 74 $fields = [
80 - 'post_id' => $item['postid'],  
81 - 'company_name' => $item['company'],  
82 - 'title' => $item['title'],  
83 - 'engineer_id' => Manage::where('name', $engineer_name)->value('id') ?? 0, // 第一负责人  
84 - 'assm_id' => Manage::where('name', $item['assm'])->value('id') ?? 0, //售后服务经理  
85 - 'seom_id' => Manage::where('name', $item['yhs'])->value('id') ?? 0, //售后服务经理  
86 - 'website' => $item['main_url'] ?? '', 75 + 'post_id' => $item['postid'],
  76 + 'company_name' => $item['company'],
  77 + 'title' => $item['title'],
  78 + 'engineer_id' => $engineer_id, // 第一负责人
  79 + 'assm_id' => $assm_id,
  80 + 'seom_id' => $seom_id,
  81 + 'website' => $item['main_url'] ?? '',
  82 + 'is_del' => 0,
87 ]; 83 ];
88 if (!$project) { 84 if (!$project) {
89 $new = new TicketProject(); 85 $new = new TicketProject();
@@ -106,8 +102,13 @@ class FetchTicketProjects extends Command @@ -106,8 +102,13 @@ class FetchTicketProjects extends Command
106 $project->save(); 102 $project->save();
107 } 103 }
108 } 104 }
109 - echo "V5: {$item['postid']} - {$item['title']} - {$item['company']} - {$item['main_url']}\n";  
110 } 105 }
  106 + $postids = collect($items)->pluck('postid')->toArray();
  107 + // 软删除 gl_ticket_projects 中不存在的项目
  108 + TicketProject::where('version', 5)
  109 + ->whereNotIn('post_id', $postids)
  110 + ->update(['is_del' => 1]);
  111 + echo date("Y-m-d H:i:s") . " V5: fetch completed, total " . count($items) . " items\n";
111 } 112 }
112 } 113 }
113 114
@@ -116,12 +117,15 @@ class FetchTicketProjects extends Command @@ -116,12 +117,15 @@ class FetchTicketProjects extends Command
116 * 1. 按照ID升序查询 gl_project 表 limit 10 117 * 1. 按照ID升序查询 gl_project 表 limit 10
117 * 2。同步到 TicketProject 后,redis 缓存 ID 118 * 2。同步到 TicketProject 后,redis 缓存 ID
118 */ 119 */
119 - public function fetch_v6() 120 + public function fetchV6()
120 { 121 {
121 $lastid = 0; 122 $lastid = 0;
122 while (true) { 123 while (true) {
123 try { 124 try {
124 $items = Project::where('id', '>', intval($lastid)) 125 $items = Project::where('id', '>', intval($lastid))
  126 +// ->where('delete_status', 0)
  127 +// ->where('extend_type', '!=', 5) // 排除归档项目
  128 +// ->where('type', '!=', 8) // 排除归档项目
125 ->orderBy('id', 'asc') 129 ->orderBy('id', 'asc')
126 ->limit(10) 130 ->limit(10)
127 ->get(); 131 ->get();
@@ -130,16 +134,47 @@ class FetchTicketProjects extends Command @@ -130,16 +134,47 @@ class FetchTicketProjects extends Command
130 break; 134 break;
131 } 135 }
132 foreach ($items as $item) { 136 foreach ($items as $item) {
133 - $uuid = md5("V5{$item->id}"); 137 + $uuid = md5("V6{$item->id}");
134 $project = TicketProject::where('uuid', $uuid)->first(); 138 $project = TicketProject::where('uuid', $uuid)->first();
  139 + // 售后服务经理
  140 + $assm_id = collect([
  141 + $item->deploy_optimize->manager_mid ?? 0,
  142 + $item->deploy_optimize->tech_leader ?? 0,
  143 + Manage::where('name', '张鸿飞')->value('id') ?? 0,
  144 + 0
  145 + ])->first(fn($v) => $v !== null && $v !== 0, 0);
  146 + $seom_id = !empty($item->deploy_optimize->optimist_mid) ? $item->deploy_optimize->optimist_mid : $assm_id;
  147 + /**
  148 + * 第一负责人逻辑
  149 + * 建站类项目:找杨长远
  150 + * 推广类:找售后
  151 + */
  152 + if (in_array($item->type, [Project::TYPE_TWO, Project::TYPE_FOUR, Project::TYPE_SIX])) {
  153 + // 优化推广项目
  154 + $engineer_id = $assm_id;
  155 + } elseif ($item->type == Project::TYPE_THREE) {
  156 + $engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0; // 建站类项目找杨长远
  157 + } else {
  158 + $engineer_id = collect([
  159 + $item->deploy_build->manager_mid ?? 0,
  160 + $item->deploy_build->leader_mid ?? 0,
  161 + 0
  162 + ])->first(fn($v) => $v !== null && $v !== 0, 0);
  163 + }
  164 + $is_del = (
  165 + $item->extend_type == 5
  166 + || $item->type == 8
  167 + || $item->delete_status == 1
  168 + || $item->site_status == 1
  169 + ) ? 1 : 0;
  170 +
135 $fields = [ 171 $fields = [
136 - 'company_name' => $item->company,  
137 - 'title' => $item->title,  
138 - 'assm_id' => $item->type ==3 ? $item->deploy_optimize->manager_mid ?? 0 : $item->deploy_build->manager_mid ?? 0, // 售后服务经理  
139 - 'seom_id' => $item->deploy_optimize->optimist_mid ?? $item->deploy_optimize->manager_mid ?? $item->deploy_optimize->tech_leader ?? 0, // 优化推广负责人  
140 - 'engineer_id' => $item->type == 3 ?  
141 - $item->deploy_optimize->optimist_mid ?? $item->deploy_optimize->manager_mid ?? $item->deploy_optimize->tech_leader ?? 0  
142 - : $item->deploy_build->manager_mid ?? $item->deploy_build->leader_mid ?? 0, // 技术组长 172 + 'company_name' => $item->company,
  173 + 'title' => $item->title,
  174 + 'assm_id' => $assm_id,
  175 + 'seom_id' => $seom_id,
  176 + 'engineer_id' => $engineer_id,
  177 + 'is_del' => $is_del
143 ]; 178 ];
144 if (!$project) { 179 if (!$project) {
145 $project = new TicketProject(); 180 $project = new TicketProject();
@@ -151,7 +186,7 @@ class FetchTicketProjects extends Command @@ -151,7 +186,7 @@ class FetchTicketProjects extends Command
151 $project->$k = $v; 186 $project->$k = $v;
152 } 187 }
153 $project->save(); 188 $project->save();
154 - }else{ 189 + } else {
155 $changed = false; 190 $changed = false;
156 foreach ($fields as $k => $v) { 191 foreach ($fields as $k => $v) {
157 if ($project->$k != $v) { 192 if ($project->$k != $v) {
@@ -166,7 +201,35 @@ class FetchTicketProjects extends Command @@ -166,7 +201,35 @@ class FetchTicketProjects extends Command
166 $lastid = $item->id; 201 $lastid = $item->id;
167 echo date('Y-m-d H:i:s') . " V6: $item->id {$item->company} fetch ok \n"; 202 echo date('Y-m-d H:i:s') . " V6: $item->id {$item->company} fetch ok \n";
168 } 203 }
169 - }catch (\Exception $exception) { 204 + } catch (\Exception $exception) {
  205 + echo $exception;
  206 + break;
  207 + }
  208 + }
  209 + }
  210 +
  211 + public function fetch_uuid()
  212 + {
  213 + $lastid = 0;
  214 + while (true) {
  215 + try {
  216 + $items = TicketProject::where('id', '>', $lastid)
  217 + ->where('version', 6)
  218 + ->orderBy('id', 'asc')
  219 + ->limit(10)
  220 + ->get();
  221 + if ($items->isEmpty()) {
  222 + echo "not found items \n";
  223 + break;
  224 + }
  225 + foreach ($items as $item) {
  226 + $uuid = md5("V6{$item->table_id}");
  227 + $item->uuid = $uuid;
  228 + $item->save();
  229 + $lastid = $item->id;
  230 + echo date('Y-m-d H:i:s') . " V6: $item->id fetch ok \n";
  231 + }
  232 + } catch (\Exception $exception) {
170 echo $exception; 233 echo $exception;
171 break; 234 break;
172 } 235 }
1 <?php 1 <?php
2 2
3 -namespace App\Console\Commands; 3 +namespace App\Console\Commands\WorkOrder;
4 4
  5 +use App\Models\WorkOrder\TicketLog;
5 use App\Models\WorkOrder\WorkOrderLog; 6 use App\Models\WorkOrder\WorkOrderLog;
6 use App\Services\DingTalkService; 7 use App\Services\DingTalkService;
7 use Illuminate\Console\Command; 8 use Illuminate\Console\Command;
@@ -42,12 +43,12 @@ class WorkOrderDing extends Command @@ -42,12 +43,12 @@ class WorkOrderDing extends Command
42 { 43 {
43 while (true) { 44 while (true) {
44 try { 45 try {
45 - $log = WorkOrderLog::where('ding', 0)->first(); 46 + $log = TicketLog::where('ding', 0)->first();
46 if (!$log) { 47 if (!$log) {
47 sleep(3); 48 sleep(3);
48 continue; 49 continue;
49 } 50 }
50 - $mobile = $log->manager->mobile; 51 + $mobile = $log->engineer->mobile;
51 $response = Http::withBasicAuth( 52 $response = Http::withBasicAuth(
52 env('DINGDING_BASIC_USER'), 53 env('DINGDING_BASIC_USER'),
53 env('DINGDING_BASIC_PASS') 54 env('DINGDING_BASIC_PASS')
@@ -46,12 +46,9 @@ class TicketController extends BaseController @@ -46,12 +46,9 @@ class TicketController extends BaseController
46 $request->validated(); 46 $request->validated();
47 $project = TicketProject::where('uuid', $project_id)->first(); 47 $project = TicketProject::where('uuid', $project_id)->first();
48 if (!$project) return $this->error('未找到项目', 404); 48 if (!$project) return $this->error('未找到项目', 404);
49 - if ($project->version == 6){  
50 - if ($project->project->projectV6->delete_status) return $this->error('该项目已被删除', 400);  
51 - if ($project->project->projectV6->extend_type == 5) return $this->error('未续费', 400);  
52 - if ($project->project->projectV6->type == 8) return $this->error('项目已归档', 400);  
53 - if ($project->project->projectV6->site_status == 1) return $this->error('站点已关闭', 400);  
54 - } 49 + if ($project->is_del) return $this->error('项目状态异常', 400);
  50 + if (empty($project->engineer_id)) return $this->error('项目未分配工单负责人', 400);
  51 +
55 $result = DB::transaction(function () use ($request, $project) { 52 $result = DB::transaction(function () use ($request, $project) {
56 $ticket = new Tickets(); 53 $ticket = new Tickets();
57 $ticket->project_id = $project->id; 54 $ticket->project_id = $project->id;
@@ -68,21 +65,7 @@ class TicketController extends BaseController @@ -68,21 +65,7 @@ class TicketController extends BaseController
68 $ticket->submit_username = $request->input('submit_username'); 65 $ticket->submit_username = $request->input('submit_username');
69 $ticket->save(); 66 $ticket->save();
70 $log = new TicketLog(); 67 $log = new TicketLog();
71 - if ($project->version == 5){  
72 - # V5  
73 - $log->engineer_id = $project->engineer_id;  
74 - }else{  
75 - # V6 的项目  
76 - if ($project->projectV6->type == 3){  
77 - // 项目类型是优化推广,项目负责人找优化  
78 - $seo = $project->projectV6->deploy_optimize;  
79 - $log->engineer_id = $seo->manager_mid ?? $seo->optimist_mid ?? 0;  
80 - }else{  
81 - // 非优化推广项目,项目负责人找技术组长  
82 - $build = $project->projectV6->deploy_build;  
83 - $log->engineer_id = $build->leader_mid ?? 0;  
84 - }  
85 - } 68 + $log->engineer_id = $project->engineer_id; // 默认第一负责人
86 $ticket->logs()->save($log); 69 $ticket->logs()->save($log);
87 return $ticket; 70 return $ticket;
88 }); 71 });
@@ -107,12 +90,8 @@ class TicketController extends BaseController @@ -107,12 +90,8 @@ class TicketController extends BaseController
107 90
108 if ($ticket->project->uuid !== $project_id) return $this->error('无权限查看该工单', 403); 91 if ($ticket->project->uuid !== $project_id) return $this->error('无权限查看该工单', 403);
109 92
110 - if ($ticket->project->version == 6){  
111 - if ($ticket->project->projectV6->delete_status) return $this->error('该项目已被删除', 400);  
112 - if ($ticket->project->projectV6->extend_type == 5) return $this->error('未续费', 400);  
113 - if ($ticket->project->projectV6->type == 8) return $this->error('项目已归档', 400);  
114 - if ($ticket->project->projectV6->site_status == 1) return $this->error('站点已关闭', 400);  
115 - } 93 + if ($ticket->project->is_del) return $this->error('项目状态异常', 400);
  94 +
116 return response()->json(['data' => $ticket]); 95 return response()->json(['data' => $ticket]);
117 } 96 }
118 97
@@ -73,6 +73,7 @@ class AsideTicketController extends BaseController @@ -73,6 +73,7 @@ class AsideTicketController extends BaseController
73 $projects = TicketProject::with([ 73 $projects = TicketProject::with([
74 'projectV6:id,company,title', 74 'projectV6:id,company,title',
75 ]) 75 ])
  76 + ->where('is_del', 0)
76 ->where(function ($query) use ($search) { 77 ->where(function ($query) use ($search) {
77 $query->where('title', 'like', '%' . $search . '%') 78 $query->where('title', 'like', '%' . $search . '%')
78 ->orWhere('company_name', 'like', '%' . $search . '%') 79 ->orWhere('company_name', 'like', '%' . $search . '%')
@@ -95,12 +96,7 @@ class AsideTicketController extends BaseController @@ -95,12 +96,7 @@ class AsideTicketController extends BaseController
95 { 96 {
96 $request->validated(); 97 $request->validated();
97 $project = TicketProject::where('uuid', $request->input('project_id'))->first(); 98 $project = TicketProject::where('uuid', $request->input('project_id'))->first();
98 - if ($project->version == 6){  
99 - if ($project->projectV6->delete_status) $this->response('该项目已被删除', Code::USER_MODEL_NOTFOUND_ERROE);  
100 - if ($project->projectV6->extend_type == 5) $this->response('未续费', Code::USER_MODEL_NOTFOUND_ERROE);  
101 - if ($project->projectV6->type == 8) $this->response('项目已归档', Code::USER_MODEL_NOTFOUND_ERROE);  
102 - if ($project->projectV6->site_status == 1) $this->response('站点已关闭', Code::USER_MODEL_NOTFOUND_ERROE);  
103 - } 99 + if ($project->is_del) $this->response('该项目状态异常', Code::USER_MODEL_NOTFOUND_ERROE);
104 $result = DB::transaction(function () use ($request, $project) { 100 $result = DB::transaction(function () use ($request, $project) {
105 $ticket = new Tickets(); 101 $ticket = new Tickets();
106 $ticket->project_id = $project->id; 102 $ticket->project_id = $project->id;