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
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的状态修改成功')
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('删除成功')
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
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
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('添加成功')
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
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