qinchaoyue 5 дней назад
Родитель
Сommit
fdbf6fa019

+ 1 - 1
src/Hotline.Application/Snapshot/Contracts/ISnapshotUserApplication.cs

@@ -7,5 +7,5 @@ public interface ISnapshotUserApplication
 {
     ISugarQueryable<CitizenRelationSafetyTypeOutDto> GetCitizenRelationSafetyType(CitizenRelationSafetyTypeInDto dto);
 
-    Task<string> AddCitizenRelationSafetyType(AddCitizenRelationSafetyTypeInDto dto, CancellationToken token);
+    Task AddCitizenRelationSafetyType(AddCitizenRelationSafetyTypeInDto dto, CancellationToken token);
 }

+ 24 - 37
src/Hotline.Application/Snapshot/SnapshotUserApplication.cs

@@ -9,6 +9,7 @@ using Hotline.Snapshot;
 using Hotline.Snapshot.IRepository;
 using Hotline.ThirdAccountDomainServices;
 using Hotline.Tools;
+using Mapster;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -23,60 +24,46 @@ namespace Hotline.Application.Snapshot;
 
 public class SnapshotUserApplication : ISnapshotUserApplication, IScopeDependency
 {
-    private readonly IRepository<CitizenRelationSafetyType> _citizenRelationSafetyTypeRepository;
     private readonly ICitizenRepository _citizenRepository;
     private readonly ISystemDicDataCacheManager _dicData;
+    private readonly IRepository<SafetyType> _safetyTypeRepository;
 
-    public SnapshotUserApplication(IRepository<CitizenRelationSafetyType> citizenRelationSafetyTypeRepository, ICitizenRepository citizenRepository, ISystemDicDataCacheManager dicData)
+    public SnapshotUserApplication(ICitizenRepository citizenRepository, ISystemDicDataCacheManager dicData, IRepository<SafetyType> safetyTypeRepository)
     {
-        _citizenRelationSafetyTypeRepository = citizenRelationSafetyTypeRepository;
         _citizenRepository = citizenRepository;
         _dicData = dicData;
+        _safetyTypeRepository = safetyTypeRepository;
     }
 
-    public async Task<string> AddCitizenRelationSafetyType(AddCitizenRelationSafetyTypeInDto dto, CancellationToken token)
+    public async Task AddCitizenRelationSafetyType(AddCitizenRelationSafetyTypeInDto dto, CancellationToken token)
     {
         dto.ValidateObject();
-        var safetyType = _dicData.SafetyType.FirstOrDefault(m => m.DicDataValue == dto.DicDataValue);
-        if (safetyType == null) UserFriendlyException.SameMessage("志愿者类型错误");
-        await _citizenRepository.Queryable()
-            .LeftJoin<ThirdAccount>((citizen, account) => account.ExternalId == citizen.Id)
-            .Where(citizen => citizen.PhoneNumber == dto.PhoneNumber)
-            .Select((citizen, account) => citizen.Id)
-            .FirstAsync(token)
-            .Then(async citizenId =>
-            {
-                var relationEntity = await _citizenRelationSafetyTypeRepository.Queryable()
-                    .Where(m => m.CitizenId == citizenId && m.SafetyTypeValue == dto.DicDataValue)
-                    .FirstAsync(token);
-                if (relationEntity != null) return string.Empty;
-                relationEntity = new CitizenRelationSafetyType
-                {
-                    CitizenId = citizenId,
-                    Name = dto.Name,
-                    SafetyTypeValue = dto.DicDataValue
-                };
-                return await _citizenRelationSafetyTypeRepository.AddAsync(relationEntity, token);
-            }, nullCache => 
-            { 
-                throw UserFriendlyException.SameMessage("微信用户不存在");
-            });
 
-        return string.Empty;
+        var safeType = new SafetyType
+        {
+            Id = dto.SafetyTypeId
+        };
+        foreach (var item in dto.CitizenIds)
+        {
+            safeType.Citizens.Add(new Citizen { Id = item });
+        }
+
+        _safetyTypeRepository.AddNav(safeType);
     }
 
     public ISugarQueryable<CitizenRelationSafetyTypeOutDto> GetCitizenRelationSafetyType(CitizenRelationSafetyTypeInDto dto)
     {
-        var query = _citizenRelationSafetyTypeRepository.Queryable()
-            .LeftJoin<SystemDicData>((relation, dicData) => relation.SafetyTypeValue == dicData.DicDataValue && dicData.DicTypeCode == SysDicTypeConsts.SafetyType)
-            .LeftJoin<Citizen>((relation, dicData, citizen) => citizen.Id == relation.CitizenId)
-            .WhereIF(dto.SafetyTypeValue.NotNullOrEmpty(), (relation, dicData) => relation.SafetyTypeValue == dto.SafetyTypeValue)
-            .Select((relation, dicData, citizen) => new CitizenRelationSafetyTypeOutDto
+        var query = _citizenRepository.Queryable()
+            .LeftJoin<CitizenRelationSafetyType>((citizen, relation) => citizen.Id == relation.CitizenId)
+            .LeftJoin<SafetyType>((citizen, relation, safety) => relation.SafetyTypeId == safety.Id)
+            .WhereIF(dto.SafetyTypeId.NotNullOrEmpty(), (citizen, relation, safety) => safety.Id == dto.SafetyTypeId)
+            .Select((citizen, relation, safety) => new CitizenRelationSafetyTypeOutDto
             {
-                CitizenRelationSafetyTypeId = relation.Id,
-                Name = relation.Name,
+                CitizenId = citizen.Id,
+                CitizenName = citizen.Name,
                 PhoneNumber = citizen.PhoneNumber,
-                SafetyTypeTxt = dicData.DicDataName,
+                SafetyTypeName = safety.Name,
+                SafetyTypeId = safety.Id
             });
         return query;
     }

+ 19 - 0
src/Hotline.Repository.SqlSugar/Snapshot/SafetyTypeRepository.cs

@@ -0,0 +1,19 @@
+using Hotline.Repository.SqlSugar.DataPermissions;
+using Hotline.Snapshot;
+using Hotline.Snapshot.IRepository;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+
+namespace Hotline.Repository.SqlSugar.Snapshot;
+
+public class SafetyTypeRepository : BaseRepository<SafetyType>, ISafetyTypeRepository, IScopeDependency
+{
+    public SafetyTypeRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider) : base(uow, dataPermissionFilterBuilder, serviceProvider)
+    {
+    }
+}

+ 12 - 18
src/Hotline.Share/Dtos/Snapshot/SnapshotUserInfoDto.cs

@@ -56,7 +56,7 @@ public record CitizenRelationSafetyTypeInDto : PagedRequest
     /// <summary>
     /// 志愿者类型
     /// </summary>
-    public string? SafetyTypeValue { get; set; }
+    public string? SafetyTypeId { get; set; }
 }
 
 public class CitizenRelationSafetyTypeOutDto
