feat(backend): expose receive account APIs and form validation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-07-30 13:45:02 +08:00
1 parent 9277b9c568
commit 947e6ae6f8
3 files changed
+144

No files matched your search

+138
View File
@@ -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="删除成功")
# ---------------------------------------------------------------------------
# 分组
# ---------------------------------------------------------------------------
+5
View File
@@ -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)
+1
View File
@@ -30,6 +30,7 @@ FILLABLE_TYPES = frozenset(
"money",
"dept",
"person",
"receiveAccount",
"region",
"formula",
"relatedApproval",