diff --git a/sap-c4c-AttachmentFolder.py b/sap-c4c-AttachmentFolder.py index 2fdb308..b820905 100644 --- a/sap-c4c-AttachmentFolder.py +++ b/sap-c4c-AttachmentFolder.py @@ -305,21 +305,19 @@ def dsm_upload_downloaded_files(downloaded_files, ticket_id, serial_id, json_mod print(f" DSM 登录失败: {e}", file=sys.stderr) return [{"error": f"DSM 登录失败: {e}"}] - def _upload_one(f): - local_path = f["savedPath"] + # 找出其他 issue 的 ID 列表(排除 "Quote & Chassis" issue) + other_issue_ids = list({ + f["issueId"] for f in files_to_upload + if f.get("issueId") and "Quote & Chassis" not in (f.get("issueDescription") or "") + }) + + def _upload_one(local_path, remote_path): filename = os.path.basename(local_path) - issue_id = f.get("issueId", "") - remote_path = ( - f"{cfg.dsm_path}/{folder_name}/{issue_id}" - if issue_id else - f"{cfg.dsm_path}/{folder_name}" - ) full_remote_path = f"{remote_path}/{filename}" entry = { "file": filename, "ticketId": ticket_id, "serialId": serial_id, - "issueId": issue_id, "remotePath": full_remote_path, } try: @@ -336,8 +334,37 @@ def dsm_upload_downloaded_files(downloaded_files, ticket_id, serial_id, json_mod print(f" 上传失败: {filename}: {e}") return entry + # 构建上传任务列表 + # 构建 issue_id -> issue 文件夹名 的映射 + issue_folder_map = {} + for f in files_to_upload: + oid = f.get("issueId", "") + if oid and oid not in issue_folder_map: + desc = f.get("issueDescription", "") + issue_folder_map[oid] = f"{oid}_{desc}" if desc else oid + + upload_tasks = [] + for f in files_to_upload: + local_path = f["savedPath"] + issue_id = f.get("issueId", "") + issue_desc = f.get("issueDescription", "") + issue_folder = issue_folder_map.get(issue_id, issue_id) + if "Quote & Chassis" in (issue_desc or ""): + # 上传到自己的目录 + upload_tasks.append((local_path, f"{cfg.dsm_path}/{folder_name}/{issue_folder}")) + # 同时分发到所有其他 issue 目录 + for oid in other_issue_ids: + upload_tasks.append((local_path, f"{cfg.dsm_path}/{folder_name}/{issue_folder_map.get(oid, oid)}")) + else: + remote_path = ( + f"{cfg.dsm_path}/{folder_name}/{issue_folder}" + if issue_id else + f"{cfg.dsm_path}/{folder_name}" + ) + upload_tasks.append((local_path, remote_path)) + with ThreadPoolExecutor(max_workers=cfg.max_workers) as executor: - upload_results = list(executor.map(_upload_one, files_to_upload)) + upload_results = list(executor.map(lambda t: _upload_one(*t), upload_tasks)) if not json_mode: ok = sum(1 for r in upload_results if r.get("success")) @@ -513,6 +540,8 @@ def _process_issue_item(session, item, list_only, json_mode): f"{cfg.odata_cust}/BO_XSRIssueItemAttachmentFolderCollection", json_mode, ) + for e in downloaded_entries: + e["issueDescription"] = issue_desc return issue_entry, downloaded_entries