Browse Source

Merge branch 'feature/snapshot' into dev

qinchaoyue 3 days ago
parent
commit
63ac6ae8f1

+ 1 - 1
src/Hotline.Api/Controllers/IdentityController.cs

@@ -126,7 +126,7 @@ jxrWXHbT1FB6DqkdOnBbQqS1Azqz5HxLlSyEK3F60e3SgB5iZsDZ
     /// 第三方登录
     /// </summary>
     /// <param name=""></param>
-    /// <param name="_identityAppService"></param>
+    /// <param name=""></param>
     /// <param name=""></param>
     /// <param name=""></param>
     /// <returns></returns>

+ 9 - 16
src/Hotline.Api/Controllers/Snapshot/SnapshotBulletinController.cs

@@ -15,6 +15,7 @@ using Hotline.Share.Tools;
 using XF.Utility.EnumExtensions;
 using Hotline.Snapshot.IRepository;
 using Hotline.Application.Snapshot.Contracts;
+using Hotline.Share.Dtos.Settings;
 
 namespace Hotline.Api.Controllers.Snapshot;
 
@@ -22,18 +23,17 @@ public class SnapshotBulletinController : BaseController
 {
     private readonly ISnapshotBulletinRepository _bulletinRepository;
     private readonly ISnapshotBulletinApplication _bulletinApplication;
-    private readonly ISessionContext _sessionContext;
     private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
     private readonly ISystemOrganizeRepository _organizeRepository;
-    private readonly INotificationApplication _notificationApplication;
+    private readonly ISafetyTypeRepository _safetyTypeRepository;
 
-    public SnapshotBulletinController(ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, ISystemDicDataCacheManager systemDicDataCacheManager, ISystemOrganizeRepository organizeRepository, ISnapshotBulletinApplication bulletinApplication)
+    public SnapshotBulletinController(ISnapshotBulletinRepository bulletinRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISystemOrganizeRepository organizeRepository, ISnapshotBulletinApplication bulletinApplication, ISafetyTypeRepository safetyTypeRepository)
     {
         _bulletinRepository = bulletinRepository;
-        _sessionContext = sessionContext;
         _systemDicDataCacheManager = systemDicDataCacheManager;
         _organizeRepository = organizeRepository;
         _bulletinApplication = bulletinApplication;
+        _safetyTypeRepository = safetyTypeRepository;
     }
 
     #region 公告
@@ -108,18 +108,7 @@ public class SnapshotBulletinController : BaseController
     /// <returns></returns>
     [HttpGet("bulletin/commit")]
     public async Task CommitBulletin(string id)
-    {
-        var bulletin = await _bulletinRepository.GetAsync(id, HttpContext.RequestAborted);
-        if (bulletin == null)
-            throw UserFriendlyException.SameMessage("无效数据");
-
-        if (bulletin.BulletinState != EBulletinState.Draft && bulletin.BulletinState != EBulletinState.ReviewNoPass)
-            throw UserFriendlyException.SameMessage("当前状态不能提交");
-
-        bulletin.BulletinState = EBulletinState.InReview;
-        bulletin.CommitTime = DateTime.Now;
-        await _bulletinRepository.UpdateAsync(bulletin, HttpContext.RequestAborted);
-    }
+        => await _bulletinApplication.CommitBulletinAsync(id, HttpContext.RequestAborted);
 
     /// <summary>
     /// 修改公告
@@ -190,11 +179,15 @@ public class SnapshotBulletinController : BaseController
     [HttpGet("bulletin/addbasedata")]
     public async Task<object> BulletinAddBaseData()
     {
+        var safetyTypes = await _safetyTypeRepository.Queryable()
+            .Select(m => new SystemDicDataOutDto { Id =  m.Id, DicDataName = m.Name , DicDataValue = m.Id})
+            .ToListAsync(HttpContext.RequestAborted);
         var rsp = new
         {
             BulletinType = _systemDicDataCacheManager.SnapshotBulletinType,
             BulletinSource = _systemDicDataCacheManager.SnapshotBulletinSource,
             OrgsOptions = await _organizeRepository.GetOrgJson(),
+            SafetyTypes = safetyTypes
         };
         return rsp;
     }

+ 9 - 0
src/Hotline.Api/Controllers/Snapshot/SnapshotUserController.cs

@@ -62,4 +62,13 @@ public class SnapshotUserController : BaseController
     [HttpDelete("citizen_relation")]
     public async Task DeleteCitizenRelationSafetyType([FromBody] DeleteCitizenRelationSafetyTypeInDto dto)
         => await _snapshotUserApplication.DeleteCitizenRelationSafetyAsync(dto);
+
+    /// <summary>
+    /// 搜索安全志愿者
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("citizen")]
+    public async Task<PagedDto<GetThirdCitizenOutDto>> GetThirdCitizenAsync([FromQuery] GetThirdCitizenInDto dto)
+        => (await _snapshotUserApplication.GetThirdCitizenAsync(dto).ToPagedListAsync(dto)).ToPaged();
 }

