# 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 -p -j ') for opt, arg in opts: if opt == '-h': print ('robot.py -r -p -j ') 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,[]))