From 87d3e9d2da3bfe414ca4d008142b1521d8de4c07 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 27 Jun 2024 21:35:22 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E8=B0=83=E8=AF=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Implements/MiddleService.cs | 57 ++++++++------- .../Entities/LocalBalanceRecordEntity.cs | 2 + ...ocalBusinessShiftMealRelationshipEntity.cs | 48 ++++++++++++- Src/Dlhis.Middle/Program.cs | 1 + Src/Dlhis.Middle/Request/OrderAddRequest.cs | 16 ++++- .../Response/OrderResultResponse.cs | 8 +-- .../Services/ICanteenSettingService.cs | 3 - .../BalanceRecordCheckBackgroundService.cs | 6 +- .../Implements/CanteenSettingService.cs | 71 +------------------ .../Services/Implements/HealthcheckService.cs | 12 ++-- .../Services/Implements/OrderService.cs | 26 +++---- .../Services/Implements/RemoteOrderService.cs | 2 +- Src/Dlhis.Middle/appsettings.json | 11 +++ 13 files changed, 129 insertions(+), 134 deletions(-) diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/MiddleService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/MiddleService.cs index bf94a18a..8e92c008 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/MiddleService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/MiddleService.cs @@ -21,39 +21,42 @@ public class MiddleService : IMiddleService public async Task MiddleUploadAsync(BalanceRecordEntity entity) { entity.Id = 0; - await _dbContext.InsertAsync(entity); - - await CommonHelper.RetryAsync(async () => + if (!await _dbContext.Queryable().AnyAsync(x => x.No == entity.No)) { - var mealUser = await _dbContext.Queryable().Where(x => x.UserCode == entity.UserCode).FirstAsync(); - if (mealUser == null) + await _dbContext.InsertAsync(entity); + + await CommonHelper.RetryAsync(async () => { - mealUser = new GainfoMealEntity + var mealUser = await _dbContext.Queryable().Where(x => x.UserCode == entity.UserCode).FirstAsync(); + if (mealUser == null) { - UserNo = entity.No, - UserCode = entity.UserCode, - Balance = 0, - BalanceOfRecharge = 0, - BalanceOfSubsidies = 0, - Version = 0 - }; + mealUser = new GainfoMealEntity + { + UserNo = entity.No, + UserCode = entity.UserCode, + Balance = 0, + BalanceOfRecharge = 0, + BalanceOfSubsidies = 0, + Version = 0 + }; - await _dbContext.InsertAsync(mealUser); - } + await _dbContext.InsertAsync(mealUser); + } - //重新核算 - var balance = await _dbContext.Queryable() - .Where(x => x.UserCode == entity.UserCode) - .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) - .SumAsync(x => x.Amount); + //重新核算 + var balance = await _dbContext.Queryable() + .Where(x => x.UserCode == entity.UserCode) + .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) + .SumAsync(x => x.Amount); - await _dbContext.Updateable() - .SetColumns(x => x.Version == x.Version + 1) - .SetColumns(x => x.Balance == balance) - .SetColumns(x => x.ModifiedTime == DateTime.Now) - .Where(x => x.UserCode == mealUser.UserCode && x.Version == mealUser.Version) - .ExecuteCommandThrowVersionAsync(); - }, 5); + await _dbContext.Updateable() + .SetColumns(x => x.Version == x.Version + 1) + .SetColumns(x => x.Balance == balance) + .SetColumns(x => x.ModifiedTime == DateTime.Now) + .Where(x => x.UserCode == mealUser.UserCode && x.Version == mealUser.Version) + .ExecuteCommandThrowVersionAsync(); + }, 5); + } //获取人员余额 return await _dbContext.Queryable() diff --git a/Src/Dlhis.Middle/Entities/LocalBalanceRecordEntity.cs b/Src/Dlhis.Middle/Entities/LocalBalanceRecordEntity.cs index 35272031..70f662b0 100644 --- a/Src/Dlhis.Middle/Entities/LocalBalanceRecordEntity.cs +++ b/Src/Dlhis.Middle/Entities/LocalBalanceRecordEntity.cs @@ -1,9 +1,11 @@ using Dlhis.Entity.Canteen.Entities; +using SqlSugar; namespace Dlhis.Middle.Entities; public class LocalBalanceRecordEntity : BalanceRecordEntity { + [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public new int Id { get; set; } public bool IsSync { get; set; } diff --git a/Src/Dlhis.Middle/Entities/LocalBusinessShiftMealRelationshipEntity.cs b/Src/Dlhis.Middle/Entities/LocalBusinessShiftMealRelationshipEntity.cs index eed8f859..238d7caa 100644 --- a/Src/Dlhis.Middle/Entities/LocalBusinessShiftMealRelationshipEntity.cs +++ b/Src/Dlhis.Middle/Entities/LocalBusinessShiftMealRelationshipEntity.cs @@ -1,8 +1,52 @@ -using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; +using SqlSugar.DbConvert; namespace Dlhis.Middle.Entities; -public class LocalBusinessShiftMealRelationshipEntity : BusinessShiftMealRelationshipEntity +[SugarTable(TableName = "BusinessShiftMealRelationship", TableDescription = "营业点餐次组合")] +public class LocalBusinessShiftMealRelationshipEntity : SugarBaseEntity, ITenantId { public new int Id { get; set; } + /// + /// 餐别Code + /// + [SugarColumn(ColumnDescription = "餐别Code", UniqueGroupNameList = new[] { "idx_CanteenBusinessShiftRelationship_shiftcode_shifttype" })] + public Guid ShiftCode { get; set; } + + /// + /// 餐别手工号 + /// + [SugarColumn(ColumnDescription = "餐别编码")] + public string ShiftCustomCode { get; set; } + + /// + /// 餐次 + /// + [SugarColumn(ColumnDescription = "餐次", ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert), UniqueGroupNameList = new[] { "idx_CanteenBusinessShiftRelationship_shiftcode_shifttype" })] + public ShiftEnumType ShiftType { get; set; } + + /// + /// 经营开始时间 + /// + [SugarColumn(ColumnDescription = "经营开始时间")] + public DateTime Start { get; set; } + + /// + /// 经营结束时间 + /// + [SugarColumn(ColumnDescription = "经营结束时间")] + public DateTime End { get; set; } + + /// + /// 序号 + /// + [SugarColumn(ColumnDescription = "序号")] + public int Sequence { get; set; } + + + public string TenantId { get; set; } + } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Program.cs b/Src/Dlhis.Middle/Program.cs index 9625dcf3..d57384c4 100644 --- a/Src/Dlhis.Middle/Program.cs +++ b/Src/Dlhis.Middle/Program.cs @@ -33,6 +33,7 @@ public class Startup : DefaultStartup return handler; }); + services.AddHostedService(); services.AddHostedService(); services.AddMemoryCache(); } diff --git a/Src/Dlhis.Middle/Request/OrderAddRequest.cs b/Src/Dlhis.Middle/Request/OrderAddRequest.cs index acf711ed..6a564f82 100644 --- a/Src/Dlhis.Middle/Request/OrderAddRequest.cs +++ b/Src/Dlhis.Middle/Request/OrderAddRequest.cs @@ -1,8 +1,9 @@ -using Dlhis.Entity.Canteen.Enums; +using System.ComponentModel.DataAnnotations; +using Dlhis.Entity.Canteen.Enums; namespace Dlhis.Middle.Request; -public class OrderAddRequest +public class OrderAddRequest : IValidatableObject { /// /// 是否离线数据 @@ -37,4 +38,15 @@ public class OrderAddRequest public DateTime? CostDateTime { get; set; } public string Image { get; set; } + + /// + public IEnumerable Validate(ValidationContext validationContext) + { + if (!CostDateTime.HasValue) + { + CostDateTime = DateTime.Now; + } + + yield break; + } } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Response/OrderResultResponse.cs b/Src/Dlhis.Middle/Response/OrderResultResponse.cs index 86c95218..65b07959 100644 --- a/Src/Dlhis.Middle/Response/OrderResultResponse.cs +++ b/Src/Dlhis.Middle/Response/OrderResultResponse.cs @@ -24,12 +24,8 @@ public class OrderResultResponse /// public string DepartmentName { get; set; } - - [JsonIgnore] - public decimal CurrentBalance { get; set; } - /// /// 余额 /// - public string Balance => CurrentBalance.ToString("f2"); -} + public decimal Balance { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Middle/Services/ICanteenSettingService.cs b/Src/Dlhis.Middle/Services/ICanteenSettingService.cs index 2de8d343..144efc61 100644 --- a/Src/Dlhis.Middle/Services/ICanteenSettingService.cs +++ b/Src/Dlhis.Middle/Services/ICanteenSettingService.cs @@ -11,8 +11,5 @@ public interface ICanteenSettingService : IScopeDependency /// /// Task> GetUserSettingAsync(string userNo, string tenantId); - - - Task GetBusinessSwitchTimeAsync(string tenantId); } diff --git a/Src/Dlhis.Middle/Services/Implements/BalanceRecordCheckBackgroundService.cs b/Src/Dlhis.Middle/Services/Implements/BalanceRecordCheckBackgroundService.cs index 2762ffab..019762de 100644 --- a/Src/Dlhis.Middle/Services/Implements/BalanceRecordCheckBackgroundService.cs +++ b/Src/Dlhis.Middle/Services/Implements/BalanceRecordCheckBackgroundService.cs @@ -58,6 +58,7 @@ public class BalanceRecordCheckBackgroundService : BackgroundService var balanceRecords = await db.Queryable().Where(x => x.TenantId == factory).Where(x => !x.IsSync).ToListAsync(stoppingToken); if (balanceRecords.Any()) { + _logger.LogInformation("上传离线订单"); foreach (var balanceRecord in balanceRecords) { await db.Client.Ado.BeginTranAsync(); @@ -70,9 +71,8 @@ public class BalanceRecordCheckBackgroundService : BackgroundService if (r.Code == ApiStateCode.Success) { var d = r.Data; - var balance = decimal.Parse(d.Balance); await db.Updateable() - .SetColumns(x => x.Balance == balance) + .SetColumns(x => x.Balance == d.Balance) .Where(x => x.UserCode == d.UserCode) .ExecuteCommandAsync(stoppingToken); @@ -144,7 +144,7 @@ public class BalanceRecordCheckBackgroundService : BackgroundService var tokenResponse = await httpClient.PostAsync($"https://{_hostName}/api/User/OAuth2/clientgrant", new StringContent(JsonConvert.SerializeObject(new { - ClientId = "e569c2aaa98e300c", + ClientId = "e509c2aaa98e300c", ClientSecret = "6184d8979fc48105" }), Encoding.UTF8, "application/json")); diff --git a/Src/Dlhis.Middle/Services/Implements/CanteenSettingService.cs b/Src/Dlhis.Middle/Services/Implements/CanteenSettingService.cs index e6a16149..0ee0162f 100644 --- a/Src/Dlhis.Middle/Services/Implements/CanteenSettingService.cs +++ b/Src/Dlhis.Middle/Services/Implements/CanteenSettingService.cs @@ -1,5 +1,6 @@ using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Enums; +using Dlhis.Middle.Entities; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Mapster; @@ -19,7 +20,7 @@ public class CanteenSettingService : ICanteenSettingService public async Task> GetUserSettingAsync(string userNo, string tenantId) { - var settings = await _context.Queryable() + var settings = await _context.Queryable() .Where(x => x.Enable) .Where(x => x.TenantId == tenantId) .Where(x => x.UniqueType == CanteenSettingUnqiueEnumType.Person && x.UniqueValue == userNo || x.UniqueType == CanteenSettingUnqiueEnumType.Tenant) @@ -33,72 +34,4 @@ public class CanteenSettingService : ICanteenSettingService return result; } - - - public async Task GetBusinessSwitchTimeAsync(string tenantId) - { - var setting = await _context.Queryable() - .Where(x => x.Enable) - .Where(x => x.TenantId == tenantId) - .Where(x => x.Item == CanteenSettingItemEnumType.BusinessSwitchTime) - .FirstAsync(); - - try - { - return TimeOnly.Parse(setting.Value); - } - catch (Exception) - { - return null; - } - } - - //*********************************************** help methods ***************************************************// - - - - /// - /// 检验参数 - /// - /// - /// - /// - /// - private static bool IsValidFormat(string value, CanteenSettingItemEnumType? type = null) - { - try - { - //判断0/1 - if (type == CanteenSettingItemEnumType.AllowSendAtMeal || - type == CanteenSettingItemEnumType.AllowRepeatInOneShift || - type == CanteenSettingItemEnumType.AllowNoBalance || - type == CanteenSettingItemEnumType.AllowCrossTenant) - { - var intvaule = int.Parse(value); - if (intvaule == 0 || intvaule == 1) - { - return true; - } - else - { - return false; - } - } - - if (type == CanteenSettingItemEnumType.BusinessSwitchTime) - { - var timeOnly = value.Adapt(); - return timeOnly.Minute == 0 && timeOnly.Second == 0; - } - - //mapster - value.Adapt(); - } - catch (Exception) - { - return false; - } - - return true; - } } \ No newline at end of file diff --git a/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs b/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs index 117ca886..fc49b41d 100644 --- a/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs +++ b/Src/Dlhis.Middle/Services/Implements/HealthcheckService.cs @@ -4,7 +4,7 @@ namespace Dlhis.Middle.Services.Implements; public class HealthCheckService : IHealthCheckService { - private bool _isOffline = true; + private bool _isOffline = false; private readonly string _hostName; private readonly ILogger _logger; private int _successRetry; @@ -26,14 +26,14 @@ public class HealthCheckService : IHealthCheckService var tcpClient = new TcpClient(); try { - _logger.LogInformation("tcp connecting {host} {port}", _hostName, 443); + _logger.LogDebug("tcp connecting {host} {port}", _hostName, 443); await tcpClient.ConnectAsync(_hostName, 443); _retry++; - _logger.LogInformation("retry {retry}", _retry); + _logger.LogDebug("retry {retry}", _retry); if (tcpClient.Connected) { _successRetry++; - _logger.LogInformation("success connected {count}", _successRetry); + _logger.LogDebug("success connected {count}", _successRetry); if (_successRetry == 4) { _isOffline = false; @@ -43,7 +43,7 @@ public class HealthCheckService : IHealthCheckService } else { - _logger.LogInformation("wait next check in {waitTime}", _successRetry * 1000); + _logger.LogDebug("wait next check in {waitTime}", _successRetry * 1000); await Task.Delay(_successRetry * 1000); } } @@ -51,7 +51,7 @@ public class HealthCheckService : IHealthCheckService { _successRetry = 0; _isOffline = true; - _logger.LogInformation("current is {status}", "unavailable"); + _logger.LogDebug("current is {status}", "unavailable"); await Task.Delay(2000); } } diff --git a/Src/Dlhis.Middle/Services/Implements/OrderService.cs b/Src/Dlhis.Middle/Services/Implements/OrderService.cs index 74299d35..8e442886 100644 --- a/Src/Dlhis.Middle/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Middle/Services/Implements/OrderService.cs @@ -42,9 +42,8 @@ public class OrderService : IOrderService if (remoteResult.Code == ApiStateCode.Success) { var d = remoteResult.Data; - var balance = decimal.Parse(d.Balance); await _dbContext.Updateable() - .SetColumns(x => x.Balance == balance) + .SetColumns(x => x.Balance == d.Balance) .Where(x => x.UserCode == d.UserCode) .ExecuteCommandAsync(); } @@ -52,15 +51,12 @@ public class OrderService : IOrderService return remoteResult; } - //尝试匹配userId - _ = long.TryParse(request.UserUniqueNo, out var userId); - //根据档案号 var gainfo = await _dbContext.Queryable() - .Where(x => x.Code == request.UserUniqueNo || x.Id == userId || x.CardNo == request.UserUniqueNo) + .Where(x => x.Code == request.UserUniqueNo || x.CardNo == request.UserUniqueNo) .FirstAsync(); - var message = string.Empty; + var message = "消费成功"; gainfo.ThrowIfNull("无消费权限"); @@ -78,9 +74,9 @@ public class OrderService : IOrderService //获取人员余额 - var data = await _dbContext.Queryable() - .LeftJoin((ga, department) => ga.DepartmentNo == department.No) - .LeftJoin((ga, department, mealUser) => ga.No == mealUser.UserNo) + var data = await _dbContext.Queryable() + .LeftJoin((ga, department) => ga.DepartmentNo == department.No) + .LeftJoin((ga, department, mealUser) => ga.No == mealUser.UserNo) .Where(ga => ga.Id == gainfo.Id) .Select((ga, department, mealUser) => new OrderResultResponse { @@ -88,7 +84,7 @@ public class OrderService : IOrderService UserName = ga.Name, DepartmentNo = ga.DepartmentNo, DepartmentName = department.Name, - CurrentBalance = mealUser.Balance + Balance = mealUser.Balance }) .SingleAsync(); @@ -134,8 +130,8 @@ public class OrderService : IOrderService var shift = shifts.FirstOrDefault(x => new TimePeriod { - Start = x.Start, - End = x.End + Start = TimeOnly.FromDateTime(x.Start), + End = TimeOnly.FromDateTime(x.End) }.IsPresent1(request.CostDateTime)); shift.ThrowIfNull("非就餐时间,无法消费"); @@ -192,7 +188,7 @@ public class OrderService : IOrderService { var gainfoMeal = await _dbContext.Queryable().Where(x => x.UserNo == balanceRecord.UserNo).SingleAsync(); //金额+- - gainfoMeal.Balance += balanceRecord.Amount; + gainfoMeal.Balance -= Math.Abs(balanceRecord.Amount); (gainfoMeal.Balance < 0).ThrowIfTrue("余额不足,无法消费"); @@ -217,7 +213,7 @@ public class OrderService : IOrderService /// /// /// - private async Task GetCostDateAsync(BusinessShiftMealRelationshipEntity shift, DateTime costDateTime) + private async Task GetCostDateAsync(LocalBusinessShiftMealRelationshipEntity shift, DateTime costDateTime) { var switchTime = await GetSettingAsync(shift.TenantId, CanteenSettingItemEnumType.BusinessSwitchTime); diff --git a/Src/Dlhis.Middle/Services/Implements/RemoteOrderService.cs b/Src/Dlhis.Middle/Services/Implements/RemoteOrderService.cs index 55385ecb..8814fbce 100644 --- a/Src/Dlhis.Middle/Services/Implements/RemoteOrderService.cs +++ b/Src/Dlhis.Middle/Services/Implements/RemoteOrderService.cs @@ -53,7 +53,7 @@ public class RemoteOrderService : IRemoteOrderService /// public async Task AbleRemoteCallAsync() { - if (await _dbContext.Queryable().AnyAsync(x => !x.IsSync)) + if (await _dbContext.Queryable().AnyAsync(x => !x.IsSync)) { return false; } diff --git a/Src/Dlhis.Middle/appsettings.json b/Src/Dlhis.Middle/appsettings.json index aa5b406e..f85ae1ef 100644 --- a/Src/Dlhis.Middle/appsettings.json +++ b/Src/Dlhis.Middle/appsettings.json @@ -16,6 +16,17 @@ "Factory": "", "HostName": "face.jinkosolar.com", "AllowedHosts": "*", + "SwaggerOptions": { + "Enable": true, + "Authority": "http://identity.oauth.svc.cluster.local", + "ClientId": "4fb184324eac4180", + "ClientSecret": "8ac8f235152f1524", + "Scopes": { + "openid": "openid", + "profile": "profile", + "yikatong": "yikatong" + } + }, "Serilog": { "MinimumLevel": { "Default": "Information",