19 Revize 544291ee9c ... 07e2868b95

Autor SHA1 Zpráva Datum
  libin 07e2868b95 Merge branch 'test' into lib/test před 6 hodinami
  libin 09636d5090 调整【提起甄别审批统计】 před 6 hodinami
  qinchaoyue 2cad7bb60e Merge branch 'feature/snapshot' into test před 6 hodinami
  qinchaoyue 4404a68d1e 修复过滤 před 6 hodinami
  qinchaoyue b4d1f6115e Merge branch 'feature/snapshot' into test před 6 hodinami
  qinchaoyue 2dd9414c9f 修改拼写错误 před 6 hodinami
  qinchaoyue b04bcf85ec Merge branch 'feature/snapshot' into test před 6 hodinami
  qinchaoyue f11f668e45 用户过滤 před 6 hodinami
  qinchaoyue 2574141527 新增搜索过滤 před 6 hodinami
  qinchaoyue 9ce02c473a Merge branch 'feature/snapshot' into test před 7 hodinami
  qinchaoyue a4773a30b4 修复删除关系 před 7 hodinami
  qinchaoyue 3047b5a9ea Merge branch 'feature/snapshot' into test před 7 hodinami
  qinchaoyue e667082e30 视频名称 před 7 hodinami
  Dun.Jason aff0452707 Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test před 7 hodinami
  Dun.Jason 6d23dd060c 定时任务 před 7 hodinami
  qinchaoyue 4f4fe252db Merge branch 'feature/snapshot' into test před 7 hodinami
  qinchaoyue 9833339ac6 返回消息阅读状态 před 7 hodinami
  qinchaoyue 5a89b969a3 合并 před 8 hodinami
  qinchaoyue f4c6c646fa 修复通知数据问题 před 8 hodinami

+ 2 - 3
src/Hotline.Api/Controllers/CorsJobController.cs

@@ -19,16 +19,15 @@ namespace Hotline.Api.Controllers
         private readonly IRealtimeService _realtimeService;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly ITrClient _trClient;
-        private readonly ILogger _logger;
+        private readonly ILogger<CorsJobController> _logger;
 
-        public CorsJobController(IOrderDomainService orderDomainService, IRepository<TrCallRecord> trcallrecordRepoository, IRealtimeService realtimeService, ISystemSettingCacheManager systemSettingCacheManager, ITrClient trClient, ILogger logger)
+        public CorsJobController(IOrderDomainService orderDomainService, IRepository<TrCallRecord> trcallrecordRepoository, IRealtimeService realtimeService, ISystemSettingCacheManager systemSettingCacheManager, ITrClient trClient, ILogger<CorsJobController> logger)
         {
             _orderDomainService = orderDomainService;
             _trcallrecordRepoository = trcallrecordRepoository;
             _realtimeService = realtimeService;
             _systemSettingCacheManager = systemSettingCacheManager;
             _trClient = trClient;
-            _logger = logger;
         }
 
         /// <summary>

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

@@ -988,7 +988,7 @@ namespace Hotline.Api.Controllers
         /// 重置话机状态
         /// </summary>
         /// <returns></returns>
-        [HttpGet("tels-status-refreshservice")]
+        [HttpPost("tels-status-refreshservice")]
         [AllowAnonymous]
         public async Task TelsStatusRefreshService()
         {

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

@@ -121,7 +121,6 @@ jxrWXHbT1FB6DqkdOnBbQqS1Azqz5HxLlSyEK3F60e3SgB5iZsDZ
     public async Task<Dictionary<string, object>> GetThirdTokenAsync([FromBody] ThirdTokenInDto dto)
         => await _identityAppService.GetThirdTokenAsync(dto, HttpContext.RequestAborted);
 
-
     /// <summary>
     /// 第三方登录
     /// </summary>

+ 10 - 1
src/Hotline.Api/Controllers/Snapshot/SnapshotController.cs

@@ -376,7 +376,7 @@ public class SnapshotController : BaseController
     }
 
     /// <summary>
-    /// 获取消息
+    /// 获取消息集合
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
@@ -384,6 +384,15 @@ public class SnapshotController : BaseController
     public async Task<IList<GetNotifyOutDto>> GetNotificationAsync([FromQuery] GetNotifyInDto dto)
         => await _snapshotApplication.GetNotificationAsync(dto, HttpContext.RequestAborted);
 
