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

85 lines
3.1 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
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'))