以下是优化后的代码:
ResultListOfPageInfo result = new ResultListOfPageInfo();
try
{
if (!query.StartTime.HasValue || !query.EndTime.HasValue)
{
ThrowInvalidInputException("请输入开始时间和结束时间");
}
if (query.EndTime < query.StartTime)
{
ThrowInvalidInputException("开始时间大于结束时间");
}
DateTime endTime = GetEndTime(query);
var ls = GetProductionInfoList(query.StartTime, endTime);
result.List = ls;
result.Total = ls.Count();
result.Msg = "操作成功";
}
catch (Exception ex)
{
result.IsSuccess = false;
result.ResultCode = ApiStatusCode.ERROR;
result.Msg = "操作失败" + ex.Message;
}
return result;
private void ThrowInvalidInputException(string message)
{
throw new ArgumentException("操作失败:" + message);
}
private DateTime GetEndTime(Query query)
{
DateTime endTime;
switch (query.QueryType)
{
case 0:
endTime = query.EndTime.Value.AddDays(1);
break;
case 1:
endTime = query.EndTime.Value.AddMinutes(1);
break;
default:
endTime = query.EndTime.Value.AddYears(1);
break;
}
return endTime;
}
private List GetProductionInfoList(DateTime startTime, DateTime endTime)
{
var select = this.context.PromoteActionSet.Select;
select.Where(a => a.CreateTime >= startTime && a.CreateTime < endTime);
var ls = select
.GroupBy(a => new
{
Date = (query.QueryType == 0 ? a.ActionDate :
query.QueryType == 1 ? a.ActionDate.Substring(0, 7) :
a.ActionDate.Substring(0, 4)),
a.CoalCode
}).
Select(a => new ProductionInfo()
{
CoalCode = a.Key.CoalCode,
CoalName = a.Value.CoalName,
Date = a.Key.Date,
Quantity = a.Value.Quantity,
TaskSuccess = Math.Round((double)a.Sum(a.Value.ActionQuantity) / a.Value.Quantity, 2),
TaskSuccessDesc = (Math.Round((double)a.Sum(a.Value.ActionQuantity) / a.Value.Quantity, 2) * 100) + "%",
QuantitySum = Math.Round((double)a.Sum(a.Value.ActionQuantity), 2)
}).ToList();
return ls;
}
主要优化点如下:
- 把输入参数的验证和异常抛出提取成一个单独的方法 ThrowInvalidInputException,避免代码重复。
- 把获取结束时间的逻辑提取成一个单独的方法 GetEndTime,使代码更加清晰易读。
- 把查询生产信息的逻辑提取成一个单独的方法 GetProductionInfoList,使代码更加模块化,易于维护。