diff --git a/Dlis.Jinko.Yikatong.sln b/Dlhis.Jinko.Face.sln
similarity index 91%
rename from Dlis.Jinko.Yikatong.sln
rename to Dlhis.Jinko.Face.sln
index 254bd420..0f893f5a 100644
--- a/Dlis.Jinko.Yikatong.sln
+++ b/Dlhis.Jinko.Face.sln
@@ -29,6 +29,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.Canteen", "Src\Dlhis.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.Sys.Api", "Src\Dlhis.Sys.Api\Dlhis.Sys.Api.csproj", "{85A345C7-913E-4C1B-BE1C-600DE408A02F}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dlhis.Basic.Api", "Src\Dlhis.Basic.Api\Dlhis.Basic.Api.csproj", "{1F337648-8A22-4601-A842-0F634FBA2825}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -71,6 +73,10 @@ Global
{85A345C7-913E-4C1B-BE1C-600DE408A02F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{85A345C7-913E-4C1B-BE1C-600DE408A02F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85A345C7-913E-4C1B-BE1C-600DE408A02F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1F337648-8A22-4601-A842-0F634FBA2825}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1F337648-8A22-4601-A842-0F634FBA2825}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1F337648-8A22-4601-A842-0F634FBA2825}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1F337648-8A22-4601-A842-0F634FBA2825}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -84,6 +90,7 @@ Global
{925048C9-5940-4B51-8480-4DC908C754A1} = {57074FD8-1A2F-40C7-8476-001778A3F65D}
{8317C526-3523-4195-9B19-2F17CFD71927} = {3D8A98C1-83C9-4375-AEAB-4F72AFAF365B}
{85A345C7-913E-4C1B-BE1C-600DE408A02F} = {57074FD8-1A2F-40C7-8476-001778A3F65D}
+ {1F337648-8A22-4601-A842-0F634FBA2825} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7439494A-E2FD-4FEA-8ABF-74AE57A4A5A0}
diff --git a/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj b/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj
new file mode 100644
index 00000000..e41324f5
--- /dev/null
+++ b/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs b/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs
new file mode 100644
index 00000000..feeb452e
--- /dev/null
+++ b/Src/Dlhis.Basic.Api/IDevicePermissionApi.cs
@@ -0,0 +1,12 @@
+using Kurisu.Core.Result;
+using Kurisu.RemoteCall.Attributes;
+
+namespace Dlhis.Basic.Api;
+
+[EnableRemoteClient(Name = "basic-service", BaseUrl = "${InternalRequest:BasicRequestUrl}")]
+public interface IDevicePermissionApi
+{
+ [Auth]
+ [Get("/api/devicepermissions/canteen/uniqueNos")]
+ Task>> GetCanteenDeviceUniqueNosByUserNoAsync(string userNo);
+}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs b/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs
index 9649c414..887dfe09 100644
--- a/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs
+++ b/Src/Dlhis.Basic/BusinessPlace/Controllers/BusinessPlacesController.cs
@@ -2,6 +2,7 @@
using Dlhis.Basic.BusinessPlace.Response;
using Dlhis.Basic.BusinessPlace.Services;
using Dlhis.Basic.BusinessShift.Services;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.Core.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -58,12 +59,24 @@ public class BusinessPlacesController : ControllerBase
await _businessPlaceService.SaveAsync(request);
}
+ ///
+ /// 营业点保存餐次
+ ///
+ ///
+ ///
+ [HttpPost("shift/save")]
+ public async Task SaveShiftAsync(BusinessPlaceSaveShiftRequest request)
+ {
+ await _businessPlaceService.SaveShiftAsync(request);
+ }
+
///
/// 根据手工号获取餐别
///
///
///
[HttpPost("shifts")]
+ [IgnoreTenant]
public async Task GetShiftsByPlaceCustomCodeHttpPostAsync(BusinessPlaceGetShiftsRequest request)
{
return await _businessPlaceShiftService.GetShiftsByPlaceCustomCodeAsync(request.CustomCode);
@@ -75,8 +88,20 @@ public class BusinessPlacesController : ControllerBase
///
///
[HttpGet("shifts")]
+ [IgnoreTenant]
public async Task GetShiftsByPlaceCustomCodeHttpGetAsync([FromQuery] BusinessPlaceGetShiftsRequest request)
{
return await _businessPlaceShiftService.GetShiftsByPlaceCustomCodeAsync(request.CustomCode);
}
+
+ ///
+ /// 根据营业点获取下面的设备
+ ///
+ ///
+ ///
+ [HttpGet("devicenos")]
+ public async Task> GetDevicesByCode([FromQuery]BusinessPlaceGetByCodeRequest request)
+ {
+ return await _businessPlaceShiftService.GetDevicesByCode(request);
+ }
}
diff --git a/Src/Dlhis.Basic/BusinessPlace/Request/BusinessPlaceGetByCodeRequest.cs b/Src/Dlhis.Basic/BusinessPlace/Request/BusinessPlaceGetByCodeRequest.cs
new file mode 100644
index 00000000..5177dd0c
--- /dev/null
+++ b/Src/Dlhis.Basic/BusinessPlace/Request/BusinessPlaceGetByCodeRequest.cs
@@ -0,0 +1,14 @@
+using Kurisu.Core.DataAccess.Dto;
+using System.ComponentModel.DataAnnotations;
+
+namespace Dlhis.Basic.BusinessPlace.Request
+{
+ public class BusinessPlaceGetByCodeRequest : PageDto
+ {
+ ///
+ /// 营业点号
+ ///
+ [Required(ErrorMessage = "营业点号不能为空")]
+ public string Code { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/BusinessPlace/Request/BusinessPlaceSaveShiftRequest.cs b/Src/Dlhis.Basic/BusinessPlace/Request/BusinessPlaceSaveShiftRequest.cs
new file mode 100644
index 00000000..23fc1140
--- /dev/null
+++ b/Src/Dlhis.Basic/BusinessPlace/Request/BusinessPlaceSaveShiftRequest.cs
@@ -0,0 +1,14 @@
+namespace Dlhis.Basic.BusinessPlace.Request;
+
+public class BusinessPlaceSaveShiftRequest
+{
+ ///
+ /// 营业点id
+ ///
+ public long Id { get; set; }
+
+ ///
+ /// 餐次code
+ ///
+ public Guid ShiftCode { get; set; }
+}
diff --git a/Src/Dlhis.Basic/BusinessPlace/Response/BusinessPlaceResponse.cs b/Src/Dlhis.Basic/BusinessPlace/Response/BusinessPlaceResponse.cs
index 9793da56..c954462a 100644
--- a/Src/Dlhis.Basic/BusinessPlace/Response/BusinessPlaceResponse.cs
+++ b/Src/Dlhis.Basic/BusinessPlace/Response/BusinessPlaceResponse.cs
@@ -35,9 +35,21 @@ public class BusinessPlaceResponse
public CanteenBusinessPlaceSourceEnumType Source { get; set; }
public string SourceDesc => Source.GetDescription();
+
///
/// 分类,超市/餐厅/食堂
///
public CanteenBusinessPlaceCatalogEnumType Catalog { get; set; }
public string CatalogDesc => Catalog.GetDescription();
+
+
+ ///
+ /// 餐次code
+ ///
+ public Guid? ShiftCode { get; set; }
+
+ ///
+ /// 餐次名称
+ ///
+ public string ShiftName { get; set; }
}
diff --git a/Src/Dlhis.Basic/BusinessPlace/Response/DeviceCodeNameDetail.cs b/Src/Dlhis.Basic/BusinessPlace/Response/DeviceCodeNameDetail.cs
new file mode 100644
index 00000000..0841c315
--- /dev/null
+++ b/Src/Dlhis.Basic/BusinessPlace/Response/DeviceCodeNameDetail.cs
@@ -0,0 +1,8 @@
+namespace Dlhis.Basic.BusinessPlace.Response
+{
+ public class DeviceCodeNameDetail
+ {
+ public string UniqueNo { get; set; }
+ public string UniqueName { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/BusinessPlace/Services/IBusinessPlaceService.cs b/Src/Dlhis.Basic/BusinessPlace/Services/IBusinessPlaceService.cs
index e012ce37..2ada296c 100644
--- a/Src/Dlhis.Basic/BusinessPlace/Services/IBusinessPlaceService.cs
+++ b/Src/Dlhis.Basic/BusinessPlace/Services/IBusinessPlaceService.cs
@@ -1,12 +1,16 @@
using Dlhis.Basic.BusinessPlace.Request;
using Dlhis.Basic.BusinessPlace.Response;
using Kurisu.Core.DataAccess.Dto;
-using Kurisu.SqlSugar.Attributes;
namespace Dlhis.Basic.BusinessPlace.Services;
public interface IBusinessPlaceService : IScopeDependency
{
+ ///
+ /// 营业点分页
+ ///
+ ///
+ ///
Task> GetPageAsync(BusinessPlacePageRequest request);
///
@@ -15,6 +19,17 @@ public interface IBusinessPlaceService : IScopeDependency
///
Task> GetOpenedListAsync();
-
+ ///
+ /// 保存营业点
+ ///
+ ///
+ ///
Task SaveAsync(BusinessPlaceSaveRequest request);
+
+ ///
+ /// 营业点保存餐次
+ ///
+ ///
+ ///
+ Task SaveShiftAsync(BusinessPlaceSaveShiftRequest request);
}
diff --git a/Src/Dlhis.Basic/BusinessPlace/Services/Implements/BusinessPlaceService.cs b/Src/Dlhis.Basic/BusinessPlace/Services/Implements/BusinessPlaceService.cs
index 6e60570a..a49ecf44 100644
--- a/Src/Dlhis.Basic/BusinessPlace/Services/Implements/BusinessPlaceService.cs
+++ b/Src/Dlhis.Basic/BusinessPlace/Services/Implements/BusinessPlaceService.cs
@@ -22,46 +22,83 @@ public class BusinessPlaceService : IBusinessPlaceService
public async Task> GetPageAsync(BusinessPlacePageRequest request)
{
- var page = await _dbContext.Queryable()
- .WhereIF(request.Search.IsPresent(), x => x.CustomCode.Contains(request.Search))
+ var page = await _dbContext.Queryable()
+ .LeftJoin((x, ps) => x.Code == ps.PlaceCode)
+ .LeftJoin((x, ps, s) => s.Code == ps.ShiftCode)
+ .WhereIF(request.Search.IsPresent(), x => x.CustomCode.Contains(request.Search)
+ || x.Code.ToString().Contains(request.Search) || x.Name.Contains(request.Search))
.WhereIF(request.Catalog.HasValue, x => x.Catalog == request.Catalog)
.WhereIF(request.Status.HasValue, x => x.Status == request.Status)
.WhereIF(request.Source.HasValue, x => x.Source == request.Source)
- .Select()
+ .Select((x, ps, s) => new BusinessPlaceResponse
+ {
+ Id = x.Id,
+ Code = x.Code,
+ Status = x.Status,
+ Name = x.Name,
+ Catalog = x.Catalog,
+ CustomCode = x.CustomCode,
+ Source = x.Source,
+
+ ShiftCode = s.Code,
+ ShiftName = s.Name
+ })
.ToPageListAsync(request);
-
+
return page;
}
public async Task> GetOpenedListAsync()
{
- return await _dbContext.Queryable()
+ return await _dbContext.Queryable()
.Where(x => x.Status == CanteenBusinessPlaceStatusEnumType.Opened)
- .Select()
- .ToListAsync();
+ .Select()
+ .ToListAsync();
}
-
+
public async Task SaveAsync(BusinessPlaceSaveRequest request)
{
await CheckExistsCustomCodeAsync(request);
if (!request.Id.HasValue)
{
- var entity = request.Adapt();
+ var entity = request.Adapt();
entity.Code = Guid.NewGuid();
await _dbContext.InsertAsync(entity);
}
else
{
- var entity = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id);
+ var entity = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id);
request.Adapt(entity);
await _dbContext.UpdateAsync(entity);
}
}
+
+ public async Task SaveShiftAsync(BusinessPlaceSaveShiftRequest request)
+ {
+ var place = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
+ place.ThrowIfNull("营业点不存在");
+
+ var relationship = await _dbContext.Queryable().Where(x => x.PlaceCode == place.Code).FirstAsync();
+ if (relationship == null)
+ {
+ await _dbContext.InsertAsync(new BusinessPlaceShiftRelationshipEntity
+ {
+ PlaceCode = place.Code,
+ ShiftCode = request.ShiftCode,
+ });
+ }
+ else
+ {
+ relationship.ShiftCode = request.ShiftCode;
+ await _dbContext.UpdateAsync(relationship);
+ }
+ }
+
//*********************************************** help methods ***************************************************//
///
@@ -71,7 +108,7 @@ public class BusinessPlaceService : IBusinessPlaceService
///
private async Task CheckExistsCustomCodeAsync(BusinessPlaceSaveRequest request)
{
- var existsSameCustomCode = await _dbContext.Queryable()
+ var existsSameCustomCode = await _dbContext.Queryable()
.Where(x => x.CustomCode == request.CustomCode)
.WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.AnyAsync();
diff --git a/Src/Dlhis.Basic/BusinessShift/Controllers/BusinessShiftsController.cs b/Src/Dlhis.Basic/BusinessShift/Controllers/BusinessShiftsController.cs
index 154bb984..981c650b 100644
--- a/Src/Dlhis.Basic/BusinessShift/Controllers/BusinessShiftsController.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Controllers/BusinessShiftsController.cs
@@ -1,6 +1,7 @@
using Dlhis.Basic.BusinessShift.Request;
using Dlhis.Basic.BusinessShift.Response;
using Dlhis.Basic.BusinessShift.Services;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.Core.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -33,14 +34,36 @@ public class BusinessShiftsController : ControllerBase
return await _businessPlaceShiftService.GetPageAsync(request);
}
+ ///
+ /// 餐次列表
+ ///
+ ///
+ [HttpGet("list")]
+ public async Task> GetListAsync()
+ {
+ return await _businessPlaceShiftService.GetListAsync();
+ }
+
///
/// 餐次保存
///
///
///
[HttpPost("save")]
- public async Task SaveAsync(BusinessPlaceShiftSaveRequest request)
+ public async Task SaveAsync(BusinessPlaceShiftSaveRequest request)
{
- await _businessPlaceShiftService.SaveAsync(request);
+ return await _businessPlaceShiftService.SaveAsync(request);
+ }
+
+ ///
+ /// 保存餐次段
+ ///
+ ///
+ ///
+ [HttpPost("meal/save")]
+ [Transactional]
+ public async Task SaveMealShiftsAsync(List requests)
+ {
+ await _businessPlaceShiftService.SaveMealShiftsAsync(requests);
}
}
diff --git a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftPageRequest.cs b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftPageRequest.cs
index ed518c13..5ed2e3c2 100644
--- a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftPageRequest.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftPageRequest.cs
@@ -4,5 +4,5 @@ namespace Dlhis.Basic.BusinessShift.Request;
public class BusinessPlaceShiftPageRequest : PageDto
{
- public Guid? BusinessPlaceCode { get; set; }
+
}
diff --git a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs
new file mode 100644
index 00000000..98e63fae
--- /dev/null
+++ b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveMealShiftRequest.cs
@@ -0,0 +1,38 @@
+using System.ComponentModel.DataAnnotations;
+using Kurisu.Core.CustomClass;
+
+namespace Dlhis.Basic.BusinessShift.Request;
+
+public class BusinessPlaceShiftSaveMealShiftRequest : IValidatableObject
+{
+ public long? Id { get; set; }
+
+ ///
+ /// 餐次Code
+ ///
+ public Guid ShiftCode { get; set; }
+
+ ///
+ /// mealshift
+ ///
+ public string ShiftType { get; set; }
+
+ ///
+ /// 序号
+ ///
+ public int Sequence { get; set; } = 100;
+
+ ///
+ /// 时间段
+ ///
+ public TimePeriod TimePeriod { get; set; }
+
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ if (TimePeriod.Start == TimePeriod.End)
+ {
+ yield return new ValidationResult("时间段设置区间有误,开始时段不能等于结束时段.", new[] { nameof(TimePeriod) });
+ }
+ }
+}
diff --git a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveRequest.cs b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveRequest.cs
index 8353c298..82f1c25c 100644
--- a/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveRequest.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Request/BusinessPlaceShiftSaveRequest.cs
@@ -1,39 +1,20 @@
using System.ComponentModel.DataAnnotations;
-using Kurisu.Core.CustomClass;
namespace Dlhis.Basic.BusinessShift.Request;
-public class BusinessPlaceShiftSaveRequest : IValidatableObject
+public class BusinessPlaceShiftSaveRequest
{
public long? Id { get; set; }
- ///
- /// 营业点代号
- ///
- [Required(ErrorMessage = "营业点不能为空")]
- public Guid BusinessPlaceCode { get; set; }
-
///
/// 自定义代号 mealshift
///
- [Required(ErrorMessage = "餐次编号不能为空")]
+ [Required(ErrorMessage = "餐次手工号不能为空")]
public string CustomCode { get; set; }
///
- /// 序号
+ /// 餐次名称
///
- public int Sequence { get; set; } = 100;
-
- ///
- /// 时间段
- ///
- public TimePeriod TimePeriod { get; set; }
-
- public IEnumerable Validate(ValidationContext validationContext)
- {
- if (TimePeriod.Start == TimePeriod.End)
- {
- yield return new ValidationResult("时间段设置区间有误,开始时段不能等于结束时段.", new[] { nameof(TimePeriod) });
- }
- }
+ [Required(ErrorMessage = "餐次名称")]
+ public string Name { get; set; }
}
diff --git a/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftResponse.cs b/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftResponse.cs
index 5c6848a6..82a3aab3 100644
--- a/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftResponse.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftResponse.cs
@@ -4,21 +4,6 @@ public class BusinessPlaceShiftResponse
{
public long Id { get; set; }
- ///
- /// 营业点代号
- ///
- public Guid BusinessPlaceCode { get; set; }
-
- ///
- /// 营业点手工号
- ///
- public string BusinessPlaceCustomCode { get; set; }
-
- ///
- /// 营业点
- ///
- public string BusinessPlace { get; set; }
-
///
/// 代号
///
@@ -35,12 +20,7 @@ public class BusinessPlaceShiftResponse
public string Name { get; set; }
///
- /// 经营开始时间
+ /// 就餐时间段
///
- public TimeOnly Start { get; set; }
-
- ///
- /// 经营结束时间
- ///
- public TimeOnly End { get; set; }
+ public List MealShifts { get; set; }
}
diff --git a/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftTinyResponse.cs b/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftTinyResponse.cs
index cf2576ab..908425b3 100644
--- a/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftTinyResponse.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Response/BusinessPlaceShiftTinyResponse.cs
@@ -3,7 +3,7 @@
public class BusinessPlaceShiftTinyResponse
{
///
- /// 自定义代号
+ /// 无用字段,暂时不删除 //todo
///
public string CustomCode { get; set; }
diff --git a/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs b/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs
new file mode 100644
index 00000000..bf99cb6a
--- /dev/null
+++ b/Src/Dlhis.Basic/BusinessShift/Response/MealShiftResponse.cs
@@ -0,0 +1,17 @@
+namespace Dlhis.Basic.BusinessShift.Response
+{
+ public class MealShiftResponse
+ {
+ public long Id { get; set; }
+
+ public Guid ShiftCode { get; set; }
+
+ public string ShiftType { get; set; }
+
+ public string Name { get; set; }
+
+ public TimeOnly Start { get; set; }
+
+ public TimeOnly End { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/BusinessShift/Services/IBusinessPlaceShiftService.cs b/Src/Dlhis.Basic/BusinessShift/Services/IBusinessPlaceShiftService.cs
index 3993951a..ba4e1114 100644
--- a/Src/Dlhis.Basic/BusinessShift/Services/IBusinessPlaceShiftService.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Services/IBusinessPlaceShiftService.cs
@@ -1,4 +1,5 @@
-using Dlhis.Basic.BusinessPlace.Response;
+using Dlhis.Basic.BusinessPlace.Request;
+using Dlhis.Basic.BusinessPlace.Response;
using Dlhis.Basic.BusinessShift.Request;
using Dlhis.Basic.BusinessShift.Response;
using Kurisu.Core.DataAccess.Dto;
@@ -9,7 +10,13 @@ public interface IBusinessPlaceShiftService : IScopeDependency
{
Task> GetPageAsync(BusinessPlaceShiftPageRequest request);
- Task SaveAsync(BusinessPlaceShiftSaveRequest request);
+ Task> GetListAsync();
+
+ Task SaveAsync(BusinessPlaceShiftSaveRequest request);
+
+ Task SaveMealShiftsAsync(List requests);
Task GetShiftsByPlaceCustomCodeAsync(string placeCustomCode);
+
+ Task> GetDevicesByCode(BusinessPlaceGetByCodeRequest request);
}
diff --git a/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs b/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs
index aa263e38..6df8324d 100644
--- a/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs
+++ b/Src/Dlhis.Basic/BusinessShift/Services/Implements/BusinessPlaceShiftService.cs
@@ -1,16 +1,18 @@
-using Dlhis.Basic.BusinessPlace.Response;
+using Dlhis.Basic.BusinessPlace.Request;
+using Dlhis.Basic.BusinessPlace.Response;
using Dlhis.Basic.BusinessShift.Request;
using Dlhis.Basic.BusinessShift.Response;
using Dlhis.Entity.Basic.Entity;
+using Dlhis.Entity.Device.Entities;
using Dlhis.Sys.Api;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.CustomClass;
using Kurisu.Core.DataAccess.Dto;
using Kurisu.Core.Result;
-using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Services;
using Mapster;
+using System.Collections.Generic;
namespace Dlhis.Basic.BusinessShift.Services.Implements;
@@ -27,58 +29,109 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService
public async Task> GetPageAsync(BusinessPlaceShiftPageRequest request)
{
- var page = await _dbContext.Queryable()
- .LeftJoin((shift, place) => shift.BusinessPlaceCode == place.Code)
- .LeftJoin((shift, place, type) => shift.Code.ToString() == type.Code)
- .WhereIF(request.Search.IsPresent(), (shift, place) => shift.CustomCode.Contains(request.Search))
- .WhereIF(request.BusinessPlaceCode.HasValue, (shift, place) => shift.BusinessPlaceCode == request.BusinessPlaceCode)
- .Select((shift, place, type) => new BusinessPlaceShiftResponse
- {
- Id = shift.Id,
- BusinessPlaceCode = place.Code,
- BusinessPlaceCustomCode = place.CustomCode,
- BusinessPlace = place.Name,
- Code = shift.Code,
- CustomCode = shift.CustomCode,
- Name = type.Display,
- Start = shift.Start,
- End = shift.End
- })
+ var page = await _dbContext.Queryable()
+ .WhereIF(request.Search.IsPresent(), (shift) => shift.CustomCode.Contains(request.Search) || shift.Name.Contains(request.Search))
+ .Select()
.ToPageListAsync(request);
+ var shiftCodes = page.Data.Select(x => x.Code).ToList();
+
+ //下级就餐时间段
+ var mealShifts = await _dbContext.Queryable()
+ .LeftJoin((x, bt) => x.ShiftType == bt.Code)
+ .Where(x => shiftCodes.Contains(x.ShiftCode))
+ .Select((x, bt) => new MealShiftResponse
+ {
+ Id = x.Id,
+ ShiftCode = x.ShiftCode,
+ ShiftType = bt.Code,
+ Name = bt.Display,
+ Start = x.Start,
+ End = x.End,
+ })
+ .ToListAsync();
+
+ page.Data.ForEach(x =>
+ {
+ x.MealShifts = mealShifts.Where(item => item.ShiftCode == x.Code).ToList();
+ });
+
return page;
}
- public async Task SaveAsync(BusinessPlaceShiftSaveRequest request)
+ public async Task> GetListAsync()
{
- await CheckExistsCustomCodeAsync(request);
- await DuplicateTimePeriodAsync(request);
- await CheckPlaceExistsAsync(request.BusinessPlaceCode);
+ var result = await _dbContext.Queryable()
+ .Select().ToListAsync();
+ return result;
+ }
+ public async Task SaveAsync(BusinessPlaceShiftSaveRequest request)
+ {
+ await CheckExistsAsync(request);
+
+ Guid code = Guid.Empty;
if (!request.Id.HasValue)
{
- var entity = request.Adapt();
+ var entity = request.Adapt();
entity.Code = Guid.NewGuid();
- entity.Start = request.TimePeriod.Start.Value;
- entity.End = request.TimePeriod.End.Value;
-
await _dbContext.InsertAsync(entity);
+
+ code = entity.Code;
}
else
{
- var entity = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id);
- entity.Adapt(request);
+ var entity = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id);
+ entity.ThrowIfNull("餐次不存在");
+ request.Adapt(entity);
await _dbContext.UpdateAsync(entity);
+
+ code = entity.Code;
+ }
+
+ return code;
+ }
+
+ public async Task SaveMealShiftsAsync(List requests)
+ {
+ var mealShifts = await GetMealShiftAsync();
+
+ foreach (var request in requests)
+ {
+ var shift = await CheckExistsShiftAsync(request.ShiftCode);
+ await CheckExistsMealShiftAsync(request);
+ await DuplicateTimePeriodAsync(request);
+ mealShifts.Contains(request.ShiftType).ThrowIfFalse($"{request.ShiftType}不存在");
+
+ if (!request.Id.HasValue)
+ {
+ var entity = request.Adapt();
+
+ entity.ShiftCode = shift.Code;
+ entity.ShiftCustomCode = shift.CustomCode;
+ entity.Start = request.TimePeriod.Start.Value;
+ entity.End = request.TimePeriod.End.Value;
+
+ await _dbContext.InsertAsync(entity);
+ }
+ else
+ {
+ var entity = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id);
+ entity.ThrowIfNull("餐次段不存在");
+
+ request.Adapt(entity);
+ await _dbContext.UpdateAsync(entity);
+ }
}
}
- [IgnoreTenant]
+
public async Task GetShiftsByPlaceCustomCodeAsync(string placeCustomCode)
{
- var place = await _dbContext.Queryable().Where(x => x.CustomCode == placeCustomCode).FirstAsync();
+ var place = await _dbContext.Queryable().Where(x => x.CustomCode == placeCustomCode).FirstAsync();
if (place == null)
{
return new BusinessPlaceWithShiftResponse()
@@ -87,29 +140,45 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService
};
}
- var shifts = await _dbContext.Queryable()
- .Where(x => x.BusinessPlaceCode == place.Code)
- .OrderBy(x => x.Sequence) //排序
- .ToListAsync();
-
var tenantResult = await _tenantApi.GetTenantByCodeAsync(place.TenantId);
(tenantResult.Code == ApiStateCode.Success).ThrowIfFalse(tenantResult.Msg);
var tenantInfo = tenantResult.Data;
+ var relationship = await _dbContext.Queryable().Where(x => x.PlaceCode == place.Code).FirstAsync();
+ if (relationship == null)
+ {
+ return new BusinessPlaceWithShiftResponse()
+ {
+ CustomCode = placeCustomCode,
+ Name = place.Name,
+ TenantCode = tenantInfo.Code,
+ TenantName = tenantInfo.Name,
+ Shifts = new List()
+ };
+ }
+
+ var shifts = await _dbContext.Queryable()
+ .Where(x => x.ShiftCode == relationship.ShiftCode)
+ .OrderBy(x => x.Sequence) //排序
+ .ToListAsync();
+
var list = new List();
- foreach (CanteenBusinessShiftEntity shiftinfo in shifts)
+
+ foreach (BusinessShiftMealRelationshipEntity shiftinfo in shifts)
{
var name = _dbContext.Queryable()
- .Where(x => x.Code == shiftinfo.CustomCode.ToString())
+ .Where(x => x.Code == shiftinfo.ShiftType.ToString())
.Select(x => x.Display)
.First();
+
var shift = new BusinessPlaceShiftTinyResponse
{
- CustomCode = shiftinfo.CustomCode,
+ CustomCode = shiftinfo.Id.ToString(),
Name = name,
Start = shiftinfo.Start,
End = shiftinfo.End
};
+
list.Add(shift);
}
return new BusinessPlaceWithShiftResponse
@@ -122,24 +191,58 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService
};
}
- //*********************************************** help methods ***************************************************//
-
-
- private async Task CheckPlaceExistsAsync(Guid code)
+ public async Task> GetDevicesByCode(BusinessPlaceGetByCodeRequest request)
{
- var existsPlace = await _dbContext.Queryable().AnyAsync(x => x.Code == code);
- existsPlace.ThrowIfFalse("营业点不存在,请检查.");
+ var regiss = await _dbContext.Queryable()
+ .Where(x => x.BusinessPlaceCode.ToString() == request.Code)
+ .ToListAsync();
+
+ var devices = await _dbContext.Queryable().ToListAsync();
+
+ var list = new List();
+ if (regiss.Count > 0)
+ {
+ foreach (var regis in regiss)
+ {
+ var device = devices.Where(x => x.UniqueNo == regis.DeviceUniqueNo)
+ .FirstOrDefault();
+ if (device != null)
+ {
+ var detail = new DeviceCodeNameDetail
+ {
+ UniqueNo = regis.DeviceUniqueNo,
+ UniqueName = device.Supplier
+ };
+ list.Add(detail);
+ }
+ }
+ }
+ //分页
+ var startIndex = (request.PageIndex - 1) * request.PageSize;
+ var pagedData = list.Skip(startIndex).Take(request.PageSize).ToList();
+
+ var pagination = new Pagination
+ {
+ PageIndex = request.PageIndex,
+ PageSize = request.PageSize,
+ Total = list.Count, // 使用原始列表的总数进行分页
+ Data = pagedData
+ };
+
+ return pagination;
}
+ //*********************************************** help methods ***************************************************//
+
///
/// 时间段重合检查
///
///
///
- private async Task DuplicateTimePeriodAsync(BusinessPlaceShiftSaveRequest request)
+ private async Task DuplicateTimePeriodAsync(BusinessPlaceShiftSaveMealShiftRequest request)
{
- var periods = await _dbContext.Queryable()
- .Where(x => x.BusinessPlaceCode == request.BusinessPlaceCode)
+ var periods = await _dbContext.Queryable()
+ .Where(x => x.ShiftCode == request.ShiftCode)
.WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.Select(x => new TimePeriod
{
@@ -150,24 +253,47 @@ public class BusinessPlaceShiftService : IBusinessPlaceShiftService
foreach (var period in periods)
{
- period.IsDuplicate(request.TimePeriod).ThrowIfTrue($"存在时间段重合[{period.Start}-{period.End}]");
+ period.IsDuplicate1(request.TimePeriod).ThrowIfTrue($"存在时间段重合[{period.Start}-{period.End}]");
}
}
///
- /// 检查重复手工号
+ /// 检查重复
///
///
///
- private async Task CheckExistsCustomCodeAsync(BusinessPlaceShiftSaveRequest request)
+ private async Task CheckExistsAsync(BusinessPlaceShiftSaveRequest request)
{
- var existsSameCustomCode = await _dbContext.Queryable()
- .Where(x => x.CustomCode == request.CustomCode)
+ var existsSameCustomCode = await _dbContext.Queryable()
+ .Where(x => x.CustomCode == request.CustomCode || x.Name == request.Name)
.WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.AnyAsync();
- existsSameCustomCode.ThrowIfTrue($"自定义手工号[{request.CustomCode}]存在重复,请检查.");
+ existsSameCustomCode.ThrowIfTrue($"自定义手工号或者名称存在重复,请检查.");
}
+ private async Task CheckExistsShiftAsync(Guid shiftCode)
+ {
+ var shift = await _dbContext.Queryable().Where(x => x.Code == shiftCode).FirstAsync();
+ shift.ThrowIfNull("餐次不存在");
+
+ return shift;
+ }
+
+ private async Task> GetMealShiftAsync()
+ {
+ return await _dbContext.Queryable().Where(x => x.Type == "mealshift").Select(x => x.Code).ToListAsync();
+ }
+
+ private async Task CheckExistsMealShiftAsync(BusinessPlaceShiftSaveMealShiftRequest request)
+ {
+ var exists = await _dbContext.Queryable()
+ .Where(x => x.ShiftCode == request.ShiftCode)
+ .Where(x => x.ShiftType == request.ShiftType)
+ .WhereIF(request.Id.HasValue, x => x.Id != request.Id)
+ .AnyAsync();
+
+ exists.ThrowIfTrue("重复设置!");
+ }
}
diff --git a/Src/Dlhis.Basic/BusinessShift/TimePeriodExtensions.cs b/Src/Dlhis.Basic/BusinessShift/TimePeriodExtensions.cs
new file mode 100644
index 00000000..15d4c69d
--- /dev/null
+++ b/Src/Dlhis.Basic/BusinessShift/TimePeriodExtensions.cs
@@ -0,0 +1,73 @@
+using Kurisu.Core.CustomClass;
+
+namespace Dlhis.Basic.BusinessShift;
+
+
+///
+/// 临时的扩展类 todo: 嵌入框架
+///
+public static class TimePeriodExtensions
+{
+ public static bool IsDuplicate1(this TimePeriod current, TimePeriod period)
+ {
+ return !Check();
+
+ bool Check()
+ {
+ if (current.IsCrossDay())
+ {
+ if (period.IsCrossDay())
+ {
+ return true;
+ }
+ else
+ {
+ return period.Start > current.End && period.End < current.Start;
+ }
+ }
+ else
+ {
+ if (period.IsCrossDay())
+ {
+ return period.Start > current.End && period.End < current.Start;
+ }
+ else
+ {
+ return period.Start > current.End || period.End < current.Start;
+ }
+ }
+ }
+ }
+
+
+ public static bool IsPresent1(this TimePeriod period, DateTime dateTime)
+ {
+ DateTime start;
+ DateTime end;
+
+ if (period.IsCrossDay())
+ {
+ var currentStart = DateTime.Today.Add(period.Start.Value.ToTimeSpan());
+ var endOfDay = DateTime.Today.AddHours(23).AddMinutes(59).AddSeconds(59);
+
+ if (dateTime >= currentStart && dateTime <= endOfDay)
+ {
+ start = DateTime.Today.Add(period.Start.Value.ToTimeSpan());
+ end = DateTime.Today.AddDays(1).Add(period.End.Value.ToTimeSpan());
+ }
+ else
+ {
+ //第二天
+ start = DateTime.Today.AddDays(-1).Add(period.Start.Value.ToTimeSpan());
+ end = DateTime.Today.Add(period.End.Value.ToTimeSpan());
+ }
+ }
+ else
+ {
+ start = DateTime.Today.Add(period.Start.Value.ToTimeSpan());
+ end = DateTime.Today.Add(period.End.Value.ToTimeSpan());
+ }
+
+ return dateTime >= start && dateTime <= end;
+ }
+}
diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs
index bba3ae80..b3b849cd 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs
@@ -1,6 +1,8 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Device.Services;
+using Dlhis.Entity.Device.Enums;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.Core.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -22,26 +24,17 @@ public class DeviceGroupsController : ControllerBase
_deviceGroupService = deviceGroupService;
}
- ///
- /// 设备组分页
- ///
- ///
- ///
- [HttpPost("page")]
- public async Task> GetPageAsync([FromQuery] DeviceGroupPageRequest request)
- {
- return await _deviceGroupService.GetPageAsync(request);
- }
-
///
/// 获取设备组树
///
/// 是否显示设备
+ /// 分组类型
///
[HttpGet("tree")]
- public async Task> GetTreeAsync(bool showDevices)
+ [IgnoreTenant]
+ public async Task> GetTreeAsync(bool showDevices, DeviceTypeEnumType? type)
{
- return await _deviceGroupService.GetTreeAsync(showDevices);
+ return await _deviceGroupService.GetTreeAsync(showDevices, type);
}
///
@@ -50,6 +43,7 @@ public class DeviceGroupsController : ControllerBase
///
///
[HttpPost("save")]
+ [IgnoreTenant]
public async Task SaveAsync(DeviceGroupSaveRequest request)
{
await _deviceGroupService.SaveAsync(request);
@@ -72,6 +66,8 @@ public class DeviceGroupsController : ControllerBase
///
///
[HttpPost("assign")]
+ [IgnoreTenant]
+ [Transactional]
public async Task AssignDevicesAsync(DeviceAssignRequest request)
{
await _deviceGroupService.AssignDevicesAsync(request);
diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
index b0ecaf24..736902c0 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
@@ -1,6 +1,7 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Device.Services;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.Core.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -25,6 +26,8 @@ public class DevicePermissionsController : ControllerBase
///
///
[HttpPost("assign")]
+ [Transactional]
+ [IgnoreTenant]
public async Task AssignAsync(DevicePermissionSaveReuqest request)
{
await _devicePermissionService.AssignAsync(request);
@@ -51,4 +54,17 @@ public class DevicePermissionsController : ControllerBase
{
return await _devicePermissionService.GetAssigmentByCodeAsync(request);
}
+
+
+ ///
+ /// 就餐设备唯一号权限
+ ///
+ ///
+ ///
+ [HttpGet("canteen/uniqueNos")]
+ [IgnoreTenant]
+ public async Task> GetCanteenDeviceUniqueNosByUserNoAsync(string userNo)
+ {
+ return await _devicePermissionService.GetCanteenDeviceUniqueNosByUserNoAsync(userNo);
+ }
}
diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs
index 74e3ca8b..400cff09 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DevicesController.cs
@@ -1,6 +1,7 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Device.Services;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.Core.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -70,6 +71,7 @@ public class DevicesController : ControllerBase
///
///
[HttpPost("save")]
+ [Transactional]
public async Task SaveAsync(DeviceSaveRequest request)
{
await _deviceService.SaveAsync(request);
@@ -81,6 +83,7 @@ public class DevicesController : ControllerBase
///
///
[HttpPost("resigter")]
+ [IgnoreTenant]
public async Task ResigterAsync(DeviceResigterRequest request)
{
return await _deviceConnectService.ResigterAsync(request);
@@ -128,6 +131,7 @@ public class DevicesController : ControllerBase
///
///
[HttpPost("heartbeat")]
+ [IgnoreTenant]
public async Task HeartbeatAsync(DeviceHeartbeatRequest request)
{
await _deviceConnectService.HeartbeatAsync(request);
@@ -142,6 +146,7 @@ public class DevicesController : ControllerBase
{
return await _deviceService.CheckExistsAsync(deviceUniqueNo);
}
+
///
/// 获取设备
///
@@ -194,12 +199,34 @@ public class DevicesController : ControllerBase
}
///
- /// 获取近期30天新增设备数
+ /// 获取门禁在线/离线设备详情列表
+ ///
+ ///
+ [HttpGet("dooroffline")]
+ public async Task> GetDoorOfflineAsync([FromQuery] GetDoorOfflineRequest request)
+ {
+ return await _deviceService.GetDoorOfflineAsync(request);
+ }
+
+ ///
+ /// 获取近期30天考勤新增设备数
///
///
[HttpGet("recentnumbers")]
- public async Task> GetRecentNumbersAsync()
+ public async Task> GetRecentNumbersAsync()
{
return await _deviceService.GetRecentNumbersAsync();
}
+
+ ///
+ /// 批量导入设备信息
+ ///
+ ///
+ ///
+ [HttpPost("bulkUploads")]
+ public async Task BulkUploadsAsync([FromForm] BulkUploadsRequest request)
+ {
+ await _deviceService.BulkUploadsAsync(request);
+ }
+
}
diff --git a/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs b/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs
new file mode 100644
index 00000000..1d1b3b82
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Dtos/UserTenantDeviceCodeDto.cs
@@ -0,0 +1,14 @@
+namespace Dlhis.Basic.Device.Dtos;
+
+public class UserTenantDeviceCodeDto
+{
+ ///
+ /// 租户
+ ///
+ public string Tenant { get; set; }
+
+ ///
+ /// 设备权限
+ ///
+ public List Codes { get; set; }
+}
diff --git a/Src/Dlhis.Basic/Device/Request/BulkUploadsRequest.cs b/Src/Dlhis.Basic/Device/Request/BulkUploadsRequest.cs
new file mode 100644
index 00000000..a0ff5fb0
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Request/BulkUploadsRequest.cs
@@ -0,0 +1,10 @@
+namespace Dlhis.Basic.Device.Request
+{
+ public class BulkUploadsRequest
+ {
+ ///
+ /// 设备信息文件
+ ///
+ public IFormFile FormFile { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceGroupPageRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceGroupPageRequest.cs
deleted file mode 100644
index 419810f2..00000000
--- a/Src/Dlhis.Basic/Device/Request/DeviceGroupPageRequest.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using Kurisu.Core.DataAccess.Dto;
-
-namespace Dlhis.Basic.Device.Request;
-
-public class DeviceGroupPageRequest : PageDto
-{
-}
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceGroupSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceGroupSaveRequest.cs
index 35240dac..73bf5281 100644
--- a/Src/Dlhis.Basic/Device/Request/DeviceGroupSaveRequest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DeviceGroupSaveRequest.cs
@@ -10,7 +10,7 @@ public class DeviceGroupSaveRequest
///
/// 上级分组
///
- public Guid? PCode { get; set; }
+ public Guid PCode { get; set; }
///
/// 设备组名称
@@ -21,7 +21,11 @@ public class DeviceGroupSaveRequest
///
/// 分类类型 DeviceTypeEnumType
///
- [Required(ErrorMessage = "分类不能为空")]
[EnumDataType(typeof(DeviceTypeEnumType))]
- public DeviceTypeEnumType Type { get; set; }
+ public DeviceTypeEnumType? Type { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remark { get; set; }
}
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceOnlineAndofflineRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceOnlineAndofflineRequest.cs
index 14b9b1b5..0100289f 100644
--- a/Src/Dlhis.Basic/Device/Request/DeviceOnlineAndofflineRequest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DeviceOnlineAndofflineRequest.cs
@@ -2,7 +2,7 @@
namespace Dlhis.Basic.Device.Request
{
- public class DeviceOnlineAndofflineRequest :PageDto
+ public class DeviceOnlineAndofflineRequest : PageDto
{
public bool IsOnAndOff { get; set; }
}
diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs
index 5bca130a..85c3a613 100644
--- a/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionSaveReuqest.cs
@@ -1,9 +1,10 @@
using System.ComponentModel.DataAnnotations;
using Dlhis.Entity.Sys.Enums;
+using Kurisu.AspNetCore.Utils.Extensions;
namespace Dlhis.Basic.Device.Request;
-public class DevicePermissionSaveReuqest
+public class DevicePermissionSaveReuqest : IValidatableObject
{
///
/// 分配类型 AssignTypeEnumType
@@ -12,9 +13,12 @@ public class DevicePermissionSaveReuqest
public AssignTypeEnumType AssignType { get; set; }
///
- /// 人员档案号
+ /// 分配值
///
- [Required(ErrorMessage = "人员档案号不能为空")]
+ ///
+ /// 如果为用户,那么AssignValue=UserNo
+ ///
+ [Required(ErrorMessage = "分配值不能为空")]
public string AssignValue { get; set; }
///
@@ -24,7 +28,23 @@ public class DevicePermissionSaveReuqest
public DeviceAssignmentTypeEnumType UniqueType { get; set; }
///
- /// 分配权限值不能为空
+ /// 分配权限值
///
- public List Codes { get; set; } = new List();
+ public List Codes { get; set; }
+
+ ///
+ /// AssignType == AssignTypeEnumType.Department 需要传入
+ ///
+ public string TenantId { get; set; }
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ if (AssignType == AssignTypeEnumType.Department)
+ {
+ if (TenantId.IsEmpty())
+ {
+ yield return new ValidationResult("请明确具体的厂区", new[] { nameof(TenantId) });
+ }
+ }
+ }
}
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs
index 10b3a65b..f7e4a84c 100644
--- a/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DeviceSaveRequest.cs
@@ -1,9 +1,10 @@
using System.ComponentModel.DataAnnotations;
using Dlhis.Entity.Device.Enums;
+using Kurisu.AspNetCore.Utils.Extensions;
namespace Dlhis.Basic.Device.Request;
-public class DeviceSaveRequest
+public class DeviceSaveRequest : IValidatableObject
{
public long? Id { get; set; }
@@ -42,7 +43,6 @@ public class DeviceSaveRequest
///
/// 心跳间隔
///
- [Range(0, int.MaxValue)]
public int HeartbeatInterval { get; set; }
///
@@ -70,4 +70,22 @@ public class DeviceSaveRequest
/// 是否启用
///
public bool Enable { get; set; }
+
+ ///
+ /// 是否作为考勤设备
+ ///
+ public bool AsAttendance { get; set; }
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ if (Type != DeviceTypeEnumType.Door && AsAttendance)
+ {
+ yield return new ValidationResult($"{DeviceTypeEnumType.Door.GetDescription()}才可设置作为考勤设备", new[] { nameof(AsAttendance) });
+ }
+
+ if (HeartbeatInterval != 0 && HeartbeatInterval < 30)
+ {
+ yield return new ValidationResult($"心跳间隔需要设置>=30秒", new[] { nameof(HeartbeatInterval) });
+ }
+ }
}
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceSetResigterBusinessPlaceRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceSetResigterBusinessPlaceRequest.cs
index ef87f679..fb750ea1 100644
--- a/Src/Dlhis.Basic/Device/Request/DeviceSetResigterBusinessPlaceRequest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DeviceSetResigterBusinessPlaceRequest.cs
@@ -10,6 +10,6 @@
///
/// 营业点
///
- public Guid BusinessPlaceCode { get; set; }
+ public Guid? BusinessPlaceCode { get; set; }
}
}
diff --git a/Src/Dlhis.Basic/Device/Request/ImportDeviceSaveRequest.cs b/Src/Dlhis.Basic/Device/Request/ImportDeviceSaveRequest.cs
new file mode 100644
index 00000000..eddbcaed
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Request/ImportDeviceSaveRequest.cs
@@ -0,0 +1,76 @@
+using Dlhis.Entity.Device.Enums;
+using System.ComponentModel.DataAnnotations;
+
+namespace Dlhis.Basic.Device.Request
+{
+ public class ImportDeviceSaveRequest
+ {
+
+ public long? Id { get; set; }
+
+ ///
+ /// 设备唯一号
+ ///
+ public string UniqueNo { get; set; }
+
+ ///
+ /// 模板code
+ ///
+ public Guid TemplateCode { get; set; }
+
+ ///
+ /// 供应商信息
+ ///
+ public string Supplier { get; set; }
+
+ ///
+ /// 设备功能
+ ///
+ public List Funcs { get; set; }
+
+ ///
+ /// 设备类型 DeviceTypeEnumType
+ ///
+ public DeviceTypeEnumType Type { get; set; }
+
+ ///
+ /// 心跳间隔
+ ///
+ public int HeartbeatInterval { get; set; }
+
+ ///
+ /// 部署点
+ ///
+ public string DeployPlace { get; set; }
+
+ ///
+ /// 部署坐标
+ ///
+ public string DeployPosition { get; set; }
+
+ ///
+ /// 部署方向
+ ///
+ public string DeployDirection { get; set; }
+
+ ///
+ /// 连接信息
+ ///
+ public string ConnectionInfo { get; set; }
+
+ ///
+ /// 是否启用
+ ///
+ public bool Enable { get; set; }
+
+ ///
+ /// 是否作为考勤设备
+ ///
+ public bool AsAttendance { get; set; }
+
+ ///
+ /// 营业点code
+ ///
+ public Guid? PlaceeCode { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/Device/Response/DeviceGroupPageResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceGroupPageResponse.cs
index 446557ed..941a4487 100644
--- a/Src/Dlhis.Basic/Device/Response/DeviceGroupPageResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DeviceGroupPageResponse.cs
@@ -1,4 +1,7 @@
-namespace Dlhis.Basic.Device.Response;
+using Dlhis.Entity.Device.Enums;
+using Kurisu.AspNetCore.Utils.Extensions;
+
+namespace Dlhis.Basic.Device.Response;
public class DeviceGroupPageResponse
{
@@ -11,4 +14,30 @@ public class DeviceGroupPageResponse
/// 设备组名称
///
public string Name { get; set; }
+
+ ///
+ /// 分组类型
+ ///
+ public DeviceTypeEnumType? Type { get; set; }
+
+ ///
+ /// 是否可编辑
+ ///
+ public bool Editable { get; set; }
+
+ ///
+ /// 分组类型描述
+ ///
+ public string TypeDesc
+ {
+ get
+ {
+ if (!Type.HasValue)
+ {
+ return string.Empty;
+ }
+
+ return Type.Value.GetDescription();
+ }
+ }
}
diff --git a/Src/Dlhis.Basic/Device/Response/DeviceGroupTreeResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceGroupTreeResponse.cs
index 6e9588ea..b1b919d9 100644
--- a/Src/Dlhis.Basic/Device/Response/DeviceGroupTreeResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DeviceGroupTreeResponse.cs
@@ -1,7 +1,14 @@
-namespace Dlhis.Basic.Device.Response;
+using Dlhis.Entity.Device.Enums;
+using Kurisu.AspNetCore.Utils.Extensions;
+using Newtonsoft.Json;
+
+namespace Dlhis.Basic.Device.Response;
public class DeviceGroupTreeResponse
{
+ public long Id { get; set; }
+
+
///
/// 上级分组code
///
@@ -17,6 +24,42 @@ public class DeviceGroupTreeResponse
///
public string Name { get; set; }
+ ///
+ /// 设备组类型
+ ///
+ public DeviceTypeEnumType? Type { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string Remark { get; set; }
+
+ ///
+ /// 分组类型描述
+ ///
+ public string TypeDesc
+ {
+ get
+ {
+ if (!Type.HasValue)
+ {
+ return string.Empty;
+ }
+
+ return Type.Value.GetDescription();
+ }
+ }
+
+ public bool Editable { get; set; }
+
+ ///
+ /// 是否允许设置下级
+ ///
+ public bool AbleSetNext { get; set; }
+
+ [JsonIgnore]
+ public string TenantId { get; set; }
+
///
/// 下级
///
diff --git a/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs b/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs
index 448e34e9..5543715e 100644
--- a/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DevicePageResponse.cs
@@ -84,4 +84,51 @@ public class DevicePageResponse
/// 是否启用
///
public bool Enable { get; set; }
+
+
+ //*********************************************************附加信息**************************************************************/
+
+ ///
+ /// 最后心跳时间
+ ///
+ public DateTime? LastHeartbeatTime { get; set; }
+
+ ///
+ /// 是否在线
+ ///
+ public bool IsOnline
+ {
+ get
+ {
+ if (!LastHeartbeatTime.HasValue)
+ return false;
+ else
+ {
+ if (HeartbeatInterval <= 0)
+ return true;
+ else
+ return LastHeartbeatTime.Value.AddSeconds(HeartbeatInterval * 3) >= DateTime.Now;
+ }
+ }
+ }
+
+ ///
+ /// 消费总额
+ ///
+ public decimal Amount { get; set; }
+
+ ///
+ /// 消费人次
+ ///
+ public int UserCount { get; set; }
+
+ ///
+ /// 营业点code
+ ///
+ public Guid? BusinessPlaceCode { get; set; }
+
+ ///
+ /// 营业点名称
+ ///
+ public string BusinessPlaceName { get; set; }
}
diff --git a/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs
index d28b8650..642a250a 100644
--- a/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DeviceResponse.cs
@@ -88,6 +88,9 @@ public class DeviceResponse
}
}
+ public DeviceTypeEnumType Type { get; set; }
+ public string TypeDesc => Type.GetDescription();
+
///
/// 连接信息
///
diff --git a/Src/Dlhis.Basic/Device/Response/DeviceUnderGroupResponse.cs b/Src/Dlhis.Basic/Device/Response/DeviceUnderGroupResponse.cs
index 806a7d9b..c9d59404 100644
--- a/Src/Dlhis.Basic/Device/Response/DeviceUnderGroupResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DeviceUnderGroupResponse.cs
@@ -1,4 +1,6 @@
-namespace Dlhis.Basic.Device.Response;
+using Dlhis.Entity.Device.Enums;
+
+namespace Dlhis.Basic.Device.Response;
public class DeviceUnderGroupResponse
{
@@ -14,6 +16,12 @@ public class DeviceUnderGroupResponse
///
public string Brand { get; set; }
+ ///
+ /// 设备类型
+ ///
+ public DeviceTypeEnumType Type { get; set; }
+
+
///
/// 是否启用
///
diff --git a/Src/Dlhis.Basic/Device/Response/GetDoorOfflineRequest.cs b/Src/Dlhis.Basic/Device/Response/GetDoorOfflineRequest.cs
new file mode 100644
index 00000000..89d4eff4
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Response/GetDoorOfflineRequest.cs
@@ -0,0 +1,9 @@
+using Kurisu.Core.DataAccess.Dto;
+
+namespace Dlhis.Basic.Device.Response
+{
+ public class GetDoorOfflineRequest : PageDto
+ {
+ public bool IsOnAndOff { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/Device/Response/RecentNumberResponse.cs b/Src/Dlhis.Basic/Device/Response/RecentNumberResponse.cs
new file mode 100644
index 00000000..ce0de9ea
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Response/RecentNumberResponse.cs
@@ -0,0 +1,9 @@
+namespace Dlhis.Basic.Device.Response
+{
+ public class RecentNumberResponse
+ {
+ public string Date { get; set; }
+
+ public int Num { get; set; }
+ }
+}
diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs
index e759376e..4335fce8 100644
--- a/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs
+++ b/Src/Dlhis.Basic/Device/Services/IDeviceGroupService.cs
@@ -1,14 +1,12 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
-using Kurisu.Core.DataAccess.Dto;
+using Dlhis.Entity.Device.Enums;
namespace Dlhis.Basic.Device.Services;
public interface IDeviceGroupService : IScopeDependency
{
- Task> GetPageAsync(DeviceGroupPageRequest request);
-
- Task> GetTreeAsync(bool showDevices);
+ Task> GetTreeAsync(bool showDevices, DeviceTypeEnumType? type);
Task SaveAsync(DeviceGroupSaveRequest request);
diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
index 040d00ac..ef313da0 100644
--- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
@@ -50,6 +50,14 @@ public interface IDevicePermissionService : IScopeDependency
///
Task> GetAssignDeviceCodesAsync(string userNo);
+
+ ///
+ /// 获取就餐权限唯一号
+ ///
+ ///
+ ///
+ Task> GetCanteenDeviceUniqueNosByUserNoAsync(string userNo);
+
///
/// 获取用户权限设备
///
diff --git a/Src/Dlhis.Basic/Device/Services/IDeviceService.cs b/Src/Dlhis.Basic/Device/Services/IDeviceService.cs
index 745702d4..a5549121 100644
--- a/Src/Dlhis.Basic/Device/Services/IDeviceService.cs
+++ b/Src/Dlhis.Basic/Device/Services/IDeviceService.cs
@@ -23,5 +23,11 @@ public interface IDeviceService : IScopeDependency
Task> GetAttendanceOfflineAsync(DeviceOnlineAndofflineRequest request);
- Task> GetRecentNumbersAsync();
+ Task> GetDoorOfflineAsync(GetDoorOfflineRequest request);
+
+ Task> GetRecentNumbersAsync();
+
+ Task BulkUploadsAsync(BulkUploadsRequest request);
+
+
}
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs
index e507e5e5..810c377d 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceConnectService.cs
@@ -3,9 +3,7 @@ using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Device.Enums;
-using Kurisu.AspNetCore.UnifyResultAndValidation;
using Kurisu.AspNetCore.Utils.Extensions;
-using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Services;
using Mapster;
@@ -20,10 +18,10 @@ public class DeviceConnectService : IDeviceConnectService
_dbContext = dbContext;
}
- [IgnoreTenant]
+
public async Task ResigterAsync(DeviceResigterRequest request)
{
- var businessPlace = await _dbContext.Queryable().Where(x => x.CustomCode == request.BusinessCustomCode).FirstAsync();
+ var businessPlace = await _dbContext.Queryable().Where(x => x.CustomCode == request.BusinessCustomCode).FirstAsync();
businessPlace.ThrowIfNull("营业点不存在");
var device = await GetEnableDeviceAsync(request.UniqueNo, false, request.DeployPlace, businessPlace.TenantId);
@@ -55,7 +53,7 @@ public class DeviceConnectService : IDeviceConnectService
public async Task> GetNotSetBusinessPlaceDevicesAsync()
{
var devices = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync();
- devices = devices.Where(x => x.Funcs.Any(item => item == DeviceFuncEnumType.Meal)).ToList();
+ devices = devices.Where(x => x.Type == DeviceTypeEnumType.Meal).ToList();
return devices.Adapt>();
}
@@ -63,26 +61,31 @@ public class DeviceConnectService : IDeviceConnectService
public async Task SetResigterBusinessPlaceAsync(DeviceSetResigterBusinessPlaceRequest request)
{
var device = await GetEnableDeviceAsync(request.UniqueNo);
- if (device.Funcs?.Any(x => x == DeviceFuncEnumType.Meal) != true)
- {
- throw new UserFriendlyException("当前设备无用餐功能,无法设置");
- }
+ (device.Type != DeviceTypeEnumType.Meal).ThrowIfTrue("非就餐类型设备,无法设置");
var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync();
registry.ThrowIfNull($"{request.UniqueNo}的设备注册信息不存在,无法设置营业点");
- var businessPlace = await _dbContext.Queryable().Where(x => x.Code == request.BusinessPlaceCode).FirstAsync();
- businessPlace.ThrowIfNull("营业点不存在,无法设置到设备注册信息中");
+ if (request.BusinessPlaceCode.HasValue)
+ {
+ var businessPlace = await _dbContext.Queryable().Where(x => x.Code == request.BusinessPlaceCode).FirstAsync();
+ businessPlace.ThrowIfNull("营业点不存在,无法设置到设备注册信息中");
- //更新营业点信息
- registry.BusinessPlaceCode = businessPlace.Code;
- registry.BusinessPlaceCustomCode = businessPlace.CustomCode;
+ //更新营业点信息
+ registry.BusinessPlaceCode = businessPlace.Code;
+ registry.BusinessPlaceCustomCode = businessPlace.CustomCode;
+ }
+ else
+ {
+ //更新营业点信息
+ registry.BusinessPlaceCode = null;
+ registry.BusinessPlaceCustomCode = null;
+ }
await _dbContext.UpdateAsync(registry);
- //todo 通知设备重新获取
}
- [IgnoreTenant]
+
public async Task HeartbeatAsync(DeviceHeartbeatRequest request)
{
var registry = await _dbContext.Queryable().Where(x => x.DeviceUniqueNo == request.UniqueNo).FirstAsync();
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
index 3047dc21..3c8797d6 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
@@ -2,10 +2,9 @@
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
+using Dlhis.Entity.Device.Enums;
using Kurisu.AspNetCore.Utils.Extensions;
-using Kurisu.Core.DataAccess.Dto;
-using Kurisu.SqlSugar.Attributes;
-using Kurisu.SqlSugar.Extensions;
+using Kurisu.Core.User.Abstractions;
using Kurisu.SqlSugar.Services;
using Mapster;
@@ -15,24 +14,20 @@ public class DeviceGroupService : IDeviceGroupService
{
private readonly IDbContext _dbContext;
private readonly IDevicePermissionService _devicePermissionService;
+ private readonly ICurrentUser _currentUser;
- public DeviceGroupService(IDbContext dbContext, IDevicePermissionService devicePermissionService)
+ public DeviceGroupService(IDbContext dbContext, IDevicePermissionService devicePermissionService, ICurrentUser currentUser)
{
_dbContext = dbContext;
_devicePermissionService = devicePermissionService;
+ _currentUser = currentUser;
}
- public async Task> GetPageAsync(DeviceGroupPageRequest request)
- {
- return await _dbContext.Queryable()
- .WhereIF(request.Search.IsPresent(), x => x.Name.Contains(request.Search))
- .Select()
- .ToPageListAsync(request);
- }
- public async Task> GetTreeAsync(bool showDevices)
+ public async Task> GetTreeAsync(bool showDevices, DeviceTypeEnumType? type)
{
var deviceGroups = await _dbContext.Queryable()
+ .WhereIF(type.HasValue, x => x.Type == type)
.Select()
.ToListAsync();
@@ -48,19 +43,37 @@ public class DeviceGroupService : IDeviceGroupService
public async Task SaveAsync(DeviceGroupSaveRequest request)
{
//检查父级节点
- await CheckPCodeExistsDeviceAsync(request.PCode);
+ var pGrp = await CheckPCodeAsync(request);
if (!request.Id.HasValue)
{
var entity = request.Adapt();
-
entity.Code = Guid.NewGuid();
+ entity.TenantId = _currentUser.GetStringTenantId();
+
await _dbContext.InsertAsync(entity);
}
else
{
var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
- entity.ThrowIfNull("设备组不存在,无法更新");
+ entity.ThrowIfNull("设备分组不存在,无法更新");
+ entity.Editable.ThrowIfFalse("不可编辑当前分组");
+
+ if (request.Type != entity.Type)
+ {
+ //检查下级分组type不一致
+ var existsDiffNextGroups = await _dbContext.Queryable()
+ .Where(x => x.PCode == entity.Code)
+ .Where(x => x.Type != request.Type)
+ .AnyAsync();
+
+ existsDiffNextGroups.ThrowIfTrue("存在下级分组类型不一致,无法修改");
+
+ var nextDevices = await GetDevicesAsync(entity.Code);
+ nextDevices.Any(x => x.Type != request.Type).ThrowIfTrue("分组设备类型不匹配,无法修改类型");
+ }
+
+ request.Adapt(entity);
await _dbContext.UpdateAsync(entity);
}
}
@@ -68,16 +81,16 @@ public class DeviceGroupService : IDeviceGroupService
public async Task DeleteAsync(long id)
{
var deviceGroup = await _dbContext.Queryable().Where(x => x.Id == id).FirstAsync();
- deviceGroup.ThrowIfNull("设备组不存在,无需删除");
+ deviceGroup.ThrowIfNull("设备分组不存在,无需删除");
await _dbContext.DeleteAsync(deviceGroup);
}
- [Transactional]
+
public async Task AssignDevicesAsync(DeviceAssignRequest request)
{
var group = await _dbContext.Queryable().Where(x => x.Code == request.GroupCode).FirstAsync();
- group.ThrowIfNull("设备组不存在");
+ group.ThrowIfNull("设备分组不存在,无法进行分配");
await CheckNoNextGroupAsync(group.Code);
await CheckGroupTypeMatchAsync(request, group);
@@ -86,13 +99,14 @@ public class DeviceGroupService : IDeviceGroupService
await _devicePermissionService.GenerateDeviceTasksAsync(async () =>
{
var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync();
- await _dbContext.DeleteAsync(relationships);
-
+ await _dbContext.DeleteReallyAsync(relationships);
var entities = request.DeviceCodes.Select(x => new DeviceGroupRelationshipEntity
{
GroupCode = request.GroupCode,
- DeviceCode = x
+ DeviceCode = x,
+
+ TenantId = _currentUser.GetStringTenantId(),
}).ToList();
@@ -116,28 +130,33 @@ public class DeviceGroupService : IDeviceGroupService
/****************************************************** help methods *********************************************************/
///
- /// 检查父级分组存在设备
+ /// 检查父级分组
///
- ///
+ ///
///
- private async Task CheckPCodeExistsDeviceAsync(Guid? pCode)
+ private async Task CheckPCodeAsync(DeviceGroupSaveRequest request)
{
- if (pCode.HasValue)
+ var pGrp = await _dbContext.Queryable().Where(x => x.Code == request.PCode).FirstAsync();
+ if (pGrp != null)
{
- var exists = await _dbContext.Queryable().Where(x => x.GroupCode == pCode).AnyAsync();
- exists.ThrowIfTrue("父级分组存在设备");
+ (!pGrp.AbleSetNext && !request.Id.HasValue).ThrowIfTrue($"{pGrp.Name}不可添加下级");
+ var exists = await _dbContext.Queryable().Where(x => x.GroupCode == request.PCode).AnyAsync();
+ exists.ThrowIfTrue("上级分组存在设备");
}
+
+ (pGrp != null && pGrp.Type != request.Type).ThrowIfTrue("分组类型必须与上级类型保持一致");
+ return pGrp;
}
///
- ///
+ /// 检查分组是否存在下级
///
///
///
private async Task CheckNoNextGroupAsync(Guid currentCode)
{
var exists = await _dbContext.Queryable().Where(x => x.PCode == currentCode).AnyAsync();
- exists.ThrowIfTrue("存在下级设备分组");
+ exists.ThrowIfTrue("存在下级设备分组,无法分配设备");
}
///
@@ -150,10 +169,7 @@ public class DeviceGroupService : IDeviceGroupService
{
var devices = await _dbContext.Queryable().Where(x => request.DeviceCodes.Contains(x.Code)).ToListAsync();
//检查分组的分类控制
- if (group.Type.HasValue)
- {
- devices.Any(x => x.Type != group.Type).ThrowIfTrue("存在设备类型有误,无法分配到当前分组");
- }
+ devices.Any(x => x.Type != group.Type).ThrowIfTrue($"存在设备类型不一致,无法分配到当前{group.Type.GetDescription()}分组");
//重新赋值到请求参数中
request.DeviceCodes = devices.Select(x => x.Code).ToList();
@@ -164,15 +180,32 @@ public class DeviceGroupService : IDeviceGroupService
/// 递归获取树
///
///
- ///
+ ///
///
- private void RecursionGetNext(DeviceGroupTreeResponse current, List departments, bool showDevices)
+ private void RecursionGetNext(DeviceGroupTreeResponse current, List deviceGroups, bool showDevices)
{
- var next = departments.Where(x => x.PCode == current.Code).ToList();
+ var currentTenantId = _currentUser.GetStringTenantId();
+ var next = deviceGroups.Where(x =>
+ {
+ if (x.PCode == current.Code)
+ {
+ if (x.TenantId.IsEmpty())
+ {
+ return true;
+ }
+ else
+ {
+ return x.TenantId == currentTenantId;
+ }
+ }
+
+ return false;
+
+ }).ToList();
current.Next = next;
foreach (var item in next)
{
- RecursionGetNext(item, departments, showDevices);
+ RecursionGetNext(item, deviceGroups, showDevices);
}
//最后层级附加设备信息
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
index 1fbc6c88..d46ac987 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
@@ -1,4 +1,5 @@
-using Dlhis.Basic.Device.Request;
+using Dlhis.Basic.Device.Dtos;
+using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
@@ -7,159 +8,156 @@ using Dlhis.Entity.Sys.Entities;
using Dlhis.Entity.Sys.Enums;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.DataAccess.Dto;
-using Kurisu.SqlSugar.Attributes;
+using Kurisu.Core.DataAccess.Entity;
+using Kurisu.Core.User.Abstractions;
using Kurisu.SqlSugar.Services;
-using System.Collections.Generic;
namespace Dlhis.Basic.Device.Services.Implements;
public class DevicePermissionService : IDevicePermissionService
{
private readonly IDbContext _dbContext;
+ private readonly ICurrentUser _currentUser;
- public DevicePermissionService(IDbContext dbContext)
+ public DevicePermissionService(IDbContext dbContext, ICurrentUser currentUser)
{
_dbContext = dbContext;
+ _currentUser = currentUser;
}
- [Transactional]
public async Task AssignAsync(DevicePermissionSaveReuqest reuqest)
{
+ var tenantId = reuqest.AssignType == AssignTypeEnumType.Department ? reuqest.TenantId : _currentUser.GetStringTenantId();
+
+ //删除当前匹配的基地权限
+ var p = await _dbContext.Queryable()
+ .Where(x => x.AssignType == reuqest.AssignType)
+ .Where(x => x.AssignValue == reuqest.AssignValue)
+ .Where(x => x.UniqueType == reuqest.UniqueType)
+ .Where(x => x.TenantId == tenantId)
+ .ToListAsync();
+
+ await _dbContext.DeleteReallyAsync(p);
+
await GenerateDeviceTasksAsync(async () =>
{
-
- var p = await _dbContext.Queryable()
- .Where(x => x.AssignType == reuqest.AssignType)
- .Where(x => x.AssignValue == reuqest.AssignValue)
- .Where(x => x.UniqueType == reuqest.UniqueType)
- .ToListAsync();
-
- await _dbContext.DeleteReallyAsync(p);
-
- var devicePermissions = reuqest.Codes.Select(x => new DevicePermissionEntity
+ //保存配置的权限
+ if (reuqest.Codes.IsPresent())
{
- AssignType = reuqest.AssignType,
- AssignValue = reuqest.AssignValue,
- UniqueType = reuqest.UniqueType,
- UniqueValue = x,
+ var devicePermissions = reuqest.Codes.Select(code => new DevicePermissionEntity
+ {
+ AssignType = reuqest.AssignType,
+ AssignValue = reuqest.AssignValue,
+ UniqueType = reuqest.UniqueType,
+ UniqueValue = code,
+ TenantId = tenantId
+ })
+ .ToList();
- }).ToList();
-
- await _dbContext.InsertAsync(devicePermissions);
+ await _dbContext.InsertAsync(devicePermissions);
+ }
}, null);
}
public async Task> GetAssignmentsAsync(DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue)
{
- var devicePermissions = await _dbContext.Queryable()
- .Where(x => x.UniqueType == uniqueType)
- .Where(x => x.AssignType == assignType)
- .Where(x => x.AssignValue == assignValue)
- .Select(x => x.UniqueValue)
- .ToListAsync();
+ var devicePermissions = await _dbContext.Queryable().ToListAsync();
+ var deviceGroups = await _dbContext.Queryable().ToListAsync();
- if (uniqueType == DeviceAssignmentTypeEnumType.Group)
- {
- var deviceGroups = await _dbContext.Queryable().ToListAsync();
- var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
- tops.ForEach(x =>
- {
- RecursionGetNext(x, deviceGroups, devicePermissions, devicePermissions.Contains(x.Code));
- });
- }
-
- return devicePermissions.Distinct().ToList();
-
- void RecursionGetNext(DeviceGroupEntity current, List deviceGroups, List result, bool add)
- {
- var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
- foreach (var item in next)
- {
- if (add) result.Add(item.Code);
- RecursionGetNext(item, deviceGroups, result, result.Contains(item.Code));
- }
- }
+ var result = GetAssignCodesInternal(devicePermissions, deviceGroups, uniqueType, assignType, assignValue);
+ return result.FirstOrDefault(x => x.Tenant == _currentUser.GetStringTenantId())?.Codes;
}
public async Task GenerateDeviceTasksAsync(Func func, List userNos)
{
- if (userNos.IsEmpty())
+ _dbContext.Client.QueryFilter.ClearAndBackup();
+ try
{
- userNos = await GetPermissionUserNosAsync();
- }
+ //获取所有人的权限
+ if (userNos.IsEmpty())
+ userNos = await GetPermissionUserNosAsync();
- var beforeDic = await GetAssignDeviceCodesAsync(userNos);
+ var before = await GetAssignDeviceCodesInternalAsync(userNos);
- //获取处理
- await func();
+ _dbContext.Client.QueryFilter.Restore();
+ //业务处理
+ await func();
+ _dbContext.Client.QueryFilter.ClearAndBackup();
- //获取当前的权限code
+ //获取业务处理后所有人的权限
+ var nextUserNos = await GetPermissionUserNosAsync();
+ if (nextUserNos.Any())
+ userNos = userNos.Concat(nextUserNos).Distinct().ToList();
- var nextUserNos = await GetPermissionUserNosAsync();
- if (nextUserNos.Any())
- {
- userNos = nextUserNos;
- }
+ var current = await GetAssignDeviceCodesInternalAsync(userNos);
- var currentDic = await GetAssignDeviceCodesAsync(userNos);
+ var deivces = await _dbContext.Queryable().ToListAsync();
+ var waitTasks = new List();
- var deivces = await _dbContext.Queryable().ToListAsync();
- foreach (var userNo in userNos)
- {
- beforeDic.TryGetValue(userNo, out var beforeCodes);
- beforeCodes ??= new List();
-
- currentDic.TryGetValue(userNo, out var currentCodes);
- currentCodes ??= new List();
-
- //被删除
- var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList();
- //新增
- var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList();
-
- if (!deletedItems.Any() && !addItems.Any())
+ foreach (var userNo in userNos)
{
- continue;
+ before.TryGetValue(userNo, out var beforeTenantDeviceCodes);
+ beforeTenantDeviceCodes ??= new();
+
+ current.TryGetValue(userNo, out var currentTenantDeviceCodes);
+ currentTenantDeviceCodes ??= new();
+
+ var tenants = beforeTenantDeviceCodes.Select(x => x.Tenant).Concat(currentTenantDeviceCodes.Select(x => x.Tenant)).Distinct().ToList();
+
+ foreach (var tenant in tenants)
+ {
+ var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new();
+ var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new();
+
+ //被删除
+ var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList();
+ //新增
+ var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList();
+
+ if (!deletedItems.Any() && !addItems.Any())
+ {
+ continue;
+ }
+
+ var deviceCodes = deivces.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList();
+ deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList();
+ addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList();
+
+ //下发任务创建
+ var toDeleted = deletedItems.Select(x => new DeviceTaskEntity
+ {
+ DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Type = DeviceTaskEnumType.Delete,
+ UserNo = userNo,
+ Version = 0,
+ TenantId = tenant,
+ }).ToList();
+
+ var toAdd = addItems.Select(x => new DeviceTaskEntity
+ {
+ DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Type = DeviceTaskEnumType.Add,
+ UserNo = userNo,
+ Version = 0,
+ TenantId = tenant,
+ }).ToList();
+
+ waitTasks.AddRange(toDeleted.Concat(toAdd).ToList());
+ }
}
- var deviceCodes = deivces.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList();
- deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList();
- addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList();
-
- var userInfo = await _dbContext.Queryable()
- .LeftJoin((ga, department) => department.No == ga.DepartmentNo)
- .Where(ga => ga.No == userNo)
- .Select(ga => new
- {
- ga.Code
- })
- .SingleAsync();
-
- //下发任务创建
- var toDeleted = deletedItems.Select(x => new DeviceTaskEntity
+ if (waitTasks.Any())
{
- DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
- Status = DeviceTaskStatusEnumType.Wait,
- Type = DeviceTaskEnumType.Delete,
- UserNo = userNo,
- Version = 0,
- UserCode = userInfo.Code,
- }).ToList();
-
- var toAdd = addItems.Select(x => new DeviceTaskEntity
- {
- DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
- Status = DeviceTaskStatusEnumType.Wait,
- Type = DeviceTaskEnumType.Add,
- UserNo = userNo,
- Version = 0,
- UserCode = userInfo.Code,
- }).ToList();
-
- var tasks = toDeleted.Concat(toAdd).ToList();
- await _dbContext.InsertAsync(tasks);
+ await _dbContext.InsertAsync(waitTasks);
+ }
+ }
+ finally
+ {
+ _dbContext.Client.QueryFilter.Restore();
}
}
@@ -183,7 +181,6 @@ public class DevicePermissionService : IDevicePermissionService
})
.SingleAsync();
-
var tasks = deviceCodes.Select(x => new DeviceTaskEntity
{
DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
@@ -191,13 +188,23 @@ public class DevicePermissionService : IDevicePermissionService
Type = taskType,
UserNo = userNo,
Version = 0,
- UserCode = userInfo.Code,
}).ToList();
await _dbContext.InsertAsync(tasks);
}
+ public async Task> GetCanteenDeviceUniqueNosByUserNoAsync(string userNo)
+ {
+ var all = await GetAssignDeviceCodesAsync(userNo);
+
+ return await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Meal)
+ .Where(x => all.Contains(x.Code))
+ .Select(x => x.UniqueNo)
+ .ToListAsync();
+ }
+
+
///
/// 获取用户所有设备权限
///
@@ -206,125 +213,17 @@ public class DevicePermissionService : IDevicePermissionService
public async Task> GetAssignDeviceCodesAsync(string userNo)
{
var gainfo = await _dbContext.Queryable().Where(x => x.No == userNo).SingleAsync();
- var gainfoGroups = await _dbContext.Queryable().Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToListAsync();
+ var gainfoGroups = await _dbContext.Queryable().ToListAsync();
- var deviceCodes = new List();
- var deviceGroupCodes = new List();
-
- var du = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo);
- var gu = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo);
- deviceCodes.AddRange(du);
- deviceGroupCodes.AddRange(gu);
-
- foreach (var group in gainfoGroups)
- {
- var dg = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, group.ToString());
- var gg = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, group.ToString());
- deviceCodes.AddRange(dg);
- deviceGroupCodes.AddRange(gg);
- }
-
- var dd = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo);
- var gd = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo);
- deviceCodes.AddRange(dd);
- deviceGroupCodes.AddRange(gd);
-
- var dt = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Werks);
- var gt = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Werks);
- deviceCodes.AddRange(du);
- deviceGroupCodes.AddRange(gu);
-
- var deveiceCodesByGroup = await _dbContext.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToListAsync();
- deviceCodes.AddRange(deveiceCodesByGroup);
-
- return deviceCodes.Distinct().ToList();
- }
-
- private async Task>> GetAssignDeviceCodesAsync(List userNos)
- {
- var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync();
- if (!gainfos.Any())
- {
- return new Dictionary>();
- }
- var gainfoGroupRelationships = await _dbContext.Queryable().ToListAsync();
var devicePermissions = await _dbContext.Queryable().ToListAsync();
var deviceGroups = await _dbContext.Queryable().ToListAsync();
+ var deviceRelationships = await _dbContext.Queryable().ToListAsync();
- var result = new Dictionary>();
-
- foreach (var gainfo in gainfos)
- {
- var userNo = gainfo.No;
-
- var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).ToList();
-
- var deviceCodes = new List();
- var deviceGroupCodes = new List();
-
- var du = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo);
- var gu = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo);
- deviceCodes.AddRange(du);
- deviceGroupCodes.AddRange(gu);
-
- foreach (var group in gainfoGroups)
- {
- var dg = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, group.ToString());
- var gg = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, group.ToString());
- deviceCodes.AddRange(dg);
- deviceGroupCodes.AddRange(gg);
- }
-
- var dd = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo);
- var gd = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo);
- deviceCodes.AddRange(dd);
- deviceGroupCodes.AddRange(gd);
-
- var dt = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Werks);
- var gt = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Werks);
- deviceCodes.AddRange(du);
- deviceGroupCodes.AddRange(gu);
-
- var deveiceCodesByGroup = await _dbContext.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToListAsync();
- deviceCodes.AddRange(deveiceCodesByGroup);
-
- result.Add(userNo, deviceCodes.Distinct().ToList());
- }
-
- return result;
-
-
- List GetAssignmentsInternal(DeviceAssignmentTypeEnumType uniqueTypeInternal, AssignTypeEnumType assignTypeInternal, string assignValueInternal)
- {
- var devicePermissionsInternal = devicePermissions.Where(x => x.UniqueType == uniqueTypeInternal)
- .Where(x => x.AssignType == assignTypeInternal)
- .Where(x => x.AssignValue == assignValueInternal)
- .Select(x => x.UniqueValue)
- .ToList();
-
- if (uniqueTypeInternal == DeviceAssignmentTypeEnumType.Group)
- {
- var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
- tops.ForEach(x =>
- {
- RecursionGetNext(x, deviceGroups, devicePermissionsInternal, devicePermissionsInternal.Contains(x.Code));
- });
- }
-
- return devicePermissionsInternal.Distinct().ToList();
-
- void RecursionGetNext(DeviceGroupEntity current, List deviceGroups, List result, bool add)
- {
- var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
- foreach (var item in next)
- {
- if (add) result.Add(item.Code);
- RecursionGetNext(item, deviceGroups, result, result.Contains(item.Code));
- }
- }
- }
+ var result = GetAssignDeviceCodesInternal(gainfo, gainfoGroups, devicePermissions, deviceGroups, deviceRelationships);
+ return result.SelectMany(x => x.Codes).ToList();
}
+
///
/// 获取用户权限设备
///
@@ -340,7 +239,7 @@ public class DevicePermissionService : IDevicePermissionService
var devices = await _dbContext.Queryable().ToListAsync();
- if(ggs != null && ggs.Count > 0)
+ if (ggs != null && ggs.Count > 0)
{
foreach (var gid in ggs)
{
@@ -351,7 +250,7 @@ public class DevicePermissionService : IDevicePermissionService
gds.AddRange(ds);
}
}
-
+
var dds = gds.Distinct().ToList();
var lst = devices.Where(x => dds.Contains(x.Code))
.Select(x => new AssigmentByCodeResponse
@@ -403,8 +302,169 @@ public class DevicePermissionService : IDevicePermissionService
var tenants = permissions.Where(x => x.AssignType == AssignTypeEnumType.Tenant).Select(x => x.AssignValue).ToList();
var userNosByWerk = await _dbContext.Queryable().Where(x => tenants.Contains(x.Werks)).Select(x => x.No).ToListAsync();
-
- return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).ToList();
+ return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList();
}
+
+ private static List GetAssignmentsInternal(
+ List devicePermissions, List deviceGroups,
+ DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue)
+ {
+ var devicePermissionCodes = devicePermissions
+ .Where(x => x.UniqueType == uniqueType)
+ .Where(x => x.AssignType == assignType)
+ .Where(x => x.AssignValue == assignValue)
+ .Select(x => x.UniqueValue).ToList();
+
+ //处理获取设备组的情况,递归到最下级获取设备code
+ if (uniqueType == DeviceAssignmentTypeEnumType.Group)
+ {
+ var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
+ tops.ForEach(x =>
+ {
+ RecursionGetNext(x, deviceGroups, devicePermissionCodes, devicePermissionCodes.Contains(x.Code));
+ });
+ }
+
+ return devicePermissionCodes.Distinct().ToList();
+
+ void RecursionGetNext(DeviceGroupEntity current, List deviceGroups, List result, bool add)
+ {
+ var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
+ foreach (var item in next)
+ {
+ if (add) result.Add(item.Code);
+ RecursionGetNext(item, deviceGroups, result, result.Contains(item.Code));
+ }
+ }
+ }
+
+ private static List GetAssignCodesInternal(
+ List devicePermissions, List deviceGroups,
+ DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue)
+ {
+ var tenantDevicePermissions = devicePermissions
+ .Where(x => x.UniqueType == uniqueType)
+ .Where(x => x.AssignType == assignType)
+ .Where(x => x.AssignValue == assignValue)
+ .GroupBy(x => x.TenantId)
+ .Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(x => x.UniqueValue).ToList() })
+ .ToList();
+
+ //处理获取设备分组的情况
+ if (uniqueType == DeviceAssignmentTypeEnumType.Group)
+ {
+ //开始递归处理
+ var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
+ tops.ForEach(x =>
+ {
+ RecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(x => x.Codes).Contains(x.Code));
+ });
+ }
+
+ return tenantDevicePermissions.GroupBy(x => x.Tenant).Select(x =>
+ {
+ var tenant = x.Key;
+
+ return new UserTenantDeviceCodeDto
+ {
+ Tenant = tenant,
+ Codes = x.SelectMany(item => item.Codes).ToList()
+ };
+ }).ToList();
+
+ void RecursionGetNext(DeviceGroupEntity current, List deviceGroups, List result, bool add)
+ {
+ var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
+ foreach (var item in next)
+ {
+ if (add)
+ {
+ result.Add(new UserTenantDeviceCodeDto { Tenant = item.TenantId, Codes = new List { item.Code } });
+ }
+ RecursionGetNext(item, deviceGroups, result, result.SelectMany(x => x.Codes).Contains(item.Code));
+ }
+ }
+ }
+
+ private async Task>> GetAssignDeviceCodesInternalAsync(List userNos)
+ {
+ var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync();
+ if (!gainfos.Any())
+ {
+ return new Dictionary>();
+ }
+
+ var gainfoGroupRelationships = await _dbContext.Queryable().Where(x => userNos.Contains(x.UserNo)).ToListAsync();
+ var devicePermissions = await _dbContext.Queryable().ToListAsync();
+ var deviceGroups = await _dbContext.Queryable().ToListAsync();
+ var deviceRelationships = await _dbContext.Queryable().ToListAsync();
+
+ var result = new Dictionary>(gainfos.Count);
+
+ foreach (var gainfo in gainfos)
+ {
+ var codes = GetAssignDeviceCodesInternal(gainfo, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships);
+ result.Add(gainfo.No, codes);
+ }
+
+ return result;
+ }
+
+ private static List GetAssignDeviceCodesInternal(
+ GainfoEntity gainfo,
+ List gainfoGroupRelationships,
+ List devicePermissions,
+ List deviceGroups,
+ List deviceGroupRelationships)
+ {
+ var userNo = gainfo.No;
+ var deviceCodes = new List();
+ var deviceGroupCodes = new List();
+
+ //获取人员的分组,跨基地
+ var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToList();
+
+ //按User获取权限
+ var du = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo);
+ var gu = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo);
+ deviceCodes.AddRange(du);
+ deviceGroupCodes.AddRange(gu);
+
+ foreach (var groupCode in gainfoGroups)
+ {
+ var dg = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString());
+ var gg = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString());
+ deviceCodes.AddRange(dg);
+ deviceGroupCodes.AddRange(gg);
+ }
+
+ var gainfoFactoryDevicePermissions = devicePermissions.Where(x => x.TenantId == gainfo.Factory).ToList();
+ var dd = GetAssignCodesInternal(gainfoFactoryDevicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo);
+ var gd = GetAssignCodesInternal(gainfoFactoryDevicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo);
+ deviceCodes.AddRange(dd);
+ deviceGroupCodes.AddRange(gd);
+
+ var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory);
+ var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory);
+ deviceCodes.AddRange(du);
+ deviceGroupCodes.AddRange(gu);
+
+ var groupCodes = deviceGroupCodes.SelectMany(x => x.Codes).Distinct().ToList();
+ var deveiceCodesByGroup = deviceGroupRelationships.Where(x => groupCodes.Contains(x.GroupCode)).GroupBy(x => x.TenantId)
+ .Select(x => new UserTenantDeviceCodeDto
+ {
+ Tenant = x.Key,
+ Codes = x.Select(item => item.DeviceCode).Distinct().ToList()
+ });
+
+ deviceCodes.AddRange(deveiceCodesByGroup);
+
+ return deviceCodes.GroupBy(x => x.Tenant).Select(x => new UserTenantDeviceCodeDto
+ {
+ Tenant = x.Key,
+ Codes = x.SelectMany(item => item.Codes).Distinct().ToList()
+
+ }).ToList();
+ }
}
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs
index 28b2f66c..05184d1b 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceService.cs
@@ -1,18 +1,24 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
+using Dlhis.Entity.Canteen.Entities;
+using Dlhis.Entity.Canteen.Enums;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Device.Enums;
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;
using Microsoft.AspNetCore.Mvc;
+using MySqlX.XDevAPI.Relational;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
+using NPOI.OpenXmlFormats;
+using NPOI.SS.UserModel;
+using NPOI.XSSF.UserModel;
+using SqlSugar;
namespace Dlhis.Basic.Device.Services.Implements;
@@ -29,29 +35,57 @@ public class DeviceService : IDeviceService
{
var page = await _dbContext.Queryable()
.LeftJoin((d, dt) => d.TemplateCode == dt.Code)
+ .LeftJoin((d, dt, dr) => d.UniqueNo == dr.DeviceUniqueNo)
+ .LeftJoin((d, dt, dr, bp) => dr.BusinessPlaceCode == bp.Code)
.WhereIF(request.Type.HasValue, (d, dt) => d.Type == request.Type)
- .Select((d, dt) => new DevicePageResponse
+ .Select((d, dt, dr, bp) => new DevicePageResponse
{
FuncsStr = d.Funcs.ToString(),
Brand = dt.Brand,
Type = d.Type,
-
+ BusinessPlaceCode = bp.Code,
+ BusinessPlaceName = bp.Name,
+ LastHeartbeatTime = dr.LastHeartbeatTime
}, true)
.ToPageListAsync(request);
+ var deviceUniqueNos = page.Data.Select(x => x.UniqueNo).ToList();
+
+ var balanceInfos = await _dbContext.Queryable().Where(x => x.Type == BalanceRecordTypeEnumType.Out)
+ .Where(x => deviceUniqueNos.Contains(x.DeviceInfo))
+ .Select(x => new
+ {
+ x.DeviceInfo,
+ Amount = SqlFunc.AggregateSum(x.Amount),
+ UserCount = SqlFunc.AggregateDistinctCount(x.UserCode)
+ })
+ .GroupBy(x => x.DeviceInfo)
+ .ToListAsync();
+
+ page.Data.ForEach(device =>
+ {
+ var info = balanceInfos.FirstOrDefault(x => x.DeviceInfo == device.UniqueNo);
+ if (info != null)
+ {
+ device.Amount = info.Amount;
+ device.UserCount = info.UserCount;
+ }
+ });
+
return page;
}
- [Transactional]
+
public async Task SaveAsync(DeviceSaveRequest request)
{
await CheckUniqueNoExistsAsync(request);
var template = await CheckTemplateExistsAsync(request.TemplateCode);
await CheckTemplateFieldAsync(request.TemplateCode, request.ConnectionInfo);
+ DeviceEntity entity = null;
if (!request.Id.HasValue)
{
- var entity = request.Adapt();
+ entity = request.Adapt();
entity.Code = Guid.NewGuid();
await _dbContext.InsertAsync(entity);
//同时保存注册信息
@@ -72,7 +106,7 @@ public class DeviceService : IDeviceService
}
else
{
- var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
+ entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
entity.ThrowIfNull("设备不存在,无法更新");
//分类发生变化,检查是否存在分组
@@ -81,21 +115,94 @@ public class DeviceService : IDeviceService
var existsG = await _dbContext.Queryable()
.LeftJoin((dgr, dg) => dgr.GroupCode == dg.Code)
.Where((dgr, dg) => dgr.DeviceCode == entity.Code)
- .Where((dgr, dg) => dg.Type != null)
.AnyAsync();
existsG.ThrowIfTrue("存在设备分组,不可修改设备分类");
}
- var uniqueNo = entity.UniqueNo;
- request.Adapt(entity).UniqueNo = uniqueNo;
-
+ request.Adapt(entity);
await _dbContext.UpdateAsync(entity);
}
+
+ await GenerateUploadRecordLogForBeginTimeAsync(entity);
+ }
+
+ ///
+ /// 批量导入
+ ///
+ ///
+ ///
+ public async Task BulkUploadsAsync(BulkUploadsRequest request)
+ {
+ var lst = ImportFromExcel(request.FormFile);
+ var places = await _dbContext.Queryable().ToListAsync();
+
+ foreach (var form in lst)
+ {
+ if (form.PlaceeCode != null)
+ {
+ var place = places.Where(x => x.Code == form.PlaceeCode).FirstOrDefault();
+ place.ThrowIfNull($"该设备{form.UniqueNo}配置的营业点营业点不存在!");
+ }
+ //插入
+ var exists = await _dbContext.Queryable().Where(x => x.UniqueNo == form.UniqueNo)
+ .AnyAsync();
+ exists.ThrowIfTrue("唯一号已经存在");
+ var template = await CheckTemplateExistsAsync(form.TemplateCode);
+ await CheckTemplateFieldAsync(form.TemplateCode, form.ConnectionInfo);
+
+ var saveEntity = form.Adapt();
+ saveEntity.Code = Guid.NewGuid();
+ await _dbContext.InsertAsync(saveEntity);
+ //保存注册信息
+ var regis = await _dbContext.Queryable()
+ .Where(x => x.DeviceUniqueNo == form.UniqueNo)
+ .FirstAsync();
+ if(regis == null)
+ {
+ var custCode = places.Where(x => x.Code == form.PlaceeCode).Select(x => x.CustomCode).FirstOrDefault();
+ regis = new DeviceRegistryEntity
+ {
+ DeviceUniqueNo = form.UniqueNo,
+ LastHeartbeatTime = DateTime.Now,
+ RegisterTime = DateTime.Now,
+ BusinessPlaceCode = form.PlaceeCode,
+ BusinessPlaceCustomCode = custCode
+ };
+ await _dbContext.InsertAsync(regis);
+ }
+ }
}
//******************************************************** help methods **********************************************************
+ private async Task GenerateUploadRecordLogForBeginTimeAsync(DeviceEntity entity)
+ {
+ if (entity.Type == DeviceTypeEnumType.Door || entity.Type == DeviceTypeEnumType.Attendance)
+ {
+ var exists = await _dbContext.Queryable()
+ .Where(x => x.DeviceUniqueNo == entity.UniqueNo)
+ .Where(x => x.Type == DeviceUploadLogTypeEnumType.Raise)
+ .AnyAsync();
+
+ if (!exists)
+ {
+ await _dbContext.InsertAsync(new DeviceUploadLogEntity
+ {
+ DeviceUniqueNo = entity.UniqueNo,
+ Type = DeviceUploadLogTypeEnumType.Raise,
+ UserUniqueNo = string.Empty,
+ RaiseDateTime = entity.CreateTime,
+
+ CreatedBy = 1,
+ CreateTime = DateTime.Now,
+ ModifiedBy = 1,
+ ModifiedTime = DateTime.Now,
+ });
+ }
+ }
+ }
+
///
/// 检查设备模板是否存在
///
@@ -148,14 +255,15 @@ public class DeviceService : IDeviceService
///
private async Task CheckUniqueNoExistsAsync(DeviceSaveRequest request)
{
- var exists = await _dbContext.Queryable().Where(x => x.UniqueNo == request.UniqueNo)
+ var exists = await _dbContext.Queryable()
+ .Where(x => x.UniqueNo == request.UniqueNo)
.WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.AnyAsync();
exists.ThrowIfTrue("唯一号已经存在");
}
- [IgnoreTenant]
+
public async Task CheckExistsAsync(string deviceUniqueNo)
{
return await _dbContext.Queryable()
@@ -187,36 +295,81 @@ public class DeviceService : IDeviceService
{
var devices = await _dbContext.Queryable()
.Where(x => x.Enable)
+ .Where(x => x.Type == DeviceTypeEnumType.Attendance || (x.Type == DeviceTypeEnumType.Door && x.AsAttendance))
.Select(x => new DeviceResponse
{
FuncsStr = x.Funcs.ToString()
}, true)
.ToListAsync();
- return devices.Where(x => x.Funcs.Contains(DeviceFuncEnumType.Attendance)).ToList();
+ return devices.Where(x => x.Type == DeviceTypeEnumType.Attendance).ToList();
}
public async Task GetDeviceNumberAsync()
{
- var devices = await _dbContext.Queryable()
- .Where(x => x.Type == DeviceTypeEnumType.Attendance)
- .ToListAsync();
- var onlineNumber = devices.Where(x => x.Enable).Count();
- var offlineNumber = devices.Where(x => x.Enable == false).Count();
+ var devices = await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Attendance || (x.Type == DeviceTypeEnumType.Door && x.AsAttendance)).ToListAsync();
+
+ var offlineNumber = await GetOfflineDevicesCount(devices);
+
var res = new DeviceNumberResponse
{
- OnlineNumber = onlineNumber,
- OfflineNumber = offlineNumber,
- TotalNumber = devices.Count()
+ OfflineNumber = offlineNumber.Count,
+ TotalNumber = devices.Count,
+ OnlineNumber = devices.Count - offlineNumber.Count
};
return res;
}
+ ///
+ /// 获取离线设备
+ ///
+ ///
+ private async Task> GetOfflineDevicesCount(List devices)
+ {
+ var now = DateTime.Now;
+
+ var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList();
+
+ var deviceRegistries = await _dbContext.Queryable()
+ .LeftJoin((x, d) => x.DeviceUniqueNo == d.UniqueNo)
+ .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo))
+ .Select((x, d) => new
+ {
+ UniqueNo = d.UniqueNo,
+ d.HeartbeatInterval,
+ x.LastHeartbeatTime
+ })
+ .ToListAsync();
+
+ var OnlineDevices = deviceRegistries
+ .Where(x =>
+ {
+ if (x.HeartbeatInterval <= 0)
+ {
+ return true;
+ }
+
+ return x.LastHeartbeatTime.AddSeconds(x.HeartbeatInterval * 3) >= now;
+
+ })
+ .Select(x => new
+ {
+ UniqueNo = x.UniqueNo,
+ })
+ .ToList();
+ var onlineUniqueNos = new List();
+ OnlineDevices.ForEach(x => onlineUniqueNos.Add(x.UniqueNo));
+
+ var offUniqueNos = deviceUniqueNos.Except(onlineUniqueNos).ToList();
+ var list = devices.Where(x => offUniqueNos.Contains(x.UniqueNo)).ToList();
+ return list;
+ }
+
public async Task> GetAttendanceTotalAsync(AttendanceTotalRequest request)
{
var page = await _dbContext.Queryable()
.LeftJoin((d, dt) => d.TemplateCode == dt.Code)
- .Where(d => d.Type == DeviceTypeEnumType.Attendance)
+ .Where(d => d.Type == DeviceTypeEnumType.Attendance || (d.Type == DeviceTypeEnumType.Door && d.AsAttendance))
.Select((d, dt) => new DevicePageResponse
{
FuncsStr = d.Funcs.ToString(),
@@ -231,9 +384,37 @@ public class DeviceService : IDeviceService
public async Task> GetAttendanceOfflineAsync(DeviceOnlineAndofflineRequest request)
{
+ var devices = await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Attendance || (x.Type == DeviceTypeEnumType.Door && x.AsAttendance)).ToListAsync();
+
+ //离线
+ var offDevices = await GetOfflineDevicesCount(devices);
+ var offids = offDevices.Select(x => x.Id).ToList();
+
+ if (request.IsOnAndOff)
+ {
+ //离线
+ var offpage = await _dbContext.Queryable()
+ .LeftJoin((d, dt) => d.TemplateCode == dt.Code)
+ .Where(d => d.Type == DeviceTypeEnumType.Attendance)
+ .Where(d => offids.Contains(d.Id))
+ .Select((d, dt) => new DevicePageResponse
+ {
+ FuncsStr = d.Funcs.ToString(),
+ Brand = dt.Brand,
+ Type = d.Type,
+
+ }, true)
+ .ToPageListAsync(request);
+ return offpage;
+ }
+ //在线
+ var ids = devices.Select(x => x.Id).ToList();
+ List onids = ids.Except(offids).ToList();
+
var page = await _dbContext.Queryable()
.LeftJoin((d, dt) => d.TemplateCode == dt.Code)
- .Where(d => d.Type == DeviceTypeEnumType.Attendance && d.Enable == request.IsOnAndOff)
+ .Where(d => d.Type == DeviceTypeEnumType.Attendance)
+ .Where(d => onids.Contains(d.Id))
.Select((d, dt) => new DevicePageResponse
{
FuncsStr = d.Funcs.ToString(),
@@ -246,7 +427,52 @@ public class DeviceService : IDeviceService
return page;
}
- public async Task> GetRecentNumbersAsync()
+ public async Task> GetDoorOfflineAsync(GetDoorOfflineRequest request)
+ {
+ var devices = await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Door).ToListAsync();
+
+ var offDevices = await GetOfflineDevicesCount(devices);
+ var offids = offDevices.Select(x => x.Id).ToList();
+
+ if (request.IsOnAndOff)
+ {
+ //离线
+ var offpage = await _dbContext.Queryable()
+ .LeftJoin((d, dt) => d.TemplateCode == dt.Code)
+ .Where(d => d.Type == DeviceTypeEnumType.Door)
+ .Where(d => offids.Contains(d.Id))
+ .Select((d, dt) => new DevicePageResponse
+ {
+ FuncsStr = d.Funcs.ToString(),
+ Brand = dt.Brand,
+ Type = d.Type,
+
+ }, true)
+ .ToPageListAsync(request);
+ return offpage;
+ }
+ //在线
+ var ids = devices.Select(x => x.Id).ToList();
+ List onids = ids.Except(offids).ToList();
+
+ var page = await _dbContext.Queryable()
+ .LeftJoin((d, dt) => d.TemplateCode == dt.Code)
+ .Where(d => d.Type == DeviceTypeEnumType.Door)
+ .Where(d => onids.Contains(d.Id))
+ .Select((d, dt) => new DevicePageResponse
+ {
+ FuncsStr = d.Funcs.ToString(),
+ Brand = dt.Brand,
+ Type = d.Type,
+
+ }, true)
+ .ToPageListAsync(request);
+
+ return page;
+
+ }
+
+ public async Task> GetRecentNumbersAsync()
{
//获取近30天并转化为"yyyy-MM-dd"集合
DateTime currentDate = DateTime.Now;
@@ -258,15 +484,84 @@ public class DeviceService : IDeviceService
times.Add(dateString);
}
- var devices = await _dbContext.Queryable().ToListAsync();
+ var devices = await _dbContext.Queryable().Where(x => x.Type == DeviceTypeEnumType.Attendance || (x.Type == DeviceTypeEnumType.Door && x.AsAttendance)).ToListAsync();
- var dic = new Dictionary();
+ var list = new List();
times.ForEach(time =>
{
var count = devices.Where(x => x.CreateTime.ToString("yyyy-MM-dd") == time).Count();
- dic[time] = count;
+ var res = new RecentNumberResponse
+ {
+ Date = time,
+ Num = count,
+ };
+ list.Add(res);
});
- return dic;
+
+ return list;
+ }
+ private List ImportFromExcel(IFormFile formFile)
+ {
+ var requests = new List();
+
+ using (var stream = formFile.OpenReadStream())
+ {
+ XSSFWorkbook workbook = new XSSFWorkbook(stream);
+ ISheet sheet = workbook.GetSheetAt(0);
+
+ for (int rowIdx = 1; rowIdx <= sheet.LastRowNum; rowIdx++)
+ {
+ IRow row = sheet.GetRow(rowIdx);
+ if (row == null) continue;
+
+ var request = new ImportDeviceSaveRequest();
+
+ request.UniqueNo = row.GetCell(0).ToString();
+ request.TemplateCode = Guid.Parse(row.GetCell(1).ToString());
+ request.Supplier = row.GetCell(2).ToString();
+
+ var funs = new List();
+ var fs = row.GetCell(3).ToString().Split(',');
+ foreach (string str in fs)
+ {
+ switch (str)
+ {
+ case "1":
+ funs.Add(DeviceFuncEnumType.Face);
+ break;
+ case "2":
+ funs.Add(DeviceFuncEnumType.Card);
+ break;
+ case "3":
+ funs.Add(DeviceFuncEnumType.QrCode);
+ break;
+ case "4":
+ funs.Add(DeviceFuncEnumType.Control);
+ break;
+ default:
+ break;
+ }
+ }
+ request.Funcs = funs;
+ request.Type = (DeviceTypeEnumType)Enum.Parse(typeof(DeviceTypeEnumType), row.GetCell(4).ToString());
+ request.HeartbeatInterval = int.Parse(row.GetCell(5).ToString());
+ request.DeployPlace = row.GetCell(6).ToString();
+ request.DeployPosition = row.GetCell(7).ToString();
+ request.DeployDirection = row.GetCell(8).ToString();
+ request.ConnectionInfo = row.GetCell(9).ToString();
+ request.Enable = Convert.ToBoolean(Convert.ToInt32(row.GetCell(10).ToString()));
+ request.AsAttendance = Convert.ToBoolean(Convert.ToInt32(row.GetCell(11).ToString()));
+ if (row.GetCell(12) != null)
+ {
+ request.PlaceeCode = Guid.Parse(row.GetCell(12)?.ToString());
+ }
+ requests.Add(request);
+ }
+ }
+
+ return requests;
}
}
+
+
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs
index 4f60c45d..c9c7accb 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceTemplateService.cs
@@ -46,6 +46,7 @@ public class DeviceTemplateService : IDeviceTemplateService
{
var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync();
await ExistsDeviceUsingTemplateAsync(entity.Code);
+ request.Adapt(entity);
await _dbContext.UpdateAsync(entity);
}
}
diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj
index 6dc23042..d0e8b356 100644
--- a/Src/Dlhis.Basic/Dlhis.Basic.csproj
+++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj
@@ -17,9 +17,8 @@
-