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