83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
"""订单中心接口服务。本期只开放接口 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 "批量接收完成"
|