Exemple #1
0
    def post(self):
        '''
        注册
        '''
        try:
            args = json.loads(self.request.body.decode())
            code = args.get('code')
            phone = args.get('phone')
            passwd = args.get('passwd')
            name = args.get('name')
            address = args.get('address')
            st = args.get('st')
            ed = args.get('ed')
            manager = args.get('manager', '')

            assert (code and phone)
            assert (utils.is_valid_time(st))
            assert (utils.is_valid_time(ed))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        store = ctrl.store.get_store_ctl(phone)
        if store:
            raise utils.APIError(errcode=50001, errmsg='请勿重复注册')

        try:
            data = {
                'ktype': 20,
                'name': name,
                'address': address,
                'tel': phone,
                'is_test': 0,
                'is_own': 0,
                'manager': manager
            }
            ktv = utils.common_post_api('/kinfo', data)
            store_id = ktv['store_id']
            store = ctrl.store.add_store_ctl({
                'store_id':
                store_id,
                'st':
                st,
                'ed':
                ed,
                'name':
                name,
                'phone':
                phone,
                'passwd':
                hashlib.md5(passwd.encode()).hexdigest()
            })
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=50001, errmsg='注册失败, 稍后再试')

        FILTER = ('store_id', 'phone', 'update_time', 'st', 'ed', 'name')
        store = utils.dict_filter(store, FILTER)

        self.send_json(store)
Exemple #2
0
    def get(self):
        '''
        登录
        '''
        try:
            phone = self.get_argument('phone')
            passwd = self.get_argument('passwd')
            assert (phone and passwd)
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        try:
            store = ctrl.store.get_store_ctl(phone)
            assert (store)
            assert (store['passwd'] == hashlib.md5(
                passwd.encode()).hexdigest())
            token = self._login(store)
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=50001, errmsg='登录失败,请检查您的账号或密码')

        data = {}
        FILTER = ('store_id', 'phone', 'update_time', 'st', 'ed', 'name')
        data['store'] = utils.dict_filter(store, FILTER)
        data['token'] = token

        self.send_json(data)
Exemple #3
0
    def get_query_pack_sales(self,
                             store_id,
                             start_day,
                             end_day,
                             order_by,
                             page=1,
                             page_size=10):
        try:
            start_day = arrow.get(start_day, 'YYYY-MM-DD')
            end_day = arrow.get(end_day, 'YYYY-MM-DD')
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001, errmsg='日期格式不合法')

        if start_day > end_day:
            raise utils.APIError(errcode=10001, errmsg='起始日期不能大于结束日期')

        store = ctrl.store.get_store_ctl(self.current_user['phone'])
        start_time, end_time = utils.get_range_start_end_time(
            start_day, end_day, store['st'], store['ed'])

        sales, count = ctrl.trade.get_day_pack_sales_ctl(
            store_id, start_time, end_time, order_by, page, page_size)
        total_page = (count + page_size - 1) // page_size

        self.send_json({
            'list': sales,
            'page': page,
            'total_page': total_page,
            'total_count': count
        })
Exemple #4
0
    def post(self):
        '''
        重置密码
        '''
        try:
            args = json.loads(self.request.body.decode())
            phone = args['phone']
            passwd = args['passwd']
            code = args['code']
            assert (phone and passwd and code)
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        store = ctrl.store.get_store_ctl(phone)
        if not store:
            raise utils.APIError(errcode=50001, errmsg='该门店不存在')

        is_valid = ctrl.store.check_verify_code_ctl(phone, code)
        if not is_valid:
            raise utils.APIError(errcode=50001, errmsg='验证码无效')

        ctrl.store.update_store_ctl(
            phone, dict(passwd=hashlib.md5(passwd.encode()).hexdigest()))

        self.send_json()
