import asyncio import json import apps import dock from dock.dcm import dcm_api from tornado.httpclient import HTTPResponse, HTTPRequest from models.dcm_task import DcmTask from paste.core.logging import echo_log from models.dcm_rollback import DcmRollback from paste.web import requests async def get_conv_rollback_request(rollback: DcmRollback, dcm_task: DcmTask): """ 创建便民回退请求对象。方法仅创建请求对象,并未实际提交请求,具体由调度方法处理。 :param rollback: 保存在数据库的回退对象 :param dcm_task: 待办工单对象 """ api_url = '/home/form/formpreview/save' form_param = { 'recID': dcm_task.rec_id, 'actID': rollback.act_id } component_list = [ {"componentID": 8, "value": rollback.not_assigned_reason}, # 不交办原因 {"componentID": 4, "value": rollback.not_assigned}, # 是否不交办 {"componentID": 9, "value": rollback.undertake_user_name}, # 承办人员 {"componentID": 12, "value": rollback.undertake_phone}, # 联系电话 ] body = { "formID": 352, "isInsert": "0", "briefParam": True, "formParam": json.dumps(form_param, ensure_ascii=False), "componentList": json.dumps(component_list, ensure_ascii=False), } conv_request = await dcm_api.new_api_request(api_url, body) return conv_request async def after_conv_rollback_request(response: HTTPResponse, retry_queue: asyncio.Queue[HTTPRequest]): """ 提交数字城管后的处理程序。 :param response: 响应对象 :param retry_queue: 重试队列 """ echo_log(response.body.decode()) echo_log('便民回退请求成功') # TODO: 这里要做实际的推送成功检查 async def push_conv_rollback_request(dcm_rollback: DcmRollback, dcm_task: DcmTask): """ 推送回退请求。 :param dcm_rollback: 保存在数据库的回退对象 :param dcm_task: 待办工单对象 """ echo_log(f"正在准备提交便民回退请求...") if apps.get_active_env() in ('dev', '', None): echo_log(f"非生产环境,不实际提交.") return request = await get_conv_rollback_request(dcm_rollback, dcm_task) queue = asyncio.Queue() await queue.put(request) # 需要让调用方获取extendInfo参数 return await requests.async_concurrency( queue, con_count=dock.CONCURRENCY_COUNT, retry=dock.MAX_RETRY_COUNT, after_request=after_conv_rollback_request )