""" 创建 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, {})