from app.api.v1.module_system.auth.schema import AuthSchema from app.core.alipay import AlipayClient from app.core.exceptions import CustomException from app.core.logger import log from app.plugin.module_payment.expense.institution.schema import InstitutionListOutSchema, InstitutionCreateSchema from .crud import InstitutionCRUD from .enums import InstitutionStatusEnum from alipay.aop.api.request.AlipayEbppInvoiceInstitutionCreateRequest import ( AlipayEbppInvoiceInstitutionCreateRequest, ) from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionCreateModel import ( AlipayEbppInvoiceInstitutionCreateModel, ) from alipay.aop.api.response.AlipayEbppInvoiceInstitutionCreateResponse import ( AlipayEbppInvoiceInstitutionCreateResponse, ) from alipay.aop.api.request.AlipayEbppInvoiceInstitutionPageinfoQueryRequest import ( AlipayEbppInvoiceInstitutionPageinfoQueryRequest, ) from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionPageinfoQueryModel import ( AlipayEbppInvoiceInstitutionPageinfoQueryModel, ) from alipay.aop.api.response.AlipayEbppInvoiceInstitutionPageinfoQueryResponse import ( AlipayEbppInvoiceInstitutionPageinfoQueryResponse, ) from alipay.aop.api.request.AlipayEbppInvoiceInstitutionDeleteRequest import ( AlipayEbppInvoiceInstitutionDeleteRequest, ) from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionDeleteModel import ( AlipayEbppInvoiceInstitutionDeleteModel, ) from alipay.aop.api.response.AlipayEbppInvoiceInstitutionDeleteResponse import ( AlipayEbppInvoiceInstitutionDeleteResponse, ) from alipay.aop.api.request.AlipayEbppInvoiceInstitutionModifyRequest import ( AlipayEbppInvoiceInstitutionModifyRequest, ) from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionModifyModel import ( AlipayEbppInvoiceInstitutionModifyModel, ) from alipay.aop.api.response.AlipayEbppInvoiceInstitutionModifyResponse import ( AlipayEbppInvoiceInstitutionModifyResponse, ) class InstitutionService: """费控制度服务层""" @classmethod async def create_institution_service( cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionCreateModel ) -> AlipayEbppInvoiceInstitutionCreateResponse: """ 创建费控制度 调用: alipay.ebpp.invoice.institution.create """ if data.enterprise_id is None: raise CustomException(msg="创建费控制度失败: 企业ID不能为空") if data.outer_source_id: data.outer_source_id = None data.currency = 'CNY' request = AlipayEbppInvoiceInstitutionCreateRequest() request.biz_model = data client = AlipayClient.get_client() response = client.execute(request) if not response: raise CustomException(msg="创建费控制度失败: 无响应") result = AlipayEbppInvoiceInstitutionCreateResponse() result.parse_response_content(response) if not result.is_success(): log.error(f"支付宝接口调用失败: {result.code} - {result.msg}") raise CustomException(msg=f"创建费控制度失败: {result.msg}") # 构建创建数据 create_data = InstitutionCreateSchema( enterprise_id=data.enterprise_id, institution_id=result.institution_id, institution_name=getattr(data, 'institution_name', None), institution_desc=getattr(data, 'institution_desc', None), scene_type=getattr(data, 'scene_type', None), expense_type=getattr(data, 'expense_type', None), expense_sub_type=getattr(data, 'expense_sub_type', None), status=InstitutionStatusEnum.INSTITUTION_CREATE.value, # 初始状态 effective=getattr(data, 'effective', None), effective_start_date=getattr(data, 'effective_start_date', None), effective_end_date=getattr(data, 'effective_end_date', None), consult_mode=getattr(data, 'consult_mode', None), multi_employee_share_mode=getattr(data, 'multi_employee_share_mode', None), currency=getattr(data, 'currency', None) ) # 转换为字典并添加额外字段 create_data_dict = create_data.model_dump(exclude_unset=True) crud = InstitutionCRUD(auth) await crud.create(create_data_dict) return result @classmethod async def list_service( cls, auth: AuthSchema, page_no: int = 1, page_size: int = 20, search: dict | None = None, ) -> dict: """ 查询费控制度列表 """ crud = InstitutionCRUD(auth) offset = (page_no - 1) * page_size return await crud.page( offset=offset, limit=page_size, order_by=[{"id": "desc"}], search=search or {}, out_schema=InstitutionListOutSchema, ) @classmethod async def delete_institution_service( cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionDeleteModel ) -> AlipayEbppInvoiceInstitutionDeleteResponse: """ 删除费控制度 调用: alipay.ebpp.invoice.institution.delete """ request = AlipayEbppInvoiceInstitutionDeleteRequest() request.biz_model = data client = AlipayClient.get_client() response = client.execute(request) if not response: raise CustomException(msg="删除费控制度失败: 无响应") result = AlipayEbppInvoiceInstitutionDeleteResponse() result.parse_response_content(response) if not result.is_success(): log.error(f"支付宝接口调用失败: {result.code} - {result.msg}") raise CustomException(msg=f"删除费控制度失败: {result.msg}") return result @classmethod async def modify_institution_service( cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionModifyModel ) -> AlipayEbppInvoiceInstitutionModifyResponse: """ 编辑费控制度 调用: alipay.ebpp.invoice.institution.modify """ if data.institution_id is None: raise CustomException(msg="编辑费控制度失败: 制度ID不能为空") request = AlipayEbppInvoiceInstitutionModifyRequest() request.biz_model = data client = AlipayClient.get_client() response = client.execute(request) if not response: raise CustomException(msg="编辑费控制度失败: 无响应") result = AlipayEbppInvoiceInstitutionModifyResponse() result.parse_response_content(response) if not result.is_success(): log.error(f"支付宝接口调用失败: {result.code} - {result.msg}") raise CustomException(msg=f"编辑费控制度失败: {result.msg}") # 更新本地数据库状态 # crud = InstitutionCRUD(auth) # update_data = {} # if hasattr(data, 'institution_name') and data.institution_name: # update_data['institution_name'] = data.institution_name # if hasattr(data, 'institution_desc') and data.institution_desc: # update_data['institution_desc'] = data.institution_desc # if hasattr(data, 'effective') and data.effective is not None: # update_data['effective'] = data.effective # if hasattr(data, 'effective_start_date') and data.effective_start_date: # update_data['effective_start_date'] = data.effective_start_date # if hasattr(data, 'effective_end_date') and data.effective_end_date: # update_data['effective_end_date'] = data.effective_end_date # if hasattr(data, 'consult_mode') and data.consult_mode: # update_data['consult_mode'] = data.consult_mode # if update_data: # await crud.update({'institution_id': data.institution_id}, update_data) return result