|
|
@@ -92,13 +92,7 @@ from .reviewers.check_completeness.utils.file_utils import write_json
|
|
|
from core.construction_review.component.reviewers.base_reviewer import ReviewResult
|
|
|
from .reviewers.outline_check import outline_review_results_df
|
|
|
from .reviewers.check_completeness.utils.redis_csv_utils import (
|
|
|
- df_store_to_redis,
|
|
|
get_redis_connection,
|
|
|
- main,
|
|
|
- display_redis_data,
|
|
|
- store_header_to_redis,
|
|
|
- read_from_redis_and_save_csv,
|
|
|
- store_row_to_redis,
|
|
|
)
|
|
|
@dataclass
|
|
|
class ReviewResult:
|
|
|
@@ -770,15 +764,20 @@ class AIReviewEngine(BaseReviewer):
|
|
|
review_results_df['title'] = chapter_labels
|
|
|
# review_results_df.to_csv(Path('temp') / 'document_temp' / '2_spec_review_results.csv', encoding='utf-8-sig', index=False)
|
|
|
# csv_file = rf'temp\document_temp\2_spec_review_results.csv'
|
|
|
- path2 = rf'temp\document_temp\outlines_review_results.csv'
|
|
|
+ # path2 = rf'temp\document_temp\outlines_review_results.csv'
|
|
|
# data_df = pd.read_csv(csv_file, encoding='utf-8-sig')
|
|
|
# data_df = review_results_df
|
|
|
- outline_review_results = outline_review_results_df(data=review_results_df, path=path2)
|
|
|
-
|
|
|
+ outline_review_results = outline_review_results_df(data=review_results_df)
|
|
|
+
|
|
|
logger.info(f"[完整性检查] 准备将大纲审查结果存储到Redis,bind_id: {trace_id_idx}")
|
|
|
logger.info(f"[完整性检查] 大纲审查结果行数: {len(outline_review_results) if outline_review_results is not None else 'None'}")
|
|
|
-
|
|
|
- df_store_to_redis(self.redis_client, data=outline_review_results, bind_id=trace_id_idx)
|
|
|
+ outline_review_result = await self.outline_check(
|
|
|
+ trace_id_idx = state["callback_task_id"],
|
|
|
+ outline_content = outline_review_results,
|
|
|
+ state = state,
|
|
|
+ stage_name = state.get("stage_name", "大纲审查")
|
|
|
+ )
|
|
|
+ # df_store_to_redis(self.redis_client, data=outline_review_results, bind_id=trace_id_idx)
|
|
|
|
|
|
logger.info(f"[完整性检查] 数据已成功存储到Redis,bind_id: {trace_id_idx}")
|
|
|
|
|
|
@@ -799,7 +798,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
analyzer = ResultAnalyzer(str(csv_path))
|
|
|
processed_results = analyzer.process_results(review_results)
|
|
|
spec_summary_csv_path = Path('temp') / 'document_temp' / '3_spec_review_summary.csv'
|
|
|
- summary_rows = analyzer.build_spec_summary(processed_results)
|
|
|
+ summary_rows = analyzer.build_spec_summary(processed_results, spec_summary_csv_path)
|
|
|
# logger.info(f" 规范覆盖汇总结果已保存至: {spec_summary_csv_path}")
|
|
|
summary_rows = pd.DataFrame(summary_rows)
|
|
|
summary_rows = summary_rows[summary_rows['标签'].isin(review_results_flag)]
|
|
|
@@ -808,10 +807,11 @@ class AIReviewEngine(BaseReviewer):
|
|
|
# 生成缺失要点 JSON 列表,便于前端消费
|
|
|
|
|
|
issues = analyzer.build_missing_issue_list(summary_rows)
|
|
|
-
|
|
|
+ # issues["response"] += outline_review_result
|
|
|
+ # issues["response"].extend(outline_review_result)
|
|
|
# 包装成外层格式化期望的结构
|
|
|
execution_time = time.time() - start_time
|
|
|
- return {
|
|
|
+ check_result = {
|
|
|
"details": {
|
|
|
"name": "completeness_check",
|
|
|
"response": issues.get("response", []),
|
|
|
@@ -822,6 +822,8 @@ class AIReviewEngine(BaseReviewer):
|
|
|
"success": True,
|
|
|
"execution_time": execution_time
|
|
|
}
|
|
|
+
|
|
|
+ return check_result,trace_id_idx
|
|
|
except Exception as e:
|
|
|
execution_time = time.time() - start_time
|
|
|
error_msg = f"{name} 审查失败: {str(e)}"
|
|
|
@@ -982,8 +984,8 @@ class AIReviewEngine(BaseReviewer):
|
|
|
return await self.review("parameter_compliance_check", trace_id, reviewer_type, prompt_name, combined_content, review_references,
|
|
|
reference_source, state, stage_name, timeout=45, model_name="qwen3_30b")
|
|
|
|
|
|
- async def outline_check(self, trace_id_idx: str, outline_content: Dict[str, Any],
|
|
|
- state:dict,stage_name:str) -> Dict[str, Any]:
|
|
|
+ async def outline_check(self, outline_content: pd.DataFrame,trace_id_idx: str,
|
|
|
+ state:dict =None,stage_name:str =None) -> Dict[str, Any]:
|
|
|
"""
|
|
|
大纲审查
|
|
|
|
|
|
@@ -993,6 +995,7 @@ class AIReviewEngine(BaseReviewer):
|
|
|
state: 状态
|
|
|
stage_name: 阶段名称
|
|
|
"""
|
|
|
+ start_time = time.time()
|
|
|
logger.info(f"开始大纲审查,trace_id: {trace_id_idx}")
|
|
|
|
|
|
# CSV文件路径
|
|
|
@@ -1000,12 +1003,13 @@ class AIReviewEngine(BaseReviewer):
|
|
|
|
|
|
# 存储所有缺失项
|
|
|
missing_items = []
|
|
|
-
|
|
|
+ metadata = {}
|
|
|
try:
|
|
|
# 从Redis读取并保存为新的CSV文件
|
|
|
- rows_df = read_from_redis_and_save_csv(self.redis_client, bind_id=trace_id_idx)
|
|
|
- df = rows_df
|
|
|
-
|
|
|
+ # rows_df = read_from_redis_and_save_csv(self.redis_client, bind_id=trace_id_idx)
|
|
|
+ df = outline_content
|
|
|
+ # df = merge_results_by_classification(rows_df)
|
|
|
+ df.to_csv(csv_path, encoding='utf-8-sig', index=False)
|
|
|
# 检查 df 是否为 None
|
|
|
if df is None:
|
|
|
logger.error(f"[大纲审查] Redis中不存在ID '{trace_id_idx}' 的数据,无法进行大纲审查")
|
|
|
@@ -1048,44 +1052,84 @@ class AIReviewEngine(BaseReviewer):
|
|
|
# 检查字典中的每个字段
|
|
|
if isinstance(merged_results, dict):
|
|
|
logger.info(f"开始大纲审查")
|
|
|
+
|
|
|
+ # 获取chapter_label列表
|
|
|
+ chapter_labels_list = row.get(chapter_label_col, [])
|
|
|
+ if not isinstance(chapter_labels_list, list):
|
|
|
+ chapter_labels_list = [str(chapter_labels_list)]
|
|
|
+
|
|
|
+ # 获取review_results_summary字典的所有键,用于reason字段
|
|
|
+ merged_results_keys = list(merged_results.keys())
|
|
|
+ merged_results_keys_str = "、".join(merged_results_keys)
|
|
|
+
|
|
|
for field_name, field_value in merged_results.items():
|
|
|
# 检查列表是否为空
|
|
|
if isinstance(field_value, list) and len(field_value) == 0:
|
|
|
- # 生成缺失项
|
|
|
- missing_item = {
|
|
|
- "check_item_code": "catalogue_completeness_check",
|
|
|
- "check_result": {
|
|
|
+ # 为chapter_label列表中的每个值创建单独的缺失项
|
|
|
+ for chapter_label in chapter_labels_list:
|
|
|
+ missing_item = {
|
|
|
+ # "check_item_code": "catalogue_completeness_check",
|
|
|
"issue_point": f"{field_name}缺失",
|
|
|
- "location": "",
|
|
|
- "suggestion": "",
|
|
|
- "reason": "",
|
|
|
- "risk_level": ""
|
|
|
- }
|
|
|
- }
|
|
|
- missing_items.append(missing_item)
|
|
|
+ "location": chapter_label,
|
|
|
+ "suggestion": f"在待审查目录中未找到与'{field_name}'对应的章节;当前章节仅涉及'{chapter_label}',未涵盖'{field_name}'相关内容;整改建议:建议在本章或前序章节中增设'{field_name}'相关内容,确保与审查规范要求一致。",
|
|
|
+ "reason": f"本章应包含{merged_results_keys_str}等{len(merged_results_keys)}个方面。",
|
|
|
+ "risk_level": "高风险",
|
|
|
+ "review_references": '',
|
|
|
+ "reference_source": '',
|
|
|
|
|
|
-
|
|
|
+ }
|
|
|
+ missing_items.append(missing_item)
|
|
|
+
|
|
|
+ # if not metadata:
|
|
|
+ # metadata = {
|
|
|
+ # "review_location_label": df['chapter_label'].to_list()[-1],
|
|
|
+ # "chapter_code": "catalogue",
|
|
|
+ # "original_content": '',
|
|
|
+ # }
|
|
|
logger.info(f"大纲审查完成,共发现 {len(missing_items)} 个缺失项")
|
|
|
-
|
|
|
+ execution_time = time.time() - start_time
|
|
|
except FileNotFoundError:
|
|
|
logger.error(f"CSV文件不存在: {csv_path}")
|
|
|
+ execution_time = time.time() - start_time
|
|
|
return {
|
|
|
- 'outline_review_result': [],
|
|
|
- 'error': f'CSV文件不存在: {csv_path}'
|
|
|
+ "details": {
|
|
|
+ "name": "outline_check",
|
|
|
+ "response": [],
|
|
|
+ "review_location_label": "",
|
|
|
+ "chapter_code": "catalogue",
|
|
|
+ "original_content": ""
|
|
|
+ },
|
|
|
+ "success": False,
|
|
|
+ "execution_time": execution_time
|
|
|
}
|
|
|
except Exception as e:
|
|
|
logger.error(f"大纲审查失败: {str(e)}", exc_info=True)
|
|
|
+ execution_time = time.time() - start_time
|
|
|
return {
|
|
|
- 'outline_review_result': [],
|
|
|
- 'error': f'大纲审查失败: {str(e)}'
|
|
|
+ "details": {
|
|
|
+ "name": "outline_check",
|
|
|
+ "response": [],
|
|
|
+ "review_location_label": "",
|
|
|
+ "chapter_code": "catalogue",
|
|
|
+ "original_content": ""
|
|
|
+ },
|
|
|
+ "success": False,
|
|
|
+ "execution_time": execution_time
|
|
|
}
|
|
|
-
|
|
|
- return {
|
|
|
- 'outline_review_result':
|
|
|
- {
|
|
|
+ logger.info(f"大纲审查完成,耗时 {execution_time:.2f} 秒")
|
|
|
+ outcheck_result = {
|
|
|
+ "details": {
|
|
|
+ "name": "completeness_check",
|
|
|
"response": missing_items,
|
|
|
- }
|
|
|
- }
|
|
|
+ "review_location_label": df['chapter_label'].to_list()[-1],
|
|
|
+ "chapter_code": 'catalogue',
|
|
|
+ "original_content": ""
|
|
|
+ },
|
|
|
+ "success": True,
|
|
|
+ "execution_time": execution_time
|
|
|
+ }
|
|
|
+ logger.info(f"大纲审查结果: {outcheck_result}")
|
|
|
+ return outcheck_result
|
|
|
|
|
|
async def reference_basis_reviewer(self, review_data: Dict[str, Any], trace_id: str,
|
|
|
state: dict = None, stage_name: str = None) -> Dict[str, Any]:
|