forked from free-lancers/electricity_bill_calc_service
feat(charge):基本完成所有用户服务延期记录部分的功能,待测。
This commit is contained in:
@@ -1,5 +1,147 @@
|
||||
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 {
|
||||
tx := global.DBConn.NewSession()
|
||||
defer tx.Close()
|
||||
if err := tx.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
_, 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("未找到匹配指定条件的计费记录。")
|
||||
}
|
||||
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 (_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
|
||||
}
|
||||
|
Reference in New Issue
Block a user