From 976506b355f1889e2d24067b44f4e4dc9b3a8b0a Mon Sep 17 00:00:00 2001 From: liguoyang Date: Mon, 22 Apr 2024 12:39:19 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=B0=9D=E8=AF=95=E6=B8=85=E6=B4=97?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/Controllers/OrdersController.cs | 7 ++ .../Order/Request/OrderAddRequest.cs | 3 +- .../Order/Request/UpdateOfflineRequest.cs | 7 ++ .../Order/Services/IOrderService.cs | 4 +- .../Order/Services/Implements/OrderService.cs | 91 +++++++++++++++++-- .../Order/TimePeriodExtensions.cs | 15 ++- 6 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 Src/Dlhis.Canteen/Order/Request/UpdateOfflineRequest.cs diff --git a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs index 658096dd..36f6654f 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs @@ -46,6 +46,13 @@ public class OrdersController : ControllerBase await _orderService.ReCalcOfflineAsync(request); } + [IgnoreTenant] + [HttpPost("UpdateOffline")] + public async Task UpdateOffline(UpdateOfflineRequest outRequest) + { + await _orderService.UpdateOffline(outRequest); + } + /// /// 设备发起订单 /// diff --git a/Src/Dlhis.Canteen/Order/Request/OrderAddRequest.cs b/Src/Dlhis.Canteen/Order/Request/OrderAddRequest.cs index 191c9239..a62b25be 100644 --- a/Src/Dlhis.Canteen/Order/Request/OrderAddRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/OrderAddRequest.cs @@ -50,8 +50,7 @@ public class OrderAddRequest : IValidatableObject //处理金额 Amount = -Math.Abs(Amount); - //在线就以API时间为准 - if (!IsOffline) + if (!CostDateTime.HasValue) { CostDateTime = DateTime.Now; } diff --git a/Src/Dlhis.Canteen/Order/Request/UpdateOfflineRequest.cs b/Src/Dlhis.Canteen/Order/Request/UpdateOfflineRequest.cs new file mode 100644 index 00000000..c72a8a42 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/UpdateOfflineRequest.cs @@ -0,0 +1,7 @@ +namespace Dlhis.Canteen.Order.Request +{ + public class UpdateOfflineRequest + { + public string No { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Services/IOrderService.cs b/Src/Dlhis.Canteen/Order/Services/IOrderService.cs index a1aa9446..fc96866f 100644 --- a/Src/Dlhis.Canteen/Order/Services/IOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IOrderService.cs @@ -7,12 +7,14 @@ namespace Dlhis.Canteen.Order.Services; public interface IOrderService : IScopeDependency { - + Task> AddAsync(OrderAddRequest request); Task ReCalcOfflineAsync(ReCalcOfflineRequest request); + Task UpdateOffline(UpdateOfflineRequest outRequest); + /// /// 设备消费 /// diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 01610a16..92462ad1 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -142,7 +142,7 @@ public class OrderService : BaseOrderService, IOrderService } if (!order.IsOffline && order.OrderStatus != CanteenOrderStatusEnumType.Success) - { + { return true; } @@ -184,12 +184,6 @@ public class OrderService : BaseOrderService, IOrderService var switchTime = await GetSettingAsync(businessPlaceInfo.TenantId, CanteenSettingItemEnumType.BusinessSwitchTime); - var shiftTimePeriod = new TimePeriod() - { - Start = shift?.Start, - End = shift?.End - }; - //计算成本日期 todo 优化 var costDate = DateTime.Now; if (shift == null) @@ -235,7 +229,6 @@ public class OrderService : BaseOrderService, IOrderService OriginTenantId = gainfo.Factory, Werks = gainfo.Werks, - //餐别异常处理 Status = BalanceRecordStatusEnumType.Valid, OrderStatus = CanteenOrderStatusEnumType.Success, @@ -475,6 +468,88 @@ public class OrderService : BaseOrderService, IOrderService } + public async Task UpdateOffline(UpdateOfflineRequest outRequest) + { + 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) + .WhereIF(outRequest.No.IsPresent(), x => x.No == outRequest.No) + .ToListAsync(); + + foreach (var item in orders) + { + var request = item.RequestJson.ToObject(); + var device = await DbContext.Queryable() + .Where(x => x.UniqueNo == request.DeviceUniqueNo) + .FirstAsync(); + + var registry = await DbContext.Queryable() + .Where(x => x.DeviceUniqueNo == request.DeviceUniqueNo) + .FirstAsync(); + + 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 + }) + .FirstAsync(); + + + //获取当前消费餐次 + var shifts = await DbContext.Queryable().Where(x => x.ShiftCode == businessPlaceInfo.ShiftCode).ToListAsync(); + + var shift = shifts.FirstOrDefault(x => new TimePeriod() + { + Start = x.Start, + End = x.End + + }.IsPresent1(request.CostDateTime)); + + var switchTime = await GetSettingAsync(businessPlaceInfo.TenantId, CanteenSettingItemEnumType.BusinessSwitchTime); + + //计算成本日期 todo 优化 + var costDate = DateTime.Now; + if (shift == null) + { + costDate = DateTime.Now; + } + else + { + if (switchTime.HasValue) + { + var beginOfDay = DateTime.Today; + + var setTime = beginOfDay.Add(switchTime.Value.ToTimeSpan()); + if (DateTime.Now < setTime) + costDate = DateTime.Now.AddDays(-1); + } + } + + var shiftType = shift?.ShiftType; + + await DbContext.Updateable() + .SetColumns(x => x.BusinessShiftCode == businessPlaceInfo.ShiftCode) + .SetColumns(x => x.CostDate == costDate) + .SetColumns(x => x.CostDateTime == request.CostDateTime) + .SetColumns(x => x.ShiftType == shiftType) + .Where(x => x.No == item.No) + .ExecuteCommandAsync(); + + await DbContext.Updateable() + .SetColumns(x => x.BusinessShiftCode == businessPlaceInfo.ShiftCode) + .SetColumns(x => x.CostDate == costDate) + .SetColumns(x => x.CostDateTime == request.CostDateTime) + .SetColumns(x => x.ShiftType == shiftType) + .Where(x => x.No == item.No) + .ExecuteCommandAsync(); + } + } + //******************************************************* help methods ************************************************************/ diff --git a/Src/Dlhis.Canteen/Order/TimePeriodExtensions.cs b/Src/Dlhis.Canteen/Order/TimePeriodExtensions.cs index 6c09d10e..4c22294c 100644 --- a/Src/Dlhis.Canteen/Order/TimePeriodExtensions.cs +++ b/Src/Dlhis.Canteen/Order/TimePeriodExtensions.cs @@ -16,26 +16,25 @@ public static class TimePeriodExtensions if (period.IsCrossDay()) { //period = [22:00:00,03:00:00] - var currentStart = DateTime.Today.Add(period.Start.Value.ToTimeSpan()); - var endOfDay = DateTime.Today.AddDays(1).AddSeconds(-1); + var currentStart = dateTime.Date.Add(period.Start.Value.ToTimeSpan()); + var endOfDay = dateTime.Date.AddDays(1).AddSeconds(-1); //assume is left range . then currentStart is 2024-04-16 22:00:00 and endOfDay is 2024-04-16 23:59:59 if (dateTime >= currentStart && dateTime <= endOfDay) { start = currentStart; //2024-04-16 22:00:00 - end = DateTime.Today.AddDays(1).Add(period.End.Value.ToTimeSpan());//2024-04-17 03:00:00 + end = dateTime.Date.AddDays(1).Add(period.End.Value.ToTimeSpan());//2024-04-17 03:00:00 } else { - - start = DateTime.Today.AddDays(-1).Add(period.Start.Value.ToTimeSpan()); - end = DateTime.Today.Add(period.End.Value.ToTimeSpan()); + start = dateTime.Date.AddDays(-1).Add(period.Start.Value.ToTimeSpan()); + end = dateTime.Date.Add(period.End.Value.ToTimeSpan()); } } else { - start = DateTime.Today.Add(period.Start.Value.ToTimeSpan()); - end = DateTime.Today.Add(period.End.Value.ToTimeSpan()); + start = dateTime.Date.Add(period.Start.Value.ToTimeSpan()); + end = dateTime.Date.Add(period.End.Value.ToTimeSpan()); } return dateTime >= start && dateTime <= end;