Exemple #5
0
    def by_pack(self, store_id, rt_id, st, pack_id):
        pack = self.ctrl.pack.get_pack_ctl(pack_id)

        if not pack:
            raise utils.APIError(errcode=50001, errmsg='该套餐不存在')

        if not utils.is_valid_pack(pack):
            raise utils.APIError(errcode=50001, errmsg='该套餐已下架')

        pack_st = pack['st']
        pack_ed = pack['ed']
        price = pack['price']
        hour = pack['hour']
        name = pack['name']
        pack_id = pack['id']

        if not utils.is_hour_in_range(st[-5:], pack_st, pack_ed):
            raise utils.APIError(errcode=50001, errmsg='开台时间需在套餐的有效时间之内')

        minute = hour * 60
        if len(st) > 6:
            ed = utils.future_time_by_hour(st, hour, 'YYYY.MM.DD HH:mm')
        else:
            ed = utils.future_time_by_hour(st, hour)

        bill = {
            'pack_id': pack_id,
            'name': name,
            'st': st,
            'ed': ed,
            'minute': minute,
            'price': price
        }

        return bill
Exemple #6
0
    async def export(self, ktv_id):
        try:
            channel = self.get_argument('channel', 'all')
            tp = self.get_argument('tp', 'normal')
            type = self.get_argument('type', '')
            start_time = self.get_argument('start_time', '')
            end_time = self.get_argument('end_time', '')
            income_id = self.get_argument('income_id', '0')

        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)
        channel = None if channel == 'all' else ORDER_CHANNEL[channel]
        tp = None if tp == 'all' else ORDER_TP[tp]
        income_id = int(income_id) if income_id else 0
        data = []
        if not type: # time
            if not start_time and not end_time:# 今日营收
                ktv = await ctrl.pay.get_ktv_ctl(ktv_id)
                t_time = ctrl.mch.get_today_income_time_ctl(ktv)
                start_time = t_time['start_time']
                end_time = t_time['end_time']
            orders = ctrl.mch.get_orders_ctl(ktv_id=ktv_id, channel=channel, tp=tp, start_time=start_time, end_time=end_time)
        else: # income
            if income_id == -1:# 昨日营收
                orders = ctrl.mch.get_orders_ctl(ktv_id=ktv_id, channel=channel, tp=tp, income_id=income_id)
            else:
                orders = ctrl.mch.get_orders_ctl(ktv_id=ktv_id, channel=channel, tp=tp, income_id=income_id)
        if not orders:
            raise utils.APIError(errcode=1001, errmsg='无数据')

        if channel == ORDER_CHANNEL['wx']:
            name = '微信'
        elif channel == ORDER_CHANNEL['ali']:
            name = '支付宝'
        elif channel == ORDER_CHANNEL['pos']:
            name = 'pos'
        else:
            name = '全部'

        sheet_dict = {
            'sheetname': '%s进出账流水' % name,
            'titles': ['商户订单号', '订单费用(元)', '手续费用(元)', '订单创建时间', '支付类型', '卡号', '终端号']
        }
        for order in orders:
            sheet_dict.setdefault('data', []).append([order['order_id'], self._money_format(order['fee']),
                                                      self._money_format(order['rate']), order['finish_time'],
                                                      order['channel'], order['card_no'], order['term_id']])

        data.append(sheet_dict)
        if start_time and end_time:
            filename = 'static/data/进出账流水_%s~%s.xlsx' % (start_time, end_time)
        else:
            filename = 'static/data/进出账流水_%s.xlsx' % (str(income_id))
        filename_with_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), filename)
        utils.export_xlsx(data=data, export_filename=filename_with_path)
        self.set_header('Access-Control-Allow-Origin', '*')
        self.send_json(data={'url': '/' + filename})
        def wrap(*args, **kw):
            self = args[0]
            login = int(self.current_user['login'])
            if not login:
                raise utils.APIError(errcode=40001)

            if roles and self.current_user['role_code'] not in roles:
                raise utils.APIError(errcode=40003)
            return func(*args, **kw)
