From 3005443392e97648fa3a071cbc21086fa09908c4 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 18 Mar 2024 10:01:03 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E8=8F=9C=E5=93=81/=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessPlaceShiftSaveMealShiftRequest.cs | 6 +- .../Response/MealShiftResponse.cs | 9 +- .../Implements/BusinessPlaceShiftService.cs | 14 +- .../Device/Controllers/DevicesController.cs | 2 - .../Services/Implements/DeviceService.cs | 8 +- .../Controller/DishesCategoriesController.cs | 44 ++++++ .../Dishes/Controller/DishesMenuController.cs | 84 +++++++++++ .../Dishes/Dto/DishesMenuDetailDto.cs | 18 +++ .../Dishes/Request/DisheMenuPageRequest.cs | 17 +++ .../Request/DishesCategorySaveRequest.cs | 24 ++++ .../Request/DishesMenuNameDateSaveRequest.cs | 39 ++++++ .../Dishes/Request/DishesMenuSaveRequest.cs | 18 +++ .../Request/DishesMenuShiftTypeSaveRequest.cs | 18 +++ .../Dishes/Request/DishesPageRequest.cs | 8 ++ .../Dishes/Request/DishesSaveRequest.cs | 47 +++++++ .../Dishes/Request/MenuDishesSaveRequest.cs | 24 ++++ .../Dishes/Response/DishesCategoryResponse.cs | 15 ++ .../Dishes/Response/DishesMenuPageResponse.cs | 6 + .../Dishes/Response/DishesResponse.cs | 67 +++++++++ .../Dishes/Services/IDishesCategoryService.cs | 11 ++ .../Dishes/Services/IDishesMenuService.cs | 16 +++ .../Dishes/Services/IDishesService.cs | 12 ++ .../Implements/DishesCategoryService.cs | 66 +++++++++ .../Services/Implements/DishesMenuService.cs | 131 ++++++++++++++++++ .../Services/Implements/DishesService.cs | 51 +++++++ .../Services/Implements/GainfoPermissions.cs | 16 +-- .../BusinessShiftMealRelationshipEntity.cs | 16 ++- .../Canteen/Entities/BalanceRecordEntity.cs | 12 +- ...nteenMenuEntity.cs => DishesMenuEntity.cs} | 18 ++- .../Entities/MiniProgramOrderEntity.cs | 2 +- .../Canteen/Enums/CanteenMenuEnumType.cs | 2 +- .../Enums/CanteenSettingItemEnumType.cs | 6 + 32 files changed, 775 insertions(+), 52 deletions(-) create mode 100644 Src/Dlhis.Basic/Dishes/Controller/DishesCategoriesController.cs create mode 100644 Src/Dlhis.Basic/Dishes/Controller/DishesMenuController.cs create mode 100644 Src/Dlhis.Basic/Dishes/Dto/DishesMenuDetailDto.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DisheMenuPageRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DishesCategorySaveRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DishesMenuNameDateSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DishesMenuSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DishesMenuShiftTypeSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DishesPageRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/DishesSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Request/MenuDishesSaveRequest.cs create mode 100644 Src/Dlhis.Basic/Dishes/Response/DishesCategoryResponse.cs create mode 100644 Src/Dlhis.Basic/Dishes/Response/DishesMenuPageResponse.cs create mode 100644 Src/Dlhis.Basic/Dishes/Response/DishesResponse.cs create mode 100644 Src/Dlhis.Basic/Dishes/Services/IDishesCategoryService.cs create mode 100644 Src/Dlhis.Basic/Dishes/Services/IDishesMenuService.cs create mode 100644 Src/Dlhis.Basic/Dishes/Services/IDishesService.cs create mode 100644 Src/Dlhis.Basic/Dishes/Services/Implements/DishesCategoryService.cs create mode 100644 Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs create mode 100644 Src/Dlhis.Basic/Dishes/Services/Implements/DishesService.cs rename Src/Dlhis.Entity/Canteen/Entities/{CanteenMenuEntity.cs => DishesMenuEntity.cs} (78%) diff --git a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs index 98e63fae..a6512432 100644 --- a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs +++ b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Canteen.Enums; using Kurisu.Core.CustomClass; namespace Dlhis.Basic.BusinessShift.Request; @@ -13,9 +14,10 @@ public class BusinessPlaceShiftSaveMealShiftRequest : IValidatableObject public Guid ShiftCode { get; set; } /// - /// mealshift + /// 餐次 ShiftEnumType /// - public string ShiftType { get; set; } + [EnumDataType(typeof(ShiftEnumType))] + public ShiftEnumType ShiftType { get; set; } /// /// 序号 diff --git a/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs b/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs index bf99cb6a..bd83ed7b 100644 --- a/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs +++ b/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs @@ -1,4 +1,7 @@ -namespace Dlhis.Basic.BusinessShift.Response +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.BusinessShift.Response { public class MealShiftResponse { @@ -6,9 +9,9 @@ public Guid ShiftCode { get; set; } - public string ShiftType { get; set; } + public ShiftEnumType ShiftType { get; set; } - public string Name { get; set; } + public string Name => ShiftType.GetDescription(); public TimeOnly Start { get; set; } diff --git a/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs b/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs index de3fa555..dbf1d513 100644 --- a/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs +++ b/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs @@ -38,14 +38,12 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService //下级就餐时间段 var mealShifts = await _dbContext.Queryable() - .LeftJoin((x, bt) => x.ShiftType == bt.Code) .Where(x => shiftCodes.Contains(x.ShiftCode)) - .Select((x, bt) => new MealShiftResponse + .Select((x) => new MealShiftResponse { Id = x.Id, ShiftCode = x.ShiftCode, - ShiftType = bt.Code, - Name = bt.Display, + ShiftType = x.ShiftType, Start = x.Start, End = x.End, }) @@ -95,14 +93,11 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService public async Task SaveMealShiftsAsync(List requests) { - var mealShifts = await GetMealShiftAsync(); - foreach (var request in requests) { var shift = await CheckExistsShiftAsync(request.ShiftCode); await CheckExistsMealShiftAsync(request); await DuplicateTimePeriodAsync(request); - mealShifts.Contains(request.ShiftType).ThrowIfFalse($"{request.ShiftType}不存在"); if (!request.Id.HasValue) { @@ -312,11 +307,6 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService return shift; } - private async Task> GetMealShiftAsync() - { - return await _dbContext.Queryable().Where(x => x.Type == "mealshift").Select(x => x.Code).ToListAsync(); - } - private async Task CheckExistsMealShiftAsync(BusinessPlaceShiftSaveMealShiftRequest request) { var exists = await _dbContext.Queryable() diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs index 3298137a..804e52d1 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs @@ -2,8 +2,6 @@ using Dlhis.Basic.Device.Response; using Dlhis.Basic.Device.Services; using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop; -using Kurisu.AspNetCore.EventBus.Abstractions; -using Kurisu.AspNetCore.Scope; using Kurisu.Core.DataAccess.Dto; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs index c0020c88..2eb8f9df 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs @@ -48,19 +48,19 @@ public class DeviceService : IDeviceService var deviceUniqueNos = page.Data.Select(x => x.UniqueNo).ToList(); var balanceInfos = await _dbContext.Queryable().Where(x => x.Type == BalanceRecordTypeEnumType.Out) - .Where(x => deviceUniqueNos.Contains(x.DeviceInfo)) + .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) .Select(x => new { - x.DeviceInfo, + x.DeviceUniqueNo, Amount = SqlFunc.AggregateSum(x.Amount), UserCount = SqlFunc.AggregateDistinctCount(x.UserCode) }) - .GroupBy(x => x.DeviceInfo) + .GroupBy(x => x.DeviceUniqueNo) .ToListAsync(); page.Data.ForEach(device => { - var info = balanceInfos.FirstOrDefault(x => x.DeviceInfo == device.UniqueNo); + var info = balanceInfos.FirstOrDefault(x => x.DeviceUniqueNo == device.UniqueNo); if (info != null) { device.Amount = info.Amount; diff --git a/Src/Dlhis.Basic/Dishes/Controller/DishesCategoriesController.cs b/Src/Dlhis.Basic/Dishes/Controller/DishesCategoriesController.cs new file mode 100644 index 00000000..9c9864d3 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Controller/DishesCategoriesController.cs @@ -0,0 +1,44 @@ +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; +using Dlhis.Canteen.Dishes.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.Dishes.Controller; + +/// +/// 菜品分类 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class DishesCategoriesController : ControllerBase +{ + private readonly IDishesCategoryService _dishesCategoryService; + + public DishesCategoriesController(IDishesCategoryService dishesCategoryService) + { + _dishesCategoryService = dishesCategoryService; + } + + /// + /// 获取分类树 + /// + /// + [HttpGet("tree")] + public async Task> TreeAsync() + { + return await _dishesCategoryService.TreeAsync(); + } + + /// + /// 保存分类 + /// + /// + /// + [HttpPost("save")] + public async Task SaveAsync(DishesCategorySaveRequest request) + { + await _dishesCategoryService.SaveAsync(request); + } +} diff --git a/Src/Dlhis.Basic/Dishes/Controller/DishesMenuController.cs b/Src/Dlhis.Basic/Dishes/Controller/DishesMenuController.cs new file mode 100644 index 00000000..a5db6601 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Controller/DishesMenuController.cs @@ -0,0 +1,84 @@ +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; +using Dlhis.Canteen.Dishes.Services; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop; +using Kurisu.Core.DataAccess.Dto; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.Dishes.Controller; + +/// +/// 菜单菜品控制器 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class DishesMenuController : ControllerBase +{ + private readonly IDishesMenuService _dishesMenuService; + private readonly IDishesService _dishesService; + + public DishesMenuController(IDishesMenuService dishesMenuService, IDishesService dishesService) + { + _dishesMenuService = dishesMenuService; + _dishesService = dishesService; + } + + /// + /// 菜单分页 + /// + /// + /// + [HttpGet("page")] + public async Task> GetDishesMenuPageAsync([FromQuery] DisheMenuPageRequest request) + { + return await _dishesMenuService.GetDishesMenuPageAsync(request); + } + + /// + /// 菜单保存/更改 + /// + /// + /// + [HttpPost("save")] + [Transactional] + public async Task SaveDishesMenuAsync(DishesMenuSaveRequest request) + { + await _dishesMenuService.SaveDishesMenuAsync(request); + } + + /// + /// 菜品分页 + /// + /// + /// + [HttpGet("dishes/page")] + public async Task> GetDishesAsync([FromQuery] DishesPageRequest request) + { + return await _dishesService.GetDishesPageAsync(request); + } + + /// + /// 菜品保存/更改 + /// + /// + /// + [HttpPost("dishes/save")] + public async Task SaveDishesAsync(DishesSaveRequest request) + { + await _dishesService.SaveDishesAsync(request); + } + + + /// + /// 获取预定送餐配置 + /// + /// + [HttpGet("setting")] + public async Task GetDishesMenusBookingSetting() + { + //todo + } +} + diff --git a/Src/Dlhis.Basic/Dishes/Dto/DishesMenuDetailDto.cs b/Src/Dlhis.Basic/Dishes/Dto/DishesMenuDetailDto.cs new file mode 100644 index 00000000..5850ee41 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Dto/DishesMenuDetailDto.cs @@ -0,0 +1,18 @@ +namespace Dlhis.Basic.Dishes.Dto; + +public class DishesMenuDetailDto +{ + public long MenuId { get; set; } + + public long DishesId { get; set; } + + public string DishesCode { get; set; } + + public string DishesName { get; set; } + + public decimal Price { get; set; } + + public int Number { get; set; } + + public int Version { get; set; } +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DisheMenuPageRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DisheMenuPageRequest.cs new file mode 100644 index 00000000..5977e98e --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DisheMenuPageRequest.cs @@ -0,0 +1,17 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.Core.DataAccess.Dto; + +namespace Dlhis.Basic.Dishes.Request; + +public class DisheMenuPageRequest : PageDto +{ + /// + /// 餐次 + /// + public List ShiftTypes { get; set; } + + /// + /// 分类 + /// + public Guid? CategoryCode { get; set; } +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DishesCategorySaveRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DishesCategorySaveRequest.cs new file mode 100644 index 00000000..80582418 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DishesCategorySaveRequest.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Dishes.Request; + +public class DishesCategorySaveRequest +{ + public long? Id { get; set; } + + /// + /// PCode + /// + public Guid? PCode { get; set; } + + /// + /// 分类名称 + /// + [Required] + public string Name { get; set; } + + /// + /// 序号 + /// + public int Sequence { get; set; } = 100; +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DishesMenuNameDateSaveRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DishesMenuNameDateSaveRequest.cs new file mode 100644 index 00000000..54b3bb35 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DishesMenuNameDateSaveRequest.cs @@ -0,0 +1,39 @@ +using System.ComponentModel.DataAnnotations; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.Dishes.Request; + +public class DishesMenuNameDateSaveRequest : IValidatableObject +{ + /// + /// 菜单编码 + /// + public string CustomCode { get; set; } + + /// + /// 菜单日期 + /// + public DateTime Date { get; set; } + + /// + /// 餐次数据 + /// + public List ShiftTypes { get; set; } + + + public IEnumerable Validate(ValidationContext validationContext) + { + if (Date < DateTime.Today) + { + yield return new ValidationResult("菜单日期不能小于当天"); + } + + //格式化 + Date = Date.Date; + + if (CustomCode.IsEmpty()) + { + CustomCode = Date.ToString("yyyy-MM-dd"); + } + } +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DishesMenuSaveRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DishesMenuSaveRequest.cs new file mode 100644 index 00000000..bbece19f --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DishesMenuSaveRequest.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Dishes.Request; + +public class DishesMenuSaveRequest : IValidatableObject +{ + /// + /// 营业点code + /// + public Guid BusinessPlaceCode { get; set; } + + public List Items { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + yield break; + } +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DishesMenuShiftTypeSaveRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DishesMenuShiftTypeSaveRequest.cs new file mode 100644 index 00000000..e76681b3 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DishesMenuShiftTypeSaveRequest.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Canteen.Enums; + +namespace Dlhis.Basic.Dishes.Request; + +public class DishesMenuShiftTypeSaveRequest +{ + /// + /// 餐次段 + /// + [EnumDataType(typeof(ShiftEnumType))] + public ShiftEnumType ShiftType { get; set; } + + /// + /// 菜品 + /// + public List Dishes { get; set; } +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DishesPageRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DishesPageRequest.cs new file mode 100644 index 00000000..6d351367 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DishesPageRequest.cs @@ -0,0 +1,8 @@ +using Kurisu.Core.DataAccess.Dto; + +namespace Dlhis.Basic.Dishes.Request; + +public class DishesPageRequest : PageDto +{ + +} diff --git a/Src/Dlhis.Basic/Dishes/Request/DishesSaveRequest.cs b/Src/Dlhis.Basic/Dishes/Request/DishesSaveRequest.cs new file mode 100644 index 00000000..c2135cc9 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/DishesSaveRequest.cs @@ -0,0 +1,47 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Dishes.Request; + +public class DishesSaveRequest +{ + public long? Id { get; set; } + + /// + /// 分类 + /// + [Required] + public Guid CategoryCode { get; set; } + + /// + /// 菜品名称 + /// + [Required] + public string Name { get; set; } + + /// + /// 菜单编码 + /// + [Required] + public string CustomCode { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 单价 + /// + [Range(0, 10000)] + public decimal Price { get; set; } + + /// + /// 图片 + /// + public string ImageUrl { get; set; } + + /// + /// 是否启用 + /// + public bool Enable { get; set; } +} diff --git a/Src/Dlhis.Basic/Dishes/Request/MenuDishesSaveRequest.cs b/Src/Dlhis.Basic/Dishes/Request/MenuDishesSaveRequest.cs new file mode 100644 index 00000000..601c9aaa --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Request/MenuDishesSaveRequest.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Dishes.Request; + +public class MenuDishesSaveRequest +{ + /// + /// 菜品编码 + /// + [Required] + public string DishesCode { get; set; } + + /// + /// 菜单价 + /// + [Range(0, double.MaxValue)] + public decimal? Price { get; set; } + + /// + /// 售额 + /// + [Range(0, int.MaxValue)] + public int Number { get; set; } +} diff --git a/Src/Dlhis.Basic/Dishes/Response/DishesCategoryResponse.cs b/Src/Dlhis.Basic/Dishes/Response/DishesCategoryResponse.cs new file mode 100644 index 00000000..fdaca520 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Response/DishesCategoryResponse.cs @@ -0,0 +1,15 @@ +namespace Dlhis.Basic.Dishes.Response; + +public class DishesCategoryTreeResponse +{ + public Guid? PCode { get; set; } + + public Guid Code { get; set; } + + /// + /// 分类名称 + /// + public string Name { get; set; } + + public List Next { get; set; } +} diff --git a/Src/Dlhis.Basic/Dishes/Response/DishesMenuPageResponse.cs b/Src/Dlhis.Basic/Dishes/Response/DishesMenuPageResponse.cs new file mode 100644 index 00000000..4f2c3a1a --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Response/DishesMenuPageResponse.cs @@ -0,0 +1,6 @@ +namespace Dlhis.Basic.Dishes.Response; + +public class DishesMenuPageResponse +{ + +} diff --git a/Src/Dlhis.Basic/Dishes/Response/DishesResponse.cs b/Src/Dlhis.Basic/Dishes/Response/DishesResponse.cs new file mode 100644 index 00000000..520beaba --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Response/DishesResponse.cs @@ -0,0 +1,67 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Basic.Dishes.Response; + +public class DishesResponse +{ + /// + /// 大类 + /// + public string Categories { get; set; } + + /// + /// 小类 + /// + public string SubCategories { get; set; } + + /// + /// 菜品编码 + /// + public string Code { get; set; } + + /// + /// 菜品名称 + /// + public string Name { get; set; } + + /// + /// 菜品类型 + /// + public CanteenMenuEnumType Type { get; set; } + + /// + /// 菜品类型描述 + /// + public string TypeDescription => Type.GetDescription(); + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 单价 + /// + public decimal Amount { get; set; } + + /// + /// 单位 + /// + public string Unit { get; set; } + + /// + /// 图片 + /// + public string Image { get; set; } + + /// + /// 是否启用 + /// + public bool Enable { get; set; } + + /// + /// 限售份数 + /// + public int? RestrictedNum { get; set; } = null; +} diff --git a/Src/Dlhis.Basic/Dishes/Services/IDishesCategoryService.cs b/Src/Dlhis.Basic/Dishes/Services/IDishesCategoryService.cs new file mode 100644 index 00000000..d0b12322 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Services/IDishesCategoryService.cs @@ -0,0 +1,11 @@ +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; + +namespace Dlhis.Canteen.Dishes.Services; + +public interface IDishesCategoryService : IScopeDependency +{ + Task> TreeAsync(); + + Task SaveAsync(DishesCategorySaveRequest request); +} diff --git a/Src/Dlhis.Basic/Dishes/Services/IDishesMenuService.cs b/Src/Dlhis.Basic/Dishes/Services/IDishesMenuService.cs new file mode 100644 index 00000000..f23afb72 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Services/IDishesMenuService.cs @@ -0,0 +1,16 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.Core.DataAccess.Dto; +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Dto; +using Dlhis.Basic.Dishes.Response; + +namespace Dlhis.Canteen.Dishes.Services; + +public interface IDishesMenuService : IScopeDependency +{ + Task> GetDishesMenuPageAsync(DisheMenuPageRequest request); + + Task SaveDishesMenuAsync(DishesMenuSaveRequest request); + + Task CheckBookingAsync(DateTime date, Guid businessPlaceCode, ShiftEnumType shiftType, string dishesCustomCode); +} diff --git a/Src/Dlhis.Basic/Dishes/Services/IDishesService.cs b/Src/Dlhis.Basic/Dishes/Services/IDishesService.cs new file mode 100644 index 00000000..329d0e05 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Services/IDishesService.cs @@ -0,0 +1,12 @@ +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; +using Kurisu.Core.DataAccess.Dto; + +namespace Dlhis.Canteen.Dishes.Services; + +public interface IDishesService : IScopeDependency +{ + Task> GetDishesPageAsync(DishesPageRequest request); + + Task SaveDishesAsync(DishesSaveRequest request); +} diff --git a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesCategoryService.cs b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesCategoryService.cs new file mode 100644 index 00000000..42530572 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesCategoryService.cs @@ -0,0 +1,66 @@ +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; +using Dlhis.Canteen.Dishes.Services; +using Dlhis.Entity.Canteen.Entities; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.SqlSugar.Services; +using Mapster; + +namespace Dlhis.Basic.Dishes.Services.Implements; + +public class DishesCategoryService : IDishesCategoryService +{ + private readonly IDbContext _dbContext; + + public DishesCategoryService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task> TreeAsync() + { + var categories = await _dbContext.Queryable().Select().ToListAsync(); + var tops = categories.Where(x => !x.PCode.HasValue).ToList(); + + tops.ForEach(x => + { + RecursionGetNext(x, categories); + }); + + return tops; + } + + public async Task SaveAsync(DishesCategorySaveRequest request) + { + if (!request.Id.HasValue) + { + var entity = request.Adapt(); + entity.Code = Guid.NewGuid(); + await _dbContext.InsertAsync(entity); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync(); + entity.ThrowIfNull("分类不存在,无法更新"); + request.Adapt(entity); + + await _dbContext.UpdateAsync(entity); + } + } + + + //************************************************************************************************************************ + + private static void RecursionGetNext(DishesCategoryTreeResponse current, List data) + { + var next = data.Where(x => x.PCode == current.Code).ToList(); + if (next.Any()) + { + current.Next = next; + foreach (var item in next) + { + RecursionGetNext(item, data); + } + } + } +} diff --git a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs new file mode 100644 index 00000000..426479a3 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs @@ -0,0 +1,131 @@ +using Dlhis.Entity.Canteen.Entities; +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.DataAccess.Dto; +using Kurisu.SqlSugar.Extensions; +using Kurisu.SqlSugar.Services; +using SqlSugar; +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; +using Dlhis.Basic.BusinessPlace.Services; +using Dlhis.Basic.Dishes.Dto; + +namespace Dlhis.Canteen.Dishes.Services.Implements; + +public class DishesMenuService : IDishesMenuService +{ + private readonly IDbContext _dbContext; + private readonly IBusinessPlacePermissionsService _businessPlacePermissionsService; + + public DishesMenuService(IDbContext dbContext, IBusinessPlacePermissionsService businessPlacePermissionsService) + { + _dbContext = dbContext; + _businessPlacePermissionsService = businessPlacePermissionsService; + } + + public async Task> GetDishesMenuPageAsync(DisheMenuPageRequest request) + { + return await _dbContext.Queryable() + .Select() + .ToPageListAsync(request); + } + + public async Task SaveDishesMenuAsync(DishesMenuSaveRequest request) + { + //检验数据 + CheckDuplicateData(request); + + //检验权限 + var myBps = await _businessPlacePermissionsService.GetMyAsync(); + myBps.Contains(request.BusinessPlaceCode).ThrowIfFalse("当前经营营业点,无法保存菜单"); + + var entities = request.Items.SelectMany(item => + { + var customCode = item.CustomCode; + var date = item.Date; + + return item.ShiftTypes.SelectMany(shiftTypeItem => + { + var shiftType = shiftTypeItem.ShiftType; + + return shiftTypeItem.Dishes.Select(dishesItem => + { + var dishesCode = dishesItem.DishesCode; + var number = dishesItem.Number; + var price = dishesItem.Price; + + return new DishesMenuEntity + { + BusinessPlaceCode = request.BusinessPlaceCode, + CustomCode = customCode, + Date = date, + ShiftType = shiftType, + DishesCode = dishesCode, + Number = number, + Price = price, + + Type = CanteenMenuEnumType.Booking, + Version = 0, + Enable = false, + }; + }); + }); + }).ToList(); + + var keys = entities.DistinctBy(x => new { x.Date, x.ShiftType }).Select(x => new { x.Date, x.ShiftType }).ToList(); + var where = LinqExpressionExtension.False(); + keys.ForEach(x => + { + where = where.Or(item => item.Date == x.Date && item.ShiftType == x.ShiftType); + }); + + await _dbContext.Client.Deleteable().Where(where).ExecuteCommandAsync(); + await _dbContext.InsertAsync(entities); + } + + + + public async Task CheckBookingAsync(DateTime date, Guid businessPlaceCode, ShiftEnumType shiftType, string dishesCustomCode) + { + var detail = await _dbContext.Queryable() + .LeftJoin((x, d) => x.DishesCode == d.CustomCode) + .Where(x => x.Date == date) + .Where(x => x.BusinessPlaceCode == businessPlaceCode) + .Where(x => x.ShiftType == shiftType) + .Where(x => x.DishesCode == dishesCustomCode) + .Where((x, d) => d.Enable) + .Select((x, d) => new DishesMenuDetailDto + { + MenuId = x.Id, + DishesId = d.Id, + DishesCode = d.CustomCode, + DishesName = d.Name, + Price = x.Price == null || x.Price == 0 ? d.Price : x.Price.Value, + Number = x.Number, + Version = x.Version, + }) + .SingleAsync(); + + return detail; + } + + //*********************************************************help methods********************************************************************** + + private static void CheckDuplicateData(DishesMenuSaveRequest request) + { + (request.Items.DistinctBy(x => new { x.CustomCode, x.Date }).Count() != request.Items.Count).ThrowIfTrue("菜单不可重复"); + + foreach (var item in request.Items) + { + var u = item.Date.ToString("yyyy-MM-dd") + "-" + item.CustomCode; + + (item.ShiftTypes.DistinctBy(x => x.ShiftType).Count() != item.ShiftTypes.Count).ThrowIfTrue($"{u}的餐次不可重复添加"); + + foreach (var shiftTypeItem in item.ShiftTypes) + { + (shiftTypeItem.Dishes.DistinctBy(x => x.DishesCode).Count() != shiftTypeItem.Dishes.Count) + .ThrowIfTrue($"{u}的{shiftTypeItem.ShiftType.GetDescription()}下菜品不可重复"); + } + } + } +} diff --git a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesService.cs b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesService.cs new file mode 100644 index 00000000..dad68a15 --- /dev/null +++ b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesService.cs @@ -0,0 +1,51 @@ +using Dlhis.Basic.Dishes.Request; +using Dlhis.Basic.Dishes.Response; +using Dlhis.Canteen.Dishes.Services; +using Dlhis.Entity.Canteen.Entities; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.DataAccess.Dto; +using Kurisu.SqlSugar.Extensions; +using Kurisu.SqlSugar.Services; +using Mapster; + +namespace Dlhis.Canteen.Dishes.Services.Implements; + +public class DishesService : IDishesService +{ + private readonly IDbContext _dbContext; + + public DishesService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task> GetDishesPageAsync(DishesPageRequest request) + { + //todo 营业点权限 + + return await _dbContext.Queryable() + .WhereIF(request.Search.IsPresent(), x => x.CustomCode == request.Search || x.Name.Contains(request.Search)) + .OrderBy(x => x.CreateTime, SqlSugar.OrderByType.Desc) + .Select() + .ToPageListAsync(request); + } + + + public async Task SaveDishesAsync(DishesSaveRequest request) + { + if (!request.Id.HasValue) + { + var dishers = request.Adapt(); + dishers.CustomCode = request.CustomCode; + await _dbContext.InsertAsync(dishers); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync(); + entity.ThrowIfNull("菜品不存在,无法更新"); + + request.Adapt(entity); + await _dbContext.UpdateAsync(entity); + } + } +} diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissions.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissions.cs index fd8dbe9d..2e6644c4 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissions.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoPermissions.cs @@ -119,19 +119,19 @@ public class GainfoPermissions : IGainfoPermissions var deviceUniqueNos = page.Select(x => x.UniqueNo).ToList(); var balanceInfos = await _dbContext.Queryable().Where(x => x.Type == BalanceRecordTypeEnumType.Out) - .Where(x => deviceUniqueNos.Contains(x.DeviceInfo)) + .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) .Select(x => new { - x.DeviceInfo, + x.DeviceUniqueNo, Amount = SqlFunc.AggregateSum(x.Amount), UserCount = SqlFunc.AggregateDistinctCount(x.UserCode) }) - .GroupBy(x => x.DeviceInfo) + .GroupBy(x => x.DeviceUniqueNo) .ToListAsync(); page.ForEach(device => { - var info = balanceInfos.FirstOrDefault(x => x.DeviceInfo == device.UniqueNo); + var info = balanceInfos.FirstOrDefault(x => x.DeviceUniqueNo == device.UniqueNo); if (info != null) { device.Amount = info.Amount; @@ -172,19 +172,19 @@ public class GainfoPermissions : IGainfoPermissions var deviceUniqueNos = page.Data.Select(x => x.UniqueNo).ToList(); var balanceInfos = await _dbContext.Queryable().Where(x => x.Type == BalanceRecordTypeEnumType.Out) - .Where(x => deviceUniqueNos.Contains(x.DeviceInfo)) + .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) .Select(x => new { - x.DeviceInfo, + x.DeviceUniqueNo, Amount = SqlFunc.AggregateSum(x.Amount), UserCount = SqlFunc.AggregateDistinctCount(x.UserCode) }) - .GroupBy(x => x.DeviceInfo) + .GroupBy(x => x.DeviceUniqueNo) .ToListAsync(); page.Data.ForEach(device => { - var info = balanceInfos.FirstOrDefault(x => x.DeviceInfo == device.UniqueNo); + var info = balanceInfos.FirstOrDefault(x => x.DeviceUniqueNo == device.UniqueNo); if (info != null) { device.Amount = info.Amount; diff --git a/Src/Dlhis.Entity/Basic/Entity/BusinessShiftMealRelationshipEntity.cs b/Src/Dlhis.Entity/Basic/Entity/BusinessShiftMealRelationshipEntity.cs index 6172c059..71912dd0 100644 --- a/Src/Dlhis.Entity/Basic/Entity/BusinessShiftMealRelationshipEntity.cs +++ b/Src/Dlhis.Entity/Basic/Entity/BusinessShiftMealRelationshipEntity.cs @@ -1,6 +1,8 @@ -using Kurisu.Core.DataAccess.Entity; +using Dlhis.Entity.Canteen.Enums; +using Kurisu.Core.DataAccess.Entity; using Kurisu.SqlSugar; using SqlSugar; +using SqlSugar.DbConvert; namespace Dlhis.Entity.Basic.Entity; @@ -8,22 +10,22 @@ namespace Dlhis.Entity.Basic.Entity; public class BusinessShiftMealRelationshipEntity : SugarBaseEntity, ITenantId { /// - /// 餐次组合Code + /// 餐别Code /// - [SugarColumn(ColumnDescription = "餐次组合Code", UniqueGroupNameList = new[] { "idx_CanteenBusinessShiftRelationship_shiftcode_shifttype" })] + [SugarColumn(ColumnDescription = "餐别Code", UniqueGroupNameList = new[] { "idx_CanteenBusinessShiftRelationship_shiftcode_shifttype" })] public Guid ShiftCode { get; set; } /// - /// 餐次组合手工号 + /// 餐别手工号 /// - [SugarColumn(ColumnDescription = "餐次组合手工号")] + [SugarColumn(ColumnDescription = "餐别编码")] public string ShiftCustomCode { get; set; } /// /// 餐次 /// - [SugarColumn(ColumnDescription = "餐次", UniqueGroupNameList = new[] { "idx_CanteenBusinessShiftRelationship_shiftcode_shifttype" })] - public string ShiftType { get; set; } + [SugarColumn(ColumnDescription = "餐次", ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert), UniqueGroupNameList = new[] { "idx_CanteenBusinessShiftRelationship_shiftcode_shifttype" })] + public ShiftEnumType ShiftType { get; set; } /// /// 经营开始时间 diff --git a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs index 9b69d0ce..868f7a44 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs @@ -68,16 +68,16 @@ public class BalanceRecordEntity : SugarBaseEntity, ITenantId public Guid? BusinessPlaceCode { get; set; } /// - /// 餐次 + /// 餐别 /// - [SugarColumn(ColumnDescription = "餐次", IsNullable = true)] + [SugarColumn(ColumnDescription = "餐别", IsNullable = true)] public Guid? BusinessShiftCode { get; set; } /// - /// 餐次段 + /// 餐次 /// - [SugarColumn(ColumnDescription = "餐次段", IsNullable = true)] - public string ShiftType { get; set; } + [SugarColumn(ColumnDescription = "餐次", ColumnDataType = "varchar(50)", IsNullable = true, SqlParameterDbType = typeof(EnumToStringConvert))] + public ShiftEnumType? ShiftType { get; set; } /// /// 所属成本日期 @@ -89,7 +89,7 @@ public class BalanceRecordEntity : SugarBaseEntity, ITenantId /// 消费机器唯一信息 /// [SugarColumn(ColumnDescription = "消费机器唯一信息", IsNullable = true)] - public string DeviceInfo { get; set; } + public string DeviceUniqueNo { get; set; } /// /// 餐补月份 diff --git a/Src/Dlhis.Entity/Canteen/Entities/CanteenMenuEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs similarity index 78% rename from Src/Dlhis.Entity/Canteen/Entities/CanteenMenuEntity.cs rename to Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs index e9168b4b..43780f04 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/CanteenMenuEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs @@ -9,14 +9,14 @@ namespace Dlhis.Entity.Canteen.Entities; /// /// 菜单表 /// -[SugarTable(TableName = "CanteenMenu", TableDescription = "菜单表")] -public class CanteenMenuEntity : SugarBaseEntity, ITenantId, IVersion +[SugarTable(TableName = "DishesMenu", TableDescription = "菜单表")] +public class DishesMenuEntity : SugarBaseEntity, ITenantId, IVersion { /// - /// 菜单名称 + /// 菜单编码 /// - [SugarColumn(ColumnDescription = "菜单名称")] - public string Name { get; set; } + [SugarColumn(ColumnDescription = "菜单编码")] + public string CustomCode { get; set; } /// /// 菜单类型 @@ -28,7 +28,7 @@ public class CanteenMenuEntity : SugarBaseEntity, ITenantId, IVersion /// 所属营业点 /// [SugarColumn(ColumnDescription = "所属营业点")] - public Guid PlaceCode { get; set; } + public Guid BusinessPlaceCode { get; set; } /// /// 营业日期 @@ -54,6 +54,12 @@ public class CanteenMenuEntity : SugarBaseEntity, ITenantId, IVersion /// public int Number { get; set; } + + /// + /// 单价 + /// + public decimal? Price { get; set; } + /// /// 是否启用 /// diff --git a/Src/Dlhis.Entity/Canteen/Entities/MiniProgramOrderEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/MiniProgramOrderEntity.cs index 4dff6803..39975b22 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/MiniProgramOrderEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/MiniProgramOrderEntity.cs @@ -81,7 +81,7 @@ namespace Dlhis.Entity.Canteen.Entities /// /// 用餐日期 /// - [SugarColumn(ColumnDescription = "用餐日期")] + [SugarColumn(ColumnDescription = "用餐日期", IsNullable = true)] public DateTime UseDate { get; set; } /// diff --git a/Src/Dlhis.Entity/Canteen/Enums/CanteenMenuEnumType.cs b/Src/Dlhis.Entity/Canteen/Enums/CanteenMenuEnumType.cs index bdf956a9..e1710105 100644 --- a/Src/Dlhis.Entity/Canteen/Enums/CanteenMenuEnumType.cs +++ b/Src/Dlhis.Entity/Canteen/Enums/CanteenMenuEnumType.cs @@ -12,7 +12,7 @@ public enum CanteenMenuEnumType /// 订餐 /// [Description("订餐")] - Order = 1, + Booking = 1, /// /// 扫码点餐 diff --git a/Src/Dlhis.Entity/Canteen/Enums/CanteenSettingItemEnumType.cs b/Src/Dlhis.Entity/Canteen/Enums/CanteenSettingItemEnumType.cs index a5ac6a98..c9e33c4b 100644 --- a/Src/Dlhis.Entity/Canteen/Enums/CanteenSettingItemEnumType.cs +++ b/Src/Dlhis.Entity/Canteen/Enums/CanteenSettingItemEnumType.cs @@ -14,6 +14,12 @@ public enum CanteenSettingItemEnumType [Description("营业点切换时间(HH:00:00)")] BusinessSwitchTime = 100, + /// + /// 订餐最晚时间 + /// + [Description("订餐最晚时间(HH:mm:00)")] + BookingDeadline = 101, + //----------------------------------------------------------------[200,300)--------------------------------------------------------------------------------------