diff --git a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs index 9902e541..7ac40969 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs @@ -42,13 +42,25 @@ public class OrdersController : ControllerBase public async Task> AddAsync(OrderAddRequest request) { var sw = Stopwatch.StartNew(); + var result = await _orderService.AddAsync(request); try { - return await _orderService.AddAsync(request); + return result.Response; } finally { - _logger.LogInformation("消费请求:{json}. 耗时:{time}", request.ToJson(), sw.ElapsedMilliseconds); + var ms = sw.ElapsedMilliseconds; + try + { + if (ms > 1000) + { + _logger.LogInformation("消费请求:{json}. 耗时记录:{log}", request.ToJson(), result.Logs.Join("\r\n")); + } + } + catch (Exception e) + { + //ignore + } } } @@ -62,7 +74,27 @@ public class OrdersController : ControllerBase [IgnoreTenant] public async Task> DeviceConsume(OrderAddRequest request) { - return await _orderService.AddAsync(request); + var sw = Stopwatch.StartNew(); + var result = await _orderService.AddAsync(request); + try + { + return result.Response; + } + finally + { + var ms = sw.ElapsedMilliseconds; + try + { + if (ms > 1000) + { + _logger.LogInformation("消费请求:{json}. 耗时记录:{log}", request.ToJson(), result.Logs.Join("\r\n")); + } + } + catch (Exception e) + { + //ignore + } + } } /// diff --git a/Src/Dlhis.Canteen/Order/Response/OrderResultResponseWithLogs.cs b/Src/Dlhis.Canteen/Order/Response/OrderResultResponseWithLogs.cs new file mode 100644 index 00000000..65b57324 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/OrderResultResponseWithLogs.cs @@ -0,0 +1,10 @@ +using Kurisu.AspNetCore.UnifyResultAndValidation; + +namespace Dlhis.Canteen.Order.Response; + +public class OrderResultResponseWithLogs +{ + public DefaultApiResult Response { get; set; } + + public List Logs { get; set; } = new(); +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Services/IOrderService.cs b/Src/Dlhis.Canteen/Order/Services/IOrderService.cs index a738db3f..a956a361 100644 --- a/Src/Dlhis.Canteen/Order/Services/IOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IOrderService.cs @@ -1,20 +1,19 @@ using Dlhis.Canteen.Order.Request; using Dlhis.Canteen.Order.Response; using Kurisu.AspNetCore.DataAccess.Dto; -using Kurisu.AspNetCore.UnifyResultAndValidation; namespace Dlhis.Canteen.Order.Services; public interface IOrderService : IScopeDependency { - Task> AddAsync(OrderAddRequest request); + Task AddAsync(OrderAddRequest request); /// /// 设备消费 /// /// /// - Task> DeviceConsume(OrderAddRequest request); + Task DeviceConsume(OrderAddRequest request); Task> GetOrdersAggregationAsync(PageDto page); } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 69a3093a..a88c2920 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -1,4 +1,5 @@ -using Dlhis.Canteen.Setting.Services; +using System.Diagnostics; +using Dlhis.Canteen.Setting.Services; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; @@ -22,6 +23,8 @@ namespace Dlhis.Canteen.Order.Services.Implements; public class OrderService : BaseOrderService, IOrderService { private readonly IServiceProvider _serviceProvider; + private Stopwatch _sw; + private readonly List _logs = new(); public OrderService(ICanteenSettingService canteenSettingService, IDbContext dbContext, @@ -33,14 +36,16 @@ public class OrderService : BaseOrderService, IOrderService _serviceProvider = serviceProvider; } - public async Task> DeviceConsume(OrderAddRequest request) + public async Task DeviceConsume(OrderAddRequest request) { return await AddAsync(request); } - public async Task> AddAsync(OrderAddRequest request) + public async Task AddAsync(OrderAddRequest request) { + _sw = new Stopwatch(); + //尝试匹配userId var s = long.TryParse(request.UserUniqueNo, out var userId); @@ -60,6 +65,9 @@ public class OrderService : BaseOrderService, IOrderService .FirstAsync(); } + _logs.Add("获取人员耗时:" + _sw.ElapsedMilliseconds); + _sw.Restart(); + var message = string.Empty; if (request.IsOffline) @@ -126,12 +134,21 @@ public class OrderService : BaseOrderService, IOrderService }) .SingleAsync(); - return new DefaultApiResult + var result = new DefaultApiResult { Code = message.IsPresent() ? ApiStateCode.Error : ApiStateCode.Success, Data = data, Msg = message }; + + _logs.Add("获取余额:" + _sw.ElapsedMilliseconds); + _sw.Restart(); + + return new OrderResultResponseWithLogs + { + Response = result, + Logs = _logs + }; } private async Task ToCheckAsync(string thirdNo) @@ -309,6 +326,9 @@ public class OrderService : BaseOrderService, IOrderService }.IsPresent1(request.CostDateTime)); shift.ThrowIfNull("非就餐时间,无法消费"); + _logs.Add("检验设备和营业点参数:" + _sw.ElapsedMilliseconds); + _sw.Restart(); + var costDate = await GetCostDateAsync(shift, request.CostDateTime); var order = new CanteenOrderEntity @@ -350,9 +370,13 @@ public class OrderService : BaseOrderService, IOrderService }; var orderId = await DbContext.InsertReturnIdentityAsync(order); + _logs.Add("临时order写入:" + _sw.ElapsedMilliseconds); + _sw.Restart(); + try { await GenerateConsumeRecordAsync(orderId); + if (request.Image.IsPresent()) { await DbContext.InsertAsync(new ImageRecordEntity @@ -368,6 +392,9 @@ public class OrderService : BaseOrderService, IOrderService .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.Id == orderId) .ExecuteCommandAsync(); + + _logs.Add("更新image和订单信息:" + _sw.ElapsedMilliseconds); + _sw.Restart(); } catch (Exception ex) { @@ -534,30 +561,31 @@ public class OrderService : BaseOrderService, IOrderService var order = await DbContext.Queryable().Where(x => x.Id == orderId).SingleAsync(); //校验 await Verify(order); + _logs.Add("消费请求校验:" + _sw.ElapsedMilliseconds); + _sw.Restart(); - var allowNoBalance = await GetSettingAsync(order.UserNo, order.TenantId, CanteenSettingItemEnumType.AllowNoBalance); await CommonHelper.RetryAsync(async () => { - if (!allowNoBalance) - { - var gainfoMeal = await DbContext.Queryable().Where(x => x.UserNo == order.UserNo).SingleAsync(); - //金额+- - gainfoMeal.Balance += order.Amount; - (gainfoMeal.Balance < 0).ThrowIfTrue("余额不足,无法消费"); + var gainfoMeal = await DbContext.Queryable().Where(x => x.UserNo == order.UserNo).SingleAsync(); + //金额+- + gainfoMeal.Balance += order.Amount; + (gainfoMeal.Balance < 0).ThrowIfTrue("余额不足,无法消费"); - await DbContext.Updateable() - .SetColumns(x => x.Balance == gainfoMeal.Balance) - .SetColumns(x => x.Version == x.Version + 1) - .SetColumns(x => x.ModifiedTime == DateTime.Now) - .Where(x => x.UserNo == order.UserNo && x.Version == gainfoMeal.Version) //必须与查询时的version一致 - .ExecuteCommandThrowVersionAsync(); - } + await DbContext.Updateable() + .SetColumns(x => x.Balance == gainfoMeal.Balance) + .SetColumns(x => x.Version == x.Version + 1) + .SetColumns(x => x.ModifiedTime == DateTime.Now) + .Where(x => x.UserNo == order.UserNo && x.Version == gainfoMeal.Version) //必须与查询时的version一致 + .ExecuteCommandThrowVersionAsync(); //写入记录 var balanceRecord = order.Adapt(); await DbContext.InsertAsync(balanceRecord); }, 5); + + _logs.Add("消费写入:" + _sw.ElapsedMilliseconds); + _sw.Restart(); } ///