AutoRpa/build_seq.py

244 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding=utf-8
"""
构建 Main.seq - 合同建单流程(Chrome浏览器版本)
"""
import json
import base64
def b64_apa(val):
return json.dumps({"val": base64.b64encode(str(val).encode()).decode()}, indent=4)
def b64_raw(val):
return base64.b64encode(str(val).encode()).decode()
s01_body = """\
import sys, os, json, time
from pathlib import Path
_CODES_DIR = Path(r'd:\\RPA\\AutoRpa\\codes')
if str(_CODES_DIR) not in sys.path:
sys.path.insert(0, str(_CODES_DIR))
from rpa_yisaiqi.contract_flow_steps import ContractFlowContext, ContractGoodsLine
print("=" * 60)
print("合同建单 CONTRACT_CREATE - 初始化")
print("=" * 60)
self._ctx = ContractFlowContext(
contract_url="http://contract-test.gzmpc.com:8080/",
username="test002", password="1",
supplier_name="测试供应商",
order_date="2026-08-12",
source_type="YYC", template_type="NON_FORMAT",
template_name="非格式--采购协议",
customer_code="CUST-001", customer_name="测试供应商",
contract_category="采购协议", settlement_type="付款",
contract_background="自动化测试合同起草", contract_nature="主合同",
amount_currency="人民币", amount="50000.00",
contract_end_date="2026-12-31",
is_major_contract="否", is_prepayment="否",
belong_year="2026", payment_method="账期支付",
payment_days="30", contract_status="正式合同",
contains_blood_products="否",
submit_mode="dry_run",
goods_lines=[
ContractGoodsLine(
operation_code="ADD", goods_code="YP-001",
goods_name="测试药品A", approval_no="国药准字H00000001",
spec="50mg*30片", unit="盒", quantity=10.0,
),
],
merged_pdf_path=None,
)
print(f"[OK] 上下文就绪: source={self._ctx.source_type}")
print(f"[OK] 模板: {self._ctx.template_name}")
print(f"[OK] 货品行数: {len(self._ctx.goods_lines)}")
"""
s02_body = """\
from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter
print("[S02] 启动 Chrome + 打开合同系统...")
print(f" URL: {self._ctx.contract_url}")
adapter = ApaBrowserAdapter(url=self._ctx.contract_url)
adapter.open_url(self._ctx.contract_url)
self._adapter = adapter
print("[OK] Chrome 已打开并导航到合同系统")
"""
s03_body = """\
from rpa_yisaiqi.contract_flow_steps import login_contract_system, enter_contract_create
adapter = self._adapter
print("[S03] 登录合同系统...")
login_contract_system(adapter, self._ctx)
print("[OK] 登录完成")
print("[S04] 进入合同起草...")
enter_contract_create(adapter)
print("[OK] 已进入合同起草页面")
"""
s04_body = """\
from rpa_yisaiqi.contract_flow_steps import select_contract_template, fill_contract_signatory_info
adapter = self._adapter
print("[S05] 选择合同模板...")
select_contract_template(adapter, self._ctx)
print(f"[OK] 模板: {self._ctx.template_name}")
print("[S06] 填写签约方信息...")
fill_contract_signatory_info(adapter, self._ctx)
print(f"[OK] 签约方: {self._ctx.customer_name}")
"""
s05_body = """\
from rpa_yisaiqi.contract_flow_steps import fill_contract_basic_info, fill_contract_amount_and_dates
adapter = self._adapter
print("[S07] 填写基础表单...")
fill_contract_basic_info(adapter, self._ctx)
print(f"[OK] 类别={self._ctx.contract_category}, 结算={self._ctx.settlement_type}")
print("[S08] 填写金额与日期...")
fill_contract_amount_and_dates(adapter, self._ctx)
print(f"[OK] 金额={self._ctx.amount}, 结束日期={self._ctx.contract_end_date}")
"""
s06_body = """\
from rpa_yisaiqi.contract_flow_steps import (
fill_contract_goods_lines, fill_contract_payment_info,
upload_contract_document_if_needed, submit_contract_for_approval,
read_contract_number
)
adapter = self._adapter
print("[S09] 填写货品明细...")
fill_contract_goods_lines(adapter, self._ctx)
print(f"[OK] 货品: {len(self._ctx.goods_lines)} 行")
print("[S10] 填写付款信息...")
fill_contract_payment_info(adapter, self._ctx)
print(f"[OK] 付款方式={self._ctx.payment_method}")
if self._ctx.source_type == "YYC":
print("[S11] 合并PDF [YYC专属]... (单PDF, 跳过合并)")
print("[S12] 上传PDF附件 [YYC专属]... (dry_run 跳过)")
print()
print("[S13] 提交审批...")
if not submit_contract_for_approval(adapter, self._ctx):
print("[DRY-RUN] 演练模式,跳过实际提交")
print("=" * 60)
print("合同建单流程演练完成")
print("=" * 60)
else:
print("[S14] 读取合同编号...")
contract_no = read_contract_number(adapter)
print(f"[OK] 合同编号: {contract_no}")
print("=" * 60)
print(f"[COMPLETED] 合同创建成功: {contract_no}")
print("=" * 60)
"""
steps = [
("S01 初始化 & 上下文构建", s01_body, "设置环境变量并构建YYC测试上下文"),
("S02 启动Chrome", s02_body, "Selenium打开Chrome浏览器并导航到合同系统"),
("S03-S04 登录 & 进入起草", s03_body, "登录系统并进入合同起草页面"),
("S05-S06 模板选择 & 签约方", s04_body, "选择模板并填写签约方信息"),
("S07-S08 基础表单 & 金额日期", s05_body, "填写合同类别、金额、日期"),
("S09-S15 货品/付款/提交", s06_body, "填写货品明细、付款信息并提交"),
]
nodes = []
lines = []
begin_tag = "20260812100000"
nodes.append({
"NodePanelData": {
"ExpandedGroups": [], "InputProperty": {"mouse_x": 0, "mouse_y": 0},
"PubProperty": "", "RetPins": []
},
"NodeProperty": "",
"NodeUI": {
"NodeElementID": "", "NodeModel": "2", "NodePropErr": False,
"NodePx": "300", "NodePy": "200",
"NodeSubType": "EnumWidget_Begin", "NodeTag": begin_tag,
"NodeTitle": "开始"
}
})
prev_tag = begin_tag
start_x = 500
start_y = 200
space_y = 120
for i, (title, body, note) in enumerate(steps):
tag = f"20260812{200000 + i:06d}"
py = start_y + i * space_y
pimport_b64 = b64_raw("")
pbody_b64 = b64_raw(body)
props = {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": json.dumps({"PImport": pimport_b64, "PBCode": pbody_b64}, indent=4)
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": b64_apa("0"),
"EP_Gen_BEFOREDELAY": b64_apa("0"),
"EP_Gen_NOTE": b64_apa(note)
}
}
nodes.append({
"NodePanelData": {
"ExpandedGroups": [], "InputProperty": {"mouse_x": 0, "mouse_y": 0},
"PubProperty": "", "RetPins": []
},
"NodeProperty": props,
"NodeUI": {
"NodeElementID": "", "NodeModel": "2", "NodePropErr": False,
"NodePx": str(start_x - 15), "NodePy": str(py),
"NodeSubType": "EnumWidget_Code_Custom", "NodeTag": tag,
"NodeTitle": title
}
})
lines.append({
"LineColor": "255, 255, 255",
"LineNote": "", "LineType": 0,
"LineSplit": {"Px": "", "Py": ""},
"LineEnd": {
"Pidx": f"{tag}/EPin_Flow_In",
"Px": str(start_x - 25),
"Py": str(py + 30)
},
"LineStart": {
"Pidx": f"{prev_tag}/EPin_Flow_Out",
"Px": str(start_x - 100) if i > 0 else "415",
"Py": str(start_y + 30) if i == 0 else str(start_y + (i-1) * space_y + 30)
},
"LineTag": f"20260812{300000 + i:06d}"
})
prev_tag = tag
center_y = start_y + len(steps) * space_y // 2
main_seq = {
"LineList": lines,
"NodeList": nodes,
"SeqTag": "Main",
"ViewCenterPx": "600",
"ViewCenterPy": str(center_y),
"ViewScaling": "1"
}
with open(r"d:\RPA\AutoRpa\Main.seq", "w", encoding="utf-8") as f:
json.dump(main_seq, f, ensure_ascii=False, indent=4)
for n in nodes:
print(f" [{n['NodeUI']['NodeSubType'].replace('EnumWidget_','').replace('_Code_Custom','CODE').replace('_Begin','START')}] {n['NodeUI']['NodeTitle']}")