diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs index c147c32d..17205533 100644 --- a/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs +++ b/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs @@ -56,7 +56,7 @@ public class GainfoDetailResponse /// /// 性别描述 /// - public string GenderCN => Gender.GetDescription(); + public string GenderDesc => Gender.GetDescription(); /// /// 身份证籍贯 @@ -138,6 +138,7 @@ public class GainfoDetailResponse /// /// 入职日期 /// + [JsonConverter(typeof(ToDateJsonConverter))] public DateTime? EntryDate { get; set; } /// diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs index 820713f2..b6c7341f 100644 --- a/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs +++ b/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs @@ -1,4 +1,6 @@ using Dlhis.Basic.Organization.Dto; +using Kurisu.AspNetCore.Utils.Converters; +using Newtonsoft.Json; namespace Dlhis.Basic.Organization.Response; @@ -12,11 +14,13 @@ public class GainfoOutSourceExternalInfoResponse : GainfoOutSourceExternalInfoDt /// /// 入职日期 /// + [JsonConverter(typeof(ToDateJsonConverter))] public DateTime? EntryDate { get; set; } /// /// 离职日期 /// + [JsonConverter(typeof(ToDateJsonConverter))] public DateTime? ResignationDate { get; set; } /// diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs index 8af911b0..80615642 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs @@ -100,13 +100,14 @@ public class GainfoService : IGainfoService .LeftJoin((gainfo, department, type) => type.Code == SqlFunc.ToString(gainfo.CardType) && type.Type == "timeperiod") .WhereIF(request.SearchType != GainfoSearchEnumType.BusinessTrip && request.DepartmentSelections?.Any() == false, gainfo => factories.Contains(gainfo.Factory)) .WhereIF(request.SearchType == GainfoSearchEnumType.Internal, gainfo => SqlFunc.Subqueryable().Where(p => p.Code == gainfo.Code).NotAny()) - .WhereIF(request.SearchType == GainfoSearchEnumType.Outsource, gainfo => SqlFunc.Subqueryable().Where(p => p.Code == gainfo.Code).Any())//&& today >= gainfo.EntryDate && today <= gainfo.ResignationDate + .WhereIF(request.SearchType == GainfoSearchEnumType.Outsource, gainfo => SqlFunc.Subqueryable().Where(p => p.Code == gainfo.Code).Any()) //&& today >= gainfo.EntryDate && today <= gainfo.ResignationDate .WhereIF(request.SearchType == GainfoSearchEnumType.BusinessTrip, gainfo => SqlFunc.Subqueryable().Where(p => p.Code == gainfo.Code && factories.Contains(p.Destination) && SqlFunc.DateIsSame(p.BeginDate, today)).Any()) .WhereIF(request.Search.IsPresent(), gainfo => gainfo.Name.Contains(request.Search) || gainfo.Code == request.Search || gainfo.IdNo == request.Search) + .OrderByIF(request.SearchType == GainfoSearchEnumType.Outsource, gainfo => gainfo.ResignationDate, OrderByType.Desc) //外包人员按离职日期倒排 .Select((gainfo, department, type) => new GainfoPageResponse { DepartmentName = department.Name, diff --git a/Src/Dlhis.Canteen/EMealVoucher/Controllers/EMealVoucherController.cs b/Src/Dlhis.Canteen/EMealVoucher/Controllers/EMealVoucherController.cs index a4dd5f14..ab0f2f76 100644 --- a/Src/Dlhis.Canteen/EMealVoucher/Controllers/EMealVoucherController.cs +++ b/Src/Dlhis.Canteen/EMealVoucher/Controllers/EMealVoucherController.cs @@ -1,7 +1,10 @@ using Dlhis.Canteen.EMealVoucher.Request; using Dlhis.Canteen.EMealVoucher.Response; using Dlhis.Canteen.EMealVoucher.Services; +using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Response; using Kurisu.AspNetCore.DataAccess.Dto; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -73,4 +76,16 @@ public class EMealVoucherController : ControllerBase { return await _eMealVoucherService.GetQrCodeAsync(signature); } + + /// + /// 餐券消费分页 + /// + /// + /// + [HttpGet("balance/page")] + [IgnoreTenant] + public async Task> GetEMealVoucherPageAsync([FromQuery] BalanceRecordEMealVoucherPageRequest request) + { + return await _eMealVoucherService.GetEMealVoucherPageAsync(request); + } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/EMealVoucher/Services/IEMealVoucherService.cs b/Src/Dlhis.Canteen/EMealVoucher/Services/IEMealVoucherService.cs index ef41f70a..3ef1ae4f 100644 --- a/Src/Dlhis.Canteen/EMealVoucher/Services/IEMealVoucherService.cs +++ b/Src/Dlhis.Canteen/EMealVoucher/Services/IEMealVoucherService.cs @@ -1,6 +1,9 @@ using Dlhis.Canteen.EMealVoucher.Request; using Dlhis.Canteen.EMealVoucher.Response; +using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Response; using Kurisu.AspNetCore.DataAccess.Dto; +using Microsoft.AspNetCore.Mvc; namespace Dlhis.Canteen.EMealVoucher.Services; @@ -15,4 +18,6 @@ public interface IEMealVoucherService : IScopeDependency Task RefreshSignatureAsync(long detailId); Task GetQrCodeAsync(string signature); + + Task> GetEMealVoucherPageAsync([FromQuery] BalanceRecordEMealVoucherPageRequest request); } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/EMealVoucher/Services/Implements/EMealVoucherService.cs b/Src/Dlhis.Canteen/EMealVoucher/Services/Implements/EMealVoucherService.cs index c00c2fa1..fb689658 100644 --- a/Src/Dlhis.Canteen/EMealVoucher/Services/Implements/EMealVoucherService.cs +++ b/Src/Dlhis.Canteen/EMealVoucher/Services/Implements/EMealVoucherService.cs @@ -1,8 +1,13 @@ using System.Text; using Dlhis.Canteen.EMealVoucher.Request; using Dlhis.Canteen.EMealVoucher.Response; +using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Response; +using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; +using Dlhis.Entity.Canteen.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; @@ -103,4 +108,42 @@ public class EMealVoucherService : IEMealVoucherService return qrCode; } + + /// + public async Task> GetEMealVoucherPageAsync(BalanceRecordEMealVoucherPageRequest request) + { + var tenantId = _currentUser.GetStringTenantId(); + + return await _dbContext.Queryable() + .LeftJoin((x, bPlace) => x.BusinessPlaceCode == bPlace.Code) + .LeftJoin((x, bPlace, department) => x.DepartmentNo == department.No) + .Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) //有效,消费数据 + .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End) //成本日期 + .Where(x => x.Source == BalanceRecordSourceEnumType.EMealVoucher) + .Where(x => SqlFunc.Subqueryable().Where(p => p.Factory == tenantId).Where(p => p.Code == x.UserCode).Any() || x.TenantId == tenantId) + .Select((x, bPlace, department) => new BalanceRecordEMealVoucherResponse + { + No = x.No, + UserNo = x.UserNo, + Name = x.Name, + UserCode = x.UserCode, + DepartmentNo = x.DepartmentNo, + DepartmentName = department.Name, + CostDate = x.CostDate, + Remark = x.Remark, + Source = x.Source, + Type = x.Type, + Amount = SqlFunc.Abs(x.Amount), + BusinessPlaceName = bPlace.Name, + ShiftType = x.ShiftType, + DeviceInfo = x.DeviceUniqueNo, + CostId = x.CostId, + OriginTenantId = x.OriginTenantId, + Status = x.Status, + CostDateTime = x.CostDateTime, + Factory = x.TenantId, + Werks = x.Werks + }) + .ToPageListAsync(request); + } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs index 4bf65777..2de326f2 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs @@ -1,4 +1,5 @@ using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Request.Common; using Dlhis.Canteen.Order.Response; using Dlhis.Canteen.Order.Services; using Kurisu.AspNetCore.DataAccess.Dto; @@ -34,12 +35,12 @@ public class BalanceSummaryController : ControllerBase } /// - /// 用餐分析(成本中心) + /// 餐次用餐分析,统计部门成本中心金额 /// - [HttpGet("analysis/cost")] - public async Task> BalanceRecordAnalysisByCostIdAsync() + [HttpGet("department/analysis/amount")] + public async Task> BalanceRecordAnalysisByCostIdAsync(SummaryCommonDto request) { - return await _balanceSummaryService.BalanceRecordAnalysisByCostIdAsync(); + return await _balanceSummaryService.BalanceRecordAnalysisByCostIdAsync(request); } /// @@ -61,15 +62,4 @@ public class BalanceSummaryController : ControllerBase { return await _balanceSummaryService.BalanceRecordShiftAnalysisAmountAndCountAsync(request); } - - /// - /// 餐次用餐分析,统计金额和人数 - /// - /// - /// - [HttpGet("shift/analysis/amountAndCount")] - public async Task BalanceRecordShiftAnalysisAmountAndCountAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request) - { - return await _balanceSummaryService.BalanceRecordShiftAnalysisAmountAndCountAsync(request); - } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index 32612c15..0e28e4db 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; using System.Data; +using Dlhis.Canteen.EMealVoucher.Services; using Dlhis.Canteen.Order.Request; using Dlhis.Canteen.Order.Response; using Dlhis.Canteen.Order.Services; diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisByShiftRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisByShiftRequest.cs index 65f99310..0933998f 100644 --- a/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisByShiftRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisByShiftRequest.cs @@ -1,29 +1,7 @@ -using System.ComponentModel.DataAnnotations; -using Kurisu.AspNetCore.CustomClass; -using Kurisu.AspNetCore.DataAccess.Dto; +using Dlhis.Canteen.Order.Request.Common; namespace Dlhis.Canteen.Order.Request; -public class BalanceRecordAnalysisByShiftRequest : PageDto, IValidatableObject +public class BalanceRecordAnalysisByShiftRequest : SummaryCommonDto { - /// - /// 营业点 - /// - public List BusinessPlaceCodes { get; set; } - - /// - /// - /// - public DateTimePeriod SearchDateTimePeriod { get; set; } - - /// - public IEnumerable Validate(ValidationContext validationContext) - { - if (SearchDateTimePeriod is { End: not null }) - { - SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1); - } - - yield break; - } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs index 6995147b..8b02b7a6 100644 --- a/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs @@ -1,25 +1,11 @@ -using System.ComponentModel.DataAnnotations; -using Kurisu.AspNetCore.CustomClass; -using Kurisu.AspNetCore.DataAccess.Dto; +using Dlhis.Canteen.Order.Request.Common; namespace Dlhis.Canteen.Order.Request; -public class BalanceRecordAnalysisRequest : PageDto, IValidatableObject +public class BalanceRecordAnalysisRequest : SummaryCommonDto { - public DateTimePeriod SearchDateTimePeriod { get; set; } - /// /// 营业点 /// public Guid? BusinessPlaceCode { get; set; } - - public IEnumerable Validate(ValidationContext validationContext) - { - if (SearchDateTimePeriod is { End: not null }) - { - SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1); - } - - yield break; - } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordEMealVoucherPageRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordEMealVoucherPageRequest.cs new file mode 100644 index 00000000..f4d717f6 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordEMealVoucherPageRequest.cs @@ -0,0 +1,9 @@ +using Kurisu.AspNetCore.CustomClass; +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Canteen.Order.Request; + +public class BalanceRecordEMealVoucherPageRequest : PageDto +{ + public DateTimePeriod SearchDateTimePeriod { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Request/Common/SummaryCommonDto.cs b/Src/Dlhis.Canteen/Order/Request/Common/SummaryCommonDto.cs new file mode 100644 index 00000000..7b9b41f5 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/Common/SummaryCommonDto.cs @@ -0,0 +1,28 @@ +using System.ComponentModel.DataAnnotations; +using Kurisu.AspNetCore.CustomClass; +using Kurisu.AspNetCore.DataAccess.Dto; + +namespace Dlhis.Canteen.Order.Request.Common; + +public class SummaryCommonDto : PageDto, IValidatableObject +{ + /// + /// 营业点 + /// + public List BusinessPlaceCodes { get; set; } + + /// + /// 日期范围 + /// + public DateTimePeriod SearchDateTimePeriod { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (SearchDateTimePeriod is { End: not null }) + { + SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1); + } + + yield break; + } +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisByCostResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisByCostResponse.cs deleted file mode 100644 index d9c97fa5..00000000 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisByCostResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Dlhis.Canteen.Order.Response; - -public class BalanceRecordAnalysisByCostResponse -{ - -} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisDepartmentResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisDepartmentResponse.cs new file mode 100644 index 00000000..7692aa61 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisDepartmentResponse.cs @@ -0,0 +1,5 @@ +namespace Dlhis.Canteen.Order.Response; + +public class BalanceRecordAnalysisDepartmentResponse +{ +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordEMealVoucherResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordEMealVoucherResponse.cs new file mode 100644 index 00000000..6dc5dd5e --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordEMealVoucherResponse.cs @@ -0,0 +1,129 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Converters; +using Kurisu.AspNetCore.Utils.Extensions; +using Newtonsoft.Json; + +namespace Dlhis.Canteen.Order.Response; + +public class BalanceRecordEMealVoucherResponse +{ + public long Id { get; set; } + + /// + /// 流水号 + /// + public string No { get; set; } + + /// + /// 档案号/QRCode + /// + public string UserNo { get; set; } + + /// + /// 姓名 + /// + public string Name { get; set; } + + /// + /// 学工号 + /// + public string UserCode { get; set; } + + /// + /// 部门号 + /// + public string DepartmentNo { get; set; } + + /// + /// 部门 + /// + public string DepartmentName { get; set; } + + /// + /// 所属成本日期 + /// + [JsonConverter(typeof(ToDateJsonConverter))] + public DateTime CostDate { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 来源 + /// + public BalanceRecordSourceEnumType Source { get; set; } + + /// + /// 消费识别来源 + /// + public string SourceDesc => Source.GetDescription(); + + /// + /// 收入/支出 + /// + public BalanceRecordTypeEnumType Type { get; set; } + + public string TypeDesc => Type.GetDescription(); + + /// + /// 金额 + /// + public decimal Amount { get; set; } + + /// + /// 营业点 + /// + public string BusinessPlaceName { get; set; } + + /// + /// 餐次 + /// + public ShiftEnumType? ShiftType { get; set; } + + /// + /// 餐次 + /// + public string ShiftTypeDesc => ShiftType?.GetDescription(); + + /// + /// 消费机器唯一信息 + /// + public string DeviceInfo { get; set; } + + /// + /// 成本中心 + /// + public string CostId { get; set; } + + /// + /// 消费者所在基地 + /// + public string OriginTenantId { get; set; } + + /// + /// 数据状态 + /// + public BalanceRecordStatusEnumType Status { get; set; } + + /// + /// 数据状态描述 + /// + public string StatusDesc => Status.GetDescription(); + + /// + /// 记录产生时间 + /// + public DateTime CostDateTime { get; set; } + + /// + /// 厂区 + /// + public string Factory { get; set; } + + /// + /// 人事范围 + /// + public string Werks { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs index ac4c6183..ac19cb85 100644 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs @@ -61,6 +61,9 @@ public class BalanceRecordResponse /// public BalanceRecordSourceEnumType Source { get; set; } + /// + /// 消费识别来源 + /// public string SourceDesc => Source.GetDescription(); /// diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs index 0093f453..ae314b0b 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs @@ -1,4 +1,5 @@ using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Request.Common; using Dlhis.Canteen.Order.Response; using Kurisu.AspNetCore.DataAccess.Dto; @@ -8,7 +9,7 @@ public interface IBalanceSummaryService : IScopeDependency { Task BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request); - Task> BalanceRecordAnalysisByCostIdAsync(); + Task> BalanceRecordAnalysisByCostIdAsync(SummaryCommonDto request); Task BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request); diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index a83c3107..57b8d488 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -52,12 +52,11 @@ public class BalanceService : IBalanceService .LeftJoin((record, ga, department) => ga.DepartmentNo == department.No) .LeftJoin((record, ga, department, bPlace) => record.BusinessPlaceCode == bPlace.Code) .LeftJoin((record, ga, department, bPlace, order) => record.No == order.No) - .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.ShiftTypes.IsPresent(), record => request.ShiftTypes.Contains(record.ShiftType)) - .WhereIF(request.Type.HasValue, record => record.Type == request.Type) .WhereIF(request.Factory.IsPresent(), record => record.TenantId == request.Factory) - .WhereIF(request.Search.IsPresent(), (record, ga) => ga.Code == request.Search) + .WhereIF(request.Type.HasValue, record => record.Type == request.Type) + .WhereIF(request.SearchDateTimePeriod.HasValue(), record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End) + .WhereIF(request.ShiftTypes.IsPresent(), record => request.ShiftTypes.Contains(record.ShiftType)) + .WhereIF(request.Search.IsPresent(), (record, ga) => ga.Code == request.Search || ga.Name == request.Search) .OrderBy(record => record.CreateTime, OrderByType.Desc) .Select((record, ga, department, bPlace, order) => new BalanceRecordResponse { @@ -82,7 +81,7 @@ public class BalanceService : IBalanceService Factory = record.TenantId, ShiftType = record.ShiftType, Remark = record.Remark, - Werks = ga.Werks + Werks = record.Werks }) .ToPageListAsync(request); @@ -346,12 +345,11 @@ public class BalanceService : IBalanceService .LeftJoin((record, ga) => record.UserNo == ga.No) .LeftJoin((record, ga, department) => ga.DepartmentNo == department.No) .LeftJoin((record, ga, department, bPlace) => record.BusinessPlaceCode == bPlace.Code) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out) - .Where(record => record.Status == BalanceRecordStatusEnumType.Valid) - .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CostDate >= request.SearchDateTimePeriod.Start) - .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CostDate <= request.SearchDateTimePeriod.End) + .Where((record, ga) => record.UserCode == jinkoCode) + .Where(record => record.Status == BalanceRecordStatusEnumType.Valid && record.Type == BalanceRecordTypeEnumType.Out) + .Where(record => record.Source != BalanceRecordSourceEnumType.EMealVoucher) //不展示电子餐券信息 + .WhereIF(request.SearchDateTimePeriod.HasValue(), record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End) .WhereIF(request.ApplicationType.HasValue, record => record.ApplicationType == request.ApplicationType) - .Where((record, ga) => ga.Code == jinkoCode) .OrderBy(record => record.CostDateTime) .Select((record, ga, department, bPlace) => new BalanceRecordUserPageResponse { @@ -372,8 +370,8 @@ public class BalanceService : IBalanceService var monthSum = await _dbContext.Queryable() .Where(x => x.CostDateTime >= monthStart && x.CostDateTime <= monthEnd) - .Where(x => x.Type == BalanceRecordTypeEnumType.Out) - .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) + .Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) + .Where(x => x.Source != BalanceRecordSourceEnumType.EMealVoucher) .Where(x => x.UserCode == jinkoCode) .SumAsync(x => SqlFunc.Abs(x.Amount)); diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs index 5a76b686..3f87efa6 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs @@ -1,6 +1,7 @@ using System.Reflection; using Dlhis.Canteen.Order.Dto; using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Request.Common; using Dlhis.Canteen.Order.Response; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; @@ -23,12 +24,13 @@ public class BalanceSummaryService : IBalanceSummaryService public async Task BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request) { - var list = await _dbContext.Queryable() - .WhereIF(request.SearchDateTimePeriod.HasValue(), - record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End) - .WhereIF(request.BusinessPlaceCode.HasValue, record => record.BusinessPlaceCode == request.BusinessPlaceCode) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) - .ToListAsync(); + if (request.BusinessPlaceCode.HasValue) + { + request.BusinessPlaceCodes = new List { request.BusinessPlaceCode.Value }; + } + + var queryable = GetQueryable(request); + var list =await queryable.ToListAsync(); var sum = list.Sum(x => Math.Abs(x.Amount)); @@ -59,32 +61,9 @@ public class BalanceSummaryService : IBalanceSummaryService } - public async Task> BalanceRecordAnalysisByCostIdAsync() + public async Task> BalanceRecordAnalysisByCostIdAsync(SummaryCommonDto request) { - var list = await _dbContext.Queryable() - // .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true && request.SearchDateTimePeriod?.End.HasValue == true, - // record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End) - //.WhereIF(request.BusinessPlaceCode.HasValue, record => record.BusinessPlaceCode == request.BusinessPlaceCode) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) - .ToListAsync(); - - var shifts = Enum.GetValues().ToList(); - var page = list.GroupBy(record => record.CostDate.Date).Select(grp => - { - return new BalanceRecordAnalysisResponse - { - Date = DateOnly.FromDateTime(grp.Key), - Items = shifts.Select(shift => - { - return new KeyValueDto - { - Key = shift, - Value = grp.Where(x => x.ShiftType == shift).Select(x => x.UserNo).Distinct().Count() - }; - }).ToList(), - Total = grp.Where(x => x.CostDate == grp.Key).Select(x => x.UserNo).Distinct().Count() - }; - }).OrderByDescending(x => x.Date); + // var queryable = GetQueryable(request); return null; } @@ -92,10 +71,7 @@ public class BalanceSummaryService : IBalanceSummaryService public async Task BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request) { - var queryable = _dbContext.Queryable() - .Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) - .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End) - .WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value)); + var queryable = GetQueryable(request); var amount = await queryable.SumAsync(x => SqlFunc.Abs(x.Amount)); @@ -128,10 +104,7 @@ public class BalanceSummaryService : IBalanceSummaryService public async Task BalanceRecordShiftAnalysisAmountAndCountAsync(BalanceRecordAnalysisByShiftRequest request) { - var queryable = _dbContext.Queryable() - .Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) - .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End) - .WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value)); + var queryable = GetQueryable(request); var amount = await queryable.SumAsync(x => SqlFunc.Abs(x.Amount)); @@ -150,4 +123,19 @@ public class BalanceSummaryService : IBalanceSummaryService }).ToList() }; } + + //**************************************************************help method*********************************************************************** + + /// + /// 获取默认查询queryable + /// + /// + /// + private ISugarQueryable GetQueryable(SummaryCommonDto request) + { + return _dbContext.Queryable() + .Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) //有效,消费数据 + .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End) //成本日期 + .WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value)); //营业点 + } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 4a2aede4..0fb1f2f9 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -410,40 +410,9 @@ public class OrderService : BaseOrderService, IOrderService /// private async Task ConsumeAsync(ConsumeRequest request, GainfoEntity gainfo) { - var registry = await DbContext.Queryable().Where(x => x.DeviceUniqueNo == request.DeviceUniqueNo).SingleAsync(); - registry.ThrowIfNull("设备尚未登记"); + var checkData = await PreCheckAsync(request.DeviceUniqueNo, request.CostDateTime); - var device = await DbContext.Queryable().Where(x => x.UniqueNo == request.DeviceUniqueNo).SingleAsync(); - device.ThrowIfNull("设备尚未登记"); - device.Enable.ThrowIfFalse("设备已被停用"); - - var businessPlaceInfo = await DbContext.Queryable() - .LeftJoin((x, sr) => x.Code == sr.PlaceCode) - .Where(x => x.Code == registry.BusinessPlaceCode) - .Select((x, sr) => new - { - x.Code, - sr.ShiftCode, - x.TenantId - }) - .SingleAsync(); - - businessPlaceInfo.ThrowIfNull("设备尚未登记营业点"); - - //获取当前消费餐次 - var shifts = await DbContext.Queryable().Where(x => x.ShiftCode == businessPlaceInfo.ShiftCode).ToListAsync(); - shifts.ThrowIfEmpty("营业点餐次尚未设置"); - - var shift = shifts.FirstOrDefault(x => new TimePeriod - { - Start = x.Start, - End = x.End - }.IsPresent(request.CostDateTime)); - shift.ThrowIfNull("非就餐时间,无法消费"); - - var costDate = await GetCostDateAsync(shift, request.CostDateTime); - - (request.Source == BalanceRecordSourceEnumType.QrCode && businessPlaceInfo.TenantId != gainfo.Factory).ThrowIfTrue("禁止跨厂区消费"); + (request.Source == BalanceRecordSourceEnumType.QrCode && checkData.BusinessPlaceTenantId != gainfo.Factory).ThrowIfTrue("禁止跨厂区消费"); var order = new CanteenOrderEntity { @@ -456,30 +425,28 @@ public class OrderService : BaseOrderService, IOrderService UserNo = gainfo.No, UserCode = gainfo.Code, Amount = request.Amount, - BusinessPlaceCode = businessPlaceInfo?.Code, - BusinessShiftCode = shift?.ShiftCode, - ShiftType = shift?.ShiftType, - CostDate = costDate.Date, + BusinessPlaceCode = checkData.BusinessPlaceCode, + BusinessShiftCode = checkData.BusinessShiftCode, + ShiftType = checkData.Shift.ShiftType, + CostDate = checkData.CostDate, CostId = gainfo.CostId, DepartmentNo = gainfo.DepartmentNo, DeviceUniqueNo = request.DeviceUniqueNo, No = SnowFlakeHelper.Instance.NextId().ToString(), IsOffline = request.IsOffline, - IsCostCrossTenant = gainfo.Factory != businessPlaceInfo!.TenantId, + IsCostCrossTenant = gainfo.Factory != checkData.BusinessPlaceTenantId, OriginTenantId = gainfo.Factory, Werks = gainfo.Werks, - - //餐别异常处理 - Status = shift == null ? BalanceRecordStatusEnumType.Doubtful : BalanceRecordStatusEnumType.Valid, + Status = BalanceRecordStatusEnumType.Valid, OrderStatus = CanteenOrderStatusEnumType.Wait, CostDateTime = request.CostDateTime, //标识当前消费的基地 - TenantId = businessPlaceInfo.TenantId, + TenantId = checkData.BusinessPlaceTenantId }; var orderId = await DbContext.InsertReturnIdentityAsync(order); @@ -576,7 +543,6 @@ public class OrderService : BaseOrderService, IOrderService } else { - if (request.IsOffline) { if (request.ThirdNo.IsPresent()) @@ -684,7 +650,7 @@ public class OrderService : BaseOrderService, IOrderService var time = DateTimeOffset.FromUnixTimeMilliseconds(Convert.ToInt64(ts.Reverse().Join(string.Empty))).ToLocalTime().DateTime; - (time.AddMinutes(60) >= DateTime.Now).ThrowIfFalse("二维码已过期"); + (time.AddMinutes(60) >= DateTime.Now).ThrowIfFalse("餐券二维码已过期"); var eMealVoucher = await DbContext.Queryable().Where(x => x.No == no).SingleAsync(); diff --git a/Src/Dlhis.Entity/Basic/Entity/OutsourceEntity.cs b/Src/Dlhis.Entity/Basic/Entity/OutsourceEntity.cs index 094240a7..6a32abc5 100644 --- a/Src/Dlhis.Entity/Basic/Entity/OutsourceEntity.cs +++ b/Src/Dlhis.Entity/Basic/Entity/OutsourceEntity.cs @@ -1,36 +1,35 @@ using Kurisu.AspNetCore.DataAccess.SqlSugar; using SqlSugar; -namespace Dlhis.Entity.Basic.Entity +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 外包人员 +/// +[SugarTable(TableName = "Outsource", TableDescription = "外包人员")] +public class OutsourceEntity : SugarBaseEntity { /// - /// 外包人员 + /// 外包人员工号 LS开头 /// - [SugarTable(TableName = "Outsource", TableDescription = "外包人员")] - public class OutsourceEntity : SugarBaseEntity - { - /// - /// 外包人员工号 LS开头 - /// - [SugarColumn(IsNullable = false, ColumnDescription = "工号")] - public string Code { get; set; } + [SugarColumn(IsNullable = false, ColumnDescription = "工号")] + public string Code { get; set; } - /// - /// 供应商 - /// - [SugarColumn(IsNullable = false, ColumnDescription = "供应商")] - public string Supplier { get; set; } + /// + /// 供应商 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "供应商")] + public string Supplier { get; set; } - /// - /// 对接人员工号 - /// - [SugarColumn(IsNullable = false, ColumnDescription = "对接人工号")] - public string SapCode { get; set; } + /// + /// 对接人员工号 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "对接人工号")] + public string SapCode { get; set; } - /// - /// 对接人员手机号 - /// - [SugarColumn(IsNullable = false, ColumnDescription = "对接人手机号")] - public string SapPhone { get; set; } - } + /// + /// 对接人员手机号 + /// + [SugarColumn(IsNullable = false, ColumnDescription = "对接人手机号")] + public string SapPhone { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Canteen/Entities/EMealVoucherEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/EMealVoucherEntity.cs index 7ff544aa..c13e7ed1 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/EMealVoucherEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/EMealVoucherEntity.cs @@ -75,4 +75,10 @@ public class EMealVoucherEntity : SugarBaseEntity /// [SugarColumn(ColumnDescription = "申请日期")] public DateTime Date { get; set; } + + /// + /// 厂区 + /// + [SugarColumn(ColumnDescription = "厂区")] + public string Factory { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.External/EMealVoucher/Services/Implements/EMealVoucherService.cs b/Src/Dlhis.External/EMealVoucher/Services/Implements/EMealVoucherService.cs index a956a612..817fb5e3 100644 --- a/Src/Dlhis.External/EMealVoucher/Services/Implements/EMealVoucherService.cs +++ b/Src/Dlhis.External/EMealVoucher/Services/Implements/EMealVoucherService.cs @@ -1,3 +1,4 @@ +using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; using Dlhis.External.EMealVoucher.Request; @@ -19,6 +20,9 @@ public class EMealVoucherService : IEMealVoucherService { (await _dbContext.Queryable().Where(x => x.No == request.No).AnyAsync()).ThrowIfTrue($"{request.No}已存在"); + var gainfo = await _dbContext.Queryable().Where(x => x.Code == request.Code).SingleAsync(); + gainfo.ThrowIfNull("申请人不存在"); + var voucher = new EMealVoucherEntity { No = request.No, @@ -31,7 +35,8 @@ public class EMealVoucherService : IEMealVoucherService Reason = request.Reason, Shifts = request.Shifts.Select(x => (ShiftEnumType)x).ToList(), Date = request.Date, - Factories = request.Factories + Factories = request.Factories, + Factory = gainfo.Factory }; var details = request.Details.Select(x => new EMealVoucherDetailEntity