+    /// <summary>
+    /// 获取消息详情
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("notification/{id}")]
+    public async Task<BulletinOutDto> GetNotificationDetailsAsync(string id)
+        => await _snapshotApplication.GetNotificationDetailsAsync(id, HttpContext.RequestAborted);
+
+
     #region 积分
     /// <summary>
     /// 积分榜

+ 4 - 2
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -4085,7 +4085,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 {
                     AuditName = x.HandlerName,
                     StepName = x.Name,
-                    AuditNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.TraceType == EWorkflowTraceType.Normal && x.TraceState == EWorkflowTraceState.Normal, 1, 0)),
+                    //AuditNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.TraceType == EWorkflowTraceType.Normal && x.TraceState == EWorkflowTraceState.Normal, 1, 0)),
+                    AuditNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.TraceType == EWorkflowTraceType.Normal && x.TraceState == EWorkflowTraceState.Normal && x.ReviewResult == EReviewResult.Approval, 1, 0)),
+                    AuditNoNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.TraceType == EWorkflowTraceType.Normal && x.TraceState == EWorkflowTraceState.Normal && x.ReviewResult == EReviewResult.Failed, 1, 0)),
                     AuditBackNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.TraceState == EWorkflowTraceState.StepRemoveByPrevious || x.TraceState == EWorkflowTraceState.StepRemoveByRecall, 1, 0)),
                 });
         }
@@ -4098,7 +4100,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                .Where(x => x.HandlerName != null && x.HandlerName != "")
                .WhereIF(dto.AuditType is 1, x => x.Name == "班长审批")
                .WhereIF(dto.AuditType is 2, x => x.Name == "中心领导")
-                .WhereIF(_appOptions.Value.IsZiGong && dto.AuditType is 3, x => x.Name == "中心初审")
+               .WhereIF(_appOptions.Value.IsZiGong && dto.AuditType is 3, x => x.Name == "中心初审")
                .GroupBy(x => new { x.HandlerName })
                .Select(x => new OrderScreenAuditVo
                {

+ 8 - 0
src/Hotline.Application/Snapshot/Contracts/ISnapshotApplication.cs

@@ -236,4 +236,12 @@ public interface ISnapshotApplication
     Task<int> GetPointsTotalAsync(PointItemsInDto dto, CancellationToken requestAborted);
 
     Task<IList<GetNotifyOutDto>> GetNotificationAsync(GetNotifyInDto dto, CancellationToken requestAborted);
+
+    /// <summary>
+    /// 获取通知详情
+    /// </summary>
+    /// <param name="id"></param>
+    /// <param name="requestAborted"></param>
+    /// <returns></returns>
+    Task<BulletinOutDto> GetNotificationDetailsAsync(string id, CancellationToken requestAborted);
 }

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/Hotline.Application/Snapshot/DefaultSnapshotApplication.cs


+ 46 - 6
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -42,6 +42,7 @@ using Microsoft.Extensions.Options;
 using XF.Utility.MQ;
 using System.Threading;
 using BulletinOutDto = Hotline.Share.Dtos.Article.BulletinOutDto;
+using Hotline.Article;
 using NPOI.SS.Formula.Functions;
 
 namespace Hotline.Application.Snapshot;
@@ -89,8 +90,9 @@ public abstract class SnapshotApplicationBase
     private readonly ISnapshotPointsRecordRepository _pointsRecordRepository;
     private readonly IOptionsSnapshot<MqConfiguration> _mqConfiguration;
     private readonly INotificationReceiverRepository _notificationReceiverRepository;
+    private readonly INotificationRepository _notificationRepository;
 
-    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRedPackRecordRepository redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository, IInviteCodeRecordRepository inviteCodeRecordRepository, IInviteCodeRepository inviteCodeRepository, ICitizenRepository citizenRepository, ISnapshotPointsRecordRepository snapshotPointsRecordRepository, IOptionsSnapshot<MqConfiguration> mqConfiguration, INotificationReceiverRepository notificationReceiverRepository)
+    public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IIndustryRepository industryRepository, ISnapshotBulletinRepository bulletinRepository, ISessionContext sessionContext, IRedPackRecordRepository redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IOrderSnapshotRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager, ISnapshotOrderPublishRepository snapshotOrderPublishRepository, IRepository<WorkflowTrace> workflowTraceRepository, IPractitionerRepository practitionerRepository, IRepository<SystemArea> systemAreaRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, ISystemLogRepository systemLog, IGuiderSystemService guiderSystemService, ICapPublisher capPublisher, Publisher publisher, IFileDomainService fileDomainService, ICommunityInfoRepository communityInfoRepository, IRedPackAuditRepository redPackAuditRepository, IOrderVisitRepository orderVisitRepository, IOrderVisitDetailRepository orderVisitDetailRepository, IRedPackGuiderAuditRepository redPackGuiderAuditRepository, IInviteCodeRecordRepository inviteCodeRecordRepository, IInviteCodeRepository inviteCodeRepository, ICitizenRepository citizenRepository, ISnapshotPointsRecordRepository snapshotPointsRecordRepository, IOptionsSnapshot<MqConfiguration> mqConfiguration, INotificationReceiverRepository notificationReceiverRepository, INotificationRepository notificationRepository)
     {
         _thirdLoginService = thirdLoginService;
         _industryRepository = industryRepository;
@@ -126,6 +128,7 @@ public abstract class SnapshotApplicationBase
         _pointsRecordRepository = snapshotPointsRecordRepository;
         _mqConfiguration = mqConfiguration;
         _notificationReceiverRepository = notificationReceiverRepository;
+        _notificationRepository = notificationRepository;
     }
 
     #region 小程序
