216 lines
8.3 KiB
Python
216 lines
8.3 KiB
Python
|
|
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])))
|
|||
|
|
|