fix 升级到0.5.2,优化任务生成

This commit is contained in:
2024-01-22 09:45:39 +08:00
parent ce939b0a29
commit e749a6cc14
13 changed files with 124 additions and 116 deletions

View File

@@ -1,7 +1,12 @@
namespace Dlhis.Basic.Device.Request
using System.ComponentModel.DataAnnotations;
namespace Dlhis.Basic.Device.Request;
public class DeviceHeartbeatRequest
{
public class DeviceHeartbeatRequest
{
public string UniqueNo { get; set; }
}
/// <summary>
/// 设备唯一号
/// </summary>
[Required(ErrorMessage = "设备唯一号")]
public string UniqueNo { get; set; }
}

View File

@@ -82,10 +82,11 @@ public class DeviceConnectService : IDeviceConnectService
//todo 通知设备重新获取
}
[IgnoreTenant]
public async Task HeartbeatAsync(DeviceHeartbeatRequest request)
{
var registry = await _dbContext.Queryable<DeviceRegistryEntity>().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync();
registry.ThrowIfNull($"{request.UniqueNo}的设备注册信息不存在,心跳无效");
registry.ThrowIfNull($"注册信息不存在,无法发起心跳");
registry.LastHeartbeatTime = DateTime.Now;
await _dbContext.UpdateAsync(registry);

View File

@@ -17,7 +17,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="6.0.26" />
</ItemGroup>

View File

@@ -94,7 +94,7 @@ public class GainfosController : ControllerBase
/// 上传人脸照片
/// </summary>
/// <returns></returns>
[HttpPost("face")]
[HttpPost("face")]
public async Task UploadFaceAsync(GainfoUploadFaceRequest request)
{
await _gainfoService.UploadFaceAsync(request);

View File

@@ -11,6 +11,7 @@ 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;
using Mapster;
using Microsoft.AspNetCore.DataProtection;
@@ -159,44 +160,46 @@ public class GainfoService : IGainfoService
return gainfo;
}
//-------------------------------------------help methods ------------------------------------------------
/// <summary>
/// 递归获取部门No
/// </summary>
/// <param name="departmentNos"></param>
/// <returns></returns>
private async Task<List<string>> GetRecursionDepartmentNosAsync(List<string> departmentNos)
public async Task<IActionResult> GetFaceAsync(string token)
{
if (departmentNos == null || departmentNos.Count == 0)
return await Scoped.Request.Value.CreateAsync<IActionResult>(async (sp) =>
{
return new List<string>();
}
var timeLimitedDataProtector = sp.GetService<IDataProtectionProvider>()
.CreateProtector("down:face")
.ToTimeLimitedDataProtector();
var departments = await _dbContext.Queryable<DepartmentEntity>().ToListAsync();
var currentNos = departments.Where(x => departmentNos.Contains(x.No)).ToList();
foreach (var item in currentNos)
{
RecursionGetNext(item.No, departments, departmentNos);
}
return departmentNos.Distinct().ToList();
void RecursionGetNext(string currentCode, List<DepartmentEntity> departments, List<string> result)
{
var next = departments.Where(x => x.PNo == currentCode).ToList();
foreach (var item in next)
try
{
result.Add(item.No);
}
var password = timeLimitedDataProtector.Unprotect(token);
var userCode = password.Split(':')[1];
foreach (var item in next)
{
RecursionGetNext(item.No, departments, result);
var configuration = sp.GetService<IConfiguration>();
var faceConnectionString = configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value;
if (faceConnectionString.IsEmpty())
{
_logger.LogWarning("暂不支持获取人脸");
return new NotFoundResult();
}
//todo 切换连接字符串
var dbContext = sp.GetService<IDbContext>();
dbContext.Client.CurrentConnectionConfig.ConnectionString = faceConnectionString;
var face = await dbContext.Queryable<GainfoFaceEntity>().Where(x => x.UserCode == userCode).SingleAsync();
if (face == null)
{
_logger.LogWarning("学工号:{userCode}不存在人脸照片", userCode);
return new NotFoundResult();
}
return new FileContentResult(Convert.FromBase64String(face.Face), "image/png");
}
}
catch (Exception ex)
{
_logger.LogError(ex, "获取人脸失败:" + ex.Message);
return new NotFoundResult();
}
});
}
public async Task UploadFaceAsync(GainfoUploadFaceRequest request)
@@ -248,45 +251,7 @@ public class GainfoService : IGainfoService
});
}
public async Task<IActionResult> GetFaceAsync(string token)
{
return await Scoped.Request.Value.CreateAsync<IActionResult>(async (sp) =>
{
var timeLimitedDataProtector = sp.GetService<IDataProtectionProvider>()
.CreateProtector("down:face")
.ToTimeLimitedDataProtector();
try
{
var password = timeLimitedDataProtector.Unprotect(token);
var userCode = password.Split(':')[1];
var configuration = sp.GetService<IConfiguration>();
var faceConnectionString = configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value;
if (faceConnectionString.IsEmpty())
{
throw new UserFriendlyException("暂不支持获取人脸");
}
var dbContext = sp.GetService<IDbContext>();
//todo 切换连接字符串
dbContext.Client.CurrentConnectionConfig.ConnectionString = faceConnectionString;
var face = await dbContext.Queryable<GainfoFaceEntity>().Where(x => x.UserCode == userCode).SingleAsync();
if (face == null)
{
return new NotFoundResult();
}
return new FileContentResult(Convert.FromBase64String(face.Face), "image/png");
}
catch (Exception)
{
return new NotFoundResult();
}
});
}
public async Task<string> GetFaceByUserCodeAsync(string userCode)
{
@@ -297,7 +262,7 @@ public class GainfoService : IGainfoService
{
var configuration = sp.GetService<IConfiguration>();
var faceConnectionString = configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value;
var faceConnectionString = configuration.GetSection($"{nameof(SqlSugarOptions)}:FaceConnectionString").Value;
if (faceConnectionString.IsEmpty())
{
throw new UserFriendlyException("暂不支持获取人脸");
@@ -327,6 +292,7 @@ public class GainfoService : IGainfoService
return faceUrl + token;
});
}
public async Task<Dictionary<string, string>> GetFaceByUserCodesAsync(GetFaceByUserCodesRequest request)
{
var faceDictionary = new Dictionary<string, string>();
@@ -338,4 +304,44 @@ public class GainfoService : IGainfoService
}
return faceDictionary;
}
//-------------------------------------------help methods ------------------------------------------------
/// <summary>
/// 递归获取部门No
/// </summary>
/// <param name="departmentNos"></param>
/// <returns></returns>
private async Task<List<string>> GetRecursionDepartmentNosAsync(List<string> departmentNos)
{
if (departmentNos == null || departmentNos.Count == 0)
{
return new List<string>();
}
var departments = await _dbContext.Queryable<DepartmentEntity>().ToListAsync();
var currentNos = departments.Where(x => departmentNos.Contains(x.No)).ToList();
foreach (var item in currentNos)
{
RecursionGetNext(item.No, departments, departmentNos);
}
return departmentNos.Distinct().ToList();
void RecursionGetNext(string currentCode, List<DepartmentEntity> departments, List<string> result)
{
var next = departments.Where(x => x.PNo == currentCode).ToList();
foreach (var item in next)
{
result.Add(item.No);
}
foreach (var item in next)
{
RecursionGetNext(item.No, departments, result);
}
}
}
}

