170 lines
4.1 KiB
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: ¤tTime})
|
|
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: ¤tTime})
|
|
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: ¤tTime})
|
|
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
|
|
}
|