diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs index 4f684d96..07734136 100644 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs @@ -56,7 +56,7 @@ public class BalanceRecordResponse /// /// 营业点 /// - public Guid BusinessPlaceCode { get; set; } + public Guid? BusinessPlaceCode { get; set; } public string BusinessPlaceName { get; set; } /// diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 44aaa029..c9d921f8 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -155,7 +155,7 @@ public class OrderService : IOrderService DeviceInfo = request.DeviceUniqueNo, No = "O" + SnowFlakeHelper.Instance.NextId(), - SubsidiesFromMonth = DateTime.Now.ToString("yyyyMM"), + SubsidiesFromMonth = request.CostDateTime.ToString("yyyyMM"), IsOffline = request.IsOffline, IsCostCrossTenant = GetSetting(settings, CanteenSettingItemEnumType.AllowCrossTenant), @@ -173,24 +173,25 @@ public class OrderService : IOrderService }; var orderId = await _dbContext.InsertReturnIdentityAsync(order); - //await _dbContext.Client.Ado.BeginTranAsync(); try { await GenerateConsumeRecordAsync(orderId, settings, shifts, request.CostDateTime); - order.OrderStatus = CanteenOrderStatusEnumType.Successful; - - //await _dbContext.Client.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception ex) { - order.OrderStatus = CanteenOrderStatusEnumType.Failure; - //await _dbContext.Client.Ado.RollbackTranAsync(); + await _dbContext.Updateable() + .SetColumns(x => x.OrderStatus == CanteenOrderStatusEnumType.Failure) + .SetColumns(x => x.Result == ex.Message) + .Where(x => x.Id == orderId) + .ExecuteCommandAsync(); + throw; } - finally - { - await _dbContext.UpdateAsync(order); - } + + await _dbContext.Updateable() + .SetColumns(x => x.OrderStatus == CanteenOrderStatusEnumType.Successful) + .Where(x => x.Id == orderId) + .ExecuteCommandAsync(); } /// @@ -206,14 +207,15 @@ public class OrderService : IOrderService var order = new CanteenOrderEntity { RequestJson = request.ToJson(), + IsOffline = false, ThirdNo = request.ThirdNo, - Type = BalanceRecordTypeEnumType.Out, + Type = BalanceRecordTypeEnumType.In, Name = gainfo.Name, Source = request.Source, UserNo = gainfo.No, UserCode = gainfo.Code, Amount = request.Amount, - BusinessPlaceCode = Guid.Empty, + BusinessPlaceCode = null, BusinessShiftCode = null, CostDate = DateTime.Now.Date, CostId = gainfo.CostId, @@ -221,8 +223,7 @@ public class OrderService : IOrderService DeviceInfo = string.Empty, No = "O" + SnowFlakeHelper.Instance.NextId(), - SubsidiesFromMonth = DateTime.Now.ToString("yyyyMM"), - IsOffline = false, + SubsidiesFromMonth = request.CostDateTime.ToString("yyyyMM"), IsCostCrossTenant = GetSetting(settings, CanteenSettingItemEnumType.AllowCrossTenant), OriginTenantId = gainfo.Werks,//人员可能跨基地消费 @@ -241,17 +242,22 @@ public class OrderService : IOrderService try { await GenerateRechargeRecordAsync(orderId); - order.OrderStatus = CanteenOrderStatusEnumType.Successful; } - catch (Exception) + catch (Exception ex) { - order.OrderStatus = CanteenOrderStatusEnumType.Failure; + await _dbContext.Updateable() + .SetColumns(x => x.OrderStatus == CanteenOrderStatusEnumType.Failure) + .SetColumns(x => x.Result == ex.Message) + .Where(x => x.Id == orderId) + .ExecuteCommandAsync(); + throw; } - finally - { - await _dbContext.UpdateAsync(order); - } + + await _dbContext.Updateable() + .SetColumns(x => x.OrderStatus == CanteenOrderStatusEnumType.Successful) + .Where(x => x.Id == orderId) + .ExecuteCommandAsync(); } @@ -343,8 +349,11 @@ public class OrderService : IOrderService var dayMarketCostMax = GetSetting(settings, CanteenSettingItemEnumType.DayMarketCostMax); if (dayMarketCostMax != default) { - var businessPlaceCodes = await _dbContext.Queryable().Where(x => x.Catalog == CanteenBusinessPlaceCatalogEnumType.Supermarket).Select(x => x.Code).ToListAsync(); - var cost = balanceRecords.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode)).Sum(x => x.Amount); + var businessPlaceCodes = await _dbContext.Queryable() + .Where(x => x.Catalog == CanteenBusinessPlaceCatalogEnumType.Supermarket) + .Select(x => x.Code).ToListAsync(); + + var cost = balanceRecords.Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode.Value)).Sum(x => x.Amount); if (cost + Math.Abs(order.Amount) > dayMarketCostMax) { throw new UserFriendlyException($"超出当天超市消费限制({dayMarketCostMax}),无法消费"); @@ -403,7 +412,7 @@ public class OrderService : IOrderService var effect = await _dbContext.Updateable() .SetColumns(x => x.Balance == canteenUser.Balance) .SetColumns(x => x.Version == x.Version + 1) - .Where(x => x.UserNo == order.UserNo && x.Version == canteenUser.Version)//必须与查询时的version一致 + .Where(x => x.UserNo == order.UserNo && x.Version == canteenUser.Version) .ExecuteCommandAsync(); if (effect <= 0) throw new VersionExceptions("更新版本冲突"); @@ -425,10 +434,7 @@ public class OrderService : IOrderService /// /// /// - private async Task GenerateConsumeRecordAsync(long orderId, - Dictionary settings, - List shifts, - DateTime costDateTime) + private async Task GenerateConsumeRecordAsync(long orderId, Dictionary settings, List shifts, DateTime costDateTime) { var order = await _dbContext.Queryable().Where(x => x.Id == orderId).FirstAsync(); //校验 @@ -455,6 +461,7 @@ public class OrderService : IOrderService //写入记录 var balanceRecord = order.Adapt(); await _dbContext.InsertAsync(balanceRecord); + }, 5); } } diff --git a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs index a34328e8..25aeaf29 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/BalanceRecordEntity.cs @@ -64,8 +64,8 @@ public class BalanceRecordEntity : SugarBaseEntity, ITenantId /// /// 营业点 /// - [SugarColumn(ColumnDescription = "营业点")] - public Guid BusinessPlaceCode { get; set; } + [SugarColumn(ColumnDescription = "营业点" , IsNullable = true)] + public Guid? BusinessPlaceCode { get; set; } /// /// 餐次