Example #1
0
def appointment_payment_success(user, appointment_id):
    appointment = Appointment.get(id=appointment_id, user=user)
    appointment.status = APPOINTMENT_STATUS["1"]
    appointment.appointment_fee = get_custom_const("DEFAULT_APPOINTMENT_FEE")
    # 预付款后更改新的过期日期
    appointment.expired_date_time = \
        datetime.utcnow() + timedelta(
            days=get_custom_const("APPOINTMENT_EXPIRED_DAYS"))
    return appointment.save()
Example #2
0
def get_e_bike_model_one(name):
    """
    # 单独获取一个
    # 当调用这个api时该车型浏览量加一
    :param name:
    :type name:
    :return:
    :rtype:
    """

    try:
        e_bike_model = e_bike_model_service.get_by_name(name)
        result = e_bike_model_service.num_view_increment(name)
        logger.info("increment", result)

        return jsonify({
            'response': {
                "e_bike_model": model_to_dict(e_bike_model),
                "appointment_fee": get_custom_const("DEFAULT_APPOINTMENT_FEE")
            }
        }), 200
    except DoesNotExist as e:
        return jsonify({
            'response': {
                "error": '%s: %s' % (str(DoesNotExist), e.args),
                "message": "无该车型"
            }
        }), 404
Example #3
0
def add(**kwargs):
    """
    add appointment

    eg = {
    "user": "******",
    "e_bike_model": "小龟电动车 爆款 48V、12A",
    "color": 蓝,
    "note": "小龟电动车",
    "category": E_BIKE_MODEL_CATEGORY["0"],
    }

    :param kwargs:
    :type kwargs:
    :return: the added json
    :rtype: json
    """
    # 生成到期时间
    date = datetime.utcnow()
    expired_date_time = date + timedelta(
        days=int(get_custom_const("APPOINTMENT_EXPIRED_DAYS")))

    appointment = Appointment.create(date=date,
                                     expired_date_time=expired_date_time,
                                     **kwargs)
    return appointment
Example #4
0
def total_payment_success(appointment_id, username=None):
    appointment = Appointment.get(id=appointment_id, )
    if username and appointment.user.username != username:
        raise Error("not your appointment")

    # 检查是否租车
    if appointment.type == "租车":  # 租车
        rent_time_period = appointment.rent_time_period
        end_time = \
            datetime.utcnow() + timedelta(
                days=RENT_TIME_PERIOD[rent_time_period] * 365)
        appointment.end_time = end_time
        appointment.rent_deposit = get_custom_const("RENT_DEPOSIT")
        status = RENT_APPOINTMENT_STATUS["2"]
        appointment.status = status
        # 增加销售量
        e_bike_model_service.num_sold_increment(
            name=appointment.e_bike_model.name)
        return appointment.save()

    else:
        status = APPOINTMENT_STATUS["3"]
        appointment.status = status
        e_bike_model_service.num_sold_increment(
            name=appointment.e_bike_model.name)
        return appointment.save()
Example #5
0
def top_up(**kwargs):
    """

    2. top up virtual card
    :param data:
        card_no: card number
        top_up_fee: top up amount
    :return:
    """
    card_no = kwargs["card_no"]
    top_up_fee = float(kwargs["top_up_fee"])

    virtual_card = VirtualCard.get(VirtualCard.card_no == card_no)

    if virtual_card.deposit < get_custom_const("DEFAULT_DEPOSIT"):
        raise Error("No deposit")
    else:
        balance = virtual_card.balance + top_up_fee
        virtual_card.balance = balance
        result = virtual_card.save()
        record = ConsumeRecord.create(
            card=card_no,
            consume_event="top up",
            consume_date_time=datetime.utcnow(),
            consume_fee=top_up_fee,
            balance=balance)
        return result, record
Example #6
0
def pre_top_up(**kwargs):
    """
    1. check
    :param kwargs:
    :type kwargs:
    :return:
    :rtype:
    """
    card_no = kwargs["card_no"]
    virtual_card = VirtualCard.get(VirtualCard.card_no == card_no)
    if virtual_card.deposit < get_custom_const("DEFAULT_DEPOSIT"):
        raise Error("No deposit")
Example #7
0
def check_deposit(username):
    """
    check if the card has enough deposit
    :param username: card holder
    :return: True or raise an error
    """
    virtual_card = VirtualCard.get(VirtualCard.card_no == username)
    if virtual_card:
        deposit = virtual_card.deposit
        if deposit < get_custom_const("DEFAULT_DEPOSIT"):
            raise Error("没有足够的押金")
    else:
        raise Error("未开通虚拟卡")
