This commit is contained in:
oneao committed 2026-02-25 17:31:09 +08:00
1 parent 835958886e
commit d04d22723b
155 files changed
+543 -9793

No files matched your search

@@ -0,0 +1,105 @@
// Code generated by hertz generator.
package money
import (
money "allapp/biz/model/money"
"allapp/biz/router/middleware"
"allapp/db"
"allapp/db/repo"
"allapp/utils/errorx"
"allapp/utils/pgtypex"
"allapp/utils/response"
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// AnalysisMoneyLine .
// @router /money/analysis/line [POST]
func AnalysisMoneyLine(ctx context.Context, c *app.RequestContext) {
var err error
var req money.AnalysisMoneyParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
userID := middleware.GetUserID(ctx)
analysis, err := db.Queries.ListMoneyRecordsByLineAnalysis(ctx, repo.ListMoneyRecordsByLineAnalysisParams{
Column1: req.PeriodType,
UserID: userID,
RecordTime: pgtypex.StringToDate(req.StartDate),
RecordTime_2: pgtypex.StringToDate(req.EndDate),
Type: req.Type,
})
if err != nil {
errorx.AddError(c, err)
return
}
// 循环赋值到响应数据中
records := make([]*money.AnalysisMoneyAmount, 0, len(analysis))
for _, record := range analysis {
period, ok := record.Period.(string)
if !ok {
period = ""
}
// 创建指向 AnalysisAmount 的指针
records = append(records, &money.AnalysisMoneyAmount{
X: period,
Y: pgtypex.NumericToString(record.TotalAmount),
})
}
response.Success(c).Data(&money.AnalysisMoneyLineResult{
Records: records,
}).Send()
}
// AnalysisMoneyPie .
// @router /money/analysis/pie [POST]
func AnalysisMoneyPie(ctx context.Context, c *app.RequestContext) {
var err error
var req money.AnalysisMoneyParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
userID := middleware.GetUserID(ctx)
analysis, err := db.Queries.ListMoneyRecordsByPieAnalysis(ctx, repo.ListMoneyRecordsByPieAnalysisParams{
UserID: userID,
RecordTime: pgtypex.StringToDate(req.StartDate),
RecordTime_2: pgtypex.StringToDate(req.EndDate),
Type: req.Type,
})
if err != nil {
errorx.AddError(c, err)
return
}
// 使用值类型而不是指针类型
records := make([]*money.AnalysisMoneyAmount, 0, len(analysis))
for _, record := range analysis {
// 直接赋值而不是使用指针
records = append(records, &money.AnalysisMoneyAmount{
X: record.Name.String,
Y: pgtypex.NumericToString(record.TotalAmount),
})
}
response.Success(c).Data(&money.AnalysisMoneyPieResult{
Records: records,
}).Send()
}
@@ -0,0 +1,219 @@
// Code generated by hertz generator.
package money
import (
"allapp/biz/router/middleware"
"allapp/db"
"allapp/db/repo"
"allapp/utils/errorx"
"allapp/utils/idgen"
"allapp/utils/response"
"context"
"fmt"
money "allapp/biz/model/money"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// List .
// @router /money/category [GET]
func List(ctx context.Context, c *app.RequestContext) {
var err error
var req money.ListMoneyCategoryReq
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.ListMoneyCategoryResp{
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
}
userID := middleware.GetUserID(ctx)
categoryId := req.Id
err = db.WithTx(ctx, func(q *repo.Queries) error {
err2 := q.DeleteMoneyCategoryById(ctx, categoryId)
if err2 != nil {
return err2
}
err2 = q.DeleteMoneyRecordByCategoryId(ctx, repo.DeleteMoneyRecordByCategoryIdParams{
UserID: userID,
CategoryID: categoryId,
})
if err2 != nil {
return err2
}
return nil
})
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()
}
// CreateMoneyCategory .
// @router /money/category/create [POST]
func CreateMoneyCategory(ctx context.Context, c *app.RequestContext) {
var err error
var req money.CreateMoneyCategoryReq
err = c.BindAndValidate(&req)
if err != nil {
fmt.Println(err)
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(money.CreateMoneyCategoryResp)
ID := idgen.NextId()
params := repo.InsertMoneyUserCategoryParams{
ID: ID,
UserID: middleware.GetUserID(ctx),
Name: req.Name,
Icon: req.Icon,
Type: req.Type,
SortNumber: req.SortNumber,
}
// 插入
err = db.WithTx(ctx, func(q *repo.Queries) error {
err = q.InsertMoneyUserCategory(ctx, params)
if err != nil {
return err
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
resp.Id = ID
response.Success(c).Data(resp).Send()
}
// UpdateMoneyCategory .
// @router /money/category/update [POST]
func UpdateMoneyCategory(ctx context.Context, c *app.RequestContext) {
var err error
var req money.UpdateMoneyCategoryReq
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(money.UpdateMoneyCategoryResp)
params := repo.UpdateMoneyCategoryParams{
ID: req.Id,
Name: req.Name,
Icon: req.Icon,
}
// 插入
err = db.WithTx(ctx, func(q *repo.Queries) error {
err = q.UpdateMoneyCategory(ctx, params)
if err != nil {
return err
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Data(resp).Send()
}
@@ -0,0 +1,183 @@
// Code generated by hertz generator.
package money
import (
money "allapp/biz/model/money"
"allapp/biz/router/middleware"
"allapp/db"
"allapp/db/repo"
"allapp/utils/errorx"
"allapp/utils/idgen"
"allapp/utils/pgtypex"
"allapp/utils/response"
"allapp/utils/timex"
"context"
"fmt"
"time"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// ListMoneyRecords 账目列表
// @router /money/record/list [POST]
func ListMoneyRecords(ctx context.Context, c *app.RequestContext) {
var req money.ListMoneyRecordsParams
if err := c.BindAndValidate(&req); err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
// 解析年月(yyyy-MM)
startTime, err := timex.ParseTimeFlexible(req.StartTime)
if err != nil {
errorx.AddError(c, fmt.Errorf("invalid start_time format: %v", err))
return
}
endTime, err := timex.ParseTimeFlexible(req.EndTime)
if err != nil {
errorx.AddError(c, fmt.Errorf("invalid end_time format: %v", err))
return
}
// 开始时间兜底
if startTime == nil {
t := time.Unix(0, 0)
startTime = &t
}
// 结束时间兜底
if endTime == nil {
t := time.Now().AddDate(10, 0, 0)
endTime = &t
}
userID := middleware.GetUserID(ctx)
categoryId := req.CategoryId
// 查询账目列表(统一 SQL)
dbRecords, err := db.Queries.ListMoneyRecords(
ctx,
repo.ListMoneyRecordsParams{
UserID: userID,
RecordTime: pgtypex.TimePtrToPgDate(startTime),
RecordTime_2: pgtypex.TimePtrToPgDate(endTime),
},
)
if err != nil {
errorx.AddError(c, err)
return
}
records := make([]*money.MoneyRecord, 0, len(dbRecords))
for _, r := range dbRecords {
records = append(records, &money.MoneyRecord{
Id: r.ID,
CategoryId: r.CategoryID,
UserId: r.UserID,
Username: r.Username.String,
Amount: pgtypex.NumericToString(r.Amount),
Remark: r.Remark.String,
RecordTime: pgtypex.DateToString(r.RecordTime),
CreateTime: pgtypex.TimestampToMillis(r.CreateTime),
UpdateTime: pgtypex.TimestampToMillis(r.UpdateTime),
})
}
response.Success(c).Data(&money.ListMoneyRecordsResult{
Records: records,
}).Send()
}
// InsertMoneyRecord .
// @router /money/record/insert [POST]
func InsertMoneyRecord(ctx context.Context, c *app.RequestContext) {
var err error
var req money.InsertMoneyRecordParams
err = c.BindAndValidate(&req)
if err != nil {
fmt.Println(err.Error())
c.String(consts.StatusBadRequest, err.Error())
return
}
params := repo.InsertMoneyRecordParams{
ID: idgen.NextId(),
CategoryID: req.CategoryId,
UserID: middleware.GetUserID(ctx),
Amount: pgtypex.StringToNumeric(req.Amount),
Remark: pgtypex.StringToText(req.Remark),
RecordTime: pgtypex.StringToDate(req.RecordTime),
}
err = db.Queries.InsertMoneyRecord(ctx, params)
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Message("新增成功").Send()
}
// UpdateMoneyRecord .
// @router /money/record/update [POST]
func UpdateMoneyRecord(ctx context.Context, c *app.RequestContext) {
var req money.UpdateMoneyRecordParams
if err := c.BindAndValidate(&req); err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
id := req.Id
_, err := db.Queries.GetMoneyRecordById(ctx, id)
if err != nil {
if errorx.IsNotFound(err) {
response.Success(c).Send()
return
}
errorx.AddError(c, err)
return
}
params := repo.UpdateMoneyRecordParams{
ID: id,
CategoryID: req.CategoryId,
Amount: pgtypex.StringToNumeric(req.Amount),
Remark: pgtypex.StringToText(req.Remark),
RecordTime: pgtypex.StringToDate(req.RecordTime),
}
if err := db.Queries.UpdateMoneyRecord(ctx, params); err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Send()
}
// DeleteMoneyRecord .
// @router /money/record/delete [POST]
func DeleteMoneyRecord(ctx context.Context, c *app.RequestContext) {
var err error
var req money.DeleteMoneyRecordParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
err = db.Queries.DeleteMoneyRecord(ctx, req.Id)
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Send()
}