View File

@@ -7,7 +7,7 @@
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5002"
"applicationUrl": "http://*:5002"
}
},
"$schema": "https://json.schemastore.org/launchsettings.json"

View File

@@ -35,7 +35,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
</ItemGroup>
</Project>

View File

@@ -25,7 +25,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
</ItemGroup>
</Project>

View File

@@ -20,9 +20,8 @@
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.7" />
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
<PackageReference Include="Hangfire.MySqlStorage" Version="2.0.3" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="6.0.26" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
</ItemGroup>
<ItemGroup>

View File

@@ -5,7 +5,7 @@
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5010"
"applicationUrl": "http://*:5010"
}
}
}

View File

@@ -120,8 +120,8 @@ public class AssignmentService : IAssignmentService
{
var b = x.Key.Brand;
var d = x.Key.DeviceUniqueNo;
var dc = x.Key.DeviceConnectionInfo??"{}";
var func = x.Key.FuncStr??"[]";
var dc = x.Key.DeviceConnectionInfo ?? "{}";
var func = x.Key.FuncStr ?? "[]";
var jobj = new JObject
{
@@ -262,37 +262,34 @@ public class AssignmentService : IAssignmentService
public async Task UpdateDeviceTaskStatusAsync(List<UpdateDeviceTaskStatusRequest> requests)
{
var taskIds = requests.Select(x => x.TaskId).ToList();
var deviceTasks = await _dbContext.Queryable<DeviceTaskEntity>()
.Where(x => taskIds.Contains(x.Id))
.Where(x => x.Status == DeviceTaskStatusEnumType.Process)
.ToListAsync();
taskIds = deviceTasks.Select(x => x.Id).ToList();
requests = requests.Where(x => taskIds.Contains(x.TaskId)).ToList();
deviceTasks.ForEach(x =>
{
});
var now = DateTime.Now;
var tasks = new List<DeviceTaskEntity>(requests.Count);
foreach (var request in requests)
{
//for (int i = 0; i < 5; i++)
//{
var deviceTask = deviceTasks.First(x => x.Id == request.TaskId);
// if (effect == 0)
// {
// continue;
// }
// return;
//}
//throw new UserFriendlyException("操作失败,请重试");
var deviceTask = await _dbContext.Queryable<DeviceTaskEntity>().Where(x => x.Id == request.TaskId).SingleAsync();
deviceTask.ThrowIfNull("设备任务不存在");
(deviceTask.Status != DeviceTaskStatusEnumType.Process)
.ThrowIfTrue($"任务状态[{deviceTask.Status.GetDescription()}]有误");
var status = request.IsSuccess ? DeviceTaskStatusEnumType.Success : DeviceTaskStatusEnumType.Error;
var effect = await _dbContext.Updateable<DeviceTaskEntity>()
.SetColumns(x => x.Status == status)
.SetColumns(x => x.ResultMessage == request.ResultMessage)
.SetColumns(x => x.Version == x.Version + 1)
.SetColumns(x => x.ModifiedTime == DateTime.Now)
.Where(x => x.Id == request.TaskId && x.Version == deviceTask.Version)
.ExecuteCommandAsync();
deviceTask.Status = request.IsSuccess ? DeviceTaskStatusEnumType.Success : DeviceTaskStatusEnumType.Error;
deviceTask.ResultMessage = request.ResultMessage;
deviceTask.ModifiedTime = now;
tasks.Add(deviceTask);
}
await _dbContext.UpdateAsync(tasks);
}

View File

@@ -17,7 +17,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
</ItemGroup>
<ItemGroup>

View File

@@ -17,7 +17,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
</ItemGroup>
<ItemGroup>