You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
5.8 KiB

2 months ago
from sqlalchemy import desc, delete, func, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.approval_do import FlowApproval, FlowConfig
2 months ago
from module_admin.entity.vo.approval_vo import ApprovalQueryObject
from module_admin.entity.vo.user_vo import CurrentUserModel
from sqlalchemy import select, text, cast, Integer, and_, or_, outerjoin, func, join
from utils.page_util import PageUtil
class ApprovalDao:
"""
菜单管理模块数据库操作层
"""
@classmethod
async def add_flow_approval(cls, db: AsyncSession, flow_approval: FlowApproval):
db.add(flow_approval)
await db.flush()
return flow_approval
@classmethod
async def get_flow_by_id(cls, db: AsyncSession, flowId: str):
result = (
(
await db.execute(
select(FlowApproval).where(
FlowApproval.id == flowId
)
)
)
.scalars()
.first()
)
return result
@classmethod
async def edit_flow_approval(cls, db: AsyncSession, flow: dict):
await db.execute(update(FlowApproval), [flow])
@classmethod
async def get_flow_list(cls, db: AsyncSession, query_param: ApprovalQueryObject, current_user: CurrentUserModel):
roleList = current_user.roles
query = (select(FlowApproval).where(
(FlowApproval.applicant == query_param.applicant) if query_param.applicant else True,
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
or_(*[FlowApproval.nextStepRole.like(f'%{role}%') for role in roleList],
FlowApproval.nextStepUser.like(f'%{current_user.user.user_name}%')),
).order_by(FlowApproval.applyTime)
.distinct())
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法
result = await PageUtil.paginate(db, query, query_param.page_num, query_param.page_size, True)
return result
@classmethod
async def get_owner_flow_list(cls, db: AsyncSession, query_param: ApprovalQueryObject,
current_user: CurrentUserModel):
2 months ago
query = (
select(FlowApproval)
.where(
(FlowApproval.applicant == query_param.applicant) if query_param.applicant else True,
2 months ago
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
FlowApproval.approvalFlow.like(f'%{current_user.user.user_name}%')
2 months ago
)
.order_by(FlowApproval.applyTime)
.distinct()
)
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法
result = await PageUtil.paginate(db, query, query_param.page_num, query_param.page_size, True)
return result
@classmethod
async def get_my_flow_list(cls, db: AsyncSession, query_param: ApprovalQueryObject,
current_user: CurrentUserModel):
query = (
select(FlowApproval)
.where(
FlowApproval.applicant == current_user.user.user_name,
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
)
.order_by(FlowApproval.applyTime)
.distinct()
)
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法
result = await PageUtil.paginate(db, query, query_param.page_num, query_param.page_size, True)
return result
2 months ago
@classmethod
async def get_all_waitingOrPendingFlows(cls, db: AsyncSession):
result = (
(
await db.execute(select(FlowApproval).where(
or_(FlowApproval.status == 'waiting',
FlowApproval.status == 'pending')
))
).scalars().all()
)
return result
2 months ago
@classmethod
async def get_flow_by_idAndUser(cls, db: AsyncSession, flow_id: str, username: str):
result = (
(
await db.execute(
select(FlowApproval).where(
FlowApproval.id == flow_id,
FlowApproval.applicant == username
)
)
)
.scalars()
.first()
)
return result
@classmethod
async def get_conf_list(cls, db: AsyncSession, module: str):
result = (
(
await db.execute(select(FlowConfig).where(
FlowConfig.module == module
))
).scalars().all()
)
return result
@classmethod
async def add_flow_config(cls, db: AsyncSession, conf: dict):
db_conf = FlowConfig(**conf)
db.add(db_conf)
await db.flush()
return conf
@classmethod
async def delete_flow_by_module(cls, module: str, db: AsyncSession):
await db.execute(delete(FlowConfig).where(FlowConfig.module == module))
@classmethod
async def get_nextstep_conf(cls, module: str, db: AsyncSession, step: int):
result = (
(
await db.execute(select(FlowConfig).where(
FlowConfig.module == module,
FlowConfig.step == step
))
).scalars().all()
)
return result
@classmethod
async def get_first_node_conf(cls, module: str, db: AsyncSession):
result = (
(
await db.execute(select(FlowConfig).where(
FlowConfig.module == module,
FlowConfig.step == 1
))
).scalars().all()
)
return result