104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
"""接口 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()
|