通过水准线路编码生成 daily 数据

This commit is contained in:
lhx
2025-11-07 13:43:35 +08:00
parent b97617cb15
commit 772b5924ef
5 changed files with 227 additions and 4 deletions

89
app/api/daily.py Normal file
View File

@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import Dict, Any
from ..core.database import get_db
from ..core.response_code import ResponseCode
from ..schemas.daily import LinecodeToDailyRequest
from ..services.daily import DailyDataService
import logging
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/daily", tags=["日常数据管理"])
# 实例化服务类
daily_service = DailyDataService()
@router.post("/create_from_linecode", response_model=Dict[str, Any])
def create_daily_data_from_linecode(
request: LinecodeToDailyRequest,
db: Session = Depends(get_db)
):
"""
综合业务接口:通过水准线路编码生成 daily 数据
业务逻辑:
1. 在水准数据表level_data中查找符合 linecode 的记录,且 NYID 最大
2. 通过 NYID 查询沉降数据表settlement_data
3. 通过沉降数据的 point_id 查询观测点表checkpoint得到 section_id
4. 通过 section_id 查询断面表section_data得到 account_id
5. 整合这些数据,形成 daily 对象,插入到数据库表
返回:成功插入的记录数
"""
try:
logger.info(f"开始处理 linecode={request.linecode} 的 daily 数据生成请求")
# 调用服务层方法
created_records = daily_service.create_daily_from_linecode(
db=db,
linecode=request.linecode,
account_id=request.account_id
)
if not created_records:
return {
"code": ResponseCode.SUCCESS,
"message": "没有生成任何 daily 记录",
"total": 0,
"data": []
}
logger.info(f"成功生成 {len(created_records)} 条 daily 记录")
return {
"code": ResponseCode.SUCCESS,
"message": f"成功生成 {len(created_records)} 条 daily 记录",
"total": len(created_records),
"data": [
{
"id": record.id,
"user_id": record.user_id,
"account_id": record.account_id,
"point_id": record.point_id,
"NYID": record.NYID,
"linecode": record.linecode,
"section_id": record.section_id,
"remaining": record.remaining,
"is_all": record.is_all
}
for record in created_records
]
}
except ValueError as e:
logger.warning(str(e))
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=str(e)
)
except HTTPException:
raise
except Exception as e:
logger.error(f"生成 daily 数据失败:{str(e)}", exc_info=True)
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"生成 daily 数据失败:{str(e)}"
)