from datetime import datetime from sqlalchemy.ext.asyncio import AsyncSession from typing import List from exceptions.exception import ServiceException from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.system.dao.contact_dao import ContactDao from module_admin.system.entity.vo.contact_vo import DeleteContactModel, ContactModel, ContactPageQueryModel from utils.common_util import CamelCaseUtil from utils.excel_util import ExcelUtil class ContactService: """ 联系人模块服务层 """ @classmethod async def get_contact_list_services( cls, query_db: AsyncSession, query_object: ContactPageQueryModel, is_page: bool = False ): contact_list_result = await ContactDao.get_contact_list(query_db, query_object, is_page) return contact_list_result @classmethod async def add_contact_services(cls, query_db: AsyncSession, page_object: ContactModel): # 校验同单位下姓名唯一性 existing = await ContactDao.get_contact_by_name_company( query_db, page_object.name, page_object.company ) if existing: company_info = f'({page_object.company})' if page_object.company else '' raise ServiceException(message=f'联系人"{page_object.name}"{company_info}已存在,请勿重复添加') try: await ContactDao.add_contact_dao(query_db, page_object) await query_db.commit() return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: await query_db.rollback() raise e @classmethod async def edit_contact_services(cls, query_db: AsyncSession, page_object: ContactModel): edit_contact = page_object.model_dump(exclude_unset=True, exclude={}) contact_info = await cls.contact_detail_services(query_db, page_object.id) if contact_info.id: # 校验唯一性(排除自身) existing = await ContactDao.get_contact_by_name_company( query_db, page_object.name, page_object.company, exclude_id=page_object.id ) if existing: company_info = f'({page_object.company})' if page_object.company else '' raise ServiceException(message=f'联系人"{page_object.name}"{company_info}已存在') try: edit_contact['update_time'] = datetime.now() await ContactDao.edit_contact_dao(query_db, edit_contact) await query_db.commit() return CrudResponseModel(is_success=True, message='更新成功') except Exception as e: await query_db.rollback() raise e else: raise ServiceException(message='联系人不存在') @classmethod async def delete_contact_services(cls, query_db: AsyncSession, page_object: DeleteContactModel): if page_object.ids: id_list = page_object.ids.split(',') try: for contact_id in id_list: await ContactDao.delete_contact_dao(query_db, int(contact_id)) await query_db.commit() return CrudResponseModel(is_success=True, message='删除成功') except Exception as e: await query_db.rollback() raise e else: raise ServiceException(message='传入联系人ID为空') @classmethod async def contact_detail_services(cls, query_db: AsyncSession, id: int): contact = await ContactDao.get_contact_detail_by_id(query_db, id=id) if contact: result = ContactModel(**CamelCaseUtil.transform_result(contact)) else: result = ContactModel(**dict()) return result @staticmethod async def export_contact_list_services(contact_list: List): mapping_dict = { 'id': '联系人ID', 'name': '姓名', 'company': '单位', 'department': '部门', 'position': '职务', 'mobile': '手机号', 'phone': '座机', 'email': '邮箱', 'address': '快递地址', 'memo': '备注', } binary_data = ExcelUtil.export_list2excel(contact_list, mapping_dict) return binary_data