u
This commit is contained in:
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()
|
||||
}
|
||||
Reference in new issue
Block a user