diff --git a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs index 76fcdd18..d319b36e 100644 --- a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs +++ b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs @@ -153,7 +153,7 @@ public class DishesMenuService : IDishesMenuService Number = number, Price = price, - Type = CanteenApplicaitonTypeEnumType.Booking, + Type = CanteenApplicationTypeEnumType.Booking, Version = 0, }; }); diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/MealUserService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/MealUserService.cs index a83bf496..a8c13089 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/MealUserService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/MealUserService.cs @@ -100,7 +100,7 @@ public class MealUserService : IMealUserService Status = BalanceRecordStatusEnumType.Valid, CostDateTime = DateTime.Now, Remark = $"{gainfoLeave.Code}:余额转入", - ApplicationType = CanteenApplicaitonTypeEnumType.MealSupplement, + ApplicationType = CanteenApplicationTypeEnumType.MealSupplement, TenantId = gainfo.Factory, Werks = gainfo.Werks, IsDeleted = false, diff --git a/Src/Dlhis.Canteen/MealSupplementRecord/Services/Implements/MealSupplementRecordService.cs b/Src/Dlhis.Canteen/MealSupplementRecord/Services/Implements/MealSupplementRecordService.cs index 1e54a38f..83f1fdd0 100644 --- a/Src/Dlhis.Canteen/MealSupplementRecord/Services/Implements/MealSupplementRecordService.cs +++ b/Src/Dlhis.Canteen/MealSupplementRecord/Services/Implements/MealSupplementRecordService.cs @@ -156,7 +156,7 @@ public class MealSupplementRecordService : IMealSupplementRecordService await _dbContext.InsertAsync(new BalanceRecordEntity { Amount = request.Balance, - ApplicationType = CanteenApplicaitonTypeEnumType.MealSupplement, + ApplicationType = CanteenApplicationTypeEnumType.MealSupplement, Type = BalanceRecordTypeEnumType.In, BusinessPlaceCode = null, BusinessShiftCode = null, diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index d6b91a1d..ecf52125 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -137,4 +137,16 @@ public class BalancesController : ControllerBase { return await _balanceService.GetConsumeDeviceAsync(request); } -} + + + /// + /// 海宁餐补数据写入 + /// + /// + [Transactional] + [HttpPost("haining/import")] + public async Task Import(BalanceHainingImportRequest request) + { + await _balanceService.Import(request); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceHainingImportRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceHainingImportRequest.cs new file mode 100644 index 00000000..3e163eb7 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceHainingImportRequest.cs @@ -0,0 +1,115 @@ +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Canteen.Order.Request; + +public class BalanceHainingImportRequest : IValidatableObject +{ + /// + /// 工号 + /// + [Required(ErrorMessage = "工号不可为空")] + public string UserCode { get; set; } + + /// + /// 流水号 + /// + [Required(ErrorMessage = "流水号不可为空")] + public string No { get; set; } + + /// + /// 设备号 + /// + public string DeviceUniqueNo { get; set; } + + /// + /// 金额 + /// + [Required] + public decimal Amount { get; set; } + + /// + /// 消费数据类型 + /// + [Required] + [EnumDataType(typeof(CanteenApplicationTypeEnumType), ErrorMessage = "消费数据类型有误")] + public CanteenApplicationTypeEnumType ApplicationType { get; set; } + + /// + /// 餐次 + /// + [Required] + [EnumDataType(typeof(ShiftEnumType), ErrorMessage = "餐次类型有误")] + public ShiftEnumType ShiftType { get; set; } + + /// + /// 营业点 + /// + public Guid? BusinessPlaceCode { get; set; } + + /// + /// 消费类型 0:消费, 1:充值 + /// + [Required] + [EnumDataType(typeof(BalanceRecordTypeEnumType), ErrorMessage = "消费类型有误")] + public BalanceRecordTypeEnumType Type { get; set; } + + /// + /// 消费来源 + /// + [EnumDataType(typeof(BalanceRecordSourceEnumType), ErrorMessage = "消费来源有误")] + public BalanceRecordSourceEnumType Source { get; set; } + + /// + /// 成本日期 + /// + [Required] + public DateTime CostDate { get; set; } + + /// + /// 消费时间 + /// + [Required] + public DateTime CostDateTime { get; set; } + + /// + /// 厂区 + /// + [Required(ErrorMessage = "厂区不可为空")] + public string Factory { get; set; } + + /// + /// 备注 + /// + [Required(ErrorMessage = "备注不可为空")] + public string Remark { get; set; } + + + public IEnumerable Validate(ValidationContext validationContext) + { + if (Type == BalanceRecordTypeEnumType.Out) + { + Amount = -Math.Abs(Amount); + + if (DeviceUniqueNo.IsEmpty()) + { + yield return new ValidationResult("消费设备号不能为空", new[] { nameof(DeviceUniqueNo) }); + } + + if (ApplicationType != CanteenApplicationTypeEnumType.Device) + { + yield return new ValidationResult("仅支持设备消费", new[] { nameof(ApplicationType) }); + } + } + else + { + Amount = Math.Abs(Amount); + + if (ApplicationType != CanteenApplicationTypeEnumType.MealSupplement) + { + yield return new ValidationResult("只支持餐补充值", new[] { nameof(ApplicationType) }); + } + } + } +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordUserPageRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordUserPageRequest.cs index 3231e4df..80109baa 100644 --- a/Src/Dlhis.Canteen/Order/Request/BalanceRecordUserPageRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordUserPageRequest.cs @@ -10,7 +10,7 @@ public class BalanceRecordUserPageRequest : PageDto, IValidatableObject /// /// 消费应用类型 /// - public CanteenApplicaitonTypeEnumType? ApplicationType { get; set; } + public CanteenApplicationTypeEnumType? ApplicationType { get; set; } /// /// 日期范围查询 diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordUserPageResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordUserPageResponse.cs index 532b89d1..f056026b 100644 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordUserPageResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordUserPageResponse.cs @@ -55,7 +55,7 @@ public class BalanceRecordUserPageResponse /// /// 消费应用类型 /// - public CanteenApplicaitonTypeEnumType ApplicationType { get; set; } + public CanteenApplicationTypeEnumType ApplicationType { get; set; } /// /// 消费应用类型 diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs index a7cfb3d7..6454181b 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs @@ -29,4 +29,7 @@ public interface IBalanceService : IScopeDependency Task> AverageDailyAsync(AverageDailyRequest request); Task> GetConsumeDeviceAsync(GetConsumeDeviceRequest request); + + + Task Import(BalanceHainingImportRequest request); } diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index abf8414c..790e736c 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -494,6 +494,58 @@ public class BalanceService : IBalanceService return page; } + public async Task Import(BalanceHainingImportRequest request) + { + var gainfo = await _dbContext.Queryable().Where(x => x.Code == request.UserCode).SingleAsync(); + gainfo.ThrowIfNull($"工号{request.UserCode}不存在"); + var gainfoMeal = await _dbContext.Queryable().Where(x => x.UserCode == request.UserCode).SingleAsync(); + + + await _dbContext.InsertAsync(new BalanceRecordEntity + { + Amount = request.Amount, + ApplicationType = request.ApplicationType, + Type = request.Type, + BusinessPlaceCode = request.BusinessPlaceCode, + BusinessShiftCode = null, + ShiftType = request.ShiftType, + CostDate = request.CostDate, + CostDateTime = request.CostDateTime, + UserNo = gainfo.No, + No = request.No, + UserCode = gainfo.Code, + TenantId = request.Factory, + Status = BalanceRecordStatusEnumType.Valid, + Source = request.Source, + Remark = request.Remark, + CostId = gainfo.CostId, + SubsidiesFromMonth = request.CostDate.ToString("yyyyMM"), + OriginTenantId = gainfo.Factory, + Werks = gainfo.Werks, + Name = gainfo.Name, + IsCostCrossTenant = false, + DepartmentNo = gainfo.DepartmentNo, + DeviceUniqueNo = request.DeviceUniqueNo, + + IsDeleted = false, + + CreatedBy = 1, + CreateTime = DateTime.Now, + ModifiedBy = 1, + ModifiedTime = DateTime.Now, + }); + + var newBalance = gainfoMeal.Balance += request.Amount; + + await _dbContext.Updateable() + .SetColumns(x => x.Balance == newBalance) + .SetColumns(x => x.ModifiedBy == 1) + .SetColumns(x => x.ModifiedTime == DateTime.Now) + .SetColumns(x => x.Version == x.Version + 1) + .Where(x => x.UserCode == request.UserCode && x.Version == gainfoMeal.Version) + .ExecuteCommandThrowVersionAsync("写入失败,正在消费中"); + } + /// /// 获取离线设备 diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs index bdcd7ae4..80c7590c 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs @@ -55,7 +55,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService RequestJson = request.ToJson(), ThirdNo = string.Empty, Type = BalanceRecordTypeEnumType.Out, - ApplicationType = CanteenApplicaitonTypeEnumType.Booking, + ApplicationType = CanteenApplicationTypeEnumType.Booking, Name = gainfo.Name, Source = request.Source, UserNo = gainfo.No, @@ -287,7 +287,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService var end = start.AddDays(1).AddSeconds(-1); var exists = await DbContext.Queryable() - .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking) + .Where(x => x.ApplicationType == CanteenApplicationTypeEnumType.Booking) .Where(x => x.OrderStatus == CanteenOrderStatusEnumType.Success) .Where(x => x.ShiftType == shiftType) .Where(x => x.UserNo == gainfo.No) diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 9cc3dc2b..9bb19b50 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -182,7 +182,7 @@ public class OrderService : BaseOrderService, IOrderService RequestJson = request.ToJson(), ThirdNo = request.ThirdNo, Type = BalanceRecordTypeEnumType.Out, - ApplicationType = CanteenApplicaitonTypeEnumType.Device, + ApplicationType = CanteenApplicationTypeEnumType.Device, Name = gainfo.Name, Source = request.Source, UserNo = gainfo.No, @@ -314,7 +314,7 @@ public class OrderService : BaseOrderService, IOrderService RequestJson = request.ToJson(), ThirdNo = request.ThirdNo, Type = BalanceRecordTypeEnumType.Out, - ApplicationType = CanteenApplicaitonTypeEnumType.Device, + ApplicationType = CanteenApplicationTypeEnumType.Device, Name = gainfo.Name, Source = request.Source, UserNo = gainfo.No, @@ -383,7 +383,7 @@ public class OrderService : BaseOrderService, IOrderService var pageResult = await DbContext.Queryable().Where(x => x.UserNo == gainfo.No) .LeftJoin((x, bplace) => x.BusinessPlaceCode == bplace.Code) - .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking) + .Where(x => x.ApplicationType == CanteenApplicationTypeEnumType.Booking) .OrderBy(x => x.CreateTime, OrderByType.Desc) .Select((x, bplace) => new OrderAggregationResponse { @@ -422,7 +422,7 @@ public class OrderService : BaseOrderService, IOrderService var orders = await DbContext.Queryable().Where(x => x.IsOffline) .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) .Where(x => x.OrderStatus == CanteenOrderStatusEnumType.Success) - .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Device) + .Where(x => x.ApplicationType == CanteenApplicationTypeEnumType.Device) .Where(x => SqlFunc.IsNullOrEmpty(x.BusinessShiftCode)) .WhereIF(outRequest.No.IsPresent(), x => x.No == outRequest.No) .ToListAsync(); diff --git a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs index 23935c82..b5874947 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs @@ -143,7 +143,7 @@ public class BalanceRecordEntity : SugarBaseEntity, ISoftDeleted, ITenantId /// 餐饮应用类型 /// [SugarColumn(ColumnDescription = "餐饮应用类型", ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))] - public CanteenApplicaitonTypeEnumType ApplicationType { get; set; } + public CanteenApplicationTypeEnumType ApplicationType { get; set; } public string TenantId { get; set; } diff --git a/Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs index e6538244..7b49aa17 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/DishesMenuEntity.cs @@ -22,7 +22,7 @@ public class DishesMenuEntity : SugarBaseEntity, ITenantId, IVersion /// 菜单类型 /// [SugarColumn(ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))] - public CanteenApplicaitonTypeEnumType Type { get; set; } + public CanteenApplicationTypeEnumType Type { get; set; } /// /// 所属营业点 diff --git a/Src/Dlhis.Entity/Canteen/Enums/CanteenApplicaitonTypeEnumType.cs b/Src/Dlhis.Entity/Canteen/Enums/CanteenApplicationTypeEnumType.cs similarity index 93% rename from Src/Dlhis.Entity/Canteen/Enums/CanteenApplicaitonTypeEnumType.cs rename to Src/Dlhis.Entity/Canteen/Enums/CanteenApplicationTypeEnumType.cs index 1b81255c..77bdf515 100644 --- a/Src/Dlhis.Entity/Canteen/Enums/CanteenApplicaitonTypeEnumType.cs +++ b/Src/Dlhis.Entity/Canteen/Enums/CanteenApplicationTypeEnumType.cs @@ -6,7 +6,7 @@ namespace Dlhis.Entity.Canteen.Enums; /// 餐饮应用类型 /// [Description("餐饮应用类型")] -public enum CanteenApplicaitonTypeEnumType +public enum CanteenApplicationTypeEnumType { [Description("设备消费")] Device = 100, diff --git a/Src/Dlhis.ScheduledTask/Jobs/MealSupplementHandlerJob.cs b/Src/Dlhis.ScheduledTask/Jobs/MealSupplementHandlerJob.cs index c7ee565c..b254623c 100644 --- a/Src/Dlhis.ScheduledTask/Jobs/MealSupplementHandlerJob.cs +++ b/Src/Dlhis.ScheduledTask/Jobs/MealSupplementHandlerJob.cs @@ -159,7 +159,7 @@ public class MealSupplementHandlerJob : BaseJob await DbContext.InsertAsync(new BalanceRecordEntity { Amount = mealSupplement.Amount, - ApplicationType = CanteenApplicaitonTypeEnumType.MealSupplement, + ApplicationType = CanteenApplicationTypeEnumType.MealSupplement, Type = BalanceRecordTypeEnumType.In, BusinessPlaceCode = null, BusinessShiftCode = null, diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs index f52b986a..c44e46d2 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/HangfireController.cs @@ -81,7 +81,7 @@ public class HangfireController : ControllerBase { var data = await _dbContext.Queryable() .Where(x => x.UserCode == row.UserCode) - .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.MealSupplement) + .Where(x => x.ApplicationType == CanteenApplicationTypeEnumType.MealSupplement) .Where(x => x.Remark == row.Remark) .ToListAsync();