import asyncio import json from tornado.httpclient import HTTPResponse, HTTPRequest import dock from dock.dcm import dcm_api from models.dcm_task import DcmTask from paste.util import udict from paste.web import requests DisposeFormId = 377 DisposeFormName = '便民批转' RollbackFormId = 352 RollbackFormName = '便民回退' FormIdMap = { DisposeFormId: DisposeFormName, RollbackFormId: RollbackFormName, } async def get_convenient_form_request(rec_id: int, act_id: int, form_id: int = DisposeFormId): """ 获取 DCM 企业待办的便民表单组件。 向 DCM 的便民表单组件接口发送 GET 请求,获取与指定关系 ID 和类型 ID 关联的可用菜单信息。 自动注入有效的 Cookie(如 JSESSIONID)至请求头,并解析返回的 JSON 数据。 Args: rec_id (int): 记录 ID act_id (int): 任务 ID form_id (str): 项目类型,允许输入:377、352,默认:377,表示读取:"便民批转"表单,为空时读取:"便民回退"表单 """ api_url = f"/home/form/formpreview/getforminfo" request_body = { "formID": form_id if form_id in tuple(FormIdMap.keys()) else DisposeFormId, "formName": FormIdMap.get(form_id) if form_id in tuple(FormIdMap.keys()) else DisposeFormName, "param": { "recID": rec_id, "actID": act_id, }, } # 构造 API 请求 return await dcm_api.new_api_request(api_url, request_body, 'POST', timeout=30) async def after_convenient_form_request(response: HTTPResponse, retry_queue: asyncio.Queue[HTTPRequest]): response_body = response.body.decode() response_data = json.loads(response_body) setattr(response.request, "response_data", response_data) async def fetch_form_components(dcm_task: DcmTask, form_id: int = DisposeFormId): """ 抓取便民表单组件。 :param dcm_task: 数字城管待办工单ID :param form_id: 项目类型,允许输入:377、352,默认:377,表示读取:"便民批转"表单,为空时读取:"便民回退"表单 :return: """ # 取得请求对象 list_menu_request = await get_convenient_form_request(dcm_task.rec_id, dcm_task.act_id, form_id) request_queue = asyncio.Queue() await request_queue.put(list_menu_request) await requests.async_concurrency( request_queue, con_count=dock.CONCURRENCY_COUNT, retry=dock.MAX_RETRY_COUNT, after_request=after_convenient_form_request ) response_data = getattr(list_menu_request, "response_data") component_list: list[dict] = udict.get_by_path(response_data, 'resultInfo.data.form.componentList') return component_list if __name__ == "__main__": from paste.core import aio_pool async def test(dcm_task_id, form_id): dcm_task = await DcmTask(id=dcm_task_id).async_find_first() assert dcm_task, f"未找到待办工单,工单ID:{dcm_task_id}" await fetch_form_components(dcm_task, form_id) _runner = aio_pool.get_aio_runner() _runner(test(2054174091287597056, '352'))