import time import requests import os import json from config import * import base64 import urllib.parse from urllib.parse import urlparse, parse_qs import logging logger = logging.getLogger(__name__) def req_tool_jdy(url, data): #调用简道云接口 headers = {"Authorization": f"Bearer {apikey}"} while 1: try: res = requests.post(url, headers=headers, json=data, timeout=15, verify=False).json() if "code" in res.keys(): logger.info(f"req_tool_jdy请求错误 - url: {url}, " f"请求参数: {data}, 返回结果: {res}") time.sleep(2) continue return res except Exception as e: print(e) def query_data(query_data_info): #调用批量查询数据接口 query_data_url = f'{base_path}/api/v5/app/entry/data/list' try: query_data_res = req_tool_jdy(query_data_url, query_data_info) return query_data_res except Exception as e: logger.error(f"query_data请求异常 - url: {query_data_url}, " f"请求参数: {query_data_info}, 异常信息: {e}") return None def update_data(instance_id, workflow_entry_id, withdrawal_reason): # 调用更新数据接口 update_data_url = f'{base_path}/api/v5/app/entry/data/update' update_data_info = { "app_id": app_id, "entry_id": workflow_entry_id, "data_id": instance_id, "is_start_trigger": True, "data": { "withdrawal_opinion": {"value": "是"}, "withdrawal_reason": {"value": withdrawal_reason} } } try: logger.info(f"update_data请求 - url: {update_data_url}, update_data_info: {update_data_info} ") update_data_res = req_tool_jdy(update_data_url, update_data_info) logger.info(f"更新数据完成\nupdate_data_res: {update_data_res}") return update_data_res except Exception as e: logger.error(f"update_data请求异常 - url: {update_data_url}, " f"请求参数: {update_data_info}, 异常信息: {e}") return None def get_workflow(lossseqno, lossseqcategory): # 调用查询流程信息接口 get_workflow_url = f'{base_path}/api/v6/workflow/instance/get' if lossseqcategory == "车损": workflow_entry_id = vehicle_damage_id elif lossseqcategory == "物损": workflow_entry_id = item_damage_id elif lossseqcategory == "人伤": workflow_entry_id = human_injury_id else: logger.error(f"未知的损失类别: {lossseqcategory}") return None query_data_info = { "app_id": app_id, "entry_id": workflow_entry_id, "limit": 100, "fields": ["_id", "appId", "entryId", "reportno", "lossseqno", "lossseqname", "lossseqtype"], "filter": { "rel": "and", "cond": [ { "field": "lossseqno", "method": "eq", "value": [lossseqno] } ] } } try: query_result = query_data(query_data_info) instance_id = query_result['data'][0]['_id'] get_workflow_info = { "instance_id": instance_id, "tasks_type":1 } get_workflow_res = req_tool_jdy(get_workflow_url, get_workflow_info) logger.info(f"完成流程查询\nstatus:{get_workflow_res['status']}, instance_id:{instance_id}, workflow_entry_id:{workflow_entry_id}") return {"status":get_workflow_res['status'], "instance_id":instance_id, "workflow_entry_id":workflow_entry_id} except Exception as e: logger.error(f"get_workflow请求异常 - url: {get_workflow_url}, " f"请求参数: {query_data_info}, 异常信息: {e}") return None def close_workflow(close_workflow_info): # 调用结束流程接口 close_workflow_url = f'{base_path}/api/v1/workflow/instance/close' try: query_data_res = req_tool_jdy(close_workflow_url, close_workflow_info) return query_data_res except Exception as e: logger.error(f"query_data请求异常 - url: {close_workflow_url}, " f"请求参数: {close_workflow_info}, 异常信息: {e}") return None def get_lossseqcategory_info(lossseqtype): # 调用查询损失类别信息接口 get_lossseqcategory_info_url = f'{base_path}/api/v5/app/entry/data/list' get_lossseqcategory_info_data = { "app_id": app_id, "entry_id": lossseqcategory_id, "limit": 100, "fields": ["_id", "appId", "entryId", "lossseqtype", "lossseqcategory"], "filter": { "rel": "and", "cond": [ { "field": "lossseqtype", "method": "eq", "value": [lossseqtype] } ] } } query_data_res = req_tool_jdy(get_lossseqcategory_info_url, get_lossseqcategory_info_data) if not query_data_res.get('data'): logger.error("查询结果为空") return None lossseqcategory = query_data_res['data'][0]['lossseqcategory'] return lossseqcategory def withdraw_a_case(reportno, withdrawal_reason): query_data_info = { "app_id": app_id, "entry_id": "67ab117682b769eeef2549df", "limit": 100, "fields": ["_id", "appId", "entryId", "reportno", "lossseq_info"], "filter": { "rel": "and", "cond": [ { "field": "reportno", "method": "eq", "value": [reportno] } ] } } querydata = query_data(query_data_info) # 提取所有 lossseqno 和 lossseqtype query_result = [] for item in querydata['data']: if not item.get('lossseq_info'): logger.info(f"没有任务信息: {item}") return 1 for lossseq in item['lossseq_info']: lossseqcategory = get_lossseqcategory_info(lossseq['lossseqtype']) query_result.append({ 'lossseqno': lossseq['lossseqno'], 'lossseqtype': lossseq['lossseqtype'], 'lossseqcategory': lossseqcategory }) for task in query_result: workflow_res = get_workflow(task['lossseqno'], task['lossseqcategory']) if workflow_res['status'] == 0: instance_id = workflow_res['instance_id'] workflow_entry_id = workflow_res['workflow_entry_id'] close_workflow_info = { "instance_id": instance_id } close_workflow_res = close_workflow(close_workflow_info) if close_workflow_res['status'] == "success": update_data_res = update_data(instance_id, workflow_entry_id , withdrawal_reason) if update_data_res['data'] : logger.info(f"撤回成功,回写成功 - 报案号: {reportno}, 流程实例ID: {instance_id}") return 1 else: logger.error(f"撤回成功,回写失败 - 报案号: {reportno}, 流程实例ID: {instance_id}") return 1 else: logger.error(f"撤回失败 - 报案号: {reportno}, 流程实例ID: {instance_id}") return 0