提交“

This commit is contained in:
zlwu committed 2026-05-30 14:03:11 +08:00
1 parent 69ee0f505c
commit 9b88581450
614 files changed
+90318 -689022

No files matched your search

+35 -198
View File
@@ -5,7 +5,7 @@ from typing import Any, List, Optional
from fastapi import APIRouter, Depends, Query, UploadFile, File, Form
from pydantic import BaseModel, ConfigDict, Field
from sqlalchemy import or_
from sqlalchemy import and_, or_
from sqlalchemy.orm import Session
from app.core.config import settings
@@ -20,13 +20,12 @@ from app.crud import dict_data as dict_data_svc
from app.crud import dept as dept_svc
from app.crud import site as site_svc
from app.crud import post as post_svc
from app.crud import item_unit as item_unit_svc
from app.crud import express_company as express_company_svc
from app.crud import menu as menu_svc
from app.crud import role as role_svc
from app.crud import user as user_svc
from app.crud.collection_protocol import _lookup_attachment_by_url
from app.models.models import BizAttachment, SysDept, SysRole, SysUser
from app.crud import role as role_svc
from app.crud import user as user_svc
from app.models.models import BizAttachment, SysDept, SysDictData, SysRole, SysUser
from app.services.web_auth_roles import _map_role_name_to_web
router = APIRouter(prefix="/web/admin", tags=["运营端管理"])
@@ -216,9 +215,9 @@ async def delete_tenant(
def _get_tenant_no(db: Session, user: dict) -> str:
user_id = user.get("user_id")
if not user_id:
return "zkxw"
return "shanxia2.0"
sys_user = db.query(SysUser).filter(SysUser.id == user_id).first()
return (sys_user.tenant_no if sys_user else None) or "zkxw"
return (sys_user.tenant_no if sys_user else None) or "shanxia2.0"
# ---------------------------------------------------------------------------
@@ -517,6 +516,7 @@ class DictDataCreateBody(BaseModel):
dict_label: str = Field(..., alias="dictLabel")
dict_value: str = Field(..., alias="dictValue")
dict_type: str = Field(..., alias="dictType")
tag_type: Optional[str] = Field("", alias="tagType")
order_num: Optional[int] = Field(0, alias="orderNum")
remark: Optional[str] = None
@@ -526,6 +526,7 @@ class DictDataUpdateBody(BaseModel):
dict_label: Optional[str] = Field(None, alias="dictLabel")
dict_value: Optional[str] = Field(None, alias="dictValue")
tag_type: Optional[str] = Field(None, alias="tagType")
order_num: Optional[int] = Field(None, alias="orderNum")
remark: Optional[str] = None
@@ -560,6 +561,7 @@ async def create_dict_data(
dict_label=body.dict_label,
dict_value=body.dict_value,
dict_type=body.dict_type,
tag_type=body.tag_type,
tenant_no=tenant_no,
order_num=body.order_num,
remark=body.remark,
@@ -584,6 +586,7 @@ async def update_dict_data(
data_id,
dict_label=payload.get("dict_label"),
dict_value=payload.get("dict_value"),
tag_type=payload.get("tag_type"),
order_num=payload.get("order_num"),
remark=payload.get("remark"),
user_id=user.get("user_id"),
@@ -617,6 +620,28 @@ async def dict_data_options(
return success_response(items)
@router.get("/dict-data/all")
async def dict_data_all(
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
rows = db.query(SysDictData).filter(
and_(SysDictData.tenant_no == tenant_no, SysDictData.del_flag == 0)
).order_by(SysDictData.order_num.asc()).all()
grouped = {}
for r in rows:
key = r.dict_type
if key not in grouped:
grouped[key] = []
grouped[key].append({
"label": r.dict_label,
"value": r.dict_value,
"tagType": r.tag_type or ""
})
return success_response(grouped)
# ---------------------------------------------------------------------------
# 组织管理
# ---------------------------------------------------------------------------
@@ -981,196 +1006,6 @@ async def update_post_bound_users(
return error_response(400, str(e))
# ---------------------------------------------------------------------------
# 物品单位管理
# ---------------------------------------------------------------------------
class ItemUnitCreateBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
unit_code: str = Field(..., alias="unitCode")
unit_name: str = Field(..., alias="unitName")
order_num: Optional[int] = Field(0, alias="orderNum")
remark: Optional[str] = None
class ItemUnitUpdateBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
unit_code: Optional[str] = Field(None, alias="unitCode")
unit_name: Optional[str] = Field(None, alias="unitName")
order_num: Optional[int] = Field(None, alias="orderNum")
remark: Optional[str] = None
@router.get("/item-units")
async def list_item_units(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_menu_code("system:unit:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = item_unit_svc.list_item_units(db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no, user_info=user)
tp = item_unit_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
@router.post("/item-units")
async def create_item_unit(
body: ItemUnitCreateBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
obj = item_unit_svc.create_item_unit(
db,
unit_code=body.unit_code,
unit_name=body.unit_name,
tenant_no=tenant_no,
order_num=body.order_num,
remark=body.remark,
user_id=user.get("user_id"),
)
return success_response(item_unit_svc._row_to_dict(obj), message="创建成功")
except ValueError as e:
return error_response(400, str(e))
@router.put("/item-units/{unit_id}")
async def update_item_unit(
unit_id: str,
body: ItemUnitUpdateBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
payload: dict[str, Any] = body.model_dump(exclude_unset=True, by_alias=False)
obj = item_unit_svc.update_item_unit(
db,
unit_id,
unit_code=payload.get("unit_code"),
unit_name=payload.get("unit_name"),
order_num=payload.get("order_num"),
remark=payload.get("remark"),
user_id=user.get("user_id"),
)
return success_response(item_unit_svc._row_to_dict(obj), message="更新成功")
except ValueError as e:
return error_response(400, str(e))
@router.delete("/item-units/{unit_id}")
async def delete_item_unit(
unit_id: str,
_user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
item_unit_svc.soft_delete_item_unit(db, unit_id)
return success_response(None, message="删除成功")
except ValueError as e:
return error_response(400, str(e))
# ---------------------------------------------------------------------------
# 快递公司管理
# ---------------------------------------------------------------------------
class ExpressCompanyCreateBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
express_code: str = Field(..., alias="expressCode")
express_name: str = Field(..., alias="expressName")
order_num: Optional[int] = Field(0, alias="orderNum")
remark: Optional[str] = None
class ExpressCompanyUpdateBody(BaseModel):
model_config = ConfigDict(populate_by_name=True)
express_code: Optional[str] = Field(None, alias="expressCode")
express_name: Optional[str] = Field(None, alias="expressName")
order_num: Optional[int] = Field(None, alias="orderNum")
remark: Optional[str] = None
@router.get("/express-companies")
async def list_express_companies(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_menu_code("system:express:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = express_company_svc.list_express_companies(db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no, user_info=user)
tp = express_company_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
@router.post("/express-companies")
async def create_express_company(
body: ExpressCompanyCreateBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
obj = express_company_svc.create_express_company(
db,
express_code=body.express_code,
express_name=body.express_name,
tenant_no=tenant_no,
order_num=body.order_num,
remark=body.remark,
user_id=user.get("user_id"),
)
return success_response(express_company_svc._row_to_dict(obj), message="创建成功")
except ValueError as e:
return error_response(400, str(e))
@router.put("/express-companies/{company_id}")
async def update_express_company(
company_id: str,
body: ExpressCompanyUpdateBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
payload: dict[str, Any] = body.model_dump(exclude_unset=True, by_alias=False)
obj = express_company_svc.update_express_company(
db,
company_id,
express_code=payload.get("express_code"),
express_name=payload.get("express_name"),
order_num=payload.get("order_num"),
remark=payload.get("remark"),
user_id=user.get("user_id"),
)
return success_response(express_company_svc._row_to_dict(obj), message="更新成功")
except ValueError as e:
return error_response(400, str(e))
@router.delete("/express-companies/{company_id}")
async def delete_express_company(
company_id: str,
_user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
express_company_svc.soft_delete_express_company(db, company_id)
return success_response(None, message="删除成功")
except ValueError as e:
return error_response(400, str(e))
# ---------------------------------------------------------------------------
# 菜单管理
# ---------------------------------------------------------------------------
@@ -1539,7 +1374,9 @@ async def attachment_download_url(
if not file_url:
return error_response(400, "文件地址不能为空")
tenant_no = _get_tenant_no(db, user)
att = _lookup_attachment_by_url(db, file_url, tenant_no)
att = db.query(BizAttachment).filter(
and_(BizAttachment.file_url == file_url, BizAttachment.tenant_no == tenant_no, BizAttachment.del_flag == 0)
).first()
download_name = (body.file_name or "").strip()
if not download_name and att:
download_name = (att.original_name or "").strip()