示例#1
0
 public ResultDto <List <Dictionary <string, object> > > GetTimeStatistic(
     [FromQuery] TimeStatisticQueryDto timeStatisticQueryDto, [FromQuery] ItContractPayRecordQueryDto queryDto)
 {
     return(_service.GetTimeStatistic(timeStatisticQueryDto, queryDto));
 }
        public List <Dictionary <string, object> > GetTimeStatistic(TimeStatisticQueryDto timeStatisticQueryDto, ItContractPayRecordQueryDto queryDto)
        {
            Expression <Func <ItContractPayRecord, dynamic> > groupExp = null;
            Func <DateTime, int, DateTime> dateFunc      = null;
            Func <DateTime, DateTime>      beginDateFunc = null;
            Func <DateTime, DateTime>      endDateFunc   = null;
            string format = "";

            switch (timeStatisticQueryDto.unit)
            {
            case "year":
                format        = "yyyy";
                dateFunc      = (datetime, i) => datetime.Date.AddYears(i);
                beginDateFunc = datetime => new DateTime(datetime.Year, 1, 1);
                endDateFunc   = datetime => new DateTime(datetime.Year + 1, 1, 1);
                groupExp      = e => new
                {
                    unit = e.pay_date.Year.ToString()
                };
                break;

            case "day":
                format        = "yyyy-M-d";
                dateFunc      = (datetime, i) => datetime.AddDays(i);
                beginDateFunc = datetime => datetime.Date;
                endDateFunc   = datetime => datetime.AddDays(1).Date;
                groupExp      = e => new
                {
                    unit = e.pay_date.Year.ToString() + "-" + e.pay_date.Month + "-" + e.pay_date.Day
                };
                break;

            case "month":
            default:
                format        = "yyyy-M";
                dateFunc      = (datetime, i) => datetime.AddMonths(i);
                beginDateFunc = datetime => new DateTime(datetime.Year, datetime.Month, 1);
                endDateFunc   = datetime =>
                {
                    datetime = datetime.AddMonths(1);
                    return(new DateTime(datetime.Year, datetime.Month, 1));
                };
                groupExp = e => new
                {
                    unit = e.pay_date.Year.ToString() + "-" + e.pay_date.Month.ToString()
                };

                break;
            }
            if (!timeStatisticQueryDto.time_end.HasValue)
            {
                timeStatisticQueryDto.time_end = DateTime.Today;
            }
            if (!timeStatisticQueryDto.time_begin.HasValue)
            {
                timeStatisticQueryDto.time_begin = dateFunc(timeStatisticQueryDto.time_end.Value, -8);
            }
            DateTime beginTime = beginDateFunc(timeStatisticQueryDto.time_begin.Value);
            DateTime endTime   = endDateFunc(timeStatisticQueryDto.time_end.Value);
            List <Dictionary <string, object> > unitDataList = new List <Dictionary <string, object> >();
            DateTime timeTemp = beginTime;

            while (timeTemp < endTime)
            {
                Dictionary <string, object> dict = new Dictionary <string, object>();
                dict.Add("unit", timeTemp.ToString(format));
                dict.Add("price", 0);
                dict.Add("amount", 0);
                unitDataList.Add(dict);
                timeTemp = dateFunc(timeTemp, 1);
            }
            var query = buildWhere(this.dbQuery, queryDto);

            if (onWhere != null)
            {
                query = onWhere(query, queryDto);
            }
            var data = query.Where(e => e.pay_date >= beginTime && e.pay_date < endTime)
                       .GroupBy(groupExp)
                       .Select(g => new
            {
                Key    = g.Key,
                price  = g.Sum(e => e.pay_price),
                amount = g.Count()
            }).ToList();

            unitDataList.ForEach(i =>
            {
                data.ForEach(i2 =>
                {
                    if (string.Equals(i["unit"], i2.Key.unit))
                    {
                        i["price"]  = i2.price;
                        i["amount"] = i2.amount;
                    }
                });
            });
            return(unitDataList);
        }