fix 优化获取face速度

This commit is contained in:
2024-02-23 17:43:57 +08:00
parent 9b8acdb477
commit 0931d0bf53
15 changed files with 76 additions and 59 deletions

View File

@@ -4,6 +4,8 @@
{
public Guid ShiftCode { get; set; }
public string ShiftType { get; set; }
public string Name { get; set; }
public TimeOnly Start { get; set; }

View File

@@ -40,6 +40,7 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService
.Select((x, bt) => new MealShiftResponse
{
ShiftCode = x.ShiftCode,
ShiftType = bt.Code,
Name = bt.Display,
Start = x.Start,
End = x.End,

View File

@@ -9,7 +9,6 @@ using Kurisu.AspNetCore.Scope;
using Kurisu.AspNetCore.UnifyResultAndValidation;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.DataAccess.Dto;
using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Services;
using Mapster;

View File

@@ -6,10 +6,10 @@ using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Enums;
using Kurisu.AspNetCore.Scope;
using Kurisu.AspNetCore.UnifyResultAndValidation;
using Kurisu.AspNetCore.Utils;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.DataAccess.Dto;
using Kurisu.Core.User.Abstractions;
using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Options;
using Kurisu.SqlSugar.Services;
@@ -26,18 +26,21 @@ public class GainfoService : IGainfoService
private readonly IDbContext _dbContext;
private readonly ICurrentUser _currentUser;
private readonly IDevicePermissionService _devicePermissionService;
private readonly RedisCache _redisCache;
private readonly ILogger<GainfoService> _logger;
public GainfoService(IGainfoStore gainfoStore,
IDbContext dbContext,
ICurrentUser currentUser,
IDevicePermissionService devicePermissionService,
RedisCache redisCache,
ILogger<GainfoService> logger)
{
_gainfoStore = gainfoStore;
_dbContext = dbContext;
_currentUser = currentUser;
_devicePermissionService = devicePermissionService;
_redisCache = redisCache;
_logger = logger;
}
@@ -176,6 +179,12 @@ public class GainfoService : IGainfoService
var password = timeLimitedDataProtector.Unprotect(token);
var userCode = password.Split(':')[1];
var faceCache = await _redisCache.HashGetAsync("faces", userCode);
if (faceCache.HasValue)
{
return new FileContentResult(Convert.FromBase64String(faceCache), "image/png");
}
var configuration = sp.GetService<IConfiguration>();
var faceConnectionString = configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value;
if (faceConnectionString.IsEmpty())
@@ -195,6 +204,8 @@ public class GainfoService : IGainfoService
return new NotFoundResult();
}
var limit = configuration.GetSection("FaceUrlOptions:Limit").Get<int>();
await _redisCache.HashSetAsync("faces", userCode, face.Face);
return new FileContentResult(Convert.FromBase64String(face.Face), "image/png");
}
catch (Exception ex)
@@ -227,6 +238,8 @@ public class GainfoService : IGainfoService
var face = await dbContext.Queryable<GainfoFaceEntity>().Where(x => x.UserCode == gainfo.Code).SingleAsync();
var taskType = face == null ? DeviceTaskEnumType.Add : DeviceTaskEnumType.Update;
await _redisCache.HashSetAsync("faces", gainfo.Code, request.Face);
if (face == null)
{
face = new GainfoFaceEntity
@@ -274,6 +287,8 @@ public class GainfoService : IGainfoService
var face = await dbContext.Queryable<GainfoFaceEntity>().Where(x => x.UserCode == gainfo.Code).SingleAsync();
var taskType = face == null ? DeviceTaskEnumType.Add : DeviceTaskEnumType.Update;
await _redisCache.HashSetAsync("faces", gainfo.Code, request.Face);
if (face == null)
{
face = new GainfoFaceEntity
@@ -302,8 +317,6 @@ public class GainfoService : IGainfoService
}
}
public async Task<string> GetFaceByUserCodeAsync(string userCode)
{
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == userCode).SingleAsync();

View File

@@ -0,0 +1,19 @@
using Kurisu.AspNetCore.Startup;
using Kurisu.AspNetCore.Utils;
using Microsoft.AspNetCore.DataProtection;
using StackExchange.Redis;
namespace Dlhis.Basic.Packs;
public class DataProtectionJobPack : BaseAppPack
{
public override bool IsBeforeUseRouting { get; }
public override void ConfigureServices(IServiceCollection services)
{
var redisConnection = ConnectionMultiplexer.Connect(Configuration.GetSection($"{nameof(RedisOptions)}:{nameof(RedisOptions.ConnectionString)}").Value);
services.AddDataProtection()
.SetApplicationName("basic")
.PersistKeysToStackExchangeRedis(redisConnection, "DataProtection-Keys");
}
}

View File

@@ -1,8 +1,7 @@
using Kurisu.AspNetCore.Startup;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Startup;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.IdentityModel.Logging;
using StackExchange.Redis;
class Program
{
@@ -22,11 +21,6 @@ public class Startup : DefaultStartup
public override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
//todo
var redis = ConnectionMultiplexer.Connect($"192.168.199.30:30115,defaultDatabase:1,password=dlhis123");
services.AddDataProtection()
.SetApplicationName("basic")
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
services.AddRedis();
}
}

View File

