ETest-Vue-FastAPI/ruoyi-fastapi-backend/module_admin/system/dao/test_item_dao.py

170 lines
5.7 KiB
Python

from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.system.entity.do.test_item_do import TestItem
from module_admin.system.entity.vo.test_item_vo import Test_itemModel, Test_itemPageQueryModel
from utils.page_util import PageUtil
class Test_itemDao:
"""
测试单元模块数据库操作层
"""
@classmethod
async def get_test_item_detail_by_id(cls, db: AsyncSession, id: int):
"""
根据ID获取测试单元详细信息
:param db: orm对象
:param id: ID
:return: 测试单元信息对象
"""
test_item_info = (
(
await db.execute(
select(TestItem)
.where(
TestItem.id == id
)
)
)
.scalars()
.first()
)
return test_item_info
@classmethod
async def get_test_item_detail_by_info(cls, db: AsyncSession, test_item: Test_itemModel):
"""
根据测试单元参数获取测试单元信息
:param db: orm对象
:param test_item: 测试单元参数对象
:return: 测试单元信息对象
"""
test_item_info = (
(
await db.execute(
select(TestItem).where(
)
)
)
.scalars()
.first()
)
return test_item_info
@classmethod
async def get_test_item_list(cls, db: AsyncSession, query_object: Test_itemPageQueryModel, is_page: bool = False):
"""
根据查询参数获取测试单元列表信息
:param db: orm对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 测试单元列表信息对象
"""
from module_admin.system.entity.do.test_category_do import TestCategory
from module_admin.system.entity.do.eut_type_do import EutType
from sqlalchemy import func
from utils.common_util import CamelCaseUtil
import math
query = (
select(
TestItem,
TestCategory.name.label('test_category_name'),
EutType.name.label('eut_type_name')
)
.outerjoin(TestCategory, TestItem.test_category_id == TestCategory.id)
.outerjoin(EutType, TestItem.eut_type_id == EutType.id)
.where(
TestItem.name.like(f'%{query_object.name}%') if query_object.name else True,
TestItem.test_category_id == query_object.test_category_id if query_object.test_category_id else True,
TestItem.eut_type_id == query_object.eut_type_id if query_object.eut_type_id else True,
TestItem.config_json == query_object.config_json if query_object.config_json else True,
TestItem.memo == query_object.memo if query_object.memo else True,
)
.order_by(TestItem.id)
.distinct()
)
if is_page:
# 计算总数
total = (await db.execute(select(func.count('*')).select_from(query.subquery()))).scalar()
# 执行分页查询
query_result = await db.execute(query.offset((query_object.page_num - 1) * query_object.page_size).limit(query_object.page_size))
# 处理JOIN结果
processed_rows = []
for row in query_result:
item = row[0] # TestItem对象
item_dict = CamelCaseUtil.transform_result(item)
item_dict['testCategoryName'] = row[1]
item_dict['eutTypeName'] = row[2]
processed_rows.append(item_dict)
has_next = math.ceil(total / query_object.page_size) > query_object.page_num
return {
'rows': processed_rows,
'total': total,
'pageNum': query_object.page_num,
'pageSize': query_object.page_size,
'hasNext': has_next
}
else:
# 非分页模式
query_result = await db.execute(query)
processed_rows = []
for row in query_result:
item = row[0]
item_dict = CamelCaseUtil.transform_result(item)
item_dict['testCategoryName'] = row[1]
item_dict['eutTypeName'] = row[2]
processed_rows.append(item_dict)
return processed_rows
@classmethod
async def add_test_item_dao(cls, db: AsyncSession, test_item: Test_itemModel):
"""
新增测试单元数据库操作
:param db: orm对象
:param test_item: 测试单元对象
:return:
"""
db_test_item = TestItem(**test_item.model_dump(
exclude={'test_category_name', 'eut_type_name'},
exclude_unset=True
))
db.add(db_test_item)
await db.flush()
return db_test_item
@classmethod
async def edit_test_item_dao(cls, db: AsyncSession, test_item: dict):
"""
编辑测试单元数据库操作
:param db: orm对象
:param test_item: 需要更新的测试单元字典
:return:
"""
await db.execute(update(TestItem), [test_item])
@classmethod
async def delete_test_item_dao(cls, db: AsyncSession, test_item: Test_itemModel):
"""
删除测试单元数据库操作
:param db: orm对象
:param test_item: 测试单元对象
:return:
"""
await db.execute(delete(TestItem).where(TestItem.id.in_([test_item.id])))