Нужна помощь с алгоритмом истечения срока действия кредита - PullRequest
7 голосов
/ 08 июля 2010

Так что я застрял. Я работаю по кредитной системе с истечением срока. Похоже на мили кредитной карты, но не совсем. Кстати, я сожалею о книге в будущем, но мне нужно было добавить достаточно деталей, чтобы помочь получить полную картину.

Что мне нужно, так это система, в которой пользователь накапливает кредиты за выполнение действий. Но они также могут потратить эти кредиты на деятельность. Срок действия кредитов истекает через 30 дней, если они не используются. Кажется, я застрял на том, как точно рассчитать это в пакете, который будет работать каждую ночь. Буду очень признателен за любые идеи на любом языке, так как мне кажется, что я застрял на одной незначительной детали, которую я не могу обойти. Вот пример данных:

7/1: +5 - пользователь регистрируется
7/2: +5 - пользователь взаимодействует с системой
7/2: -3 - активность покупок пользователей
7/3: +5 - пользователь взаимодействует с системой

Таким образом, на данный момент пользователь получил 15 кредитов и потратил 3. Оставив ему всего 12 кредитов. (По крайней мере, я получил базовую математику: P)

Я должен добавить, что в настоящее время мы играем с идеей иметь два поля: последнее обработанное, затем обработанное. Итак, эти значения в это время при условии, что это была новая регистрация:

Дата последней обработки: 7/1
Дата следующего процесса: 8/1

Так что теперь 8/1 приходит. Пакет запускается и просматривает все кредиты, которые старше 30 дней. Который на данный момент равен 5.

Это то место, где оно начинает расплываться.

Затем система должна просмотреть все кредиты, потраченные за последние 30 дней, чтобы выяснить, используют ли они какие-либо кредиты. Потому что они должны только истечь, если они не были использованы. Таким образом, их 3. Итак, я вычитаю пользователю 2 кредита, потому что это разница между кредитами, заработанными старше 30 дней, и затраченными. Поэтому я заканчиваю партию и устанавливаю даты соответственно на следующий день. Теперь, предполагая, что они не потратили больше, я начинаю подсчет кредитов, заработанных старше 30 лет, что составляет 5, и потраченных кредитов, которые снова равны 3. Но я, очевидно, не хочу рассматривать 3 кредита, которые я рассматривал вчера. Что является хорошим подходом, чтобы не включать эти 3 кредита снова для рассмотрения.

Вот где я застрял.

Мы думаем о том, чтобы написать дебетовую запись для просроченных кредитов, чтобы мы могли отслеживать их, но с трудом представляли, как я могу использовать ее в этом расчете.

Если вы прочитали это далеко, спасибо. Если вы даже приложите некоторое усилие в ответе, я, как минимум, проголосую за усилия.

EDIT:
Хорошо, Грег упомянул кое-что, о чем я забыл обратиться. Идея поставить флаг на рассмотренные кредиты. Допустимая точка, но не та, которая может работать из-за следующего сценария:

Допустим, в определенный день пользователь тратит 10 кредитов. Но кредиты с истекшим сроком действия, которые партия рассматривает, только накопились до 5. Ну, у него все еще должно быть еще 5 кредитов, чтобы не истек срок действия, потому что он потратил больше, чем один срок действия. Таким образом, флаг не будет работать, потому что мы пропустили бы эти 5 дополнительных кредитов. Надеюсь, это имеет смысл?

Ответы [ 7 ]

3 голосов
/ 08 июля 2010

Для каждого пользователя системы хранится массив, в котором хранится информация о сумме кредитов, доступных пользователю в течение следующих 30 последовательных дней

Например, данные для некоторого пользователя могут выглядеть следующим образом

8  | 
7  | | 
6  | | | | 
5  | | | | | | | | | | |
4  | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | 
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

Каждый раз, когда пользователь зарабатывает некоторые кредиты, Вы увеличиваете суммы за все дни на количество заработанных кредитов. Например, если пользователь зарабатывает 2 кредита, таблица меняется следующим образом. Это как поднять весь график вверх.

10 | 
9  | | 
8  | | | | 
7  | | | | | | | | | | |
6  | | | | | | | | | | | | | | | | |
5  | | | | | | | | | | | | | | | | | | | | | | | | 
4  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

