90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
|
|
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')
|
|||
|
|
)
|