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_save_sign from models.govs_order_master import GovsOrderMaster from models.govs_save_sign import GovsSaveSign @route(f'{govs.ApiPrefix}/save-sign-for/create') class CreateDelayHandler(AppHandler): """ 申请延期接口。 对接省12345的申请延期接口,请求后本接口先将数据保存本地,然后响应客户端,然后开始后台启动推送。 """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.govs_order: Optional[GovsOrderMaster] = None self.govs_sign: Optional[GovsSaveSign] = None def _params_for_db(self, **kwargs: dict) -> dict: """ 提取数据库所需参数。 """ return { GovsSaveSign.gd_id.key: kwargs.get('gdId', ''), GovsSaveSign.flow_token.key: kwargs.get('flowToken', ''), GovsSaveSign.order_id.key: kwargs.get('orderId', ''), GovsSaveSign.order_no.key: kwargs.get('orderNo', ''), GovsSaveSign.master_id.key: kwargs.get('gdId', ''), GovsSaveSign.order_process_id.key: kwargs.get('orderProcessId', ''), GovsSaveSign.task_id.key: kwargs.get('taskId', ''), GovsSaveSign.flag.key: kwargs.get('flag', '') } async def create_delay(self, **kwargs) -> dict: # 必填参数校验 required_keys = [ 'gdId', 'flowToken' ] 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_sign = GovsSaveSign().copy_from_dict(params) self.govs_sign.status = 0 await self.govs_sign.async_save() # 后台执行提交申请延期请求到省12345 await aio_pool.run_background_task( govs_save_sign.sign_order(self.govs_sign, 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)