Example #8
0
def add_appointment(**kwargs):
    user = kwargs["user"]
    e_bike_model = kwargs["e_bike_model"]
    color = kwargs["color"]
    e_bike_type = kwargs["type"]
    coupon = kwargs.get("coupon")
    rent_time_period = kwargs.get("rent_time_period")

    e_bike_model = EBikeModel.get(name=e_bike_model)

    # 检查库存量,虽然库存不足时前端会生不成订单
    if not storage_service.check_storage(model=e_bike_model, color=color):
        raise Error("没有足够的库存")

    # 检查该用户是否存在订单 (买车订单数)
    if not check_user_appointment(user=user, type=e_bike_type):
        raise Error("订单数目过多")

    # 租车订单 检查是否存在押金
    if e_bike_type == "租车":
        # virtual_card_service.check_deposit(username=user)
        virtual_card_service.check_status(username=user)

    if e_bike_type == "租车":
        price = e_bike_model.price[rent_time_period]
    else:
        price = e_bike_model.price

    # 库存-1
    storage_service.decrement_num(e_bike_model, color)

    # 使用优惠劵
    if coupon:
        reduced_price = coupon_service.use_coupon(user, coupon, price)
        price = price - reduced_price
        kwargs["reduced_price"] = reduced_price
    kwargs["price"] = price

    kwargs["appointment_fee_needed"] = \
        custom_constant.get_custom_const("DEFAULT_APPOINTMENT_FEE")

    appointment = add(**kwargs)

    # 获取有效的 serial_number
    serial_number = serial_number_service.get_available_code(appointment)
    # 更改 serial_number
    appointment.serial_number = serial_number
    appointment.save()
    return appointment
Example #9
0
def check_user_appointment(user, type):
    count = Appointment.select().where(
        Appointment.user == user, Appointment.type == type,
        ~(Appointment.status << [
            APPOINTMENT_STATUS["-1"], APPOINTMENT_STATUS["-2"],
            APPOINTMENT_STATUS["3"]
        ])).count()
    if type == "租车":
        if count >= 1:
            return False
        else:
            return True
    if count >= get_custom_const("MAXIMUM_APPOINTMENT"):
        return False
    else:
        return True
Example #10
0
def pre_pay_deposit(**kwargs):
    card_no = kwargs["card_no"]

    deposit_fee = get_custom_const("DEFAULT_DEPOSIT")
    virtual_card = VirtualCard.get(VirtualCard.card_no == card_no)
    deposit = virtual_card.deposit
    if deposit >= deposit_fee:
        # 充值押金失败
        ConsumeRecord.create(
            card=card_no,
            consume_event="deposit failed",
            consume_date_time=datetime.utcnow(),
            consume_fee=deposit_fee,
            balance=virtual_card.balance)

        raise Error("无需充值押金")
    return deposit_fee
Example #11
0
def calculate_price(rent_date, return_date):
    """
    两周内1元
    超过两周,每天扣2元

    超过 1个月 冻结账户以实现在脚本中


    :param rent_date:
    :type rent_date:
    :param return_date:
    :type return_date:
    :return:
    :rtype:
    """
    duration = return_date - rent_date
    days, seconds = duration.days, duration.seconds
    price = get_custom_const("BATTERY_RENT_PRICE")
    if days >= BasicConstant.maximum_normal_rent_price_days:
        price = price + (days - BasicConstant.maximum_normal_rent_price_days) \
                        * BasicConstant.abnormal_rent_price_per_day
    return price
Example #12
0
def check_status(username):
    """
    检查账户状态是否异常

    :param username:
    :type username:
    :return:
    :rtype:
    """
    virtual_card = VirtualCard.get(VirtualCard.card_no == username)
    # 0. 检查是否实名认证
    if virtual_card.real_name_authentication != "已认证":
        raise Error(VirtualCardErrorMessage.abnormal_situation)
    # 1. 检查状态
    if virtual_card.situation != "正常":
        raise Error(VirtualCardErrorMessage.no_real_name_authentication)
    # 2. 检查押金
    if virtual_card.deposit < get_custom_const("DEFAULT_DEPOSIT"):
        raise Error(VirtualCardErrorMessage.no_enough_deposit)
    # 3. 检查余额
    if virtual_card.balance < 0:
        raise Error(VirtualCardErrorMessage.no_enough_balance)