feat: add vehicle recharge approval pending approve reject disburse

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-09-26 20:56:14 +08:00
1 parent ea8c2c0362
commit f80a29fb8d
8 files changed
+15288 -12531

No files matched your search

@@ -2,8 +2,10 @@
from __future__ import annotations
from datetime import date, datetime
from decimal import Decimal
from types import SimpleNamespace
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
@@ -187,3 +189,152 @@ def test_resubmit_increments_round_keeps_history(monkeypatch):
assert result.current_node == node_gm
assert len(result.approvals) == 1
assert result.approvals[0].approval_status == "rejected"
def test_approve_advances_to_next_node(monkeypatch):
from app.services import pl_vehicle_recharge_approval_service as approval_svc
from app.services import pl_vehicle_recharge_service as svc
db = _make_session()
_seed_vehicle(db)
wf_id, node_gm, node_fin = _seed_workflow(db)
db.add(
PlVehicleRechargeApply(
id="apply-1",
apply_no="ETC2026092601",
license_plate="鄂A00001",
recharge_type="etc",
apply_date=date(2026, 9, 26),
applicant_id="u-applicant",
status="in_approval",
wf_id=wf_id,
current_node=node_gm,
approval_round=1,
tenant_no="t1",
create_dept_id="d1",
)
)
db.commit()
_patch_scope(monkeypatch, svc)
result = approval_svc.approve_apply(
db, "t1", _user("u-gm", "总经理"), "apply-1", opinion="同意"
)
assert result.status == "in_approval"
assert result.current_node == node_fin
assert any(a.approval_status == "approved" for a in result.approvals)
def test_reject_sets_rejected_and_appends_history(monkeypatch):
from app.services import pl_vehicle_recharge_approval_service as approval_svc
from app.services import pl_vehicle_recharge_service as svc
db = _make_session()
_seed_vehicle(db)
wf_id, node_gm, _node_fin = _seed_workflow(db)
db.add(
PlVehicleRechargeApply(
id="apply-1",
apply_no="ETC2026092601",
license_plate="鄂A00001",
recharge_type="etc",
apply_date=date(2026, 9, 26),
applicant_id="u-applicant",
status="in_approval",
wf_id=wf_id,
current_node=node_gm,
approval_round=1,
tenant_no="t1",
create_dept_id="d1",
)
)
db.commit()
_patch_scope(monkeypatch, svc)
result = approval_svc.reject_apply(
db, "t1", _user("u-gm", "总经理"), "apply-1", opinion="材料不全"
)
assert result.status == "rejected"
assert result.current_node is None
assert result.approvals[-1].approval_status == "rejected"
def test_disburse_writes_record_and_disbursed(monkeypatch):
from app.services import pl_vehicle_recharge_approval_service as approval_svc
from app.services import pl_vehicle_recharge_service as svc
from app.schemas.pl.vehicle_recharge import VehicleRechargeRecordCreate
db = _make_session()
_seed_vehicle(db)
wf_id, _node_gm, node_fin = _seed_workflow(db)
db.add(
PlVehicleRechargeApply(
id="apply-1",
apply_no="ETC2026092601",
license_plate="鄂A00001",
recharge_type="etc",
apply_date=date(2026, 9, 26),
applicant_id="u-applicant",
status="in_approval",
wf_id=wf_id,
current_node=node_fin,
approval_round=1,
tenant_no="t1",
create_dept_id="d1",
)
)
db.commit()
_patch_scope(monkeypatch, svc)
payload = VehicleRechargeRecordCreate(
rechargeDate=date(2026, 9, 26),
rechargeType="etc",
amount=Decimal("100.00"),
applyId="apply-1",
)
result = approval_svc.disburse_apply(
db, "t1", _user("u-fin", "财务"), "apply-1", payload
)
assert result.status == "disbursed"
assert result.record is not None
assert result.record.amount == Decimal("100.00")
assert any(a.approval_status == "disbursed" for a in result.approvals)
def test_approve_forbidden_on_disburse_node(monkeypatch):
from fastapi import HTTPException
from app.services import pl_vehicle_recharge_approval_service as approval_svc
from app.services import pl_vehicle_recharge_service as svc
db = _make_session()
_seed_vehicle(db)
wf_id, _node_gm, node_fin = _seed_workflow(db)
db.add(
PlVehicleRechargeApply(
id="apply-1",
apply_no="ETC2026092601",
license_plate="鄂A00001",
recharge_type="etc",
apply_date=date(2026, 9, 26),
applicant_id="u-applicant",
status="in_approval",
wf_id=wf_id,
current_node=node_fin,
approval_round=1,
tenant_no="t1",
create_dept_id="d1",
)
)
db.commit()
_patch_scope(monkeypatch, svc)
with pytest.raises(HTTPException) as exc:
approval_svc.approve_apply(
db, "t1", _user("u-fin", "财务"), "apply-1", opinion="ok"
)
assert exc.value.status_code == 400