107 lines
3.5 KiB
Python
107 lines
3.5 KiB
Python
#!/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")
|