作者 李宇航

合并分支 'lyh-server' 到 'master'

Lyh server



查看合并请求 !3030
  1 +<?php
  2 +/**
  3 + * @remark :
  4 + * @name :GeoWritingsTask.php
  5 + * @author :lyh
  6 + * @method :post
  7 + * @time :2025/10/27 14:12
  8 + */
  9 +
  10 +namespace App\Console\Commands\Geo;
  11 +
  12 +use App\Helper\Gpt;
  13 +use App\Models\Geo\GeoWritings;
  14 +use Illuminate\Console\Command;
  15 +use Illuminate\Support\Facades\Redis;
  16 +use App\Models\Geo\GeoWritingsTask as GeoWritingsTaskModel;
  17 +
  18 +class GeoWritingsTask extends Command
  19 +{
  20 + /**
  21 + * The name and signature of the console command.
  22 + *
  23 + * @var string
  24 + */
  25 + protected $signature = 'geo_writings_task';
  26 +
  27 + public $porject_id;//记录当时执行的project_id
  28 +
  29 + /**
  30 + * The console command description.
  31 + *
  32 + * @var string
  33 + */
  34 + protected $description = 'geoAi生成文章';
  35 +
  36 + public function handle(){
  37 + while (true){
  38 + $geoWritingsTaskModel = new GeoWritingsTaskModel();
  39 + $task_id = $this->getTaskId();
  40 + if(empty($task_id)){
  41 + sleep(60);
  42 + continue;
  43 + }
  44 + echo date("Y-m-d H:i:s").',执行的任务id'.$task_id.PHP_EOL;
  45 + $info = $geoWritingsTaskModel->read(['id'=>$task_id]);
  46 + if($info === false){
  47 + echo date("Y-m-d H:i:s").',任务id数据不存在:'.$task_id.PHP_EOL;
  48 + continue;
  49 + }
  50 + //生成引言
  51 + $aiCommand1 = "请根据这个文章标题:{$info['title']},并同时参考公司的介绍’{$info['description']}‘以及公司参与的事件内容’{$info['event_content']}‘,给我写一个英文Press Release前言内容,前言内容请参考并引用{$info['keyword']}行业的一些专业数据报告,只需要1个段落,大约150-200字,请一定要出现这个关键词“{$info['prefix']}{$info['keyword']}{$info['suffix']}”,所有内容一定要用英文, 只需要回复我引言内容,不需要别的内容(比如序号、你的提示、寒暄、解释、注释之类的)";
  52 + $gptHelper = new Gpt();
  53 + $introduction = $gptHelper->openai_chat_qqs($aiCommand1);
  54 + //生成内容
  55 + $aiCommand2 = "请根据这个文章标题:{$info['title']},并同时参考公司的介绍{$info['description']},以及公司参与的事件内容{$info['event_content']},给我写一篇英文Press Release内容正文(已经有前言内容了),内容请参考并引用“{$info['prefix']}{$info['keyword']}{$info['suffix']}”行业的一些专业数据报告,新闻内容需要 5-6 个大纲,每个大纲需要标题和 1-2 段内容,最后1-2个大纲主要介绍企业的核心优势、主营产品应用场景、主要客户案例,并最后附带内容{$info['footer']},最后只需要回复我新闻稿内容,整个新闻稿内容字数1000字左右,不需要别的内容(比如序号、你的提示、寒暄、解释、注释之类的)";
  56 + $main = $gptHelper->openai_chat_qqs($aiCommand2);
  57 + $images = explode(',',$info['img']);
  58 + //组装一条数据
  59 + try {
  60 + $geoWritingsModel = new GeoWritings();
  61 + $saveData = [
  62 + 'project_id'=>$info['project_id'],
  63 + 'type'=>$geoWritingsModel::TYPE_AI_CREATE,
  64 + 'title'=>$info['title'],
  65 + 'content'=>$introduction.($images[0] ?? '').PHP_EOL.$main.($images[1] ?? ''),
  66 + 'content_length'=>strlen($introduction.PHP_EOL.$main),
  67 + 'uniqid'=>md5(uniqid().$task_id.$info['project_id']),
  68 + ];
  69 + $id = $geoWritingsModel->addReturnId($saveData);
  70 + $data = [
  71 + 'introduction'=>$introduction,
  72 + 'main'=>$main,
  73 + 'status'=>2,
  74 + 'writings_id'=>$id,
  75 + ];
  76 + $geoWritingsTaskModel->edit($data,['task_id'=>$task_id]);
  77 + }catch (\Exception $e){
  78 + echo date('Y-m-d H:i:s').'保存失败:'.$task_id.$e->getMessage().PHP_EOL;
  79 + continue;
  80 + }
  81 + }
  82 + }
  83 +
  84 + /**
  85 + * @remark :获取任务id
  86 + * @name :getTaskId
  87 + * @author :lyh
  88 + * @method :post
  89 + * @time :2025/10/27 14:22
  90 + */
  91 + public function getTaskId(){
  92 + $task_id = Redis::rpop('geo_writings_task');
  93 + $geoWritingsTaskModel = new GeoWritingsTaskModel();
  94 + if (empty($task_id)) {
  95 + $ids = $geoWritingsTaskModel->formatQuery(['status'=>0])->limit(100)->pluck('id');
  96 + if(!empty($ids)){
  97 + foreach ($ids as $id) {
  98 + Redis::lpush('geo_writings_task', $id);
  99 + }
  100 + $task_id = Redis::rpop('geo_writings_task');
  101 + }
  102 + }else{
  103 + $geoWritingsTaskModel->edit(['status'=>1],['id'=>$task_id]);
  104 + }
  105 + return $task_id;
  106 + }
  107 +}