Exemple #8
0
    def check_room_valid(self, store_id, rt_id, room_id):
        room = self.ctrl.room.get_room_ctl(room_id)

        if not room:
            raise utils.APIError(errcode=50001, errmsg='包房不存在')

        if room['room_type'] not in [ROOM_TYPE['free']]:
            raise utils.APIError(errcode=50001, errmsg='包房被占用')

        return room
Exemple #9
0
    def check_room_valid(self, store_id, rt_id, room_id):
        room = self.ctrl.room.get_room_ctl(room_id)

        if not room:
            raise utils.APIError(errcode=50001, errmsg='包房无效')

        if room['room_type'] not in [ROOM_TYPE['using'], ROOM_TYPE['timeout']]:
            raise utils.APIError(errcode=50001, errmsg='未开台')

        return room
Exemple #10
0
    def cancel_bill(self, store_id, order_no, bill_id):
        bill = self.get_bill(store_id, bill_id)
        if not bill:
            raise utils.APIError(errcode=50001, errmsg='账单不存在')

        if bill['pay_state'] == BILL_PAY_STATE['finish']:
            raise utils.APIError(errcode=50001, errmsg='账单已支付,不能取消')

        self.dummy_update_bill_ctl(store_id, order_no, bill_id,
                                   {'pay_state': BILL_PAY_STATE['cancel']})
Exemple #11
0
    def check_pack(self, pack_id):
        pack = self.ctrl.pack.get_pack_ctl(pack_id)

        if not pack:
            raise utils.APIError(errcode=50001, errmsg='该套餐不存在')

        if not utils.is_valid_pack(pack):
            raise utils.APIError(errcode=50001, errmsg='该套餐已下架')

        return pack
Exemple #12
0
    async def get(self, timestamp, sign):
        if not utils.check_sign_ex(timestamp, sign):
            raise utils.APIError(errcode=10001, errmsg='验签错误')
        is_guest = '1' if timestamp == '1111' else '0'
        self.set_secure_cookie('is_guest', is_guest)

        order_id = self.get_argument('order_id', None)

        if not order_id:
            raise utils.APIError(errcode=10001, errmsg='订单号不得为空')
        res = ctrl.mch.get_order_ex_ctl(order_id)
        self.send_json(res)
Exemple #13
0
    def get(self):
        try:
            username = self.get_argument('username')
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=100)

        try:
            orders = ctrl.web.get_user_orders_ctl(username)
            self.send_json(dict(orders=orders))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(500)
Exemple #14
0
    def put(self):
        try:
            username = self.get_argument('username')
            password = self.get_argument('password')
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=100)

        user = ctrl.web.get_user_info_ctl(username)
        if not user:
            raise utils.APIError(errcode=404)
        ctrl.web.update_user_ctl(username, ts=0, email='', password=password)
        user = ctrl.web.get_user_info_ctl(username)
        self.send_json(user)
Exemple #15
0
    def post(self):
        try:
            username = self.get_argument('username')
            password = self.get_argument('password')
        except Exception as e:
            logging.error(e)
            raise utils.APIError(100)

        user = ctrl.web.get_user_info_ctl(username)
        if password != user.get('password', ''):
            raise utils.APIError(errcode=401)

        is_payed_user = self._is_payed_user(username)
        user.update({'is_payed_user': is_payed_user})
        self.send_json(user)
Exemple #16
0
    def post(self):
        try:
            username = int(self.get_argument('username'))
            password = self.get_argument('password')
        except Exception as e:
            raise utils.APIError(errcode=10001)

        user = ctrl.pay.get_ktv_fin_account(username)
        msg = dict(type=0)
        if not user:
            pass
        elif password == user['password_org'] and not user['password']:
            self._login(username)
            self.set_secure_cookie('is_login',
                                   str(user['ktv_id']),
                                   expires_days=1)
            msg.update({'type': 1})
        elif password == user['password']:
            self._login(username)
            self.set_secure_cookie('is_login',
                                   str(user['ktv_id']),
                                   expires_days=1)
            msg.update({'type': 2, 'user': user})

        self.send_json(msg)