+ 1 - 0
src/Hotline.Application/Snapshot/Contracts/ISnapshotBulletinApplication.cs

@@ -41,4 +41,5 @@ public interface ISnapshotBulletinApplication
     /// <returns></returns>
     string GetSiteUrls(string sHtmlText);
     ISugarQueryable<SnapshotBulletinItemsOutDto> QueryBulletinItems(SnapshotBulletinItemsInDto dto);
+    Task CommitBulletinAsync(string id, CancellationToken requestAborted);
 }

+ 7 - 0
src/Hotline.Application/Snapshot/Contracts/ISnapshotUserApplication.cs

@@ -21,4 +21,11 @@ public interface ISnapshotUserApplication
     /// <param name="dto"></param>
     /// <returns></returns>
     Task DeleteCitizenRelationSafetyAsync(DeleteCitizenRelationSafetyTypeInDto dto);
+
+    /// <summary>
+    /// 获取第三方市民列表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<GetThirdCitizenOutDto> GetThirdCitizenAsync(GetThirdCitizenInDto dto);
 }

+ 39 - 15
src/Hotline.Application/Snapshot/SnapshotBulletinApplication.cs

@@ -1,6 +1,8 @@
-using DotNetCore.CAP;
+using DocumentFormat.OpenXml.Vml.Office;
+using DotNetCore.CAP;
 using Hotline.Application.Snapshot.Contracts;
 using Hotline.Caching.Interfaces;
+using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Attributes;
 using Hotline.Share.Dtos.Article;
@@ -69,12 +71,13 @@ public class SnapshotBulletinApplication : ISnapshotBulletinApplication, IScopeD
         await _bulletinRepository.UpdateAsync(bulletin, token);
 
         var citizens = await _safetyTypeRepository.Queryable()
-            .Includes(m => m.Citizens.Select(c => c.Id))
-            .Where(m => m.Id == bulletin.SafetyTypeId)
+            .LeftJoin<CitizenRelationSafetyType>((safety, relation) => safety.Id == relation.SafetyTypeId)
+            .LeftJoin<Citizen>((safety, relation, citizen) => relation.CitizenId == citizen.Id)
+            .Where((safety, relation, citizen) => safety.Id == bulletin.SafetyTypeId)
+            .Select((safety, relation, citizen) => citizen.Id)
             .ToListAsync(token);
 
         await _capPublisher.PublishAsync(Share.Mq.EventNames.BulletinIsPass, bulletin.Id, cancellationToken: token);
-
     }
 
     /// <summary>
@@ -86,16 +89,21 @@ public class SnapshotBulletinApplication : ISnapshotBulletinApplication, IScopeD
     public async Task NotifyUserAsync(string bullutionId, CancellationToken token)
     {
         await _bulletinRepository.GetAsync(bullutionId, token)
-            .Then(async bulletion => { 
-                await _safetyTypeRepository.Queryable().Where(m => m.Id == bulletion.SafetyTypeId)
-                .Includes(m => m.Citizens.Select(c => c.Id))
-                .FirstAsync(token)
-                .Then(async safetyType => 
-                {
-                    var inDto = bulletion.Adapt<AddNotifyInDto>();
-                    inDto.UserIds = [.. safetyType.Citizens.Select(m => m.Id)];
-                    await _notificationDomainService.AddNotifyAsync(inDto, token);
-                });
+            .Then(async bulletion =>
+            {
+                if (bulletion!.IsSnapshot == false) return;
+                await _safetyTypeRepository.Queryable()
+                    .LeftJoin<CitizenRelationSafetyType>((safety, relation) => safety.Id == relation.SafetyTypeId)
+                    .LeftJoin<Citizen>((safety, relation, citizen) => relation.CitizenId == citizen.Id)
+                    .Where((safety, relation, citizen) => safety.Id == bulletion.SafetyTypeId)
+                    .Select((safety, relation, citizen) => relation.CitizenId)
+                    .ToListAsync(token)
+                    .Then(async citizenIds =>
+                    {
+                        var inDto = bulletion.Adapt<AddNotifyInDto>();
+                        inDto.UserIds = citizenIds;
+                        await _notificationDomainService.AddNotifyAsync(inDto, token);
+                    });
             });
     }
 
@@ -161,10 +169,26 @@ public class SnapshotBulletinApplication : ISnapshotBulletinApplication, IScopeD
         return query;
     }
 
+
+    public async Task CommitBulletinAsync(string id, CancellationToken requestAborted)
+    {
+        var bulletin = await _bulletinRepository.GetAsync(id, requestAborted);
+        if (bulletin == null)
+            throw UserFriendlyException.SameMessage("无效数据");
+
+        if (bulletin.BulletinState != EBulletinState.Draft && bulletin.BulletinState != EBulletinState.ReviewNoPass)
+            throw UserFriendlyException.SameMessage("当前状态不能提交");
+
+        bulletin.BulletinState = EBulletinState.InReview;
+        bulletin.CommitTime = DateTime.Now;
+        await _bulletinRepository.UpdateAsync(bulletin, requestAborted);
+    }
+
+
     public async Task<string> AddBulletinAsync(AddSnapshotBulletinInDto dto, CancellationToken token)
     {
         var model = dto.Adapt<SnapshotBulletin>();
-        model.BulletinState = Share.Enums.Article.EBulletinState.Draft;
+        model.BulletinState = EBulletinState.Draft;
         model.ReadedNum = 0;
         if (model.BulletinTime.HasValue == false) model.BulletinTime = DateTime.Now;
         return await _bulletinRepository.AddAsync(model, token);

+ 14 - 0
src/Hotline.Application/Snapshot/SnapshotUserApplication.cs

@@ -10,6 +10,7 @@ using Hotline.Snapshot.IRepository;
 using Hotline.ThirdAccountDomainServices;
 using Hotline.Tools;
 using Mapster;
+using NPOI.POIFS.Properties;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -88,4 +89,17 @@ public class SnapshotUserApplication : ISnapshotUserApplication, IScopeDependenc
                 .ExecuteCommand();
         }
     }
