This commit is contained in:
oneao committed 2026-03-04 17:30:05 +08:00
1 parent 46106d0c76
commit 34240d2e16
36 files changed
+2853 -165

No files matched your search

@@ -0,0 +1,200 @@
package finance
import (
"allapp/api/router/middleware"
"allapp/api/types"
"allapp/db"
"allapp/db/repo"
"allapp/utils/errorx"
"allapp/utils/requestx"
"allapp/utils/responsex"
"allapp/utils/uniqueid"
"github.com/gofiber/fiber/v3"
)
// ListFinanceCategories 查看记账分类
func ListFinanceCategories(c fiber.Ctx) error {
spaceId, err := middleware.GetSpaceID(c)
if err != nil {
return err
}
categories, err := db.Queries.ListFinanceCategories(c.Context(), spaceId)
if err != nil {
return err
}
financeCategories := make([]types.FinanceCategory, 0, len(categories))
for _, category := range categories {
financeCategories = append(financeCategories, types.FinanceCategory{
Id: category.ID,
Name: category.Name,
Icon: category.Icon,
Type: category.Type,
SortNumber: category.SortNumber,
})
}
vo := new(types.ListFinanceCategoriesVO)
vo.Categories = financeCategories
return responsex.OK(c, vo)
}
// CreateFinanceCategory 新建分类
func CreateFinanceCategory(c fiber.Ctx) error {
dto := new(types.CreateFinanceCategoryDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
spaceID, err2 := middleware.GetSpaceID(c)
if err2 != nil {
return err2
}
_, err = db.Queries.GetFinanceCategoryByName(c.Context(), repo.GetFinanceCategoryByNameParams{
SpaceID: spaceID,
Name: dto.Name,
Type: dto.Type,
})
isFound := true
if err != nil {
if errorx.IsNotFound(err) {
isFound = false
} else {
return err
}
}
if isFound {
return responsex.Error(c, "分类名称不能重复")
}
nextId := uniqueid.NextId()
err = db.Queries.InsertFinanceCategory(c.Context(), repo.InsertFinanceCategoryParams{
ID: nextId,
SpaceID: spaceID,
Name: dto.Name,
Icon: dto.Icon,
Type: dto.Type,
SortNumber: dto.SortNumber,
CreateBy: userId,
UpdateBy: userId,
})
if err != nil {
return err
}
vo := new(types.CreateFinanceCategoryVO)
vo.Id = nextId
return responsex.OK(c, vo)
}
// UpdateFinanceCategorySortNumber 更新记账分类顺序
func UpdateFinanceCategorySortNumber(c fiber.Ctx) error {
dto := new(types.UpdateFinanceCategorySortDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
// 组装批量更新参数
params := make([]repo.BatchUpdateFinanceCategorySortNumberParams, 0, len(dto.Categories))
for _, datum := range dto.Categories {
params = append(params, repo.BatchUpdateFinanceCategorySortNumberParams{
ID: datum.Id,
SortNumber: datum.SortNumber,
UpdateBy: userId,
})
}
// 使用统一事务封装
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
batch := q.BatchUpdateFinanceCategorySortNumber(c.Context(), params)
if err := db.RunBatch(c.Context(), batch); err != nil {
return err
}
return nil
})
if err != nil {
return err
}
return responsex.OK(c, nil)
}
// DeleteFinanceCategory 删除记账分类
func DeleteFinanceCategory(c fiber.Ctx) error {
dto := new(types.DeleteFinanceCategoryDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
err := db.WithTx(c.Context(), func(q *repo.Queries) error {
err := q.DeleteFinanceCategory(c.Context(), dto.Id)
if err != nil {
return err
}
err = q.DeleteFinanceRecordByCategoryId(c.Context(), dto.Id)
if err != nil {
return err
}
return nil
})
if err != nil {
return err
}
return responsex.OK(c, nil)
}
// UpdateFinanceCategory 更新记账分类
func UpdateFinanceCategory(c fiber.Ctx) error {
dto := new(types.UpdateFinanceCategoryDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.Queries.UpdateFinanceCategory(c.Context(), repo.UpdateFinanceCategoryParams{
ID: dto.Id,
Name: dto.Name,
Icon: dto.Icon,
UpdateBy: userId,
})
if err != nil {
return err
}
return responsex.OK(c, nil)
}
@@ -0,0 +1,163 @@
package finance
import (
"allapp/api/router/middleware"
"allapp/api/types"
"allapp/db"
"allapp/db/repo"
"allapp/utils/pgtypex"
"allapp/utils/requestx"
"allapp/utils/responsex"
"allapp/utils/timex"
"allapp/utils/uniqueid"
"time"
"github.com/gofiber/fiber/v3"
)
// ListFinanceRecords 记账记录
func ListFinanceRecords(c fiber.Ctx) error {
dto := new(types.ListFinanceRecordsDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
spaceID, err := middleware.GetSpaceID(c)
if err != nil {
return err
}
// 解析年月(yyyy-MM)
startTime, err := timex.ParseTimeFlexible(dto.StartTime)
if err != nil {
return err
}
endTime, err := timex.ParseTimeFlexible(dto.EndTime)
if err != nil {
return err
}
// 开始时间兜底
if startTime == nil {
t := time.Unix(0, 0)
startTime = &t
}
// 结束时间兜底
if endTime == nil {
t := time.Now().AddDate(10, 0, 0)
endTime = &t
}
categoryId := dto.CategoryId
records, err := db.Queries.ListFinanceRecords(c.Context(), repo.ListFinanceRecordsParams{
SpaceID: spaceID,
RecordTime: pgtypex.TimePtrToPgDate(startTime),
RecordTime_2: pgtypex.TimePtrToPgDate(endTime),
Column4: categoryId,
})
if err != nil {
return err
}
financeRecords := make([]types.FinanceRecord, 0, len(records))
for _, record := range records {
financeRecords = append(financeRecords, types.FinanceRecord{
Id: record.ID,
CategoryId: record.CategoryID,
Amount: pgtypex.NumericToString(record.Amount),
Remark: pgtypex.TextToString(record.Remark),
RecordTime: pgtypex.DateToString(record.RecordTime),
MemberId: record.UpdateBy,
MemberName: pgtypex.TextToString(record.MemberName),
})
}
vo := new(types.ListFinanceRecordsVO)
vo.Records = financeRecords
return responsex.OK(c, vo)
}
// CreateFinanceRecord 新增记账记录
func CreateFinanceRecord(c fiber.Ctx) error {
dto := new(types.CreateFinanceRecordDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
spaceID, err := middleware.GetSpaceID(c)
if err != nil {
return err
}
userID, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.Queries.InsertFinanceRecord(c.Context(), repo.InsertFinanceRecordParams{
ID: uniqueid.NextId(),
SpaceID: spaceID,
CategoryID: dto.CategoryId,
Amount: pgtypex.StringToNumeric(dto.Amount),
RecordTime: pgtypex.StringToDate(dto.RecordTime),
Remark: pgtypex.StringToText(dto.Remark),
CreateBy: userID,
UpdateBy: userID,
})
if err != nil {
return err
}
return responsex.OK(c, nil)
}
// UpdateFinanceRecord 更新记账记录
func UpdateFinanceRecord(c fiber.Ctx) error {
dto := new(types.UpdateFinanceRecordDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userID, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.Queries.UpdateFinanceRecord(c.Context(), repo.UpdateFinanceRecordParams{
ID: uniqueid.NextId(),
CategoryID: dto.CategoryId,
Amount: pgtypex.StringToNumeric(dto.Amount),
Remark: pgtypex.StringToText(dto.Remark),
RecordTime: pgtypex.StringToDate(dto.RecordTime),
UpdateBy: userID,
})
if err != nil {
return err
}
return responsex.OK(c, nil)
}
// DeleteFinanceRecord 删除记账记录
func DeleteFinanceRecord(c fiber.Ctx) error {
dto := new(types.DeleteFinanceRecordDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
err := db.Queries.DeleteFinanceRecord(c.Context(), dto.Id)
if err != nil {
return err
}
return responsex.OK(c, nil)
}
@@ -0,0 +1,127 @@
package space
import (
"allapp/api/router/middleware"
"allapp/api/types"
"allapp/db"
"allapp/db/repo"
"allapp/utils/requestx"
"allapp/utils/responsex"
"github.com/gofiber/fiber/v3"
)
// UpdateSpaceDefault 更新空间默认情况
func UpdateSpaceDefault(c fiber.Ctx) error {
dto := new(types.UpdateSpaceIsDefaultDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
err = q.UpdateSpaceIsDefault(c.Context(), repo.UpdateSpaceIsDefaultParams{
SpaceID: dto.SpaceId,
UserID: userId,
IsDefault: dto.IsDefault,
})
if err != nil {
return err
}
var otherDefault int16
if dto.IsDefault == 1 {
otherDefault = 0
}
err = q.UpdateOtherSpacesIsDefault(c.Context(), repo.UpdateOtherSpacesIsDefaultParams{
IsDefault: otherDefault,
UserID: userId,
SpaceID: dto.SpaceId,
})
if err != nil {
return err
}
return nil
})
if err != nil {
return err
}
return responsex.OK(c, "更新成功")
}
// UpdateMemberName 更新群成员名称
func UpdateMemberName(c fiber.Ctx) error {
dto := new(types.UpdateMemberNameDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.Queries.UpdateSpaceMemberName(c.Context(), repo.UpdateSpaceMemberNameParams{
SpaceID: dto.SpaceId,
UserID: userId,
MemberName: dto.MemberName,
})
if err != nil {
return err
}
return responsex.OK(c, "更新成功")
}
// UpdateSpaceSortNumber 更新空间排序
func UpdateSpaceSortNumber(c fiber.Ctx) error {
dto := new(types.UpdateSpaceSortNumberDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
// 组装批量更新参数
params := make([]repo.BatchUpdateSpaceSortNumberParams, 0, len(dto.Spaces))
for _, datum := range dto.Spaces {
params = append(params, repo.BatchUpdateSpaceSortNumberParams{
SortNumber: datum.SortNumber,
SpaceID: datum.SpaceId,
UserID: userId,
})
}
// 使用统一事务封装
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
batch := q.BatchUpdateSpaceSortNumber(c.Context(), params)
if err := db.RunBatch(c.Context(), batch); err != nil {
return err
}
return nil
})
if err != nil {
return err
}
return responsex.OK(c, "更新成功")
}
@@ -228,80 +228,6 @@ func ExitSpace(c fiber.Ctx) error {
return responsex.OK(c, "空间已成功退出")
}
// UpdateMemberName 更新群成员名称
func UpdateMemberName(c fiber.Ctx) error {
dto := new(types.UpdateMemberNameDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.Queries.UpdateSpaceMemberName(c.Context(), repo.UpdateSpaceMemberNameParams{
SpaceID: dto.SpaceId,
UserID: userId,
MemberName: dto.MemberName,
})
if err != nil {
return err
}
return responsex.OK(c, "更新成功")
}
// UpdateSpaceDefault 更新空间默认情况
func UpdateSpaceDefault(c fiber.Ctx) error {
dto := new(types.UpdateSpaceIsDefaultDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
err = q.UpdateSpaceIsDefault(c.Context(), repo.UpdateSpaceIsDefaultParams{
SpaceID: dto.SpaceId,
UserID: userId,
IsDefault: dto.IsDefault,
})
if err != nil {
return err
}
var otherDefault int16
if dto.IsDefault == 1 {
otherDefault = 0
}
err = q.UpdateOtherSpacesIsDefault(c.Context(), repo.UpdateOtherSpacesIsDefaultParams{
IsDefault: otherDefault,
UserID: userId,
SpaceID: dto.SpaceId,
})
if err != nil {
return err
}
return nil
})
if err != nil {
return err
}
return responsex.OK(c, "更新成功")
}
// UpdateSpaceName 更新空间名称
func UpdateSpaceName(c fiber.Ctx) error {
dto := new(types.UpdateSpaceNameDTO)
@@ -381,47 +307,6 @@ func GetSpaceSettings(c fiber.Ctx) error {
return responsex.OK(c, vo)
}
// UpdateSpaceSortNumber 更新空间排序
func UpdateSpaceSortNumber(c fiber.Ctx) error {
dto := new(types.UpdateSpaceSortNumberDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
// 组装批量更新参数
params := make([]repo.BatchUpdateSpaceSortNumberParams, 0, len(dto.Spaces))
for _, datum := range dto.Spaces {
params = append(params, repo.BatchUpdateSpaceSortNumberParams{
SortNumber: datum.SortNumber,
SpaceID: datum.SpaceId,
UserID: userId,
})
}
// 使用统一事务封装
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
batch := q.BatchUpdateSpaceSortNumber(c.Context(), params)
if err := db.RunBatch(c.Context(), batch); err != nil {
return err
}
return nil
})
if err != nil {
return err
}
return responsex.OK(c, "更新成功")
}
func ListSpaceMembers(c fiber.Ctx) error {
dto := new(types.ListSpaceMembersDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {