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