A:
「資產負債表」的第一版功能先做到1:每月定期進行銀行,投資,負債資料的更新。2:核心布局是顯示當年度每月的資產變化圖,並表示出最新一次的總資產金額。3:列表中每一個都可以點擊,點進去後,因為資產是每個月進行更新,所以可以看到這個資產的每個月的記錄。4:因為所有帳戶,包含投資跟銀行帳戶,都是每個月手動更新一次資料,所以計算就是每個月的變化比,還要計算現金(銀行)、股票、債券的比例,有一個圖表可以顯示這種比例的變化。5:先不考慮固定資產。如果還有不清楚的地方,還請進一步詢問我,再繼續下一步的規劃與開發,謝謝
Q:
好的,非常感謝你提供這麼詳細且清晰的功能說明!這對我們接下來的規劃至關重要。
你提出的想法非常好,它將「資產負債表」從一個被動的計算結果,變成了一個使用者可以主動維護、更貼近真實世界資產狀況的動態儀表板。
根據你的描述,我總結一下我的理解,看是否正確:
核心概念轉變: 我們不再是從每一筆交易去『推算』餘額,而是建立一個以「月」為單位、由使用者手動更新的「資產快照」系統。這是整個功能的基石。
主畫面功能: 畫面頂部是一個年度趨勢圖(顯示總資產每月變化),下方是一個資產配置比例圖(顯示現金/股票/債券等佔比),再來是各帳戶的最新狀態列表。
細節鑽取 (Drill Down): 使用者可以從主列表點擊任一帳戶,進入該帳戶的歷史快照頁面,查看它自己的歷史價值變化。
如果我的理解正確,那這份藍圖就非常清楚了。我們不需要去處理複雜的交易流水計算,而是要建立一套新的「快照」記錄與呈現機制。
「資產負債表」開發計畫
基於你的詳細需求,我規劃出以下開發步驟:
第十六步:重新設計資料庫結構
為了儲存每月的「快照」,我們需要對資料庫進行擴充。
A. 新增 AccountSnapshot (帳戶快照) 資料表
這是本次開發最核心的資料表,用來記錄在某個時間點,某個帳戶的價值是多少。
// /data/local/entity/AccountSnapshot.kt (新檔案)
@Entity(tableName = "account_snapshots")
data class AccountSnapshot(
@PrimaryKey(autoGenerate = true)
val id: Long = 0,
val accountId: Long, // 關聯到哪個帳戶
val snapshotDate: Long, // 快照日期 (儲存時間戳)
val value: Double // 該日期的帳戶價值
)
B. 修改 Account (帳戶) 資料表
為了實現資產配置比例圖,我們需要為帳戶增加一個更詳細的分類。
// /data/local/entity/Account.kt (修改此檔案)
// ...
// 新增一個 Enum 來定義資產類別
enum class AssetClass {
CASH, // 現金 (對應銀行帳戶)
STOCK, // 股票
BOND, // 債券
OTHER // 其他投資
}
@Entity(tableName = "accounts")
data class Account(
@PrimaryKey(autoGenerate = true)
val id: Long = 0,
val name: String,
val type: AccountType, // BANK, INVESTMENT, LIABILITY
val assetClass: AssetClass, // 新增此欄位,用來做資產配置分析
val initialBalance: Double // 這個欄位的重要性會降低,但可保留
)
C. 建立 SnapshotDao 並擴充 Repository
我們需要一個新的 DAO 來專門操作 AccountSnapshot 表,並提供我們需要的各種聚合查詢。
需要的方法:
insertOrUpdateSnapshot(snapshot: AccountSnapshot)
:新增或更新某個帳戶在某個月的快照。getYearlyAssetTrend(accountType: List<AccountType>, year: Int)
:查詢某一年中,所有資產型帳戶的每月總價值,用於年度趨勢圖。getLatestAllocation()
:查詢最新一次快照中,各AssetClass
的總價值,用於資產配置比例圖。getSnapshotsForAccount(accountId: Long)
:取得某個帳戶的所有歷史快照紀錄。
第十七步:建立 UI 畫面與 ViewModel
A. 建立 BalanceSheetViewModel
這個 ViewModel 將會:
從
SnapshotRepository
獲取年度趨勢圖、資產配置圖、以及各帳戶最新餘額列表的數據。提供一個
updateAccountSnapshots(updates: Map<Long, Double>)
的方法,讓 UI 可以一次性更新多個帳戶的當月快照。
B. 建立 BalanceSheetScreen.kt
(資產負債主畫面)
頂部: 顯示「最新總資產」金額。
圖表一: 使用 Vico 函式庫的線圖或長條圖,呈現
yearlyAssetTrend
的數據。圖表二: 使用 Vico 的圓餅圖 (PieChart),呈現
assetAllocation
的數據。列表: 使用
LazyColumn
顯示所有帳戶的最新快照餘額。每個項目都可點擊。互動按鈕: 一個顯眼的「更新本月餘額」按鈕,點擊後會彈出一個對話框或進入一個新頁面。
C. 建立「更新餘額」的介面
這可以是一個對話框 (
Dialog
) 或是一個獨立的頁面。它會列出使用者所有的帳戶,每個帳戶後面跟著一個輸入框 (
TextField
),讓使用者可以快速地輸入所有帳戶的最新價值。點擊「儲存」後,一次性呼叫 ViewModel 的
updateAccountSnapshots
方法。
D. 建立 AccountHistoryScreen.kt
(單一帳戶歷史畫面)
當使用者在
BalanceSheetScreen
的列表中點擊任一帳戶時,導航到此頁面。此頁面會接收一個
accountId
。畫面中會有一個線圖,專門顯示這一個帳戶的價值歷史變化。
下方會用列表詳細列出每一次的快照紀錄(日期和金額)。
第十八步:整合導航
在
AppNavigation.kt
中新增BALANCE_SHEET
和ACCOUNT_HISTORY
兩個新路線。決定從哪裡進入資產負債表。一個好的選擇是,將 App 的底部導航列 (Bottom Navigation Bar) 建立起來,包含「交易紀錄」、「統計圖表」、「資產負債」三個主要分頁。這會讓 App 的整體架構更清晰。
以上的規劃將能完整地實現你提出的所有功能細節。從修改資料庫開始,到建立 ViewModel,再到打造三個新的 UI 介面(主畫面、更新對話框、歷史紀錄頁),最後串連導航。
這個規劃是否符合你對「資產負債表」第一版功能的想像?如果沒有問題,我們就可以從第一步**「修改資料庫結構」**開始動手了!