Exemple #17
0
    async def post(self):
        is_login = self.get_secure_cookie('is_login')

        if not is_login:
            return

        try:
            bank_account = self.get_argument('bank_account')
            bank_name = self.get_argument('bank_name')
            bank_branch = self.get_argument('bank_branch')
            account_name = self.get_argument('account_name')
            bank_phone = self.get_argument('bank_phone')
            is_extra = int(self.get_argument('is_extra', 0))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        ktv_id = int(is_login.decode())
        response = await ctrl.erp.update_bank_info_ctl(
            ktv_id, {
                'bank_account': bank_account,
                'bank_name': bank_name,
                'bank_branch': bank_branch,
                'account_name': account_name,
                'bank_phone': bank_phone,
                'is_extra': is_extra
            })
        self.send_json(data=response)
Exemple #18
0
    async def render_flow(self, ktv_id):
        try:
            page = int(self.get_argument('page', 1))
        except:
            raise utils.APIError(errcode=10001)

        page_size = 20
        start_date = '2016-01-01'
        end_date = '2020-01-01'
        order_info = await ctrl.erp.get_pay_orders_ctl(ktv_id,
                                                       pay_type='deposit',
                                                       start_date=start_date,
                                                       end_date=end_date,
                                                       page=page,
                                                       page_size=page_size)

        orders = order_info['list']
        total = order_info['total']

        page_total = (total + page_size - 1) // page_size

        self.render('flow.tpl',
                    top_cate='withdraw',
                    action='flow',
                    ktv_id=ktv_id,
                    orders=orders,
                    page=page,
                    page_size=page_size,
                    page_total=page_total)
Exemple #19
0
    def checkout_order(self, store_id, order_no, money, real_money, pay_md,
                       describe):
        order = self.check_order_ctl(store_id, order_no)
        room_id = order['room_id']
        order_id = order['id']

        if order['pay_type'] == PAY_TYPE['current']:
            raise utils.APIError(errcode=50001, errmsg='落单后结才需要结账')

        # self.ctrl.open.update_room_ctl(store_id, room_id, ROOM_TYPE['clean'])
        self.update_order_ctl(
            store_id,
            order_no,
            {
                'describe': describe,
                'money': money + order.get('prepay'),
                'real_money': money + order.get('prepay'),  # real_money
                'finish_time': when.now().strftime('%Y-%m-%d %H:%M:%S')
            })

        # 去掉另一个包房的订单的key
        using_order_key = self.get_using_order_key_ctl(store_id, room_id)
        self.ctrl.rs.delete(using_order_key)

        # 现金的直接支付成功
        if pay_md in (PAY_MD['cash'], PAY_MD['pos']):
            self.after_checkout_order_ctl(store_id, order_no, pay_md)
Exemple #20
0
    	async def pay_query(self, order_id, loop=1):
        		logging.info("\n\nloop=%s, order_id=%s"%(loop, order_id))

        		order = ctrl.web.get_by_order(order_id)
        		if not order:
            			raise utils.APIError(errcode=10001)
        		try:
	            		params = {
				"op": "query",
				"ktvid": order['ktv_id'],  # 专用于分享订单的打赏
				"paytype": 'WX',  # ALI or WX
				"data": json.dumps({
					"paraOutTradeNo": order['wx_pay_id'],
				}),
	            		}

	            		url = 'http://pay.ktvsky.com/wx'
	            		http_client = utils.get_async_client()
	            		request = httpclient.HTTPRequest(url_concat(url, params), method='POST', body='',
	                			headers={'Connection': 'keep-alive'}, connect_timeout=10, request_timeout=10)

			res = await utils.fetch(http_client, request)
			res = json.loads(bytes(res.body).decode())
			logging.info(res)

	            		if utils.is_success_pay('wx', res):
	            			ctrl.web.update_namegame_order(data=dict(order_id=order_id, state=2, wx_pay_id=res['transaction_id']))
	            			res['is_pay'] = 1
	            			return res
