AutoRpa/rpa_oms/app/inbound/oracle_contract_repo.py

104 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""接口 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()