from datetime import datetime, timezone from fastapi.logger import logger from sqlalchemy import and_ from apps.constants.constants import AD_SORT_PLATFORM_LIST from apps.constants.message import PAGE_SIZE from apps.forms.ad_sort import AdSortForm from apps.models.ad_sort import AdSort from apps.models.item import Item from apps.models.item_cate import ItemCate from extensions import get_db_session from utils import R from utils.security import get_user_id from utils.request import like_contains # 获取广告位分页数据 def get_ad_sort_page(request): db = get_db_session() # 页码 page = int(request.query_params.get("pageNo", 1)) # 每页数 limit = int(request.query_params.get("pageSize", PAGE_SIZE)) # 实例化查询对象 query = db.query(AdSort).filter(AdSort.is_delete == 0) # 名称 name = request.query_params.get('name') if name: query = query.filter(AdSort.name.like(like_contains(name), escape='\\')) # 投放平台:1PC站 2WAP站 3微信小程序 4APP应用 platform = request.query_params.get('platform') if platform: query = query.filter(AdSort.platform == platform) # 栏目状态筛选 status = request.query_params.get('status') if status: query = query.filter(AdSort.status == status) # 排序 query = query.order_by(AdSort.sort.asc()) # 记录总数 count = query.count() # 分页查询 ad_sort_list = query.limit(limit).offset((page - 1) * limit).all() # 若当前页超出末页(数据被并发删除),自动回退到第一页 if page > 1 and not ad_sort_list: page = 1 count = query.count() ad_sort_list = query.limit(limit).offset(0).all() # 实例化结果 result = [] # 遍历数据源 if len(ad_sort_list) > 0: for v in ad_sort_list: # 对象转字典 data = v.to_dict() # 投放平台 data['platform_name'] = AD_SORT_PLATFORM_LIST.get(v.platform) # 站点信息 item_info = db.query(Item).filter(and_(Item.id == v.item_id, Item.is_delete == 0)).first() data['item_name'] = item_info.name if item_info else None # 栏目信息 cate_info = db.query(ItemCate).filter(and_(ItemCate.id == v.cate_id, ItemCate.is_delete == 0)).first() data['cate_name'] = cate_info.name if cate_info else None # 加入列表 result.append(data) # 返回结果 return R.ok(data=result, count=count) # 根据ID查询广告位详情 def get_ad_sort_detail(adsort_id): db = get_db_session() # 根据ID查询广告位 adsort = db.query(AdSort).filter(and_(AdSort.id == adsort_id, AdSort.is_delete == 0)).first() # 查询结果为空判断 if not adsort: return None # 对象转字典 data = adsort.to_dict() # 返回结果 return data # 添加广告位 def add_ad_sort(request, data: AdSortForm): db = get_db_session() # 表单数据赋值给对象 adsort = AdSort(**data.model_dump(exclude={'id'})) adsort.create_user = get_user_id(request) # 插入数据 adsort.save() # 返回结果 return R.ok(msg="添加成功") # 更新广告位 def update_ad_sort(request, data: AdSortForm): db = get_db_session() # 记录ID判空 if not data.id or data.id <= 0: return R.failed("记录ID不能为空") # 根据ID查询记录 adsort = db.query(AdSort).filter(and_(AdSort.id == data.id, AdSort.is_delete == 0)).first() # 查询结果判空 if not adsort: return R.failed("记录不存在") # 构造更新数据(排除 id) updData = data.model_dump(exclude={'id'}) updData['update_user'] = get_user_id(request) updData['update_time'] = datetime.now(tz=timezone.utc) result = db.query(AdSort).filter_by(id=data.id).update(updData) # 提交数据 if not result: return R.failed("更新失败") # 返回结果 return R.ok(msg="更新成功") # 删除广告位 def delete_ad_sort(adsort_id): return AdSort.batch_delete_r(adsort_id) # 查询广告位列表 def get_ad_sort_list(): db = get_db_session() # 查询全部广告位列表 ad_sort_list = db.query(AdSort).filter(AdSort.is_delete == 0).all() # 实例化广告位对象列表 sortList = [] if ad_sort_list: for v in ad_sort_list: item = { 'id': v.id, 'description': v.description + "=>" + str(v.loc_id) } # 加入列表 sortList.append(item) # 返回结果 return sortList