""" 接受OA请求,操作数字城管的申请回退接口 """ import logging from typing import Optional from apps.api import dcm from apps.app_handler import AppHandler from dock.dcm import dcm_push_apply_rollback from models.dcm_apply_rollback import DcmApplyRollback from models.dcm_task import DcmTask from paste.core import aio_pool from paste.core.logging import echo_log from paste.web.decorators import route @route(f'{dcm.ApiPrefix}/applyRollback') class ApplyRollbackHandler(AppHandler): """ 申请回退接口。 对接数字城管系统的申请回退接口,请求后本接口先将数据保存本地,然后响应客户端,然后开始后台启动推送。 """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.dcm_task: Optional[DcmTask] = None self.dcm_apply_rollback: Optional[DcmApplyRollback] = None def _extract_params_for_db(self, **kwargs: dict) -> dict: """ 提取数据库所需参数。 """ return { DcmApplyRollback.flow_token.key: kwargs.get('flowToken', ''), DcmApplyRollback.dcm_task_id.key: kwargs.get('gdId', ''), DcmApplyRollback.act_id.key: self.dcm_task.act_id, DcmApplyRollback.task_number.key: kwargs.get('taskNumber', ''), DcmApplyRollback.reply_part_id.key: kwargs.get('replyPartID', 39), DcmApplyRollback.ard_level.key: kwargs.get('ardLevel', 0), DcmApplyRollback.ard_type_id.key: 18 if kwargs.get('applyType', '拒签') == '拒签' else 62, DcmApplyRollback.opinion.key: kwargs.get('opinion', ''), DcmApplyRollback.apply_type.key: kwargs.get('applyType', '拒签'), DcmApplyRollback.trans_info.key: kwargs.get('transInfo', '52,254,0'), DcmApplyRollback.attachments.key: kwargs.get('attachments', '') } async def apply_rollback(self, **kwargs) -> dict: # 必填参数校验 required_keys = ['gdId', 'taskNumber', 'opinion', 'applyType', 'flowToken'] missing = [ k for k in required_keys if k not in kwargs or kwargs[k] is None ] if missing: raise ValueError(f"缺少必要参数: {missing}") if kwargs['applyType'] not in ('拒签', '处置阶段照片未公开'): raise ValueError('申请类型只能为拒签或处置阶段照片未公开') # 读取待办任务对象 dcm_task_id = kwargs.get('gdId', '') self.dcm_task = await DcmTask.async_find_by_id(dcm_task_id) # 保存请求数据 params = self._extract_params_for_db(**kwargs) self.dcm_apply_rollback = DcmApplyRollback().copy_from_dict(params) self.dcm_apply_rollback.status = 0 await self.dcm_apply_rollback.async_save() # 后台执行提交申请回退请求到数字城管 await aio_pool.run_background_task( dcm_push_apply_rollback.push_apply_rollback(self.dcm_apply_rollback, self.dcm_task) ) 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.apply_rollback(**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)