+
+    public ISugarQueryable<GetThirdCitizenOutDto> GetThirdCitizenAsync(GetThirdCitizenInDto dto)
+    {
+        var query = _citizenRepository.Queryable(includeDeleted: true)
+            .LeftJoin<ThirdAccount>((citizen, third) => citizen.Id == third.ExternalId)
+            .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), (citizen, third) => citizen.PhoneNumber.Contains(dto.PhoneNumber))
+            .Select((citizen, third) => new GetThirdCitizenOutDto(), true);
+#if DEBUG
+        var sql = query.ToSqlString();
+#endif
+
+        return query;
+    }
 }

+ 26 - 0
src/Hotline.Share/Dtos/Snapshot/SnapshotUserInfoDto.cs

@@ -124,3 +124,29 @@ public class CitizenIdRelationSafetyTypeId
     /// </summary>
     public string SafetyTypeId { get; set; }
 }
+
+public record GetThirdCitizenInDto : PagedRequest
+{
+    /// <summary>
+    /// 电话号码
+    /// </summary>
+    public string? PhoneNumber { get; set; }
+}
+
+public class GetThirdCitizenOutDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string CitizenId { get; set; }
+
+    /// <summary>
+    /// Name
+    /// </summary>
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 电话
+    /// </summary>
+    public string PhoneNumber { get; set; }
+}

+ 4 - 2
test/Hotline.Tests/Application/SnapshotBulletionApplicationTest.cs

@@ -55,7 +55,7 @@ public class SnapshotBulletionApplicationTest : TestBase
         await _snapshotUserApplication.AddCitizenRelationSafetyType(addRelationInDto, CancellationToken.None);
         var inDto = new AddSnapshotBulletinInDto
         {
-            Title = "测试公告" + DateTime.Now.ToShortDateTimeString(),
+            Title = "测试公告" + DateTime.Now.ToLongDateTimeString(),
             Content = "没什么内容",
             BulletinTime = DateTime.Now,
             IsSnapshot = true,
@@ -64,6 +64,7 @@ public class SnapshotBulletionApplicationTest : TestBase
             SafetyTypeId = safetyType.Id,
         };
         var bulletinId = await _snapshotBulletinApplication.AddBulletinAsync(inDto, CancellationToken.None);
+        await _snapshotBulletinApplication.CommitBulletinAsync(bulletinId, CancellationToken.None);
         var examineDto = new ExamineBulletinDto
         {
             Id = bulletinId,
@@ -71,7 +72,8 @@ public class SnapshotBulletionApplicationTest : TestBase
             Reason = "审核通过"
         };
         await _snapshotBulletinApplication.ExamineBulletinAsync(examineDto, CancellationToken.None);
-        await _snapshotBulletinApplication.NotifyUserAsync(bulletinId, CancellationToken.None);
+        Thread.Sleep(5 * 1000);
+        //await _snapshotBulletinApplication.NotifyUserAsync(bulletinId, CancellationToken.None);
 
 
         var notifyItems = await _snapshotApplication.GetNotificationAsync(new GetNotifyInDto(), CancellationToken.None);

+ 7 - 0
test/Hotline.Tests/Application/SnapshotUserApplicationTest.cs

@@ -37,6 +37,13 @@ public class SnapshotUserApplicationTest : TestBase
     [Fact]
     public async Task SnapshotUserApplication_Test()
     {
+        var searchInDto = new GetThirdCitizenInDto
+        {
+            PhoneNumber = "33"
+        };
+        var citizenSearchItems = await _snapshotUserApplication.GetThirdCitizenAsync(searchInDto).ToListAsync();
+        citizenSearchItems.ShouldNotBeNull();
+        citizenSearchItems.Count.ShouldNotBe(0);
         var newSafetyType = new SafetyType { Name = "安全卫士" };
         var safetyType = await _safetyTypeRepository.Queryable().Where(m => m.Name == newSafetyType.Name).FirstAsync();
         safetyType ??= new SafetyType