Если пользователь имеет сегодня x кредитов и тратит y кредитов, вы уменьшаете сумму доступных ему кредитов до x - y, за каждый день, когда у него сумма больше x - y. В течение дней у него не больше, чем х - у, количество остается неизменным. Это как отрезать верхнюю часть графика. Например, если пользователь тратит 3 кредита, график меняется на

7  | | | | | | | | | | |
6  | | | | | | | | | | | | | | | | |
5  | | | | | | | | | | | | | | | | | | | | | | | | 
4  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

Каждый день Вы сдвигаете график влево, чтобы смоделировать истекающие кредиты. У пользователя завтра будут следующие суммы

7  | | | | | | | | | |
6  | | | | | | | | | | | | | | | |
5  | | | | | | | | | | | | | | | | | | | | | | | 
4  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days
3 голосов
/ 08 июля 2010

Я бы не стал пытаться обрабатывать данные так, как вы их представляете. Вместо этого вы должны отслеживать, сколько кредитов у пользователя и когда он истекает. Таким образом, вы отслеживаете, какие кредиты использовались при совершении покупки, вместо того, чтобы пытаться решить все это позже.

Поэтому, когда пользователь регистрируется, он имеет:

5 credits expiring on 8/1

После взаимодействия с системой на следующий день:

5 credits expiring on 8/1
5 credits expiring on 8/2

После покупки чего-либо:

2 credits expiring on 8/1
5 credits expiring on 8/2

и т. Д.

2 голосов
/ 08 июля 2010

Предполагая, что вы запускаете этот пакет ежедневно, вы можете иметь таблицу, которая отслеживает все заработанные кредиты и использованные кредиты (отрицательные кредиты).

В начале следующегомесяц, ваша работа состоит в том, чтобы просто выяснить, какой из кредитов, заработанных в первый день, не был потрачен в течение месяца.

Количество кредитов, заработанных в первый день - кредитов, которые они потратили за весь последний месяц.Если число положительное, у них есть кредиты, срок действия которых истек.Так просто добавьте запись в таблицу с отрицательным кредитом.Это обнулит неиспользованные кредиты.

На следующий день повторите процесс, посмотрев, сколько кредитов они заработали во второй день, минус сумма всех кредитов, которые они заработали в прошлом месяце, принимая во вниманиезапись с отрицательными кредитами, которые вы создали в предыдущий день.

1 голос
/ 08 июля 2010

Используйте дебетовую запись для записи обычных расходов. Когда выполняется ежемесячное пакетное задание, оно может рассчитать общее количество дебетов, которые меньше или равны истекающим кредитам. Если срок действия кредита истекает, просто вставьте соответствующую дебетовую запись (соответствующую == для отмены превышения в вашем приложении). Таким образом, любой «промежуточный» код, который проверяет только кредиты и дебеты, достигнет того же баланса, что и ваш пакетный код.

1 голос
/ 08 июля 2010

Как насчет добавления флага к расходам? Если флаг не установлен, вы можете включить эти расходы в пакет, если это необходимо. Если вы используете расходы, чтобы компенсировать истечение срока действия, тогда вы устанавливаете флаг. В следующий раз вы проигнорируете эти расходы, потому что установлен флаг.

0 голосов
/ 12 июня 2011

Что касается ответа юлианцев (что я пока не могу комментировать), я имею дело с той же проблемой, и подход юлианцев не сработает, потому что это приведет к тому, что аккаунт станет отрицательным.

Если пользователь не использовал сервис в течение одного месяца, 8/4 остаток на счете был бы равен -3, а одно действие на 5 привело бы к балансу 2, а не 5, как должно.

0 голосов
/ 24 декабря 2010

Один из подходов к этой проблеме - хранить только транзакции, а не баланс. Тогда вы всегда рассчитываете баланс в режиме реального времени, когда это необходимо. Вот данные:

Date : Amount : Expiries
7/1 : +5 : 7/31
7/2 : +5 : 8/1
7/2 : -3 : never
7/3 : +5 : 8/2

Баланс в любое время - это просто сумма всех транзакций, которые еще не истекли. Нет необходимости запускать пакетные процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...