根据给定的折扣策略和续订月份获取折扣列表

2024-10-06 10:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个产品名toy

出售时有一系列折扣

客户购买toy一个期限,当达到expire_time时,他会续约

所以toy实例有pay_timeexpire_time字段:

class Toy(models.Model):
    pay_time = DateTimeField()
    expire_time = DateTimeField()

当客户有toy实例时,pay_time2018.01.01expire_time2018.05.01。现在,当时间到达2018.05.01时,客户将更新产品

续订策略折扣列表如下:

renew_discounts_list: [
    { 
      discount: 0.20,
      min_mon: 1,
      max_mon:3
    },
    { 
      discount: 0.15,
      min_mon: 4,
      max_mon:6
    },
    ....
]

如果客户想续费17个月,计算起来非常复杂

我想查看折扣结果,这是我需要的输出:

[
    {
        'months': 1,
        'disconts': 0.15  #(4~6: 0.15)
    },
    {
        'months': 3,
        'disconts': 0.10  #(7~9: 0.10)
    }, 
    .... 

]

结果总months17

我试着用judge来解决这个问题,但它不是一个好的解决方案


Tags: 实例客户timediscountminpaymaxtoy
1条回答
网友
1楼 · 发布于 2024-10-06 10:34:15

您可以使用递归进行计算:

我假设dict的toy实例:

toy = {
    'pay_time': 1,  # there I use the count replace of the datetime, you can change by yourself.
    'expire_time': 4
}

我列出了discounts策略列表:

discounts = [

    {
        'min_month': 1,
        'max_month': 3,
        'discounts': 0.30
    },
    {
        'min_month': 4,
        'max_month': 6,
        'discounts': 0.25
    },
    {
        'min_month': 7,
        'max_month': 9,
        'discounts': 0.10
    },
    {
        'min_month': 10,
        'max_month': 13,
        'discounts': 0.08
    }

]

使用递归方法:

def get_discount_recursion(discounts_list, months):

    expire_months = toy.get('expire_time') - toy.get('pay_time')  

    total_months = months + expire_months

    left_months = 0

    if get_max_month() < total_months:
        disc_months = total_months - get_max_month() + 1
        disc = {
            'months': disc_months,
            'discounts': 0
        }
        left_months = months - disc_months
        discounts_list.append(disc)

    else:
        for item in discounts:
            print('item,' , item, total_months, months)
            if (item.get('min_month') <= total_months and item.get('max_month') >= total_months):

                if item.get('min_month') <= expire_months and item.get('max_month') > expire_months:
                    disc_months = total_months - expire_months + 1
                else:
                    disc_months = total_months - item.get('min_month') + 1

                left_months = months - disc_months

                disc = {
                    'months': disc_months,
                    'discounts': item.get('discounts')
                }
                discounts_list.append(disc)

    if left_months <= 0: return discounts_list
    else: return get_discount_recursion(discounts_list, left_months)


def get_max_month():

    max = 0

    for item in discounts:
        max = item.get('max_month') if item.get('max_month') > max else max

    return max

我已经测试过了:

res = get_discount_recursion([], 13)
print(res)

输出:

[{'months': 4, 'discounts': 0}, {'months': 3, 'discounts': 0.08}, {'months': 3, 'discounts': 0.1}, {'months': 3, 'discounts': 0.25}]

相关问题 更多 >