package service import ( "encoding/json" "github.com/beancount-gs/script" "github.com/gin-gonic/gin" "strings" ) type Transaction struct { Id string `bql:"id" json:"id"` Account string `bql:"account" json:"account"` Date string `bql:"date" json:"date"` Payee string `bql:"payee" json:"payee"` Narration string `bql:"narration" json:"desc"` Number string `bql:"number" json:"number"` Currency string `bql:"currency" json:"currency"` CostDate string `bql:"cost_date" json:"costDate"` CostPrice string `bql:"cost_number" json:"costPrice"` // 交易净值 CostCurrency string `bql:"cost_currency" json:"costCurrency"` Price string `bql:"price" json:"price"` Tags []string `bql:"tags" json:"tags"` CurrencySymbol string `json:"currencySymbol,omitempty"` CostCurrencySymbol string `json:"costCurrencySymbol,omitempty"` } func QueryTransactions(c *gin.Context) { ledgerConfig := script.GetLedgerConfigFromContext(c) queryParams := script.GetQueryParams(c) // 倒序查询 queryParams.OrderBy = "date desc" transactions := make([]Transaction, 0) err := script.BQLQueryList(ledgerConfig, &queryParams, &transactions) if err != nil { InternalError(c, err.Error()) return } // 格式化金额 for i := 0; i < len(transactions); i++ { symbol := script.GetCommoditySymbol(transactions[i].Currency) transactions[i].CurrencySymbol = symbol transactions[i].CostCurrencySymbol = symbol if transactions[i].Price != "" { transactions[i].Price = strings.Fields(transactions[i].Price)[0] } } OK(c, transactions) } type transactionPayee struct { Value string `bql:"distinct payee" json:"value"` } func QueryTransactionPayees(c *gin.Context) { ledgerConfig := script.GetLedgerConfigFromContext(c) payeeList := make([]transactionPayee, 0) queryParams := script.QueryParams{Where: false, OrderBy: "date desc", Limit: 100} err := script.BQLQueryList(ledgerConfig, &queryParams, &payeeList) if err != nil { InternalError(c, err.Error()) return } result := make([]string, 0) for _, payee := range payeeList { if payee.Value != "" { result = append(result, payee.Value) } } OK(c, result) } type transactionTemplate struct { Id string `json:"id"` Date string `json:"date"` TemplateName string `json:"templateName"` Payee string `json:"payee"` Desc string `json:"desc"` Entries []transactionTemplateEntity `json:"entries"` } type transactionTemplateEntity struct { Account string `json:"account"` Commodity string `json:"commodity"` Amount string `json:"amount"` } func QueryTransactionTemplates(c *gin.Context) { ledgerConfig := script.GetLedgerConfigFromContext(c) filePath := script.GetLedgerTransactionsTemplateFilePath(ledgerConfig.DataPath) if script.FileIfExist(filePath) { bytes, err := script.ReadFile(filePath) if err != nil { InternalError(c, err.Error()) return } result := make([]transactionTemplate, 0) err = json.Unmarshal(bytes, &result) if err != nil { InternalError(c, err.Error()) return } OK(c, result) } else { OK(c, new([]string)) } }