作者 刘锟

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

@@ -63,7 +63,7 @@ class AiVideoAutoPublish extends Command @@ -63,7 +63,7 @@ class AiVideoAutoPublish extends Command
63 } 63 }
64 64
65 /** 65 /**
66 - * @remark :普通项目--自动发布 66 + * @remark :自动发布aiVideo组装数据(写入一条记录)
67 * @name :auto_six_publish 67 * @name :auto_six_publish
68 * @author :lyh 68 * @author :lyh
69 * @method :post 69 * @method :post
@@ -73,7 +73,7 @@ class AiVideoAutoPublish extends Command @@ -73,7 +73,7 @@ class AiVideoAutoPublish extends Command
73 $this->output('开始自动发布Video文章'); 73 $this->output('开始自动发布Video文章');
74 $projectModel = new Project(); 74 $projectModel = new Project();
75 $optimizeModel = new DeployOptimize(); 75 $optimizeModel = new DeployOptimize();
76 - $projectList = $projectModel->list(['is_ai_video'=>1,'id'=>1,'delete_status'=>0,'site_status'=>0,'extend_type'=>0],'id',['id','project_type']); 76 + $projectList = $projectModel->list(['is_ai_video'=>1,'delete_status'=>0,'site_status'=>0,'extend_type'=>0],'id',['id','project_type']);
77 foreach ($projectList as $item){ 77 foreach ($projectList as $item){
78 $this->output("项目{$item['id']}开始自动发布"); 78 $this->output("项目{$item['id']}开始自动发布");
79 //获取当前是否开启自动发布aiVideo 79 //获取当前是否开启自动发布aiVideo
@@ -129,10 +129,7 @@ class AiVideoAutoPublish extends Command @@ -129,10 +129,7 @@ class AiVideoAutoPublish extends Command
129 return $data; 129 return $data;
130 } 130 }
131 $data['title'] = $info['title']; 131 $data['title'] = $info['title'];
132 - $data['remark'] = strip_tags($info['intro']);  
133 - if(empty($data['remark'])){  
134 - $data['remark'] = $data['title'];  
135 - } 132 + $data['remark'] = $info['intro'];
136 $data['images'] = array_filter(array_map(function ($item) use ($data) { 133 $data['images'] = array_filter(array_map(function ($item) use ($data) {
137 if (!empty($item['url'])) { 134 if (!empty($item['url'])) {
138 return [ 135 return [
@@ -193,7 +190,6 @@ class AiVideoAutoPublish extends Command @@ -193,7 +190,6 @@ class AiVideoAutoPublish extends Command
193 } 190 }
194 $item = $aiVideoAutoLogModel->read(['status'=>0,'trigger_id'=>null]); 191 $item = $aiVideoAutoLogModel->read(['status'=>0,'trigger_id'=>null]);
195 if($item === false){ 192 if($item === false){
196 - echo date('Y-m-d H:i:s').':无生成图片的数据。'.PHP_EOL;  
197 sleep(60); 193 sleep(60);
198 continue; 194 continue;
199 } 195 }
@@ -204,7 +200,7 @@ class AiVideoAutoPublish extends Command @@ -204,7 +200,7 @@ class AiVideoAutoPublish extends Command
204 $midJourneyService = new MidJourneyService(); 200 $midJourneyService = new MidJourneyService();
205 $result = $midJourneyService->imagine($content); 201 $result = $midJourneyService->imagine($content);
206 if($result && !empty($result['trigger_id'])){ 202 if($result && !empty($result['trigger_id'])){
207 - echo '提交的数据详情。'.json_encode($result,true).$item['project_id'].PHP_EOL; 203 + echo '提交的数据详情。'.json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES).$item['project_id'].PHP_EOL;
208 Redis::incr('ai_video_image'); 204 Redis::incr('ai_video_image');
209 $aiVideoAutoLogModel->edit(['trigger_id'=>$result['trigger_id']],['id'=>$item['id']]); 205 $aiVideoAutoLogModel->edit(['trigger_id'=>$result['trigger_id']],['id'=>$item['id']]);
210 } 206 }
@@ -241,14 +237,17 @@ class AiVideoAutoPublish extends Command @@ -241,14 +237,17 @@ class AiVideoAutoPublish extends Command
241 $aiVideoService = new AiVideoService($info['project_id']); 237 $aiVideoService = new AiVideoService($info['project_id']);
242 $projectModel = new DeployOptimize(); 238 $projectModel = new DeployOptimize();
243 $video_setting = $projectModel->getValue(['project_id'=>$info['project_id']],'video_setting'); 239 $video_setting = $projectModel->getValue(['project_id'=>$info['project_id']],'video_setting');
  240 + $frequency_setting = $projectModel->getValue(['project_id'=>$info['project_id']],'send_ai_video_frequency');
244 $storage = $aiVideoTaskModel->videoSetting()[$video_setting ?? 1]; 241 $storage = $aiVideoTaskModel->videoSetting()[$video_setting ?? 1];
  242 + $frequency = $aiVideoTaskModel->videoFrequency()[$frequency_setting ?? 1];
  243 + $frequencyArr = explode('-',$frequency);
245 $result = $aiVideoService->createTask($info['title'],$info['remark'],$info['images'],[],$storage); 244 $result = $aiVideoService->createTask($info['title'],$info['remark'],$info['images'],[],$storage);
246 if($result['status'] == 200){ 245 if($result['status'] == 200){
247 - $aiVideoTaskModel->addReturnId(['task_id'=>$result['data']['task_id'],'project_id'=>$info['project_id'],'storage'=>$storage]); 246 + $next_auto_date = date('Y-m-d', strtotime('+' . mt_rand($frequencyArr[0] ?? 5,$frequencyArr[1] ?? 7) . 'days')); //每5-7天自动发布
  247 + $aiVideoTaskModel->addReturnId(['next_auto_date'=>$next_auto_date,'task_id'=>$result['data']['task_id'],'project_id'=>$info['project_id'],'storage'=>$storage]);
248 ProjectServer::useProject($info['project_id']); 248 ProjectServer::useProject($info['project_id']);
249 $aiVideoModel = new AiVideo(); 249 $aiVideoModel = new AiVideo();
250 - $next_auto_date = date('Y-m-d', strtotime('+' . mt_rand(5,7) . 'days')); //每5-7天自动发布  
251 - $aiVideoModel->addReturnId(['next_auto_date'=>$next_auto_date,'title'=>$info['title'],'task_id'=>$result['data']['task_id'],'description'=>$info['remark'],'project_id'=>$info['project_id'],'images'=>json_encode($info['images'],true),'anchor'=>json_encode([],true)]); 250 + $aiVideoModel->addReturnId(['title'=>$info['title'],'task_id'=>$result['data']['task_id'],'description'=>$info['remark'],'project_id'=>$info['project_id'],'images'=>json_encode($info['images'],true),'anchor'=>json_encode([],true)]);
252 DB::disconnect('custom_mysql'); 251 DB::disconnect('custom_mysql');
253 $aiVideoAutoLogModel->edit(['status'=>2],['id'=>$info['id']]); 252 $aiVideoAutoLogModel->edit(['status'=>2],['id'=>$info['id']]);
254 } 253 }
@@ -289,7 +288,7 @@ class AiVideoAutoPublish extends Command @@ -289,7 +288,7 @@ class AiVideoAutoPublish extends Command
289 * @method :post 288 * @method :post
290 * @time :2025/8/1 16:25 289 * @time :2025/8/1 16:25
291 */ 290 */
292 - public function getAiVideoParam($project_id = 3751) 291 + public function getAiVideoParam($project_id)
293 { 292 {
294 //获取当前网站域名 293 //获取当前网站域名
295 $domainModel = new DomainInfo(); 294 $domainModel = new DomainInfo();
@@ -1297,7 +1297,8 @@ class ProjectController extends BaseController @@ -1297,7 +1297,8 @@ class ProjectController extends BaseController
1297 */ 1297 */
1298 public function videoSetting(){ 1298 public function videoSetting(){
1299 $videoModel = new AiVideoTask(); 1299 $videoModel = new AiVideoTask();
1300 - $data = $videoModel->videoSetting(); 1300 + $data['videoSetting'] = $videoModel->videoSetting();
  1301 + $data['videoFrequency'] =$videoModel->videoFrequency();
1301 $this->response('success',Code::SUCCESS,$data); 1302 $this->response('success',Code::SUCCESS,$data);
1302 } 1303 }
1303 } 1304 }
@@ -25,7 +25,7 @@ class AsideTicketController extends BaseController @@ -25,7 +25,7 @@ class AsideTicketController extends BaseController
25 public function index(AsideTicketListRequest $request) 25 public function index(AsideTicketListRequest $request)
26 { 26 {
27 $validated = $request->validated(); 27 $validated = $request->validated();
28 - $lists = Tickets::with([ 28 + $query = Tickets::with([
29 'logs.engineer', 29 'logs.engineer',
30 'project.pm', 30 'project.pm',
31 'project.projectV6', 31 'project.projectV6',
@@ -66,9 +66,15 @@ class AsideTicketController extends BaseController @@ -66,9 +66,15 @@ class AsideTicketController extends BaseController
66 ->orWhere('company_name', 'like', '%' . $search . '%'); 66 ->orWhere('company_name', 'like', '%' . $search . '%');
67 }); 67 });
68 }); 68 });
69 - })  
70 - ->orderBy('id', 'desc')  
71 - ->paginate($this->row, ['*'], 'page', $this->page); 69 + });
  70 +
  71 + // 添加排序功能
  72 + $sortField = $request->input('sort_field', 'plan_end_at');
  73 + $sortOrder = strtolower($request->input('sort_order', 'asc'));
  74 + $query->orderBy($sortField, $sortOrder);
  75 + // 添加次要排序:按状态升序排列
  76 + $query->orderBy('status', 'asc');
  77 + $lists = $query->paginate($this->row, ['*'], 'page', $this->page);