@@ -64,17 +64,22 @@ public class CitizenRelationSafetyTypeOutDto
     /// <summary>
     /// Id
     /// </summary>
-    public string CitizenRelationSafetyTypeId { get; set; }
+    public string CitizenId { get; set; }
 
     /// <summary>
     /// 用户名
     /// </summary>
-    public string? Name { get; set; }
+    public string? CitizenName { get; set; }
 
     /// <summary>
     /// 志愿者类型名称
     /// </summary>
-    public string SafetyTypeTxt { get; set; }
+    public string SafetyTypeName { get; set; }
+
+    /// <summary>
+    /// id
+    /// </summary>
+    public string SafetyTypeId { get; set; }
 
     /// <summary>
     /// 电话号码
@@ -88,22 +93,11 @@ public class AddCitizenRelationSafetyTypeInDto
     /// 志愿者类型
     /// </summary>
     [Required(ErrorMessage = "请选择志愿者类型")]
-    public string DicDataValue { get; set; }
-
-    /// <summary>
-    /// 名字
-    /// </summary>
-    public string? Name { get; set; }
-
-    /// <summary>
-    /// 联系方式
-    /// </summary>
-    [Required(ErrorMessage = "请输入联系方式")]
-    public string PhoneNumber { get; set; }
+    public string SafetyTypeId { get; set; }
 
     /// <summary>
