fix 查询优化
This commit is contained in:
@@ -39,7 +39,7 @@ public class MealSupplementsRecordController
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("my")]
|
||||
public async Task<List<MealSupplementRecordMyResponse>> GetMyMealSupplementRecords([FromQuery] MealSupplementRecordMyRequest request)
|
||||
public async Task<MealSupplementRecordMyResponse> GetMyMealSupplementRecords([FromQuery] MealSupplementRecordMyRequest request)
|
||||
{
|
||||
return await _mealSupplementRecordService.GetMyMealSupplementRecords(request);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace Dlhis.Canteen.MealSupplementRecord.Response;
|
||||
|
||||
public class MealSupplementRecordMyResponse
|
||||
public class MealSupplementRecordItemResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 餐补日期
|
||||
@@ -22,3 +22,16 @@ public class MealSupplementRecordMyResponse
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
|
||||
public class MealSupplementRecordMyResponse
|
||||
{
|
||||
[JsonIgnore]
|
||||
public decimal CurrentMonthSum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前月份总和
|
||||
/// </summary>
|
||||
public string MonthSum => CurrentMonthSum.ToString("f2");
|
||||
|
||||
public List<MealSupplementRecordItemResponse> Items { get; set; }
|
||||
}
|
||||
|
||||
@@ -8,5 +8,5 @@ public interface IMealSupplementRecordService : IScopeDependency
|
||||
{
|
||||
Task<Pagination<MealSupplementRecordResponse>> GetPageAsync(MealSupplementRecordRequest request);
|
||||
|
||||
Task<List<MealSupplementRecordMyResponse>> GetMyMealSupplementRecords(MealSupplementRecordMyRequest request);
|
||||
Task<MealSupplementRecordMyResponse> GetMyMealSupplementRecords(MealSupplementRecordMyRequest request);
|
||||
}
|
||||
|
||||
@@ -50,21 +50,37 @@ public class MealSupplementRecordService : IMealSupplementRecordService
|
||||
return page;
|
||||
}
|
||||
|
||||
public async Task<List<MealSupplementRecordMyResponse>> GetMyMealSupplementRecords(MealSupplementRecordMyRequest request)
|
||||
public async Task<MealSupplementRecordMyResponse> GetMyMealSupplementRecords(MealSupplementRecordMyRequest request)
|
||||
{
|
||||
var code = _currentUser.GetUserClaim("jinko-code") ?? string.Empty;
|
||||
|
||||
return await _dbContext.Queryable<MealSupplementRecordEntity>()
|
||||
var data = await _dbContext.Queryable<MealSupplementRecordEntity>()
|
||||
.Where(x => x.Date >= request.SearchDateTimePeriod.Start && x.Date <= request.SearchDateTimePeriod.End)
|
||||
.Where(x => x.Status == MealSupplementStatusEnumtype.Success)
|
||||
.Where(x => x.Code == code)
|
||||
.OrderBy(x => x.Date, OrderByType.Desc)
|
||||
.Select(x => new MealSupplementRecordMyResponse
|
||||
.Select(x => new MealSupplementRecordItemResponse
|
||||
{
|
||||
CurrentAmount = x.Amount,
|
||||
Date = x.Date,
|
||||
Remark = x.Remark
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
var now = DateTime.Now;
|
||||
var monthStart = new DateTime(now.Year, now.Month, 1);
|
||||
var monthEnd = monthStart.AddMonths(1).AddSeconds(-1);
|
||||
|
||||
var monthSum = await _dbContext.Queryable<MealSupplementRecordEntity>()
|
||||
.Where(x => x.Date >= monthStart && x.Date <= monthEnd)
|
||||
.Where(x => x.Status == MealSupplementStatusEnumtype.Success)
|
||||
.Where(x => x.Code == code)
|
||||
.SumAsync(x => SqlFunc.Abs(x.Amount));
|
||||
|
||||
return new MealSupplementRecordMyResponse
|
||||
{
|
||||
CurrentMonthSum = monthSum,
|
||||
Items = data,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public class BalancesController : ControllerBase
|
||||
/// <returns></returns>
|
||||
[HttpGet("user/page")]
|
||||
[IgnoreTenant]
|
||||
public async Task<Pagination<BalanceRecordUserResponse>> GetPageByUserAsync([FromQuery] BalanceRecordUserPageRequest request)
|
||||
public async Task<BalanceRecordUserResultResponse> GetPageByUserAsync([FromQuery] BalanceRecordUserPageRequest request)
|
||||
{
|
||||
return await _balanceService.GetPageByUserAsync(request);
|
||||
}
|
||||
|
||||
@@ -3,71 +3,80 @@ using Kurisu.Core.CustomClass;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Kurisu.Core.DataAccess.Dto;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Request
|
||||
namespace Dlhis.Canteen.Order.Request;
|
||||
|
||||
public class BalanceRecordUserPageRequest : PageDto, IValidatableObject
|
||||
{
|
||||
public class BalanceRecordUserPageRequest : PageDto, IValidatableObject
|
||||
/// <summary>
|
||||
/// 查询日期范围类型 DateTimeSearchEnumType
|
||||
/// </summary>
|
||||
[EnumDataType(typeof(DateTimeSearchEnumType))]
|
||||
public DateTimeSearchEnumType? SearchDateTimeDimension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消费应用类型
|
||||
/// </summary>
|
||||
public CanteenApplicaitonTypeEnumType? ApplicationType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 日期范围查询
|
||||
/// </summary>
|
||||
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询日期范围类型 DateTimeSearchEnumType
|
||||
/// </summary>
|
||||
[EnumDataType(typeof(DateTimeSearchEnumType))]
|
||||
public DateTimeSearchEnumType? SearchDateTimeDimension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消费应用类型
|
||||
/// </summary>
|
||||
public CanteenApplicaitonTypeEnumType? ApplicationType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 日期范围查询
|
||||
/// </summary>
|
||||
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
var now = DateTime.Now;
|
||||
if (SearchDateTimeDimension.HasValue)
|
||||
{
|
||||
var now = DateTime.Now;
|
||||
if (SearchDateTimeDimension.HasValue)
|
||||
//重新赋值
|
||||
SearchDateTimePeriod = new DateTimePeriod();
|
||||
|
||||
if (SearchDateTimeDimension == DateTimeSearchEnumType.Day)
|
||||
{
|
||||
//重新赋值
|
||||
SearchDateTimePeriod = new DateTimePeriod();
|
||||
|
||||
if (SearchDateTimeDimension == DateTimeSearchEnumType.Day)
|
||||
{
|
||||
SearchDateTimePeriod.Start = DateTime.Today;
|
||||
SearchDateTimePeriod.End = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Week)
|
||||
{
|
||||
SearchDateTimePeriod.Start = now.AddDays(1 - (int)now.DayOfWeek);
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddDays(6);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Month)
|
||||
{
|
||||
SearchDateTimePeriod.Start = new DateTime(now.Year, now.Month, 1);
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddMonths(1).AddDays(-1);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Season)
|
||||
{
|
||||
SearchDateTimePeriod.Start = now.AddMonths(0 - (now.Month - 1) % 3);
|
||||
SearchDateTimePeriod.End = now.AddMonths(3 - (now.Month - 1) % 3).AddMonths(1).AddDays(-1);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.HalfOfYear)
|
||||
{
|
||||
SearchDateTimePeriod.Start = now.AddDays(-180);
|
||||
SearchDateTimePeriod.End = now;
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Year)
|
||||
{
|
||||
SearchDateTimePeriod.Start = new DateTime(now.Year, 1, 1);
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddYears(1).AddDays(-1);
|
||||
}
|
||||
|
||||
SearchDateTimePeriod.Start = SearchDateTimePeriod.Start.Value.Date;
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.Date;
|
||||
SearchDateTimePeriod.Start = DateTime.Today;
|
||||
SearchDateTimePeriod.End = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Week)
|
||||
{
|
||||
SearchDateTimePeriod.Start = now.AddDays(1 - (int)now.DayOfWeek);
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddDays(6);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Month)
|
||||
{
|
||||
SearchDateTimePeriod.Start = new DateTime(now.Year, now.Month, 1);
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddMonths(1).AddDays(-1);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Season)
|
||||
{
|
||||
SearchDateTimePeriod.Start = now.AddMonths(0 - (now.Month - 1) % 3);
|
||||
SearchDateTimePeriod.End = now.AddMonths(3 - (now.Month - 1) % 3).AddMonths(1).AddDays(-1);
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.HalfOfYear)
|
||||
{
|
||||
SearchDateTimePeriod.Start = now.AddDays(-180);
|
||||
SearchDateTimePeriod.End = now;
|
||||
}
|
||||
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Year)
|
||||
{
|
||||
SearchDateTimePeriod.Start = new DateTime(now.Year, 1, 1);
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddYears(1).AddDays(-1);
|
||||
}
|
||||
|
||||
yield break;
|
||||
SearchDateTimePeriod.Start = SearchDateTimePeriod.Start.Value.Date;
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.Date;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (SearchDateTimePeriod != null)
|
||||
{
|
||||
if (SearchDateTimePeriod.End != null)
|
||||
{
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using Dlhis.Entity.Canteen.Enums;
|
||||
using Kurisu.AspNetCore.Utils.Extensions;
|
||||
using Kurisu.Core.DataAccess.Dto;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Response;
|
||||
|
||||
public class BalanceRecordUserResponse
|
||||
public class BalanceRecordUserPageResponse
|
||||
{
|
||||
public long Id { get; set; }
|
||||
|
||||
@@ -20,37 +22,36 @@ public class BalanceRecordUserResponse
|
||||
public string SourceDesc => Source.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 收入/支出
|
||||
/// 金额
|
||||
/// </summary>
|
||||
public BalanceRecordTypeEnumType Type { get; set; }
|
||||
|
||||
public string TypeDesc => Type.GetDescription();
|
||||
[JsonIgnore]
|
||||
public decimal CurrentAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 金额
|
||||
/// </summary>
|
||||
public decimal Amount { get; set; }
|
||||
public string Amount => CurrentAmount.ToString("f2");
|
||||
|
||||
/// <summary>
|
||||
/// 营业点
|
||||
/// </summary>
|
||||
public string BusinessPlaceName { get; set; }
|
||||
|
||||
public string BusinessShiftName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据状态
|
||||
/// 餐次
|
||||
/// </summary>
|
||||
public BalanceRecordStatusEnumType Status { get; set; }
|
||||
public ShiftEnumType? ShiftType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据状态描述
|
||||
/// 餐次
|
||||
/// </summary>
|
||||
public string StatusDesc => Status.GetDescription();
|
||||
public string ShiftTypeDesc => ShiftType?.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 记录产生日期
|
||||
/// 消费时间
|
||||
/// </summary>
|
||||
public DateTime CostDateTime { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 消费应用类型
|
||||
/// </summary>
|
||||
@@ -61,3 +62,18 @@ public class BalanceRecordUserResponse
|
||||
/// </summary>
|
||||
public string ApplicationTypeDesc => ApplicationType.GetDescription();
|
||||
}
|
||||
|
||||
|
||||
public class BalanceRecordUserResultResponse
|
||||
{
|
||||
[JsonIgnore]
|
||||
public decimal CurrentMonthSum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前月份总和
|
||||
/// </summary>
|
||||
public string MonthSum => CurrentMonthSum.ToString("f2");
|
||||
|
||||
|
||||
public Pagination<BalanceRecordUserPageResponse> Items { get; set; }
|
||||
}
|
||||
@@ -11,7 +11,7 @@ public interface IBalanceService : IScopeDependency
|
||||
|
||||
Task<Pagination<BalanceRecordResponse>> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request);
|
||||
|
||||
Task<Pagination<BalanceRecordUserResponse>> GetPageByUserAsync(BalanceRecordUserPageRequest request);
|
||||
Task<BalanceRecordUserResultResponse> GetPageByUserAsync(BalanceRecordUserPageRequest request);
|
||||
|
||||
Task ObsoluteAsync(BalanceRecordObsoluteRequest request);
|
||||
|
||||
|
||||
@@ -515,44 +515,48 @@ public class BalanceService : IBalanceService
|
||||
return page;
|
||||
}
|
||||
|
||||
public async Task<Pagination<BalanceRecordUserResponse>> GetPageByUserAsync(BalanceRecordUserPageRequest request)
|
||||
public async Task<BalanceRecordUserResultResponse> GetPageByUserAsync(BalanceRecordUserPageRequest request)
|
||||
{
|
||||
//当前用户
|
||||
var subjectId = _currentUser.GetIntSubjectId();
|
||||
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.IdentityUserId == subjectId).FirstAsync();
|
||||
var jinkoCode = _currentUser.GetUserClaim("jinko-code") ?? string.Empty;
|
||||
if (jinkoCode.IsPresent())
|
||||
{
|
||||
gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == jinkoCode).FirstAsync();
|
||||
}
|
||||
|
||||
var page = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.LeftJoin<GainfoEntity>((record, ga) => record.UserNo == ga.No)
|
||||
.LeftJoin<DepartmentEntity>((record, ga, department) => ga.DepartmentNo == department.No)
|
||||
.LeftJoin<BusinessPlaceEntity>((record, ga, department, bplace) => record.BusinessPlaceCode == bplace.Code)
|
||||
.LeftJoin<BusinessPlaceShiftRelationshipEntity>((record, ga, department, bplace, bshiftR) => bplace.Code == bshiftR.PlaceCode)
|
||||
.LeftJoin<BusinessShiftEntity>((record, ga, department, bplace, bshiftR, shift) => shift.Code == bshiftR.ShiftCode)
|
||||
.Where(record => record.Type == BalanceRecordTypeEnumType.Out)
|
||||
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CostDate >= request.SearchDateTimePeriod.Start)
|
||||
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.WhereIF(request.ApplicationType.HasValue, record => record.ApplicationType == request.ApplicationType)
|
||||
.Where((record, ga) => ga.Code == gainfo.Code)
|
||||
.Where((record, ga) => ga.Code == jinkoCode)
|
||||
.OrderBy(record => record.CreateTime, OrderByType.Desc)
|
||||
.Select((record, ga, department, bplace, bshiftR, shift) => new BalanceRecordUserResponse
|
||||
.Select((record, ga, department, bplace) => new BalanceRecordUserPageResponse
|
||||
{
|
||||
Id = record.Id,
|
||||
Amount = record.Amount,
|
||||
Type = record.Type,
|
||||
Status = record.Status,
|
||||
CurrentAmount = record.Amount,
|
||||
Source = record.Source,
|
||||
No = record.No,
|
||||
BusinessPlaceName = bplace.Name,
|
||||
BusinessShiftName = shift.Name,
|
||||
ShiftType = record.ShiftType,
|
||||
CostDateTime = record.CostDateTime,
|
||||
ApplicationType = record.ApplicationType,
|
||||
})
|
||||
.ToPageListAsync(request);
|
||||
|
||||
return page;
|
||||
var now = DateTime.Now;
|
||||
var monthStart = new DateTime(now.Year, now.Month, 1);
|
||||
var monthEnd = monthStart.AddMonths(1).AddSeconds(-1);
|
||||
|
||||
var monthSum = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.Where(x => x.CostDateTime >= monthStart && x.CostDateTime <= monthEnd)
|
||||
.Where(x => x.Type == BalanceRecordTypeEnumType.Out)
|
||||
.Where(x => x.UserCode == jinkoCode)
|
||||
.SumAsync(x => SqlFunc.Abs(x.Amount));
|
||||
|
||||
return new BalanceRecordUserResultResponse
|
||||
{
|
||||
CurrentMonthSum = monthSum,
|
||||
Items = page
|
||||
};
|
||||
}
|
||||
|
||||
public async Task ObsoluteAsync(BalanceRecordObsoluteRequest request)
|
||||
|
||||
Reference in New Issue
Block a user