增加标段获取最大水准数据

This commit is contained in:
lhx
2025-11-15 16:36:40 +08:00
parent bde3ebf0cc
commit f8ed6cb5d3
5 changed files with 28 additions and 23 deletions

View File

@@ -130,7 +130,6 @@ def batch_import_level_data(request: BatchLevelDataImportRequest, db: Session =
logger.info(f"Starting batch import level data, count: {len(request.data)}")
data_list = request.data
result = level_service.batch_import_level_data(db, data_list)
logger.info(f"Batch import level data completed: {result['message']}")
return DataImportResponse(
code=ResponseCode.SUCCESS if result.get('success') else ResponseCode.IMPORT_FAILED,
@@ -390,17 +389,17 @@ def get_settlement_by_linecode(
try:
linecode = request.linecode # 从请求体中获取linecode
logger.info(f"接口请求根据linecode={linecode}查询沉降数据")
settlement_service = SettlementDataService()
result = settlement_service.get_settlement_by_linecode(db, linecode)
return DataResponse(
code=ResponseCode.SUCCESS,
message=f"查询成功,共获取{len(result['settlement_data'])}条沉降数据",
total=len(result['settlement_data']),
data=result['settlement_data']
)
except Exception as e:
logger.error(f"查询沉降数据失败:{str(e)}", exc_info=True)
return DataResponse(
@@ -417,7 +416,7 @@ def get_settlement_by_nyid(
try:
nyid = request.NYID # 从请求体中获取nyid
logger.info(f"接口请求根据nyid={nyid}查询沉降数据")
settlement = SettlementDataService()
# 获取模型实例列表
checkpoint_instances = settlement.get_by_nyid(db, nyid=nyid)
@@ -425,14 +424,14 @@ def get_settlement_by_nyid(
checkpoint_data = [instance.__dict__ for instance in checkpoint_instances]
# 清理 SQLAlchemy 内部属性(可选,避免多余字段)
checkpoint_data = [{k: v for k, v in item.items() if not k.startswith('_sa_')} for item in checkpoint_data]
return DataResponse(
code=ResponseCode.SUCCESS,
message=f"查询成功,共获取{len(checkpoint_data)}条沉降数据nyid={nyid}",
total=len(checkpoint_data),
data=checkpoint_data
)
except Exception as e:
logger.error(f"查询沉降数据失败:{str(e)}", exc_info=True)
return DataResponse(
@@ -448,17 +447,17 @@ def get_today_data(request: TodayDataRequest, db: Session = Depends(get_db)):
# 获取请求参数如果需要从请求体中接收参数可通过request获取
# 示例如需接收account_id可通过 request.account_id 获取
# account_id = request.account_id # 根据根据实际需求决定是否需要
# 触发定时任务(如果需要传入参数,可在这里添加)
from ..utils.scheduler import scheduled_get_max_nyid_by_point_id
scheduled_get_max_nyid_by_point_id()
# 调用服务层获取数据
account_id = request.account_id
daily_service = DailyDataService()
# 如需使用请求参数,可修改为 daily_service.get_daily_data_by_account(db, account_id=account_id)
daily_data = daily_service.get_daily_data_by_account(db, account_id=account_id)
return DataResponse(
code=ResponseCode.SUCCESS,
message="定时时任务触发执行成功!任务已开始处理(具体结果查看系统日志)",
@@ -526,7 +525,7 @@ def get_checkpoint_by_point(request: PointByAccountRequest, db: Session = Depend
point_id = request.point_id
checkpoint_service = CheckpointService()
result_data = checkpoint_service.get_by_point_id(db, point_id=point_id)
# 使用 __dict__ 转换(过滤内部属性)
if result_data:
# 复制字典并排除 SQLAlchemy 内部属性
@@ -535,7 +534,7 @@ def get_checkpoint_by_point(request: PointByAccountRequest, db: Session = Depend
data_list = [data_dict]
else:
data_list = []
return DataResponse(
code=ResponseCode.SUCCESS,
message="查询成功",
@@ -562,7 +561,7 @@ def get_checkpoint_by_point(request: LevelDataQueryRequest, db: Session = Depend
NYID = result_data.NYID if result_data else None
settlement_service = SettlementDataService()
result_data = settlement_service.get_by_nyid(db, nyid=NYID)
# 使用 __dict__ 转换(过滤内部属性)
if result_data:
# 复制字典并排除 SQLAlchemy 内部属性
@@ -571,7 +570,7 @@ def get_checkpoint_by_point(request: LevelDataQueryRequest, db: Session = Depend
data_list = [data_dict]
else:
data_list = []
return DataResponse(
code=ResponseCode.SUCCESS,
message="查询成功",

View File

@@ -19,7 +19,7 @@ def get_level_data_by_project(request: LevelDataRequest, db: Session = Depends(g
"""
try:
level_service = LevelDataService()
level_data_list = level_service.get_level_data_by_project_name(db, request.project_name)
level_data_list = level_service.get_level_data_by_project_name(db, project_name=request.project_name, nyid_max=request.nyid_max)
return LevelDataListResponse(
code=ResponseCode.SUCCESS,

View File

@@ -22,6 +22,7 @@ class LevelDataResponse(LevelDataBase):
class LevelDataRequest(BaseModel):
"""水准数据请求模型"""
project_name: str = Field(..., description="标段名称")
nyid_max: Optional[bool] = Field(False, description="是否只获取最新期数的水准数据")
class LevelDataListResponse(BaseModel):
"""水准数据列表响应格式"""

View File

@@ -148,7 +148,7 @@ class LevelDataService(BaseService[LevelData]):
'failed_items': failed_items
}
def get_level_data_by_project_name(self, db: Session, project_name: str) -> List[Dict[str, Any]]:
def get_level_data_by_project_name(self, db: Session, project_name: str, nyid_max: bool = False) -> List[Dict[str, Any]]:
"""
通过project_name获取全部水准线路
业务逻辑:
@@ -198,11 +198,17 @@ class LevelDataService(BaseService[LevelData]):
nyid_list = list(set([settlement.NYID for settlement in settlements if settlement.NYID]))
logger.info(f"查询到{len(nyid_list)}个期数ID")
# 5. 查询水准数据表获取水准数据 (通过NYID)
level_data_list = db.query(LevelData).filter(LevelData.NYID.in_(nyid_list)).all()
if not level_data_list:
logger.warning(f"未查询到对应的水准数据")
return []
if nyid_max:
# 只获取最新期数的水准数据
nyid_list = [max(nyid_list, key=int)]
logger.info(f"筛选后只获取最新期数ID: {nyid_list}")
level_data_list = db.query(LevelData).filter(LevelData.NYID.in_(nyid_list)).all()
else:
# 5. 查询水准数据表获取水准数据 (通过NYID)
level_data_list = db.query(LevelData).filter(LevelData.NYID.in_(nyid_list)).all()
if not level_data_list:
logger.warning(f"未查询到对应的水准数据")
return []
# 6. 将水准数据依照linecode去重同linecode只需保留一个
linecode_seen = set()

View File

@@ -337,13 +337,12 @@ class OriginalDataService(BaseService[OriginalData]):
# ===== 性能优化:批量查询沉降数据 =====
# 统一转换为字符串处理数据库NYID字段是VARCHAR类型
nyid_list = list(set(str(item.get('NYID')) for item in data if item.get('NYID')))
logger.info(f"Querying settlement data for nyid list: {nyid_list}")
settlements = db.query(SettlementData).filter(SettlementData.NYID.in_(nyid_list)).all()
logger.info(f"Found {len(settlements)} settlement records")
settlement_map = {s.NYID: s for s in settlements}
missing_nyids = set(nyid_list) - set(settlement_map.keys())
if missing_nyids:
logger.warning(f"[批量导入原始数据] 批量查询settlement数据失败 Nyid: {list(missing_nyids)}")
db.rollback()
return {
'success': False,