Exemple #21
0
    def post(self):
        '''
        添加包房类型
        '''
        try:
            args = json.loads(self.request.body.decode())
            names = args['names']
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        data = {'list': []}

        if not names:
            return self.send_json(data)

        room_types = ctrl.room.add_room_types_ctl(
            self.current_user['store_id'], names)

        if not room_types:
            return self.send_json(data)

        FILTER = ({'id': 'rt_id'}, 'store_id', 'name', 'update_time')
        data['list'] = [
            utils.dict_filter(room_type, FILTER) for room_type in room_types
        ]

        self.send_json(data)
Exemple #22
0
    def post(self):
        '''
        添加计费设置
        '''
        try:
            rt_id = int(self.get_argument('rt_id'))
            args = json.loads(self.request.body.decode())
            for arg in args:
                assert (arg.get('day') or arg.get('holiday'))
                for item in arg['list']:
                    assert (utils.is_valid_time(item['st']))
                    assert (utils.is_valid_time(item['ed']))
                    assert (int(item['fee']) > 0)
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        room_fees = ctrl.room.add_room_fees_ctl(self.current_user['store_id'],
                                                rt_id, args)

        data = {'list': []}

        if not room_fees:
            return self.send_json(data)

        FILTER = ({
            'id': 'fee_id'
        }, 'store_id', 'rt_id', 'st', 'ed', 'fee', 'day_or_holiday',
                  'update_time')

        data['list'] = [utils.dict_filter(fee, FILTER) for fee in room_fees]

        self.send_json(data)
Exemple #23
0
    def post(self):
        '''
        往某个包房类型下添加包房
        '''
        try:
            args = json.loads(self.request.body.decode())
            rooms = {}
            for arg in args:
                rt_id = arg['rt_id']
                rooms[rt_id] = []
                for ip_name in arg['list']:
                    assert (ip_name['name'])
                    rooms[rt_id].append(ip_name)
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        data = {'list': []}

        rooms = ctrl.room.add_rooms_ctl(self.current_user['store_id'], rooms)

        if not rooms:
            return self.send_json(data)

        FILTER = ({
            'id': 'room_id'
        }, 'store_id', 'rt_id', 'name', 'mac', 'ip', 'room_type', 'describe',
                  'update_time')
        data['list'] = [utils.dict_filter(room, FILTER) for room in rooms]

        self.send_json(data)
Exemple #24
0
    def get(self):
        '''
        获取分类下的酒水列表
        '''
        try:
            cate_id = int(self.get_argument('cate_id'))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        FILTER = ({
            'id': 'product_id'
        }, 'store_id', 'cate_id', 'name', 'pic', 'price', 'unit', 'spec',
                  'stock', 'discount', 'state', 'order', 'update_time')
        data = {'list': []}
        products = ctrl.cate.get_cate_products_ctl(
            self.current_user['store_id'], cate_id)

        if not products:
            return self.send_json(data)

        data['list'] = [
            utils.dict_filter(product, FILTER) for product in products
        ]
        self.send_json(data)
Exemple #25
0
    def put(self):
        '''
        修改某个包房类型
        '''
        try:
            args = json.loads(self.request.body.decode())
            rt_id = int(args['rt_id'])
            name = args.get('name', '')
            pic = args.get('pic', '')
            min_man = int(args.get('min_man', 0))
            max_man = int(args.get('max_man', 0))

            assert (name or pic or min_man or max_man)
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        data = {'name': name, 'pic': pic}

        if 'min_man' in args:
            data.update({'min_man': min_man})

        if 'max_man' in args:
            data.update({'max_man': max_man})

        ctrl.room.update_room_type_ctl(self.current_user['store_id'], rt_id,
                                       data)

        self.send_json()
