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 }