AutoRpa/rpa_oms/app/main.py

83 lines
2.5 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.

"""订单中心接口服务。本期只开放接口 1 收件。
路径:POST /api/oms/v1/sales-goods
鉴权:X-Oms-Token
落表:rpa_sales_goods_mapping_data,deal_flag=0
请求里不跑选品。
"""
from __future__ import annotations
import os
from typing import Annotated, Any
from fastapi import Depends, FastAPI, Header
from fastapi.responses import JSONResponse
from .auth import token_ok
from .inbound.envelope import EnvelopeError, parse_envelope
from .inbound.memory_repo import MemorySalesGoodsRepo
from .inbound.repo import RepoUnavailable
from .inbound.sales_goods import receive_sales_goods
app = FastAPI(title="洁达 RPA × 订单中心", version="0.1")
# 内存仓库做成进程内单例,同一进程多次 POST 才能测到 DUPLICATE。
_memory_repo = MemorySalesGoodsRepo()
def get_repo():
# 默认走 Oracle。本机连不上库时 OMS_REPO=memory。
if os.getenv("OMS_REPO", "oracle") == "memory":
return _memory_repo
# thick 客户端初始化有副作用,用到才 import。
from .inbound.oracle_repo import OracleSalesGoodsRepo
return OracleSalesGoodsRepo.from_env()
@app.get("/health")
def health():
return {"ok": True}
@app.post("/api/oms/v1/sales-goods")
def post_sales_goods(
payload: dict[str, Any] | None = None,
x_oms_token: Annotated[str | None, Header()] = None,
repo=Depends(get_repo),
):
if not token_ok(x_oms_token):
return JSONResponse(
status_code=401,
content={"code": 401, "msg": "身份认证失败", "results": []},
)
try:
rows = parse_envelope(payload if payload is not None else {})
except EnvelopeError as exc:
return JSONResponse(
status_code=422,
content={"code": 422, "msg": exc.message, "results": []},
)
try:
results = receive_sales_goods(rows, repo)
except RepoUnavailable as exc:
return JSONResponse(
status_code=503,
content={"code": 503, "msg": exc.message, "results": []},
)
# 逐条有成功/重复/拒绝时 HTTP 仍 200,看 results[].resultCode。
return {
"code": 200,
"msg": _summary(results),
"results": results,
}
def _summary(results: list[dict]) -> str:
codes = {item["resultCode"] for item in results}
if codes <= {"ACCEPTED"}:
return "批量接收完成"
if codes <= {"ACCEPTED", "DUPLICATE"} and "DUPLICATE" in codes:
return "批量接收完成,存在重复数据"
return "批量接收完成"