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); }