96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
"""会计科目管理 — 新30号准则适配"""
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import func
|
|
from typing import Optional, List
|
|
from app.database import get_db
|
|
from app.auth_middleware import require_role
|
|
from app.models import Subject
|
|
import logging
|
|
|
|
logger = logging.getLogger("cma.subjects")
|
|
|
|
router = APIRouter(prefix="/api/cma/subjects", tags=["会计科目"],
|
|
dependencies=[Depends(require_role("ceo", "finance", "business"))],
|
|
)
|
|
|
|
|
|
@router.get("")
|
|
def list_subjects(
|
|
category: Optional[str] = Query(None, description="新30号准则分类过滤"),
|
|
keyword: Optional[str] = Query(None, description="科目名称/编码搜索"),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""科目列表 — 支持新30号准则分类筛选"""
|
|
query = db.query(Subject).filter(Subject.is_active == 1)
|
|
|
|
if category:
|
|
query = query.filter(Subject.new_standard_category == category)
|
|
|
|
if keyword:
|
|
like = f"%{keyword}%"
|
|
query = query.filter(
|
|
Subject.subject_name.like(like) | Subject.subject_code.like(like)
|
|
)
|
|
|
|
subjects = query.order_by(Subject.subject_code).all()
|
|
|
|
return {
|
|
"total": len(subjects),
|
|
"data": [
|
|
{
|
|
"id": s.id,
|
|
"subject_code": s.subject_code,
|
|
"subject_name": s.subject_name,
|
|
"parent_code": s.parent_code,
|
|
"level": s.level,
|
|
"category": s.category,
|
|
"new_standard_category": s.new_standard_category,
|
|
"is_active": s.is_active,
|
|
"remark": s.remark,
|
|
"updated_at": s.updated_at.isoformat() if s.updated_at else None,
|
|
}
|
|
for s in subjects
|
|
],
|
|
}
|
|
|
|
|
|
@router.put("/{subject_id}")
|
|
def update_subject_category(
|
|
subject_id: int,
|
|
new_standard_category: str = Query(..., description="operating/investing/financing/tax/discontinued"),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""更新单个科目的新30号准则分类"""
|
|
subject = db.query(Subject).filter(Subject.id == subject_id).first()
|
|
if not subject:
|
|
raise HTTPException(status_code=404, detail="科目不存在")
|
|
|
|
valid = {"operating", "operating_rd", "operating_fx", "investing",
|
|
"financing", "financing_fx", "tax", "discontinued"}
|
|
if new_standard_category not in valid:
|
|
raise HTTPException(status_code=400, detail=f"无效的分类: {new_standard_category}")
|
|
|
|
subject.new_standard_category = new_standard_category
|
|
db.commit()
|
|
return {"message": "更新成功", "subject_id": subject_id, "new_standard_category": new_standard_category}
|
|
|
|
|
|
@router.put("/batch/category")
|
|
def batch_update_category(
|
|
ids: List[int] = Query(..., description="科目ID列表"),
|
|
new_standard_category: str = Query(..., description="operating/investing/financing/tax/discontinued"),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""批量更新科目新30号准则分类"""
|
|
valid = {"operating", "operating_rd", "operating_fx", "investing",
|
|
"financing", "financing_fx", "tax", "discontinued"}
|
|
if new_standard_category not in valid:
|
|
raise HTTPException(status_code=400, detail=f"无效的分类: {new_standard_category}")
|
|
|
|
updated = db.query(Subject).filter(
|
|
Subject.id.in_(ids), Subject.is_active == 1
|
|
).update({"new_standard_category": new_standard_category}, synchronize_session=False)
|
|
db.commit()
|
|
return {"message": f"批量更新成功", "updated_count": updated}
|