253 lines
9.3 KiB
Python
253 lines
9.3 KiB
Python
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select, update, func, desc, asc
|
|
from module_admin.system.dao.test_permission_dao import TestPermissionDao
|
|
from module_admin.system.entity.do.etest_entities_do import TestPermission
|
|
from module_admin.system.entity.do.test_work_order_do import TestWorkOrder
|
|
from module_admin.entity.vo.common_vo import CrudResponseModel
|
|
from utils.common_util import CamelCaseUtil
|
|
from exceptions.exception import ServiceException
|
|
from datetime import datetime, date
|
|
from typing import Optional, List
|
|
|
|
|
|
class TestPermissionService:
|
|
"""
|
|
测试权限配置服务层
|
|
"""
|
|
|
|
@classmethod
|
|
async def get_permission_list(cls, db: AsyncSession, query_obj, is_page: bool = False):
|
|
"""获取权限列表"""
|
|
result = await TestPermissionDao.get_list(db, query_obj, is_page)
|
|
|
|
if is_page:
|
|
rows, total = result
|
|
rows_list = [CamelCaseUtil.transform_result(row) for row in rows]
|
|
return {'rows': rows_list, 'total': total}
|
|
else:
|
|
return [CamelCaseUtil.transform_result(row) for row in result]
|
|
|
|
@classmethod
|
|
async def get_permission_detail(cls, db: AsyncSession, id: int):
|
|
"""获取权限详情"""
|
|
obj = await TestPermissionDao.get_by_id(db, id)
|
|
if not obj:
|
|
raise ServiceException(message='权限配置不存在')
|
|
return CamelCaseUtil.transform_result(obj)
|
|
|
|
@classmethod
|
|
async def add_permission(cls, db: AsyncSession, model, current_user_id: int):
|
|
"""新增权限配置"""
|
|
obj = TestPermission(**model.model_dump(exclude_unset=True))
|
|
obj.create_by = current_user_id
|
|
obj.create_time = datetime.now()
|
|
obj.update_time = datetime.now()
|
|
|
|
await TestPermissionDao.add(db, obj)
|
|
await db.commit()
|
|
|
|
return CrudResponseModel(is_success=True, message='新增成功')
|
|
|
|
@classmethod
|
|
async def edit_permission(cls, db: AsyncSession, model, current_user_id: int):
|
|
"""编辑权限配置"""
|
|
obj = await TestPermissionDao.get_by_id(db, model.id)
|
|
if not obj:
|
|
raise ServiceException(message='权限配置不存在')
|
|
|
|
model.update_by = current_user_id
|
|
model.update_time = datetime.now()
|
|
await TestPermissionDao.update(db, model)
|
|
await db.commit()
|
|
|
|
return CrudResponseModel(is_success=True, message='更新成功')
|
|
|
|
@classmethod
|
|
async def delete_permission(cls, db: AsyncSession, ids: str, current_user_id: int):
|
|
"""删除权限配置"""
|
|
id_list = [int(id_str) for id_str in ids.split(',')]
|
|
await TestPermissionDao.delete(db, id_list)
|
|
await db.commit()
|
|
|
|
return CrudResponseModel(is_success=True, message='删除成功')
|
|
|
|
|
|
class WorkOrderClaimService:
|
|
"""
|
|
工单领取服务层
|
|
"""
|
|
|
|
@classmethod
|
|
async def claim_work_order(cls, db: AsyncSession, current_user_id: int):
|
|
"""
|
|
测试人员领取工单
|
|
排序规则: 优先级高 > 截止日期近
|
|
"""
|
|
# 1. 获取用户权限
|
|
permissions = await TestPermissionDao.get_by_user_id(db, current_user_id)
|
|
|
|
if not permissions:
|
|
raise ServiceException(message='您没有测试权限')
|
|
|
|
# 2. 检查当前负载
|
|
current_load_result = await db.execute(
|
|
select(func.count()).select_from(TestWorkOrder).where(
|
|
TestWorkOrder.tester_id == current_user_id,
|
|
TestWorkOrder.test_status.in_([0, 1]), # 待测试或测试中
|
|
TestWorkOrder.del_flag == '0'
|
|
)
|
|
)
|
|
current_load = current_load_result.scalar()
|
|
max_load = permissions[0].max_concurrent if permissions else 5
|
|
|
|
if current_load >= max_load:
|
|
raise ServiceException(message=f'您已达到最大并行工单数限制({max_load})')
|
|
|
|
# 3. 查询可领取工单(按优先级降序、截止日期升序)
|
|
allowed_categories = [p.test_category_id for p in permissions if p.test_category_id]
|
|
|
|
query = select(TestWorkOrder).where(
|
|
TestWorkOrder.test_status == 0, # 待测试
|
|
TestWorkOrder.tester_id.is_(None), # 未分配
|
|
TestWorkOrder.del_flag == '0'
|
|
)
|
|
|
|
if allowed_categories:
|
|
query = query.where(TestWorkOrder.test_category_id.in_(allowed_categories))
|
|
|
|
# 排序: 优先级高优先,截止日期近优先
|
|
query = query.order_by(
|
|
desc(TestWorkOrder.priority),
|
|
asc(TestWorkOrder.expected_finish_date)
|
|
)
|
|
|
|
result = await db.execute(query.limit(1))
|
|
work_order = result.scalar_one_or_none()
|
|
|
|
if not work_order:
|
|
raise ServiceException(message='暂无可领取工单')
|
|
|
|
# 4. 乐观锁领取
|
|
update_result = await db.execute(
|
|
update(TestWorkOrder).where(
|
|
TestWorkOrder.id == work_order.id,
|
|
TestWorkOrder.tester_id.is_(None), # 确保未被他人领取
|
|
TestWorkOrder.del_flag == '0'
|
|
).values(
|
|
tester_id=current_user_id,
|
|
claimed_by=current_user_id,
|
|
claimed_at=datetime.now(),
|
|
test_status=1, # 测试中
|
|
update_by=str(current_user_id),
|
|
update_time=datetime.now()
|
|
)
|
|
)
|
|
|
|
if update_result.rowcount == 0:
|
|
raise ServiceException(message='工单已被他人领取')
|
|
|
|
await db.commit()
|
|
return {'message': '领取成功', 'work_order_id': work_order.id}
|
|
|
|
@classmethod
|
|
async def get_pending_list(cls, db: AsyncSession, current_user_id: int, query_obj):
|
|
"""获取可领取工单列表"""
|
|
# 获取用户权限
|
|
permissions = await TestPermissionDao.get_by_user_id(db, current_user_id)
|
|
allowed_categories = [p.test_category_id for p in permissions if p.test_category_id]
|
|
|
|
query = select(TestWorkOrder).where(
|
|
TestWorkOrder.test_status == 0,
|
|
TestWorkOrder.tester_id.is_(None),
|
|
TestWorkOrder.del_flag == '0'
|
|
)
|
|
|
|
if allowed_categories:
|
|
query = query.where(TestWorkOrder.test_category_id.in_(allowed_categories))
|
|
|
|
# 排序
|
|
query = query.order_by(
|
|
desc(TestWorkOrder.priority),
|
|
asc(TestWorkOrder.expected_finish_date)
|
|
)
|
|
|
|
# 分页
|
|
total_result = await db.execute(select(func.count()).select_from(query.subquery()))
|
|
total = total_result.scalar()
|
|
|
|
query = query.offset((query_obj.page_num - 1) * query_obj.page_size).limit(query_obj.page_size)
|
|
result = await db.execute(query)
|
|
rows = result.scalars().all()
|
|
|
|
return {
|
|
'rows': [CamelCaseUtil.transform_result(row) for row in rows],
|
|
'total': total
|
|
}
|
|
|
|
@classmethod
|
|
async def update_priority(cls, db: AsyncSession, work_order_id: int, priority: int, current_user_id: int):
|
|
"""管理人员调整工单优先级"""
|
|
if priority < 1 or priority > 5:
|
|
raise ServiceException(message='优先级必须在1-5之间')
|
|
|
|
result = await db.execute(
|
|
update(TestWorkOrder).where(
|
|
TestWorkOrder.id == work_order_id,
|
|
TestWorkOrder.del_flag == '0'
|
|
).values(
|
|
priority=priority,
|
|
update_by=str(current_user_id),
|
|
update_time=datetime.now()
|
|
)
|
|
)
|
|
|
|
if result.rowcount == 0:
|
|
raise ServiceException(message='工单不存在')
|
|
|
|
await db.commit()
|
|
return {'message': '优先级调整成功'}
|
|
|
|
@classmethod
|
|
async def batch_claim_work_order(cls, db: AsyncSession, work_order_ids: List[int], current_user_id: int):
|
|
"""
|
|
批量领取工单
|
|
逐个领取,记录成功和失败
|
|
"""
|
|
success_count = 0
|
|
failed_count = 0
|
|
success_ids = []
|
|
failed_messages = []
|
|
|
|
for work_order_id in work_order_ids:
|
|
try:
|
|
result = await cls.claim_work_order(db, current_user_id)
|
|
success_count += 1
|
|
success_ids.append(result['work_order_id'])
|
|
except ServiceException as e:
|
|
failed_count += 1
|
|
failed_messages.append(f'工单{work_order_id}: {e.message}')
|
|
|
|
return {
|
|
'success_count': success_count,
|
|
'failed_count': failed_count,
|
|
'work_order_ids': success_ids,
|
|
'failed_messages': failed_messages
|
|
}
|
|
"""管理人员修改预计完成日期"""
|
|
result = await db.execute(
|
|
update(TestWorkOrder).where(
|
|
TestWorkOrder.id == work_order_id,
|
|
TestWorkOrder.del_flag == '0'
|
|
).values(
|
|
expected_finish_date=expected_date,
|
|
update_by=str(current_user_id),
|
|
update_time=datetime.now()
|
|
)
|
|
)
|
|
|
|
if result.rowcount == 0:
|
|
raise ServiceException(message='工单不存在')
|
|
|
|
await db.commit()
|
|
return {'message': '预计完成日期修改成功'}
|