diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs
new file mode 100644
index 00000000..0177d5c5
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs
@@ -0,0 +1,56 @@
+using Dlhis.Basic.Device.Request;
+using Dlhis.Basic.Device.Response;
+using Dlhis.Basic.Device.Services;
+using Kurisu.AspNetCore.DataAccess.Dto;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Dlhis.Basic.Device.Controllers;
+
+[Authorize]
+[Route("api/[controller]")]
+[ApiController]
+public class DevicePermissionManuallyController : ControllerBase
+{
+ private readonly IDevicePermissionManuallyService _devicePermissionService;
+
+ public DevicePermissionManuallyController(IDevicePermissionManuallyService devicePermissionService)
+ {
+ _devicePermissionService = devicePermissionService;
+ }
+
+ ///
+ /// 数据分页
+ ///
+ ///
+ ///
+ [HttpGet("page")]
+ [DataPermission]
+ public async Task> GetPageAsync([FromQuery] PageDto requestDto)
+ {
+ return await _devicePermissionService.GetPageAsync(requestDto);
+ }
+
+ ///
+ /// 添加权限
+ ///
+ ///
+ [HttpPost("add")]
+ [Transactional]
+ public async Task AddAsync(DevicePermissionManuallyAddRequest request)
+ {
+ await _devicePermissionService.AddAsync(request);
+ }
+
+ ///
+ /// 删除权限
+ ///
+ ///
+ [HttpGet("{id:long}")]
+ [Transactional]
+ public async Task DeleteAsync(long id)
+ {
+ await _devicePermissionService.DeleteAsync(id);
+ }
+}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs
new file mode 100644
index 00000000..2ae23a8e
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs
@@ -0,0 +1,11 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Dlhis.Basic.Device.Request;
+
+public class DevicePermissionManuallyAddRequest
+{
+ public Guid DeviceCode { get; set; }
+
+ [Required]
+ public string UserNo { get; set; }
+}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs b/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs
new file mode 100644
index 00000000..4ca605e6
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs
@@ -0,0 +1,11 @@
+namespace Dlhis.Basic.Device.Response;
+
+public class DevicePermissionManuallyResponse
+{
+ public long Id { get; set; }
+ public Guid DeviceCode { get; set; }
+ public string DeviceUniqueNo { get; set; }
+ public string DeployPlace { get; set; }
+ public string UserNo { get; set; }
+ public string UserName { get; set; }
+}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionManuallyService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionManuallyService.cs
new file mode 100644
index 00000000..e2a6149b
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionManuallyService.cs
@@ -0,0 +1,14 @@
+using Dlhis.Basic.Device.Request;
+using Dlhis.Basic.Device.Response;
+using Kurisu.AspNetCore.DataAccess.Dto;
+
+namespace Dlhis.Basic.Device.Services;
+
+public interface IDevicePermissionManuallyService : IScopeDependency
+{
+ Task> GetPageAsync(PageDto requestDto);
+
+ Task AddAsync(DevicePermissionManuallyAddRequest request);
+
+ Task DeleteAsync(long id);
+}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs
new file mode 100644
index 00000000..9c09542e
--- /dev/null
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs
@@ -0,0 +1,103 @@
+using Dlhis.Basic.Device.Request;
+using Dlhis.Basic.Device.Response;
+using Dlhis.Entity.Basic.Entity;
+using Dlhis.Entity.Device.Entities;
+using Dlhis.Entity.Device.Enums;
+using Kurisu.AspNetCore.DataAccess.Dto;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
+using Kurisu.AspNetCore.Utils.Extensions;
+
+namespace Dlhis.Basic.Device.Services.Implements;
+
+public class DevicePermissionManuallyService : IDevicePermissionManuallyService
+{
+ private readonly IDbContext _dbContext;
+
+ public DevicePermissionManuallyService(IDbContext dbContext)
+ {
+ _dbContext = dbContext;
+ }
+
+ ///
+ public async Task> GetPageAsync(PageDto requestDto)
+ {
+ return await _dbContext.Queryable()
+ .LeftJoin((x, d) => x.DeviceCode == d.Code)
+ .LeftJoin((x, d, g) => x.UserNo == g.No)
+ .Select((x, d, g) => new DevicePermissionManuallyResponse
+ {
+ Id = x.Id,
+ DeviceCode = x.DeviceCode,
+ DeviceUniqueNo = d.UniqueNo,
+ DeployPlace = d.DeployPlace,
+ UserNo = x.UserNo,
+ UserName = g.Name
+ })
+ .ToPageListAsync(requestDto);
+ }
+
+ ///
+ public async Task AddAsync(DevicePermissionManuallyAddRequest request)
+ {
+ var device = await _dbContext.Queryable().Where(x => x.Code == request.DeviceCode).SingleAsync();
+ device.ThrowIfNull("设备不存在");
+
+ var gainfo = await _dbContext.Queryable().Where(x => x.No == request.UserNo).SingleAsync();
+ gainfo.ThrowIfNull("人员不存在");
+
+
+ await _dbContext.InsertAsync(new DevicePermissionManuallyEntity
+ {
+ DeviceCode = request.DeviceCode,
+ UserNo = request.UserNo
+ });
+
+ await _dbContext.InsertAsync(new DeviceTaskEntity
+ {
+ Type = DeviceTaskEnumType.Add,
+ DeviceType = device.Type,
+ UserId = null,
+ UserNo = request.UserNo,
+ DeviceUniqueNo = device.UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Version = 0,
+ ResultMessage = null,
+ Source = "手动分配额外权限",
+ Priority = 0,
+ TenantId = device.TenantId
+ });
+ }
+
+ ///
+ public async Task DeleteAsync(long id)
+ {
+ var data = await _dbContext.Queryable().Where(x => x.Id == id).SingleAsync();
+ data.ThrowIfNull("数据不存在");
+
+ var device = await _dbContext.Queryable().Where(x => x.Code == data.DeviceCode).SingleAsync();
+ if (device != null)
+ {
+ var userNo = await _dbContext.Queryable().Where(x => x.No == data.UserNo).Select(x => x.No).SingleAsync();
+ if (userNo.IsPresent())
+ {
+ await _dbContext.InsertAsync(new DeviceTaskEntity
+ {
+ Type = DeviceTaskEnumType.Delete,
+ DeviceType = device.Type,
+ UserId = null,
+ UserNo = userNo,
+ DeviceUniqueNo = device.UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Version = 0,
+ ResultMessage = null,
+ Source = "手动分配额外权限",
+ Priority = 0,
+ TenantId = device.TenantId
+ });
+ }
+ }
+
+ await _dbContext.DeleteAsync(data);
+ }
+}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs
index 144508a2..032787e1 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs
@@ -256,7 +256,7 @@ public class GainfoService : IGainfoService
await _gainfoPermissionService.ResetPermissionsAsync(gainfo.No, DeviceTaskEnumType.Delete, null, request.Reason);
- await _dbContext.Deleteable().Where(x => x.UserNo != gainfo.No).ExecuteCommandAsync();
+ await _dbContext.Deleteable().Where(x => x.UserNo == gainfo.No).ExecuteCommandAsync();
await _dbContext.Deleteable().Where(x => x.AssignType == AssignTypeEnumType.User && x.AssignValue == gainfo.No).ExecuteCommandAsync();
//先写入离职表
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs
index 0f467016..50a410a9 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs
@@ -302,7 +302,7 @@ public class GainfoUpdateService : IGainfoUpdateService
await _dbContext.Client.Insertable(gainfo).AS("GainfoLeave").ExecuteCommandAsync();
}
- await _dbContext.Deleteable().Where(x => x.UserNo != gainfo.No).ExecuteCommandAsync();
+ await _dbContext.Deleteable().Where(x => x.UserNo == gainfo.No).ExecuteCommandAsync();
await _dbContext.Deleteable().Where(x => x.AssignType == AssignTypeEnumType.User && x.AssignValue == gainfo.No).ExecuteCommandAsync();
gainfo.Id = gainfo.IdentityUserId;
diff --git a/Src/Dlhis.Entity/Device/Entities/DevicePermissionManuallyEntity.cs b/Src/Dlhis.Entity/Device/Entities/DevicePermissionManuallyEntity.cs
new file mode 100644
index 00000000..e61a1f73
--- /dev/null
+++ b/Src/Dlhis.Entity/Device/Entities/DevicePermissionManuallyEntity.cs
@@ -0,0 +1,23 @@
+using Dlhis.DataPermission.Model;
+using Kurisu.AspNetCore.DataAccess.Entity;
+using Kurisu.AspNetCore.DataAccess.SqlSugar;
+using SqlSugar;
+
+namespace Dlhis.Entity.Device.Entities;
+
+///
+/// 设备权限(手动)
+///
+[SugarTable(TableName = "DevicePermissionManually")]
+public class DevicePermissionManuallyEntity : SugarBaseEntity, ISoftDeleted
+{
+ [DeviceCode]
+ [SugarColumn(IsNullable = false)]
+ public Guid DeviceCode { get; set; }
+
+ [SugarColumn(IsNullable = false)]
+ public string UserNo { get; set; }
+
+ ///
+ public bool IsDeleted { get; set; }
+}
\ No newline at end of file