201 lines
10 KiB
Python
201 lines
10 KiB
Python
# 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 <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,[]))
|