from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.models.database import get_db from app.models.user import UserDB, UserRole from app.api.deps import get_current_user, get_admin_user from app.core.response import success_response, error_response, ResponseModel from app.models.timeperiod import ( TimePeriodDB, TimePeriodCreate, TimePeriodUpdate, TimePeriodInfo ) from typing import List, Optional import logging router = APIRouter() @router.post("", response_model=ResponseModel) async def create_time_period( time_period: TimePeriodCreate, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """创建配送时段""" try: # 检查时间段是否合理 if time_period.from_time >= time_period.to_time: return error_response(code=400, message="开始时间必须早于结束时间") # 创建新的时间段 db_time_period = TimePeriodDB( name=time_period.name, from_time=time_period.from_time, to_time=time_period.to_time, ) db.add(db_time_period) db.commit() db.refresh(db_time_period) return success_response(message="配送时段创建成功", data=TimePeriodInfo.model_validate(db_time_period)) except Exception as e: db.rollback() logging.exception(f"创建配送时段失败: {str(e)}") return error_response(code=500, message="创建配送时段失败,请稍后重试") @router.get("", response_model=ResponseModel) async def get_time_periods( db: Session = Depends(get_db) ): """获取配送时段列表""" try: query = db.query(TimePeriodDB) # 按开始时间排序 query = query.order_by(TimePeriodDB.from_time.asc()) time_periods = query.all() return success_response(data=[TimePeriodInfo.model_validate(tp) for tp in time_periods]) except Exception as e: logging.exception(f"获取配送时段列表失败: {str(e)}") return error_response(code=500, message="获取配送时段列表失败,请稍后重试") @router.get("/{time_period_id}", response_model=ResponseModel) async def get_time_period( time_period_id: int, db: Session = Depends(get_db) ): """获取配送时段详情""" try: time_period = db.query(TimePeriodDB).filter(TimePeriodDB.id == time_period_id).first() if not time_period: return error_response(code=404, message="配送时段不存在") return success_response(data=TimePeriodInfo.model_validate(time_period)) except Exception as e: logging.exception(f"获取配送时段详情失败: {str(e)}") return error_response(code=500, message="获取配送时段详情失败,请稍后重试") @router.put("/{time_period_id}", response_model=ResponseModel) async def update_time_period( time_period_id: int, time_period: TimePeriodUpdate, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """更新配送时段""" try: db_time_period = db.query(TimePeriodDB).filter(TimePeriodDB.id == time_period_id).first() if not db_time_period: return error_response(code=404, message="配送时段不存在") # 更新字段 if time_period.name is not None: db_time_period.name = time_period.name if time_period.from_time is not None: db_time_period.from_time = time_period.from_time if time_period.to_time is not None: db_time_period.to_time = time_period.to_time # 检查时间段是否合理 if db_time_period.from_time >= db_time_period.to_time: return error_response(code=400, message="开始时间必须早于结束时间") db.commit() db.refresh(db_time_period) return success_response(message="配送时段更新成功", data=TimePeriodInfo.model_validate(db_time_period)) except Exception as e: db.rollback() logging.exception(f"更新配送时段失败: {str(e)}") return error_response(code=500, message="更新配送时段失败,请稍后重试") @router.delete("/{time_period_id}", response_model=ResponseModel) async def delete_time_period( time_period_id: int, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """删除配送时段""" try: db_time_period = db.query(TimePeriodDB).filter(TimePeriodDB.id == time_period_id).first() if not db_time_period: return error_response(code=404, message="配送时段不存在") db.delete(db_time_period) db.commit() return success_response(message="配送时段删除成功") except Exception as e: db.rollback() logging.exception(f"删除配送时段失败: {str(e)}") return error_response(code=500, message="删除配送时段失败,请稍后重试")