#!/usr/bin/env python3 """ ORDER_FETCH 节点 Mock 实现 模拟从医药城/小药药导出订单,实际返回本地生成的假数据 """ import requests import hashlib from pathlib import Path from mock_orders import generate_mock_orders from datetime import datetime, timedelta STATE_CENTER_URL = "http://localhost:8000" # 状态中心地址 AGENT_TOKEN = "dev-agent-token-12345" # 开发令牌(和state_center的配置一致) def calculate_file_hash(filepath: str) -> str: """计算文件SHA256哈希""" sha256 = hashlib.sha256() with open(filepath, 'rb') as f: for chunk in iter(lambda: f.read(4096), b''): sha256.update(chunk) return f"sha256:{sha256.hexdigest()}" def mock_order_fetch(job_id: str, order_date: str, source_type: str = "YYC"): """ 模拟 ORDER_FETCH 节点执行 Args: job_id: 单据ID order_date: 订单日期 source_type: 来源类型 YYC/XYY/OFFLINE """ print(f"\n{'='*60}") print(f"🤖 [Mock RPA] ORDER_FETCH 开始执行") print(f" Job ID: {job_id}") print(f" 订单日期: {order_date}") print(f" 来源: {source_type}") print(f"{'='*60}\n") # 1. 调用 start 回调 print("📞 调用状态中心 /start 回调...") start_resp = requests.post( f"{STATE_CENTER_URL}/api/jobs/{job_id}/nodes/ORDER_FETCH/start", headers={"X-Agent-Token": AGENT_TOKEN}, json={ "attemptNo": 1, "executorRunId": f"MOCK-RUN-{datetime.now().strftime('%Y%m%d%H%M%S')}", "executorPlatform": "mock-rpa", "operator": "mock-script" } ) print(f" 响应: {start_resp.status_code} - {start_resp.json()}\n") # 2. 生成假订单数据 print("📦 生成模拟订单数据...") supplier_name = "重庆亿昊药业" if source_type == "YYC" else "华润医药" excel_path = generate_mock_orders(supplier_name, order_date, source_type, item_count=8) print() # 3. 计算文件哈希 file_hash = calculate_file_hash(excel_path) # 4. 调用 complete 回调 print("📞 调用状态中心 /complete 回调...") order_nos = [f"DD-{order_date.replace('-', '')}-{i+1:03d}" for i in range(8)] complete_resp = requests.post( f"{STATE_CENTER_URL}/api/jobs/{job_id}/nodes/ORDER_FETCH/complete", headers={"X-Agent-Token": AGENT_TOKEN}, json={ "attemptNo": 1, "executorRunId": f"MOCK-RUN-{datetime.now().strftime('%Y%m%d%H%M%S')}", "executorPlatform": "mock-rpa", "operator": "mock-script", "summary": { "orderCount": 8, "supplierList": [supplier_name], "orderNoList": order_nos }, "artifacts": [ { "artifactType": "SOURCE_EXCEL", "storagePath": excel_path, "fileHash": file_hash } ] } ) print(f" 响应: {complete_resp.status_code}") result = complete_resp.json() print(f" next_node: {result.get('next_node')}") print(f" job_status: {result.get('job_status')}\n") print(f"✅ ORDER_FETCH 完成!下一节点: {result.get('next_node')}\n") return result if __name__ == "__main__": # 示例:模拟昨天的医药城订单 yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d") job_id = f"YYC-重庆亿昊药业-{yesterday.replace('-', '')}-001" mock_order_fetch(job_id, yesterday, "YYC")