@@ -404,12 +407,41 @@ public abstract class SnapshotApplicationBase
             {
                 NotificationId = m.NotificationId,
                 Title = notify.Title ,
-                CreationTime = m.CreationTime
+                CreationTime = m.CreationTime,
+                IsRead = m.IsRead
             }, true)
             .ToFixedListAsync(dto, requestAborted);
         return items;
     }
 
+    /// <summary>
+    /// 获取通知详情
+    /// </summary>
+    /// <param name="id"></param>
+    /// <param name="requestAborted"></param>
+    /// <returns></returns>
+    public async Task<BulletinOutDto> GetNotificationDetailsAsync(string id, CancellationToken token)
+    {
+        var outDto = await _notificationRepository.Queryable()
+            .LeftJoin<SnapshotBulletin>((notify, bulletin) => notify.ExternalId == bulletin.Id)
+            .Where((notify, bulletin) => notify.Id == id)
+            .Select((notify, bulletin) => new BulletinOutDto
+            {
+                Id = bulletin.Id,
+                Title = bulletin.Title,
+                CreationTime = bulletin.CreationTime,
+                Content = bulletin.Content,
+                VideoPath = bulletin.VideoPath
+            })
+            .FirstAsync(token);
+        await _notificationReceiverRepository.Updateable()
+            .SetColumns(m => m.IsRead, true)
+            .Where(m => m.NotificationId == id && m.ReceiverId == _sessionContext.UserId)
+            .ExecuteCommandAsync(token);
+
+        return outDto;
+    }
+
     /// <summary>
     /// 获取工单详情
     /// </summary>
@@ -1064,7 +1096,7 @@ public abstract class SnapshotApplicationBase
         outDto.VideoBulletin = await _notificationReceiverRepository.Queryable()
             .LeftJoin<Notification>((receiver, notify) => notify.Id == receiver.NotificationId)
             .LeftJoin<SnapshotBulletin>((receiver, notify, bulletin) => bulletin.Id == notify.ExternalId)
