Esempio n. 1
0
    def _route_method(self, method, request_type):
        """根据不同的method和reqeust_type返回contorller中不同的方法名

        :method: url后面的method参数
        :request_type: request请求的方法,GET还是POST方法
        :return: json类型的response
        """
        route_method = None
        if request_type == RequestType.GET:
            route_method = '_get_{}'.format(method if method else 'index')
        elif request_type == RequestType.POST:
            route_method = '_post_{}'.format(method if method else 'index')
        else:
            return Response.error('路由错误', 'system routing error')

        # 如果route_method为空或者contorller中没有route_method方法
        if route_method is None or not hasattr(self, route_method):
            return Response.error('请求的方法不存在', 'method does not exist')

        func = getattr(self, route_method)

        try:
            response = func()
        except BadRequest as ex:
            return Response.field_error(ex.description)
        return response
Esempio n. 2
0
    def _post_update(self):
        """ 将Customer的类型进行更新 """
        # argument的校验与获取
        self.parser.add_argument('customer_id', type=int, required=True)
        self.parser.add_argument('customer_type',
                                 type=int,
                                 required=True,
                                 choices=CustomerType.choices(),
                                 help='请传入正确的customer_type参数')
        args = self.parser.parse_args()

        customer_id = args.get('customer_id')
        customer_type = args.get('customer_type')

        # 获取具体的customer,并更新的客户类型
        try:
            customer = Customer.query.filter_by(id=customer_id).first()
            customer.customer_type = customer_type
            customer.update()
        except AttributeError:
            return Response.error('请求出错', 'custoemr_id无法定位到一个具体的customer对象')
        except Exception as e:
            return Response.error('请求出错', str(e))

        return Response.success('customer的状态修改成功')
Esempio n. 3
0
    def _post_delete(self):
        """ 将指定的customer对象删除 """
        # argument的校验与获取
        self.parser.add_argument('customer_id', type=int, required=True)
        args = self.parser.parse_args()
        customer_id = args.get('customer_id')

        try:
            customer = Customer.query.filter_by(id=customer_id).first()
            Customer.delete(customer)
        except AttributeError:
            return Response.error('请求出错', 'custoemr_id无法定位到一个具体的customer对象')
        except Exception as e:
            return Response.error('请求出错', str(e))

        return Response.success('删除成功')
Esempio n. 4
0
    def _get_salesman(self):
        """ 销售维度的业绩统计 """
        result = {
            'salesman_name': '',  # 销售员的姓名
            'salesman_id': '',  # 销售员的主键id
            'start_date': '',  # 业绩统计的起始日期
            'end_date': '',  # 业绩统计的结束日期
            'achievements': dict()  # 具体的业绩数据
        }
        # argument
        self.parser.add_argument('salesman', type=int,
                                 required=True)  # 销售员的用户id
        self.parser.add_argument('start_date', type=int, required=True)
        self.parser.add_argument('end_date', type=int, required=True)
        args = self.parser.parse_args()

        salesman_id = args.get('salesman')
        start_timestamp = args.get('start_date')
        end_timestamp = args.get('end_date')
        start_date = date.fromtimestamp(start_timestamp)
        end_date = date.fromtimestamp(end_timestamp)

        try:
            # 找出这段时间内销售不同类型产品的业绩
            achievements = Achievement.query.with_entities(
                Achievement.salesman_name, Achievement.salesman_id,
                Achievement.order_type,
                func.sum(Achievement.order_money).label('sum_money'),
                func.sum(Achievement.order_price).label('sum_price')).filter(
                    Achievement.salesman_id == salesman_id,
                    Achievement.order_date.between(
                        start_date,
                        end_date)).group_by(Achievement.salesman_name,
                                            Achievement.salesman_id,
                                            Achievement.order_type)

            # 如果销售在这一段时间内没有业绩
            if len(list(achievements)) <= 0:
                return Response.construct_response('该销售员在这一段时间内没有业绩')

            # 构造result
            result['salesman_name'] = achievements[0].salesman_name
            result['salesman_id'] = achievements[0].salesman_id
            result['start_date'] = start_date.strftime('%Y-%m-%d')
            result['end_date'] = end_date.strftime('%Y-%m-%d')
            for achievement in achievements:
                achievement_json = {
                    'order_type': achievement.order_type,
                    'sum_money': achievement.sum_money,
                    'sum_price': achievement.sum_price,
                }
                result['achievements'][str(
                    achievement.order_type)] = achievement_json
        except Exception as e:
            return Response.error('请求出错', str(e))

        return result
