From 947e6ae6f86093c8a79cae37215c5c5a066d6008 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Thu, 30 Jul 2026 13:45:02 +0800 Subject: [PATCH] feat(backend): expose receive account APIs and form validation. Co-authored-by: Cursor --- backend/app/api/oa_approval.py | 138 +++++++++++++++++++++++++++++ backend/app/services/oa_engine.py | 5 ++ backend/app/services/oa_publish.py | 1 + 3 files changed, 144 insertions(+) diff --git a/backend/app/api/oa_approval.py b/backend/app/api/oa_approval.py index e3ab6fec..a3184172 100644 --- a/backend/app/api/oa_approval.py +++ b/backend/app/api/oa_approval.py @@ -9,7 +9,9 @@ from app.core.database import get_db from app.core.menu_guard import require_admin_or_super_admin from app.core.response import error_response, success_response from app.crud import oa_approval as oa_crud +from app.crud import oa_receive_account as ora_crud from app.models.models import SysUser +from app.services.oa_receive_account import normalize_account_fields router = APIRouter(prefix="/web/admin/oa-approval", tags=["OA审批"]) @@ -176,6 +178,142 @@ async def replace_oa_role_users( return error_response(400, str(e)) +# --------------------------------------------------------------------------- +# 收款账户 +# --------------------------------------------------------------------------- + + +class OaReceiveAccountBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + account_type: str = Field(..., alias="accountType") + account_name: str = Field(..., alias="accountName") + account_no: str = Field(..., alias="accountNo") + bank_name: Optional[str] = Field(None, alias="bankName") + bank_province: Optional[str] = Field(None, alias="bankProvince") + bank_city: Optional[str] = Field(None, alias="bankCity") + bank_branch: Optional[str] = Field(None, alias="bankBranch") + order_num: Optional[int] = Field(None, alias="orderNum") + remark: Optional[str] = None + + +class OaReceiveAccountBatchDeleteBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + ids: List[str] = Field(default_factory=list) + + +@router.get("/receive-accounts") +async def list_receive_accounts( + page: int = Query(1, ge=1), + pageSize: int = Query(10, ge=1, le=100), + keyword: Optional[str] = None, + accountType: Optional[str] = None, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + tenant_no = _get_tenant_no(db, user) + items, total = ora_crud.list_accounts( + db, + tenant_no=tenant_no, + keyword=keyword, + account_type=accountType, + page=page, + page_size=pageSize, + ) + return success_response({"list": items, "total": total}) + + +@router.get("/receive-accounts/options") +async def list_receive_account_options( + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + tenant_no = _get_tenant_no(db, user) + return success_response({"list": ora_crud.list_options(db, tenant_no=tenant_no)}) + + +@router.post("/receive-accounts/batch-delete") +async def batch_delete_receive_accounts( + body: OaReceiveAccountBatchDeleteBody, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + tenant_no = _get_tenant_no(db, user) + count = ora_crud.soft_delete_accounts( + db, body.ids, tenant_no=tenant_no, user_id=user.get("user_id") + ) + return success_response({"deletedCount": count}, message="删除成功") + + +@router.post("/receive-accounts") +async def create_receive_account( + body: OaReceiveAccountBody, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + ok, err, fields = normalize_account_fields(body.model_dump(by_alias=True)) + if not ok: + return error_response(400, err or "参数无效") + tenant_no = _get_tenant_no(db, user) + obj = ora_crud.create_account( + db, + tenant_no=tenant_no, + user_id=user.get("user_id"), + dept_id=user.get("dept_id") or "", + fields=fields, + ) + return success_response(obj, message="创建成功") + + +@router.get("/receive-accounts/{account_id}") +async def get_receive_account( + account_id: str, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + tenant_no = _get_tenant_no(db, user) + obj = ora_crud.get_account(db, account_id, tenant_no) + if not obj: + return error_response(404, "收款账户不存在") + return success_response(obj) + + +@router.put("/receive-accounts/{account_id}") +async def update_receive_account( + account_id: str, + body: OaReceiveAccountBody, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + ok, err, fields = normalize_account_fields(body.model_dump(by_alias=True)) + if not ok: + return error_response(400, err or "参数无效") + tenant_no = _get_tenant_no(db, user) + obj = ora_crud.update_account( + db, + account_id, + tenant_no=tenant_no, + user_id=user.get("user_id"), + fields=fields, + ) + if not obj: + return error_response(404, "收款账户不存在") + return success_response(obj, message="更新成功") + + +@router.delete("/receive-accounts/{account_id}") +async def delete_receive_account( + account_id: str, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + tenant_no = _get_tenant_no(db, user) + if not ora_crud.soft_delete_account( + db, account_id, tenant_no=tenant_no, user_id=user.get("user_id") + ): + return error_response(404, "收款账户不存在") + return success_response(None, message="删除成功") + + # --------------------------------------------------------------------------- # 分组 # --------------------------------------------------------------------------- diff --git a/backend/app/services/oa_engine.py b/backend/app/services/oa_engine.py index 55406ef2..63f81821 100644 --- a/backend/app/services/oa_engine.py +++ b/backend/app/services/oa_engine.py @@ -1614,6 +1614,7 @@ def start_instance( from app.services.oa_dept_select import validate_dept_form_values from app.services.oa_money_field import validate_money_form_values from app.services.oa_person_select import validate_person_form_values + from app.services.oa_receive_account import validate_receive_account_form_values dept_errs = validate_dept_form_values(schema, data) if dept_errs: @@ -1627,6 +1628,10 @@ def start_instance( if person_errs: raise OaEngineError(person_errs[0]) + recv_errs = validate_receive_account_form_values(schema, data) + if recv_errs: + raise OaEngineError(recv_errs[0]) + user = ( db.query(SysUser) .filter(SysUser.id == initiator_user_id, SysUser.del_flag == 0) diff --git a/backend/app/services/oa_publish.py b/backend/app/services/oa_publish.py index 6cad05df..e3441708 100644 --- a/backend/app/services/oa_publish.py +++ b/backend/app/services/oa_publish.py @@ -30,6 +30,7 @@ FILLABLE_TYPES = frozenset( "money", "dept", "person", + "receiveAccount", "region", "formula", "relatedApproval",