# coding=utf-8 # 编译日期:2026-08-17 16:28:48 # 版权所有: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-13 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143010000000,Title:插入代码块#1-13,Note:S01 初始化并回调 start') print("[S01 初始化并回调 start]") import sys, os, json from pathlib import Path _REPO_ROOT = next( p for p in Path(__file__).resolve().parents if (p / "rpa_yisaiqi" / "__init__.py").exists() ) if str(_REPO_ROOT) not in sys.path: sys.path.insert(0, str(_REPO_ROOT)) import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_create_node import ContractCreateError, load_input_data, build_spec_from_data from rpa_yisaiqi.callback_client import StateCenterClient from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter def _first(*values): for value in values: if value is not None and str(value).strip(): return str(value).strip() return "" raw = (self.input_arg or "").strip() if not raw: raw = os.getenv("CONTRACT_INPUT_JSON", "").strip() if not raw: raw = str(_REPO_ROOT / "rpa_yisaiqi" / "examples" / "contract_create_input_dry_run.json") print("未传入 -i/--input,使用默认联调入参:", raw) if not raw: raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径") data = load_input_data(raw) state_center_url = _first( data.get("stateCenterUrl"), data.get("stateCenterURL"), os.getenv("STATE_CENTER_URL"), "http://127.0.0.1:8000", ) agent_token = _first(data.get("agentToken"), os.getenv("AGENT_TOKEN"), "dev-agent-token") _st.spec = build_spec_from_data(data) _st.client = StateCenterClient(state_center_url, agent_token) _st.ctx = _st.spec.flow_context _st.browser = ApaBrowserAdapter(url=_st.ctx.contract_url) _st.is_dry_run = (_st.spec.submit_mode == "dry_run") if not _st.is_dry_run and os.getenv("RPA_CALLBACK_STATE_CENTER") == "1": _st.client.start_node(_st.spec.job_id, "CONTRACT_CREATE") #插入代码块#1-12 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143020000000,Title:插入代码块#1-12,Note:S02 打开合同系统') print("[S02 打开合同系统]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import open_contract_system open_contract_system(_st.browser, _st.ctx) #插入代码块#1-11 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143030000000,Title:插入代码块#1-11,Note:S03 登录合同系统') print("[S03 登录合同系统]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import login_contract_system login_contract_system(_st.browser, _st.ctx) #插入代码块#1-10 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143040000000,Title:插入代码块#1-10,Note:S04 进入合同起草') print("[S04 进入合同起草]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import enter_contract_create enter_contract_create(_st.browser) #插入代码块#1-9 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143050000000,Title:插入代码块#1-9,Note:S05 选择模板') print("[S05 选择模板]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import select_contract_template select_contract_template(_st.browser, _st.ctx) #插入代码块#1-8 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143060000000,Title:插入代码块#1-8,Note:S06 填写签约方') print("[S06 填写签约方]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import fill_contract_signatory_info fill_contract_signatory_info(_st.browser, _st.ctx) #插入代码块#1-7 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143070000000,Title:插入代码块#1-7,Note:S07 填写基础信息') print("[S07 填写基础信息]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import fill_contract_basic_info fill_contract_basic_info(_st.browser, _st.ctx) #插入代码块#1-6 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143080000000,Title:插入代码块#1-6,Note:S08 填写金额日期') print("[S08 填写金额日期]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import fill_contract_amount_and_dates fill_contract_amount_and_dates(_st.browser, _st.ctx) #插入代码块#1-5 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143090000000,Title:插入代码块#1-5,Note:S09 填写货品明细') print("[S09 填写货品明细]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import fill_contract_goods_lines fill_contract_goods_lines(_st.browser, _st.ctx) #插入代码块#1-4 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143100000000,Title:插入代码块#1-4,Note:S10 填写付款信息') print("[S10 填写付款信息]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import fill_contract_payment_info fill_contract_payment_info(_st.browser, _st.ctx) #插入代码块#1-3 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143110000000,Title:插入代码块#1-3,Note:S11 上传合同PDF') print("[S11 上传合同PDF]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import upload_contract_document_if_needed upload_contract_document_if_needed(_st.browser, _st.ctx) #插入代码块#1-2 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143120000000,Title:插入代码块#1-2,Note:S12 提交送审') print("[S12 提交送审]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import submit_contract_for_approval _st.submitted = submit_contract_for_approval(_st.browser, _st.ctx) #插入代码块#1-1 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143130000000,Title:插入代码块#1-1,Note:S13 读取合同编号') print("[S13 读取合同编号]") import rpa_yisaiqi._flow_state as _st from rpa_yisaiqi.contract_flow_steps import read_contract_number if _st.submitted: _st.contract_no = read_contract_number(_st.browser) #插入代码块#1 self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:202608143140000000,Title:插入代码块#1,Note:S14 回调 complete') print("[S14 回调 complete]") import json import rpa_yisaiqi._flow_state as _st if not _st.is_dry_run and _st.contract_no and os.getenv("RPA_CALLBACK_STATE_CENTER") == "1": _st.client.complete_node(_st.spec.job_id, "CONTRACT_CREATE", { "businessRefs": {"contractSystemNo": _st.contract_no}, }) print(json.dumps({"status": "done", "contractSystemNo": _st.contract_no}, ensure_ascii=False)) 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,[]))