作者 ZhengBing He

Merge remote-tracking branch 'origin/master' into workorder

@@ -23,6 +23,7 @@ use App\Models\Project\ProjectWhiteHatAffix; @@ -23,6 +23,7 @@ use App\Models\Project\ProjectWhiteHatAffix;
23 use App\Models\Template\BTemplateMain; 23 use App\Models\Template\BTemplateMain;
24 use App\Models\Template\TemplateTypeMain; 24 use App\Models\Template\TemplateTypeMain;
25 use App\Models\WebSetting\WebSetting; 25 use App\Models\WebSetting\WebSetting;
  26 +use App\Models\WorkOrder\TicketLog;
26 use App\Models\WorkOrder\Tickets; 27 use App\Models\WorkOrder\Tickets;
27 use App\Services\AiBlogService; 28 use App\Services\AiBlogService;
28 use App\Services\CosService; 29 use App\Services\CosService;
@@ -51,11 +52,11 @@ class lyhDemo extends Command @@ -51,11 +52,11 @@ class lyhDemo extends Command
51 public function handle(){ 52 public function handle(){
52 echo 'start.'. PHP_EOL; 53 echo 'start.'. PHP_EOL;
53 $ticketModel = new Tickets(); 54 $ticketModel = new Tickets();
54 - $list = $ticketModel->list(['end_at'=>['!=',null]],'id',['id','created_at','end_at']); 55 + $list = $ticketModel->list(['id'=>['!=',0]],'id',['id','plan_end_at']);
55 foreach ($list as $item){ 56 foreach ($list as $item){
56 - echo '执行的任务id:'.$item['id'].PHP_EOL;  
57 - $end_time = diffInHours($item['created_at'],$item['end_at']);  
58 - $ticketModel->edit(['end_time'=>$end_time],['id'=>$item['id']]); 57 + echo '执行数据id:'.$item['id'].PHP_EOL;
  58 + $ticketLogModel = new TicketLog();
  59 + $ticketLogModel->edit(['plan_end_at'=>$item['plan_end_at']],['ticket_id'=>$item['id']]);
59 } 60 }
60 return true; 61 return true;
61 } 62 }
@@ -46,12 +46,11 @@ class RankDataLog extends BaseCommands @@ -46,12 +46,11 @@ class RankDataLog extends BaseCommands
46 { 46 {
47 while (true) { 47 while (true) {
48 $log_id = Redis::rpop('rank_data_task'); 48 $log_id = Redis::rpop('rank_data_task');
49 -  
50 if (!$log_id) { 49 if (!$log_id) {
51 - $log = RankDataLogModel::where('status', 0)->first();  
52 - }else{  
53 - $log = RankDataLogModel::where('id', $log_id)->where('status', 0)->first(); 50 + $log_id = RankDataLogModel::where('status', 0)->value('id');
54 } 51 }
  52 + $log = RankDataLogModel::where('id', $log_id)->where('status', 0)->first();
  53 +
55 if(!$log){ 54 if(!$log){
56 sleep(10); 55 sleep(10);
57 continue; 56 continue;
@@ -59,14 +59,15 @@ class RerunSeoTdk extends Command @@ -59,14 +59,15 @@ class RerunSeoTdk extends Command
59 */ 59 */
60 public function handle() 60 public function handle()
61 { 61 {
62 - $where = [  
63 - 'id' => 624  
64 - ];  
65 - $project_ids = Project::where('type', Project::TYPE_TWO)->where($where)->pluck('id')->toArray(); 62 + $project_ids = Project::where('type', Project::TYPE_TWO)->where('site_status',0)->where('extend_type',0)->where('delete_status',0)->where('tag_page_version', '>' ,1)->where('uptime', '<=', date('Y-m-d H:i:s'))->pluck('id')->toArray();
66 foreach ($project_ids as $project_id){ 63 foreach ($project_ids as $project_id){
67 try { 64 try {
68 - ProjectServer::useProject($project_id);  
69 - $this->changeCompanyName($project_id); 65 + $project = ProjectServer::useProject($project_id);
  66 +
  67 + //小语种
  68 + if($project['main_lang_id'] != 1){
  69 + $this->needTransKeywordPage($project_id);
  70 + }
70 DB::disconnect('custom_mysql'); 71 DB::disconnect('custom_mysql');
71 }catch (\Exception $e){ 72 }catch (\Exception $e){
72 dump($e->getMessage()); 73 dump($e->getMessage());
@@ -74,6 +75,13 @@ class RerunSeoTdk extends Command @@ -74,6 +75,13 @@ class RerunSeoTdk extends Command
74 } 75 }
75 } 76 }
76 77
  78 + public function needTransKeywordPage($project_id)
  79 + {
  80 + $row = Keyword::whereNotNull('sale_title')->update(['sale_title' => null, 'sale_content' => null, 'count_title'=>null, 'table_html'=>null, 'count_html' => null]);
  81 + dump($project_id .' - ' .$row);
  82 + }
  83 +
  84 +
77 /** 85 /**
78 * 换了公司英文名的 86 * 换了公司英文名的
79 * @author zbj 87 * @author zbj
@@ -9,12 +9,17 @@ @@ -9,12 +9,17 @@
9 9
10 namespace App\Console\Commands\Ticket; 10 namespace App\Console\Commands\Ticket;
11 11
  12 +use App\Models\Manage\BelongingGroup;
12 use App\Models\Manage\ManageHr; 13 use App\Models\Manage\ManageHr;
  14 +use App\Models\Ticket\TicketDailyCount;
  15 +use App\Models\Ticket\TicketDailyDeptCount;
13 use App\Models\Ticket\TicketDailyManageCount; 16 use App\Models\Ticket\TicketDailyManageCount;
14 use App\Models\WorkOrder\TicketLog; 17 use App\Models\WorkOrder\TicketLog;
15 use App\Models\WorkOrder\TicketProject; 18 use App\Models\WorkOrder\TicketProject;
16 use App\Models\WorkOrder\Tickets; 19 use App\Models\WorkOrder\Tickets;
17 use Illuminate\Console\Command; 20 use Illuminate\Console\Command;
  21 +use Illuminate\Support\Carbon;
  22 +use Illuminate\Support\Facades\Log;
18 23
19 class TicketCount extends Command 24 class TicketCount extends Command
20 { 25 {
@@ -32,6 +37,11 @@ class TicketCount extends Command @@ -32,6 +37,11 @@ class TicketCount extends Command
32 */ 37 */
33 protected $description = '日统计工单'; 38 protected $description = '日统计工单';
34 39
  40 + public $belong = [
  41 + 1 => [1,2,3,4,5,6,7,8,9],
  42 + 2 => [10,11,12],
  43 + ];
  44 +
35 /** 45 /**
36 * @remark :统计脚本 46 * @remark :统计脚本
37 * @name :handle 47 * @name :handle
@@ -40,7 +50,16 @@ class TicketCount extends Command @@ -40,7 +50,16 @@ class TicketCount extends Command
40 * @time :2025/8/7 17:45 50 * @time :2025/8/7 17:45
41 */ 51 */
42 public function handle(){ 52 public function handle(){
43 - 53 + $action = $this->argument('action');
  54 + if($action == 'manage_action'){
  55 + $this->manage_action();
  56 + }
  57 + if($action == 'dept_action'){
  58 + $this->dept_action();
  59 + }
  60 + if($action == 'yesterday_daily_action'){
  61 + $this->yesterday_daily_action();
  62 + }
44 } 63 }
45 64
46 /** 65 /**
@@ -56,26 +75,132 @@ class TicketCount extends Command @@ -56,26 +75,132 @@ class TicketCount extends Command
56 $date = date('Y-m-d'); 75 $date = date('Y-m-d');
57 $ticketManageCountModel = new TicketDailyManageCount(); 76 $ticketManageCountModel = new TicketDailyManageCount();
58 foreach ($manageList as $item){ 77 foreach ($manageList as $item){
  78 + $this->output('按人员统计:执行的人员名称/id:'.$item['name'].'/'.$item['manage_id']);
59 $ticketLogModel = new TicketLog(); 79 $ticketLogModel = new TicketLog();
60 $ticket_num = $ticketLogModel->counts(['engineer_id'=>$item['manage_id'],'is_engineer'=>1]); 80 $ticket_num = $ticketLogModel->counts(['engineer_id'=>$item['manage_id'],'is_engineer'=>1]);
  81 + //工单总时长
  82 + $timeCount = $ticketLogModel->formatQuery(['engineer_id'=>$item['manage_id'],'is_engineer'=>1])->sum('end_time');
  83 + $ticket_end_num = $ticketLogModel->counts(['engineer_id'=>$item['manage_id'],'is_engineer'=>1,'end_at'=>['!=',null]]);
  84 + if(!empty($timeCount)){
  85 + $average_time = round($timeCount / $ticket_end_num, 2);
  86 + }
  87 + //最快完成的时间
  88 + $fastest_time = $ticketLogModel->formatQuery(['engineer_id'=>$item['manage_id'],'is_engineer'=>1,'end_at'=>['!=',null]])->min('end_time');
  89 + //超时工单数量
  90 + $timeout_num = $ticketLogModel->counts(['end_at'=>null,'plan_end_at'=>['>',date('Y-m-d H:i:s')]]);
  91 + $complete_num = $ticketLogModel->counts(['end_at'=>['!=',null]]);
61 $data = [ 92 $data = [
62 'date'=>$date, 93 'date'=>$date,
63 'manage_id'=>$item['id'], 94 'manage_id'=>$item['id'],
64 'manage_name'=>$item['name'], 95 'manage_name'=>$item['name'],
65 'ticket_num'=>$ticket_num,//工单总数量 96 'ticket_num'=>$ticket_num,//工单总数量
66 - 'average_time'=>'',//平均完成工单时长  
67 - 'fastest_time'=>'',//最快完成工单时间  
68 - 'timeout_num'=>'',//超时工单数量  
69 - 'complete_num'=>'',//完成工单数量 97 + 'average_time'=>$average_time ?? '',//平均完成工单时长
  98 + 'fastest_time'=>$fastest_time,//最快完成工单时间
  99 + 'timeout_num'=>$timeout_num,//超时工单数量
  100 + 'complete_num'=>$complete_num,//完成工单数量
70 ]; 101 ];
71 //查询当前用户是否当日已有记录 102 //查询当前用户是否当日已有记录
72 $ticketManageInfo = $ticketManageCountModel->read(['date'=>$date,'manage_id'=>$item['id']],['id']); 103 $ticketManageInfo = $ticketManageCountModel->read(['date'=>$date,'manage_id'=>$item['id']],['id']);
73 if($ticketManageInfo === false){ 104 if($ticketManageInfo === false){
74 //TODO::执行新增 105 //TODO::执行新增
75 - 106 + $ticketManageCountModel->addReturnId($data);
76 }else{ 107 }else{
77 //TODO::执行编辑 108 //TODO::执行编辑
  109 + $ticketManageCountModel->edit($data,['id'=>$ticketManageInfo['id']]);
  110 + }
  111 + }
  112 + return true;
  113 + }
  114 +
  115 + /**
  116 + * @remark :按技术组统计数据
  117 + * @name :dept_action
  118 + * @author :lyh
  119 + * @method :post
  120 + * @time :2025/8/8 11:48
  121 + */
  122 + public function dept_action(){
  123 + $belongingGroupModel = new BelongingGroup();
  124 + $groupList = $belongingGroupModel->list(['id'=>['in',[1,2,3,4,5,6,7,8,9]]],'id',['id','name']);
  125 + $manageHrModel = new ManageHr();
  126 + $ticketLogModel = new TicketLog();
  127 + $ticketDailyDeptModel = new TicketDailyDeptCount();
  128 + $date = date('Y-m-d');
  129 + foreach ($groupList as $item){
  130 + $this->output('组统计:执行的组/id:'.$item['name'].'/'.$item['id']);
  131 + $manageIdArr = $manageHrModel->selectField(['belong_group'=>$item['id'],'status'=>1],'manage_id');
  132 + $ticket_num = $ticketLogModel->counts(['engineer_id'=>['in',$manageIdArr],'is_engineer'=>1]);
  133 + $timeCount = $ticketLogModel->formatQuery(['engineer_id'=>['in',$manageIdArr],'is_engineer'=>1])->sum('end_time');
  134 + if(!empty($timeCount)){
  135 + $average_time = round($timeCount / $ticket_num, 2);
  136 + }
  137 + $data = [
  138 + 'date'=>$date,
  139 + 'dept_id'=>$item['id'],
  140 + 'dept_name'=>$item['name'],
  141 + 'ticket_num'=>$ticket_num ?? 0,
  142 + 'average_time'=>$average_time
  143 + ];
  144 + $deptInfo = $ticketDailyDeptModel->read(['date'=>$date,'dept_id'=>$item['id']],['id']);
  145 + if($deptInfo === false){
  146 + $ticketDailyDeptModel->addReturnId($data);
  147 + }else{
  148 + $ticketDailyDeptModel->edit($data,['id'=>$deptInfo['id']]);
78 } 149 }
79 } 150 }
  151 + return true;
  152 + }
  153 +
  154 + /**
  155 + * @remark :
  156 + * @name :daily_action
  157 + * @author :lyh
  158 + * @method :post
  159 + * @time :2025/8/8 14:33
  160 + */
  161 + public function yesterday_daily_action(){
  162 + $ticketModel = new Tickets();
  163 + $date = Carbon::yesterday()->toDateString(); // "2025-08-07"
  164 + $ticket_num = $ticketModel->counts(['id'=>['!=',0]]);
  165 + $time_end_num = $ticketModel->counts(['end_at'=>['!=',null]]);//已完成的工单
  166 + $time_end_count = $ticketModel->formatQuery(['end_at'=>['!=',null]])->sum('end_time');//已完成工单时长
  167 + if(!empty($time_end_count)){
  168 + $average_time = round($time_end_count / $time_end_num, 2);
  169 + }
  170 + $add_num = $ticketModel->counts(['created_at'=>['between',[$date.' 00:00:00',$date.' 23:59:59']]]);
  171 + $untreated_num = $ticketModel->counts(['end_at'=>null]);
  172 + $processed_num = $ticketModel->counts(['end_at'=>['between',[$date.' 00:00:00',$date.' 23:59:59']]]);
  173 + $submit_a_side = $ticketModel->formatQuery(['submit_side'=>1])->sum('submit_side');
  174 + $submit_b_side = $ticketModel->formatQuery(['submit_side'=>2])->sum('submit_side');
  175 + $data = [
  176 + 'date' => $date,
  177 + 'ticket_num'=>$ticket_num,
  178 + 'add_num'=>$add_num,
  179 + 'untreated_num'=>$untreated_num,
  180 + 'processed_num'=>$processed_num,
  181 + 'average_time'=>$average_time ?? '',
  182 + 'source'=>json_encode(['a'=>$submit_a_side,'b'=>$submit_b_side],true),
  183 + ];
  184 + $ticketDailyModel = new TicketDailyCount();
  185 + $ticketDailyInfo = $ticketDailyModel->read(['date'=>$date],['id']);
  186 + if($ticketDailyInfo === false){
  187 + $ticketDailyModel->addReturnId($data);
  188 + }else{
  189 + $ticketDailyModel->edit($data,['id'=>$ticketDailyInfo['id']]);
  190 + }
  191 + return true;
  192 + }
  193 +
  194 + /**
  195 + * @remark :日志
  196 + * @name :output
  197 + * @author :lyh
  198 + * @method :post
  199 + * @time :2025/8/8 11:43
  200 + */
  201 + public function output($message)
  202 + {
  203 +// Log::channel('ticket_log')->info($message);
  204 + echo date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
80 } 205 }
81 } 206 }
@@ -143,7 +143,11 @@ class ProjectController extends BaseController @@ -143,7 +143,11 @@ class ProjectController extends BaseController
143 * @time :2023/12/29 17:14 143 * @time :2023/12/29 17:14
144 */ 144 */
145 public function orderByList($query){ 145 public function orderByList($query){
  146 + if(isset($this->map['seo_plan']) && $this->map['seo_plan'] == 1){
  147 + $query = $query->orderBy('gl_project.cooperate_date', 'desc')->orderBy('gl_project.id', 'desc');
  148 + }else{
146 $query = $query->orderBy('gl_project.uptime', 'desc')->orderBy('gl_project.id', 'desc'); 149 $query = $query->orderBy('gl_project.uptime', 'desc')->orderBy('gl_project.id', 'desc');
  150 + }
147 return $query; 151 return $query;
148 } 152 }
149 153
@@ -84,6 +84,7 @@ class Tickets extends Base @@ -84,6 +84,7 @@ class Tickets extends Base
84 if ($log && $log->is_engineer != in_array($engineer_id, $engineer_ids)) 84 if ($log && $log->is_engineer != in_array($engineer_id, $engineer_ids))
85 { 85 {
86 $log->is_engineer = in_array($engineer_id, $engineer_ids); 86 $log->is_engineer = in_array($engineer_id, $engineer_ids);
  87 + $log->plan_end_at = $this->plan_end_at; // 新增时写入 plan_end_at
87 $log->save(); 88 $log->save();
88 }else 89 }else
89 { 90 {
@@ -91,6 +92,7 @@ class Tickets extends Base @@ -91,6 +92,7 @@ class Tickets extends Base
91 $log = new TicketLog(); 92 $log = new TicketLog();
92 $log->engineer_id = $engineer_id; 93 $log->engineer_id = $engineer_id;
93 $log->is_engineer = in_array($engineer_id, $engineer_ids); 94 $log->is_engineer = in_array($engineer_id, $engineer_ids);
  95 + $log->plan_end_at = $this->plan_end_at; // 新增时写入 plan_end_at
94 $this->logs()->save($log); 96 $this->logs()->save($log);
95 } 97 }
96 }catch (\Exception $exception){ 98 }catch (\Exception $exception){