Нуждаюсь в помощи с алгоритмом истечения кредита

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

То, в чем я нуждаюсь, является системой, где пользователь накапливает кредиты на то, чтобы сделать операции. Но они могут также потратить эти кредиты на операции. Кредиты должны истечь после 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 кредитов снова на соображение.

Это - то, где я застреваю.

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

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

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

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

7
задан spinon 22 September 2011 в 15:48
поделиться

5 ответов

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

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

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

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

2
ответ дан 7 December 2019 в 01:15
поделиться

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

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

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

И так далее.

3
ответ дан 7 December 2019 в 01:15
поделиться

Для каждого пользователя системы храните массив, в котором хранится информация о сумме кредитов, доступных пользователю в течение следующих 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. В течение нескольких дней у него остается не более 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
ответ дан 7 December 2019 в 01:15
поделиться

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

1
ответ дан 7 December 2019 в 01:15
поделиться

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

1
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: