package money import ( "base-go-v2/internal/db" response "base-go-v2/internal/reponse" "base-go-v2/internal/router" "base-go-v2/internal/utils/idgen" "base-go-v2/internal/utils/mapx" "fmt" "github.com/shopspring/decimal" ) func InitMoneyRouter(r *router.Router) { group := r.Group("money") group.GET("/category", getUserCategory) group.POST("/insert", insertMoneyRecord) group.POST("/update", updateMoneyRecord) group.POST("/delete", deleteMoneyRecord) } // InitDefaultCategories 初始化系统默认分类到用户分类表 func InitDefaultCategories(userID int64) error { fmt.Println("进入 InitDefaultCategories ===") // 1. 查询系统分类表 sysCategories, err := db.FindAll("money_sys_category", "sort_number") if err != nil { return err } fmt.Printf("系统分类数量: %d\n", len(sysCategories)) // 2. 构建批量插入数据 //userCategories := make([]mapx.M, 0, len(sysCategories)) userCategories := mapx.NewArr(len(sysCategories)) for i, row := range sysCategories { m := mapx.New().SetKV( "id", idgen.NextId(), "user_id", userID, "name", row.GetString("name"), "icon", row.GetString("icon"), "type", row.GetInt("type"), "sort_number", row.GetInt("sort_number"), ) fmt.Printf("用户分类 %d: %+v\n", i+1, m) userCategories = append(userCategories, m) } // 3. 批量插入到用户分类表 if _, err := db.InsertBatch("money_user_category", userCategories); err != nil { return err } fmt.Println("初始化用户分类成功!") return nil } func getUserCategory(c *router.Context) error { userId := c.GetUserID() // 查询当前用户的分类 userCategories, err := db.Find("money_user_category", mapx.New().Set("user_id", userId), "sort_number ASC") if err != nil { return c.AddError(err) } // 按 type 分组 result := map[string][]mapx.M{ "income": {}, "expense": {}, } for _, cat := range userCategories { switch cat.GetInt("type") { case 0: result["income"] = append(result["income"], cat) case 1: result["expense"] = append(result["expense"], cat) } } return response.Success(c).Data(result).Send() } func insertMoneyRecord(c *router.Context) error { bodyData, err := c.GetBodyWithRequired("category_id", "amount", "record_time") if err != nil { return c.AddError(err) } categoryId := bodyData.GetInt64("category_id") recordTime := bodyData.GetString("record_time") amountStr := bodyData.GetString("amount") remark := bodyData.GetString("remark") amountDecimal, err := decimal.NewFromString(amountStr) if err != nil { return c.AddError(err) } newRecord := mapx.New().SetKV("id", idgen.NextId(), "category_id", categoryId, "user_id", c.GetUserID(), "amount", amountDecimal, "remark", remark, "record_time", recordTime, ) insertOne, err := db.InsertOne("money_record", newRecord) if err != nil { return response.Fail(c).Message("新增失败").Send() } if insertOne != 1 { return response.Fail(c).Message("新增失败").Send() } return response.Success(c).Data(newRecord).Message("新增成功").Send() } func updateMoneyRecord(c *router.Context) error { bodyData, err := c.GetBodyWithRequired("id") if err != nil { return c.AddError(err) } recordId := bodyData.GetInt64("id") record, err := db.GetOne("money_record", "id", recordId) if err != nil { return c.AddError(err) } if record == nil { return response.Fail(c).Message("该条账单不存在").Send() } categoryId := bodyData.GetInt64("category_id") recordTime := bodyData.GetString("record_time") amountStr := bodyData.GetString("amount") remark := bodyData.GetString("remark") updateRecord := mapx.New().SetKV("id", recordId) if record.GetInt64("category_id") != categoryId { updateRecord.SetKV("category_id", categoryId) } if record.GetString("record_time") != recordTime { updateRecord.SetKV("record_time", recordTime) } if record.GetString("amount") != amountStr { amountDecimal, err := decimal.NewFromString(amountStr) if err != nil { return c.AddError(err) } updateRecord.SetKV("amount", amountDecimal) } if record.GetString("remark") != remark { updateRecord.SetKV("remark", remark) } updateOne, err := db.UpdateOne("money_record", "id", recordId, updateRecord) if err != nil { return c.AddError(err) } if updateOne != 1 { return response.Fail(c).Message("更新失败").Send() } return response.Success(c).Message("更新成功").Send() } func deleteMoneyRecord(c *router.Context) error { bodyData, err := c.GetBodyWithRequired("id") if err != nil { return c.AddError(err) } recordId := bodyData.GetInt64("id") deleteOne, err := db.DeleteOne("money_record", "id", recordId) if err != nil { return c.AddError(err) } if deleteOne != 1 { return response.Fail(c).Message("删除失败").Send() } return response.Success(c).Message("删除成功").Send() }