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_dispose import DcmDispose from paste.web import requests async def get_conv_dispose_request(dcm_dispose: DcmDispose, dcm_task: DcmTask): """ 创建便民批转请求对象。方法仅创建请求对象,并未实际提交请求,具体由调度方法处理。 :param dcm_dispose: 保存在数据库的批转对象 :param dcm_task: 待办工单对象 """ api_url = '/home/form/formpreview/save' form_param = { 'recID': dcm_task.rec_id, 'actID': dcm_dispose.act_id } component_list = [ {"componentID": 9, "value": dcm_dispose.undertake_user_name}, # 承办人员 {"componentID": 12, "value": dcm_dispose.undertake_phone} # 联系电话 ] body = { "formID": 377, "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_dispose_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_dispose_request(dcm_dispose: DcmDispose, dcm_task: DcmTask): """ 推送批转请求。 :param dcm_dispose: 保存在数据库的批转对象 :param dcm_task: 待办工单对象 """ echo_log(f"正在准备提交便民批转请求...") if apps.get_active_env() in ('dev', '', None): echo_log(f"非生产环境,不实际提交.") return request = await get_conv_dispose_request(dcm_dispose, 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_dispose_request )