开始多平台 多店铺整改

This commit is contained in:
yml
2026-04-08 22:21:11 +08:00
parent d5b10e3f7f
commit a2b09c89e8
40 changed files with 1750 additions and 685 deletions
+10 -3
View File
@@ -5,12 +5,19 @@
只保留最核心的能力:
- 加载 `ddddocr`
- 从标准输入接收 JSON
- 返回识别结果 JSON 行
- 接收一次 OCR 请求并返回一次 JSON 结果
- 提供一个最小化健康检查入口
初始化依赖:
```bash
cd /Users/yml/codes/order-site-backend/subservices/ocr-worker
cd /Users/yml/codes/order-site-workspace/apps/backend/subservices/ocr-worker
uv sync
```
说明:
- 本地源码调试时,先执行 `uv sync`
- Docker 镜像构建时,会把 OCR 依赖直接安装到容器内的 Python 环境
- Docker 运行时只使用容器内 `python3`
- 后端现在按次调用 OCR Python 进程,不再维护常驻 worker
@@ -13,11 +13,20 @@ from .engine import get_ocr_engine, recognize_image
def main() -> None:
parser = argparse.ArgumentParser(prog="ocr-worker", description="本地 OCR worker")
parser.add_argument("command", nargs="?", default="worker", choices=["worker"])
parser.add_argument(
"command",
nargs="?",
default="request",
choices=["worker", "request", "healthcheck"],
)
args = parser.parse_args()
if args.command == "worker":
run_worker()
elif args.command == "request":
run_single_request()
elif args.command == "healthcheck":
run_healthcheck()
def run_worker() -> None:
@@ -56,6 +65,35 @@ def run_worker() -> None:
)
def run_single_request() -> None:
get_ocr_engine()
raw_text = sys.stdin.read().strip()
if not raw_text:
raise ValueError("缺少 OCR 请求内容")
try:
request = json.loads(raw_text)
action = str(request.get("action") or "recognize").strip().lower()
payload = request.get("payload") or {}
if action == "recognize":
response_payload = build_success_payload(recognize_payload(payload), "ok")
elif action == "batch":
response_payload = build_success_payload(batch_recognize_payload(payload), "ok")
else:
response_payload = build_error_payload(f"不支持的 action: {action}")
except Exception as error: # noqa: BLE001
response_payload = build_error_payload(str(error) or "请求失败")
write_message(response_payload)
def run_healthcheck() -> None:
get_ocr_engine()
write_message({"code": 0, "msg": "ok"})
def recognize_payload(payload: Any) -> dict[str, Any]:
if not isinstance(payload, dict):
raise ValueError("payload 必须是对象")
@@ -177,3 +215,7 @@ def build_timestamp() -> str:
def write_message(payload: dict[str, Any]) -> None:
sys.stdout.write(json.dumps(payload, ensure_ascii=False) + "\n")
sys.stdout.flush()
if __name__ == "__main__":
main()