service.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. from typing import cast
  2. from app.api.v1.module_system.auth.schema import AuthSchema
  3. from app.api.v1.module_system.user.crud import UserCRUD
  4. from app.api.v1.module_system.user.schema import UserCreateSchema
  5. from app.core.alipay import AlipayClient
  6. from app.core.exceptions import CustomException
  7. from app.core.logger import log
  8. from app.utils.hash_bcrpy_util import PwdUtil
  9. from .crud import EmployeeCRUD
  10. from .schema import (
  11. EmployeeCreateSchema,
  12. EmployeeListOutSchema,
  13. EmployeeOperationOutSchema,
  14. EmployeeInviteQuerySchema,
  15. EmployeeInviteQueryOutSchema,
  16. )
  17. from alipay.aop.api.domain.EmployeeInfoDTO import EmployeeInfoDTO
  18. class EmployeeService:
  19. """员工服务层"""
  20. @classmethod
  21. async def add_employee_service(
  22. cls, auth: AuthSchema, data: EmployeeCreateSchema
  23. ) -> EmployeeOperationOutSchema:
  24. """
  25. 添加员工
  26. 调用: alipay.commerce.ec.employee.add
  27. """
  28. crud = EmployeeCRUD(auth)
  29. from alipay.aop.api.request.AlipayCommerceEcEmployeeAddRequest import (
  30. AlipayCommerceEcEmployeeAddRequest,
  31. )
  32. from alipay.aop.api.domain.AlipayCommerceEcEmployeeAddModel import (
  33. AlipayCommerceEcEmployeeAddModel,
  34. )
  35. from alipay.aop.api.response.AlipayCommerceEcEmployeeAddResponse import (
  36. AlipayCommerceEcEmployeeAddResponse,
  37. )
  38. model = AlipayCommerceEcEmployeeAddModel()
  39. # 必选
  40. model.enterprise_id = data.enterprise_id
  41. model.employee_name = data.employee_name
  42. # 身份标识(identity_type+identity)、身份证(employee_cert_type+employee_cert_no)、
  43. # 手机号、邮箱四者必选其一; 当传入多个时,优先级为:身份标识>身份证>手机号>邮箱
  44. model.identity_type = data.identity_type
  45. model.identity = data.identity
  46. model.identity_open_id = data.identity_open_id
  47. model.employee_mobile = data.employee_mobile
  48. model.employee_email = data.employee_email
  49. model.employee_cert_type = data.employee_cert_type
  50. model.employee_cert_no = data.employee_cert_no
  51. model.iot_check_type = data.iot_check_type
  52. model.employee_no = data.employee_no
  53. model.department_ids = data.department_ids
  54. model.accounting_entity_ids = data.accounting_entity_ids
  55. model.label_names = data.label_names
  56. model.sign_return_url = data.sign_return_url
  57. model.create_share_code = data.create_share_code
  58. model.sign_url_carry_info = data.sign_url_carry_info
  59. model.profiles = data.profiles
  60. request = AlipayCommerceEcEmployeeAddRequest()
  61. request.biz_model = model
  62. client = AlipayClient.get_client()
  63. response = client.execute(request)
  64. if not response:
  65. raise CustomException(msg="添加员工失败: 无响应")
  66. result = AlipayCommerceEcEmployeeAddResponse()
  67. result.parse_response_content(response)
  68. if not result.is_success():
  69. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  70. raise CustomException(msg=f"添加员工失败: {result.msg}")
  71. result_data = EmployeeOperationOutSchema(
  72. employee_id=result.employee_id,
  73. sign_url=result.sign_url,
  74. share_code=result.share_code,
  75. iot_unique_id=result.iot_unique_id,
  76. )
  77. create_data_dict = result_data.model_dump()
  78. create_data_dict.update(data.model_dump())
  79. # 自动创建系统用户记录
  80. user_crud = UserCRUD(auth)
  81. # 检查用户是否已存在
  82. username = str(result.employee_id)
  83. existing_user = await user_crud.get_by_username_crud(username=username)
  84. if not existing_user:
  85. # 创建新用户
  86. user_data = UserCreateSchema(
  87. username=username,
  88. password=PwdUtil.set_password_hash(password="123456"), # 默认密码
  89. name=data.employee_name,
  90. mobile=data.employee_mobile,
  91. email=data.employee_email,
  92. tenant_id=auth.tenant_id,
  93. role_ids=[11],
  94. status="0", # 启用状态
  95. description=f"e:{data.enterprise_id}:{result.employee_id}"
  96. )
  97. user_dict = user_data.model_dump(exclude_unset=True)
  98. new_user = await user_crud.create(data=user_dict, skip_tenant_id=True)
  99. create_data_dict["user_id"] = new_user.id
  100. else:
  101. create_data_dict["user_id"] = existing_user.id
  102. await crud.create(data=create_data_dict)
  103. return result_data
  104. @classmethod
  105. async def list_service(
  106. cls,
  107. auth: AuthSchema,
  108. page_no: int = 1,
  109. page_size: int = 20,
  110. search: dict | None = None,
  111. ) -> dict:
  112. """
  113. 查询员工列表
  114. """
  115. crud = EmployeeCRUD(auth)
  116. offset = (page_no - 1) * page_size
  117. return await crud.page(
  118. offset=offset,
  119. limit=page_size,
  120. order_by=[{"id": "desc"}],
  121. search=search or {},
  122. out_schema=EmployeeListOutSchema,
  123. preload=["user"]
  124. )
  125. @classmethod
  126. async def detail_service(
  127. cls, auth: AuthSchema, employee_id: str, enterprise_id: str
  128. ):
  129. """
  130. 查询员工详情
  131. 调用: alipay.commerce.ec.employee.info.query
  132. """
  133. from alipay.aop.api.request.AlipayCommerceEcEmployeeInfoQueryRequest import AlipayCommerceEcEmployeeInfoQueryRequest
  134. from alipay.aop.api.domain.AlipayCommerceEcEmployeeInfoQueryModel import AlipayCommerceEcEmployeeInfoQueryModel
  135. from alipay.aop.api.response.AlipayCommerceEcEmployeeInfoQueryResponse import AlipayCommerceEcEmployeeInfoQueryResponse
  136. model = AlipayCommerceEcEmployeeInfoQueryModel()
  137. model.enterprise_id = enterprise_id
  138. model.employee_id = employee_id
  139. request = AlipayCommerceEcEmployeeInfoQueryRequest()
  140. request.biz_model = model
  141. client = AlipayClient.get_client()
  142. response = client.execute(request)
  143. if not response:
  144. raise CustomException(msg="查询员工详情失败: 无响应")
  145. result = AlipayCommerceEcEmployeeInfoQueryResponse()
  146. result.parse_response_content(response)
  147. if not result.is_success():
  148. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  149. raise CustomException(msg=f"查询员工详情失败: {result.msg}")
  150. return cast(EmployeeInfoDTO, result.employee_info)
  151. @classmethod
  152. async def delete_employee_service(
  153. cls, auth: AuthSchema, employee_id: str, enterprise_id: str
  154. ) -> EmployeeOperationOutSchema:
  155. """
  156. 删除员工
  157. 调用: alipay.commerce.ec.employee.delete
  158. """
  159. from alipay.aop.api.request.AlipayCommerceEcEmployeeDeleteRequest import AlipayCommerceEcEmployeeDeleteRequest
  160. from alipay.aop.api.domain.AlipayCommerceEcEmployeeDeleteModel import AlipayCommerceEcEmployeeDeleteModel
  161. from alipay.aop.api.response.AlipayCommerceEcEmployeeDeleteResponse import AlipayCommerceEcEmployeeDeleteResponse
  162. model = AlipayCommerceEcEmployeeDeleteModel()
  163. model.enterprise_id = enterprise_id
  164. model.employee_id = employee_id
  165. request = AlipayCommerceEcEmployeeDeleteRequest()
  166. request.biz_model = model
  167. client = AlipayClient.get_client()
  168. response = client.execute(request)
  169. if not response:
  170. raise CustomException(msg="删除员工失败: 无响应")
  171. result = AlipayCommerceEcEmployeeDeleteResponse()
  172. result.parse_response_content(response)
  173. if not result.is_success():
  174. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  175. raise CustomException(msg=f"删除员工失败: {result.msg}")
  176. # 从本地数据库删除
  177. crud = EmployeeCRUD(auth)
  178. await crud.delete_by_employee_id(employee_id)
  179. return EmployeeOperationOutSchema(
  180. employee_id=employee_id,
  181. )
  182. @classmethod
  183. async def invite_query_service(
  184. cls, auth: AuthSchema, data: EmployeeInviteQuerySchema
  185. ) -> EmployeeInviteQueryOutSchema:
  186. """
  187. 获取员工签约激活链接
  188. 调用: alipay.commerce.ec.employee.invite.query
  189. """
  190. from alipay.aop.api.request.AlipayCommerceEcEmployeeInviteQueryRequest import AlipayCommerceEcEmployeeInviteQueryRequest
  191. from alipay.aop.api.domain.AlipayCommerceEcEmployeeInviteQueryModel import AlipayCommerceEcEmployeeInviteQueryModel
  192. from alipay.aop.api.response.AlipayCommerceEcEmployeeInviteQueryResponse import AlipayCommerceEcEmployeeInviteQueryResponse
  193. model = AlipayCommerceEcEmployeeInviteQueryModel()
  194. model.enterprise_id = data.enterprise_id
  195. model.employee_id = data.employee_id
  196. model.page_content_code = data.page_content_code
  197. model.withholding_sign_str = data.withholding_sign_str
  198. model.create_share_code = data.create_share_code
  199. request = AlipayCommerceEcEmployeeInviteQueryRequest()
  200. request.biz_model = model
  201. client = AlipayClient.get_client()
  202. response = client.execute(request)
  203. if not response:
  204. raise CustomException(msg="获取员工签约激活链接失败: 无响应")
  205. result = AlipayCommerceEcEmployeeInviteQueryResponse()
  206. result.parse_response_content(response)
  207. if not result.is_success():
  208. log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
  209. raise CustomException(msg=f"获取员工签约激活链接失败: {result.msg}")
  210. return EmployeeInviteQueryOutSchema(
  211. enterprise_id=result.enterprise_id or data.enterprise_id,
  212. sign_url=result.sign_url or "",
  213. mini_app_sign_url=result.mini_app_sign_url or "",
  214. share_code=getattr(result, 'share_code', None)
  215. )