-    /// 备注
+    /// 市民Id
     /// </summary>
-    public string? Remark { get; set; }
+    public IList<string> CitizenIds { get; set; }
 }
 

+ 3 - 0
src/Hotline/Orders/Citizen.cs

@@ -8,6 +8,7 @@ using Hotline.Orders;
 using Hotline.Quality;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Snapshot;
+using Hotline.Snapshot;
 using SqlSugar;
 using XF.Domain.Repository;
 
@@ -118,5 +119,7 @@ namespace Hotline.Orders
         public bool? IsSecurityMax { get; set; }
         #endregion
 
+		[Navigate(typeof(CitizenRelationSafetyType), nameof(CitizenRelationSafetyType.CitizenId), nameof(CitizenRelationSafetyType.SafetyTypeId))]
+        public List<SafetyType> SafetyTypes { get; set; }
     }
 }

+ 8 - 9
src/Hotline/Snapshot/CitizenRelationSafetyType.cs

@@ -4,6 +4,9 @@ using XF.Domain.Entities;
 
 namespace Hotline.Snapshot;
 
+/// <summary>
+/// 市民关联随手拍安全角色分类
+/// </summary>
 [Description("市民关联随手拍安全角色分类")]
 public class CitizenRelationSafetyType : ITable, IEntity<string>
 {
@@ -15,19 +18,15 @@ public class CitizenRelationSafetyType : ITable, IEntity<string>
 
     /// <summary>
     /// 市民Id
+    /// <inheritdoc cref="Hotline.Orders.Citizen"/>
     /// </summary>
     [SugarColumn(ColumnDescription = "市民Id")]
     public string CitizenId { get; set; }
 
     /// <summary>
-    /// 字典类型value
+    /// 安全员类型Id
+    /// <inheritdoc cref="SafetyType"/>
     /// </summary>
-    [SugarColumn(ColumnDescription = "字典类型value")]
-    public string SafetyTypeValue { get; set; }
-
-    /// <summary>
-    /// 用户名
-    /// </summary>
-    [SugarColumn(ColumnDescription = "用户名")]
-    public string? Name { get; set; }
+    [SugarColumn(ColumnDescription = "安全员类型Id")]
+    public string SafetyTypeId { get; set; }
 }

+ 12 - 0
src/Hotline/Snapshot/IRepository/ISafetyTypeRepository.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Snapshot.IRepository;
+
+public interface ISafetyTypeRepository : IRepository<SafetyType>
+{
+}

+ 23 - 0
src/Hotline/Snapshot/SafetyType.cs

@@ -0,0 +1,23 @@
+using Hotline.Identity.Accounts;
+using Hotline.Orders;
+using SqlSugar;
+using System.ComponentModel;
+using XF.Domain.Repository;
+
+namespace Hotline.Snapshot;
+
+/// <summary>
+/// 安全卫士类型 
+/// </summary>
+[Description("安全卫士类型")]
+public class SafetyType : CreationSoftDeleteEntity
+{
+    /// <summary>
+    /// 名字
+    /// </summary>
+    [SugarColumn(ColumnDescription = "安全卫士类型名称")]
+    public string Name { get; set; }
+
+    [Navigate(typeof(CitizenRelationSafetyType), nameof(CitizenRelationSafetyType.SafetyTypeId), nameof(CitizenRelationSafetyType.CitizenId))]
+    public List<Citizen> Citizens { get; set; }
+}

+ 19 - 12
test/Hotline.Tests/Application/SnapshotUserApplicationTest.cs

@@ -6,7 +6,9 @@ using Hotline.Identity.Roles;
 using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos.Snapshot;
+using Hotline.Share.Tools;
 using Hotline.Snapshot;
+using Hotline.Snapshot.IRepository;
 using Hotline.ThirdAccountDomainServices;
 using Hotline.ThirdAccountDomainServices.Interfaces;
 using Hotline.Users;
