Ejemplo n.º 1
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='', star='')

		if '' in (param.order_id, param.star):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 订单打分
			db.order_app.update_one({'order_id' : param.order_id, 'user':{'$in':uname.values()}},{
				'$set'  : { 'star': int(param.star) },
				'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '订单打分')},
			})
			return json.dumps({'ret' : 0, 'msg' : '订单已打分!'})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 2
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          shop_id='',
                          order_id='',
                          addr_id='',
                          coupon_id='',
                          cart='')

        if '' in (param.shop_id, param.addr_id, param.cart):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        print param

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            ret_json = checkout(uname, param)

            print ret_json

            return json.dumps(ret_json)
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 3
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='')

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)
        if uname:
            db_shop = db.base_shop.find_one(
                {'_id': ObjectId(setting.default_shop)}, {'name': 1})

            # 返回全局参数
            return json.dumps({
                'ret': 0,
                'data': {
                    'free_delivery': '%.2f' % app_helper.free_delivery,
                    'first_promote': '%.2f' % app_helper.first_promote,
                    'cod_enable': False,
                    'image_host': '/static/image/product',
                    'image_host2':
                    'http://%s/image/product' % setting.image_host,
                    'banner': app_helper.BANNER['c001'],
                    'default_shop': setting.default_shop,  # 返回默认站店
                    'default_name': db_shop['name'] if db_shop else '',
                    'phone_number': uname['uname'],
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 4
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          addr_id='',
                          name='',
                          tel='',
                          addr='')

        if '' in (param.addr_id, param.name, param.tel, param.addr):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            # 需要判断地址是否有对应门店,否则不在送货范围内
            # app_helper.check_address()

            # 查找并修改收货地址
            r = db.app_user.find_one({'openid': uname['openid']},
                                     {'address': 1})

            new_addr = []
            for i in r['address']:
                if i[0] == param.addr_id:
                    new_addr.append(
                        (param.addr_id, param.name.strip(), param.tel.strip(),
                         param.addr.strip(), int(time.time())))
                else:
                    new_addr.append(i)

            r = db.app_user.update_one({'openid': uname['openid']},
                                       {'$set': {
                                           'address': new_addr
                                       }})

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr_id': param.addr_id,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 5
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='')

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']},
                                           {'coupon': 1})
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 这里应该增加对有效期的检查!!!
            coupon = []
            unused = 0
            for i in db_user['coupon']:
                if app_helper.time_str(format=1) > i[1]:  # 过期抵用券不返回 2015-08-22
                    continue
                coupon.append({
                    'id': i[0],
                    'valid': i[1],
                    'cash': i[2],
                    'status': 'unused' if i[3] == 1 else 'used',
                })
                unused += (1 if i[3] == 1 else 0)

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'coupon': coupon,
                    'total': len(coupon),
                    'unused': unused,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 6