@@ -34,6 +34,9 @@
"yikatong": "yikatong"
}
},
"RedisOptions": {
"ConnectionString": "192.168.199.30:30115,defaultDatabase:1,password=dlhis123"
},
"IdentityServerOptions": {
"Authority": "http://identity.oauth.svc.cluster.local",
"RequireHttpsMetadata": false,

View File

@@ -74,6 +74,7 @@ public class BalancesController : ControllerBase
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("obsoluteOutRecord")]
[Transactional]
public async Task ObsoluteAsync(BalanceRecordObsoluteRequest request)
{
await _balanceService.ObsoluteAsync(request);

View File

@@ -39,6 +39,7 @@ public class OrdersController : ControllerBase
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
[IgnoreTenant]
public async Task<OrderResultResponse> AddAsync(OrderAddRequest request)
{
return await _orderService.AddAsync(request);

View File

@@ -516,7 +516,6 @@ public class BalanceService : IBalanceService
return page;
}
[Transactional]
public async Task ObsoluteAsync(BalanceRecordObsoluteRequest request)
{
var balanceRecord = await _dbContext.Queryable<BalanceRecordEntity>().Where(x => x.Id == request.Id).SingleAsync();
@@ -731,10 +730,8 @@ public class BalanceService : IBalanceService
throw new UserFriendlyException("操作失败,请重试");
}
[IgnoreTenant]
public async Task<Dictionary<string, string>> GetShiftCode()
{
_dbContext.Client.QueryFilter.ClearAndBackup<ITenantId>();
try
{

View File

@@ -11,7 +11,6 @@ using Kurisu.AspNetCore.Utils;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.CustomClass;
using Kurisu.Core.DataAccess.Dto;
using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Services;
using Mapster;
@@ -54,36 +53,16 @@ public class OrderService : IOrderService
uniqueNos.Contains(deviceUniqueNo).ThrowIfFalse("无消费权限");
}
[IgnoreTenant]
public async Task<OrderResultResponse> AddAsync(OrderAddRequest request)
{
var card = string.Empty;
long userId = 0;
if (request.Source == BalanceRecordSourceEnumType.Card)
{
card = request.UserUniqueNo;
}
else
{
_ = long.TryParse(request.UserUniqueNo, out userId);
}
//尝试匹配userId
_ = long.TryParse(request.UserUniqueNo, out var userId);
//根据档案号
var gainfo = await _dbContext.Queryable<GainfoEntity>()
.Where(x => x.No == request.UserUniqueNo || x.Code == request.UserUniqueNo || x.Id == userId || x.CardNo == card)
.Where(x => x.No == request.UserUniqueNo || x.Code == request.UserUniqueNo || x.Id == userId || x.CardNo == request.UserUniqueNo)
.FirstAsync();
// ....
{
////尝试匹配userId
//_ = long.TryParse(request.UserUniqueNo, out var userId);
////根据档案号
//var gainfo = await _dbContext.Queryable<GainfoEntity>()
// .Where(x => x.No == request.UserUniqueNo || x.Code == request.UserUniqueNo || x.Id == userId)
// .FirstAsync();
}
gainfo.ThrowIfNull($"用户{request.UserUniqueNo}不存在,无法操作");
var canteenUserExists = await _dbContext.Queryable<CanteenUserEntity>()

View File

@@ -7,14 +7,6 @@
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5008"
},
"Docker": {
"commandName": "Docker",
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"environmentVariables": {
"ASPNETCORE_URLS": "http://+:80"
},
"publishAllPorts": true
}
},
"$schema": "https://json.schemastore.org/launchsettings.json"

View File

@@ -0,0 +1,19 @@
using Kurisu.AspNetCore.Startup;
using Kurisu.AspNetCore.Utils;
using Microsoft.AspNetCore.DataProtection;
using StackExchange.Redis;
namespace Dlhis.ScheduledTask.Packs;
public class DataProtectionJobPack : BaseAppPack
{
public override bool IsBeforeUseRouting { get; }
public override void ConfigureServices(IServiceCollection services)
{
var redisConnection = ConnectionMultiplexer.Connect(Configuration.GetSection($"{nameof(RedisOptions)}:{nameof(RedisOptions.ConnectionString)}").Value);
services.AddDataProtection()
.SetApplicationName("scheduled")
.PersistKeysToStackExchangeRedis(redisConnection, "DataProtection-Keys");
}
}

View File

@@ -1,10 +1,8 @@
using System.Net.NetworkInformation;
using Kurisu.AspNetCore.Startup;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Startup;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Options;
using StackExchange.Redis;
using static StackExchange.Redis.Role;
class Program
{
@@ -23,16 +21,12 @@ public class Startup : DefaultStartup
public override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
services.AddSingleton<IConnectionMultiplexer>(sp =>
{
return ConnectionMultiplexer.Connect("192.168.199.30:30115,defaultDatabase:1,password=dlhis123");
});
services.AddRedis();
//todo
var redis = ConnectionMultiplexer.Connect($"192.168.199.30:30115,defaultDatabase:1,password=dlhis123");
services.AddDataProtection()
.SetApplicationName("basic")
.SetApplicationName("scheduled")
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
}

View File

@@ -54,6 +54,9 @@
"AttendanceUploadInterval": "30",
"BeginSyncDate": "2020-5-1"
},
"RedisOptions": {
"ConnectionString": "192.168.199.30:30115,defaultDatabase:1,password=dlhis123"
},
"AllowedHosts": "*",
"Serilog": {
"MinimumLevel": {