def get(self): currency = Currency.get_currency() if currency is None: abort(400, code=1001, message={'currency': 'currency does not exist'}) return currency
def query_payment_amount(order): if order.match_order is None: option = Setting.get_json('general_option') dollar2rmb = decimal.Decimal(option['dollar2rmb']) dollar = Currency.get_price() * order.amount price = dollar * dollar2rmb else: price = order.match_order.payment_amount return '{}'.format(price)
def update_recommend_reward(self): option = Setting.get_json('general_option') recommend_reward_amount = [ decimal.Decimal(x) for x in option['recommend_reward_amount'] ] evaluation_reward_amount = decimal.Decimal( option['evaluation_reward_amount']) # 先赠送本用户 usd_price = Currency.get_price() if usd_price == 0: abort(400, code=1002, message={'usd_price': 'usd_price is invaild'}) # amount = evaluation_reward_amount / usd_price amount = 1000 assets = Assets.get_assets(self.id) details = {'message': u'完成评测奖励'} assets.update_total_balance(amount, g_assets_record_type.EVALUATION, details) # 再赠送每一代推荐 layer = 0 layer_max = len(recommend_reward_amount) sponsor = self.sponsor while sponsor and layer < layer_max: details = { 'message': '被推荐人:{}, 第几代:{}'.format(self.uid, layer + 1) } if sponsor.state == g_user_state_type.EVALUATION: assets = Assets.get_assets(sponsor.id) assets.update_total_balance(recommend_reward_amount[layer], g_assets_record_type.SPONSOR, details) layer += 1 sponsor = sponsor.sponsor
def confirm_order_process(): order_list = ConfirmOrder.query.filter(ConfirmOrder.status == g_confirm_order_status.UNPROCESSED).all() for order in order_list: change = ConfirmOrder.query.filter( ConfirmOrder.id == order.id, ConfirmOrder.status == g_confirm_order_status.UNPROCESSED).update( dict(status=g_confirm_order_status.PROCESSED)) if not change: continue detail = {'message': '挂单交易'} assets = Assets.get_assets(order.buy_user_id) assets.update_community_today_balance(order.amount, g_assets_record_type.BUY, detail) # 用于计算一个买卖周期 order.buy_user.buy_order_cnt += 1 if order.sell_user.buy_order_cnt > 0: order.sell_user.buy_order_cnt -= 1 option = Setting.get_json('general_option') buy_sell_free_amount = option['buy_sell_free_amount'] buy_sell_rate = decimal.Decimal(option['buy_sell_rate']) fee = order.amount * buy_sell_rate amount = buy_sell_free_amount - fee detail = { 'message': '成功买卖各一单,释放数量:{}, 单数量:{}, 扣除手续费:{}'.format( buy_sell_free_amount, order.amount, fee) } assets = Assets.get_assets(order.sell_user_id) if assets.update_total_balance(-buy_sell_free_amount, g_assets_record_type.BUY_SELL_FREE, detail): assets.update_transaction_balance(amount, g_assets_record_type.BUY_SELL_FREE, detail) sell_user = order.sell_user sell_user.update_today_have_transaction() sell_user.update_transaction_free() currency = Currency.get_currency() currency.update_transaction_cnt() db.session.commit()
def query_current_price(order): if order.match_order is None: price = Currency.get_price() else: price = order.match_order.current_price return '{}'.format(price)
def match_order_process(): option = Setting.get_json('general_option') # match_order_cnt = option['match_order_cnt'] dollar2rmb = decimal.Decimal(option['dollar2rmb']) task = MatchOrderTask.query.filter(MatchOrderTask.status == g_match_order_task_status.UNPROCESSED).first() if task is None: return change = MatchOrderTask.query.filter(MatchOrderTask.status == g_match_order_task_status.UNPROCESSED).update( dict(status=g_match_order_task_status.PROCESSED)) if not change: return sell_list = Order.query.filter( Order.side == g_order_side.SELL, Order.status == g_order_status.PENDING) sell_list = sell_list.order_by(Order.priority.desc(), Order.created_at.asc()) i = 0 for item in sell_list: if i >= task.order_cnt: break buy_order = Order.query.filter( Order.side == g_order_side.BUY, Order.user_id != item.user_id, Order.status == g_order_status.PENDING).order_by(Order.priority.desc(), Order.created_at.asc()).first() if buy_order is None: continue change = Order.query.filter(Order.id == item.id, Order.status == g_order_status.PENDING).update( dict(status=g_order_status.MATCH)) if not change: continue change = Order.query.filter(Order.id == buy_order.id, Order.status == g_order_status.PENDING).update( dict(status=g_order_status.MATCH)) if not change: item.status = g_order_status.PENDING db.session.commit() continue usd_price = CryptoCurrency.query.filter(CryptoCurrency.currency_code == 'USDT').first().usd_price dollar = Currency.get_price() * item.amount usdt = dollar / usd_price order = MatchOrder(sell_user_id=item.user_id, buy_user_id=buy_order.user_id, sell_order_id=item.id, buy_order_id=buy_order.id, sell_number=item.number, buy_number=buy_order.number, payment_amount=dollar * dollar2rmb, payment_amount_usdt=usdt, current_price=Currency.get_price()) db.session.add(order) db.session.flush() item.match_order_id = order.id buy_order.match_order_id = order.id db.session.commit() try: if order.buy_user.order_mobile: clnt = YunpianClient('fcf725316cbb8ff1438c90ff76c6cebe') param = {YC.MOBILE: '+' + order.buy_user.order_mobile.replace(' ', ''), YC.TEXT: "【乐宝】您的订单{}已匹配成功,请尽快安排处理。".format('')} clnt.sms().single_send(param) except: pass i += 1 db.session.commit()
def settlement_handler(): option = Setting.get_json('general_option') community_node_cnt = option['community_node_cnt'] community_total_balance = option['community_total_balance'] community_transaction_day_cnt = option['community_transaction_day_cnt'] community_sponsor_cnt = option['community_sponsor_cnt'] community_line_cnt = option['community_line_cnt'] community_line_people_cnt = option['community_line_people_cnt'] # 更新连续购买天数 User.update_continuous_buy_cnt() User.query.update(dict(team_qualified_cnt=0)) # TODO 测试是否可以写成一个update Assets.query.filter(Assets.community_today_balance > 0).update( dict(community_balance=Assets.community_balance + Assets.community_today_balance)) Assets.query.update(dict(community_today_balance=0)) # 筛选出合格用户,并更新每个团队合格用户人数 q = User.query.filter( User.continuous_buy_cnt >= community_transaction_day_cnt, User.active == 1).all() for user in q: user.update_team_qualified_cnt() count = db.session.query(db.func.count(User.id)).filter( User.is_community_node == 1, User.active == 1).first()[0] user_q = db.session.query(User).filter( User.id == Assets.user_id, Assets.grand_total_balance >= community_total_balance[0], User.is_community_node == 0).all() for user in user_q: ret = 0 if count < community_node_cnt[0]: ret = DailySettlement.community_check_user( user, community_total_balance[0], community_transaction_day_cnt, community_sponsor_cnt[0], community_line_cnt[0], community_line_people_cnt) elif count < community_node_cnt[1]: ret = DailySettlement.community_check_user( user, community_total_balance[1], community_transaction_day_cnt, community_sponsor_cnt[1], community_line_cnt[1], community_line_people_cnt) elif count < community_node_cnt[2]: ret = DailySettlement.community_check_user( user, community_total_balance[2], community_transaction_day_cnt, community_sponsor_cnt[2], community_line_cnt[2], community_line_people_cnt) else: pass if ret: user.update_is_community_node() count += 1 if not count: return # 计算节点分红 community_dividend_rate = decimal.Decimal( option['community_dividend_rate']) currency = Currency.get_currency() amount = currency.today_transaction_amount * community_dividend_rate / count q = User.query.filter(User.is_community_node == 1, User.active == 1).all() detail = { 'message': '社区节点分红, 当天交易量:{}, 分红比例:{}, 社区节点数量:{}'.format( currency.today_transaction_amount, community_dividend_rate, count) } for user in q: assets = Assets.get_assets(user.id) assets.update_total_balance(amount, g_assets_record_type.DIVIDEND, detail) currency.clear_today_transaction_amount()