@@ -39,7 +39,7 @@ class GeoController extends BaseController @@ -39,7 +39,7 @@ class GeoController extends BaseController
39 $projectModel = new Project(); 39 $projectModel = new Project();
40 $projectInfo = $projectModel->read(['project_id' => $project_id],['title','version']); 40 $projectInfo = $projectModel->read(['project_id' => $project_id],['title','version']);
41 $geoWritingsModel = new GeoWritings(); 41 $geoWritingsModel = new GeoWritings();
42 - $lists = $geoWritingsModel->list(['project_id' => $project_id, 'is_del' => GeoWritings::IS_DEL_FALSE],'id',['title', 'status', 'uniqid', 'confirm_at']); 42 + $lists = $geoWritingsModel->list(['project_id' => $project_id, 'status' => 2 ,'is_del' => GeoWritings::IS_DEL_FALSE],'id',['title', 'status', 'uniqid', 'confirm_at']);
43 $result = [ 43 $result = [
44 'project' => $projectInfo, 44 'project' => $projectInfo,
45 'list' => $lists 45 'list' => $lists
@@ -66,9 +66,9 @@ class GeoController extends BaseController @@ -66,9 +66,9 @@ class GeoController extends BaseController
66 * @param Request $request 66 * @param Request $request
67 * @return false|string 67 * @return false|string
68 */ 68 */
69 - public function confirmWritings(Request $request) 69 + public function confirmWritings()
70 { 70 {
71 - $request->validate([ 71 + $this->request->validate([
72 'token' => 'required', 72 'token' => 'required',
73 'title' => 'required|max:120', 73 'title' => 'required|max:120',
74 'content' => 'required|max:5000' 74 'content' => 'required|max:5000'
@@ -79,19 +79,21 @@ class GeoController extends BaseController @@ -79,19 +79,21 @@ class GeoController extends BaseController
79 'content.required' => '内容不能为空', 79 'content.required' => '内容不能为空',
80 'content.max' => '内容过长保存失败', 80 'content.max' => '内容过长保存失败',
81 ]); 81 ]);
82 - $token = trim($request->input('token'));  
83 - $data = GeoWritings::where(['uniqid' => $token])->first();  
84 - if (empty($data)){ 82 + $token = trim($this->param['token']);
  83 + $geoWritingsModel = new GeoWritings();
  84 + $info = $geoWritingsModel->read(['uniqid' => $token]);
  85 + if ($info === false){
85 return $this->error('非法请求'); 86 return $this->error('非法请求');
86 } 87 }
87 -  
88 - if ($data->status != GeoWritings::STATUS_RUNNING){ 88 + if ($info['status'] == GeoWritings::STATUS_FINISH){
89 return $this->error('当前文章已确认,不可再次确认'); 89 return $this->error('当前文章已确认,不可再次确认');
90 } 90 }
91 -  
92 -  
93 - // FIXME 验证完成,保存数据,计算内容长度,处理内容中的资源, IP 确认时间 状态  
94 - return $data; 91 + $this->param['confirm_ip'] = $this->request->ip();
  92 + $this->param['confirm_at'] = date('Y-m-d H:i:s');
  93 + $this->param['content_length'] = strlen($this->param['content']);
  94 + $this->param['status'] = GeoWritings::STATUS_FINISH;
  95 + $geoWritingsModel->edit($this->param,['uniqid' => $token]);
  96 + return true;
95 } 97 }
96 98
97 /** 99 /**
@@ -13,6 +13,7 @@ use App\Enums\Common\Code; @@ -13,6 +13,7 @@ use App\Enums\Common\Code;
13 use App\Http\Controllers\Aside\BaseController; 13 use App\Http\Controllers\Aside\BaseController;
14 use App\Http\Logic\Aside\Geo\GeoWritingsLogic; 14 use App\Http\Logic\Aside\Geo\GeoWritingsLogic;
15 use App\Http\Requests\Aside\Geo\GeoWritingsRequest; 15 use App\Http\Requests\Aside\Geo\GeoWritingsRequest;
  16 +use App\Models\Geo\GeoWritings;
16 use Illuminate\Http\Request; 17 use Illuminate\Http\Request;
17 18
18 /** 19 /**
@@ -74,4 +75,20 @@ class GeoWritingsController extends BaseController @@ -74,4 +75,20 @@ class GeoWritingsController extends BaseController
74 $this->response('success',Code::SUCCESS,$data); 75 $this->response('success',Code::SUCCESS,$data);
75 } 76 }
76 77
  78 + /**
  79 + * @remark :推送待审核列表消息
  80 + * @name :sendMessage
  81 + * @author :lyh
  82 + * @method :post
  83 + * @time :2025/10/28 09:59
  84 + */
  85 + public function sendWechatMessage(){
  86 + $this->request->validate([
  87 + 'project_id'=>'required',
  88 + ],[
  89 + 'project_id.required' => '项目ID不能为空',
  90 + ]);
  91 + $data = $this->logic->sendWechatMessage();
  92 + $this->response('success',Code::SUCCESS,$data);
  93 + }
77 } 94 }
@@ -49,9 +49,7 @@ class GeoWritingsLogic extends BaseLogic @@ -49,9 +49,7 @@ class GeoWritingsLogic extends BaseLogic
49 */ 49 */
50 public function saveWriting(){ 50 public function saveWriting(){
51 try { 51 try {
52 - $this->param['content_length'] = strlen($this->param['content']);  
53 - $this->param['confirm_ip'] = $this->request->ip();  
54 - $this->param['confirm_at'] = date('Y-m-d H:i:s'); 52 + $this->param['status'] = GeoWritings::STATUS_INIT;
55 if(isset($this->param['id']) &&!empty($this->param['id'])){ 53 if(isset($this->param['id']) &&!empty($this->param['id'])){
56 $id = $this->param['id']; 54 $id = $this->param['id'];
57 $this->model->edit($this->param,['id'=>$id]); 55 $this->model->edit($this->param,['id'=>$id]);
@@ -80,4 +78,18 @@ class GeoWritingsLogic extends BaseLogic @@ -80,4 +78,18 @@ class GeoWritingsLogic extends BaseLogic
80 } 78 }
81 return $this->success(); 79 return $this->success();
82 } 80 }
  81 +
  82 + /**
  83 + * @remark :推送微信
  84 + * @name :sendWechatMessage
  85 + * @author :lyh
  86 + * @method :post
  87 + * @time :2025/10/28 10:15
  88 + */
  89 + public function sendWechatMessage()
  90 + {
  91 + $this->model->edit(['status'=>2],['status'=>1,'project_id'=>$this->param['project_id']]);
  92 + GeoWritings::sendConfirmMessage($this->param['project_id']);
  93 + return $this->success();
  94 + }
83 } 95 }
@@ -26,7 +26,7 @@ class NewsRequest extends FormRequest @@ -26,7 +26,7 @@ class NewsRequest extends FormRequest
26 return [ 26 return [
27 'name'=>'required|max:200', 27 'name'=>'required|max:200',
28 'url'=>'required', 28 'url'=>'required',
29 - 'seo_title' => 'max:70', 29 +// 'seo_title' => 'max:70',
30 'seo_keywords' => 'max:300', 30 'seo_keywords' => 'max:300',
31 'seo_description' => 'max:200', 31 'seo_description' => 'max:200',
32 ]; 32 ];
@@ -38,7 +38,7 @@ class NewsRequest extends FormRequest @@ -38,7 +38,7 @@ class NewsRequest extends FormRequest
38 'name.required'=>'请填写名称', 38 'name.required'=>'请填写名称',
39 'name.max'=>'名称超过最长长度200', 39 'name.max'=>'名称超过最长长度200',
40 'url.required'=>'链接不能为空', 40 'url.required'=>'链接不能为空',
41 - 'seo_title.max' => 'SEO标题不能超过70个字符', 41 +// 'seo_title.max' => 'SEO标题不能超过70个字符',
42 'seo_keywords.max' => 'SEO关键词不能超过300个字符', 42 'seo_keywords.max' => 'SEO关键词不能超过300个字符',
43 'seo_description.max' => 'SEO描述不能超过200个字符', 43 'seo_description.max' => 'SEO描述不能超过200个字符',
44 ]; 44 ];
@@ -113,5 +113,6 @@ Route::prefix('geo')->group(function () { @@ -113,5 +113,6 @@ Route::prefix('geo')->group(function () {
113 Route::any('/getWritingsList', [\App\Http\Controllers\Api\GeoController::class, 'getWritingsList'])->name('geo.getWritingsList');//确认文章数据 113 Route::any('/getWritingsList', [\App\Http\Controllers\Api\GeoController::class, 'getWritingsList'])->name('geo.getWritingsList');//确认文章数据
114 Route::any('/getWritingsDetail', [\App\Http\Controllers\Api\GeoController::class, 'getWritingsDetail'])->name('geo.getWritingsDetail');//文章数据详情 114 Route::any('/getWritingsDetail', [\App\Http\Controllers\Api\GeoController::class, 'getWritingsDetail'])->name('geo.getWritingsDetail');//文章数据详情
115 Route::any('/saveConfirm', [\App\Http\Controllers\Api\GeoController::class, 'saveConfirm'])->name('geo.saveConfirm');//保存用户确认信息 115 Route::any('/saveConfirm', [\App\Http\Controllers\Api\GeoController::class, 'saveConfirm'])->name('geo.saveConfirm');//保存用户确认信息
  116 + Route::any('/getWritingsList', [\App\Http\Controllers\Api\GeoController::class, 'getWritingsList'])->name('geo.getWritingsList');//保存用户确认信息
116 }); 117 });
117 118
@@ -607,6 +607,7 @@ Route::middleware(['aloginauth'])->group(function () { @@ -607,6 +607,7 @@ Route::middleware(['aloginauth'])->group(function () {
607 Route::any('/', [Aside\Geo\GeoWritingsController::class, 'lists'])->name('admin.geo_writing_task'); 607 Route::any('/', [Aside\Geo\GeoWritingsController::class, 'lists'])->name('admin.geo_writing_task');
608 Route::any('/saveWriting', [Aside\Geo\GeoWritingsController::class, 'saveWriting'])->name('admin.geo_writing_saveWriting'); 608 Route::any('/saveWriting', [Aside\Geo\GeoWritingsController::class, 'saveWriting'])->name('admin.geo_writing_saveWriting');
609 Route::any('/delWriting', [Aside\Geo\GeoWritingsController::class, 'delWriting'])->name('admin.geo_writing_delWriting'); 609 Route::any('/delWriting', [Aside\Geo\GeoWritingsController::class, 'delWriting'])->name('admin.geo_writing_delWriting');
  610 + Route::any('/sendWechatMessage', [Aside\Geo\GeoWritingsController::class, 'sendWechatMessage'])->name('admin.geo_writing_sendWechatMessage');
610 }); 611 });
611 }); 612 });
612 // 任务相关 613 // 任务相关