request->post() : $aParam; $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(array('status' => 2,'msg' => 'Please select an article' )); } //查询文章 $aWhere = ['article_id' => $iArticleId]; $oArticle = new Article; $aArticle = json_decode($oArticle->get($aWhere),true); $aArticle = empty($aArticle['data']) ? [] : $aArticle['data']; if(empty($aArticle)){ return json_encode(array('status' => 3,'msg' => 'No articles requiring review were found' )); } if($aArticle['state'] != 6 && $aArticle['state'] != 5){ return json_encode(array('status' => 4,'msg' => 'The article has not entered the proofreading stage')); } //查询是否进行过校对 $aProofReadWhere = ['article_id' => $iArticleId,'state' => 2,'is_delete' => 2]; if(!empty($iAmId)){ $aProofReadWhere['am_id'] = $iAmId; } $iCount = Db::name('article_proofread')->where($aProofReadWhere)->count(); if(!empty($iCount)){ return json_encode(array('status' => 5,'msg' => 'The article or paragraph has been proofread')); } //查询文章内容 $aWhere['type'] = 0; $aWhere['content'] = ['<>','']; $aWhere['state'] = 0; $aArticleMain = Db::table('t_article_main')->field('am_id,content,type,is_h1,is_h2,is_h3,is_proofread')->where($aWhere)->order('sort asc')->select(); if(empty($aArticleMain)){ return json_encode(array('status' => 5,'msg' => 'The content of the article is empty')); } //实例化公共方法 $oHelperFunction = new \app\common\HelperFunction; $oProofReadService = new \app\common\ProofReadService; //数据处理 $aId = []; foreach ($aArticleMain as $key => $value) { if(empty($oHelperFunction->filterAllTags($value['content']))){ continue; } if($value['is_proofread'] == 2){ $aId[] = $value['am_id']; } $aResult = $oProofReadService->proofread($value['content']); if(empty($aResult)){ continue; } $aResult['am_id'] = $value['am_id']; $aError[] = $aResult; } if(empty($aError)){ //更新文章内容的校对时间及状态 $iCount = count($aId); if($iCount > 0){ $aUpdateWhere = ['am_id' => ['in',$aId]]; $update_result = Db::name('article_main')->where($aUpdateWhere)->limit($iCount)->update(['is_proofread' => 1,'proofread_time' => time()]); if($update_result === false){ return json_encode(array('status' => 6,'msg' => 'Failed to update paragraph proofreading status-'.$update_result)); } } return json_encode(array('status' => 1,'msg' => 'No errors found')); } //数据处理 foreach ($aError as $key => $value) { if(empty($value['errors'])){ continue; } foreach ($value['errors'] as $k => $val) { $val['am_id'] = $value['am_id']; $val['article_id'] = $iArticleId; $val['proof_before'] = empty($value['proof_before']) ? '' : $value['proof_before']; $val['proof_after'] = empty($value['proof_after']) ? '' : $value['proof_after']; $val['create_time'] = time(); $aData[] = $val; } } if(empty($aData)){ return json_encode(array('status' => 1,'msg' => 'Data processing failed')); } Db::startTrans(); //更新文章内容的校对时间及状态 $iCount = count($aId); $update_result = true; if($iCount > 0){ $aUpdateWhere = ['am_id' => ['in',$aId]]; $update_result = Db::name('article_main')->where($aUpdateWhere)->limit($iCount)->update(['is_proofread' => 1,'proofread_time' => time()]); } //插入 $result = Db::name('article_proofread')->insertAll($aData); if(!$result || $update_result === false){ return json_encode(array('status' => 6,'msg' => 'Data operation failed:insert-'.$result.';update-'.$update_result)); } Db::commit(); return json_encode(['status' => 1,'msg' => 'Proofreading successful']); } /** * @title 获取每行校对记录 * @param article_id 文章ID * @param am_id 行号 * @param state 状态1已执行2未执行3删除 */ public function get($aParam = []){ //获取参数 $aParam = empty($aParam) ? $this->request->post() : $aParam; //参数验证-文章ID $iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'Please select a article']); } //行号 $iAmId = empty($aParam['am_id']) ? 0 : $aParam['am_id']; //查询文章 $aWhere = ['article_id' => $iArticleId]; $aArticle = Db::name('article')->field('journal_id,state')->where($aWhere)->find(); if(empty($aArticle)){ return json_encode(['status' => 3,'msg' => 'The query article does not exist']); } if($aArticle['state'] != 6 && $aArticle['state'] != 5){ return json_encode(array('status' => 4,'msg' => 'The article has not entered the proofreading stage')); } //查询文章内容 $aWhere['type'] = 0; $aWhere['content'] = ['<>','']; $aWhere['state'] = 0; if(!empty($iAmId)){ $aWhere['am_id'] = $iAmId; } $aArticleMain = Db::name('article_main')->field('am_id,content')->where($aWhere)->select(); if(empty($aArticleMain)){ return json_encode(array('status' => 5,'msg' => 'The content of the article is empty')); } //查询校对内容 $aAmId = array_column($aArticleMain, 'am_id'); $aWhere = ['am_id' => ['in',$aAmId],'is_delete' => 2]; $iState = empty($aParam['state']) ? 0 : explode(',', $aParam['state']); if(!empty($iState)){ $aWhere['state'] = ['in',$iState]; } $aProofRead = Db::name('article_proofread')->field('id,am_id,verbatim_texts,revised_content,explanation,state')->where($aWhere)->select(); if(empty($aProofRead)){ return json_encode(array('status' => 1,'msg' => 'Proofreading record is empty')); } //数据处理 $aData = []; $aArticleMain = array_column($aArticleMain, 'content','am_id'); foreach ($aProofRead as $key => $value) { $aData[$value['am_id']][] = $value; } // 存储每个文章的最新处理内容 // 样式定义:标红+下划线 // 定义标红+下划线样式 // $style = 'color: red; text-decoration: underline;'; // // 存储最终处理后的文章内容 // $aFinalContent = []; // // 外层循环:遍历每个文章的错误分组($key为am_id) // foreach ($aData as $amId => $errors) { // // 获取原始文章内容(若不存在则跳过) // $sContent = empty($aArticleMain[$amId]) ? '' : $aArticleMain[$amId]; // if (empty($sContent)) { // continue; // } // // 初始化当前内容为原始内容,后续替换将基于此更新 // $currentContent = $sContent; // // 内层循环:处理当前文章的每条错误记录 // foreach ($errors as $val) { // // 只处理状态为2的错误 // if ($val['state'] != 2) { // continue; // } // // 获取错误内容(待标红的文本) // $verbatim_texts = trim($val['verbatim_texts'] ?? ''); // if (empty($verbatim_texts)) { // continue; // 空错误内容跳过 // } // // 构建带样式的替换内容(用span标签包裹,添加CSS样式) // $revised_content = '' . htmlspecialchars($verbatim_texts, ENT_QUOTES, 'UTF-8') . ''; // // 定位错误内容在当前内容中的位置(支持多字节字符,如中文) // $startPos = mb_strpos($currentContent, $verbatim_texts, 0, 'UTF-8'); // if ($startPos === false) { // continue; // 未找到错误内容,跳过 // } // // 计算错误内容的字节长度(用于替换) // $byteLength = strlen($verbatim_texts); // // 转换字符起始位置为字节位置(适配substr_replace的字节处理) // $byteStart = 0; // for ($i = 0; $i < $startPos; $i++) { // $byteStart += strlen(mb_substr($currentContent, $i, 1, 'UTF-8')); // } // // 执行替换:用带样式的内容替换原始错误内容 // $currentContent = substr_replace($currentContent, $revised_content, $byteStart, $byteLength); // } // // 保存当前文章处理后的最终内容 // $aFinalContent[$amId] = $currentContent; // } return json_encode(['status' => 1,'msg' => 'success','data' => ['record' => $aData]]);//,'record_style' => $aFinalContent } /** * @title 更新状态 * @param article_id 文章ID * @param am_id 行号 * @param record_id 记录ID * @param state 1已执行2未执行3撤销 */ public function change(){ //获取参数 $aParam = $this->request->post(); //参数验证-文章ID $iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'Please select a article']); } //参数验证-行号ID $iAmId = empty($aParam['am_id']) ? 0 : $aParam['am_id']; if(empty($iAmId)){ return json_encode(['status' => 2,'msg' => 'Please select the proofreading content']); } //主键ID $iId = empty($aParam['record_id']) ? 0 : $aParam['record_id']; if(empty($iId)){ return json_encode(['status' => 2,'msg' => 'Please select the review record']); } //状态 $iState = empty($aParam['state']) ? 0 : intval($aParam['state']); if(!in_array($iState, [1,2,3])){ return json_encode(['status' => 2,'msg' => 'Illegal review status']); } //修改内容 $sContent = empty($aParam['content']) ? '' : $aParam['content']; if(in_array($iState, [1,2]) && empty($sContent)){ return json_encode(['status' => 2,'msg' => 'The operation content cannot be empty']); } //判断校对记录 $aWhere = ['am_id' => $iAmId,'article_id' => $iArticleId,'id' => $iId,'is_delete' => 2]; $aProofRead = Db::name('article_proofread')->where($aWhere)->find(); if(empty($aProofRead)){ return json_encode(['status' => 3,'msg' => 'Proofreading record is empty']); } if($aProofRead['state'] == 3){ return json_encode(['status' => 4,'msg' => 'Record deleted']); } //状态一致 if($iState == $aProofRead['state']){ return json_encode(['status' => 5,'msg' => 'Consistent status without modification']); } //判断记录是否执行 if($iState == 3 && $aProofRead['state'] == 1){ return json_encode(['status' => 6,'msg' => 'This record has been executed and cannot be deleted']); } $sData = $sUpdateContent = ''; if($iState == 1){ //执行替换操作 $aProofRead['content'] = $sContent; $aResult = $this->replaceError($aProofRead); $iStatus = empty($aResult['status']) ? 0 : $aResult['status']; if($iStatus != 1){ return json_encode($aResult); } //获取内容 $sUpdateContent = empty($aResult['data']) ? '' : $aResult['data']; if(empty($sUpdateContent)){ return json_encode(['status' => 5,'msg' => 'Content processing failed']); } // $aDealData = json_decode($this->get(['am_id' => $iAmId,'article_id' => $iArticleId]),true); // $aDealData = empty($aDealData['data']) ? [] : $aDealData['data']; // $sData = empty($aDealData['record_style']) ? '' : $aDealData['record_style']; $sData = $sUpdateContent; } if($iState == 2){ //执行替换操作 $aProofRead['content'] = $sContent; $aResult = $this->removeReplaceError($aProofRead); $iStatus = empty($aResult['status']) ? 0 : $aResult['status']; if($iStatus != 1){ return json_encode($aResult); } //获取内容 $sUpdateContent = empty($aResult['data']) ? '' : $aResult['data']; if(empty($sUpdateContent)){ return json_encode(['status' => 5,'msg' => 'Content processing failed']); } // $aDealData = json_decode($this->get(['am_id' => $iAmId,'article_id' => $iArticleId]),true); // $aDealData = empty($aDealData['data']) ? [] : $aDealData['data']; // $sData = empty($aDealData['record_style']) ? '' : $aDealData['record_style']; $sData = $sUpdateContent; } Db::startTrans(); //更新原始内容 $result_main = true; if(!empty($sUpdateContent)){ $aWhere = ['am_id' => $iAmId,'state' => 0,'type' => 0]; $aUpdate = ['content' => $sUpdateContent]; $result_main = Db::name('article_main')->where($aWhere)->limit(1)->update($aUpdate); } //判断更新参数 $aUpdate = ['state' => $iState,'update_time' => time()]; //数据库更新 $aWhere = ['id' => $iId]; $result_proofread= Db::name('article_proofread')->where($aWhere)->limit(1)->update($aUpdate); if($result_proofread === false || $result_main === false){ return json_encode(['status' => 7,'msg' => "Update failed"]); } Db::commit(); //查询未执行的数量 $aCount = json_decode($this->getCountByState(['article_id' => $iArticleId,'am_id' => $iAmId]),true); $aCount = empty($aCount['data']) ? [] : $aCount['data']; //返回结果 $aData = []; $aData['sum_count'] = empty($aCount['sum_count']) ? 0 : $aCount['sum_count']; $aData['am_id_count'] = empty($aCount['am_id_count']) ? 0 : $aCount['am_id_count']; $aData['content'] = $sData; return json_encode(['status' => 1,'msg' => "Update successful",'data' => $aData]); } /** * 替换错误 * @param string $errorId 错误ID * @return bool 替换是否成功 */ private function replaceError($aParam = []) { if(empty($aParam)){ return ['status' => 2,'msg' => 'The content is empty']; } //原始内容 $sContent = empty($aParam['content']) ? '' : $aParam['content']; //错误内容 $verbatim_texts = empty($aParam['verbatim_texts']) ? '' : $aParam['verbatim_texts']; //正确内容 $revised_content = empty($aParam['revised_content']) ? 0 : $aParam['revised_content']; $iLength = strlen($verbatim_texts); //内容替换 $sContent = $this->replaceByLengthAndKeyword($sContent,$iLength,$verbatim_texts,$revised_content); return ['status' => 1,'msg' => 'success','data' => $sContent]; } /** * 撤回替换错误 * @param string $errorId 错误ID * @return bool 替换是否成功 */ private function removeReplaceError($aParam = []) { if(empty($aParam)){ return ['status' => 2,'msg' => 'The content is empty']; } //原始内容 $sContent = empty($aParam['content']) ? '' : $aParam['content']; //错误内容 $verbatim_texts = empty($aParam['verbatim_texts']) ? '' : $aParam['verbatim_texts']; //正确内容 $revised_content = empty($aParam['revised_content']) ? '' : $aParam['revised_content']; $iLength = strlen($revised_content); //内容替换 $sContent = $this->replaceByLengthAndKeyword($sContent,$iLength,$revised_content,$verbatim_texts); return ['status' => 1,'msg' => 'success','data' => $sContent]; } /** * 按长度和内容特征快速定位并替换字符串 * @param string $str 原始字符串 * @param int $targetLength 目标子串长度(字节数,多字节字符需注意) * @param string $keyword 筛选关键词(目标子串需包含此关键词) * @param string $replace 替换内容 * @param string $encoding 字符编码(默认UTF-8,处理多字节字符) * @return string 替换后的字符串 */ private function replaceByLengthAndKeyword($str, $targetLength, $keyword, $replace, $encoding = 'UTF-8') { // 边界校验:避免无效参数导致错误 if (empty($str) || $targetLength <= 0 || empty($keyword)) { return ''; } $strLength = strlen($str); if ($targetLength > $strLength) { return ''; // 目标长度超过原始字符串,无需处理 } $result = $str; $targets = []; // 存储目标子串的起始位置(字节索引) // 遍历字符串,提取符合长度且包含关键词的子串位置(一次遍历完成筛选,减少内存占用) for ($i = 0; $i <= $strLength - $targetLength; $i++) { // 截取目标长度的子串 $substr = substr($result, $i, $targetLength); // 检查子串是否包含关键词(多字节安全) if (mb_strpos($substr, $keyword, 0, $encoding) !== false) { $targets[] = $i; // 只存起始位置,减少内存占用 } } // 若没有匹配目标,直接返回原始字符串 if (empty($targets)) { return ''; } // 从后往前替换(避免前面替换导致后面位置偏移) // 倒序遍历数组,无需额外排序,效率更高 for ($k = count($targets) - 1; $k >= 0; $k--) { $start = $targets[$k]; // 二次校验:替换前确认子串仍符合条件(防止重复替换或中间修改导致的偏差) $currentSubstr = substr($result, $start, $targetLength); if (mb_strpos($currentSubstr, $keyword, 0, $encoding) !== false) { $result = substr_replace($result, $replace, $start, $targetLength); } } return $result; } /** * @title 更新内容 * @param article_id 文章ID * @param am_id 行号 * @param record_id 记录ID * @param revised_content 修改内容 * @param is_update_all 是否更新所有1是2否 */ public function modify(){ //获取参数 $aParam = $this->request->post(); //参数验证-文章ID $iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'Please select a article']); } //参数验证-行号ID $iAmId = empty($aParam['am_id']) ? 0 : $aParam['am_id']; if(empty($iAmId)){ return json_encode(['status' => 2,'msg' => 'Please select the proofreading content']); } //主键ID $iId = empty($aParam['record_id']) ? 0 : $aParam['record_id']; if(empty($iId)){ return json_encode(['status' => 2,'msg' => 'Please select the review record']); } //修改后的内容 $sRevisedContent = empty($aParam['revised_content']) ? '' : $aParam['revised_content']; if(empty($sRevisedContent)){ return json_encode(['status' => 2,'msg' => 'Please enter the modification content']); } //解释说明 $sExplanation = empty($aParam['explanation']) ? '' : $aParam['explanation']; //是否更新所有1是2否 $iIsUpdateAll = empty($aParam['is_update_all']) ? 2 : $aParam['is_update_all']; //查询内容是否存在 $aWhere = ['am_id' => $iAmId,'article_id' => $iArticleId,'id' => $iId,'is_delete' => 2]; $aProofRead = Db::name('article_proofread')->field('verbatim_texts,revised_content,explanation,state')->where($aWhere)->find(); if(empty($aProofRead)){ return json_encode(['status' => 3,'msg' => 'Proofreading record is empty']); } if($aProofRead['state'] == 3){ return json_encode(['status' => 4,'msg' => 'Record deleted']); } if($aProofRead['state'] == 1){ return json_encode(['status' => 5,'msg' => 'Record executed']); } //判断更新参数 $aUpdate = ['revised_content' => $sRevisedContent,'update_time' => time()]; if(!empty($sExplanation)){ $aUpdate['explanation'] = $sExplanation; } //数据库更新 $aWhere = ['id' => $iId]; if($iIsUpdateAll == 1){ if(empty($aProofRead['verbatim_texts']) || empty($aProofRead['revised_content'])){ return json_encode(['status' => 6,'msg' => 'AI proofreading content is empty']); } $aWhere = ['verbatim_texts' => $aProofRead['verbatim_texts'],'revised_content' => $aProofRead['revised_content'],'article_id' => $iArticleId,'state' => 2]; } $result = Db::name('article_proofread')->where($aWhere)->update($aUpdate); if(!$result){ return json_encode(['status' => 7,'msg' => "Update failed"]); } //返回结果 return json_encode(['status' => 1,'msg' => "Update successful"]); } /** * @title 根据状态统计数量 * @param article_id 文章ID * @param am_id 行号 * @param state 状态1已执行2未执行3删除 */ public function getCountByState($aParam = []){ //获取参数 $aParam = empty($aParam) ? $this->request->post() : $aParam; //参数验证-文章ID $iArticleId = empty($aParam['article_id']) ? 0 : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(['status' => 2,'msg' => 'Please select a article']); } //行号 $iAmId = empty($aParam['am_id']) ? 0 : $aParam['am_id']; //查询文章 $aWhere = ['article_id' => $iArticleId]; $aArticle = Db::name('article')->field('journal_id,state')->where($aWhere)->find(); if(empty($aArticle)){ return json_encode(['status' => 3,'msg' => 'The query article does not exist']); } if($aArticle['state'] != 6 && $aArticle['state'] != 5){ return json_encode(array('status' => 4,'msg' => 'The article has not entered the proofreading stage')); } //查询校对内容 $aState = empty($aParam['state']) ? [1,2] : explode(',', $aParam['state']); $aWhere['state'] = ['in',$aState]; $aWhere['is_delete'] = 2; $aCount = Db::name('article_proofread')->field('am_id,count(id) as num,state')->where($aWhere)->group('am_id,state')->order('am_id')->select(); $aCountData = []; $iCount = -1; if(!empty($aCount)){ $iCount = 0; foreach ($aCount as $key => $value) { $aCountData[$value['am_id']][$value['state']] = $value['num']; if($value['state'] == 2){ $iCount += $value['num']; } } } //总数量 $am_id_count = -1; if(!empty($aCountData[$iAmId])){ $am_id_count = empty($aCountData[$iAmId][2]) ? 0 : $aCountData[$iAmId][2]; } $is_proofread = -1; //查询是否校对 $aWhere = ['state' => 0,'is_proofread' => 1]; if(!empty($iAmId)){ $aWhere['am_id'] = $iAmId; } $iProofCount = Db::name('article_main')->where($aWhere)->count(); $is_proofread = $iProofCount > 0 ? 1 : 2; //总数量统计 if($iCount == -1 && $iProofCount > 0){ $iCount = 0; } if($am_id_count == -1 && $iProofCount > 0){ $am_id_count = 0; } return json_encode(['status' => 1,'msg' => 'success','data' => ['sum_count' => $iCount,'am_id_count' => $am_id_count,'is_proofread' => $is_proofread]]); } /** * @title AI文章校对-行 * @param article_id 文章ID */ public function proofReadByLine(){ //获取参数 $aParam = empty($aParam) ? $this->request->post() : $aParam; $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(array('status' => 2,'msg' => 'Please select an article' )); } //行号 $iAmId = empty($aParam['am_id']) ? 0 : $aParam['am_id']; if(empty($iAmId)){ return json_encode(array('status' => 2,'msg' => 'Please select the rows that need to be proofread' )); } //查询文章 $aWhere = ['article_id' => $iArticleId]; $oArticle = new Article; $aArticle = json_decode($oArticle->get($aWhere),true); $aArticle = empty($aArticle['data']) ? [] : $aArticle['data']; if(empty($aArticle)){ return json_encode(array('status' => 3,'msg' => 'No articles requiring review were found' )); } if($aArticle['state'] != 6 && $aArticle['state'] != 5){ return json_encode(array('status' => 4,'msg' => 'The article has not entered the proofreading stage')); } //查询文章内容 $aWhere['type'] = 0; $aWhere['content'] = ['<>','']; $aWhere['state'] = 0; $aWhere['am_id'] = $iAmId; $aArticleMain = Db::table('t_article_main')->field('am_id,content,type,is_h1,is_h2,is_h3,is_proofread')->where($aWhere)->find(); if(empty($aArticleMain['content'])){ return json_encode(array('status' => 5,'msg' => 'The content of the article is empty')); } //写入校对行队列 $sQueue = \think\Queue::push('app\api\job\ArticleProofReadLine@fire',$aParam,'ArticleProofReadLine'); return json_encode(array('status' => 1,'msg' => 'Proofreading in progress, check the results in one minute')); } /** * @title AI文章校对-行队列 * @param article_id 文章ID */ public function proofReadLineQueue($aParam = []){ //获取参数 $aParam = empty($aParam) ? $this->request->post() : $aParam; $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(array('status' => 2,'msg' => 'Please select an article' )); } //行号 $iAmId = empty($aParam['am_id']) ? 0 : $aParam['am_id']; if(empty($iAmId)){ return json_encode(array('status' => 2,'msg' => 'Please select the rows that need to be proofread' )); } //查询文章 $aWhere = ['article_id' => $iArticleId]; $oArticle = new Article; $aArticle = json_decode($oArticle->get($aWhere),true); $aArticle = empty($aArticle['data']) ? [] : $aArticle['data']; if(empty($aArticle)){ return json_encode(array('status' => 3,'msg' => 'No articles requiring review were found' )); } if($aArticle['state'] != 6 && $aArticle['state'] != 5){ return json_encode(array('status' => 4,'msg' => 'The article has not entered the proofreading stage')); } //查询文章内容 $aWhere['type'] = 0; $aWhere['content'] = ['<>','']; $aWhere['state'] = 0; $aWhere['am_id'] = $iAmId; $aArticleMain = Db::table('t_article_main')->field('am_id,content,type,is_h1,is_h2,is_h3,is_proofread')->where($aWhere)->find(); if(empty($aArticleMain)){ return json_encode(array('status' => 5,'msg' => 'The content of the article is empty')); } //实例化公共方法 $oHelperFunction = new \app\common\HelperFunction; $oProofReadService = new \app\common\ProofReadService; //数据处理 if(empty($oHelperFunction->filterAllTags($aArticleMain['content']))){ return json_encode(array('status' => 6,'msg' => 'The proofreading content is empty')); } $aResult = $oProofReadService->proofread($aArticleMain['content']); //数据处理 $aError = empty($aResult['errors']) ? [] : $aResult['errors']; if(empty($aError)){ $aUpdateWhere = ['am_id' => $iAmId]; $update_result = Db::name('article_main')->where($aUpdateWhere)->limit(1)->update(['is_proofread' => 1,'proofread_time' => time()]); if($update_result === false){ return json_encode(array('status' => 6,'msg' => 'Failed to update paragraph proofreading status-'.$update_result)); } return json_encode(array('status' => 1,'msg' => 'No errors found')); } $aData = []; foreach ($aError as $key => $value) { $value['am_id'] = $iAmId; $value['article_id'] = $iArticleId; $value['proof_before'] = empty($aResult['proof_before']) ? '' : $aResult['proof_before']; $value['proof_after'] = empty($aResult['proof_after']) ? '' : $aResult['proof_after']; $value['create_time'] = time(); $aData[] = $value; } if(empty($aData)){ return json_encode(array('status' => 1,'msg' => 'Data processing failed')); } Db::startTrans(); $aUpdateWhere = ['am_id' => $iAmId]; $update_result = Db::name('article_main')->where($aUpdateWhere)->limit(1)->update(['is_proofread' => 1,'proofread_time' => time()]); //更新之前未执行的数据 $aWhere = ['am_id' => $iAmId,'article_id' => $iArticleId,'is_delete' => 2,'state' => 2]; $result_update = Db::name('article_proofread')->where($aWhere)->update(['is_delete' => 1,'update_time' => time()]); //插入 $result = Db::name('article_proofread')->insertAll($aData); if(!$result || $result_update === false || $update_result === false){ return json_encode(array('status' => 6,'msg' => 'Data operation failed:insert-'.$result.';result_update-'.$result_update.';update_result-'.$update_result)); } Db::commit(); return json_encode(['status' => 1,'msg' => 'Proofreading successful']); } /** * @title AI文章校对-全文章 * @param article_id 文章ID */ public function proofReadByArticle(){ //获取参数 $aParam = empty($aParam) ? $this->request->post() : $aParam; $iArticleId = empty($aParam['article_id']) ? '' : $aParam['article_id']; if(empty($iArticleId)){ return json_encode(array('status' => 2,'msg' => 'Please select an article' )); } //查询文章 $aWhere = ['article_id' => $iArticleId]; $oArticle = new Article; $aArticle = json_decode($oArticle->get($aWhere),true); $aArticle = empty($aArticle['data']) ? [] : $aArticle['data']; if(empty($aArticle)){ return json_encode(array('status' => 3,'msg' => 'No articles requiring review were found' )); } if($aArticle['state'] != 6 && $aArticle['state'] != 5){ return json_encode(array('status' => 4,'msg' => 'The article has not entered the proofreading stage')); } //查询文章内容 $aWhere['type'] = 0; $aWhere['content'] = ['<>','']; $aWhere['state'] = 0; $iCount = Db::table('t_article_main')->where($aWhere)->count(); if(empty($iCount)){ return json_encode(array('status' => 5,'msg' => 'The content of the article is empty')); } //查询是否进行过校对 $aProofReadWhere = ['article_id' => $iArticleId,'state' => 2,'is_delete' => 2]; $iCount = Db::name('article_proofread')->where($aProofReadWhere)->count(); if(!empty($iCount)){ return json_encode(array('status' => 6,'msg' => 'The article or paragraph has been proofread')); } //写入校对行队列 $sQueue = \think\Queue::push('app\api\job\ArticleProofReadedi@fire',$aParam,'ArticleProofReadedi'); return json_encode(array('status' => 1,'msg' => 'Proofreading in progress, check the results in one minute')); } }