-            .Where((receiver, notify) => receiver.ReceiverId == _sessionContext.UserId)
+            .Where((receiver, notify, bulletin) => receiver.ReceiverId == _sessionContext.UserId && bulletin.Shape == EBulletinShape.Video)
             .GroupBy((receiver, notify, bulletin) => new 
             {
                 notify.Title,
@@ -1087,7 +1119,10 @@ public abstract class SnapshotApplicationBase
         {
             Items = await _notificationReceiverRepository.Queryable()
                 .LeftJoin<Notification>((receiver, notify) => notify.Id == receiver.NotificationId)
-                .Select((receiver, notify) => new PointsBulletinItemsOutDto
+                .LeftJoin<SnapshotBulletin>((receiver, notify, bulletin) => bulletin.Id == notify.ExternalId)
+                .Where((receiver, notify, bulletin) => bulletin.Shape == EBulletinShape.Message)
+                .GroupBy((receiver, notify, bulletin) => new { notify.ExternalId, notify.Title})
+                .Select((receiver, notify, bulletin) => new PointsBulletinItemsOutDto
                 {
                     BulletinId = notify.ExternalId,
                     Title = notify.Title,
@@ -1095,8 +1130,13 @@ public abstract class SnapshotApplicationBase
                 .Take(2)
                 .ToListAsync(),
             UnReadCount = await _notificationReceiverRepository.Queryable()
-            .Where(m => m.IsRead == false && m.ReceiverId == _sessionContext.UserId)
-            .CountAsync()
+                .LeftJoin<Notification>((receiver, notify) => notify.Id == receiver.NotificationId)
+                .LeftJoin<SnapshotBulletin>((receiver, notify, bulletin) => bulletin.Id == notify.ExternalId)
+                .Where((receiver, notify, bulletin) => receiver.IsRead == false 
+                && receiver.ReceiverId == _sessionContext.UserId 
+                && bulletin.Shape == EBulletinShape.Message)
+                .GroupBy((receiver, notify, bulletin) => new { receiver.ReceiverId, receiver.NotificationId})
+                .CountAsync()
         };
 
         return outDto;

+ 16 - 2
src/Hotline.Application/Snapshot/SnapshotUserApplication.cs

@@ -45,13 +45,22 @@ public class SnapshotUserApplication : ISnapshotUserApplication, IScopeDependenc
             Id = dto.SafetyTypeId,
             Citizens = []
         };
+        var citizenExists = await _citizenRepository.Queryable()
+            .LeftJoin<CitizenRelationSafetyType>((citizen, relation) => citizen.Id == relation.CitizenId)
+            .Where((citizen, relation) => dto.CitizenIds.Contains(citizen.Id) && relation.SafetyTypeId == dto.SafetyTypeId)
+            .Select((citizen, relation) => citizen.Id)
+            .ToListAsync(token);
+        dto.CitizenIds = dto.CitizenIds.Except(citizenExists).ToList();
         foreach (var item in dto.CitizenIds)
         {
             safeType.Citizens.Add(new Citizen { Id = item });
         }
 
         await _safetyTypeRepository.AddNav(safeType)
-            .Include(m => m.Citizens)
+            .Include(m => m.Citizens, new InsertNavOptions()
+            {
+                ManyToManyNoDeleteMap = true
+            })
             .ExecuteCommandAsync();
     }
 
@@ -97,8 +106,13 @@ public class SnapshotUserApplication : ISnapshotUserApplication, IScopeDependenc
     {
         var query = _citizenRepository.Queryable(includeDeleted: true)
             .LeftJoin<ThirdAccount>((citizen, third) => citizen.Id == third.ExternalId)
+            .LeftJoin<CitizenRelationSafetyType>((citizen, third, relation) => relation.CitizenId == citizen.Id && relation.SafetyTypeId == dto.SafetyTypeId)
             .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), (citizen, third) => citizen.PhoneNumber.Contains(dto.PhoneNumber))
-            .Select((citizen, third) => new GetThirdCitizenOutDto { CitizenId = citizen.Id}, true);
+            .WhereIF(dto.SafetyTypeId.NotNullOrEmpty(), (citizen, third, relation) => relation.CitizenId == null)
+            .Select((citizen, third, relation) => new GetThirdCitizenOutDto 
+            {
+                CitizenId = citizen.Id
+            }, true);
 #if DEBUG
         var sql = query.ToSqlString();
 #endif

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/Hotline.Application/Snapshot/ZiGongSnapshotApplication.cs


+ 5 - 0
src/Hotline.Share/Dtos/Article/BulletinDto.cs

@@ -586,6 +586,11 @@ namespace Hotline.Share.Dtos.Article
         /// </summary>
         public string Content { get; set; }
 
+        /// <summary>
+        /// 视频地址
+        /// </summary>
+        public string? VideoPath { get; set; }
+
         public DateTime CreationTime { get; set; }
     }
 }

