diff --git a/controller/charge.go b/controller/charge.go index 9aee3f6..cb33120 100644 --- a/controller/charge.go +++ b/controller/charge.go @@ -2,7 +2,6 @@ package controller import ( "electricity_bill_calc/model" - "electricity_bill_calc/repository" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" @@ -40,7 +39,7 @@ func listAllCharges(c *gin.Context) { requestKeyword := c.DefaultQuery("keyword", "") requestBeginDate := c.DefaultQuery("begin", "") requestEndDate := c.DefaultQuery("end", "") - charges, total, err := repository.ChargeRepo.ListPagedChargeRecord(requestKeyword, requestBeginDate, requestEndDate, requestPage) + charges, total, err := service.ChargeService.ListPagedChargeRecord(requestKeyword, requestBeginDate, requestEndDate, requestPage) if err != nil { result.NotFound(err.Error()) return diff --git a/repository/charge.go b/repository/charge.go deleted file mode 100644 index e36bd36..0000000 --- a/repository/charge.go +++ /dev/null @@ -1,82 +0,0 @@ -package repository - -import ( - "electricity_bill_calc/config" - "electricity_bill_calc/global" - "electricity_bill_calc/model" - "electricity_bill_calc/utils" - "time" - - "xorm.io/builder" -) - -type _ChargeRepository struct{} - -var ChargeRepo _ChargeRepository - -func (_ChargeRepository) ListPagedChargeRecord(keyword, beginDate, endDate string, page int) ([]model.ChargeWithName, int64, error) { - var cond = builder.NewCond() - if len(keyword) != 0 { - cond = cond.And(builder.Like{"d.name", keyword}.Or(builder.Like{"d.abbr", keyword})) - } - if len(beginDate) != 0 { - beginTime, err := time.ParseInLocation("2006-01-02", beginDate, time.Local) - beginTime = utils.VeryBeginOfDate(beginTime) - if err != nil { - return make([]model.ChargeWithName, 0), 0, err - } - cond = cond.And(builder.Gte{"c.created_at": beginTime}) - } - if len(endDate) != 0 { - endTime, err := time.ParseInLocation("2006-01-02", endDate, time.Local) - endTime = utils.VeryEndOfDate(endTime) - if err != nil { - return make([]model.ChargeWithName, 0), 0, err - } - cond = cond.And(builder.Lte{"c.created_at": endTime}) - } - startItem := (page - 1) * config.ServiceSettings.ItemsPageSize - total, err := global.DBConn. - Alias("d"). - Join("INNER", []string{"user_charge", "c"}, "c.user_id=d.id"). - Where(cond). - NoAutoCondition(). - Count(&model.ChargeWithName{}) - if err != nil { - return nil, -1, err - } - charges := make([]model.ChargeWithName, 0) - err = global.DBConn. - Alias("d"). - Join("INNER", []string{"user_charge", "c"}, "c.user_id=d.id"). - Where(cond). - Limit(config.ServiceSettings.ItemsPageSize, startItem). - NoAutoCondition(). - Find(&charges) - return charges, total, err -} - -func (_ChargeRepository) LastValidChargeTo(uid string) (time.Time, error) { - veryBlankTime, _ := time.Parse("2006-01-02 15:04:05", "0001-01-01 00:00:00") - var records []string - err := global.DBConn. - Table(&model.UserCharge{}). - Where(builder.Eq{"settled": true, "cancelled": false, "refunded": false, "user_id": uid}). - Cols("charge_to"). - Find(&records) - if err != nil { - return veryBlankTime, nil - } - mappedRecords := utils.Map(records, func(elem string) time.Time { - t, _ := time.Parse(time.RFC3339, elem) - return utils.VeryBeginOfDate(t) - }) - lastValid := utils.Reduce(mappedRecords, veryBlankTime, func(acc, elem time.Time) time.Time { - if elem.After(acc) { - return elem - } else { - return acc - } - }) - return lastValid, nil -} diff --git a/service/abstract.go b/service/abstract.go new file mode 100644 index 0000000..59ab737 --- /dev/null +++ b/service/abstract.go @@ -0,0 +1,23 @@ +package service + +func _postProcessSingle[T interface{}](instance *T, has bool, err error) (*T, error) { + if err != nil { + return nil, err + } + if has { + return instance, nil + } else { + return nil, nil + } +} + +func _postProcessList[T interface{}](instance []*T, has bool, err error) ([]*T, error) { + if err != nil { + return nil, err + } + if has { + return instance, nil + } else { + return nil, nil + } +} diff --git a/service/charge.go b/service/charge.go index c1e3164..809d67a 100644 --- a/service/charge.go +++ b/service/charge.go @@ -1,10 +1,11 @@ package service import ( + "electricity_bill_calc/config" "electricity_bill_calc/exceptions" "electricity_bill_calc/global" "electricity_bill_calc/model" - "electricity_bill_calc/repository" + "electricity_bill_calc/utils" "time" "xorm.io/builder" @@ -101,7 +102,7 @@ func (c _ChargeService) RefundCharge(seq int64, uid string) error { tx.Rollback() return exceptions.NewNotFoundError("未找到匹配指定条件的计费记录。") } - lastValidExpriation, err := repository.ChargeRepo.LastValidChargeTo(uid) + lastValidExpriation, err := c.lastValidChargeTo(uid) if err != nil { tx.Rollback() return exceptions.NewNotFoundError("未找到最后合法的计费时间。") @@ -144,7 +145,7 @@ func (c _ChargeService) CancelCharge(seq int64, uid string) error { if err := tx.Begin(); err != nil { return err } - lastValidExpriation, err := repository.ChargeRepo.LastValidChargeTo(uid) + lastValidExpriation, err := c.lastValidChargeTo(uid) if err != nil { return exceptions.NewNotFoundError("未找到最后合法的计费时间。") } @@ -167,3 +168,70 @@ func (_ChargeService) updateUserExpiration(tx *xorm.Session, uid string, expirat } return err } + +func (_ChargeService) ListPagedChargeRecord(keyword, beginDate, endDate string, page int) ([]model.ChargeWithName, int64, error) { + var cond = builder.NewCond() + if len(keyword) != 0 { + cond = cond.And(builder.Like{"d.name", keyword}.Or(builder.Like{"d.abbr", keyword})) + } + if len(beginDate) != 0 { + beginTime, err := time.ParseInLocation("2006-01-02", beginDate, time.Local) + beginTime = utils.VeryBeginOfDate(beginTime) + if err != nil { + return make([]model.ChargeWithName, 0), 0, err + } + cond = cond.And(builder.Gte{"c.created_at": beginTime}) + } + if len(endDate) != 0 { + endTime, err := time.ParseInLocation("2006-01-02", endDate, time.Local) + endTime = utils.VeryEndOfDate(endTime) + if err != nil { + return make([]model.ChargeWithName, 0), 0, err + } + cond = cond.And(builder.Lte{"c.created_at": endTime}) + } + startItem := (page - 1) * config.ServiceSettings.ItemsPageSize + total, err := global.DBConn. + Alias("d"). + Join("INNER", []string{"user_charge", "c"}, "c.user_id=d.id"). + Where(cond). + NoAutoCondition(). + Count(&model.ChargeWithName{}) + if err != nil { + return nil, -1, err + } + charges := make([]model.ChargeWithName, 0) + err = global.DBConn. + Alias("d"). + Join("INNER", []string{"user_charge", "c"}, "c.user_id=d.id"). + Where(cond). + Limit(config.ServiceSettings.ItemsPageSize, startItem). + NoAutoCondition(). + Find(&charges) + return charges, total, err +} + +func (_ChargeService) lastValidChargeTo(uid string) (time.Time, error) { + veryBlankTime, _ := time.Parse("2006-01-02 15:04:05", "0001-01-01 00:00:00") + var records []string + err := global.DBConn. + Table(&model.UserCharge{}). + Where(builder.Eq{"settled": true, "cancelled": false, "refunded": false, "user_id": uid}). + Cols("charge_to"). + Find(&records) + if err != nil { + return veryBlankTime, nil + } + mappedRecords := utils.Map(records, func(elem string) time.Time { + t, _ := time.Parse(time.RFC3339, elem) + return utils.VeryBeginOfDate(t) + }) + lastValid := utils.Reduce(mappedRecords, veryBlankTime, func(acc, elem time.Time) time.Time { + if elem.After(acc) { + return elem + } else { + return acc + } + }) + return lastValid, nil +}