AutoRpa/codes/Main.py

193 lines
8.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
# 编译日期:2026-08-13 09:38:51
# 版权所有:www.i-search.com.cn
import ubpa.init_input as iinput
from ubpa.base_util import StdOutHook, ExceptionHandler
import time
import pdb
from ubpa.ilog import ILog
import getopt
from sys import argv
import sys
import os
import datetime as is_datetime
import pandas
from ubpa.base_img import *
import ubpa.iplatform as iplatform
class AutoRpa:
def __init__(self,**kwargs):
self.__logger = ILog(__file__)
self.path = set_img_res_path(__file__)
self.robot_no = ''
self.proc_no = ''
self.job_no = ''
self.input_arg = ''
if('robot_no' in kwargs.keys()):
self.robot_no = kwargs['robot_no']
if('proc_no' in kwargs.keys()):
self.proc_no = kwargs['proc_no']
if('job_no' in kwargs.keys()):
self.job_no = kwargs['job_no']
ILog.JOB_NO, ILog.OLD_STDOUT = self.job_no, sys.stdout
sys.stdout = StdOutHook(self.job_no, sys.stdout)
ExceptionHandler.JOB_NO, ExceptionHandler.OLD_STDERR = self.job_no, sys.stderr
sys.excepthook = ExceptionHandler.handle_exception
if('input_arg' in kwargs.keys()):
self.input_arg = kwargs['input_arg']
if(len(self.input_arg) <= 0):
self.input_arg = iinput.load_init(__file__)
if self.input_arg is None:
sys.exit(0)
def Main(self):
#插入代码块#1
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200000,Title:插入代码块#1,Note:设置环境变量并构建YYC测试上下文')
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)}")
#插入代码块#1
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200001,Title:插入代码块#1,Note:Selenium打开Chrome浏览器并导航到合同系统')
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 已打开并导航到合同系统")
#插入代码块#1
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200002,Title:插入代码块#1,Note:登录系统并进入合同起草页面')
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] 已进入合同起草页面")
#插入代码块#1
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200003,Title:插入代码块#1,Note:选择模板并填写签约方信息')
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}")
#插入代码块#1
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200004,Title:插入代码块#1,Note:填写合同类别、金额、日期')
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}")
#插入代码块#1
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200005,Title:插入代码块#1,Note:填写货品明细、付款信息并提交')
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)
if __name__ == '__main__':
ILog.begin_init()
robot_no = ''
proc_no = ''
job_no = ''
input_arg = ''
params = {}
fn = "Main"
flow_params={'Main':[]}
try:
argv = sys.argv[1:]
opts, args = getopt.getopt(argv,"hr:p:j:i:c:",["robot = ","proc = ","job = ","input = ","params = "])
except getopt.GetoptError:
print ('robot.py -r <robot> -p <proc> -j <job>')
for opt, arg in opts:
if opt == '-h':
print ('robot.py -r <robot> -p <proc> -j <job>')
elif opt in ("-r", "--robot"):
robot_no = arg
elif opt in ("-p", "--proc"):
proc_no = arg
elif opt in ("-j", "--job"):
job_no = arg
elif opt in ("-i", "--input"):
input_arg = arg
elif opt in ("-c", "--params"):
cParam: dict = iinput.parseConnectorParam(arg)
params = cParam.pop("Params", params)
fn = cParam.pop("FlowName", fn)
pro = AutoRpa(robot_no=robot_no,proc_no=proc_no,job_no=job_no,input_arg=input_arg)
iplatform.Return(MainResult=getattr(pro, fn)(**params), job_no=job_no, fn=fn, flow_return_params=flow_params.get(fn,[]))