+ 20 - 15
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -916,10 +916,10 @@ namespace Hotline.Share.Dtos.Order
 
         public string StepName { get; set; }
 
-		/// <summary>
-		/// 派单量
-		/// </summary>
-		public int SendOrderNum { get; set; }
+        /// <summary>
+        /// 派单量
+        /// </summary>
+        public int SendOrderNum { get; set; }
 
         /// <summary>
         /// 待派单量
@@ -933,21 +933,21 @@ namespace Hotline.Share.Dtos.Order
 
         //public string AccuracyRate { get; set; }
 
-		public string AccuracyRate => GetAccuracyRateRate();
+        public string AccuracyRate => GetAccuracyRateRate();
 
-		public string GetAccuracyRateRate()
-		{
+        public string GetAccuracyRateRate()
+        {
             if (ReSendOrderNum == 0)
             {
                 return "100%";
             }
-			if (SendOrderNum > 0 &&  ReSendOrderNum > 0)
-			{
-				return Math.Round(((SendOrderNum- ReSendOrderNum) / (double)SendOrderNum) * 100, 2).ToString() +"%";
-			}
-			return "0%";
-		}
-	}
+            if (SendOrderNum > 0 && ReSendOrderNum > 0)
+            {
+                return Math.Round(((SendOrderNum - ReSendOrderNum) / (double)SendOrderNum) * 100, 2).ToString() + "%";
+            }
+            return "0%";
+        }
+    }
 
     public class OrderReTransactVo
     {
@@ -1597,6 +1597,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int AuditNum { get; set; }
 
+        /// <summary>
+        /// 审批不同意数量
+        /// </summary>
+        public int AuditNoNum { get; set; }
+
         /// <summary>
         /// 退回数量
         /// </summary>
@@ -1605,7 +1610,7 @@ namespace Hotline.Share.Dtos.Order
         /// <summary>
         /// 小计
         /// </summary>
-        public int Total => AuditNum + AuditBackNum;
+        public int Total => AuditNum + AuditNoNum + AuditBackNum;
     }
 
     public class OrderCenterAcceptVo : OrderCenterBaseVo

+ 5 - 0
src/Hotline.Share/Dtos/Snapshot/NotifyDto.cs

@@ -63,4 +63,9 @@ public class GetNotifyOutDto
     /// 创建时间
     /// </summary>
     public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 是否已读
+    /// </summary>
+    public bool IsRead { get; set; }
 }

+ 5 - 0
src/Hotline.Share/Dtos/Snapshot/SnapshotBulletinDto.cs

@@ -288,6 +288,11 @@ public class AddSnapshotBulletinInDto
     /// </summary>
     public string? VideoPath { get; set; }
 
+    /// <summary>
+    /// 视频名称
+    /// </summary>
+    public string? VideoName { get; set; }
+
     /// <summary>
     /// 视频封面
     /// </summary>

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

@@ -137,6 +137,11 @@ public class CitizenIdRelationSafetyTypeId
 
 public record GetThirdCitizenInDto : PagedRequest
 {
+    /// <summary>
+    /// 志愿者类型Id
+    /// </summary>
+    public string? SafetyTypeId { get; set; }
+
     /// <summary>
     /// 电话号码
     /// </summary>

+ 23 - 0
src/Hotline/SeedData/SystemMenuSeedData.cs

@@ -0,0 +1,23 @@
+using Hotline.Settings;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Entities;
+
+namespace Hotline.SeedData;
+
+public class SystemMenuSeedData : ISeedData<SystemDicData>
+{
+    public IEnumerable<SystemDicData> HasData()
+    {
+        return new List<SystemDicData>();
+    }
+
+    public IEnumerable<SystemMenu> GetData()
+    {
+         throw new  NotImplementedException();
+        //return [new() { Id = }];
+    }
+}

+ 5 - 0
src/Hotline/Snapshot/SnapshotBulletin.cs

@@ -195,5 +195,10 @@ public class SnapshotBulletin : CreationEntity
     [SugarColumn(ColumnDescription = "视频封面")]
     public string? VideoCoverImgUrl { get; set; }
 
+    /// <summary>
+    /// 视频名称
+    /// </summary>
+    [SugarColumn(ColumnDescription = "视频封面")]
+    public string? VideoName { get; set; }
 }
 

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů