"""会计科目管理 — 新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}