初始化项目
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
"""
|
||||
待办工单明细推送。
|
||||
|
||||
对应文档接口:5、推送工单详情
|
||||
"""
|
||||
import asyncio
|
||||
import json
|
||||
from typing import Optional, Union
|
||||
|
||||
import pandas as pd
|
||||
from sqlalchemy import select, desc
|
||||
from tornado.httpclient import HTTPResponse, HTTPRequest
|
||||
|
||||
import dock
|
||||
import models
|
||||
from dock.oa import oa_api_request
|
||||
from models.dcm_push_status import DcmPushStatus
|
||||
from models.dcm_task import DcmTask
|
||||
from models.dcm_task_form_datum import DcmTaskFormDatum
|
||||
from paste.core.logging import echo_log
|
||||
from paste.util import udict
|
||||
from paste.web import requests
|
||||
|
||||
DcmTaskMapping = {
|
||||
DcmTask.id.key: 'gdId',
|
||||
DcmTask.part_code.key: 'partCode',
|
||||
DcmTaskFormDatum.func_limit_char.key: 'funcLimitChar',
|
||||
DcmTask.reporter_name.key: 'reporterName',
|
||||
DcmTaskFormDatum.media_upload_total_num.key: 'mediaUploadTotalNum',
|
||||
DcmTask.return_visit_flag.key:'returnVisitFlag',
|
||||
DcmTask.func_forbid_reporter_info_flag.key:'funcForbidReporterInfoFlag',
|
||||
DcmTaskFormDatum.tell_num.key:'contactNumberDd',
|
||||
DcmTask.reporter_contact.key: 'reportNumberDd',
|
||||
DcmTaskFormDatum.deal_person_org.key: 'dealPersonOrg',
|
||||
DcmTaskFormDatum.undertake_user_name.key: 'undertakeUserName',
|
||||
}
|
||||
"""
|
||||
数据推送映射关系。
|
||||
"""
|
||||
|
||||
|
||||
async def after_push_order_detail_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:
|
||||
dcm_task_id = getattr(response.request, "dcm_task_id")
|
||||
await DcmPushStatus.set_push_task_detail_status(dcm_task_id)
|
||||
echo_log(f"推送工单详情成功.")
|
||||
else:
|
||||
echo_log(f"推送工单详情失败:{message}")
|
||||
|
||||
if retry_queue:
|
||||
echo_log(f"工单详情重试队列中有:{retry_queue.qsize()} 个请求在等待.")
|
||||
|
||||
|
||||
async def push_order_detail(fetch_size: int = 50,
|
||||
task_id: Optional[Union[str, int, list[Union[str, int]]]] = None):
|
||||
"""
|
||||
推送待办数据及其数据。
|
||||
|
||||
:param fetch_size: 本次推送数量
|
||||
:param task_id: 待办任务 ID 可选
|
||||
"""
|
||||
# 根据条件获取目标任务 ID 列表(支持指定 task_id 或分页获取)
|
||||
task_query = select(DcmTask.id).order_by(desc(DcmTask.act_id))
|
||||
if task_id:
|
||||
if isinstance(task_id, list):
|
||||
task_query = task_query.where(DcmTask.id.in_(task_id))
|
||||
echo_log(f"本次推送待办列表:{task_id} 的详细数据...")
|
||||
else:
|
||||
task_query = task_query.where(DcmTask.id == task_id)
|
||||
echo_log(f"本次推送待办:{task_id} 的详细数据...")
|
||||
else:
|
||||
task_query = task_query.limit(fetch_size)
|
||||
echo_log(f"本次推送前 {fetch_size} 条待办的详细数据...")
|
||||
task_id_list = (await DcmTask.orm_execute_scalars(task_query)).all()
|
||||
task_id_list = [f"{id}" for id in task_id_list]
|
||||
|
||||
# 查询属于这些任务的所有详细数据
|
||||
datum_query = select(
|
||||
DcmTask.id, DcmTask.part_code, DcmTask.reporter_name, DcmTask.reporter_contact,
|
||||
DcmTask.return_visit_flag, DcmTask.func_forbid_reporter_info_flag,
|
||||
DcmTaskFormDatum.media_upload_total_num, DcmTaskFormDatum.func_limit_char,
|
||||
DcmTaskFormDatum.tell_num, DcmTaskFormDatum.undertake_user_name,
|
||||
DcmTaskFormDatum.deal_person_org
|
||||
).join(
|
||||
DcmTaskFormDatum, DcmTask.id==DcmTaskFormDatum.dcm_task_id
|
||||
).where(
|
||||
DcmTask.id.in_(task_id_list)
|
||||
)
|
||||
|
||||
dcm_task_df = await DcmTask.query_as_df(datum_query)
|
||||
# 格式化为字符串
|
||||
dcm_task_df[DcmTask.id.key] = dcm_task_df[DcmTask.id.key].astype(str)
|
||||
dcm_task_df[DcmTaskFormDatum.media_upload_total_num.key] = dcm_task_df[DcmTaskFormDatum.media_upload_total_num.key].fillna(0).astype(int)
|
||||
# 代码转义
|
||||
return_visit_flag_map = {
|
||||
'0': '无需回访',
|
||||
'1': '待回访',
|
||||
'2': '已回访',
|
||||
}
|
||||
dcm_task_df[DcmTask.return_visit_flag.key] = dcm_task_df[DcmTask.return_visit_flag.key].astype(str).map(
|
||||
lambda x: return_visit_flag_map.get(x, x)
|
||||
)
|
||||
func_forbid_reporter_info_flag_map = {
|
||||
'0': '否',
|
||||
'1': '是',
|
||||
}
|
||||
dcm_task_df[DcmTask.func_forbid_reporter_info_flag.key] = dcm_task_df[DcmTask.func_forbid_reporter_info_flag.key].astype(str).map(
|
||||
lambda x: func_forbid_reporter_info_flag_map.get(x, x)
|
||||
)
|
||||
|
||||
# 未爬取的字段暂时填空值
|
||||
dcm_task_df['violationTaskNoDd'] = ''
|
||||
dcm_task_df['telReply'] = ''
|
||||
|
||||
# 处理无待办工单详情状态
|
||||
empty_task_ids = set(task_id_list) - set(dcm_task_df[DcmTask.id.key].unique().tolist())
|
||||
empty_task_data = [
|
||||
{
|
||||
DcmPushStatus.dcm_task_id.key: dcm_task_id,
|
||||
DcmPushStatus.push_task_status.key: 1
|
||||
}
|
||||
for dcm_task_id in list(empty_task_ids)
|
||||
]
|
||||
empty_task_df = pd.DataFrame(empty_task_data)
|
||||
await DcmPushStatus.save_batch(empty_task_df)
|
||||
|
||||
# 处理数据映射,适应接口推送
|
||||
mapped_df = dcm_task_df.rename(columns=DcmTaskMapping)
|
||||
# 这里把空数据都换成 None,以便存入数据库时是 null
|
||||
mapped_df.replace(models.EmptyInDF + models.EmptyDatetimeInDF, '', inplace=True)
|
||||
|
||||
echo_log(f"正在准备请求队列...")
|
||||
# 构建请求队列
|
||||
dcm_push_queue = asyncio.Queue()
|
||||
|
||||
# 向队列中填充请求对象
|
||||
for _h, row in mapped_df.iterrows():
|
||||
push_request = await oa_api_request.get_push_order_detail_request(**row.to_dict())
|
||||
setattr(push_request, "dcm_task_id", row.get('gdId'))
|
||||
await dcm_push_queue.put(push_request)
|
||||
|
||||
# 并发提交推送请求
|
||||
echo_log(f"开始推送工单详情数据...")
|
||||
await requests.async_concurrency(
|
||||
dcm_push_queue, con_count=dock.CONCURRENCY_COUNT, retry=dock.MAX_RETRY_COUNT,
|
||||
after_request=after_push_order_detail_request
|
||||
)
|
||||
echo_log(f"工单详情推送已经完成...")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from paste.core import aio_pool
|
||||
_runner = aio_pool.get_aio_runner()
|
||||
_runner(push_order_detail(task_id=2054174091254042627))
|
||||
Reference in New Issue
Block a user