批次5:inventory服务下沉收口 + Pydantic v2 / datetime弃用清零

- inventory业务层下沉(薄路由+service orchestration模式):
  - customer/supplier/warehouse -> master_data_service
  - material_routes(价格历史/趋势/供应商关联)-> material_service
  - product_routes(CRUD/BOM/from-task跨模块桥接)-> product_service
  - dashboard_routes(首页统计/低库存预警)-> dashboard_service
- inventory侧新增service回归覆盖(dashboard 2 / master_data 10 /
  material 10 / product 14),含跨模块桥接测试种子
- Pydantic v2弃用清零:全仓14处 class Config 全部迁移到
  model_config = ConfigDict(from_attributes=True)(含 shared auth)
- datetime.utcnow() 弃用清零:auth_service 3处统一改 datetime.now(timezone.utc)
- 同步文档:STATUS / ROADMAP / TECH_DEBT(D12清偿)/ AGENTS 代码地图

测试基线:126 passed, 4 skipped(无deprecation warning)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-09-22 16:13:45 +08:00
parent c51e6b793a
commit 64dc85bd14
32 changed files with 1495 additions and 690 deletions
+4 -7
View File
@@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel, Field
from pydantic import BaseModel, ConfigDict, Field
from typing import Optional, List
from datetime import timedelta
from sqlalchemy import select
@@ -31,8 +31,7 @@ class UserResponse(BaseModel):
is_superuser: bool = False
roles: List[str]
class Config:
from_attributes = True
model_config = ConfigDict(from_attributes=True)
class Token(BaseModel):
@@ -60,8 +59,7 @@ class RoleResponse(BaseModel):
is_system: bool
permissions: List[str]
class Config:
from_attributes = True
model_config = ConfigDict(from_attributes=True)
class PermissionCreate(BaseModel):
@@ -78,8 +76,7 @@ class PermissionResponse(BaseModel):
module: Optional[str]
description: Optional[str]
class Config:
from_attributes = True
model_config = ConfigDict(from_attributes=True)
class UserCreate(BaseModel):