electricity_bill_calc_service/service/charge.go

170 lines
4.1 KiB
Go

package service
import (
"electricity_bill_calc/exceptions"
"electricity_bill_calc/global"
"electricity_bill_calc/model"
"electricity_bill_calc/repository"
"time"
"xorm.io/builder"
"xorm.io/xorm"
)
type _ChargeService struct{}
var ChargeService _ChargeService
func (c _ChargeService) CreateChargeRecord(charge *model.UserCharge, extendWithIgnoreSettle bool) error {
// var seqs = make([]int64, 0)
// err := global.DBConn.Table(&model.UserCharge{}).Cols("seq").Find(&seqs)
// if err != nil {
// return err
// }
// maxSeq := utils.Reduce(seqs, 0, func(acc, elem int64) int64 {
// if elem > acc {
// return elem
// } else {
// return acc
// }
// })
tx := global.DBConn.NewSession()
defer tx.Close()
if err := tx.Begin(); err != nil {
return err
}
charge.Seq = 0
_, err := tx.Insert(charge)
if err != nil {
tx.Rollback()
return err
}
if extendWithIgnoreSettle {
err := c.updateUserExpiration(tx, charge.UserId, charge.ChargeTo)
if err != nil {
return err
}
}
err = tx.Commit()
if err != nil {
tx.Rollback()
return err
}
return nil
}
func (c _ChargeService) SettleCharge(seq int64, uid string) error {
var record *model.UserCharge
has, err := global.DBConn.Where(builder.Eq{"seq": seq, "user_id": uid}).NoAutoCondition().Get(record)
if err != nil {
return nil
}
if !has {
return exceptions.NewNotFoundError("未找到匹配指定条件的计费记录。")
}
tx := global.DBConn.NewSession()
defer tx.Close()
if err := tx.Begin(); err != nil {
return err
}
currentTime := time.Now()
_, err = tx.Table(new(model.UserCharge)).Where(builder.Eq{"seq": seq, "user_id": uid}).Cols("settled", "settled_at").Update(&model.UserCharge{Settled: true, SettledAt: &currentTime})
if err != nil {
tx.Rollback()
return err
}
err = c.updateUserExpiration(tx, uid, record.ChargeTo)
if err != nil {
return err
}
err = tx.Commit()
if err != nil {
tx.Rollback()
return err
}
return nil
}
func (c _ChargeService) RefundCharge(seq int64, uid string) error {
tx := global.DBConn.NewSession()
defer tx.Close()
if err := tx.Begin(); err != nil {
return err
}
currentTime := time.Now()
rows, err := tx.Table(new(model.UserCharge)).Where(builder.Eq{"seq": seq, "user_id": uid}).Cols("refunded", "refunded_at").Update(&model.UserCharge{Refunded: true, RefundedAt: &currentTime})
if err != nil {
tx.Rollback()
return err
}
if rows == 0 {
tx.Rollback()
return exceptions.NewNotFoundError("未找到匹配指定条件的计费记录。")
}
lastValidExpriation, err := repository.ChargeRepo.LastValidChargeTo(uid)
if err != nil {
tx.Rollback()
return exceptions.NewNotFoundError("未找到最后合法的计费时间。")
}
err = c.updateUserExpiration(tx, uid, lastValidExpriation)
if err != nil {
return err
}
err = tx.Commit()
if err != nil {
tx.Rollback()
return err
}
return nil
}
func (c _ChargeService) CancelCharge(seq int64, uid string) error {
tx := global.DBConn.NewSession()
defer tx.Close()
if err := tx.Begin(); err != nil {
return err
}
currentTime := time.Now()
rows, err := tx.Table(new(model.UserCharge)).Where(builder.Eq{"seq": seq, "user_id": uid}).Cols("cancelled", "cancelled_at").Update(&model.UserCharge{Cancelled: true, CancelledAt: &currentTime})
if err != nil {
tx.Rollback()
return err
}
if rows == 0 {
tx.Rollback()
return exceptions.NewNotFoundError("未找到匹配指定条件的计费记录。")
}
err = tx.Commit()
if err != nil {
tx.Rollback()
return err
}
tx = global.DBConn.NewSession()
defer tx.Close()
if err := tx.Begin(); err != nil {
return err
}
lastValidExpriation, err := repository.ChargeRepo.LastValidChargeTo(uid)
if err != nil {
return exceptions.NewNotFoundError("未找到最后合法的计费时间。")
}
err = c.updateUserExpiration(tx, uid, lastValidExpriation)
if err != nil {
return err
}
err = tx.Commit()
if err != nil {
tx.Rollback()
return err
}
return nil
}
func (_ChargeService) updateUserExpiration(tx *xorm.Session, uid string, expiration time.Time) error {
_, err := tx.ID(uid).Cols("service_expiration").Update(&model.UserDetail{ServiceExpiration: expiration})
if err != nil {
tx.Rollback()
}
return err
}