AutoRpa/rpa_oms/app/main.py

75 lines
2.2 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
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.repo import RepoUnavailable
from .inbound.sales_goods import receive_sales_goods
app = FastAPI(title="洁达 RPA × 订单中心", version="0.1")
def get_repo():
# 运行时只走 Oracle。单测用 dependency_overrides 注入内存替身。
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 "批量接收完成"