Files
d3i-szct/dock/oa_dcm/oa_update_post_delay.py
2026-06-02 17:46:38 +08:00

89 lines
3.0 KiB
Python

"""
操作数字城管的工单延期接口后,向OA推送更新后的工单时间信息
对应文档接口:12、更新流程延期信息
"""
import asyncio
import json
from datetime import datetime
from tornado.httpclient import HTTPResponse, HTTPRequest
import dock
from dock.dcm import dcm_scrape
from dock.oa import oa_api, oa_api_request
from models.dcm_task import DcmTask
from paste.core.logging import echo_log
from paste.util import udict
from paste.web import requests
async def get_update_process_delay_request(data: dict):
api_url = '/externalWorkOrder/digitalCM/updateProcessDelayInfo'
request_body = data
# 构造 API 请求
return await oa_api.new_api_request(api_url, request_body)
async def after_update_process_delay_request(response: HTTPResponse, retry_queue: asyncio.Queue[HTTPRequest]):
"""
更新流程延期请求响应后的处理程序。
:param response: 响应对象
:param retry_queue: 重试队列
"""
body = response.body.decode()
echo_log(body)
body_data = json.loads(body)
code = udict.get_by_path(body_data, 'code')
message = udict.get_by_path(body_data, 'msg')
if code == 200:
echo_log(f"更新流程延期成功.")
else:
echo_log(f"更新流程延期失败:{message}")
if retry_queue:
echo_log(f"更新流程延期重试队列中有:{retry_queue.qsize()} 个请求在等待.")
async def update_process_delay(task_id: int):
"""
流程延期更新之后,推送最新的时间信息
:param task_id: 对应的工单ID
"""
echo_log(f"本次更新{task_id}的最新时间信息...")
dcm_task = await DcmTask.async_find_by_id(task_id)
echo_log(f"开始更新流程延期...")
await dcm_scrape.fetch_single_dcm_task(dcm_task)
# 重新获取更新后的任务对象
dcm_task: DcmTask = await DcmTask.async_find_by_id(task_id)
if dcm_task is not None:
bundle_deadline_time_str = datetime.fromtimestamp(
dcm_task.bundle_deadline_time // 1000
).strftime("%Y-%m-%d %H:%M:%S") if dcm_task.bundle_deadline_time else ''
rollback_deadline_str = datetime.fromtimestamp(
dcm_task.rollback_deadline // 1000
).strftime("%Y-%m-%d %H:%M:%S") if dcm_task.rollback_deadline else ''
request = await oa_api_request.get_update_process_delay_request(
str(task_id), bundle_deadline_time_str, rollback_deadline_str
)
queue = asyncio.Queue()
await queue.put(request)
await requests.async_concurrency(
queue, con_count=dock.CONCURRENCY_COUNT, retry=dock.MAX_RETRY_COUNT,
after_request=after_update_process_delay_request
)
echo_log(f"更新流程延期完成...")
if __name__ == "__main__":
from paste.core import aio_pool
_runner = aio_pool.get_aio_runner()
_runner(update_process_delay(task_id=2054174091228876801))