def user_orders(): """获取用户活动订单信息(POST&LOGIN) :uri: /store/user_orders :param store_id: 商店ID :param page: 页码 :param nbr: 每页数量 :return: {'orders': <Order>list, 'end_page': bool} """ user = request.authed_user store_id = request.values.get('store_id', None) page = int(request.values.get('page', 1)) pagesize = int(request.values.get('nbr', 10)) if not store_id: return error.InvalidArguments store = Store.get_store(store_id) if not store or not store.online(): return error.StoreError('该抽奖活动不存在或已下线') # 获得游玩发放物品的订单 orders = UserOrder.get_user_store_orders(str(user._id), store_id, page, pagesize) orders = [order.format() for order in orders] return {'orders': orders, 'end_page': len(orders) != pagesize}
def lottery_info(): """获取抽奖活动详细信息(GET) :uri: /store/lottery_info :param store_id: 兑换活动ID :return: {'lottery': <Store>object} """ user = request.authed_user store_id = request.values.get('store_id', None) if not store_id: return error.InvalidArguments store = Store.get_store(store_id) if not store or not store.online(): return error.StoreError('该抽奖活动不存在或已下线') if store.pause(): return error.StoreError('该抽奖活动还未开始') lottery = store.format() items = [ item.format() for item in StoreItem.get_store_items(store.store_id) ] lottery['items'] = items chances = 0 if user: chances = Marketing.query_lottery_chance(user.partner_migu['id'], store.campaign_id) if isinstance(chances, error.ApiError): return chances if int(chances) == 0: ors = UserOrder.get_user_store_orders(user._id, store_id, 1, store.lotterynum) chances = store.lotterynum - len(ors) if store.yxmember: uservip = MiguPay.check_user_vip_level(user.phone) if isinstance(uservip, error.ApiError): return uservip if not (uservip['vip5']['subscribed'] or uservip['vip10']['subscribed']): chances = -1 lottery['chances'] = chances return {'lottery': lottery}
def add_barrage_color(event_id): """发送彩色弹幕(POST) :uri: /store/<int:event_id>/add_barrage_color :参数: text 弹幕内容 colorid 颜色id :return: {} """ user = request.authed_user text = request.values.get('text', None) cid = request.values.get('colorid', None) if not text or not cid: return error.InvalidArguments color = BarrageColor.get_color(int(cid)) if not color: return error.StoreError('该颜色的弹幕不存在') uc = UserCredit.get_or_create_user_credit(user_id=str(user._id)) if color.credit_type == const.SALE_GEM and uc.gem < color.credit_value: return error.StoreError('游票不足,颜料还在调制中!') elif color.credit_type == const.SALE_GOLD and uc.gold < color.credit_value: return error.StoreError('游米不足,颜料还在调制中!') key = 'lock:store:%s' % (str(user._id)) with util.Lockit(Redis, key) as locked: if locked: return error.StoreError('购买太频繁') # 扣除货币 if color.credit_type == const.SALE_GEM: uc.reduce_gem(color.credit_value, const.BARRAGE) elif color.credit_type == const.SALE_GOLD: uc.reduce_gold(color.credit_value, const.BARRAGE) data = dict(event_id=event_id, nickname=user.nickname or user.name, text=spam.Spam.replace_words(text), color=color.format()['desc']) from wanx.platforms.xlive import Xlive Xlive.send_live_msg(data, 'danmu') return {}
def gift_codes(): """获取礼包类物品的奖励信息(POST&LOGIN) :uri: /store/gift_codes :param store_id: 商店ID :param rid: 抽奖奖项ID :return: {'codes': <code>list} """ user = request.authed_user store_id = request.values.get('store_id', None) rid = request.values.get('rid', None) if not store_id or not rid: return error.InvalidArguments store = Store.get_store(store_id) if not store or not store.online(): return error.StoreError('该抽奖活动不存在或已下线') # 获取抽奖对应奖项的所有获奖记录 codes = [] page = 1 end_page = False while not end_page: orders, end_page = Marketing.query_exchenged_prizes(str( user.partner_migu['id']), store.campaign_id, page=page, pagesize=50) # 过滤奖项ID对应的兑换记录 for order in orders: consume_ids = [ str(res['resourceId']) for res in order['consumeResources'] ] if [str(rid)] == consume_ids: codes.append({ 'name': order['exchengedResouce']['name'], 'code': order['exchangeCode'], 'create_at': int(order['exchangeTime']['time']) / 1000 }) page += 1 return {'codes': codes}
def draw_gift_code(): """ VIP用户获取礼包兑换码 :uri: /games/vip/giftcode/draw :param: giftcode_id 会员游戏礼包id :return: """ user = request.authed_user uid = str(user._id) gcid = request.values.get('giftcode_id') if not gcid: return error.InvalidArguments giftcode = VipGiftCode.get_one(gcid, check_online=True) if not giftcode: return error.GiftCodeNotExist if giftcode.left <= 0: return error.StoreError('没有可领取的礼包了!') vip = MiguPay.check_user_vip_level(user.phone) if isinstance(vip, error.ApiError): return vip if not (vip['vip5']['subscribed'] or vip['vip10']['subscribed']): return error.StoreError('没有领取权限!') # 查看是否有抽奖机会 left_chances = Marketing.query_lottery_chance(user.partner_migu['id'], giftcode.campaign_id) if isinstance(left_chances, error.ApiError): return error.StoreError('领取礼包失败,请稍后重试') # 当前没有剩余机会的时候,需要先验证是否可以抽奖并获取抽奖机会 if left_chances <= 0: key = 'lock:store:%s' % (str(user._id)) with util.Lockit(Redis, key) as locked: if locked: return error.StoreError('领取礼包太频繁') if gcid in UserGiftCodeOrder.get_user_gift_code_ids(uid): return error.StoreError('已经领取过该礼包') # 进行抽奖机会的兑换 ret = Marketing.execute_campaign(user.partner_migu['id'], user.phone, [giftcode.campaign_id], trigger=10218) if not ret or isinstance(ret, error.ApiError): return error.StoreError('兑换领取机会失败') # 调用营销平台进行抽奖 prize = Marketing.draw_lottery(user.partner_migu['id'], giftcode.campaign_id) if isinstance(prize, error.ApiError): return prize if not prize: return error.StoreError('获取游戏兑换码失败') exchange_code = None for row in prize.get('extensionInfo', []): if row['key'] == 'exchangeCode': exchange_code = row['value'] break if not exchange_code: return error.StoreError('获取游戏兑换码失败') order = UserGiftCodeOrder.create(user_id=str(user._id), vgc_id=gcid, vgc_name=giftcode.name, campaign_id=giftcode.campaign_id, gift_code=exchange_code, result=json.dumps(prize), recid=prize.get('id', ''), expire_at=util.timestamp2datetime( giftcode.exchange_expire_at), status=const.ORDER_FINISHED, user_ip=request.access_route[0]) UserGiftCodeOrder.clear_redis(str(user._id)) # 更新库存 giftcode.update_model({'$inc': {'left': -1, 'used': 1}}) return {'order': order.format()}
def gifts_exchange(): user = request.authed_user requ_type = request.values.get('requ_type') value = PayForGift.get_all_value() # 现已兑换的总金额 cfg = GiftExchangeCfg.get_gift_config() total_exchange_value = cfg.total_exchange_value # 兑换上限 break_rate = cfg.break_rate # 折损率 exchange_thresthold = cfg.exchange_thresthold # 兑换下限 gift_value = UserProduct.get_total_money(user) # 当前用户礼物价值 _gift_value = float(gift_value) / float(100) # gift_value = UserCredit.get_or_create_user_credit(user._id).current_money # 当前用户礼物价值 _value = _gift_value * float(break_rate) exchange_value = int(_value) + 1 if _value > int(_value) else int( _value) # 折损后的价值 current_exchange_value = int(total_exchange_value) - int( value) # 当前还可兑换的金额 # 营销数据入库经分 data_dict = dict(cmd="exchange_huafei", deviceid=request.values.get('device', ''), mobile=user.phone, source=request.values.get('source', 'activity'), activityid="0", activityname=u"兑换话费活动") if requ_type == 'get_judge': certify_status = UserCertify.get_certify_status(user._id) is_anchor_wlist = AnchorWlist.is_anchor_wlist(user._id) # 是否是签约主播 if is_anchor_wlist: return {'exchange_status': 1, 'exchange_msg': '签约主播无法兑换'} user_certify = True if certify_status == 3 else False if not user_certify: return { 'exchange_status': 2, 'exchange_msg': '只有实名认证的用户才可以兑换哦,快去认证吧' } is_exchange_time = GiftExchangeCfg.is_exchange_time() # 是否在兑换时间内 if not is_exchange_time: return { 'exchange_status': 3, 'exchange_msg': '当前时间不在礼物兑换期内,请在兑换期内进行礼物兑换' } if int(exchange_value) >= int(current_exchange_value): # 超过总额度 return { 'exchange_status': 4, 'exchange_msg': '本月额度已经被全部兑换完啦,下个月请早了' } is_exchange = PayForGift.is_exchange(user) # 兑换次数 if is_exchange: return { 'exchange_status': 5, 'exchange_msg': '每个月只能兑换一次哦,您本月已经兑换过啦' } if int(exchange_value) < int(exchange_thresthold): # 不满足兑换门槛 return {'exchange_status': 6, 'exchange_msg': '您的礼物还不够提现哦'} data_dict["opt"] = "1:{0}:{1}".format(gift_value, exchange_value) Marketing.jf_report(data_dict) return { 'exchange_status': 0, 'exchange_msg': '您有价值{0}元的礼物,可以兑换{1}元话费,话费将发放到您登录的手机号码内,兑换完成后付费礼物全部清零'.format( _gift_value, exchange_value) } elif requ_type == 'pay_exchange': is_anchor_wlist = AnchorWlist.is_anchor_wlist(user._id) # 是否是签约主播 if is_anchor_wlist: return error.StoreError certify_status = UserCertify.get_certify_status(user._id) user_certify = True if certify_status == 3 else False if not user_certify: return error.StoreError is_exchange_time = GiftExchangeCfg.is_exchange_time() if not is_exchange_time: return error.StoreError if int(exchange_value) >= int(current_exchange_value): return error.StoreError is_exchange = PayForGift.is_exchange(user) if is_exchange: return error.StoreError if int(exchange_value) < int(exchange_thresthold): return error.StoreError lock_key = 'lock:exchange_fee:%s' % (str(user._id)) with util.Lockit(Redis, lock_key) as locked: if locked: return error.StoreError('兑换太频繁') try: uc = UserCredit.get_or_create_user_credit(user._id) uc.reduce_money(gift_value) UserProduct.clear_gifts_num(user, True) PayForGift.create_log(user, const.SUCCESS, _gift_value, exchange_value, const.GIFT_EXCHANGE) data_dict["opt"] = "1:{0}:{1}".format(gift_value, exchange_value) Marketing.jf_report(data_dict) return { 'exchange_status': 0, 'exchange_msg': '兑换成功,{0}元的话费将在30个工作日内发到您登录的咪咕游玩手机账户'.format( exchange_value) } except: PayForGift.create_log(user, const.FAIL, _gift_value, exchange_value, const.GIFT_EXCHANGE) return {'exchange_status': 7, 'exchange_msg': '兑换失败,请稍后再试哦'} elif requ_type == 'gold_exchange': lock_key = 'lock:exchange_gold:%s' % (str(user._id)) with util.Lockit(Redis, lock_key) as locked: if locked: return error.StoreError('兑换太频繁') try: total_gold_value = UserProduct.get_total_gold(user) uc = UserCredit.get_or_create_user_credit(user._id) uc.add_gold(total_gold_value, const.GIFT_EXCHANGE) UserProduct.clear_gifts_num(user, False) data_dict["opt"] = "1:{0}:{1}".format(gift_value, exchange_value) Marketing.jf_report(data_dict) return { 'exchange_status': 0, 'exchange_msg': '您已兑换成功,请去游米账户中进行查询' } except: data_dict["opt"] = "0:0:0" Marketing.jf_report(data_dict) return {'exchange_status': 7, 'exchange_msg': '兑换失败,请稍后再试哦'} else: return {'exchange_status': 7, 'exchange_msg': '兑换失败,请稍后再试哦'}
def exchange_product(): """兑换物品接口(POST&LOGIN) :uri: /store/exchange_product :param store_id: 兑换活动ID :param item_id: 兑换物品ID :return: {'item': <Item>object, 'order': <Order>object} """ user = request.authed_user store_id = request.values.get('store_id', None) item_id = request.values.get('item_id', None) user_ip = request.remote_addr device = request.values.get('device', None) if not store_id or not item_id: return error.InvalidArguments store = Store.get_store(store_id) if not store or not store.online(): return error.StoreError('该兑换活动不存在或已下线') item = StoreItem.get_store_item(store_id, item_id) if not item: return error.StoreError('该兑换奖品不存在') # 库存判断 if item.left_num < 1: return error.StoreError('该兑换奖品已卖完') product = Product.get_product(item.product_id) # 判断手机号 if product.product_type == MOBILE_TRAFFIC and not util.is_mobile_phone( user.phone): return error.StoreError('非移动手机号不能兑换此商品') if product.product_type == UNICOM_TRAFFIC and not util.is_unicom_phone( user.phone): return error.StoreError('非联通手机号不能兑换此商品') if product.product_type == TELECOM_TRAFFIC and not util.is_telecom_phone( user.phone): return error.StoreError('非电信手机号不能兑换此商品') uc = UserCredit.get_or_create_user_credit(user_id=str(user._id)) if item.credit_type == const.SALE_GEM and uc.gem < item.credit_value: return error.StoreError('你的游票不足,无法兑换此物品哦!') elif item.credit_type == const.SALE_GOLD and uc.gold < item.credit_value: return error.StoreError('你的游米不足,无法兑换此物品哦!') key = 'lock:store:%s' % (str(user._id)) status = None with util.Lockit(Redis, key) as locked: if locked: return error.StoreError('兑换太频繁') extra = dict(migu_id=user.partner_migu['id'], phone=user.phone, campaign_id=store.resource_campaign_id) status = product.add_product2user(str(user._id), item.product_num, const.EXCHANGE, extra) if status == const.ORDER_FAILED: return error.StoreError('兑换失败') else: # 扣除货币 if item.credit_type == const.SALE_GEM: uc.reduce_gem(item.credit_value, const.EXCHANGE) elif item.credit_type == const.SALE_GOLD: uc.reduce_gold(item.credit_value, const.EXCHANGE) # 更新库存 item.left_num -= 1 item.use_num += 1 item.save() # 记录订单 order = UserOrder.create( user_id=str(user._id), item_id=item.item_id, store_id=item.store_id, store_type=store.store_type, campaign_id=store.campaign_id, title=item.title, product_id=item.product_id, product_num=item.product_num, status=status, user_ip=request.access_route[0], ) # 营销数据入库经分 兑换活动 data_dict = dict(cmd="exchange", opt="1", deviceid=request.values.get('device', ''), mobile=user.phone, source=request.values.get('source', 'activity'), activityid=store_id, activityname=store.title) Marketing.jf_report(data_dict) return {'item': item.format(), 'order': order.format()}
def receive_order(): """领取订单奖励(POST&LOGIN) :uri: /store/receive_order :param order_id: 订单ID :param name: 真实名字 (实物物品) :param id_card: 身份证 (实物物品) :param address: 地址 (实物物品) :return: {'order': <Order>object} """ user = request.authed_user order_id = request.values.get('order_id', None) name = request.values.get('name', None) id_card = request.values.get('id_card', None) address = request.values.get('address') if not order_id: return error.InvalidArguments order = UserOrder.get_order(order_id) if not order or order.user_id != str(user._id): return error.StoreError('用户订单不存在') if order.status != const.ORDER_NEED_DRAW: return error.StoreError('用户订单状态错误') store = Store.get_store(order.store_id) if not store or not store.online(): return error.StoreError('该抽奖活动不存在或已下线') product = Product.get_product(order.product_id) if product.product_type == PHYSICAL_OBJECT: # 实物物品 if not name or not id_card or not address: return error.InvalidArguments addr = UserOrderAddress.create(order_id=order_id, user_id=str(user._id), name=name, phone=user.phone, id_card=id_card, address=address) prize = json.loads(order.result) # 获取用户可兑换奖励信息 exchenge_prizes = Marketing.query_exchengable_prizes( user.partner_migu['id'], order.campaign_id) if isinstance(exchenge_prizes, error.ApiError): return exchenge_prizes for _prize in exchenge_prizes: exchenge_ids = map(lambda x: x['id'], _prize['exchengeResources']) exchengeable_id = _prize['exchengableResource']['id'] if [prize['id']] == exchenge_ids: exchenge_ids = [prize['id']] if product.product_type == PHYSICAL_OBJECT: # 实物物品 ret = Marketing.draw_exchengable_prize( user.partner_migu['id'], order.campaign_id, exchenge_ids, exchengeable_id, prize['amount'], addr.name, addr.phone, addr.address, addr.id_card) else: ret = Marketing.draw_exchengable_prize(user.partner_migu['id'], order.campaign_id, exchenge_ids, exchengeable_id, prize['amount']) if isinstance(exchenge_prizes, error.ApiError): return ret # 由于对方没有返回订单ID, 只能通过获取用户最近一个已兑换奖励的订单ID ret, _ = Marketing.query_exchenged_prizes(user.partner_migu['id'], order.campaign_id, page=1, pagesize=1) if isinstance(ret, error.ApiError): return ret # 更新订单信息 if isinstance(ret, list) and len(ret) > 0 and 'recId' in ret[0]: order.recid = ret[0]['recId'] order.status = const.ORDER_IN_HAND order.save() extra = dict(migu_id=user.partner_migu['id'], phone=user.phone, campaign_id=store.resource_campaign_id) # 进行物品的发放 status = product.add_product2user(str(user._id), order.product_num, const.LOTTERY, extra) # 订单状态更新 if status != order.status: order.status = status order.save() return {'order': order.format()}
def draw_lottery(): """抽奖接口(POST&LOGIN) :uri: /store/draw_lottery :param store_id: 抽奖活动ID :return: {'item': <Item>object, 'order': <Order>object} """ user = request.authed_user store_id = request.values.get('store_id', None) trigger = request.values.get('trigger', None) user_ip = request.remote_addr device = request.values.get('device', None) if not store_id: return error.InvalidArguments store = Store.get_store(store_id) if not store or not store.online(): return error.StoreError('该抽奖活动不存在或已下线') if store.pause(): return error.StoreError('该抽奖活动还未开始') if store.yxmember: uservip = MiguPay.check_user_vip_level(user.phone) if isinstance(uservip, error.ApiError): return uservip if not (uservip['vip5']['subscribed'] or uservip['vip10']['subscribed']): return error.MemberError('该抽奖需要游戏会员才能参加') # 进行抽奖奖项库存判断 items = StoreItem.get_store_items(store_id) left_num = sum(map(lambda x: x.left_num, items)) if left_num < 0: return error.StoreError('该抽奖活动奖项已被领取完') # 判断号码是否符合规则 info = Marketing.query_campaign(store.campaign_id) if isinstance(info, error.ApiError): return info if info['mobile_phone_only'] and not util.is_mobile_phone(user.phone): return error.StoreError('该抽奖活动只对移动手机号开放') # 查看是否有抽奖机会 left_chances = Marketing.query_lottery_chance(user.partner_migu['id'], store.campaign_id) if isinstance(left_chances, error.ApiError): return error.StoreError('获取抽奖机会失败') if left_chances <= 0: uc = UserCredit.get_or_create_user_credit(user_id=str(user._id)) if store.credit_type == const.SALE_GEM and uc.gem < store.credit_value: return error.StoreError('你的游票不足,无法参与抽奖哦!') elif store.credit_type == const.SALE_GOLD and uc.gold < store.credit_value: return error.StoreError('你的游米不足,无法参与抽奖哦!') key = 'lock:store:%s' % (str(user._id)) with util.Lockit(Redis, key) as locked: if locked: return error.StoreError('抽奖太频繁') # 进行抽奖机会的兑换 if not trigger: ret = Marketing.execute_campaign(user.partner_migu['id'], user.phone, [store.campaign_id]) else: ret = Marketing.execute_campaign(user.partner_migu['id'], user.phone, [store.campaign_id], trigger=trigger) if not ret or isinstance(ret, error.ApiError): return error.StoreError('兑换抽奖机会失败') else: # 扣除货币 if store.credit_type == const.SALE_GEM: uc.reduce_gem(store.credit_value, const.LOTTERY_REWAED) elif store.credit_type == const.SALE_GOLD: uc.reduce_gold(store.credit_value, const.LOTTERY_REWAED) # 调用营销平台进行抽奖 prize = Marketing.draw_lottery(user.partner_migu['id'], store.campaign_id) if isinstance(prize, error.ApiError): return prize # 营销数据入库经分 抽奖活动 data_dict = dict(cmd="lottery", opt="1", deviceid=request.values.get('device', ''), mobile=user.phone, source=request.values.get('source', 'activity'), activityid=store_id, activityname=store.title) Marketing.jf_report(data_dict) # 营销平台奖项有各种限制, 会导致用户抽不中任何物品的可能。 # 比如有A/B/C三个抽奖奖项,概率分别为20%/30%/50%,如果A物品配置为一个手机号只能中一次, # 那当用户抽中过A之后,以后再抽奖,就会有20%(A)的几率啥也抽不中。如果B物品库存又没有了, # 那用户就会有20%(A)+30%(B)的几率啥也抽不中。为了处理这种情况,目前默认如果抽不中就给 # 用户发一个抽奖活动配置的"default"奖项(运营后台: 营销平台奖项ID配置为'default') if not prize: item = StoreItem.get_item_by_identity(store.store_id, 'default') if not item: return {'item': None, 'order': None} else: # 更新库存 item.left_num -= 1 item.use_num += 1 item.save() # 生成兑奖订单 order = UserOrder.create( user_id=str(user._id), item_id=item.item_id, store_id=item.store_id, store_type=store.store_type, campaign_id=store.campaign_id, title=item.title, product_id=item.product_id, product_num=item.product_num, status=const.ORDER_NEED_DRAW, result='', user_ip=request.access_route[0], ) extra = dict(migu_id=user.partner_migu['id'], phone=user.phone, campaign_id=store.resource_campaign_id) # 进行物品的发放 product = Product.get_product(item.product_id) status = product.add_product2user(str(user._id), item.product_num, const.LOTTERY, extra) # 订单状态更新 if status != order.status: order.status = status order.save() return {'item': item.format(), 'order': order.format()} # 由于营销平台看不到id, 暂时只能用奖项名称进行对应 prize_name = None for i in prize['extensionInfo']: if i['key'] == 'levelName': prize_name = i['value'] break item = StoreItem.get_item_by_identity(store.store_id, prize_name) # 更新库存 item.left_num -= 1 item.use_num += 1 item.save() # 无领取规则的活动营销平台会自动领取 status = const.ORDER_NEED_DRAW if info[ 'is_exchange_rule'] else const.ORDER_IN_HAND # 生成兑奖订单 order = UserOrder.create( user_id=str(user._id), item_id=item.item_id, store_id=item.store_id, store_type=store.store_type, campaign_id=store.campaign_id, title=item.title, product_id=item.product_id, product_num=item.product_num, status=status, result=json.dumps(prize), user_ip=request.access_route[0], ) product = Product.get_product(item.product_id) if product.product_type != PHYSICAL_OBJECT: # 非实物物品直接去营销平台进行奖励兑换 # 有领取规则的抽奖活动的非实物物品自动领取, 无领取规则的活动营销平台会自动领取 if info['is_exchange_rule']: # 获取用户可兑换奖励信息 prizes = Marketing.query_exchengable_prizes( user.partner_migu['id'], order.campaign_id) if isinstance(prizes, error.ApiError): return prizes # 进行奖励的兑换, 目前最后一条为最近获得的奖励 for _prize in prizes[::-1]: exchenge_ids = map(lambda x: x['id'], _prize['exchengeResources']) exchengeable_id = _prize['exchengableResource']['id'] if [prize['id']] == exchenge_ids: exchenge_ids = [prize['id']] ret = Marketing.draw_exchengable_prize( user.partner_migu['id'], order.campaign_id, exchenge_ids, exchengeable_id, prize['amount']) if isinstance(ret, error.ApiError): return ret # 由于对方没有返回订单ID, 只能通过获取用户最近一个已兑换奖励的订单ID, 实物物品需要手动领取 ret, _ = Marketing.query_exchenged_prizes(user.partner_migu['id'], order.campaign_id, page=1, pagesize=1) if isinstance(ret, error.ApiError): return ret # 更新订单信息 if isinstance(ret, list) and len(ret) > 0 and 'recId' in ret[0]: order.recid = ret[0]['recId'] order.status = const.ORDER_IN_HAND order.save() extra = dict(migu_id=user.partner_migu['id'], phone=user.phone, campaign_id=store.resource_campaign_id) # 进行物品的发放 status = product.add_product2user(str(user._id), item.product_num, const.LOTTERY, extra) # 订单状态更新 if status != order.status: order.status = status order.save() return {'item': item.format(), 'order': order.format()}