fix 升级到0.5.2,优化任务生成
This commit is contained in:
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"dotnetRunMessages": true,
|
||||
"applicationUrl": "http://localhost:5002"
|
||||
"applicationUrl": "http://*:5002"
|
||||
}
|
||||
},
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json"
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "http://localhost:5010"
|
||||
"applicationUrl": "http://*:5010"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.1" />
|
||||
<PackageReference Include="Kurisu.AspNetCore" Version="0.5.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user