This commit is contained in:
oneao committed 2025-11-30 22:40:56 +08:00
1 parent 5308dc8fda
commit d51eacb8ad
32 files changed
+1788 -513

No files matched your search

@@ -0,0 +1,117 @@
// Code generated by hertz generator.
package money
import (
"cn/oneao/base-go/biz/model/money"
"cn/oneao/base-go/biz/router/middleware"
"cn/oneao/base-go/db"
"cn/oneao/base-go/db/repo"
"cn/oneao/base-go/utils/errorx"
"cn/oneao/base-go/utils/response"
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// QueryUserMoneyCategory .
// @router /money/category [GET]
func QueryUserMoneyCategory(ctx context.Context, c *app.RequestContext) {
var err error
var req money.QueryMoneyCategoryReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
userID := middleware.GetUserID(ctx)
// 查询用户分类
moneyUserCategories, err := db.Queries.FindUserMoneyCategoriesByUserID(ctx, userID)
if err != nil {
errorx.AddError(c, err)
return
}
// 构造返回数据,切片类型是 []*UserMoneyCategory
resp := &money.QueryMoneyCategoryResp{
Categories: make([]*money.MoneyCategory, 0, len(moneyUserCategories)),
}
for _, c := range moneyUserCategories {
category := &money.MoneyCategory{
Id: c.ID,
Name: c.Name,
Icon: c.Icon,
Type: c.Type,
SortNumber: c.SortNumber,
}
resp.Categories = append(resp.Categories, category)
}
response.Success(c).Data(resp).Send()
}
// DeleteUserMoneyCategory .
// @router /money/category/delete [POST]
func DeleteUserMoneyCategory(ctx context.Context, c *app.RequestContext) {
var err error
var req money.DeleteMoneyCategoryReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
err = db.Queries.DeleteUserMoneyCategoryById(ctx, req.Id)
if err != nil {
errorx.AddError(c, err)
return
}
resp := new(money.DeleteMoneyCategoryResp)
response.Success(c).Data(resp).Send()
}
// UpdateMoneyCategorySort .
// @router /money/category/updateSort [POST]
func UpdateMoneyCategorySort(ctx context.Context, c *app.RequestContext) {
var req money.UpdateMoneyCategorySortReq
if err := c.BindAndValidate(&req); err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
// 组装批量更新参数
params := make([]repo.BatchUpdateMoneyCategorySortParams, 0, len(req.Data))
for _, datum := range req.Data {
params = append(params, repo.BatchUpdateMoneyCategorySortParams{
ID: datum.Id,
SortNumber: datum.SortNumber,
})
}
// 使用统一事务封装
err := db.WithTx(ctx, func(q *repo.Queries) error {
batch := q.BatchUpdateMoneyCategorySort(ctx, params)
if err := db.RunBatch(ctx, batch); err != nil {
return err
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
// 返回成功
response.Success(c).Send()
}
@@ -0,0 +1,131 @@
// Code generated by hertz generator.
package money
import (
"cn/oneao/base-go/biz/router/middleware"
"cn/oneao/base-go/db"
"cn/oneao/base-go/db/repo"
"cn/oneao/base-go/utils/errorx"
"cn/oneao/base-go/utils/response"
"context"
"fmt"
"sort"
"time"
money "cn/oneao/base-go/biz/model/money"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
"github.com/jackc/pgx/v5/pgtype"
"github.com/shopspring/decimal"
"google.golang.org/protobuf/types/known/timestamppb"
)
// QueryMoneyRecord .
// @router /money/record [POST]
func QueryMoneyRecord(ctx context.Context, c *app.RequestContext) {
var req money.QueryMoneyRecordsParams
if err := c.BindAndValidate(&req); err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
// 解析年月
startTime, err := time.Parse("2006-01", req.RecordTime)
if err != nil {
errorx.AddError(c, fmt.Errorf("invalid record_time format: %v", err))
return
}
endTime := startTime.AddDate(0, 1, 0).Add(-time.Nanosecond)
// 获取 userID
userID := middleware.GetUserID(ctx)
// 查询记录
params := repo.FindUserMoneyRecordsParams{
UserID: userID,
RecordTime: pgtype.Timestamp{Time: startTime, Valid: true},
RecordTime_2: pgtype.Timestamp{Time: endTime, Valid: true},
}
records, err := db.Queries.FindUserMoneyRecords(ctx, params)
if err != nil {
errorx.AddError(c, err)
return
}
// 分组统计
groupMap := make(map[string]*money.MoneyRecordGroup)
totalIncome := decimal.NewFromInt(0)
totalExpense := decimal.NewFromInt(0)
for _, r := range records {
day := r.RecordTime.Time.Format("2006-01-02")
group, ok := groupMap[day]
if !ok {
group = &money.MoneyRecordGroup{
RecordTime: day,
Income: "0.00",
Expense: "0.00",
Records: make([]*money.MoneyRecordItem, 0),
}
groupMap[day] = group
}
// 构造单条记录
item := &money.MoneyRecordItem{
Base: &money.MoneyRecordBase{
Id: r.ID,
CategoryId: r.CategoryID,
UserId: r.UserID,
Amount: r.Amount.Int.String(),
Remark: r.Remark.String,
RecordTime: timestamppb.New(r.RecordTime.Time),
CreateTime: timestamppb.New(r.CreateTime.Time),
UpdateTime: timestamppb.New(r.UpdateTime.Time),
},
CategoryName: r.CategoryName.String,
CategoryIcon: r.CategoryIcon.String,
CategoryType: r.CategoryType.Int32,
}
group.Records = append(group.Records, item)
// 收支累加
amount, _ := decimal.NewFromString(r.Amount.Int.String())
if r.CategoryType.Int32 == 1 {
incomeDec, _ := decimal.NewFromString(group.Income)
incomeDec = incomeDec.Add(amount)
group.Income = incomeDec.Round(2).StringFixed(2)
totalIncome = totalIncome.Add(amount)
} else if r.CategoryType.Int32 == 0 {
expenseDec, _ := decimal.NewFromString(group.Expense)
expenseDec = expenseDec.Add(amount)
group.Expense = expenseDec.Round(2).StringFixed(2)
totalExpense = totalExpense.Add(amount)
}
}
// 对日期排序,最新在前
dates := make([]string, 0, len(groupMap))
for k := range groupMap {
dates = append(dates, k)
}
sort.Slice(dates, func(i, j int) bool { return dates[i] > dates[j] })
// 构建最终返回数组
resultGroups := make([]*money.MoneyRecordGroup, 0, len(dates))
for _, day := range dates {
resultGroups = append(resultGroups, groupMap[day])
}
result := &money.QueryMoneyRecordsResult{
Records: resultGroups,
TotalIncome: totalIncome.Round(2).StringFixed(2),
TotalExpense: totalExpense.Round(2).StringFixed(2),
}
response.Success(c).Data(result).Send()
}