72 $this->response('success', Code::SUCCESS, $lists); 78 $this->response('success', Code::SUCCESS, $lists);
73 } 79 }
74 80
@@ -95,6 +95,8 @@ class AsideTicketLogController extends BaseController @@ -95,6 +95,8 @@ class AsideTicketLogController extends BaseController
95 if ($project->wechat_switch && !$ticket->close_wechat) 95 if ($project->wechat_switch && !$ticket->close_wechat)
96 $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!"); 96 $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
97 $ticket->pushDing('finish'); 97 $ticket->pushDing('finish');
  98 + }else{
  99 + $ticket->status = Tickets::STATUS_YANSHOU;
98 } 100 }
99 } 101 }
100 $ticket->save(); 102 $ticket->save();
@@ -24,7 +24,7 @@ class TicketListRequest extends FormRequest @@ -24,7 +24,7 @@ class TicketListRequest extends FormRequest
24 public function rules() 24 public function rules()
25 { 25 {
26 return [ 26 return [
27 - 'status' => 'nullable|in:0,1,2,3|integer', 27 + 'status' => 'nullable|in:0,1,2,3,9|integer',
28 'search' => 'nullable|string', // 搜索关键词 28 'search' => 'nullable|string', // 搜索关键词
29 'page' => 'nullable|integer', 29 'page' => 'nullable|integer',
30 'size' => 'nullable|integer', 30 'size' => 'nullable|integer',
@@ -25,12 +25,14 @@ class AsideTicketListRequest extends FormRequest @@ -25,12 +25,14 @@ class AsideTicketListRequest extends FormRequest
25 { 25 {
26 return [ 26 return [
27 'project_id' => 'nullable|string', 27 'project_id' => 'nullable|string',
28 - 'status' => 'nullable|in:0,1,2,3|integer', 28 + 'status' => 'nullable|in:0,1,2,3,9|integer',
29 'star' => 'nullable|in:1,2,3|integer', 29 'star' => 'nullable|in:1,2,3|integer',
30 'search' => 'nullable|string', // 搜索关键词 30 'search' => 'nullable|string', // 搜索关键词
31 'engineer_id' => 'nullable|integer', // 工程师ID 31 'engineer_id' => 'nullable|integer', // 工程师ID
32 'page' => 'nullable|integer', 32 'page' => 'nullable|integer',
33 'size' => 'nullable|integer', 33 'size' => 'nullable|integer',
  34 + 'sort_field' => 'nullable|in:created_at,plan_end_at',
  35 + 'sort_order' => 'nullable|in:asc,desc',
34 ]; 36 ];
35 } 37 }
36 } 38 }
@@ -27,7 +27,7 @@ class AsideTicketUpdateRequest extends FormRequest @@ -27,7 +27,7 @@ class AsideTicketUpdateRequest extends FormRequest
27 'title' => 'nullable|string', 27 'title' => 'nullable|string',
28 'content' => 'nullable|string', 28 'content' => 'nullable|string',
29 'files' => 'nullable|array', 29 'files' => 'nullable|array',
30 - 'status' => 'nullable|in:0,1,2,3|integer', 30 + 'status' => 'nullable|in:0,1,2,3,9|integer',
31 'engineer_ids' => 'nullable|array', 31 'engineer_ids' => 'nullable|array',
32 'star' => 'nullable|in:1,2,3|integer', 32 'star' => 'nullable|in:1,2,3|integer',
33 'plan_end_at' => 'nullable|date', 33 'plan_end_at' => 'nullable|date',
@@ -22,7 +22,7 @@ class AiVideoTask extends Base @@ -22,7 +22,7 @@ class AiVideoTask extends Base
22 const STATUS_FINISH = 2; 22 const STATUS_FINISH = 2;
23 23
24 /** 24 /**
25 - * @remark :视频设 25 + * @remark :
26 * @name :videoSetting 26 * @name :videoSetting
27 * @author :lyh 27 * @author :lyh
28 * @method :post 28 * @method :post
@@ -34,4 +34,17 @@ class AiVideoTask extends Base @@ -34,4 +34,17 @@ class AiVideoTask extends Base
34 2 => 'YOUTUBE' 34 2 => 'YOUTUBE'
35 ]; 35 ];
36 } 36 }
  37 +
  38 + /**
  39 + * @remark :配置
  40 + * @name :videoFrequency
  41 + * @author :lyh
  42 + * @method :post
  43 + * @time :2025/8/1 17:17
  44 + */
  45 + public function videoFrequency(){
  46 + return [
  47 + 1 => '5-7',
  48 + ];
  49 + }
37 } 50 }
@@ -15,8 +15,9 @@ class Tickets extends Base @@ -15,8 +15,9 @@ class Tickets extends Base
15 15
16 const STATUS_PEDDING = 0; // 待处理 16 const STATUS_PEDDING = 0; // 待处理
17 const STATUS_PROCESSING = 1; // 处理中 17 const STATUS_PROCESSING = 1; // 处理中
18 - const STATUS_COMPLETED = 2; // 已完成  
19 - const STATUS_CLOSED = 3; // 已关闭,已失效 18 + const STATUS_YANSHOU = 2; // 验收中
  19 + const STATUS_COMPLETED = 3; // 已完成
  20 + const STATUS_CLOSED = 9; // 已关闭,已失效,审核不通过,结束工单设置大一点,方便中途又要加状态
20 21
21 /** 22 /**
22 * @return void 23 * @return void