""" 操作数字城管的工单延期接口后,向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))