"""接口 3 Oracle 落表。fid 是订单中心来源序号,INSERT 必须绑这一列。""" from __future__ import annotations import os from collections.abc import Callable from .oracle_repo import _ensure_client, _ora_code from .repo import DuplicateFid, RepoUnavailable _INSERT_SQL = """ INSERT INTO rpa_purchase_contract_data ( fid, oms_id, supplier_id, supplier_name, contract_sign_date, contract_start_date, contract_end_date, payment_term, goods_id, goods_name, reg_no, spec, unit, qty, purchase_tax_rate, unit_price, goods_source_id, purchaser_id, purchaser_name, planner_id, planner_name, contract_entry_status, contract_no, org_code, customer_type, goods_mdm_code, supplier_mdm_code, process_status, create_time ) VALUES ( :fid, :oms_id, :supplier_id, :supplier_name, :contract_sign_date, :contract_start_date, :contract_end_date, :payment_term, :goods_id, :goods_name, :reg_no, :spec, :unit, :qty, :purchase_tax_rate, :unit_price, :goods_source_id, :purchaser_id, :purchaser_name, :planner_id, :planner_name, :contract_entry_status, :contract_no, :org_code, :customer_type, :goods_mdm_code, :supplier_mdm_code, 0, SYSTIMESTAMP ) """ _BIND_KEYS = ( "fid", "oms_id", "supplier_id", "supplier_name", "contract_sign_date", "contract_start_date", "contract_end_date", "payment_term", "goods_id", "goods_name", "reg_no", "spec", "unit", "qty", "purchase_tax_rate", "unit_price", "goods_source_id", "purchaser_id", "purchaser_name", "planner_id", "planner_name", "contract_entry_status", "contract_no", "org_code", "customer_type", "goods_mdm_code", "supplier_mdm_code", ) class OraclePurchaseContractRepo: def __init__(self, connect: Callable): self._connect = connect @classmethod def from_env(cls) -> "OraclePurchaseContractRepo": user = os.getenv("RPA_ORACLE_USER", "") password = os.getenv("RPA_ORACLE_PASSWORD", "") host = os.getenv("RPA_ORACLE_HOST", "") if not user or not password or not host: raise RepoUnavailable("未配置 RPA_ORACLE_HOST / RPA_ORACLE_USER / RPA_ORACLE_PASSWORD") port = os.getenv("RPA_ORACLE_PORT", "1521") service = os.getenv("RPA_ORACLE_SERVICE", "rpa") dsn = f"{host}:{port}/{service}" def connect(): _ensure_client() import oracledb return oracledb.connect(user=user, password=password, dsn=dsn) return cls(connect=connect) def insert(self, record: dict) -> None: conn = self._connect() try: with conn.cursor() as cur: cur.execute(_INSERT_SQL, {key: record[key] for key in _BIND_KEYS}) conn.commit() except DuplicateFid: raise except Exception as exc: try: conn.rollback() except Exception: pass if _ora_code(exc) == 1: raise DuplicateFid(record["fid"]) from exc raise RepoUnavailable(str(exc)) from exc finally: conn.close()