def brand_value(request): """ 返回微品牌价值的EChart数据 """ freq_type = request.GET.get('freq_type','W') end_date = util_dateutil.now() webapp_id = request.user_profile.webapp_id # 以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点) date_range = pd.date_range(end=end_date, periods=DISPLAY_PERIODS_IN_APP_CHARTS, freq=freq_type) date_list = [] values = [] # TODO: 需要优化。可以一次计算完成 for date in date_range: date_str = util_dateutil.date2string(date.to_datetime()) # 将pd.Timestamp转成datetime date_list.append(date_str[date_str.find('-')+1:]) values.append(get_brand_value(webapp_id, date_str)) response = create_line_chart_response( "", "", date_list, [{ "name": "品牌价值", "values" : values }] ) return response
def get_brand_value(webapp_id, date_str): """ 获取品牌价值的接口(如果数据库中有非今日的缓存值,则取出;否则计算并存入数据库) @retval brand_value(整型,单位元) """ cached, created = BrandValueHistory.objects.get_or_create( webapp_id=webapp_id, value_date=date_str) today = util_dateutil.date2string(util_dateutil.now()) # 如果有缓存的数据,从数据库取数据 #print("date_str: {}, count: {}".format(date_str, cached.count())) if date_str != today and not created: brand_value = int(cached.value) else: brand_value = 0 try: brand_value = compute_brand_value(webapp_id, date_str) #print("date_str: {}, value: {}".format(date_str, brand_value)) #BrandValueHistory.objects.create( # webapp_id=webapp_id, # value_date=date_str, # value=brand_value) cached.webapp_id = webapp_id cached.value_date = date_str cached.value = brand_value cached.save() brand_value = int(brand_value) except: notify_msg = u"存微品牌数据失败, cause:\n{}".format(unicode_full_stack()) watchdog_error(notify_msg) return brand_value
def sales_chart(request): freq_type = request.GET.get('freq_type','W') priods = 7 if freq_type == 'W' else 30 end_date = util_dateutil.now() # 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点) date_range = pd.date_range(end=end_date, periods=priods, freq='D') start_date = util_dateutil.date2string(date_range[0].to_datetime()) try: webapp_id = request.user.get_profile().webapp_id orders = Order.by_webapp_id(webapp_id).filter(created_at__gte=start_date,created_at__lte=end_date,status__in=ORDER_SOURCE).order_by('created_at') order_price2time = OrderedDict() for order in orders: created_at = order.created_at.strftime("%Y-%m-%d") use_price = order.final_price + order.weizoom_card_money if not order_price2time.has_key(created_at): order_price2time[created_at] = use_price else: order_price2time[created_at] += use_price date_list = [] values =[] for date in date_range: date = util_dateutil.date2string(date.to_datetime()) date_list.append(date[date.find('-')+1:]) if not order_price2time.has_key(date): values.append(0) else: values.append(int(order_price2time[date])) response = create_line_chart_response( "", "", date_list, [{ "name": "销售额", "values" : values }] ) return response except: response = create_response(500) response.errMsg = u'系统繁忙,请稍后重试' return response.get_response()
def get(args): """ 返回微品牌价值JSON数据 """ webapp_id = args.get('wid') start_date = args.get('start_date') end_date = args.get('end_date') freq_type = args.get('freq_type', 'W') try: periods = int(args.get('periods', DISPLAY_PERIODS_IN_CHARTS)) except: periods = DISPLAY_PERIODS_IN_CHARTS if freq_type == 'week' or freq_type == 'W': freq = 'W' elif freq_type == 'month' or freq_type == 'M': freq = 'M' else: freq = 'D' if end_date is None: end_date = utils_dateutil.now() else: try: end_date = utils_dateutil.parse_date(end_date) except: notify_msg = u"参数错误, cause:\n{}".format(unicode_full_stack()) watchdog_warning(notify_msg) end_date = utils_dateutil.now() #webapp_id = request.user_profile.webapp_id if start_date is not None: date_range = pd.date_range(start=start_date, end=end_date, freq=freq) else: # 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点) date_range = pd.date_range(end=end_date, periods=periods, freq=freq) #date_list = [] #values = [] # TODO: 需要优化。可以一次计算完成 data = {} for date in date_range: date_str = utils_dateutil.date2string(date.to_datetime()) # 将pd.Timestamp转成datetime #date_list.append(date_str) value = get_brand_value(webapp_id, date_str) #values.append() data[date_str] = value #print("date_list: {}".format(date_list)) #response = create_response(200) #response.data = data #return response.get_response() return data
def analyze_account_brand_values(name, start_date, end_date, freq='MS'): """ 分析给定用户列表的微品牌 """ date_range = pd.date_range(start=start_date, end=end_date, freq=freq) values = [] for date in date_range: date_str = util_dateutil.date2string(date.to_datetime()) values.append( (name, date_str, get_brand_value_by_account(name, date_str))) return values
def order_value(request): webapp_id = request.user.get_profile().webapp_id freq_type = request.GET.get('freq_type','W') priods = 7 if freq_type == 'W' else 30 end_date = util_dateutil.now() # 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点) date_range = pd.date_range(end=end_date, periods=priods, freq='D') start_date = util_dateutil.date2string(date_range[0].to_datetime()) try: orders = Order.by_webapp_id(webapp_id).filter(created_at__gte=start_date,created_at__lte=end_date,status__in=ORDER_SOURCE).order_by('created_at') order_items = OrderedDict() for order in orders: date = order.created_at.strftime('%Y-%m-%d') if not order_items.has_key(date): order_items[date] = 1 else: order_items[date] += 1 date_list = [] values =[] for date in date_range: date = util_dateutil.date2string(date.to_datetime()) date_list.append(date[date.find('-')+1:]) if not order_items.has_key(date): values.append(0) else: values.append(order_items[date]) response = create_line_chart_response( "", "", date_list, [{ "name": "订单量", "values" : values }] ) return response except: response = create_response(500) response.errMsg = u'系统繁忙,请稍后重试' return response.get_response()
def get_brand_value_by_account(account_name, date_str=None): """ 根据account name获取微品牌价值 """ # 根据account_name获取webapp_id webapp_id = bdd_util.get_webapp_id_for(account_name) #print("webapp_id: {}".format(webapp_id)) date = date_str if date_str is None: date = util_dateutil.date2string(util_dateutil.now()) value = compute_brand_value(webapp_id, date) print("webapp_id:{}, date:{}, value:{}".format(webapp_id, date, value)) return value
def get_latest_brand_value(webapp_id): """ 获取当前微品牌值 @retval today_value 今日微品牌值 @retval yesterday_value 昨天的微品牌值 @retval is_increasing True表示上涨,False表示下降 @retval increase_percent 涨幅比例(%) """ today = util_dateutil.now() date_str = util_dateutil.date2string(today) yesterday = util_dateutil.get_date_after_days(today, -1) yesterday_date_str = util_dateutil.date2string(yesterday) today_value = get_brand_value(webapp_id, date_str) yesterday_value = get_brand_value(webapp_id, yesterday_date_str) delta = today_value - yesterday_value if today_value == 0: increase_percent = 0.0 else: increase_percent = abs(round((delta * 100.0 / today_value), 2)) return (today_value, yesterday_value, int(np.sign(delta)), increase_percent)
def get(args): """ 获取微品牌价值 @param wid webapp_id @param dates 日期列表,多日期用逗号(,)分隔。默认是当天。 """ webapp_id = args.get('wid') #print("webapp_id: {}".format(webapp_id)) dates = args.get('dates') if dates is None or len(dates)<1: dates = [ utils_dateutil.date2string(utils_dateutil.now()) ] else: dates = dates.split(',') #values = [ {"date":date_str, "bv":get_brand_value(webapp_id, date_str)} for date_str in dates ] values = {date_str: get_brand_value(webapp_id, date_str) for date_str in dates} #return create_json_response(200, { # "values": values # }) return {"values": values}
def step_impl(context, user): client = context.client date_dict = context.date_dict[0] begin_date = bdd_util.get_date(date_dict['begin_date']) end_date = bdd_util.get_date(date_dict['end_date']) url = u'/stats/api/ordernum_value/?start_date={}&end_date={}'.format(util_dateutil.date2string(begin_date), util_dateutil.date2string(end_date)) context.response = client.get(url) bdd_util.assert_api_call_success(context.response) data = json.loads(context.response.content)['data'] date_list = data['xAxis']['data'] value_list = data['series'][0]['data'] actual = {} for i in range(len(date_list)): actual[date_list[i]] = value_list[i] expected = {} for row in context.table: expected[row['date']] = row['order_quantity'] bdd_util.assert_dict(expected, actual)
def api_get(request): """ 获取微品牌价值 @param wid webapp_id @param dates 日期列表,多日期用逗号(,)分隔。默认是当天。 """ webapp_id = request.REQUEST.get('wid') print("webapp_id: {}".format(webapp_id)) dates = request.REQUEST.get('dates') if dates is None or len(dates) < 1: dates = [utils_dateutil.date2string(utils_dateutil.now())] else: dates = dates.split(',') #values = [ {"date":date_str, "bv":get_brand_value(webapp_id, date_str)} for date_str in dates ] values = { date_str: get_brand_value(webapp_id, date_str) for date_str in dates } response = create_response(200) response.data = {"values": values} return response.get_response()
def api_get(request): """ 获取营销活动的列表 @see channel_qrcode/api_view.py """ # 分析活动的类型: qrcode, lottery activity_type = request.GET.get('type', 'qrcode') # 获取分页数据 cur_page = int(request.GET.get('page', '1')) # 获取每页个数 count_per_page = int(request.GET.get('count_per_page', DEFAULT_COUNT_PER_PAGE)) items = [] if activity_type == 'qrcode': # 处理排序 sort_attr = request.GET.get('sort_attr', '-created_at') if sort_attr == '': sort_attr = '-created_at' # 渠道二维码 settings = ChannelQrcodeSettings.objects.filter(owner=request.user).order_by(sort_attr) #setting_ids = [s.id for s in settings] # 分页处理 pageinfo, settings = paginator.paginate(settings, cur_page, count_per_page, query_string=request.META['QUERY_STRING']) # 构造items for setting in settings: # 渠道扫码活动的参与人数 # TODO: 需要优化 members = ChannelQrcodeHasMember.objects.filter(channel_qrcode=setting.id) participant_times = members.count() participant_count = len( set([item['member_id'] for item in members.values("member_id")]) ) items.append({ 'id': setting.id, 'name': setting.name, 'manager': request.user.username, 'parti_times': participant_times, # 参与次数 'parti_person_cnt': participant_count, # 参与人数 'start_at': dateutil.datetime2string(setting.created_at), 'end_at': '-', 'status_text': '已启动', 'status': 1, }) elif activity_type == 'lottery': # 处理排序 sort_attr = request.GET.get('sort_attr', '-end_at') if sort_attr == '': sort_attr = '-end_at' lotteries = Lottery.objects.filter(owner=request.user, is_deleted=False).order_by(sort_attr) # 分页处理 pageinfo, lotteries = paginator.paginate(lotteries, cur_page, count_per_page, query_string=request.META['QUERY_STRING']) # 构造items for setting in lotteries: # 参考: market_tools/tools/lottery/views.py # 渠道扫码活动的参与人数 setting.check_time() participant_times = LotteryRecord.objects.filter(lottery=setting).values("id").count() # 参与次数 # TODO: 需要优化 获取参与人数 participant_count = len( set([item['member_id'] for item in LotteryRecord.objects.filter(lottery_id=setting.id).values("member_id")]) ) item = { 'id': setting.id, 'name': setting.name, 'manager': request.user.username, 'parti_times': participant_times, # 参与次数 'parti_person_cnt': participant_count, # 参与人数 'start_at': dateutil.date2string(setting.start_at), 'end_at': dateutil.date2string(setting.end_at), 'status_text': '-', 'status': setting.status, } if setting.status < len(LOTTERY_STATUS2TEXT): item['status_text'] = LOTTERY_STATUS2TEXT[setting.status] items.append(item) response = create_response(200) response.data = { 'items': items, 'pageinfo': paginator.to_dict(pageinfo), 'sortAttr': sort_attr, 'data': {}, 'type': activity_type, } return response.get_response()
def handle(self, *args, **options): print args week_day = datetime.now().weekday() current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") first_day = "{}-01 00:00:00".format(current_time.rsplit('-', 1)[0]) first_datetime = dateutil.parse_datetime(first_day) file_path = 'order_statistices_in_month_by_hour.xlsx' workbook = xlsxwriter.Workbook(file_path) table = workbook.add_worksheet() alist = [u"日期"] date_list = dateutil.get_date_range_list(first_datetime, datetime.now()) for d in date_list: alist.append(dateutil.date2string(d)) table.write_row('A1', alist) for i in range(24): table.write(i + 1, 0, "%s:00 ~ %s:59" % (i, i)) webapp_ids = [ a.webapp_id for a in UserProfile.objects.filter(webapp_type=1) ] tmp_line = 1 for d in date_list: tmp_line += 1 date_str = dateutil.date2string(d) end_datetime = "%s 23:59:00" % date_str orders = Order.objects.filter(webapp_id__in=webapp_ids, status__in=[3, 4, 5], payment_time__gte=d, payment_time__lte=end_datetime, origin_order_id__in=[0, -1]) for i in range(24): print "%s %s:00" % (date_str, i), "----", "%s %s:59" % ( date_str, i), "count()==", orders.filter( webapp_id__in=webapp_ids, payment_time__gte="%s %s:00" % (date_str, i), payment_time__lte="%s %s:59" % (date_str, i), origin_order_id__in=[0, -1]).count() total_price = orders.filter( webapp_id__in=webapp_ids, payment_time__gte="%s %s:00" % (date_str, i), payment_time__lte="%s %s:59" % (date_str, i), origin_order_id__in=[0, -1]).aggregate( Sum('product_price'))['product_price__sum'] if not total_price: total_price = 0 table.write(i + 1, tmp_line - 1, total_price) workbook.close() receivers = ['*****@*****.**', '*****@*****.**'] mode = '' if len(args) == 1: if args[0] == 'test': mode = 'test' receivers = ['*****@*****.**'] title = u'微众自运营平台当月时间段订单金额{}'.format(current_time) content = u'您好,微众自运营平台当月时间段订单金额' sendmail(receivers, title, content, mode, file_path)
def api_get(request): """ 返回微品牌价值的EChart数据 """ start_date = request.GET.get('start_date') end_date = request.GET.get('end_date') freq_type = request.GET.get('freq_type') try: periods = int(request.GET.get('periods', DISPLAY_PERIODS_IN_CHARTS)) except: periods = DISPLAY_PERIODS_IN_CHARTS if freq_type == 'week': freq = 'W' elif freq_type == 'month': freq = 'M' else: freq = 'D' if end_date is None: end_date = util_dateutil.now() else: try: end_date = util_dateutil.parse_date(end_date) except: notify_msg = u"参数错误, cause:\n{}".format(unicode_full_stack()) watchdog_warning(notify_msg) end_date = util_dateutil.now() webapp_id = request.user_profile.webapp_id if start_date is not None: date_range = pd.date_range(start=start_date, end=end_date, freq=freq) else: # 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点) date_range = pd.date_range(end=end_date, periods=periods, freq=freq) date_list = [] values = [] # TODO: 需要优化。可以一次计算完成 for date in date_range: date_str = util_dateutil.date2string( date.to_datetime()) # 将pd.Timestamp转成datetime date_list.append(date_str) values.append(get_brand_value(webapp_id, date_str)) print("date_list: {}".format(date_list)) response = create_line_chart_response( "", "", #['2010-10-10', '2010-10-11', '2010-10-12', '2010-10-13'], date_list, [{ "name": "品牌价值", "values": values }]) return response
def overview_board(request): ''' 数据罗盘,数据一览表 ORDER_STATUS_NOT = 0 # 待支付:已下单,未付款 ORDER_STATUS_CANCEL = 1 # 已取消:取消订单 ORDER_STATUS_PAYED_SUCCESSED = 2 # 已支付:已下单,已付款 ORDER_STATUS_PAYED_NOT_SHIP = 3 # 待发货:已付款,未发货 ORDER_STATUS_PAYED_SHIPED = 4 # 已发货:已付款,已发货 ORDER_STATUS_SUCCESSED = 5 # 已完成:自下单10日后自动置为已完成状态 ORDER_STATUS_REFUNDING = 6 # 退款中 ORDER_STATUS_REFUNDED = 7 # 退款完成 ''' webapp_id = request.user.get_profile().webapp_id date_str = util_dateutil.date2string(datetime.today()) today = datetime.today() try: # ORDER_STATUS_PAYED_NOT_SHIP = 3 # 待发货:已付款,未发货 #ORDER_STATUS_REFUNDING = 6 #退款中 #品牌价值 (brand_value, yesterday_value, increase_sign, increase_percent) = get_latest_brand_value(webapp_id) #关注会员总数 subscribed_member_count = stats_util.get_subscribed_member_count(webapp_id) #总成交订单 all_order = Order.by_webapp_id(webapp_id).filter(status__in=ORDER_SOURCE) all_deal_order_count = all_order.count() #总成交额 cash + weizoom_card all_deal_order_money = float(sum([(order.final_price + order.weizoom_card_money) for order in all_order])) #待发货订单 total_to_be_shipped_order_count = Order.by_webapp_id(webapp_id).filter(status=ORDER_STATUS_PAYED_NOT_SHIP).count() #待退款订单 total_refunding_order_count = Order.by_webapp_id(webapp_id).filter(status=ORDER_STATUS_REFUNDING).count() #今日订单 today_begin_str = datetime.today().strftime('%Y-%m-%d')+' 00:00:00' today_now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S') today_begin=datetime.strptime(today_begin_str,'%Y-%m-%d %H:%M:%S') today_now = datetime.strptime(today_now_str,'%Y-%m-%d %H:%M:%S') today_deal_order= all_order.filter(update_at__gte=today_begin,update_at__lte=today_now) today_deal_order_count = today_deal_order.count() #今日成交额 cash + weizoom_card today_deal_money = float(sum([(order.final_price + order.weizoom_card_money) for order in today_deal_order])) data = { 'webapp_id':webapp_id, 'brand_value':format(brand_value, ','), 'subscribed_member_count':subscribed_member_count, 'all_deal_order_money':'%.2f'%all_deal_order_money, 'all_deal_order_count':all_deal_order_count, 'today_deal_money':'%.2f'%today_deal_money, 'today_deal_order_count':today_deal_order_count, 'total_to_be_shipped_order_count':total_to_be_shipped_order_count, 'total_refunding_order_count':total_refunding_order_count } response = create_response(200) response.data = data except: response = create_response(500) response.errMsg = u'系统繁忙,请稍后重试' return response.get_response()
def api_get(request): #将省份处理成dict id2province = {} provinces = Province.objects.all() for province in provinces: id2province[province.id] = province.name #将省份处理成dict result = [] days = int(request.GET.get("days", "30")) today = datetime.now() pre_date = date2string(get_date_after_days(today, -days)) webapp_id = request.GET.get('webapp_id', None) orders = Order.objects.filter(webapp_id=webapp_id, payment_time__gte=pre_date, status__in=[3, 4, 5]).order_by('-payment_time') webapp_user_ids = set([order.webapp_user_id for order in orders]) from modules.member.models import Member webappuser2member = Member.members_from_webapp_user_ids( webapp_user_ids) for order in orders: # 获取order对应的member的显示名 member = webappuser2member.get(order.webapp_user_id, None) if member: order.buyer_name = member.username_for_html order.member_id = member.id else: order.buyer_name = u'未知' order.member_id = 0 order.province_id = order.area.split('_')[0] #根据订单获取商品 products = mall_api.get_order_products(order) order.province_id = order.area.split('_')[0] if len(order.province_id) > 0: order.province_name = id2province[int(order.province_id)] infor_dict = {} infor_dict["province_name"] = order.province_name infor_dict["username"] = order.buyer_name infor_dict["products"] = [] for product in products: if product["promotion"] and product["promotion"].has_key( "type") and product["promotion"][ "type"] == "premium_sale:premium_product": infor_dict["products"].append({ "promotion_name": product["name"], "count": product["count"] }) else: infor_dict["products"].append({ "name": product["name"], "count": product["count"] }) result.append(infor_dict) response = create_response(200) response.data = {'items': result} #return response.get_response() return response.get_jsonp_response(request)
def step_impl(context): client = context.client date_dict = context.date_dict[0] begin_date = bdd_util.get_date(date_dict['begin_date']) end_date = bdd_util.get_date(date_dict['end_date']) url = u'/stats/api/manage_summary/?design_mode=0&version=1&start_date={}&end_date={}&count_per_page=10&page=1&enable_paginate=1'.format(util_dateutil.date2string(begin_date), util_dateutil.date2string(end_date)) context.response = client.get(url) bdd_util.assert_api_call_success(context.response) context.data = json.loads(context.response.content)['data']
def _profunc_today_date(param): # 返回今天日期YYYY-MM-DD return utils_dateutil.date2string(utils_dateutil.now())