diff --git a/backend/app/api/cash.py b/backend/app/api/cash.py index 41940a75..748518f2 100644 --- a/backend/app/api/cash.py +++ b/backend/app/api/cash.py @@ -68,6 +68,7 @@ def _plan_dict(p: CashPlan) -> dict: "plan_type_label": "收款" if p.plan_type == "receive" else "付款", "amount": round(p.amount or 0, 2), "paid_amount": paid, + "settled_amount": round(p.amount or 0, 2) if p.status == "completed" else paid, "receivable_balance": max(balance, 0), "plan_date": p.plan_date.strftime("%Y-%m-%d") if p.plan_date else "", "counterparty": p.counterparty or "", @@ -583,6 +584,7 @@ def api_receivables( overdue_amount = 0.0 aging_amount = {} completed_amount = 0.0 + completed_count = 0 for p in plans: d = _plan_dict(p) if status: @@ -605,6 +607,7 @@ def api_receivables( aging_amount[d["aging_bucket"]] = aging_amount.get(d["aging_bucket"], 0) + d["receivable_balance"] elif d["status"] == "completed": completed_amount += d["amount"] + completed_count += 1 owners = [r[0] for r in db.query(CashPlan.owner).filter( CashPlan.entity_id == entity_id, @@ -625,6 +628,7 @@ def api_receivables( "overdue_count": overdue_count, "overdue_amount": round(overdue_amount, 2), "completed_amount": round(completed_amount, 2), + "completed_count": completed_count, "aging": {k: round(v, 2) for k, v in sorted(aging_amount.items(), key=lambda x: x[0])}, }, "data": items, diff --git a/frontend/src/views/Receivables.vue b/frontend/src/views/Receivables.vue index 9a4d795e..581ac8a5 100644 --- a/frontend/src/views/Receivables.vue +++ b/frontend/src/views/Receivables.vue @@ -17,9 +17,9 @@ - ¥{{ (summary.total_balance || 0).toFixed(2) }}万应收总额 + ¥{{ (summary.pending_balance || 0).toFixed(2) }}万待收余额 ¥{{ (summary.overdue_amount || 0).toFixed(2) }}万逾期金额 ({{ summary.overdue_count || 0 }}笔) - ¥{{ (summary.total_paid || 0).toFixed(2) }}万已回款 + ¥{{ (summary.completed_amount || 0).toFixed(2) }}万已回款 {{ summary.completed_count || 0 }}已完成笔数 @@ -39,17 +39,21 @@ 应收明细 - - + + {{ row.counterparty || (row.description || '').slice(0, 20) || '—' }} + + + {{ row.owner || '未分配' }} + ¥{{ row.amount }} - - - + + + - - {{ row.aging_label }} + + {{ row.aging_bucket }} @@ -119,7 +123,7 @@ async function loadData() { if (owner.value) params.owner = owner.value if (status.value) params.status = status.value const r: any = await api.get('/cash/receivables', { params }) - const d = r.data || r || {} + const d = r || {} summary.value = d.summary || {} owners.value = d.owners || [] const rawItems = d.data || d.items || d.receivables || []