Exemple #26
0
    def get(self):
        '''
        获取某房型下的所有的酒水套餐
        '''
        try:
            rt_id = int(self.get_argument('rt_id'))
            is_valid = int(self.get_argument('is_valid', 0))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        data = {'list': []}
        FILTER = ({
            'id': 'pack_id'
        }, 'store_id', 'name', 'start_date', 'end_date', 'st', 'ed', 'price',
                  'day', 'hour', 'state', 'update_time')

        packs = ctrl.room.get_room_packs_ctl(self.current_user['store_id'],
                                             rt_id)

        if not packs:
            return self.send_json(data)

        if is_valid:
            _packs = [pack for pack in packs if utils.is_valid_pack(pack)]
            packs = _packs

        packs = [utils.dict_filter(pack, FILTER) for pack in packs]

        data['list'] = packs

        self.send_json(data)
Exemple #27
0
    def by_time(self, store_id, phone, rt_id, room_id, st, ed):
        store = self.ctrl.store.get_store_ctl(phone)
        store_st = store['st']
        store_ed = store['ed']

        # 兼容续时跨天
        day = datetime.datetime.now().date()
        order = self.ctrl.order.get_using_order_ctl(store_id, room_id)
        if order:
            order_ed = order['ed']
            day = datetime.datetime.strptime(order_ed[:-6], '%Y.%m.%d')
            if order_ed[-5:] < store_st:
                day = day - datetime.timedelta(days=1)
            day = day.date()

        holiday_fees = self.ctrl.room.get_holiday_room_fees_ctl(store_id,
                                                                rt_id,
                                                                day=day)

        if holiday_fees:
            fees = holiday_fees
        else:
            fees = self.ctrl.room.get_week_room_fees_ctl(store_id,
                                                         rt_id,
                                                         day=day)

        sorted_fees = sorted(fees, key=lambda f: f['st'])

        if not utils.is_valid_fees(sorted_fees, store_st, store_ed):
            raise utils.APIError(errcode=50001, errmsg='计费方式设置和营业时间不匹配')

        bills = utils.get_time_bills(sorted_fees, st, ed)

        return bills
Exemple #28
0
    def check_order(self, store_id, order_no):
        order = self.get_order_ctl(store_id, order_no)

        if not order or order['state'] not in [ORDER_STATE['using']]:
            raise utils.APIError(errcode=50001, errmsg='未开台')

        return order
Exemple #29
0
    def put(self):
        '''
        修改某条计费设置
        '''
        try:
            args = json.loads(self.request.body.decode())
            fee_id = int(args['fee_id'])
            st = args.get('st', '')
            ed = args.get('ed', '')
            fee = int(args.get('fee', 0))

            assert (utils.is_valid_time(st))
            assert (utils.is_valid_time(ed))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        data = {'st': st, 'ed': ed}

        if 'fee' in args:
            data.update({'fee': fee})

        ctrl.room.update_room_fee_ctl(fee_id, self.current_user['store_id'],
                                      data)

        self.send_json()
Exemple #30
0
    def get(self):
        '''
        获取某房型下周几/假期内的所有计费设置
        '''
        try:
            rt_id = int(self.get_argument('rt_id'))
            md = self.get_argument('md', 'day')
            day_or_holiday = self.get_argument('day_or_holiday', '')
            assert (md in ('day', 'holiday'))
        except Exception as e:
            logging.error(e)
            raise utils.APIError(errcode=10001)

        data = {'list': []}

        room_fees = ctrl.room.get_room_fees_ctl(self.current_user['store_id'],
                                                rt_id, day_or_holiday, md)

        if not room_fees:
            return self.send_json(data)

        FILTER = ({
            'id': 'fee_id'
        }, 'store_id', 'rt_id', 'st', 'ed', 'fee', 'day_or_holiday',
                  'update_time')

        room_fees = [utils.dict_filter(fee, FILTER) for fee in room_fees]
        data['list'] = room_fees

        self.send_json(data)