470 lines
16 KiB
Python
470 lines
16 KiB
Python
"""
|
|
创建 OA 接口请求对象。
|
|
对应文档接口:7、推送附件信息
|
|
"""
|
|
import io
|
|
import os
|
|
from typing import Union
|
|
|
|
from dock.oa import oa_api
|
|
from paste.core.logging import echo_log
|
|
from paste.util import uimg
|
|
|
|
|
|
async def get_push_order_request(dcm_tasks: list):
|
|
"""
|
|
取得推送待办工单列表的请求对象。
|
|
对应文档接口:2、推送待办工单列表。
|
|
接口文档说明:接收数字城管待办列表数据,并保存到 OA 系统。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
dcm_tasks: 待办工单列表,工单对象须包含以下键值:
|
|
|
|
- gdId (str): 待办工单ID,雪花ID。
|
|
- attachmentList (list[dict]): 附件列表
|
|
- taskNum (str): 任务号
|
|
- otherTaskNum (str): 第三方任务号
|
|
- bundleDeadlineTimeStr (str): 捆绑截止时间
|
|
- rollbackDeadlineStr (str): 拒绝超时截止时间
|
|
- eventSrcName (str): 问题来源
|
|
- recTypeName (str): 案件类型
|
|
- eventTypeName (str): 问题类型
|
|
- mainTypeName (str): 大类名称
|
|
- subTypeName (str): 小类名称
|
|
- urgencyLevel (str): 紧急程度
|
|
- eventDesc (str): 问题描述
|
|
- address (str): 地址描述
|
|
- disposalTimeLimit (str): 处置时限
|
|
- districtName (str): 所属区域
|
|
- newInstCondName (str): 立案条件
|
|
- closingConditions (str): 结案条件
|
|
- reporterName (str): 举报人
|
|
- reporterContact (str): 举报电话
|
|
- replyIntime (str): 是否两小时回复
|
|
- firstDepartName (str): 一级专业部门
|
|
- secondDepartName (str): 二级专业部门
|
|
- bundleWarningTimeStr (str): 捆绑警告时间
|
|
- actArdStateName (str): 阶段授权状态
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/digitalCM/pushWaitingSignatureOrder"
|
|
request_no = await oa_api.generate_serial_number()
|
|
request_body = {
|
|
"requestNo": request_no,
|
|
"toDoList": dcm_tasks,
|
|
}
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, request_body)
|
|
|
|
|
|
async def get_upload_request(file: Union[str, io.IOBase], file_name: str, first_save: bool = True):
|
|
"""
|
|
取得文件上传接口的请求对象。
|
|
对应文档接口:3、文件上传接口。
|
|
接口文档说明:上传指定的文件,返回文件在服务器上的id。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
file: 文件路径、URL 或文件对象,支持三种输入类型:
|
|
|
|
- str (本地文件路径): 如 "/tmp/file.pdf",先从本地文件读取,再写入请求对象
|
|
- str (远程 URL): 如 "https://example.com/file.pdf",先同步从远程地址下载,然后再写入请求对象
|
|
- io.IOBase: 如 open(..., 'rb') 或 io.BytesIO
|
|
|
|
file_name: 文件名
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = "/attachment?applicationCategory=66"
|
|
if first_save:
|
|
api_url += '&firstSave=true'
|
|
|
|
# 如果是远程 URL,先下载内容
|
|
if isinstance(file, str) and (file.startswith("http://") or file.startswith("https://")):
|
|
echo_log(f"正在从 URL 下载附件: {file}")
|
|
response, content_type = uimg.fetch_image(file) # 获取二进制内容
|
|
file_content = b''.join(response.iter_content(1024))
|
|
file_obj = io.BytesIO(file_content)
|
|
|
|
# 如果是本地文件路径,打开为二进制流
|
|
elif isinstance(file, str) and os.path.exists(file):
|
|
echo_log(f"正在从本地路径读取附件: {file}")
|
|
with open(file, 'rb') as f:
|
|
file_obj = io.BytesIO(f.read())
|
|
|
|
# 如果是文件对象(如 BytesIO, BufferedReader),直接使用
|
|
elif hasattr(file, 'read') and callable(file.read):
|
|
echo_log("正在使用传入的文件对象")
|
|
file_obj = io.BytesIO(file.read())
|
|
|
|
else:
|
|
raise TypeError(f"不支持的文件类型:{type(file)},应提供:文件路径,URL或文件对象.")
|
|
|
|
request_body = {
|
|
file_name: file_obj,
|
|
}
|
|
|
|
# 这里启用了 multipart/form-data 上传
|
|
return await oa_api.new_api_request(
|
|
api_url=api_url,
|
|
request_body=request_body,
|
|
method='POST',
|
|
use_form=True,
|
|
)
|
|
|
|
|
|
async def get_download_request(media_id: str):
|
|
"""
|
|
取得文件下载接口的请求对象。
|
|
对应文档接口:4、文件下载接口。
|
|
接口文档说明:上传指定的文件,返回文件在服务器上的id。
|
|
接口请求方式:POST
|
|
接口返回格式:application/octet-stream;charset=UTF-8
|
|
|
|
Args:
|
|
media_id: 文件 Media ID。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/attachment/file/{media_id}"
|
|
return await oa_api.new_api_request(api_url=api_url, request_body={}, method='GET')
|
|
|
|
|
|
async def get_push_order_detail_request(**kwargs):
|
|
"""
|
|
取得推送工单详情的请求对象。
|
|
对应文档接口:5、推送工单详情。
|
|
接口文档说明:接收数字城管工单详情。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
**kwargs: 请求参数,须包含以下键值:
|
|
|
|
- gdId (str): 待办工单ID,雪花ID。
|
|
- partCode (str): 部件编码。
|
|
- funcLimitChar (str): 小类时限。
|
|
- reporterName (str): 举报人。
|
|
- mediaUploadTotalNum (str): 上传附件数。
|
|
- returnVisitFlag (str): 是否回访。
|
|
- undertakeUserName (str): 承办人员。
|
|
- violationTaskNoDd (str): 市容违规任务号。
|
|
- telReply (str): 回访电话。
|
|
- funcForbidReporterInfoFlag (str): 是否公开。
|
|
- dealPersonOrg (str): 承办部门。
|
|
- contactNumberDd (str): 联系电话。
|
|
- reportNumberDd (str): 举报电话。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/digitalCM/pushOrderDetail"
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_push_process_info_request(**kwargs):
|
|
"""
|
|
取得推送办理经过的请求对象。
|
|
对应文档接口:6、推送办理经过。
|
|
接口文档说明:接收数字城管工单办理经过,保存到子表。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
**kwargs: 请求参数,须包含以下键值:
|
|
|
|
- gdId (str): 待办工单ID,雪花ID。
|
|
- checkContent (str): 核查内容,拼接第一条办理经过得到
|
|
- handlingProcessList (list[dict]): 办理经过列表,每个元素须包含以下字段:
|
|
|
|
- id (str): 唯一标识符,雪花ID。
|
|
- actionTime (str): 操作时间,格式为 yyyy-MM-dd HH:mm:ss。
|
|
- actDefName (str): 实际操作名称。
|
|
- humanName (str): 经办人姓名。
|
|
- unitName (str): 办理部门名称。
|
|
- actionName (str): 操作类型名称。
|
|
- nextActDefName (str): 下一环节名称。
|
|
- detail (str): 操作意见或备注内容。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/digitalCM/pushProcessLog"
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_push_attachment_request(**kwargs):
|
|
"""
|
|
取得推送附件信息的请求对象。
|
|
对应文档接口:7、推送附件信息。
|
|
接口文档说明:接收数字城管工单附件信息列表。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
**kwargs: 请求参数,须包含以下键值:
|
|
|
|
- gdId (str): 待办工单ID,雪花ID。
|
|
- attachmentList (list[dict]): 附件列表,每个元素须包含以下字段:
|
|
|
|
- id (str): 唯一标识符,雪花ID。
|
|
- mediaId (str): 媒体资源的唯一标识符,上传文件后,从 OA 平台取得,对应响应为:fileUrl。
|
|
- mediaUsage (str): 使用场景,例如:上报、回退。
|
|
- actDefName (str): 流程节点名称,例如:各区平台、一级专业部门、二级专业部门。
|
|
- uploadCreateTime (str): 附件上传时间,可选。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/digitalCM/pushAttachmentInfo"
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_push_more_info_request(**kwargs):
|
|
"""
|
|
取得推送更多信息的请求对象。
|
|
对应文档接口:8、推送更多信息。
|
|
接口文档说明:接收数字城管工单更多信息列表。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
**kwargs: 请求参数,须包含以下键值:
|
|
|
|
- gdId (str): 待办工单ID,雪花ID。
|
|
- moreInfoList (list[dict]): 更多信息列表,每个元素须包含以下字段:
|
|
|
|
- id (str): 唯一标识符,雪花ID。
|
|
- content (str): 内容。
|
|
- time (str): 时间。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/digitalCM/pushMoreInfo"
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_push_extend_info_request(**kwargs):
|
|
"""
|
|
取得推送扩展信息的请求对象。
|
|
对应文档接口:9、推送扩展信息。
|
|
接口文档说明:接收数字城管工单扩展信息列表。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
**kwargs: 请求参数,须包含以下键值:
|
|
|
|
- gdId (str): 待办工单ID,雪花ID。
|
|
- extendList (list[dict]): 扩展信息列表,每个元素须包含以下字段:
|
|
|
|
- id (str): 唯一标识符,雪花ID。
|
|
- fieldName: 属性。
|
|
- fieldValue: 值。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = '/externalWorkOrder/digitalCM/pushExtendInfo'
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_result_notify_request(flow_token: str, message: str, return_code: int):
|
|
"""
|
|
取得上报单条工单的操作结果的请求对象。
|
|
对应文档接口:10、上报单条工单的操作结果。
|
|
接口文档说明:皓凯平台调用接口推送接口处理结果。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
flow_token (str): 工作流令牌
|
|
message (str): 接口调用返回说明
|
|
return_code (int): 操作类型,相关值说明如下:
|
|
|
|
- 1: 成功。
|
|
- 2: 回退,超过3次,超过3次失败人为干预(3)。
|
|
- 3: 人为干预。
|
|
- 4: 失败。
|
|
- 5: 停止。
|
|
- 6: 取消。
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f'/flow/notification/{flow_token}'
|
|
# 请求体参数
|
|
request_body = {
|
|
"message": message,
|
|
"returnCode": return_code
|
|
}
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, request_body)
|
|
|
|
|
|
async def get_sign_task_request(task_id: Union[str, int]):
|
|
"""
|
|
取得签收工单的请求对象。
|
|
对应文档接口:11、签收。
|
|
接口文档说明:皓凯平台调用接口实现签收工单。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
task_id: 待办工单ID,雪花ID
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f'/externalWorkOrder/digitalCM/gdSign?gdId={task_id}'
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, {})
|
|
|
|
|
|
async def get_update_process_delay_request(task_id: str, bundle_deadline_time_str: str, rollback_deadline_str: str):
|
|
"""
|
|
取得更新流程延期信息的请求对象。
|
|
对应文档接口:12、更新流程延期信息。
|
|
接口文档说明:更新流程延期信息。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
task_id (str): 待办工单ID,雪花ID。
|
|
bundle_deadline_time_str (str): 捆绑截止时间,格式:yyyy-MM-dd HH:mm:ss
|
|
rollback_deadline_str (str): 拒绝超时截止时间,格式:yyyy-MM-dd HH:mm:ss
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
api_url = '/externalWorkOrder/digitalCM/updateProcessDelayInfo'
|
|
request_body = {
|
|
'gdId': str(task_id),
|
|
'bundleDeadlineTimeStr': bundle_deadline_time_str,
|
|
'rollbackDeadlineStr': rollback_deadline_str
|
|
}
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, request_body)
|
|
|
|
|
|
async def get_push_govs_order_master_request(govs_tasks: list):
|
|
"""
|
|
获取推送12345待签收工单到OA的请求
|
|
对应文档接口:2、推送待签收工单列表
|
|
接口文档说明:皓凯平台调用接口推送待签收工单列表给OA
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
govs_tasks: 待签收工单列表
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
|
|
# 接口地址
|
|
api_url = '/externalWorkOrder/pushWaitingSignatureOrder'
|
|
# 构造 API 请求
|
|
request_no = await oa_api.generate_serial_number()
|
|
request_body = {
|
|
"requestNo": request_no,
|
|
"toBeSignedList": govs_tasks,
|
|
}
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, request_body)
|
|
|
|
|
|
async def get_push_govs_order_detail_request(**kwargs):
|
|
"""
|
|
取得推送12345工单详情的请求对象。
|
|
对应文档接口:5、推送工单详情。
|
|
接口文档说明:接收12345工单详情。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
|
|
# 接口地址
|
|
api_url = '/externalWorkOrder/pushOrderDetail'
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_push_govs_process_request(**kwargs):
|
|
"""
|
|
取得推送办理经过的请求对象。
|
|
对应文档接口:6、推送工单处理流程列表。
|
|
接口文档说明:接收12345工单办理经过,保存到子表。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/pushProcessLog"
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_push_gov_process_request(**kwargs):
|
|
"""
|
|
取得推送省12345办理经过的请求对象。
|
|
对应文档接口:6、推送工单处理流程列表。
|
|
接口文档说明:接收省12345工单办理经过,保存到子表。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f"/externalWorkOrder/pushProcessLog"
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, kwargs)
|
|
|
|
|
|
async def get_sign_govs_task_request(task_id: Union[str, int]):
|
|
"""
|
|
取得签收工单的请求对象。
|
|
对应文档接口:11、签收。
|
|
接口文档说明:皓凯平台调用接口实现签收工单。
|
|
接口请求方式:POST
|
|
接口返回格式:JSON
|
|
|
|
Args:
|
|
task_id: 待办工单ID,雪花ID
|
|
|
|
Returns:
|
|
HTTPRequest: 构造好的 HTTP 请求对象,用于后续异步调用。
|
|
"""
|
|
# 接口地址
|
|
api_url = f'/externalWorkOrder/gdSign?gdId={task_id}'
|
|
# 构造 API 请求
|
|
return await oa_api.new_api_request(api_url, {})
|