package services import ( "fmt" "time" "xorm.io/xorm" "github.com/mayswind/lab/pkg/datastore" "github.com/mayswind/lab/pkg/errs" "github.com/mayswind/lab/pkg/models" "github.com/mayswind/lab/pkg/utils" "github.com/mayswind/lab/pkg/uuid" ) type TransactionService struct { ServiceUsingDB ServiceUsingUuid } var ( Transactions = &TransactionService{ ServiceUsingDB: ServiceUsingDB{ container: datastore.Container, }, ServiceUsingUuid: ServiceUsingUuid{ container: uuid.Container, }, } ) func (s *TransactionService) GetTransactionsByMaxTime(uid int64, maxTime int64, count int) ([]*models.Transaction, error) { if uid <= 0 { return nil, errs.ErrUserIdInvalid } if count < 1 { return nil, errs.ErrPageCountInvalid } var transactions []*models.Transaction err := s.UserDataDB(uid).Where("uid=? AND deleted=? AND transaction_time<=?", uid, false, maxTime).Limit(count, 0).OrderBy("transaction_time desc").Find(&transactions) return transactions, err } func (s *TransactionService) GetTransactionsInMonthByPage(uid int64, year int, month int, page int, count int) ([]*models.Transaction, error) { if uid <= 0 { return nil, errs.ErrUserIdInvalid } if page < 1 { return nil, errs.ErrPageIndexInvalid } if count < 1 { return nil, errs.ErrPageCountInvalid } startTime, err := utils.ParseFromLongDateTime(fmt.Sprintf("%d-%d-01 00:00:00", year, month)) if err != nil { return nil, errs.ErrSystemError } endTime := startTime.AddDate(0, 1, 0) startUnixTime := startTime.Unix() endUnixTime := endTime.Unix() var transactions []*models.Transaction err = s.UserDataDB(uid).Where("uid=? AND deleted=? AND transaction_time>=? AND transaction_time=? AND transaction_time=? AND transaction_time 0 { return errs.ErrBalanceModificationTransactionCannotSetCategory } } else { category := &models.TransactionCategory{} has, err = sess.ID(transaction.CategoryId).Where("uid=? AND deleted=?", transaction.Uid, false).Get(category) if err != nil { return err } else if !has { return errs.ErrTransactionCategoryNotFound } if category.ParentCategoryId < 1 { return errs.ErrCannotUsePrimaryCategoryForTransaction } if (oldTransaction.Type == models.TRANSACTION_TYPE_INCOME && category.Type != models.CATEGORY_TYPE_INCOME) || (oldTransaction.Type == models.TRANSACTION_TYPE_EXPENSE && category.Type != models.CATEGORY_TYPE_EXPENSE) || (oldTransaction.Type == models.TRANSACTION_TYPE_TRANSFER && category.Type != models.CATEGORY_TYPE_TRANSFER) { return errs.ErrTransactionCategoryTypeInvalid } } updateCols = append(updateCols, "category_id") } if transaction.TransactionTime / 1000 != oldTransaction.TransactionTime / 1000 { sameSecondLatestTransaction := &models.Transaction{} currentSecondUnixtime := (transaction.TransactionTime / 1000) * 1000 nextSecondUnixtime := currentSecondUnixtime + 1000 has, err = sess.Where("uid=? AND deleted=? AND transaction_time>=? AND transaction_time