0
Archivo: wx.py Proyecto: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        #print web.input()
        param = web.input(openid='', session_id='', number='')

        if param.number == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            #print 'user_phone', uname
            if len(uname['uname'].strip()) > 0:
                return json.dumps({'ret': -5, 'msg': '已绑定手机号码,不能重复绑定'})

            number = param.number.strip()
            if len(number) < 11 or (not number.isdigit()):
                return json.dumps({'ret': -3, 'msg': '手机号码格式错误'})

            # 随机码
            rand = app_helper.my_rand(base=1)
            register = False

            #发送短信验证码
            sms.send_rand(number, rand, register)

            #临时保存到phone字段
            db.app_user.update({'openid': uname['openid']},
                               {'$set': {
                                   'phone': number,
                                   'rand': rand
                               }})

            # 返回
            return json.dumps({'ret': 0})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 7
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', addr_id='')

        if param.addr_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:

            # 查找并删除收货地址
            r = db.app_user.find_one({'openid': uname['openid']},
                                     {'address': 1})

            new_addr = []
            for i in r['address']:
                if i[0] == param.addr_id:
                    continue
                else:
                    new_addr.append(i)

            r = db.app_user.update_one({'openid': uname['openid']},
                                       {'$set': {
                                           'address': new_addr
                                       }})

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr_id': param.addr_id,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 8
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='')

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']},
                                           {'address': 1})
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            addr = []
            for i in db_user['address']:
                addr.append({
                    'id': i[0],
                    'name': i[1],
                    'tel': i[2],
                    'addr': i[3],
                    'tick': i[4] if len(i) > 4 else 0,
                })

            #print addr
            addr2 = quick(addr)
            #print addr2

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr': addr2,
                    'total': len(addr2),
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 9
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='')

		if param.order_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 获得订单
			db_order = db.order_app.find_one(
				{'order_id' : param.order_id, 'user': {'$in':uname.values()}},
				{'status':1, 'cart':1, 'due':1, 'shop':1}
			)
			if db_order==None:
				return json.dumps({'ret' : -3, 'msg' : '未找到订单!'})
			elif db_order['status']!='DUE':
				return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'})

			# 取消订单
			db.order_app.update_one({'order_id' : param.order_id,},{
				'$set'  : { 'status':'CANCEL' },
				'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '取消账单')},
			})
			return json.dumps({'ret' : 0, 'msg' : '订单已取消!'})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 10
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='',session_id='')

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1,'credit':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 返回
			return json.dumps({'ret' : 0, 'data' : {
				'credit'  : '%.2f' % db_user.get('credit', 0.0)
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 11
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='',session_id='')

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)
		if uname:
			# 返回host地址、端口
			host = setting.app_pool[random.randint(0,len(setting.app_pool)-1)]
			print 'host = ', host
			return json.dumps({'ret' : 0, 'data' : {
				'protocol' : 'http',
				#'host'     : setting.app_host, #'app.urfresh.cn',
				'host'     : host,
				'port'     : '12050',
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 12
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', shop_id='', product_id='')

        if '' in (param.shop_id, param.product_id):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:

            # 有效的sku
            db_sku = db.sku_store.find_one({'product_id': param.product_id}, {
                'product_id': 1,
                'base_sku': 1,
                'app_title': 1,
                'is_onsale': 1,
                'special_price': 1,
                'promote': 1,
                'list_in_app': 1,
            })

            base_sku = db.dereference(db_sku['base_sku'])

            # 处理整箱预售
            if db_sku['list_in_app'] == -3:  # 关闭整箱预售 2015-10-27
                shop_id = setting.B3_shop  # B3整箱预售虚拟店
            else:
                shop_id = param.shop_id

            # 查找商品详情
            db_invent = db.inventory.find_one(
                {
                    'shop': ObjectId(shop_id),
                    'product_id': param.product_id,
                    'list_in_app': {
                        '$ne': 0
                    },
                },
                {
                    'product_id': 1,
                    #'category'    : 1, # 品类,从sku_store来的
                    #'sort_weight' : 1,
                    'sku': 1,
                    'price': 1,  # 门店价
                    'num': 1,  # 库存数
                },
            )

            # 准备返回结果
            data = {
                'product_id': db_invent['product_id'],
                'title': db_sku['app_title'],
                'abstract': base_sku['abstract'],
                'price': db_invent['price'],
                'num': db_invent['num'],
                'promote': db_sku['promote'],
                'detail_url': '',
            }

            # 是否有优惠价格
            if db_sku['is_onsale'] == 1 and float(
                    db_sku['special_price']) < float(db_invent['price']):
                # 优惠价格比门店价格低
                data['sale_price'] = db_sku['special_price']

            # 图片
            if base_sku.has_key('image'):
                if len(base_sku['image']) > 1:
                    i = base_sku['image'][1]  # 第2张是详情图
                else:
                    i = base_sku['image'][0]
                data['image'] = ['/%s/%s' % (i[:2], i)]
                #data['image']=['/%s/%s' % (i[:2], i) for i in base_sku['image']]
            else:
                data['image'] = ''

            # 返回
            return json.dumps({'ret': 0, 'data': data})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 13
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='',session_id='')

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 返回列表排序,可用的按金额排序,过期的沉底
			coupon=[]
			coupon_used=[]
			coupon_expired=[]
			unused=0
			for i in db_user['coupon']:
				if len(i)>4: 
					# (id, 有效期, 金额, 是否已用, 门槛) 2015-09-27
					# 有门槛信息,使用优惠券门槛信息
					msg1 = '满%.1f元使用' % i[4]
				else:
					# 没有门槛信息,使用默认设置
					if float(i[2])==6.0:
						msg1 = '满29.9元使用'
					elif float(i[2])==9.0:
						msg1 = '满39.9元使用'
					else:
						msg1 = '满14.9元使用'

				msg2 = '抵用券'
				msg3 = ''
				if len(i)>5:
					if i[5]=='apple':
						#msg2 = '水果券'
						msg3 = ',须含水果'
					elif i[5]=='b3':
						#msg2 = '整箱券'
						msg3 = ',整箱可用'

				if i[3]==0:
					coupon_used.append({
						'id'     : i[0],
						'valid'  : i[1],
						'cash'   : i[2],
						'status' : 'used', 
						'msg1'   : msg1+msg3,
						'msg2'   : msg2,
					})
				elif app_helper.time_str(format=1)>i[1]: # 过期抵用券不返回 2015-08-22
					coupon_expired.append({
						'id'     : i[0],
						'valid'  : i[1],
						'cash'   : i[2],
						'status' : 'expired', 
						'msg1'   : msg1+msg3,
						'msg2'   : msg2,
					})
				elif i[3]==1:
					coupon.append({
						'id'     : i[0],
						'valid'  : i[1],
						'cash'   : i[2],
						'status' : 'unused', 
						'msg1'   : msg1+msg3,
						'msg2'   : msg2,
					})
					unused += 1
				else: # 未知类型
					coupon_used.append({
						'id'     : i[0],
						'valid'  : i[1],
						'cash'   : i[2],
						'status' : 'used', 
						'msg1'   : msg1+msg3,
						'msg2'   : msg2,
					})

			coupon = quick(coupon)
			coupon.extend(coupon_used)
			coupon.extend(coupon_expired)

			# 返回
			return json.dumps({'ret' : 0, 'data' : {
				'coupon'  : coupon,
				'total'   : len(coupon),
				'unused'  : unused,
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 14
0
Archivo: wx.py Proyecto: jack139/fair
    def POST(self):
        web.header('Content-Type', 'application/json')
        #print web.input()
        param = web.input(openid='', session_id='', rand='', invitation='')

        if param.rand == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            if len(uname['uname'].strip()) > 0:
                return json.dumps({'ret': -5, 'msg': '已绑定手机号码,不能重复绑定'})

            #邀请码
            if param.has_key('invitation'):
                invitation = param.invitation

                if db.invitation.find({
                        'code': invitation
                }).count() == 0:  # 无效邀请码
                    invitation = ''
                else:
                    r = db.app_user.find_one({'openid': uname['openid']},
                                             {'invitation': 1})
                    if r.get('invitation', '') != '':  # 已填邀请码
                        invitation = ''
            else:
                invitation = ''

            if invitation != '':
                # 赠送优惠券
                valid = app_helper.time_str(time.time() + 3600 * 24 * 30,
                                            1)  # 有效期30天
                r = db.app_user.find_one_and_update(
                    {'openid': uname['openid']},
                    {
                        '$set': {
                            'invitation': invitation,
                            'last_time': app_helper.time_str()
                        },
                        #'$push' : {'coupon'     : (app_helper.my_rand(), valid, '5.00', 1)}, # 邀请码送5元
                    })
            else:
                r = db.app_user.find_one_and_update(
                    {'openid': uname['openid']},
                    {'$set': {
                        'last_time': app_helper.time_str()
                    }})

            # 检查验证码
            if param.rand.strip() != r['rand']:
                return json.dumps({'ret': -5, 'msg': '短信验证码错误'})

            if len(r['address']) > 0:  # 应该实现:返回最近使用的地址 !!!!
                addr = {
                    'id': r['address'][0][0],
                    'name': r['address'][0][1],
                    'tel': r['address'][0][2],
                    'addr': r['address'][0][3],
                }
            else:
                addr = {}

            # 绑定处理
            r2 = db.app_user.find_one({'uname': r['phone']})
            #print r['phone'],r2
            if r2:
                # 手机号码已注册过app, 需要合并app用户和微信用户
                #print db.app_user.update_one({'openid':uname['openid']},{'$set':{
                #	'uname'   : r['phone'],
                #	'address' : r['address']+r2['address'],
                #	'coupon'  : r['coupon']+r2['coupon'],
                #	'app_id'  : r2['app_id']
                #}})
                # 使手机号帐户不能再使用
                #db.app_user.update_one({'_id':r2['_id']},{'$set' : {'uname': u'~%s' % r2['uname']}})

                print '合并到app用户'
                print db.app_user.update_one({'_id': r2['_id']}, {
                    '$set': {
                        'openid': uname['openid'],
                        'address': r['address'] + r2['address'],
                        'coupon': r['coupon'] + r2['coupon'],
                    }
                })
                # 使微信帐户不能再使用
                db.app_user.update_one(
                    {'_id': r['_id']},
                    {'$set': {
                        'openid': u'~%s' % uname['openid']
                    }})
            else:
                # 手机号码还未注册过
                db.app_user.update_one({'openid': uname['openid']},
                                       {'$set': {
                                           'uname': r['phone']
                                       }})

            # 更新session里的uname
            db.app_sessions.update_one({'session_id': param.session_id},
                                       {'$set': {
                                           'uname': r['phone']
                                       }})

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'login': True,
                    'addr': addr,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 15
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='')
		print 'order_detail: ', param

		if param.order_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1, 'credit':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			image_host = 'http://%s/image/product' % setting.image_host

			# 获得订单
			#print param.order_id, uname
			db_order = db.order_app.find_one({'order_id' : param.order_id, 'user':{'$in':uname.values()}})
			if db_order==None:
				return json.dumps({'ret' : -3, 'msg' : '未找到订单!'})

			if db_order.get('order_source')=='wx_tuan':
				r0 = db.pt_order.find_one({'pt_order_id':db_order['pt_order_id']})

				cart=[]
				for i in db_order['cart']:
					r2 = db.pt_store.find_one({'tuan_id':i['tuan_id']})
					image = r2['image'][0] if r2.has_key('image') and len(r2['image'])>0 else ''

					cart.append({
						'tuan_id' : i['tuan_id'],
						'title1'  : r2['title'],
						'price'   : r2['tuan_price'] if r0['type']=='TUAN' else r2['price'],
						'image'   : '%s/%s/%s' % (image_host, image[:2], image),
						'type'    : '%d人团'%r2['tuan_size'] if r0['type']=='TUAN' else '单人购买',
						'status'  : r0['status']
					})

				data = {
					'type' : 'TUAN', 
					'order_id' : db_order['order_id'],
					'pt_order_id' : db_order['pt_order_id'], 
					'region_id' : db_order['region_id'], 
					'status' : helper.ORDER_STATUS['APP'].get(db_order['status'],'未知状态'),  # 需要中文名
					'deadline' : db_order['deadline']-int(time.time()), # 离支付截至的时间,秒数
					'delivery'     : {
						'addr_id'     : db_order['address'][0],
						'address'     : db_order['address'][3] if len(db_order['address'])<9 else ''.join(xx for xx in db_order['address'][8].split(','))+db_order['address'][3],
						'contact'     : db_order['address'][1],
						'contact_tel' : db_order['address'][2],
						'runner'      : db_order['runner']['name'] if db_order.has_key('runner') else '', # 送货员姓名
						'runner_tel'  : db_order['runner']['tel'] if db_order.has_key('runner') else '', # 送货员电话
					}, 

					'cart' : cart,
					'total'        : db_order['total'],
					'coupon'       : db_order['coupon'][0] if db_order['coupon'] else '',
					'coupon_disc'  : db_order['coupon_disc'],
					'due'          : db_order['due'],
				}
			else:
				cart=[]
				for i in db_order['cart']:
					r = db.sku_store.find_one({'product_id':i['product_id']},
						{'base_sku':1})
					base_sku = db.dereference(r['base_sku'])
					image = base_sku['image'][0] if base_sku.has_key('image') and len(base_sku['image'])>0 else ''
					cart.append({
						'product_id' : i['product_id'],
						'title'      : i['title'],
						'price'      : i['price'],
						'num2'       : i['num2'],
						'numyy'      : i.get('numyy',0), # v3 使用
						'image'      : '%s/%s/%s' % (image_host, image[:2], image),
					})

				data={
					'order_id'     : db_order['order_id'],
					'type'         : 'HOUR',
					'shop_id'      : str(db_order['shop']), # 需要中文名
					'status'       : helper.ORDER_STATUS['APP'].get(db_order['status'],'未知状态'),  # 需要中文名
					'deadline'     : db_order['deadline']-int(time.time()), # 离支付截至的时间,秒数
					'delivery'     : {
						'addr_id'     : db_order['address'][0],
						'address'     : db_order['address'][3] if len(db_order['address'])<9 else ''.join(xx for xx in db_order['address'][8].split(','))+db_order['address'][3],
						'contact'     : db_order['address'][1],
						'contact_tel' : db_order['address'][2],
						'runner'      : db_order['runner']['name'] if db_order.has_key('runner') else '', # 送货员姓名
						'runner_tel'  : db_order['runner']['tel'] if db_order.has_key('runner') else '', # 送货员电话
					}, 
					'cart'         : cart,
					'total'        : db_order['total'],
					'coupon'       : db_order['coupon'][0] if db_order['coupon'] else '',
					'coupon_disc'  : db_order['coupon_disc'],
					'first_disc'   : db_order['first_disc'],
					'delivery_fee' : db_order['delivery_fee'],
					'due'          : db_order['due'],
					'star'         : db_order.get('star', 1),
					'credit'       : '%.2f' % db_user.get('credit', 0.0),
				}

			data['history']=[] # 返回订单历史
			for i in db_order['history']:
				data['history'].append({
					'time'   : i[0],
					'action' : i[2],
				})
			pay_type = db_order.get('pay_type')
			if pay_type=='CREDIT':
				data['pay_type']='余额支付'
			elif pay_type=='ALIPAY':
				data['pay_type']='支付宝'
			elif pay_type=='WXPAY':
				data['pay_type']='微信支付'
			else:
				data['pay_type']='n/a'

			print data

			return json.dumps({'ret' : 0, 'data' : data})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 16
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          name='',
                          tel='',
                          addr='',
                          city='')

        if '' in (param.name, param.tel, param.addr, param.city):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            # 判断地址是否有对应门店,否则不在送货范围内
            alert = False
            sort_tick = int(time.time())
            message = ''

            # 获得 收货地址 坐标, 设置城市, v3
            ret, loc = lbs.addr_to_loc(param.addr.strip().encode('utf-8'),
                                       city=param.city.strip().encode('utf-8'))
            print ret, loc
            if ret < 0:
                loc = {'lat': 0, 'lng': 0}
                alert = False  #True
                message = '地址定位失败,请重新输入地址'
                sort_tick = 0
            else:
                poly_shop, loc_shop = lbs.locate_shop((loc['lat'], loc['lng']))
                if poly_shop == None:
                    print '不在配送范围内'
                    alert = False  # True  # 拼团不提示
                    message = '很抱歉,收货地址不在配送范围内,请更改地址'  #,整箱预售商品可正常购买'
                    sort_tick = 0

            # 更新个人资料
            new_addr = (
                app_helper.my_rand(),
                param.name.strip(),
                param.tel.strip(),
                param.addr.strip(),
                sort_tick,
                loc,
                '',  # app 的title
                '',  # app 的detail
                param.city.strip(),
            )
            r = db.app_user.update_one({'openid': uname['openid']},
                                       {'$push': {
                                           'address': new_addr
                                       }})

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'addr_id': new_addr[0],
                    'alert': alert,
                    'message': message,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 17
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          region_id='',
                          tuan_id='',
                          pt_order_id='')

        if '' in (param.region_id, param.tuan_id):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            now_tick = int(time.time())

            # 有效的tuan
            db_sku = db.pt_store.find_one({
                'tuan_id': param.tuan_id,
                'region_id': {
                    '$in': [param.region_id]
                },
                #'online'      : { '$in' : [ param.region_id ] },
                #'expire_tick' : { '$gt' : now_tick } # 过期不能查看
            })
            if db_sku == None:
                return json.dumps({'ret': -2, 'msg': 'tuan_id错误'})

            image_host = 'http://%s/image/product' % setting.image_host

            # 准备返回结果
            data = {
                'region_id':
                param.region_id,
                'tuan_id':
                db_sku['tuan_id'],
                'title':
                db_sku['title'],
                'desc':
                db_sku['desc'],
                'price':
                db_sku['price'],
                'tuan_price':
                db_sku['tuan_price'],
                'ref_price':
                db_sku['ref_price'],
                'volume':
                '%d件' % db_sku['volume'],
                'promote':
                True if db_sku['promote'] == 1 else False,
                'promote_img':
                '%s/images/promote.png' % image_host,
                'image':
                ['%s/%s/%s' % (image_host, x[:2], x) for x in db_sku['image']],
                'tuan_size':
                db_sku['tuan_size'],
                'sale_out':
                True if db_sku['sale_out'] == 1 else False,
                'expired':
                True if db_sku['expire_tick'] < now_tick else False,
                'pt_order_id':
                param.pt_order_id,
                'status':
                '',
                'position':
                'VISITOR',  # 缺省为游客
            }

            # 已下架,显示售罄
            if param.region_id not in db_sku['online']:
                data['sale_out'] = True

            # 过期也显示售罄
            if data['expired']:
                data['sale_out'] = True

            # 图片
            #if base_sku.has_key('image'):
            #	data['image']=['/%s/%s' % (i[:2], i) for i in base_sku['image']]
            #	if len(data['image'])>1: # 如果不止一张图,第2张开始时详情图
            #		data['image'].pop(0) # 把第1张去除
            #else:
            #	data['image']=''

            # 设置标签 2015-09-27
            if data['promote'] > 0:
                for j in app_helper.left_tag['tags']:
                    if db_sku['tuan_id'] in j['skus']:
                        data['promote_img'] = image_host + j['tag']
                        break

            if len(param.pt_order_id) > 0:  # 存在pt_order_id
                db_order = db.pt_order.find_one(
                    {'pt_order_id': param.pt_order_id})
                if db_order:
                    data['status'] = db_order['status']  # 返回订单状态
                    if db_order['status'] == 'OPEN':
                        # 如果拼团中,按实际情况显示售罄,忽略下架
                        data['sale_out'] = True if db_sku[
                            'sale_out'] == 1 else False

                    for i in db_order['member']:  # 查找是否已参团
                        if i['openid'] == uname['openid']:
                            data['position'] = i['position']
                            break

            # 返回
            #print data

            return json.dumps({'ret': 0, 'data': data})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 18
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          region_id='',
                          pt_order_id='')

        print param

        if '' in (param.pt_order_id, param.region_id):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']}, {
                'coupon': 1,
                'credit': 1
            })
            if db_user == None:  # 不应该发生
                print '-5'
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 刷新订单状态,过期的OPEN活动变为FAIL1, 个人订单已付款的变为FAIL_TO_REFUND
            r2 = db.pt_order.find(
                {
                    'status': 'OPEN',
                    'expire_tick': {
                        '$lt': int(time.time())
                    }
                }, {'pt_order_id': 1})
            for x in r2:
                # 已付款的已付款的变为FAIL_TO_REFUND
                db.order_app.update_many(
                    {
                        'pt_order_id': x['pt_order_id'],
                        'status': 'PAID_AND_WAIT'
                    }, {
                        '$set': {
                            'status': 'FAIL_TO_REFUND',
                            'man': 1
                        },
                        '$push': {
                            'history':
                            (app_helper.time_str(), 'system', '超时成团失败')
                        }
                    })
                #过期的OPEN活动变为FAIL1,
                r3 = db.pt_order.find_one_and_update({'_id': x['_id']}, {
                    '$set': {
                        'status': 'FAIL1'
                    },
                    '$push': {
                        'history': (app_helper.time_str(), 'system', '超时成团失败')
                    }
                }, {'member': 1})
                print '发微信通知'
                for x in r3['member']:
                    print app_helper.wx_reply_msg(
                        x['openid'],
                        '很抱歉,你参加的拼团活动已过24小时,人数不足未能成团,我们将在1-3个工作日内为您安排退款到支付帐户')

            image_host = 'http://%s/image/product' % setting.image_host

            # 获得订单
            #print param.order_id, uname
            db_order = db.pt_order.find_one({
                'pt_order_id': param.pt_order_id,
                #'member.openid' : uname['openid'],
            })
            if db_order == None:
                print '-3'
                return json.dumps({'ret': -3, 'msg': '未找到订单!'})

            if db_order['status'] in ['WAIT', 'FAIL3'
                                      ] or db_order['type'] == 'SINGLE':
                # 不显示未开团成功订单和单人购买
                print '-4'
                return json.dumps({'ret': -4, 'msg': '忽略的订单!'})

            db_sku = db.pt_store.find_one({'tuan_id': db_order['tuan_id']})
            image = [
                '%s/%s/%s' % (image_host, x[:2], x) for x in db_sku['image']
            ]

            # 当前用户身份
            position = 'VISITOR'
            member = []
            for i in db_order['member']:
                if i['openid'] == uname['openid']:
                    position = i['position']

                r2 = db.app_user.find_one({'openid': i['openid']}, {
                    'wx_nickname': 1,
                    'wx_headimgurl': 1
                })
                member.append({
                    'name': r2.get('wx_nickname', '???'),  # 微信中文昵称
                    'position': i['position'],
                    'time': i['time'],
                    'image': r2.get('wx_headimgurl', ''),  # 取自微信头像
                })

            # 准备返回数据
            now_tick = int(time.time())
            data = {
                "region_id":
                db_order['region_id'],
                "tuan_id":
                db_order['tuan_id'],
                'pt_order_id':
                db_order['pt_order_id'],
                'position':
                position,
                "title1":
                db_sku['title'],
                "image":
                image,
                "status":
                db_order['status'],
                "due":
                db_sku['tuan_price'],
                "type":
                '%d人团' % db_sku['tuan_size'],
                "need":
                db_order['need'],
                "time_remain":
                max(db_order['expire_tick'] - now_tick, 0),
                "time_used": (now_tick - db_order['create_tick'])
                if not db_order.has_key('succ_tick') else
                (db_order['succ_tick'] - db_order['create_tick']),
                "members":
                member,
            }

            #print data

            return json.dumps({'ret': 0, 'data': data})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 19
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', pt_order_id='', order_id='', type='', total='')

		print param

		if '' in (param.total, param.type):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if web.ctx.has_key('environ'):
			client_ip = web.ctx.environ['REMOTE_ADDR']
		else:
			return json.dumps({'ret' : -5, 'msg' : '无法取得客户端ip地址'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_shop = db.base_shop.find_one({'_id':ObjectId(setting.default_shop)},{'name':1})

			db_session = db.app_sessions.find_one({'session_id':param.session_id},{'ticket':1}) 
			ticket = db_session.get('ticket','')

			# 修改为付款的过期订单
			r = db.order_app.update_many({
				'uname'    : {'$in' : uname.values()},
				'status'   : 'DUE',
				'deadline' : {'$lt':int(time.time())}
			}, {'$set': {'status':'TIMEOUT'}})

			# 统一下单接口获取 prepay_id
			nonce_str = app_helper.my_rand(30)
			body = 'U掌柜app'
			trade_type = 'JSAPI'
			if len(param.order_id)>0:
				#order_id = '%s_%d' % (param.order_id.encode('utf-8'), int(time.time()))
				order_id = param.order_id.encode('utf-8')
			else:
				# 生成order_id, 2015-10-29
				order_id = app_helper.get_new_order_id('x').encode('utf-8')
				# 拼团订单 t 开头
				if param.type=='TUAN':
					order_id = 't'+order_id[1:]
			total_fee = param.total.encode('utf-8')
			openid = uname['openid'].encode('utf-8')
			para = [
				('appid'            , wx_appid),
				('body'             , body),
				('mch_id'           , mch_id),
				('nonce_str'        , nonce_str),
				('notify_url'       , notify_url),
				('openid'           , openid),
				('out_trade_no'     , order_id),
				('spbill_create_ip' , client_ip),
				('total_fee'        , total_fee),
				('trade_type'       , trade_type)
			]

			#print para

			stringA = '&'.join('%s=%s' % i for i in para)
			stringSignTemp = '%s&key=%s' % (stringA, api_key)
			sign = hashlib.md5(stringSignTemp).hexdigest().upper()

			para_xml = '<xml>' \
				'<appid>'+wx_appid+'</appid>' \
				'<mch_id>'+mch_id+'</mch_id>' \
				'<nonce_str>'+nonce_str+'</nonce_str>' \
				'<sign>'+sign+'</sign>' \
				'<body>'+body+'</body>' \
				'<out_trade_no>'+order_id+'</out_trade_no>' \
				'<total_fee>'+total_fee+'</total_fee>' \
				'<spbill_create_ip>'+client_ip+'</spbill_create_ip>' \
				'<notify_url>'+notify_url+'</notify_url>' \
				'<trade_type>'+trade_type+'</trade_type>' \
				'<openid>'+openid+'</openid>' \
				'</xml>'

			print para_xml
			#return json.dumps({'ret' : 0, 'data' : 'here'})

			urllib3.disable_warnings()
			pool = urllib3.PoolManager(num_pools=2, timeout=180, retries=False)
			url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
			r = pool.urlopen('POST', url, body=para_xml)
			if r.status==200:
				data = r.data
				print data
				# 检查和生成订单
				if len(param.order_id)>0:
					db_order = db.order_app.find_one({'order_id':param.order_id})
					if db_order['status']!='DUE':
						print '============================== -100'
						return json.dumps({'ret' : -100, 'msg' : '订单状态变化,请确认'})

					# 再次 checkout
					if param.type=='TUAN':
						ret_json = pt_checkout( uname, {
							'region_id'   : db_order['region_id'],
							'addr_id'     : db_order['address'][0],
							'coupon_id'   : db_order['coupon'][0] if float(db_order['coupon_disc'])>0 else '',
							'cart'        : json.dumps(db_order['cart']),
							'pt_order_id' : db_order['pt_order_id'],
						})
						if ret_json['ret']<0:
							# checkout 出错
							return json.dumps({'ret' : ret_json['ret'], 'msg' : ret_json['msg']})
					else:
						ret_json = checkout( uname, {
							'shop_id'     : str(db_order['shop']),
							'addr_id'     : db_order['address'][0],
							'coupon_id'   : db_order['coupon'][0] if float(db_order['coupon_disc'])>0 else '',
							'cart'        : json.dumps(db_order['cart']),
							'order_id'    : db_order['order_id'],
						})
						if ret_json['ret']<0:
							# checkout 出错
							return json.dumps({'ret' : ret_json['ret'], 'msg' : ret_json['msg']})

						if float(ret_json['data']['due'])!=float(db_order['due']):
							# checkout后金额有变化,说明库存或优惠券有变化
							db.order_app.update_one({'order_id':param.order_id},{
								'$set'  : {'status': 'CANCEL'},
								'$push' : {'history':(app_helper.time_str(), uname['uname'], '订单取消(微信支付)')}
							})
							print '============================== -100'
							return json.dumps({'ret' : -100, 'msg' : '很抱歉,数据异常,订单已取消,请重新下单'})

					# 可支付
					db.order_app.update_one({'order_id':param.order_id},{
						'$set'  : {'wx_out_trade_no':order_id},
						'$push' : {'history':(app_helper.time_str(), uname['openid'], '提交微信支付2')}
					})
					if param.type=='TUAN':
						# 拼团订单
						return json.dumps({
							'ret'         : 0, 
							'order_id'    : param.order_id, 
							'pt_order_id' : db_order['pt_order_id'],
							'position'    : db_order['position'], 
							'data'        : data, 
							'ticket'      : ticket
						})
					else:
						# 1小时订单
						return json.dumps({
							'ret'      : 0, 
							'order_id' : param.order_id, 
							'data'     : data, 
							'ticket'   : ticket
						})
				else:
					# 生成新订单
					db_cart = db.app_user.find_one({'openid':uname['openid']},{'cart_order_wx':1})
					if param.type=='TUAN':
						# 拼团订单
						if not db_cart.has_key('cart_order_wx'):
							print 'fail: 不该发生, 缺少购物车数据'
							return json.dumps({'ret' : -9, 'msg' : '系统错误,请重试!'})

						new_order = dict(db_cart['cart_order_wx'][0])
						new_order['order_id']=order_id
						new_order['status']='DUE'
						new_order['user_note']=param.note.strip()
						new_order['wx_out_trade_no']=order_id
						new_order['history']=[(app_helper.time_str(), uname['openid'], '提交微信支付')]

						# 如果是新开团,添加pt_order
						if len(db_cart['cart_order_wx'])>1:
							new_pt_order = dict(db_cart['cart_order_wx'][1])
							new_pt_order['pt_order_id']='pt'+order_id[1:]
							new_pt_order['status']='WAIT'
							new_pt_order['history']=[(app_helper.time_str(), uname['openid'], '等待开团')]
							db.pt_order.insert_one(new_pt_order)
							# 订单数据里添加 pt_order_id
							new_order['pt_order_id']=new_pt_order['pt_order_id']

						# 再次 checkout
						ret_json = pt_checkout( uname, {
							'region_id'   : new_order['region_id'],
							'addr_id'     : new_order['address'][0],
							'coupon_id'   : new_order['coupon'][0] if float(new_order['coupon_disc'])>0 else '',
							'cart'        : json.dumps(new_order['cart']),
							'pt_order_id' : new_order['pt_order_id'],
						})
						if ret_json['ret']<0:
							print 'checkout 检查未通过,不能支付'
							return json.dumps({'ret' : -9, 'msg' : ret_json['msg']})

						db.order_app.insert_one(new_order)
						return json.dumps({
							'ret'         : 0, 
							'order_id'    : new_order['order_id'], 
							'pt_order_id' : new_order['pt_order_id'],
							'position'    : new_order['position'], # 测试
							'data'        : data, 
							'ticket'      : ticket
						})

					else:
						# 1小时订单
						new_order = dict(db_cart['cart_order_wx'])
						new_order['order_id']=order_id
						new_order['status']='DUE'
						new_order['user_note']=param.note.strip()
						new_order['wx_out_trade_no']=order_id
						new_order['history']=[(app_helper.time_str(), uname['openid'], '提交微信支付')]

						# 再次 checkout
						ret_json = checkout( uname, {
							'shop_id'     : str(new_order['shop']),
							'addr_id'     : new_order['address'][0],
							'coupon_id'   : new_order['coupon'][0] if float(new_order['coupon_disc'])>0 else '',
							'cart'        : json.dumps(new_order['cart']),
							'order_id'    : new_order['order_id'],
						})
						if ret_json['ret']<0:
							print 'checkout 检查未通过,不能支付'
							return json.dumps({'ret' : -9, 'msg' : ret_json['msg']})

						if float(ret_json['data']['due'])!=float(new_order['due']):
							# checkout后金额有变化,说明库存或优惠券有变化
							print '============================== -100'
							return json.dumps({'ret' : -100, 'msg' : '很抱歉,数据异常,请重新下单'})

						db.order_app.insert_one(new_order)
						return json.dumps({
							'ret'         : 0, 
							'order_id'    : order_id, 
							'data'        : data, 
							'ticket'      : ticket
						})
			else:
				return json.dumps({'ret' : -1, 'data' : r.status})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 20
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', region_id='')

        if param.region_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        #if not (param.page_size.isdigit() and param.page_index.isdigit()):
        #	return json.dumps({'ret' : -3, 'msg' : 'page参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            # 区别首单用户
            #ccc = db.order_app.find({'user':{'$in':uname.values()},
            #	'status':{'$nin':['DUE','TIMEOUT','CANCEL']}},{'_id':1}).count()

            now_tick = int(time.time())

            # 查找拼团商品信息清单
            condition = {
                'region_id': {
                    '$in': [param.region_id]
                },
                'online': {
                    '$in': [param.region_id]
                },
                'expire_tick': {
                    '$gt': now_tick
                }  # 过期隐藏
            }
            #if ccc > 0: # 非首单,要回避只首单可见的商品 2015-09-25
            #	condition['first_order'] = { '$ne' : 1 }

            # 取所有商品数据
            db_invent = db.pt_store.find(condition).sort([('sort_weight', 1),
                                                          ('_id', -1)])

            # 售罄的沉底
            db_invent2 = []
            db_num_0 = []
            for s in db_invent:
                if s['sale_out'] != 1:
                    db_invent2.append(s)
                else:
                    db_num_0.append(s)
            db_invent2.extend(db_num_0)

            # 取指定区间的 2015-10-29
            #start_pos = int(param.page_size)*int(param.page_index)
            #end_pos = start_pos + int(param.page_size)
            #db_invent3 = db_invent2[start_pos:end_pos]

            image_host = 'http://%s/image/product' % setting.image_host

            data = []
            for i in db_invent2:
                # 准备数据
                new_one = {
                    'tuan_id':
                    i['tuan_id'],
                    'title':
                    i['title'],
                    'desc':
                    i['desc'],
                    'price':
                    i['price'],
                    'tuan_price':
                    i['tuan_price'],
                    'ref_price':
                    i['ref_price'],
                    'volume':
                    '%d件' % i['volume'],
                    'promote':
                    True if i['promote'] == 1 else False,
                    'promote_img':
                    '%s/images/promote.png' % image_host,
                    'image':
                    ['%s/%s/%s' % (image_host, x[:2], x) for x in i['image']],
                    'tuan_size':
                    i['tuan_size'],
                    'sale_out':
                    True if i['sale_out'] == 1 else False,
                    'expired':
                    True if i['expire_tick'] < now_tick else False,
                }

                # 设置标签 2015-09-27
                if new_one['promote'] > 0:
                    for j in app_helper.left_tag['tags']:
                        if i['tuan_id'] in j['skus']:
                            new_one['promote_img'] = image_host + j['tag']
                            break

                data.append(new_one)

            #print data

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'region_id': param.region_id,
                    'total': len(data),
                    'tuans': data,
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 21
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', shop_id='', product_id='')

        if '' in (param.shop_id, param.product_id):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:

            # 有效的sku
            db_sku = db.sku_store.find_one({'product_id': param.product_id}, {
                'product_id': 1,
                'base_sku': 1,
                'app_title': 1,
                'is_onsale': 1,
                'special_price': 1,
                'promote': 1,
                'list_in_app': 1,
                'maximun': 1,
                'volume': 1,
            })

            base_sku = db.dereference(db_sku['base_sku'])

            # 处理整箱预售
            if db_sku['list_in_app'] == -3:  # 关闭整箱  2015-10-27
                shop_id = setting.B3_shop  # B3整箱预售虚拟店
            else:
                shop_id = param.shop_id

            # 查找商品详情
            db_invent = db.inventory.find_one(
                {
                    'shop': ObjectId(shop_id),
                    'product_id': param.product_id,
                    'list_in_app': {
                        '$ne': 0
                    },
                },
                {
                    'product_id': 1,
                    #'category'    : 1, # 品类,从sku_store来的
                    #'sort_weight' : 1,
                    'sku': 1,
                    'price': 1,  # 门店价
                    'num': 1,  # 库存数
                },
            )

            # 准备返回结果
            data = {
                'product_id':
                db_invent['product_id'],
                'title':
                db_sku['app_title'],
                'abstract':
                base_sku['abstract'],
                'price':
                db_invent['price'],
                'num':
                db_invent['num'],
                'promote':
                db_sku['promote'],
                'promote_img':
                app_helper.left_tag['default2'],
                'detail_url':
                '',
                'volume':
                '%d件' % int(db_sku.get('volume', 0)),  # 销量,需要后台实现
                'max_can_buy':
                max(int(db_invent['num']), 0)
                if int(db_sku['maximun']) == 0 else int(db_sku['maximun']),
                'message':
                '' if int(db_sku['maximun']) == 0 else '该商品每单限购%d件' %
                int(db_sku['maximun'])
            }

            # 是否有优惠价格
            if db_sku['is_onsale'] == 1 and float(
                    db_sku['special_price']) < float(db_invent['price']):
                # 优惠价格比门店价格低
                data['sale_price'] = db_sku['special_price']

            # 图片
            if base_sku.has_key('image'):
                #if len(base_sku['image'])>1:
                #	i = base_sku['image'][1] # 第2张是详情图
                #else:
                #	i = base_sku['image'][0]
                #data['image']=['/%s/%s' % (i[:2], i)]
                data['image'] = [
                    '/%s/%s' % (i[:2], i) for i in base_sku['image']
                ]
                if len(data['image']) > 1:  # 如果不止一张图,第2张开始时详情图
                    data['image'].pop(0)  # 把第1张去除

            else:
                data['image'] = ''

            # 设置标签 2015-09-27
            if data['promote'] > 0:
                for j in app_helper.left_tag['tags']:
                    if db_invent['product_id'] in j['skus']:
                        data['promote_img'] = j['tag']
                        break

            data['max_can_buy'] = int(db_sku['maximun'])  # 0 表示不限购
            # 设置买X送Y
            if db_invent['product_id'] in app_helper.buy_X_give_Y.keys():
                data['xx'] = app_helper.buy_X_give_Y[
                    db_invent['product_id']][0]
                data['yy'] = app_helper.buy_X_give_Y[
                    db_invent['product_id']][1]
            else:
                data['xx'] = 100000
                data['yy'] = 0

            data['only_one'] = app_helper.only_one
            data['only_one_message'] = '每单只能购买1种该促销活动商品'

            # 返回
            return json.dumps({'ret': 0, 'data': data})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 22
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          shop_id='',
                          order_id='',
                          addr_id='',
                          coupon_id='',
                          cart='')

        if '' in (param.shop_id, param.addr_id, param.cart):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one(
                {'openid': uname['openid']},  #, 'mice':{'$ne':1}},
                {
                    'coupon': 1,
                    'address': 1,
                    'credit': 1,
                    'mice': 1
                })
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -9, 'msg': '未找到用户信息'})

            # 检查mice, 排除白名单
            if db_user.get('mice') == 1 and uname[
                    'uname'] not in app_helper.WHITE_LIST:
                print 'mice !!!'
                return json.dumps({'ret': -9, 'msg': '未找到用户信息'})

            # 先要核对送货地址是否在门店送货范围内!!!!!!! -- 需补充

            # 查找shop
            db_shop = db.base_shop.find_one({'_id': ObjectId(param.shop_id)})
            if db_shop == None:
                return json.dumps({'ret': -6, 'msg': 'shop_id错误'})

            # 查询收货地址
            address = None
            for i in db_user['address']:
                if i[0] == param.addr_id:
                    address = list(i)
                    break
            if address == None:
                return json.dumps({'ret': -7, 'msg': 'addr_id错误'})

            ###########################################################################
            # 用收货电话检查黄牛 2015-08-22
            db_recv = db.recv_tel.find_one({'tel': address[2]})
            if db_recv:
                one_more = 0
                if uname['openid'] not in db_recv['unames']:  # 补充疑似账号
                    db.recv_tel.update_one(
                        {'tel': address[2]},
                        {'$push': {
                            'unames': uname['openid']
                        }})
                    one_more = 1
                if len(db_recv['unames']) + one_more > 10:  # 改为10,2015-10-12
                    # 发现 mice
                    mice = 1
                    for b in db_recv['unames']:
                        if b in app_helper.WHITE_LIST:  # 过滤白名单相关号码
                            mice = 0
                            break
                    db.app_user.update_many(
                        {'uname': {
                            '$in': db_recv['unames']
                        }}, {'$set': {
                            'mice': mice
                        }})
                    db.app_user.update_many(
                        {'openid': {
                            '$in': db_recv['unames']
                        }}, {'$set': {
                            'mice': mice
                        }})
                    if one_more == 1:
                        db.app_user.update_one({'openid': uname['openid']},
                                               {'$set': {
                                                   'mice': mice
                                               }})
                    if mice == 1:
                        print '!!! mice:', address[
                            2]  #, uname, db_recv['unames']
                        return json.dumps({'ret': -9, 'msg': '黄牛下单1'})
            else:
                db.recv_tel.insert_one({
                    'tel': address[2],
                    'unames': [uname['openid']]
                })
                #print 'insert', address[2].encode('utf-8')

            # 用收货地址检查黄牛, 不准确,不能标注 2015-08-23
            db_recv = db.recv_addr.find_one({'addr': address[3]})
            if db_recv:
                one_more = 0
                if uname['openid'] not in db_recv['unames']:
                    db.recv_addr.update_one(
                        {'addr': address[3]},
                        {'$push': {
                            'unames': uname['openid']
                        }})
                    one_more = 1
                if len(db_recv['unames']) + one_more > 10:  # 改为10,2015-10-12
                    # 发现疑似mice,不标注,因为不确定
                    print '!!! maybe a mice:', address[3].encode(
                        'utf-8')  #, uname['openid'], db_recv['unames']
            else:
                db.recv_addr.insert_one({
                    'addr': address[3],
                    'unames': [uname['openid']]
                })
                #print 'insert', address[2]

            # 查黄牛-结束
            ###########################################################################

            # 查找优惠券
            # 未查到,则不使用优惠券
            coupon = None
            for i in db_user['coupon']:
                if i[0] == param.coupon_id:
                    coupon = list(i)
                    break

            # 转换cart数据为json,应该有异常捕获 !!!
            cart = json.loads(param.cart)
            #print cart

            if len(cart) == 0:
                return json.dumps({'ret': -5, 'msg': '购物车无数据'})

            if param.order_id == '':
                #cc = 1
                #while cc!=None:
                #	# 取得sku计数, 不与线下order共用
                #	db_sa = db.user.find_one_and_update(
                #		{'uname'    : 'settings'},
                #		{'$inc'     : {'app_count' : 1}},
                #		{'app_count' : 1}
                #	)
                #	order_id = 'n%06d' % db_sa['app_count']
                #	# 防止订单号重复
                #	cc = db.order_app.find_one({'order_id'  : order_id},{'_id':1})
                order_id = app_helper.get_new_order_id('vx')
                print 'new order_id', order_id
            else:
                order_id = param.order_id

                cc = db.order_app.find_one(
                    {
                        #'uname'     : {'$in':uname.values()}, # 防止app的bug,重复order_id
                        'order_id': order_id,
                    },
                    {
                        'status': 1,
                    })
                if cc != None and cc[
                        'status'] != 'DUE':  # 检查订单状态,只有due才可以checkout
                    print "BUG! order_id status"
                    return json.dumps({'ret': -99, 'msg': '订单状态错误'})

            # 订单状态:DUE, PAID, ONROAD, COMPLETED, CANCELED, FINISH
            # 默认运费 5元,免邮门槛 29元
            order = {
                'status': 'DUE',
                'uname': uname['openid'],
                'shop': db_shop['_id'],
                'user': uname['openid'],
                'order_id': order_id,
                'order_source': 'weixin',  # 2015-10-20
                'address': address,  # 收货地址
                'coupon': coupon,  # 使用的优惠券
                'cart': [],
                'cost': '0.00',  # 成本合计,参考
                'total': '0.00',  # 价格小计,加项
                'coupon_disc': '0.00',  # 优惠券抵扣,减项
                'first_disc': '0.00',  # 首单立减, 减项
                'delivery_fee': '0.00',  # 运费,加项
                'due': '0.00',  # 应付价格
                'uname_id': db_user['_id'],
                # for processor
                'next_status': '',
                'lock': 0,
                'man': 0,
                'retry': 0,
                'comment': '',
                'b_time': int(time.time()),
                'e_time': int(time.time()),
                'deadline': int(time.time() + 60 * 15),
            }

            # item = {
            #      “product_id” : “k000011”,
            #      “num”        : “5”,
            # }
            # 应该只有 k-prod
            cart_to_return = []
            cate_001 = 0
            for item in cart:
                # sku
                db_sku = db.sku_store.find_one(
                    {'product_id': item['product_id']}, {
                        'app_title': 1,
                        'is_onsale': 1,
                        'special_price': 1,
                        'ref_price': 1,
                        'maximun': 1,
                        'list_in_app': 1,
                    })
                if db_sku == None:  # 应该不会发生
                    print 'Error: db_sku==None'
                    continue

                if db_sku['list_in_app'] == -3:  # B3 整箱预售 # 关闭 2015-10-27
                    r = db.inventory.find_one(  # 线上销售要检查库存
                     {
                      'product_id'  : item['product_id'],
                      'list_in_app' : {'$ne' : 0},
                      'shop'        : ObjectId(setting.B3_shop),
                     },
                     {
                      'cost_price'  : 1,
                      'ref_prod_id' : 1,
                      'price'       : 1,
                      'sku'         : 1,
                      'num'         : 1,
                      'category'    : 1
                     }
                    )
                else:
                    r = db.inventory.find_one(  # 线上销售要检查库存
                     {
                      'product_id'  : item['product_id'],
                      'list_in_app' : {'$ne' : 0},
                      'shop'        : db_shop['_id'],
                     },
                     {'cost_price':1, 'ref_prod_id':1, 'price':1, 'sku':1, 'num':1, 'category':1}
                    )

                if r:  # 如果库存数据中没此sku,会忽略掉,此情况应该不会发生
                    new_num = int(item['num'])
                    new_num = new_num if new_num <= r['num'] else r['num']
                    new_num = max(0, new_num)  # 发现过小于零的情况,微信

                    # 检查是不是 001 (水果) 分类
                    if r['category'] == '001':
                        cate_001 += 1

                    # 检查是否限购
                    if db_sku['maximun'] > 0:
                        '''
						# 每日限购,生成当天的时间tick
						tday = app_helper.time_str(format=1)
						begin_d = '%s 00:00:00' % tday
						end_d = '%s 23:59:59' % tday
						begin_t = int(time.mktime(time.strptime(begin_d,"%Y-%m-%d %H:%M:%S")))
						end_t = int(time.mktime(time.strptime(end_d,"%Y-%m-%d %H:%M:%S")))

						print begin_d, end_d, begin_t, end_t

						# 检查时间段内购买记录
						c = db.order_app.find({
							'uname'           : {'$in': uname.values()},
							'order_id'        : {'$ne':order_id},
							'status'          : {'$ne':'TIMEOUT'},
							'cart.product_id' : item['product_id'],
							'$and'   : [{'b_time' : {'$gt' : begin_t}},
								    {'b_time' : {'$lt' : end_t}}],
						}, {'_id':1}).count()
						print 'findings: ',c
						if c>0: # 限购商品只允许购买1次
							new_num=0
						else:
							new_num=min(new_num, db_sku['maximun'])
							print 'limit : ',new_num
						'''
                        # 每单限购
                        if new_num > db_sku['maximun']:
                            new_num = db_sku['maximun']
                            print 'limit : ', new_num
                    '''
					# 买一送一 每单限购1件
					if item['product_id'] in app_helper.buy_1_give_1:
						#new_num=min(new_num, 1)
						#print 'buy 1 give 1 limit : ',new_num
						new_item = {
							'product_id' : item['product_id'],
							'num'        : '%d' % new_num,
							'num2'       : new_num,
							'price'      : r['price'],
							'title'      : db_sku['app_title'],
						}
					else:
					'''
                    new_item = {
                        'product_id': item['product_id'],
                        'num': item['num'],
                        'num2': new_num,
                        'price': r['price'],
                        'title': db_sku['app_title'],
                    }

                    # 是否有优惠价格
                    if db_sku['is_onsale']==1 and \
                     float(db_sku['special_price'])<float(r['price']):
                        # 优惠价格比门店价格低
                        new_item['price'] = db_sku['special_price']

                    # 计算总价
                    item_price = round(new_num * float(new_item['price']), 2)
                    new_item['price'] = '%.2f' % item_price

                    cart_to_return.append(new_item)  # 返回到app的cart不包含cost

                    cost_price = r['cost_price']

                    #if item[0][0]=='w': # w-prod 信息都用 u-prod的替换
                    #	new_item['product_id'] = r['ref_prod_id']
                    #	new_item['w_id'] = item[0]
                    #	# 查询成本, 从对应u-prod当前成本
                    #	r2 = db.inventory.find_one({ # u-prod
                    #		'shop'       : db_shop['shop'],
                    #		'product_id' : r['ref_prod_id'],
                    #	}, {'cost_price':1})
                    #	cost_price = r2['cost_price']

                    # 计算成本
                    item_cost = round(new_num * float(cost_price), 2)
                    new_item['cost'] = '%.2f' % item_cost

                    # 加入cart
                    order['cart'].append(new_item)

                    # 累计售价和成本
                    order['total'] = '%.2f' % (float(order['total']) +
                                               item_price)
                    order['cost'] = '%.2f' % (float(order['cost']) + item_cost)
                else:
                    # 店内未找到库存, !!!应该不会发生
                    new_item = {
                        'product_id': item['product_id'],
                        'num': item['num'],
                        'num2': 0,
                        'price': '0.00',
                        'cost': '0.00',
                        'title': db_sku['app_title'],
                    }
                    cart_to_return.append(new_item)  # 返回到app的cart不包含cost
                    order['cart'].append(new_item)

            tt = float(order['total'])
            if tt > 0:
                # 免邮门槛
                #if tt<29: # 免邮门槛 29
                if tt < app_helper.free_delivery:  # 免邮门槛
                    order[
                        'delivery_fee'] = '%.2f' % app_helper.delivery_fee  # 运费5元
                '''
				# 首单立减 first_promote元, 商品总额大于 first_promote_threshold元
				print cate_001
				cut_now = app_helper.first_promote #10
				if cate_001>0 and (tt+float(order['delivery_fee']))>=app_helper.first_promote_threshold and \
					db.order_app.find({'user':{'$in':uname.values()}, 'status':{'$nin':['DUE','TIMEOUT','CANCEL']}},{'_id':1}).count()==0:
					order['first_disc'] = '%.2f' % cut_now
				'''

                # 首单立减 first_promote元, 商品总额大于 first_promote_threshold元
                if cate_001 > 0 and db.order_app.find(
                    {
                        'user': {
                            '$in': uname.values()
                        },
                        'status': {
                            '$nin': ['DUE', 'TIMEOUT', 'CANCEL']
                        }
                    }, {
                        '_id': 1
                    }).count() == 0:
                    # 符合首单条件,且有一个水果商品
                    print '首单'
                    if str(db_shop['_id']) in app_helper.first_promote2_shop and \
                     (tt+float(order['delivery_fee']))>=app_helper.first_promote2_threshold:
                        # 站点落在 指定站点范围内,使用首单立减2
                        print '首单立减 - 指定站点'
                        order[
                            'first_disc'] = '%.2f' % app_helper.first_promote2
                    elif (tt + float(order['delivery_fee'])
                          ) >= app_helper.first_promote_threshold:
                        # 其他站点使用首单立减1
                        print '首单立减'
                        order['first_disc'] = '%.2f' % app_helper.first_promote

                # 优惠券, 检查有效期, 优惠券门槛为10元
                if float(order['first_disc'])==0.0 and coupon!=None and \
                 coupon[3]==1 and app_helper.time_str(format=1)<=coupon[1]:
                    if len(coupon
                           ) > 5 and coupon[5] == 'apple' and cate_001 < 1:
                        # 水果券,但没有水果 2015-09-29
                        print '水果券没水果'
                        order['coupon'] = None
                    elif len(coupon) > 5 and coupon[5] == 'b3' and b3_sku < 1:
                        # 整箱券,但没有整箱 2015-10-18
                        print '整箱券没整箱'
                        order['coupon'] = None
                    else:
                        if len(coupon) > 4:
                            # (id, 有效期, 金额, 是否已用, 门槛) 2015-09-27
                            # 有门槛信息,使用优惠券门槛信息
                            if (tt + float(order['delivery_fee'])) < coupon[4]:
                                order['coupon'] = None
                            else:
                                order['coupon_disc'] = coupon[2]
                        else:
                            # 使用默认条件
                            if float(coupon[2]) == 6.0 and (
                                    tt + float(order['delivery_fee'])) < 29.9:
                                order['coupon'] = None
                            elif float(coupon[2]) == 9.0 and (
                                    tt + float(order['delivery_fee'])) < 39.9:
                                order['coupon'] = None
                            elif (tt + float(order['delivery_fee'])) < 14.9:
                                order['coupon'] = None
                            else:
                                order['coupon_disc'] = coupon[2]
                else:
                    order['coupon'] = None

                # 计算应付:价格合计 - 优惠券 - 首单立减 + 运费
                print(tt + float(order['delivery_fee']) -
                      float(order['coupon_disc']) - float(order['first_disc']))
                print tt, float(order['delivery_fee']), float(
                    order['coupon_disc']), float(order['first_disc'])
                order['due'] = '%.2f' % (tt + float(order['delivery_fee']) -
                                         float(order['coupon_disc']) -
                                         float(order['first_disc']))

                if float(order['due']) <= 0:
                    order['due'] = '0.10'

            # 如果没有,则insert
            #db.order_app.replace_one({'order_id':order_id}, order, upsert=True)
            db.order_app.update_one({'order_id': order_id}, {
                '$set': order,
                '$push': {
                    'history': (app_helper.time_str(), uname['openid'], '提交结算')
                }
            },
                                    upsert=True)

            print cart_to_return

            return json.dumps({  # 返回结果,实际有库存的结果,
                'ret': 0,
                'data': {
                    'order_id': order['order_id'],
                    'shop_id': str(order['shop']),
                    'shop': db_shop['name'],  # 可能会变,如果地址与门店不匹配的时候
                    'addr_id': address[0],
                    'cart_num': len(order['cart']),
                    'cart': cart_to_return,
                    'total': order['total'],
                    'coupon': coupon[0] if order['coupon'] else '',
                    'coupon_disc': order['coupon_disc'],
                    'first_disc': order['first_disc'],
                    'delivery_fee': order['delivery_fee'],
                    'due': order['due'],
                    'credit': '%.2f' % db_user.get('credit', 0.0)
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 23
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', region_id='', query='')

		if '' in (param.query, param.region_id):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1, 'credit':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 刷新订单状态,过期的OPEN活动变为FAIL1, 个人订单已付款的变为FAIL_TO_REFUND
			r2 = db.pt_order.find({
				'status'      : 'OPEN',
				'expire_tick' : {'$lt' : int(time.time()) }
			}, { 'pt_order_id':1 })
			for x in r2:
				# 已付款的已付款的变为FAIL_TO_REFUND
				db.order_app.update_many({'pt_order_id':x['pt_order_id'],'status':'PAID_AND_WAIT'},
					{
						'$set'  : {'status'  : 'FAIL_TO_REFUND', 'man' : 1},
						'$push' : {'history' : (app_helper.time_str(), 'system', '超时成团失败')}
					}
				)
				#过期的OPEN活动变为FAIL1,
				r3 = db.pt_order.find_one_and_update({'_id':x['_id']},
					{
						'$set'  : {'status'  : 'FAIL1'},
						'$push' : {'history' : (app_helper.time_str(), 'system', '超时成团失败')}
					},
					{'member':1}
				)
				print '发微信通知'
				for x in r3['member']:
					print app_helper.wx_reply_msg(x['openid'], '很抱歉,你参加的拼团活动已过24小时,人数不足未能成团,我们将在1-3个工作日内为您安排退款到支付帐户')


			# 获得订单
			#if param.query=='ALL':
			condition = {
				'region_id' : {'$in' : [ param.region_id ]},
				'$or' : [
					{'member.openid' : uname['openid']},
					{'leader'        : uname['openid']},
				],
			}

			image_host = 'http://%s/image/product' % setting.image_host

			db_pt_order = db.pt_order.find( condition ).sort([('_id',-1)])
			order_list=[]
			for i in db_pt_order:
				if i['status'] in ['WAIT','FAIL3']: # 未开团成功的团不显示
					continue
				if i['type']=='SINGLE': # 个人购买不显示
					continue

				# 取购物车中第一个商品的图片
				db_sku = db.pt_store.find_one({'tuan_id':i['tuan_id']})
				image = ['%s/%s/%s' % (image_host, x[:2], x) for x in db_sku['image']]
				# 取订单order_id
				r = db.order_app.find_one({
					'pt_order_id':i['pt_order_id'],
					'uname':uname['openid']
				}, {'order_id':1})
				if r==None:
					print 'Not found: ', i['pt_order_id']
					return json.dumps({'ret' : -5, 'msg' : '未找到order'})
				# 准备结果
				order_list.append({
					'tuan_id'     : i['tuan_id'], 
					'pt_order_id' : i['pt_order_id'], 
					'order_id'    : r['order_id'], # 订单order_id
					'title1'      : db_sku['title'], 
					'image'       : image,
					'status'      : i['status'],   
					'due'         : db_sku['tuan_price'],
					'type'        : '%d人团'%db_sku['tuan_size'],
				})

			#print order_list

			return json.dumps({
				'ret'  : 0, 
				'data' : { 
					'region_id'  : param.region_id,
					'order_list' : order_list,
				}
			})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 24
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', query='')

        if param.query == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']}, {
                'coupon': 1,
                'credit': 1
            })
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 修改为付款的过期订单
            r = db.order_app.update_many(
                {
                    'uname': {
                        '$in': uname.values()
                    },
                    'status': 'DUE',
                    'deadline': {
                        '$lt': int(time.time())
                    }
                }, {'$set': {
                    'status': 'TIMEOUT'
                }})
            #print r

            # 获得订单
            if param.query == 'ALL':
                condition = {
                    'user': {
                        '$in': uname.values()
                    },
                    'status': {
                        '$ne': 'TIMEOUT'
                    }
                }
            else:
                condition = {
                    'user': {
                        '$in': uname.values()
                    },
                    'status': QUERY.get(param.query)
                }
            db_order = db.order_app.find(
                condition, {
                    'status': 1,
                    'cart': 1,
                    'due': 1,
                    'shop': 1,
                    'history': 1,
                    'order_id': 1,
                    'deadline': 1
                }).sort([('order_id', -1)])
            order_list = []
            for i in db_order:
                # 取购物车中第一个商品的图片
                db_sku = db.sku_store.find_one(
                    {'product_id': i['cart'][0]['product_id']},
                    {'base_sku': 1})
                base_sku = db.dereference(db_sku['base_sku'])
                image = base_sku['image'][0] if base_sku.has_key(
                    'image') and len(base_sku['image']) > 0 else ''
                order_list.append({
                    'order_id':
                    i['order_id'],
                    'order_time':
                    i['history'][0][0],
                    'image':
                    '/%s/%s' % (image[:2], image),
                    'status':
                    helper.ORDER_STATUS['APP'].get(i['status'], '未知状态'),
                    'due':
                    i['due'],
                    'count':
                    len(i['cart']),
                })

            return json.dumps({
                'ret': 0,
                'data': {
                    'order_list': order_list,
                    'credit': '%.2f' % db_user.get('credit', 0.0)
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 25
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', order_id='')

        if param.order_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']}, {
                'coupon': 1,
                'credit': 1
            })
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 获得订单
            #print param.order_id, uname
            db_order = db.order_app.find_one({
                'order_id': param.order_id,
                'user': {
                    '$in': uname.values()
                }
            })
            if db_order == None:
                return json.dumps({'ret': -3, 'msg': '未找到订单!'})

            cart = []
            for i in db_order['cart']:
                r = db.sku_store.find_one({'product_id': i['product_id']},
                                          {'base_sku': 1})
                base_sku = db.dereference(r['base_sku'])
                image = base_sku['image'][0] if base_sku.has_key(
                    'image') and len(base_sku['image']) > 0 else ''
                cart.append({
                    'product_id': i['product_id'],
                    'title': i['title'],
                    'price': i['price'],
                    'num2': i['num2'],
                    'image': '/%s/%s' % (image[:2], image),
                })

            data = {
                'order_id':
                db_order['order_id'],
                'shop_id':
                str(db_order['shop']),  # 需要中文名
                'status':
                helper.ORDER_STATUS['APP'].get(db_order['status'],
                                               '未知状态'),  # 需要中文名
                'deadline':
                db_order['deadline'] - int(time.time()),  # 离支付截至的时间,秒数
                'delivery': {
                    'addr_id':
                    db_order['address'][0],
                    'address':
                    db_order['address'][3],
                    'contact':
                    db_order['address'][1],
                    'contact_tel':
                    db_order['address'][2],
                    'runner':
                    db_order['runner']['name']
                    if db_order.has_key('runner') else '',  # 送货员姓名
                    'runner_tel':
                    db_order['runner']['tel']
                    if db_order.has_key('runner') else '',  # 送货员电话
                },
                'cart':
                cart,
                'total':
                db_order['total'],
                'coupon':
                db_order['coupon'][0] if db_order['coupon'] else '',
                'coupon_disc':
                db_order['coupon_disc'],
                'first_disc':
                db_order['first_disc'],
                'delivery_fee':
                db_order['delivery_fee'],
                'due':
                db_order['due'],
                'star':
                db_order.get('star', 1),
                'credit':
                '%.2f' % db_user.get('credit', 0.0),
            }

            return json.dumps({'ret': 0, 'data': data})
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 26
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', shop_id='', category='', page_size='', page_index='')

		if '' in (param.shop_id, param.category, param.page_size, param.page_index):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if not (param.page_size.isdigit() and param.page_index.isdigit()): 
			return json.dumps({'ret' : -3, 'msg' : 'page参数错误'})

		if len(param.shop_id)<24:
			return json.dumps({'ret' : -1, 'msg' : 'shop_id参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			# 处理整箱预售
			if param.category=='-3':  # 关闭 B3 2015-10-27
				shop_id = setting.B3_shop # B3整箱预售虚拟店
			else:
				shop_id = param.shop_id

			# 区别首单用户
			ccc = db.order_app.find({'user':{'$in':uname.values()}, 
				'status':{'$nin':['DUE','TIMEOUT','CANCEL']}},{'_id':1}).count()

			# 查找商品信息清单
			# 分页返回 find().skip(page_size*page_index).limit(page_size)
			condition = {
				'shop'        : ObjectId(shop_id),
				'category'    : param.category,
				'list_in_app' : {'$ne' : 0},
				'online'      : 1,
				#'num'         : {'$gt' : 0}, # 只显示有库存的商品
			}
			if ccc > 0: # 非首单,要回避只首单可见的商品 2015-09-25
				condition['first_order'] = { '$ne' : 1 }
			'''
			db_invent = db.inventory.find(condition, 
				{
					'product_id'  : 1,
					'category'    : 1, # 品类,从sku_store来的
					'sort_weight' : 1, 
					'sku'         : 1,
					'price'       : 1, # 门店价
					'num'         : 1, # 库存数
				},
				skip  = int(param.page_size)*int(param.page_index), 
				limit = int(param.page_size)
			).sort([('sort_weight',1), ('_id',1)])
			'''

			# 取所有商品数据 2015-10-29
			db_invent = db.inventory.find(condition, 
				{
					'product_id'  : 1,
					'category'    : 1, # 品类,从sku_store来的
					'sort_weight' : 1, 
					'sku'         : 1,
					'price'       : 1, # 门店价
					'num'         : 1, # 库存数
				},
			).sort([('sort_weight',1), ('_id',1)])

			# 库存小于零的沉底 2015-10-29
			db_invent2 = []
			db_num_0 = []
			for s in db_invent:
				if int(s['num'])>0:
					db_invent2.append(s)
				else:
					db_num_0.append(s)
			db_invent2.extend(db_num_0)

			# 取指定区间的 2015-10-29
			start_pos = int(param.page_size)*int(param.page_index)
			end_pos = start_pos + int(param.page_size)
			db_invent3 = db_invent2[start_pos:end_pos]

			invent = []
			skus = []
			for s in db_invent3:
				skus.append(s['sku'])
				invent.append((
					s['sku'],  #0
					s['price'],    #1
					s['product_id'], #2
					s['num'], #3
				))  

			# 有效的sku
			db_sku=db.sku_store.find({'_id':{'$in':skus}} ,{
				'product_id'    : 1,
				'base_sku'      : 1,
				'app_title'     : 1,
				'is_onsale'     : 1,
				'special_price' : 1,
				'promote'       : 1, 
				'maximun'       : 1,
			}).sort([('_id',1)])

			skus = {}
			for u in db_sku:
				base_sku = db.dereference(u['base_sku'])

				skus[u['_id']]=(
					base_sku['name'],   #0
					base_sku['image'][0] if base_sku.has_key('image') and len(base_sku['image'])>0 else '',
					u['app_title'],   #2
					u['is_onsale'],   #3
					u['special_price'],   #4
					base_sku['original'],   #5
					u['promote'],   #6
					u['maximun'],   #7
				)

			data = []
			for i in invent:
				# 准备数据
				new_one = {
					'product_id' : i[2],
					'title'      : skus[i[0]][2],
					#'original'   : skus[i[0]][5],
					'price'      : i[1],
					#'num'        : min(i[3],skus[i[0]][7]) if skus[i[0]][7]>0 else i[3], # 限购
					'num'        : max(int(i[3]),0),
					'promote'    : skus[i[0]][6],
					'image'      : '/%s/%s' % (skus[i[0]][1][:2], skus[i[0]][1]),
				}
				if skus[i[0]][3]==1 and float(skus[i[0]][4])<float(i[1]): # 优惠价格比门店价格低
					new_one['sale_price'] = skus[i[0]][4],
				data.append(new_one)

			# 返回最近shop
			return json.dumps({
				'ret' : 0, 
				'data' : {
					'total'      : len(data), 
					'page_size'  : int(param.page_size),
					'page_index' : int(param.page_index),
					'skus'       : data,
				}
			})

		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 27
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', type='', data='')

        if param.type == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.type not in ['GPS', 'NAME']:
            return json.dumps({'ret': -3, 'msg': 'type参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            # 准备用户坐标
            if param.type == 'NAME':
                ret, loc = lbs.addr_to_loc(param['data'].encode('utf-8'))
                print ret, loc
                if ret < 0:
                    # 重试一次,网络可能会失败
                    ret, loc = lbs.addr_to_loc(param['data'].encode('utf-8'))
                    print ret, loc
                    if ret < 0:
                        loc = {'lat': 0, 'lng': 0}

            else:
                loc0 = param.data.split(',')  # 31.20474193,121.620708272
                loc = {'lat': float(loc0[0]), 'lng': float(loc0[1])}

            # 找最近距离的店
            min_d = 999999
            min_shop = None
            poly_shop = None  # 多边形匹配
            db_shop = db.base_shop.find(
                {'type': {
                    '$in': ['chain', 'store', 'dark']
                }})
            for s in db_shop:
                if s.get('app_shop', 1) == 0:  # 忽略不支持线上销售的店
                    continue
                #d=lbs.geo_distance(s['loc']['lat'],s['loc']['lng'],loc['lat'],loc['lng'])
                #print 'd = ', d, min_d
                #if d<s.get('radius', 2) and d<min_d: # 默认半径2公里
                #	min_d=d
                #	min_shop=(s['_id'],s['name'],s['address'])

                # 多边形检查
                poly = s.get('poly_xy', [])
                if len(poly) == 0:  # 没有多边形数据
                    print "缺少多边形数据!"
                    continue
                if lbs.wn_PnPoly((loc['lat'], loc['lng']), poly) != 0:
                    print 'bingo! poly_shop'
                    poly_shop = (s['_id'], s['name'], s['address'])
                    break

            if poly_shop == None and min_shop == None:
                print '不在配送范围内'
                return json.dumps({'ret': -6, 'msg': '不在配送范围内'})

            if poly_shop == None:
                # 返回最近shop
                print 'choose:', min_shop[1].encode('utf-8')
                return json.dumps({
                    'ret': 0,
                    'data': {
                        'shop_id': str(min_shop[0]),
                        'shop_name': min_shop[1],
                        'address': min_shop[2],
                    }
                })
            else:
                # 返回多边形匹配shop
                print 'choose:', poly_shop[1].encode('utf-8')
                return json.dumps({
                    'ret': 0,
                    'data': {
                        'shop_id': str(poly_shop[0]),
                        'shop_name': poly_shop[1],
                        'address': poly_shop[2],
                    }
                })

        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 28
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='',
                          session_id='',
                          order_id='',
                          pay_type='',
                          data='')
        print param

        if '' in (param.order_id, param.pay_type):
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']}, {
                'coupon': 1,
                'credit': 1
            })
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 支付操作:1,记录订单支付,2.改变订单状态,3.修改库存显示 !!!!!!

            # 获得订单
            db_order = db.order_app.find_one(
                {'order_id': param.order_id},
                #{'status':1, 'cart':1, 'due':1, 'shop':1}
                {'_id': 0})
            if db_order == None:
                return json.dumps({'ret': -3, 'msg': '未找到订单!'})

            # 支付宝和微信支付订单,已PAID说明提前收到异步通知
            if db_order['status'] == 'PAID' and param.pay_type in ('ALIPAY',
                                                                   'WXPAY'):
                # 记录此次调用
                db.order_app.update_one({
                    'order_id': param.order_id,
                }, {
                    '$set': {
                        'pay_type': param.pay_type,
                        'pay': db_order['due'],
                        'paid2_time': app_helper.time_str(),
                        'paid2_tick': int(time.time()),
                    },
                    '$push': {
                        'history':
                        (app_helper.time_str(), uname['openid'], '提交付款')
                    },
                })
                return json.dumps({
                    'ret': 0,
                    'data': {
                        'order_id': param.order_id,
                        'due': db_order['due'],
                        'paid': db_order['due'],
                        'status': '已支付'
                    }
                })

            # 只能处理未支付订单
            if db_order['status'] != 'DUE':
                return json.dumps({'ret': -3, 'msg': '不是待付款订单!'})

            # 微信支付未到账处理
            if param.pay_type in ('ALIPAY', 'WXPAY'):
                # 更新销货单信息,
                r = db.order_app.find_one_and_update(
                    {
                        'order_id': param.order_id,
                        'status': 'DUE'
                    }, {
                        '$set': {
                            'status': 'PREPAID',
                            'pay_type': param.pay_type,
                            'pay': db_order['due'],
                            'paid2_time': app_helper.time_str(),
                            'paid2_tick': int(time.time()),
                            'pay_data': param.data,
                        },
                        '$push': {
                            'history':
                            (app_helper.time_str(), uname['openid'], '提交付款')
                        },
                    }, {'status': 1})
                # 如果不是DUE,说明已收到异步通知
                if r == None:
                    db.order_app.update_one({
                        'order_id': param.order_id,
                    }, {
                        '$set': {
                            'pay_type': param.pay_type,
                            'pay': db_order['due'],
                            'paid2_time': app_helper.time_str(),
                            'paid2_tick': int(time.time()),
                        },
                        '$push': {
                            'history':
                            (app_helper.time_str(), uname['openid'], '提交付款')
                        },
                    })

            # 返回
            return json.dumps({
                'ret': 0,
                'data': {
                    'order_id': param.order_id,
                    'due': db_order['due'],
                    'paid': db_order['due'],
                    'status': '已支付',
                    'alert': False,
                    'message': '测试信息,还未收到异步通知',
                    'url': 'http://app-test.urfresh.cn'
                }
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})
Ejemplo n.º 29
0
	def POST(self):
		web.header('Content-Type', 'application/json')
		param = web.input(openid='', session_id='', order_id='', pay_type='', data='')
		print param

		if '' in (param.order_id, param.pay_type):
			return json.dumps({'ret' : -2, 'msg' : '参数错误'})

		if param.openid=='' and param.session_id=='':
			return json.dumps({'ret' : -2, 'msg' : '参数错误1'})

		# 同时支持openid和session_id
		if param.openid!='':
			uname = app_helper.check_openid(param.openid)
		else:
			uname = app_helper.wx_logged(param.session_id)

		if uname:
			db_user = db.app_user.find_one({'openid':uname['openid']},{'coupon':1, 'credit':1})
			if db_user==None: # 不应该发生
				return json.dumps({'ret' : -5, 'msg' : '未找到用户信息'})

			# 支付操作:1,记录订单支付,2.改变订单状态,3.修改库存显示 !!!!!!

			# 获得订单
			db_order = db.order_app.find_one(
				{'order_id' : param.order_id},
				#{'status':1, 'cart':1, 'due':1, 'shop':1}
				{'_id':0}
			)
			if db_order==None:
				return json.dumps({'ret' : -3, 'msg' : '未找到订单!'})

			# 支付宝和微信支付订单,已PAID说明提前收到异步通知
			if db_order['status']=='PAID' and param.pay_type in ('ALIPAY','WXPAY'):
				# 记录此次调用
				db.order_app.update_one(
					{
						'order_id' : param.order_id,
					},
					{
						'$set' : { 
							'pay_type'   : param.pay_type,
							'pay'        : db_order['due'],
							'paid2_time' : app_helper.time_str(),
							'paid2_tick' : int(time.time()),
						},
						'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')},
					}
				)
				return json.dumps({'ret' : 0, 'data' : {
					'order_id' : param.order_id,
					'due'      : db_order['due'],
					'paid'     : db_order['due'],
					'status'   : '已支付'
				}})

			# 只能处理未支付订单
			if db_order['status']!='DUE':
				return json.dumps({'ret' : -3, 'msg' : '不是待付款订单!'})

			# 余额支付和支付宝/微信支付未到账处理

			if param.pay_type=='CREDIT':
				# 检查余额是否够支付
				if float(db_order['due'])>db_user.get('credit',0.0):
					return json.dumps({'ret' : -6, 'msg' : '余额不足!'})

				# 使用的优惠券失效
				#db_user = db.app_user.find_one({'uname':r['uname']})

				coupon = []
				if db_order['coupon']!=None:
					for i in db_user['coupon']:
						if i[0]==db_order['coupon'][0]: # 这次使用
							#coupon.append((i[0],i[1],i[2],0))
							i2=list(i)
							i2[3]=0
							coupon.append(i2)
						else:
							coupon.append(i)
				else:
					coupon = db_user['coupon']

				# 更新优惠券
				db.app_user.update_one({'openid':db_order['uname']}, {'$set':{'coupon':coupon}})

				# 正常减库存!
				# item = [ product_id, num, num2, price]
				# k - num 库存数量
				print "修改库存."

				b2 = [] # C端商品
				b3 = [] # B3整箱预售商品
				b3_total = 0.0
				for item in db_order['cart']:
					#r3 = db.sku_store.find_one({'product_id' : item['product_id']},
					#	{'list_in_app':1})
					#if r3['list_in_app']==3: # B3商品不需要改库存
					#	b3_total += float(item['price'])
					#	b3.append(item)
					#	item['title'] = item['title']+u'(整箱预售,次日送达)'
					#	b2.append(item)
					#	continue

					# 买一送一
					if item['product_id'] in app_helper.buy_1_give_1:
						lc_num2 = float(item['num2'])
						item['num2'] = int(lc_num2 + lc_num2)
						item['title'] = item['title'].replace(u'买一送一',u'特惠活动')

					# 过滤数量价格为零的
					if item['num2']==0 and float(item['price'])==0.0:
						continue

					r = db.inventory.find_one_and_update(  # 不检查库存,有可能负库存
						{
							'product_id' : item['product_id'],
							'shop'       : db_order['shop'],
						},
						{ 
							'$inc'  : { 
								'num'         : 0-float(item['num2']), # num2 实际购买数量
							 	'pre_pay_num' : float(item['num2']), # 记录预付数量
							}
							#'$push' : { 'history' : (helper.time_str(), 
							#	helper.get_session_uname(), '售出 %s' % str(item['num']))},
						},
						{'_id':1}
					)
					#print r
					if r==None: # 不应该发生
						return json.dumps({'ret' : -9, 'msg' : '修改库存失败,请联系管理员!'})
					else:
						b2.append(item)

					# 更新第3方库存 2015-10-10
					app_helper.elm_modify_num(db_order['shop'], item['product_id'])

				# 检查是否有b3商品, 3种情况
				# 1. b2, b3 都有,拆单
				# 2. 只有b3,站点改为B3站点,保留收货站点
				# 3. 只有b2,保持订单不变
				#print b2
				#print b3
				if len(b3)>0 and (len(b2)-len(b3))>0: # 情况1
					print "拆单"
					r4 = db_order.copy()
					r4['order_id']     = r4['order_id']+u'-b3'
					r4['shop_0']       = r['shop']
					r4['shop']         = ObjectId(setting.B3_shop)
					r4['cart']         = b3
					r4['status']       = 'PAID'
					r4['ali_trade_no'] = param.get('trade_no')
					r4['paid_time']    = param.get('gmt_payment')
					r4['paid_tick']    = int(time.time())
					r4['history']      = [(app_helper.time_str(), 'credit', '余额付款-拆单')]
					r4['total']        = '%.2f' % b3_total
					r4['cost']         = '0.00'
					r4['coupon_disc']  = '0.00'
					r4['first_disc']   = '0.00'
					r4['delivery_fee'] = '0.00'
					r4['due']          = '0.00'
					db.order_app.insert_one(r4) # 增加子订单
				elif len(b3)>0: # 情况 2
					print "订单改到B3站点"
					db.order_app.update_one({'order_id':param.order_id},{'$set' : {
						'shop_0' : r['shop'],
						'shop'   : ObjectId(setting.B3_shop),
					}})
				else: # 情况3,什么都不做
					print "订单保持不变"

				# 更新销货单信息
				db.order_app.update_one({'order_id' : param.order_id,},{
					'$set' : { 
						'status'     : 'PAID', 
						'cart'       : b2,     # 更新购物车  2015-09-11
						'pay_type'   : param.pay_type,
						'pay'        : db_order['due'],
						'paid_time'  : app_helper.time_str(),
						'paid_tick'  : int(time.time()),
					},
					'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '余额付款')},
				})
				# 消费余额
				db.app_user.update_one({'openid' : uname['openid'],},{
					'$inc' : { 
						'credit'     : 0-float(db_order['due']), 
					},
					'$push' : { 
						'history' : (app_helper.time_str(), uname['openid'], 
							'消费余额 %s' % db_order['due'].encode('utf-8'))
					},
				})
			elif param.pay_type in ('ALIPAY', 'WXPAY'):
				# 更新销货单信息,
				r = db.order_app.find_one_and_update(
					{
						'order_id' : param.order_id,
						'status'   : 'DUE'
					},
					{
						'$set' : { 
							'status'     : 'PREPAID', 
							'pay_type'   : param.pay_type,
							'pay'        : db_order['due'],
							'paid2_time' : app_helper.time_str(),
							'paid2_tick' : int(time.time()),
							'pay_data'   : param.data,
						},
						'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')},
					},
					{'status':1}
				)
				# 如果不是DUE,说明已收到异步通知
				if r==None:
					db.order_app.update_one(
						{
							'order_id' : param.order_id,
						},
						{
							'$set' : { 
								'pay_type'   : param.pay_type,
								'pay'        : db_order['due'],
								'paid2_time' : app_helper.time_str(),
								'paid2_tick' : int(time.time()),
							},
							'$push' : { 'history' : (app_helper.time_str(), uname['openid'], '提交付款')},
						}
					)

			# 返回
			return json.dumps({'ret' : 0, 'data' : {
				'order_id' : param.order_id,
				'due'      : db_order['due'],
				'paid'     : db_order['due'],
				'status'   : '已支付'
			}})
		else:
			return json.dumps({'ret' : -4, 'msg' : '无效的openid'})