@@ -23,40 +25,45 @@ public class SnapshotUserApplicationTest : TestBase
     private readonly ISnapshotUserApplication _snapshotUserApplication;
     private readonly ISystemDicDataCacheManager _dicData;
     private readonly ICitizenRepository _citizenRepository;
-    public SnapshotUserApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdIdentiyService, IThirdAccountRepository thirdAccountRepository, ITypedCache<SystemSetting> cacheSettingData, ThirdAccounSupplierFactory thirdAccountDomainFactory, IServiceProvider serviceProvider, ISnapshotUserApplication snapshotUserApplication, ISystemDicDataCacheManager dicData, ICitizenRepository citizenRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdIdentiyService, thirdAccountRepository, cacheSettingData, thirdAccountDomainFactory, serviceProvider)
+    private readonly ISafetyTypeRepository _safetyTypeRepository;
+    public SnapshotUserApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdIdentiyService, IThirdAccountRepository thirdAccountRepository, ITypedCache<SystemSetting> cacheSettingData, ThirdAccounSupplierFactory thirdAccountDomainFactory, IServiceProvider serviceProvider, ISnapshotUserApplication snapshotUserApplication, ISystemDicDataCacheManager dicData, ICitizenRepository citizenRepository, ISafetyTypeRepository safetyTypeRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdIdentiyService, thirdAccountRepository, cacheSettingData, thirdAccountDomainFactory, serviceProvider)
     {
         _snapshotUserApplication = snapshotUserApplication;
         _dicData = dicData;
         _citizenRepository = citizenRepository;
+        _safetyTypeRepository = safetyTypeRepository;
     }
 
     [Fact]
     public async Task SnapshotUserApplication_Test()
     {
-        var dic = _dicData.SafetyType.First();
-        var dicDataValue = dic.DicDataValue;
+        var newSafetyType = new SafetyType { Name = "安全卫士" };
+        var safetyType = await _safetyTypeRepository.Queryable().Where(m => m.Name == newSafetyType.Name).FirstAsync();
+        if (newSafetyType == null)
+            safetyType.Id = await _safetyTypeRepository.AddAsync(newSafetyType);
+
         var citizen = await _citizenRepository.Queryable()
             .LeftJoin<CitizenRelationSafetyType>((citizen, relation) => relation.CitizenId == citizen.Id)
             .Where((citizen, relation) => relation.Id == null)
             .FirstAsync();
         var addDto = new AddCitizenRelationSafetyTypeInDto
         {
-            DicDataValue = dicDataValue,
-            PhoneNumber = citizen.PhoneNumber,
-            Name = citizen.Name
+            CitizenIds = [citizen.Id],
+            SafetyTypeId = safetyType.Id,
         };
 
-        var relationId = await _snapshotUserApplication.AddCitizenRelationSafetyType(addDto, CancellationToken.None);
-        relationId.ShouldNotBeNull();
+        await _snapshotUserApplication.AddCitizenRelationSafetyType(addDto, CancellationToken.None);
 
         var inDto = new CitizenRelationSafetyTypeInDto
         {
+            SafetyTypeId = safetyType.Id
         };
         var items = await _snapshotUserApplication.GetCitizenRelationSafetyType(inDto).ToListAsync();
-        var item = items.FirstOrDefault(m => m.CitizenRelationSafetyTypeId == relationId);
+        var item = items.FirstOrDefault(m => m.CitizenId == citizen.Id && m.SafetyTypeId == safetyType.Id);
         item.ShouldNotBeNull();
-        item.Name.ShouldBe(addDto.Name);
-        item.PhoneNumber.ShouldBe(addDto.PhoneNumber);
-        item.SafetyTypeTxt.ShouldBe(dic.DicDataName);
+        item.SafetyTypeName.ShouldBe(safetyType.Name);
+        item.SafetyTypeId.ShouldBe(safetyType.Id);
+        item.CitizenId.ShouldBe(citizen.Id);
+        item.CitizenName.ShouldBe(citizen.Name);
     }
 }