98 lines
3.6 KiB
Python
98 lines
3.6 KiB
Python
"""
|
|
接受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)
|