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

10 months ago
from sqlalchemy import desc, delete, func, select, update
from sqlalchemy.ext.asyncio import AsyncSession
10 months ago
from module_admin.entity.do.approval_do import FlowApproval, FlowConfig
10 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):
10 months ago
query = (
select(FlowApproval)
.where(
(FlowApproval.applicant == query_param.applicant) if query_param.applicant else True,
10 months ago
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
FlowApproval.approvalFlow.like(f'%{current_user.user.user_name}%')
10 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
10 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
10 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
10 months ago
@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
10 months ago
@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