from typing import Optional import logging from apps.api import govs from apps.app_handler import AppHandler from paste.web.decorators import route from paste.core import aio_pool from paste.core.logging import echo_log from dock.govs import govs_create_order_delay from models.govs_order_master import GovsOrderMaster from models.govs_create_delay import GovsApplicationForDelay @route(f'{govs.ApiPrefix}/application-for-delay-formal/create') class CreateDelayHandler(AppHandler): """ 申请延期接口。 对接省12345的申请延期接口,请求后本接口先将数据保存本地,然后响应客户端,然后开始后台启动推送。 """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.govs_order: Optional[GovsOrderMaster] = None self.govs_delay: Optional[GovsApplicationForDelay] = None def _params_for_db(self, **kwargs: dict) -> dict: """ 提取数据库所需参数。 """ return { GovsApplicationForDelay.master_id.key: kwargs.get('gdId', ''), GovsApplicationForDelay.gd_id.key: kwargs.get('gdId', ''), GovsApplicationForDelay.finally_time_after_approve.key: kwargs.get('finallyTimeAfterApprove', ''), GovsApplicationForDelay.finally_time_before_approve.key: kwargs.get('finallyTimeBeforeApprove', ''), GovsApplicationForDelay.request_delay.key: kwargs.get('requestDelay', ''), GovsApplicationForDelay.is_nature_day.key: kwargs.get('isNatureDay', ''), GovsApplicationForDelay.already_notify_order_user.key: kwargs.get('alreadyNotifyOrderUser', ''), GovsApplicationForDelay.request_reason.key: kwargs.get('requestReason', ''), GovsApplicationForDelay.remarks.key: kwargs.get('remarks', ''), GovsApplicationForDelay.contact_name.key: kwargs.get('contactName', ''), GovsApplicationForDelay.contact_time.key: kwargs.get('contactTime', ''), GovsApplicationForDelay.contact_type.key: kwargs.get('contactType', ''), GovsApplicationForDelay.contact_type_name.key: kwargs.get('contactTypeName', ''), GovsApplicationForDelay.reply_script.key: kwargs.get('replyScript', ''), GovsApplicationForDelay.file_id_str.key: kwargs.get('fileIdStr', ''), GovsApplicationForDelay.request_delay_time.key: kwargs.get('requestDelayTime', ''), GovsApplicationForDelay.flow_token.key: kwargs.get('flowToken', '') } async def create_delay(self, **kwargs) -> dict: # 必填参数校验 required_keys = [ 'gdId', 'flowToken', 'finallyTimeAfterApprove', 'requestDelay', 'isNatureDay', 'alreadyNotifyOrderUser', 'requestReason' ] missing = [ k for k in required_keys if k not in kwargs or kwargs[k] is None ] if missing: raise ValueError(f"缺少必要参数: {missing}") # 读取待办任务对象 govs_task_id = kwargs.get('gdId', '') self.govs_order = await GovsOrderMaster.async_find_by_id(govs_task_id) # 保存请求数据 params = self._params_for_db(**kwargs) self.govs_delay = GovsApplicationForDelay().copy_from_dict(params) self.govs_delay.status = 0 await self.govs_delay.async_save() # 后台执行提交申请延期请求到省12345 await aio_pool.run_background_task( govs_create_order_delay.create_delay(self.govs_delay, self.govs_order) ) return { 'msg': '申请延期成功.' } # @auth_token async def post(self): """ 处理 POST 请求。 --- tags: - D3I API summary: 申请延期接口 """ try: echo_log(self.request.body.decode()) _, params = self.get_request_params() _result = await self.create_delay(**params) self.response_ok(code=0, data=_result) except Exception as e: self.response_error(e, status_code=200, api_status_code=500) self.log(msg=e, level=logging.ERROR, is_log_exc=True)