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()
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
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
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()
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
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")
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("未开通虚拟卡")
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
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
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
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
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)