From ab7ce6d0c6a0c8ff39738fbe2847afb4aa856ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Fri, 16 Sep 2022 10:36:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(fee):=E5=9B=AD=E5=8C=BA=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E8=B4=B9=E7=94=A8=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/maintenance_fee.go | 110 ++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/service/maintenance_fee.go b/service/maintenance_fee.go index 80440c0..2fa076d 100644 --- a/service/maintenance_fee.go +++ b/service/maintenance_fee.go @@ -8,7 +8,8 @@ import ( "fmt" "github.com/google/uuid" - "xorm.io/builder" + "github.com/samber/lo" + "github.com/uptrace/bun" ) type _MaintenanceFeeService struct{} @@ -16,28 +17,43 @@ type _MaintenanceFeeService struct{} var MaintenanceFeeService _MaintenanceFeeService func (_MaintenanceFeeService) ListMaintenanceFees(pid []string) ([]model.MaintenanceFee, error) { - cond := builder.NewCond() - if len(pid) > 0 { - cond = cond.And(builder.Eq{"park_id": pid}) - } else { - return make([]model.MaintenanceFee, 0), exceptions.NewIllegalArgumentsError("必须给定所要请求的至少一个园区", "park_id") - } if fees, _ := cache.RetreiveSearch[[]model.MaintenanceFee]("maintenance_fee", pid...); fees != nil { return *fees, nil } - var fees = make([]model.MaintenanceFee, 0) - err := global.DBConn.Where(cond).Desc("created_at").Find(&fees) + + var ( + fees = make([]model.MaintenanceFee, 0) + cond = global.DB.NewSelect().Model(&fees) + ) + if len(pid) > 0 { + cond = cond.Where("park_id in (?)", bun.In(pid)) + } else { + return make([]model.MaintenanceFee, 0), exceptions.NewIllegalArgumentsError("必须给定所要请求的至少一个园区", "park_id") + } + + ctx, cancel := global.TimeoutContext() + defer cancel() + + err := cond.Order("created_at desc").Scan(ctx) if err != nil { return make([]model.MaintenanceFee, 0), err } - cache.CacheSearch(fees, []string{"maintenance_fee", "park"}, "maintenance_fee", pid...) + relations := lo.Map(fees, func(f model.MaintenanceFee, _ int) string { + return fmt.Sprintf("maintenance_fee:%s", f.Id) + }) + relations = append(relations, "maintenance_fee", "park") + + cache.CacheSearch(fees, relations, "maintenance_fee", pid...) return fees, nil } func (_MaintenanceFeeService) CreateMaintenanceFeeRecord(fee model.MaintenanceFee) error { + ctx, cancel := global.TimeoutContext() + defer cancel() + fee.Id = uuid.New().String() fee.Enabled = true - _, err := global.DBConn.Insert(fee) + _, err := global.DB.NewInsert().Model(fee).Exec(ctx) if err != nil { return err } @@ -46,44 +62,58 @@ func (_MaintenanceFeeService) CreateMaintenanceFeeRecord(fee model.MaintenanceFe } func (_MaintenanceFeeService) ModifyMaintenanceFee(fee model.MaintenanceFee) error { - rows, err := global.DBConn.Table(&model.MaintenanceFee{}).NoAutoCondition().ID(fee.Id).Cols("fee", "memo").Update(fee) + ctx, cancel := global.TimeoutContext() + defer cancel() + + res, err := global.DB.NewUpdate().Model(fee). + WherePK(). + Column("fee", "memo"). + Exec(ctx) if err != nil { - if rows == 0 { + if rows, _ := res.RowsAffected(); rows == 0 { return exceptions.NewNotFoundError("未能找到匹配的维护费记录。") } else { return err } } - cache.AbolishRelation("maintenance_fee") - cache.AbolishRelation(fmt.Sprintf("maintenance_fee_%s", fee.Id)) + cache.AbolishRelation(fmt.Sprintf("maintenance_fee:%s", fee.Id)) return nil } func (_MaintenanceFeeService) ChangeMaintenanceFeeState(fid string, state bool) error { - rows, err := global.DBConn.Table(&model.MaintenanceFee{}).ID(fid).Update(map[string]interface{}{"enabled": state}) + ctx, cancel := global.TimeoutContext() + defer cancel() + + res, err := global.DB.NewUpdate().Model((*model.MaintenanceFee)(nil)). + Where("id = ?", fid). + Set("enabled = ?", state). + Exec(ctx) if err != nil { - if rows == 0 { + if rows, err := res.RowsAffected(); rows == 0 { return exceptions.NewNotFoundError("未能找到匹配的维护费记录。") } else { return err } } - cache.AbolishRelation("maintenance_fee") - cache.AbolishRelation(fmt.Sprintf("maintenance_fee_%s", fid)) + cache.AbolishRelation(fmt.Sprintf("maintenance_fee:%s", fid)) return nil } func (_MaintenanceFeeService) DeleteMaintenanceFee(fid string) error { - rows, err := global.DBConn.ID(fid).NoAutoCondition().Delete(new(model.MaintenanceFee)) + ctx, cancel := global.TimeoutContext() + defer cancel() + + res, err := global.DB.NewDelete().Model((*model.MaintenanceFee)(nil)). + Where("id = ?", fid). + Exec(ctx) if err != nil { - if rows == 0 { + if rows, err := res.RowsAffected(); rows == 0 { return exceptions.NewNotFoundError("未能找到匹配的维护费记录。") } else { return err } } - cache.AbolishRelation("maintenance_fee") - cache.AbolishRelation(fmt.Sprintf("maintenance_fee_%s", fid)) + cache.AbolishRelation(fmt.Sprintf("maintenance_fee:%s", fid)) return nil } @@ -91,31 +121,21 @@ func (_MaintenanceFeeService) EnsureFeeBelongs(uid, mid string) (bool, error) { if has, _ := cache.CheckExists("maintenance_fee", mid, uid); has { return true, nil } - var fee = make([]model.MaintenanceFee, 0) - err := global.DBConn. - Table(new(model.MaintenanceFee)). - Where(builder.Eq{"id": mid}). - Limit(1). - Find(&fee) + + ctx, cancel := global.TimeoutContext() + defer cancel() + + exists, err := global.DB.NewSelect().Model((*model.Park)(nil)). + Relation("MaintenanceFees"). + Where("p.user_id = ?", uid). + Where("m.id = ?", mid). + Exists(ctx) if err != nil { return false, err } - if len(fee) == 0 { - return false, exceptions.NewNotFoundError("指定维护费条目未找到。") - } - var park = make([]model.Park, 0) - err = global.DBConn. - Table(new(model.Park)). - Where(builder.Eq{"id": fee[0].ParkId}). - Limit(1).Find(&park) - if err != nil { - return false, err - } - if len(park) == 0 { + if !exists { return false, exceptions.NewNotFoundError("指定维护费所属园区未找到。") } - if park[0].UserId == uid { - cache.CacheExists([]string{"maintenance_fee", "park"}, "maintenance_fee", mid, uid) - } - return park[0].UserId == uid, nil + cache.CacheExists([]string{fmt.Sprintf("maintenance_fee:%s", mid), "maintenance_fee", "park"}, "maintenance_fee", mid, uid) + return exists, nil }