import asyncio import json from tornado.httpclient import HTTPResponse, HTTPRequest import dock from dock.dcm import dcm_api, dcm_scrape_convenient_form from models.dcm_task import DcmTask from paste.util import udict from paste.web import requests async def get_convenient_request(act_id: int, item_type: str = "rollback"): """ 获取 DCM 企业待办的便民回退。 向 DCM 的便民回退接口发送 GET 请求,获取与指定关系 ID 和类型 ID 关联的可用菜单信息。 自动注入有效的 Cookie(如 JSESSIONID)至请求头,并解析返回的 JSON 数据。 Args: act_id (int): 任务 ID item_type (str): 项目类型 """ api_url = f"/home/workflow/gettranstree" request_body = { "actID": act_id, "itemType": item_type, } # 构造 API 请求 return await dcm_api.new_api_request(api_url, request_body, 'GET', timeout=30) async def after_convenient_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(dcm_task: DcmTask): """ 抓取便民回退。 :param dcm_task: 数字城管待办工单 :return: """ # 取得请求对象 list_menu_request = await get_convenient_request(dcm_task.act_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_request ) response_data = getattr(list_menu_request, "response_data") form: dict = udict.get_by_path(response_data, 'resultInfo.data.form') if form: components = await dcm_scrape_convenient_form.fetch_form_components( dcm_task, form.get('formID', dcm_scrape_convenient_form.RollbackFormId) ) form['components'] = components return form if __name__ == "__main__": from paste.core import aio_pool async def test(dcm_task_id): dcm_task = await DcmTask(id=dcm_task_id).async_find_first() assert dcm_task, f"未找到待办工单,工单ID:{dcm_task_id}" await fetch_form(dcm_task) _runner = aio_pool.get_aio_runner() _runner(test(2054174091287597056))