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

216 lines
8.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import aliased
from module_admin.system.entity.do.test_job_do import TestJob
from module_admin.entity.do.user_do import SysUser
from module_admin.system.entity.vo.test_job_vo import Test_jobModel, Test_jobPageQueryModel
from utils.page_util import PageUtil
class Test_jobDao:
"""
作业模块数据库操作层
"""
@classmethod
async def get_test_job_detail_by_id(cls, db: AsyncSession, id: int):
"""
根据作业ID获取作业详细信息包含关联用户名称
:param db: orm对象
:param id: 作业ID
:return: 作业信息对象
"""
# 为同一个表创建多个别名用于多次JOIN
TesterUser = aliased(SysUser)
ReviewerUser = aliased(SysUser)
SecondTesterUser = aliased(SysUser)
ThirdTesterUser = aliased(SysUser)
query_result = await db.execute(
select(
TestJob,
TesterUser.nick_name.label('tester_name'),
ReviewerUser.nick_name.label('reviewer_name'),
SecondTesterUser.nick_name.label('second_tester_name'),
ThirdTesterUser.nick_name.label('third_tester_name')
)
.outerjoin(TesterUser, TestJob.tester_id == TesterUser.user_id)
.outerjoin(ReviewerUser, TestJob.reviewer_id == ReviewerUser.user_id)
.outerjoin(SecondTesterUser, TestJob.second_tester_id == SecondTesterUser.user_id)
.outerjoin(ThirdTesterUser, TestJob.third_tester_id == ThirdTesterUser.user_id)
.where(TestJob.id == id)
)
row = query_result.first()
if row:
# 转换为dict格式包含ID和名称
from utils.common_util import CamelCaseUtil
job = row[0] # TestJob对象
job_dict = CamelCaseUtil.transform_result(job)
job_dict['testerName'] = row[1]
job_dict['reviewerName'] = row[2]
job_dict['secondTesterName'] = row[3]
job_dict['thirdTesterName'] = row[4]
return job_dict
return None
@classmethod
async def get_test_job_detail_by_info(cls, db: AsyncSession, test_job: Test_jobModel):
"""
根据作业参数获取作业信息
:param db: orm对象
:param test_job: 作业参数对象
:return: 作业信息对象
"""
test_job_info = (
(
await db.execute(
select(TestJob).where(
)
)
)
.scalars()
.first()
)
return test_job_info
@classmethod
async def get_test_job_list(cls, db: AsyncSession, query_object: Test_jobPageQueryModel, is_page: bool = False):
"""
根据查询参数获取作业列表信息(包含关联用户名称)
:param db: orm对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 作业列表信息对象
"""
# 为同一个表创建多个别名用于多次JOIN
TesterUser = aliased(SysUser)
ReviewerUser = aliased(SysUser)
SecondTesterUser = aliased(SysUser)
ThirdTesterUser = aliased(SysUser)
query = (
select(
TestJob,
TesterUser.nick_name.label('tester_name'),
ReviewerUser.nick_name.label('reviewer_name'),
SecondTesterUser.nick_name.label('second_tester_name'),
ThirdTesterUser.nick_name.label('third_tester_name')
)
.outerjoin(TesterUser, TestJob.tester_id == TesterUser.user_id)
.outerjoin(ReviewerUser, TestJob.reviewer_id == ReviewerUser.user_id)
.outerjoin(SecondTesterUser, TestJob.second_tester_id == SecondTesterUser.user_id)
.outerjoin(ThirdTesterUser, TestJob.third_tester_id == ThirdTesterUser.user_id)
.where(
TestJob.name.like(f'%{query_object.name}%') if query_object.name else True,
TestJob.test_item_id == query_object.test_item_id if query_object.test_item_id else True,
TestJob.tester_id == query_object.tester_id if query_object.tester_id else True,
TestJob.reviewer_id == query_object.reviewer_id if query_object.reviewer_id else True,
TestJob.second_tester_id == query_object.second_tester_id if query_object.second_tester_id else True,
TestJob.third_tester_id == query_object.third_tester_id if query_object.third_tester_id else True,
TestJob.memo == query_object.memo if query_object.memo else True,
)
.order_by(TestJob.id)
.distinct()
)
# 不使用PageUtil自己处理JOIN后的数据
from sqlalchemy import func
from utils.common_util import CamelCaseUtil
import math
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:
job = row[0] # TestJob对象
job_dict = CamelCaseUtil.transform_result(job)
job_dict['testerName'] = row[1]
job_dict['reviewerName'] = row[2]
job_dict['secondTesterName'] = row[3]
job_dict['thirdTesterName'] = row[4]
processed_rows.append(job_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:
job = row[0]
job_dict = CamelCaseUtil.transform_result(job)
job_dict['testerName'] = row[1]
job_dict['reviewerName'] = row[2]
job_dict['secondTesterName'] = row[3]
job_dict['thirdTesterName'] = row[4]
processed_rows.append(job_dict)
return processed_rows
@classmethod
async def add_test_job_dao(cls, db: AsyncSession, test_job: Test_jobModel):
"""
新增作业数据库操作
:param db: orm对象
:param test_job: 作业对象
:return:
"""
# 调试信息
print(f"DEBUG add: test_job type = {type(test_job)}")
# 如果test_job已经是dict直接使用
if isinstance(test_job, dict):
job_data = {k: v for k, v in test_job.items()
if k not in ['tester_name', 'reviewer_name', 'second_tester_name', 'third_tester_name']}
db_test_job = TestJob(**job_data)
else:
# 排除name字段这些是JOIN查询返回的不存在于数据库表中
db_test_job = TestJob(**test_job.model_dump(
exclude={'tester_name', 'reviewer_name', 'second_tester_name', 'third_tester_name'},
exclude_unset=True
))
db.add(db_test_job)
await db.flush()
print("db_test_job.id",db_test_job.id)
return db_test_job
@classmethod
async def edit_test_job_dao(cls, db: AsyncSession, test_job: dict):
"""
编辑作业数据库操作
:param db: orm对象
:param test_job: 需要更新的作业字典
:return:
"""
await db.execute(update(TestJob), [test_job])
@classmethod
async def delete_test_job_dao(cls, db: AsyncSession, test_job: Test_jobModel):
"""
删除作业数据库操作
:param db: orm对象
:param test_job: 作业对象
:return:
"""
await db.execute(delete(TestJob).where(TestJob.id.in_([test_job.id])))