Esempio n. 5
0
    def _get_order_type(self):
        """ 完成产品类型维度的业绩统计 """
        result = {
            'order_type': '',  # 产品类型
            'start_date': '',  # 业绩统计的起始日期
            'end_date': '',  # 业绩统计的结束日期
            'achievements': dict()  # 具体的业绩数据
        }
        # argumengts
        self.parser.add_argument('order_type', type=int, required=True)  # 产品类型
        self.parser.add_argument('start_date', type=int, required=True)
        self.parser.add_argument('end_date', type=int, required=True)
        args = self.parser.parse_args()

        order_type = args.get('order_type')
        start_timestamp = args.get('start_date')
        end_timestamp = args.get('end_date')
        start_date = date.fromtimestamp(start_timestamp)
        end_date = date.fromtimestamp(end_timestamp)

        try:
            # 找出这段时间部门不同类型产品的业绩, 这里将部门和部门线数据拼称一个列表
            achievements = Achievement.query.with_entities(
                func.array_append(Achievement.department_line,
                                  cast(Achievement.department_id,
                                       VARCHAR(50))).label('department_line'),
                func.sum(Achievement.order_money).label('sum_money'),
                func.sum(Achievement.order_price).label('sum_price')).filter(
                    Achievement.order_type == order_type,
                    Achievement.order_date.between(
                        start_date,
                        end_date)).group_by(Achievement.department_id,
                                            Achievement.department_line)
            # 构造result
            result['order_type'] = order_type
            result['start_date'] = start_date.strftime('%Y-%m-%d')
            result['end_date'] = end_date.strftime('%Y-%m-%d')
            for achievement in achievements:
                for department in achievement.department_line:
                    if department not in result['achievements']:
                        # 如果当前部门在数据中没有,则作为一条新数据添加进achievements中
                        achievement_json = {
                            'department': department,
                            'sum_money': achievement.sum_money,
                            'sum_price': achievement.sum_price,
                        }
                        result['achievements'][department] = achievement_json
                    else:
                        # 如果部门已经在achievements中了,直接累加
                        result['achievements'][department][
                            'sum_money'] += achievement.sum_money
                        result['achievements'][department][
                            'sum_price'] += achievement.sum_price
        except Exception as e:
            return Response.error('请求出错', str(e))

        return result
Esempio n. 6
0
    def _post_add(self):
        """ 新增一个customer对象 """
        # argument的校验与获取
        self.parser.add_argument('short_name', type=str, required=True)
        self.parser.add_argument('full_name', type=str, required=True)
        self.parser.add_argument('telephone', type=str, required=True)
        self.parser.add_argument('customer_type',
                                 type=int,
                                 required=True,
                                 choices=CustomerType.choices(),
                                 help='请传入正确的customer_type参数')
        args = self.parser.parse_args()

        short_name = args.get('short_name')
        full_name = args.get('full_name')
        telephone = args.get('telephone')
        customer_type = args.get('customer_type')

        if Customer.query.filter_by(short_name=short_name).first():
            return Response.error('请求出错', f'{short_name}已经添加在customer列表中了')

        if Customer.query.filter_by(full_name=full_name).first():
            return Response.error('请求出错', f'{full_name}已经添加在customer列表中了')

        if not Validator.validate_phone(telephone):
            return Response.error('请求出错', 'telephone不是一个有效的电话号码')

        try:
            customer = Customer(short_name=short_name,
                                full_name=full_name,
                                telephone=telephone,
                                customer_type=customer_type)
            Customer.add(obj=customer)
        except Exception as e:
            return Response.error('请求出错', str(e))

        return Response.success('添加成功')
Esempio n. 7
0
    def _get_department(self):
        """ 部门维度的业绩统计 """
        result = {
            'department_id': '',  # 部门ID
            'start_date': '',  # 业绩统计的起始日期
            'end_date': '',  # 业绩统计的结束日期
            'achievements': dict()  # 具体的业绩数据
        }
        # arguments
        self.parser.add_argument('department', type=int, required=True)  # 部门ID
        self.parser.add_argument('start_date', type=int, required=True)
        self.parser.add_argument('end_date', type=int, required=True)
        args = self.parser.parse_args()

        department_id = args.get('department')
        start_timestamp = args.get('start_date')
        end_timestamp = args.get('end_date')
        start_date = date.fromtimestamp(start_timestamp)
        end_date = date.fromtimestamp(end_timestamp)

        try:
            # 找出这段时间内部门及下属部门不同类型产品的业绩
            achievements = Achievement.query.with_entities(
                Achievement.order_type,
                func.sum(Achievement.order_money).label('sum_money'),
                func.sum(Achievement.order_price).label('sum_price')).filter(
                    Achievement.order_date.between(start_date, end_date),
                    or_(Achievement.department_id == department_id,
                        Achievement.department_line.any(
                            str(department_id)))).group_by(
                                Achievement.order_type)
            # 构造result
            result['department_id'] = department_id
            result['start_date'] = start_date.strftime('%Y-%m-%d')
            result['end_date'] = end_date.strftime('%Y-%m-%d')
            for achievement in achievements:
                achievement_json = {
                    'order_type': achievement.order_type,
                    'sum_money': achievement.sum_money,
                    'sum_price': achievement.sum_price,
                }
                result['achievements'][
                    achievement.order_type] = achievement_json
        except Exception as e:
            return Response.error('请求出错', str(e))

        return result
Esempio n. 8
0
    def _post_index(self):
        """ 请求Customer的列表数据 """
        result = {
            'total': 0,  # 当前页面的customer数量
            'page': 0,  # 当面页码
            'pages': 0,  # 总页码
            'customers': list()  # 当前customer的数据
        }
        # argument的获取与校验
        self.parser.add_argument('page', type=int, default=1)
        self.parser.add_argument('per_page', type=int, default=20)
        args = self.parser.parse_args()

        page = args.get('page', 1)
        per_page = args.get('per_page', 20)

        # 如果page小于等于0,返回错误
        if page <= 0:
            return Response(*CommonPrompt.INVALID_PAGE)

        # 获取customer数据
        try:
            customers_page = Customer.query.order_by(Customer.id) \
                .paginate(page=page, per_page=per_page)
            pages = customers_page.pages
            customers_data = customers_page.items
            customers_json = [
                customer.to_json() for customer in customers_data
            ]

            # 构造result
            result['total'] = len(customers_json)
            result['page'] = page
            result['pages'] = pages
            result['customers'] = customers_json
        except Exception as e:
            return Response.error('请求出错', str(e))

        return result