from sqlalchemy import delete, select, update, func from sqlalchemy.ext.asyncio import AsyncSession from module_admin.system.entity.do.contact_do import Contact from module_admin.system.entity.vo.contact_vo import ContactModel, ContactPageQueryModel from utils.page_util import PageUtil class ContactDao: """ 联系人模块数据库操作层 """ @classmethod async def get_contact_detail_by_id(cls, db: AsyncSession, id: int): """ 根据联系人ID获取详细信息 """ result = ( await db.execute( select(Contact).where(Contact.id == id, Contact.del_flag == '0') ) ).scalars().first() return result @classmethod async def get_contact_by_name_company(cls, db: AsyncSession, name: str, company: str = None, exclude_id: int = None): """ 根据姓名+单位查询联系人(用于唯一性校验) """ query = select(Contact).where(Contact.name == name, Contact.del_flag == '0') if company: query = query.where(Contact.company == company) else: query = query.where(Contact.company.is_(None) | (Contact.company == '')) if exclude_id is not None: query = query.where(Contact.id != exclude_id) return (await db.execute(query)).scalars().first() @classmethod async def get_contact_list(cls, db: AsyncSession, query_object: ContactPageQueryModel, is_page: bool = False): """ 获取联系人列表 """ query = ( select(Contact) .where( Contact.del_flag == '0', Contact.name.like(f'%{query_object.name}%') if query_object.name else True, Contact.company.like(f'%{query_object.company}%') if query_object.company else True, Contact.department.like(f'%{query_object.department}%') if query_object.department else True, Contact.mobile.like(f'%{query_object.mobile}%') if query_object.mobile else True, ) .order_by(Contact.company, Contact.name) .distinct() ) contact_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) return contact_list @classmethod async def add_contact_dao(cls, db: AsyncSession, contact: ContactModel): """ 新增联系人 """ db_contact = Contact(**contact.model_dump( exclude={'create_time', 'update_time', 'del_flag'}, exclude_unset=True )) from datetime import datetime db_contact.create_time = datetime.now() db_contact.del_flag = '0' db.add(db_contact) await db.flush() return db_contact @classmethod async def edit_contact_dao(cls, db: AsyncSession, contact: dict): """ 编辑联系人 """ await db.execute(update(Contact), [contact]) @classmethod async def delete_contact_dao(cls, db: AsyncSession, contact_id: int): """ 软删除联系人 """ await db.execute( update(Contact).where(Contact.id == contact_id).values(del_flag='1') )