Пример #1
0
        //-------------------------------Вспомогательные методы----------------------------------------

        //Проверка, входит ли дата в указанный период
        private bool dateIsSuitable(string date, StatisticsPeriod period)
        {
            //Разбиваем строку с датой на день, месяц и год
            string[] sep_date = date.Split(new char[] { '.' });

            //Вычисляем текущую дату
            DateTime now = DateTime.Now;

            //Разбиваем now на дату и время
            string[] date_time = now.ToString("dd.MM.yyyy H:mm:ss").Split(new char[] { ' ' });
            //Разбиваем дату на день, месяц и год
            string[] cur_date = date_time[0].Split(new char[] { '.' });

            switch (period)
            {
            case StatisticsPeriod.Week:
                return(periodNoMoreThanWeek(sep_date, cur_date));

            case StatisticsPeriod.Month:
                return(periodNoMoreThanMonth(sep_date, cur_date));

            default:
                return(periodNoMoreThanYear(sep_date, cur_date));
            }
        }
Пример #2
0
        public async Task <IEnumerable <Statistics> > Get(
            StatisticsPeriod period,
            Int32Parameter cycle,
            Int32Parameter level,
            TimestampParameter timestamp,
            DateTimeParameter date,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"SELECT * FROM ""Statistics""");

            if (period == StatisticsPeriod.Cyclic)
            {
                sql.Filter(@"""Cycle"" IS NOT NULL");
            }
            else if (period == StatisticsPeriod.Daily)
            {
                sql.Filter(@"""Date"" IS NOT NULL");
            }

            sql.Filter("Cycle", cycle)
            .Filter("Level", level)
            .Filter("Level", timestamp)
            .Filter("Date", date)
            .Take(sort, offset, limit, x => x switch
            {
                "level" => ("Level", "Level"),
                "cycle" => ("Cycle", "Cycle"),
                "date" => ("Date", "Date"),
                _ => ("Id", "Id")
            });
Пример #3
0
        private void setStatistics(StatisticsPeriod period)
        {
            if (_history.Count == 0) //Если операций нет
            {
                return;              //То показывать нечего
            }
            _chart_source.Clear();
            ch_statistics.Series["series"].Points.Clear();
            //Заполняем источник данных для диаграммы
            foreach (Label label in _history)
            {
                //Разбиваем текст каждой записи на массив слов
                string[] label_text = label.Content.ToString().Split(new char[] { ' ' });

                //Проверка, совпадает ли критерий "Получено/Потрачено"
                if (((ComboBoxItem)cb_expenses_income.SelectedItem).Content.ToString().ToLower() == "расходы" && label_text[2] == "получено" ||
                    ((ComboBoxItem)cb_expenses_income.SelectedItem).Content.ToString().ToLower() == "доходы" && label_text[2] == "потрачено")
                {
                    continue;
                }

                //Проверяем, входит ли дата операции в нужный периодW
                if (!dateIsSuitable(label_text[0], period))
                {
                    break;
                }

                //Проверяем, добавлена ли текущая категория в диаграмму
                if (categoryExists(_chart_source, label_text)) //Если категория уже есть в диаграмме
                {
                    //То обновляем существующее значение
                    string key = label_text[6]; //Собираем в одну строку название категории
                    for (int i = 7; i < label_text.Length; ++i)
                    {
                        key += " " + label_text[i];
                    }

                    _chart_source[key] += Int32.Parse(label_text[3]);
                }
                else
                {
                    //Иначе - добавляем новый элемент
                    string key = label_text[6]; //Собираем в одну строку название категории
                    for (int i = 7; i < label_text.Length; ++i)
                    {
                        key += " " + label_text[i];
                    }
                    _chart_source.Add(key, Int32.Parse(label_text[3]));
                }
            }

            if (_chart_source.Count == 0) //Если не нашлось подходящих записей
            {
                lb_statistics.Text = String.Empty;
                return; //нечего рисовать на диаграмме
            }

            Dictionary <string, int> .KeyCollection key_coll = _chart_source.Keys;
            foreach (string key in key_coll)
            {
                ch_statistics.Series["series"].Points.AddXY(key, _chart_source[key]);
            }


            //Настройка текста под графиком
            setStatisticsText(_chart_source);
        }
Пример #4
0
        public async Task <AjaxResult> TrendStatisticsAnalysis(DateTime startDate, DateTime endDate, StatisticsPeriod period)
        {
            return(await AjaxResult.Business(async result =>
            {
                if (startDate >= endDate)
                {
                    throw new BussinessException("此时间段不受支持");
                }

                var(amountColumn, quantityColumn) =
                    await _statisticsContract.TrendStatisticsAnalysisAsync(startDate, endDate, period);
                result.Success(new { amountColumn, quantityColumn });
            }));
        }
Пример #5
0
        public async Task <ValueTuple <ColumnChartDto, ColumnChartDto> > TrendStatisticsAnalysisAsync(DateTime startDate, DateTime endDate, StatisticsPeriod period)
        {
            var datas = await _saleOrderRepo.Query()
                        .Where(po => po.DateTime != null && po.DateTime >= startDate && po.DateTime <= endDate)
                        .Select(po => new
            {
                X        = period == StatisticsPeriod.Month ? po.DateTime.Value.Month : po.DateTime.Value.Year,
                Amount   = po.TotalAmount,
                Quantity = po.TotalQuantity
            })
                        .GroupBy(o => o.X)
                        .OrderBy(o => o.Key)
                        .ToListAsync();

            var amountColumn = new ColumnChartDto
            {
                Data = datas.Select(d => new ColumnDto
                {
                    Xpos = d.Key.ToString(),
                    Ypos = d.Sum(t => t.Amount)
                }).ToList()
            };

            var quantityColumn = new ColumnChartDto
            {
                Data = datas.Select(d => new ColumnDto
                {
                    Xpos = d.Key.ToString(),
                    Ypos = d.Sum(t => t.Quantity)
                })
                       .ToList()
            };

            return(amountColumn, quantityColumn);
        }