作者 lyh

变更数据

@@ -42,11 +42,14 @@ class GeoWritingsTask extends Command @@ -42,11 +42,14 @@ class GeoWritingsTask extends Command
42 continue; 42 continue;
43 } 43 }
44 echo date("Y-m-d H:i:s").',执行的任务id'.$task_id.PHP_EOL; 44 echo date("Y-m-d H:i:s").',执行的任务id'.$task_id.PHP_EOL;
45 - $info = $geoWritingsTaskModel->read(['id'=>$task_id]); 45 + $info = $geoWritingsTaskModel->read(['id'=>$task_id,'status'=>1]);
46 if($info === false){ 46 if($info === false){
47 - echo date("Y-m-d H:i:s").',任务id数据不存在:'.$task_id.PHP_EOL; 47 + echo date("Y-m-d H:i:s").',任务id数据不存在/或已被执行:'.$task_id.PHP_EOL;
48 continue; 48 continue;
49 } 49 }
  50 + //修改状态为生成中
  51 + $geoWritingsModel = new GeoWritings();
  52 + $geoWritingsModel->edit(['status'=>$geoWritingsModel::STATUS_AI_RUNNING],['id'=>$info['writings_id']]);
50 //生成引言 53 //生成引言
51 $aiCommand1 = "请根据这个文章标题:{$info['title']},并同时参考公司的介绍’{$info['description']}‘以及公司参与的事件内容’{$info['event_content']}‘,给我写一个英文Press Release前言内容,前言内容请参考并引用{$info['keyword']}行业的一些专业数据报告,只需要1个段落,大约150-200字,请一定要出现这个关键词“{$info['prefix']}{$info['keyword']}{$info['suffix']}”,所有内容一定要用英文, 只需要回复我引言内容,不需要别的内容(比如序号、你的提示、寒暄、解释、注释之类的)"; 54 $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(); 55 $gptHelper = new Gpt();
@@ -57,18 +60,17 @@ class GeoWritingsTask extends Command @@ -57,18 +60,17 @@ class GeoWritingsTask extends Command
57 $images = explode(',',$info['img']); 60 $images = explode(',',$info['img']);
58 //组装一条数据 61 //组装一条数据
59 try { 62 try {
60 - $geoWritingsModel = new GeoWritings();  
61 $saveData = [ 63 $saveData = [
62 'title'=>$info['title'], 64 'title'=>$info['title'],
63 'content'=>$introduction.($images[0] ?? '').PHP_EOL.$main.($images[1] ?? ''), 65 'content'=>$introduction.($images[0] ?? '').PHP_EOL.$main.($images[1] ?? ''),
64 'content_length'=>strlen($introduction.PHP_EOL.$main), 66 'content_length'=>strlen($introduction.PHP_EOL.$main),
  67 + 'status'=>$geoWritingsModel::STATUS_INIT
65 ]; 68 ];
66 - $id = $geoWritingsModel->edit($saveData,['id'=>$info['writings_id']]); 69 + $geoWritingsModel->edit($saveData,['id'=>$info['writings_id']]);
67 $data = [ 70 $data = [
68 'introduction'=>$introduction, 71 'introduction'=>$introduction,
69 'main'=>$main, 72 'main'=>$main,
70 'status'=>2, 73 'status'=>2,
71 - 'writings_id'=>$id,  
72 ]; 74 ];
73 $geoWritingsTaskModel->edit($data,['id'=>$task_id]); 75 $geoWritingsTaskModel->edit($data,['id'=>$task_id]);
74 }catch (\Exception $e){ 76 }catch (\Exception $e){
@@ -85,20 +87,35 @@ class GeoWritingsTask extends Command @@ -85,20 +87,35 @@ class GeoWritingsTask extends Command
85 * @method :post 87 * @method :post
86 * @time :2025/10/27 14:22 88 * @time :2025/10/27 14:22
87 */ 89 */
88 - public function getTaskId(){ 90 + public function getTaskId()
  91 + {
89 $task_id = Redis::rpop('geo_writings_task'); 92 $task_id = Redis::rpop('geo_writings_task');
90 - $geoWritingsTaskModel = new GeoWritingsTaskModel(); 93 + // 如果队列空了,尝试补充
91 if (empty($task_id)) { 94 if (empty($task_id)) {
92 - $ids = $geoWritingsTaskModel->formatQuery(['status'=>0])->limit(100)->pluck('id');  
93 - if(!empty($ids)){ 95 + $lock_key = 'geo_writings_task_lock';
  96 + $lock_ttl = 10; // 锁过期时间10秒,防止死锁
  97 + // 尝试加锁(只有一个进程能成功)
  98 + $lock = Redis::set($lock_key, 1, 'EX', $lock_ttl, 'NX');
  99 + if ($lock) {
  100 + try {
  101 + $geoWritingsTaskModel = new GeoWritingsTaskModel();
  102 + $ids = $geoWritingsTaskModel->formatQuery(['status' => 0])->limit(100)->pluck('id');
  103 + if (!$ids->isEmpty()) {
  104 + // 标记这批任务为“生成中”
  105 + $geoWritingsTaskModel->edit(['status' => 1], ['id' => ['in', $ids]]);
94 foreach ($ids as $id) { 106 foreach ($ids as $id) {
95 Redis::lpush('geo_writings_task', $id); 107 Redis::lpush('geo_writings_task', $id);
96 } 108 }
  109 + }
  110 + } finally {
  111 + // 释放锁
  112 + Redis::del($lock_key);
  113 + }
  114 + // 再次从队列中取任务
97 $task_id = Redis::rpop('geo_writings_task'); 115 $task_id = Redis::rpop('geo_writings_task');
98 } 116 }
99 - }else{  
100 - $geoWritingsTaskModel->edit(['status'=>GeoWritings::STATUS_AI_RUNNING],['id'=>$task_id]);  
101 } 117 }
102 return $task_id; 118 return $task_id;
103 } 119 }
  120 +
104 } 121 }