fix the bug that there are duplicate transaction in transaction list response when filtering multiple accounts

This commit is contained in:
MaysWind
2024-07-04 00:55:41 +08:00
parent 7a5d7337cd
commit 7e1338e081
+41 -21
View File
@@ -1347,6 +1347,18 @@ func (s *TransactionService) getTransactionQueryCondition(uid int64, maxTransact
conditionParams = append(conditionParams, minTransactionTime) conditionParams = append(conditionParams, minTransactionTime)
} }
var accountIdsCondition strings.Builder
accountIdConditionParams := make([]any, 0, len(accountIds))
for i := 0; i < len(accountIds); i++ {
if i > 0 {
accountIdsCondition.WriteString(",")
}
accountIdsCondition.WriteString("?")
accountIdConditionParams = append(accountIdConditionParams, accountIds[i])
}
if models.TRANSACTION_DB_TYPE_MODIFY_BALANCE <= transactionType && transactionType <= models.TRANSACTION_DB_TYPE_EXPENSE { if models.TRANSACTION_DB_TYPE_MODIFY_BALANCE <= transactionType && transactionType <= models.TRANSACTION_DB_TYPE_EXPENSE {
condition = condition + " AND type=?" condition = condition + " AND type=?"
conditionParams = append(conditionParams, transactionType) conditionParams = append(conditionParams, transactionType)
@@ -1354,18 +1366,35 @@ func (s *TransactionService) getTransactionQueryCondition(uid int64, maxTransact
if len(accountIds) == 0 { if len(accountIds) == 0 {
condition = condition + " AND type=?" condition = condition + " AND type=?"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT) conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
} else { } else if len(accountIds) == 1 {
condition = condition + " AND (type=? OR type=?)" condition = condition + " AND (type=? OR type=?)"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT) conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN) conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN)
} else { // len(accountsIds) > 1
condition = condition + " AND (type=? OR (type=? AND related_account_id NOT IN (" + accountIdsCondition.String() + ")))"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN)
conditionParams = append(conditionParams, accountIdConditionParams...)
} }
} else { } else {
if noDuplicated && len(accountIds) == 0 { if noDuplicated {
condition = condition + " AND (type=? OR type=? OR type=? OR type=?)" if len(accountIds) == 0 {
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE) condition = condition + " AND (type=? OR type=? OR type=? OR type=?)"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_INCOME) conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_EXPENSE) conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_INCOME)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT) conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_EXPENSE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
} else if len(accountIds) == 1 {
// Do Nothing
} else { // len(accountsIds) > 1
condition = condition + " AND (type=? OR type=? OR type=? OR type=? OR (type=? AND related_account_id NOT IN (" + accountIdsCondition.String() + ")))"
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_MODIFY_BALANCE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_INCOME)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_EXPENSE)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_OUT)
conditionParams = append(conditionParams, models.TRANSACTION_DB_TYPE_TRANSFER_IN)
conditionParams = append(conditionParams, accountIdConditionParams...)
}
} }
} }
@@ -1389,22 +1418,13 @@ func (s *TransactionService) getTransactionQueryCondition(uid int64, maxTransact
} }
if len(accountIds) > 0 { if len(accountIds) > 0 {
var conditions strings.Builder if accountIdsCondition.Len() > 1 {
condition = condition + " AND account_id IN (" + accountIdsCondition.String() + ")"
for i := 0; i < len(accountIds); i++ {
if i > 0 {
conditions.WriteString(",")
}
conditions.WriteString("?")
conditionParams = append(conditionParams, accountIds[i])
}
if conditions.Len() > 1 {
condition = condition + " AND account_id IN (" + conditions.String() + ")"
} else { } else {
condition = condition + " AND account_id = " + conditions.String() condition = condition + " AND account_id = " + accountIdsCondition.String()
} }
conditionParams = append(conditionParams, accountIdConditionParams...)
} }
if amountFilter != "" { if amountFilter != "" {