Files
2026-06-02 17:46:38 +08:00

99 lines
3.5 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_rollback
from models.dcm_rollback import DcmRollback
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}/rollback')
class RollbackHandler(AppHandler):
"""
回退接口。
对接数字城管系统的回退接口,请求后本接口先将数据保存本地,然后响应客户端,然后开始后台启动推送。
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dcm_task: Optional[DcmTask] = None
self.dcm_rollback: Optional[DcmRollback] = None
def _extract_params_for_db(self, **kwargs: dict) -> dict:
"""
提取数据库所需参数。
"""
return {
DcmRollback.flow_token.key: kwargs.get('flowToken', ''),
DcmRollback.dcm_task_id.key: kwargs.get('gdId', ''),
DcmRollback.act_id.key: self.dcm_task.act_id,
DcmRollback.task_number.key: kwargs.get('taskNumber', ''),
DcmRollback.opinion.key: kwargs.get('opinion', ''),
DcmRollback.attachments.key: kwargs.get('attachments', ''),
DcmRollback.send_message.key: kwargs.get('sendMessage', '1'),
DcmRollback.trans_info.key: kwargs.get('transInfo', '50,254,0'),
DcmRollback.save_old_act_flag.key: kwargs.get('saveOldActFlag', False),
DcmRollback.rollback_reason_id.key: kwargs.get('rollbackReasonId', -1),
DcmRollback.not_assigned.key: kwargs.get('notAssigned', '0'),
DcmRollback.not_assigned_reason.key: kwargs.get('notAssignedReason', ''),
DcmRollback.undertake_user_name.key: kwargs.get('undertakeUserName', ''),
DcmRollback.undertake_phone.key: kwargs.get('undertakePhone', '')
}
async def rollback(self, **kwargs) -> dict:
# 必填参数校验
required_keys = ['gdId', 'taskNumber', 'opinion', 'flowToken']
missing = [
k for k in required_keys
if k not in kwargs or kwargs[k] is None
]
if missing:
raise ValueError(f"缺少必要参数: {missing}")
# 读取待办任务对象
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_rollback = DcmRollback().copy_from_dict(params)
self.dcm_rollback.status = 0
await self.dcm_rollback.async_save()
# 后台执行提交回退请求到数字城管
await aio_pool.run_background_task(
dcm_push_rollback.push_rollback(self.dcm_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.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)