Ejemplo n.º 30
0
    def POST(self):
        web.header('Content-Type', 'application/json')
        param = web.input(openid='', session_id='', query='')

        if param.query == '':
            return json.dumps({'ret': -2, 'msg': '参数错误'})

        if param.openid == '' and param.session_id == '':
            return json.dumps({'ret': -2, 'msg': '参数错误1'})

        # 同时支持openid和session_id
        if param.openid != '':
            uname = app_helper.check_openid(param.openid)
        else:
            uname = app_helper.wx_logged(param.session_id)

        if uname:
            db_user = db.app_user.find_one({'openid': uname['openid']}, {
                'coupon': 1,
                'credit': 1
            })
            if db_user == None:  # 不应该发生
                return json.dumps({'ret': -5, 'msg': '未找到用户信息'})

            # 修改为付款的过期订单
            r = db.order_app.update_many(
                {
                    'uname': {
                        '$in': uname.values()
                    },
                    'status': 'DUE',
                    'deadline': {
                        '$lt': int(time.time())
                    }
                }, {'$set': {
                    'status': 'TIMEOUT'
                }})
            #print r

            image_host = 'http://%s/image/product' % setting.image_host

            # 获得订单
            #if param.query=='ALL':
            condition = {
                'user': {
                    '$in': uname.values()
                }
            }  #, 'status':{'$ne':'TIMEOUT'}}

            db_order = db.order_app.find(
                condition, {
                    'status': 1,
                    'cart': 1,
                    'due': 1,
                    'shop': 1,
                    'history': 1,
                    'order_id': 1,
                    'deadline': 1,
                    'order_source': 1,
                    'pt_order_id': 1,
                    'type': 1,
                }).sort([('_id', -1)])
            order_list = []
            for i in db_order:
                #print i['_id']
                if i.get('order_source') == 'wx_tuan':
                    # 取拼团图片
                    r = db.pt_order.find_one({'pt_order_id': i['pt_order_id']})
                    if r == None:
                        print i['pt_order_id']
                        return json.dumps({'ret': -6, 'msg': '未找pt_order'})
                    r2 = db.pt_store.find_one({'tuan_id': r['tuan_id']})
                    if r == None:
                        print i['pt_order_id']
                        return json.dumps({'ret': -7, 'msg': '未找pt_store'})
                    image = r2['image'][0] if r2.has_key('image') and len(
                        r2['image']) > 0 else ''

                    order_list.append({
                        'order_id':
                        i['order_id'],
                        'pt_order_id':
                        i['pt_order_id'],
                        'order_time':
                        i['history'][0][0],
                        'image':
                        '%s/%s/%s' % (image_host, image[:2], image),
                        'status':
                        helper.ORDER_STATUS['APP'].get(i['status'], '未知状态'),
                        'due':
                        i['due'],
                        'count':
                        len(i['cart']),
                        'type':
                        r['type'],
                    })
                else:
                    # 取购物车中第一个商品的图片
                    db_sku = db.sku_store.find_one(
                        {'product_id': i['cart'][0]['product_id']},
                        {'base_sku': 1})
                    base_sku = db.dereference(db_sku['base_sku'])
                    image = base_sku['image'][0] if base_sku.has_key(
                        'image') and len(base_sku['image']) > 0 else ''
                    order_list.append({
                        'order_id':
                        i['order_id'],
                        'order_time':
                        i['history'][0][0],
                        'image':
                        '%s/%s/%s' % (image_host, image[:2], image),
                        'status':
                        helper.ORDER_STATUS['APP'].get(i['status'], '未知状态'),
                        'due':
                        i['due'],
                        'count':
                        len(i['cart']),
                        'type':
                        i.get('type', 'HOUR'),
                    })

            print order_list

            ret_data = {'order_list': order_list}

            return json.dumps({
                'ret': 0,
                'data': ret_data,
            })
        else:
            return json.dumps({'ret': -4, 'msg': '无效的openid'})