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