add month stats api
This commit is contained in:
parent
47c21de613
commit
d91869319a
|
|
@ -100,9 +100,9 @@ func BQLQueryListByCustomSelect(ledgerConfig *Config, selectBql string, queryPar
|
||||||
}
|
}
|
||||||
|
|
||||||
func bqlRawQuery(ledgerConfig *Config, selectBql string, queryParamsPtr *QueryParams, queryResultPtr interface{}) (string, error) {
|
func bqlRawQuery(ledgerConfig *Config, selectBql string, queryParamsPtr *QueryParams, queryResultPtr interface{}) (string, error) {
|
||||||
bql := ""
|
var bql string
|
||||||
if selectBql == "" {
|
if selectBql == "" {
|
||||||
bql = "SELECT"
|
bql = "select"
|
||||||
queryResultPtrType := reflect.TypeOf(queryResultPtr)
|
queryResultPtrType := reflect.TypeOf(queryResultPtr)
|
||||||
queryResultType := queryResultPtrType.Elem()
|
queryResultType := queryResultPtrType.Elem()
|
||||||
|
|
||||||
|
|
@ -196,6 +196,13 @@ func parseResult(output string, queryResultPtr interface{}, selectOne bool) erro
|
||||||
jsonName = field.Name
|
jsonName = field.Name
|
||||||
}
|
}
|
||||||
switch field.Type.Kind() {
|
switch field.Type.Kind() {
|
||||||
|
case reflect.Int:
|
||||||
|
i, err := strconv.Atoi(strings.Trim(val, " "))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
temp[jsonName] = i
|
||||||
|
break
|
||||||
// decimal
|
// decimal
|
||||||
case reflect.String, reflect.Struct:
|
case reflect.String, reflect.Struct:
|
||||||
v := strings.Trim(val, " ")
|
v := strings.Trim(val, " ")
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ func RegisterRouter(router *gin.Engine) {
|
||||||
authorized.GET("/stats/total", service.StatsTotal)
|
authorized.GET("/stats/total", service.StatsTotal)
|
||||||
authorized.GET("/stats/account/percent", service.StatsAccountPercent)
|
authorized.GET("/stats/account/percent", service.StatsAccountPercent)
|
||||||
authorized.GET("/stats/account/trend", service.StatsAccountTrend)
|
authorized.GET("/stats/account/trend", service.StatsAccountTrend)
|
||||||
|
authorized.GET("/stats/month/total", service.StatsMonthTotal)
|
||||||
authorized.GET("/transaction", service.QueryTransactions)
|
authorized.GET("/transaction", service.QueryTransactions)
|
||||||
authorized.GET("/transaction/payee", service.QueryTransactionPayees)
|
authorized.GET("/transaction/payee", service.QueryTransactionPayees)
|
||||||
authorized.GET("/transaction/template", service.QueryTransactionTemplates)
|
authorized.GET("/transaction/template", service.QueryTransactionTemplates)
|
||||||
|
|
@ -67,6 +68,7 @@ func RegisterRouter(router *gin.Engine) {
|
||||||
// 兼容旧版本
|
// 兼容旧版本
|
||||||
authorized.GET("/entry", service.QueryTransactions)
|
authorized.GET("/entry", service.QueryTransactions)
|
||||||
authorized.GET("/payee", service.QueryTransactionPayees)
|
authorized.GET("/payee", service.QueryTransactionPayees)
|
||||||
|
authorized.GET("/stats/month/incomeExpenses", service.StatsMonthTotal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,3 +151,82 @@ func StatsAccountTrend(c *gin.Context) {
|
||||||
}
|
}
|
||||||
OK(c, result)
|
OK(c, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MonthTotalBQLResult struct {
|
||||||
|
Year int
|
||||||
|
Month int
|
||||||
|
Value string
|
||||||
|
}
|
||||||
|
|
||||||
|
type MonthTotal struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Month string `json:"month"`
|
||||||
|
Amount float64 `json:"amount"`
|
||||||
|
OperatingCurrency string `json:"operatingCurrency"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func StatsMonthTotal(c *gin.Context) {
|
||||||
|
ledgerConfig := script.GetLedgerConfigFromContext(c)
|
||||||
|
|
||||||
|
monthSet := make(map[string]bool)
|
||||||
|
queryParams := script.QueryParams{
|
||||||
|
AccountLike: "Income",
|
||||||
|
Where: true,
|
||||||
|
OrderBy: "year, month",
|
||||||
|
}
|
||||||
|
// 按月查询收入
|
||||||
|
queryIncomeBql := fmt.Sprintf("select '\\', year, '\\', month, '\\', neg(sum(convert(value(position), '%s'))), '\\'", ledgerConfig.OperatingCurrency)
|
||||||
|
monthIncomeTotalResultList := make([]MonthTotalBQLResult, 0)
|
||||||
|
err := script.BQLQueryListByCustomSelect(ledgerConfig, queryIncomeBql, &queryParams, &monthIncomeTotalResultList)
|
||||||
|
if err != nil {
|
||||||
|
InternalError(c, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
monthIncomeMap := make(map[string]MonthTotalBQLResult)
|
||||||
|
for _, income := range monthIncomeTotalResultList {
|
||||||
|
month := fmt.Sprintf("%d-%d", income.Year, income.Month)
|
||||||
|
monthSet[month] = true
|
||||||
|
monthIncomeMap[month] = income
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按月查询支出
|
||||||
|
queryParams.AccountLike = "Expenses"
|
||||||
|
queryExpensesBql := fmt.Sprintf("select '\\', year, '\\', month, '\\', sum(convert(value(position), '%s')), '\\'", ledgerConfig.OperatingCurrency)
|
||||||
|
monthExpensesTotalResultList := make([]MonthTotalBQLResult, 0)
|
||||||
|
err = script.BQLQueryListByCustomSelect(ledgerConfig, queryExpensesBql, &queryParams, &monthExpensesTotalResultList)
|
||||||
|
if err != nil {
|
||||||
|
InternalError(c, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
monthExpensesMap := make(map[string]MonthTotalBQLResult)
|
||||||
|
for _, expenses := range monthExpensesTotalResultList {
|
||||||
|
month := fmt.Sprintf("%d-%d", expenses.Year, expenses.Month)
|
||||||
|
monthSet[month] = true
|
||||||
|
monthExpensesMap[month] = expenses
|
||||||
|
}
|
||||||
|
|
||||||
|
monthTotalResult := make([]MonthTotal, 0)
|
||||||
|
// 合并结果
|
||||||
|
var monthIncome, monthExpenses MonthTotal
|
||||||
|
for month := range monthSet {
|
||||||
|
if monthIncomeMap[month].Value != "" {
|
||||||
|
fields := strings.Fields(monthIncomeMap[month].Value)
|
||||||
|
amount, _ := strconv.ParseFloat(fields[0], 64)
|
||||||
|
monthIncome = MonthTotal{Type: "收入", Month: month, Amount: amount, OperatingCurrency: fields[1]}
|
||||||
|
} else {
|
||||||
|
monthIncome = MonthTotal{Type: "收入", Month: month, Amount: 0, OperatingCurrency: ledgerConfig.OperatingCurrency}
|
||||||
|
}
|
||||||
|
monthTotalResult = append(monthTotalResult, monthIncome)
|
||||||
|
|
||||||
|
if monthExpensesMap[month].Value != "" {
|
||||||
|
fields := strings.Fields(monthExpensesMap[month].Value)
|
||||||
|
amount, _ := strconv.ParseFloat(fields[0], 64)
|
||||||
|
monthExpenses = MonthTotal{Type: "支出", Month: month, Amount: amount, OperatingCurrency: fields[1]}
|
||||||
|
} else {
|
||||||
|
monthExpenses = MonthTotal{Type: "支出", Month: month, Amount: 0, OperatingCurrency: ledgerConfig.OperatingCurrency}
|
||||||
|
}
|
||||||
|
monthTotalResult = append(monthTotalResult, monthExpenses)
|
||||||
|
monthTotalResult = append(monthTotalResult, MonthTotal{Type: "结余", Month: month, Amount: monthIncome.Amount - monthExpenses.Amount, OperatingCurrency: ledgerConfig.OperatingCurrency})
|
||||||
|
}
|
||||||
|
OK(c, monthTotalResult)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue