Files
d3i-szct/dock/dcm/dcm_scrape_conv_rollback.py
T
2026-06-02 17:46:38 +08:00

73 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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))