diff --git a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs index 2d9152be..658096dd 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs @@ -39,6 +39,13 @@ public class OrdersController : ControllerBase return await _orderService.AddAsync(request); } + [IgnoreTenant] + [HttpPost("ReCalcOffline")] + public async Task ReCalcOfflineAsync(ReCalcOfflineRequest request) + { + await _orderService.ReCalcOfflineAsync(request); + } + /// /// 设备发起订单 /// diff --git a/Src/Dlhis.Canteen/Order/Request/ReCalcOfflineRequest.cs b/Src/Dlhis.Canteen/Order/Request/ReCalcOfflineRequest.cs new file mode 100644 index 00000000..00d6e10b --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/ReCalcOfflineRequest.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Canteen.Order.Request +{ + public class ReCalcOfflineRequest + { + [Required] + public string UserCode { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Services/IOrderService.cs b/Src/Dlhis.Canteen/Order/Services/IOrderService.cs index 2af40c66..a1aa9446 100644 --- a/Src/Dlhis.Canteen/Order/Services/IOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IOrderService.cs @@ -10,6 +10,9 @@ public interface IOrderService : IScopeDependency Task> AddAsync(OrderAddRequest request); + + Task ReCalcOfflineAsync(ReCalcOfflineRequest request); + /// /// 设备消费 /// diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index dc05e08b..4f7f9c08 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -675,5 +675,63 @@ public class OrderService : BaseOrderService, IOrderService }, 5); } + public async Task ReCalcOfflineAsync(ReCalcOfflineRequest request) + { + var gainfo = await DbContext.Queryable().Where(x => x.Code == request.UserCode).FirstAsync(); + var nos = await DbContext.Queryable().Where(x => x.UserCode == request.UserCode).Select(x => x.No).ToListAsync(); + var orders = await DbContext.Queryable().Where(x => x.IsOffline) + .Where(x => nos.Contains(x.No)) + .Where(x => x.UserCode == request.UserCode) + .ToListAsync(); + + + var gainfoMeal = await DbContext.Queryable().Where(x => x.UserNo == gainfo.No).FirstAsync(); + if (gainfoMeal == null) + { + gainfoMeal = new GainfoMealEntity + { + Balance = 0, + BalanceOfRecharge = 0, + BalanceOfSubsidies = 0, + Version = 0, + TenantId = gainfo.Factory, + UserNo = gainfo.No, + UserCode = gainfo.Code, + + CreatedBy = 1, + CreateTime = DateTime.Now, + ModifiedBy = 1, + ModifiedTime = DateTime.Now, + }; + + await DbContext.InsertAsync(gainfoMeal); + } + + var allowNoBalance = await GetSettingAsync(CanteenSettingItemEnumType.AllowNoBalance); + foreach (var order in orders) + { + await CommonHelper.RetryAsync(async () => + { + if (!allowNoBalance) + { + var gainfoMeal = await DbContext.Queryable().Where(x => x.UserNo == order.UserNo).FirstAsync(); + //金额+- + gainfoMeal.Balance += order.Amount; + + await DbContext.Updateable() + .SetColumns(x => x.Balance == gainfoMeal.Balance) + .SetColumns(x => x.Version == x.Version + 1) + .Where(x => x.UserNo == order.UserNo && x.Version == gainfoMeal.Version)//必须与查询时的version一致 + .ExecuteCommandThrowVersionAsync(); + } + + //写入记录 + var balanceRecord = order.Adapt(); + balanceRecord.Id = 0; + await DbContext.InsertAsync(balanceRecord); + + }, 5); + } + } }