| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- """
- 审查结果获取接口Mock实现
- 模拟风险统计、总结报告和问题条文返回
- """
- import random
- import os
- import json
- from datetime import datetime
- from fastapi import APIRouter, HTTPException, Query
- from pydantic import BaseModel
- from typing import Optional, Dict, Any
- from .schemas.error_schemas import ReviewResultsErrors
- # 导入文件上传模块的存储
- try:
- from .file_upload import uploaded_files
- except ImportError:
- from views.construction_review.file_upload import uploaded_files
- class ReviewResultsRequest(BaseModel):
- id: str = None
- user: str = None
- type: str = None # "summary" 或 "issues"
- class ReviewResultsResponse(BaseModel):
- code: int
- data: Dict[str, Any]
- review_results_router = APIRouter(prefix="/sgsc", tags=["前端接口"])
- def generate_risk_stats():
- """生成模拟风险统计"""
- return {
- "high": random.randint(1, 5),
- "medium": random.randint(3, 8),
- "low": random.randint(2, 6)
- }
- def generate_dimension_scores():
- """生成模拟四维评分"""
- return {
- "safety": random.randint(60, 95),
- "quality": random.randint(55, 90),
- "schedule": random.randint(70, 95),
- "cost": random.randint(65, 90)
- }
- def generate_summary_report(risk_stats):
- """生成模拟总结报告"""
- total_issues = sum(risk_stats.values())
- if risk_stats["high"] > 0:
- return f"该施工方案存在{risk_stats['high']}处高风险问题,需重点整改。建议在施工前完善相关技术细节,确保符合规范要求。"
- elif total_issues > 5:
- return f"该施工方案整体符合规范要求,但存在{total_issues}处中低风险问题,建议优化完善。"
- else:
- return "该施工方案整体符合规范要求,存在少量细节问题,可正常施工。"
- def generate_issues():
- """生成模拟问题条文"""
- issues = []
- # 高风险问题示例
- high_risk_issues = [
- {
- "page": 12,
- "chapter": "1.1 路面材料要求",
- "original_content": "采用沥青、混凝土作为路面施工材料,未明确标号及来源;施工段落仅标注主线段,未细化具体桩号范围"
- },
- {
- "page": 45,
- "chapter": "3.2 模板安装工艺",
- "original_content": "模板未按设计要求进行预压,直接浇筑混凝土;预压观测记录采用文字描述,未体现观测点布置及沉降数据"
- }
- ]
- # 中风险问题示例
- medium_risk_issues = [
- {
- "page": 28,
- "chapter": "2.3 施工机械配置",
- "original_content": "施工机械清单未包含备用设备,未制定设备故障应急预案"
- },
- {
- "page": 67,
- "chapter": "4.1 质量保证措施",
- "original_content": "质量检测频次未明确具体标准,检验方法描述不够详细"
- }
- ]
- # 生成高风险问题
- for i, issue_data in enumerate(high_risk_issues):
- issue_id = f"ISSUE-HL-{datetime.now().strftime('%Y%m%d')}-{i+1:03d}"
- reviews = [
- {
- "check_item": "强制性标准符合性检查",
- "check_result": "不符合",
- "risk_info": {"risk_level": "high"},
- "suggestion": {
- "suggestion_type": "professional",
- "suggestion_content": "按相关规范要求,明确材料规格和施工参数,确保符合技术标准要求",
- "verification_standard": "整改后需提供技术规格书,由项目总工签字确认"
- }
- },
- {
- "check_item": "条文完整性检查",
- "check_result": "不符合",
- "risk_info": {"risk_level": "low"},
- "suggestion": {
- "suggestion_type": "completeness",
- "suggestion_content": "补充详细的施工范围描述,与施工平面布置图桩号标注一致",
- "verification_standard": "参考施工方案编制导则相关条款"
- }
- }
- ]
- issues.append({
- "issue_id": issue_id,
- "metadata": issue_data,
- "risk_summary": {
- "max_risk_level": "high",
- "risk_count": {"high": 1, "medium": 1, "low": 1},
- "key_risk_reminder": "高风险点:技术参数缺失,需24小时内整改"
- },
- "review_lists": reviews
- })
- # 生成中风险问题
- for i, issue_data in enumerate(medium_risk_issues):
- issue_id = f"ISSUE-ML-{datetime.now().strftime('%Y%m%d')}-{i+1:03d}"
- reviews = [
- {
- "check_item": "规范性检查",
- "check_result": "不符合",
- "risk_info": {"risk_level": "medium"},
- "suggestion": {
- "suggestion_type": "normative",
- "suggestion_content": "完善应急预案制定,明确设备故障处理流程和备用资源配置",
- "verification_standard": "参考《施工组织设计规范》相关要求"
- }
- }
- ]
- issues.append({
- "issue_id": issue_id,
- "metadata": issue_data,
- "risk_summary": {
- "max_risk_level": "medium",
- "risk_count": {"high": 0, "medium": 1, "low": 0},
- "key_risk_reminder": "中风险点:管理措施不完善,需在施工前完善"
- },
- "review_lists": reviews
- })
- return issues
- @review_results_router.get("/review_results", response_model=ReviewResultsResponse)
- async def review_results(
- callback_task_id: str = Query(..., description="回调任务ID"),
- user: str = Query(..., description="用户ID")
- ):
- """
- 获取审查结果接口 - 从temp目录读取保存的结果文件
- """
- try:
- # 验证参数
- if not callback_task_id:
- raise HTTPException(status_code=400, detail="缺少callback_task_id参数")
- if not user:
- raise HTTPException(status_code=400, detail="缺少user参数")
- # 验证用户标识(应该是指定用户如user-001)
- valid_users = {"user-001", "user-002", "user-003"} # 可以配置化
- if user not in valid_users:
- raise HTTPException(status_code=403, detail="无效的用户ID")
- # 构建文件路径
- temp_dir = "temp"
- file_path = os.path.join(temp_dir, f"{callback_task_id}.json")
- # 检查文件是否存在
- if not os.path.exists(file_path):
- raise HTTPException(status_code=404, detail="审查结果文件不存在")
- # 读取文件内容
- try:
- with open(file_path, 'r', encoding='utf-8') as f:
- review_results = json.load(f)
- except json.JSONDecodeError:
- raise HTTPException(status_code=500, detail="审查结果文件格式错误")
- except Exception as e:
- raise HTTPException(status_code=500, detail=f"读取文件失败: {str(e)}")
- # 验证文件中的用户信息是否匹配
- if review_results.get("user_id") != user:
- raise HTTPException(status_code=403, detail="用户权限验证失败")
- return ReviewResultsResponse(
- code=200,
- data=review_results
- )
- except HTTPException:
- raise
- except Exception as e:
- raise HTTPException(status_code=500, detail=f"服务器内部错误: {str(e)}")
|