Jelajahi Sumber

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

qinchaoyue 5 bulan lalu
induk
melakukan
3d95d1f35d

+ 167 - 7
src/Hotline.Api/Controllers/WebPortalController.cs

@@ -3,6 +3,7 @@ using Hotline.Application.Bulletin;
 using Hotline.Application.Orders;
 using Hotline.Article;
 using Hotline.Caching.Interfaces;
+using Hotline.Configurations;
 using Hotline.KnowledgeBase;
 using Hotline.Orders;
 using Hotline.Push.Notifies;
@@ -22,6 +23,7 @@ using MathNet.Numerics;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using SqlSugar;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
@@ -53,6 +55,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
         private readonly IRepository<Knowledge> _knowledgeRepository;
         private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
+        private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
         public WebPortalController(IMapper mapper,
             IMediator mediator,
@@ -74,7 +77,8 @@ namespace Hotline.Api.Controllers
             IRepository<KnowledgeRelationType> knowledgeRelationTypeRepository,
             IRepository<KnowledgeType> knowledgeTypeRepository,
             IRepository<Knowledge> knowledgeRepository,
-            ISystemDicDataCacheManager systemDicDataCacheManager
+            ISystemDicDataCacheManager systemDicDataCacheManager,
+            IOptionsSnapshot<AppConfiguration> appOptions
             )
         {
             _mapper = mapper;
@@ -98,6 +102,7 @@ namespace Hotline.Api.Controllers
             _knowledgeTypeRepository = knowledgeTypeRepository;
             _knowledgeRepository = knowledgeRepository;
             _systemDicDataCacheManager = systemDicDataCacheManager;
+            _appOptions = appOptions;
         }
 
         #region 通知
@@ -136,6 +141,7 @@ namespace Hotline.Api.Controllers
             ArticleListDataDto dataDto = new()
             {
                 PageCount = nPageCount,
+                Total = total,
                 data = _mapper.Map<IReadOnlyList<ArticleListDto>>(items)
             };
 
@@ -212,6 +218,45 @@ namespace Hotline.Api.Controllers
             return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<ArticleDetailsDto>>.Success(dataDto));
         }
 
+        /// <summary>
+        /// 根据分类获取详情
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpPost("getarticledetailsbytype")]
+        public async Task<OpenResponse> GetArticleDetailsByType([FromBody] ArticleIdByNumDto dto)
+        {
+            var items = await _bulletinRepository.Queryable()
+                .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), p => p.BulletinTypeId == dto.BulletinTypeId)
+                .OrderByDescending(p => p.CreationTime)
+                .Take(dto.Num)
+                .ToListAsync();
+            List<ArticleDetailsDto> dataDto = [];
+            if (items != null && items.Any())
+            {
+                foreach (var item in items)
+                {
+                    if (!string.IsNullOrEmpty(item.Content))
+                        item.Content = _bulletinApplication.GetSiteUrls(item.Content);
+
+                    dataDto.Add(new()
+                    {
+                        NoticeID = item.Id,
+                        NoticeTypeName = item.BulletinTypeName,
+                        NoticeTitle = item.Title,
+                        NoticeBMName = item.SourceOrgName,
+                        NoticeCreateDate = item.CreationTime,
+                        NoticeRCount = item.ReadedNum,
+                        WNED_VideoUrl = "",
+                        NoticeContent = item.Content
+                    });
+                }
+            }
+            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<ArticleDetailsDto>>.Success(dataDto));
+
+        }
+
         /// <summary>
         /// 上一条和下一条
         /// </summary>
@@ -228,8 +273,16 @@ namespace Hotline.Api.Controllers
                 ;
             if (dto.FullSearch == "1")//全文搜索
             {
-                sugar.Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
+                if (_appOptions.Value.IsYiBin)
+                {
+                    sugar.Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
                     .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Content.Contains(dto.Condition) || p.Title.Contains(dto.Condition));
+                }
+                if (_appOptions.Value.IsZiGong)
+                {
+                    sugar.Where(p => p.BulletinTypeId == "5013" || p.BulletinTypeId == "5016" || p.BulletinTypeId == "5011" || p.BulletinTypeId == "5015" || p.BulletinTypeId == "5017")
+                    .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Content.Contains(dto.Condition) || p.Title.Contains(dto.Condition));
+                }
             }
             else//指定分类
             {
@@ -299,8 +352,9 @@ namespace Hotline.Api.Controllers
                 .Where(p => p.LoseEfficacyTime >= DateTime.Now)
                  .Where(p => p.IsArrive == true)
                 .Where(p => SqlFunc.JsonListObjectAny(p.PushRanges, "Key", "2"))
-                 .Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
-                 .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
+                .WhereIF(_appOptions.Value.IsYiBin, p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4")
+                .WhereIF(_appOptions.Value.IsZiGong, p => p.BulletinTypeId == "5013" || p.BulletinTypeId == "5016" || p.BulletinTypeId == "5011" || p.BulletinTypeId == "5015" || p.BulletinTypeId == "5017")
+                .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition))
                  .OrderByDescending(p => p.CreationTime)
                  .Select(it => new
                  {
@@ -684,6 +738,7 @@ namespace Hotline.Api.Controllers
                 .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), (p, op) => p.StartTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
                 .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), (p, op) => p.StartTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
                 .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), (p, op) => p.FromName.Contains(dto.FlowFrom))
+                .WhereIF(dto.IdentityType.HasValue, (p, op) => p.IdentityType == dto.IdentityType)
                 .OrderByDescending((p, op) => p.CreationTime)
                .Select((p, op) => new OrderListDto
                {
@@ -707,6 +762,7 @@ namespace Hotline.Api.Controllers
                       .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), p => p.AcceptTime >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate
                       .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), p => p.AcceptTime <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate
                       .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), p => p.FromName.Contains(dto.FlowFrom))
+                      .WhereIF(dto.IdentityType.HasValue, p => p.IdentityType == dto.IdentityType)
                       .OrderByDescending(p => p.PubDate)
                         .Select(p => new OrderListDto
                         {
@@ -885,7 +941,7 @@ namespace Hotline.Api.Controllers
             }
             data.ExternalId = Guid.NewGuid().ToString();
 
-            data.IdentityType = EIdentityType.Citizen;
+            data.IdentityType = dto.IdentityType;
             data.Transpond = false;
             data.IsEnforcementOrder = false;
 
@@ -1135,7 +1191,7 @@ namespace Hotline.Api.Controllers
             var rsp = new
             {
                 KnowledgeType = item,
-                KnowledgeBaseTags = item,
+                KnowledgeBaseTags = list,
             };
             return OpenResponse.Ok(WebPortalDeResponse<object>.Success(rsp));
         }
@@ -1152,7 +1208,7 @@ namespace Hotline.Api.Controllers
             var typeSpliceName = string.Empty;
             if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
             {
-                var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
+                var type = await _knowledgeTypeRepository.GetAsync(x => x.Name == dto.KnowledgeTypeId);
                 typeSpliceName = type?.SpliceName;
             }
 
@@ -1199,5 +1255,109 @@ namespace Hotline.Api.Controllers
             List<KnowledgeInfoDto> dataDto = [detailsDto];
             return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<KnowledgeInfoDto>>.Success(dataDto));
         }
+
+        /// <summary>
+        /// 查询受理类型----受理量
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("getacceptancetypestatisticsbymonth")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetAcceptanceTypeStatisticsByMonth([FromBody] OrderFormByMonthDto dto)
+        {
+            if (string.IsNullOrEmpty(dto.StartTime))
+                dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
+
+            if (string.IsNullOrEmpty(dto.EndTime))
+                dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
+
+            //查询待
+            var listType = await _orderRepository.Queryable()
+                .Where(p => p.CreationTime >= Convert.ToDateTime(dto.StartTime) && p.CreationTime <= Convert.ToDateTime(dto.EndTime) && p.Status > EOrderStatus.WaitForAccept)
+                .Select(it => new
+                {
+                    it.AcceptType,
+                    it.AcceptTypeCode
+                })
+                .MergeTable()//将查询出来的结果合并成一个新表
+                 .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
+                 .Select(it => new
+                 {
+                     name = it.AcceptType,
+                     value = SqlFunc.AggregateCount(it.AcceptTypeCode)
+                 })
+                 .ToListAsync();
+            var formAcceptanceCount = _mapper.Map<List<OrderFormCount>>(listType);
+
+            if (_appOptions.Value.IsZiGong)
+            {
+                List<OrderFormCount> orderForms = new List<OrderFormCount>();
+                List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
+                foreach (var form in fromName)
+                {
+                    var data = formAcceptanceCount.FirstOrDefault(p => p.name == form);
+                    orderForms.Add(new OrderFormCount()
+                    {
+                        name = form,
+                        value = data == null ? 0 : data.value
+                    });
+                }
+                return OpenResponse.Ok(WebPortalDeResponse<List<OrderFormCount>>.Success(orderForms));
+            }
+
+
+            return OpenResponse.Ok(WebPortalDeResponse<List<OrderFormCount>>.Success(formAcceptanceCount));
+        }
+
+        /// <summary>
+        /// 查询受理类型---办结量
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("getacceptancetypestatisticsbymonthend")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetAcceptanceTypeStatisticsByMonthEnd([FromBody] OrderFormByMonthDto dto)
+        {
+            if (string.IsNullOrEmpty(dto.StartTime))
+                dto.StartTime = DateTime.Now.ToString("yyyy-MM-dd 00:00:00");
+
+            if (string.IsNullOrEmpty(dto.EndTime))
+                dto.EndTime = DateTime.Now.ToString("yyyy-MM-dd 23:59:59");
+
+            //数据查询
+            var listFileType = await _orderRepository.Queryable()
+                .Where(p => p.FiledTime >= Convert.ToDateTime(dto.StartTime) && p.FiledTime <= Convert.ToDateTime(dto.EndTime) && p.Status >= EOrderStatus.Filed)
+                .Select(it => new
+                {
+                    it.AcceptType,
+                    it.AcceptTypeCode
+                })
+                .MergeTable()//将查询出来的结果合并成一个新表
+                 .GroupBy(it => new { it.AcceptType, it.AcceptTypeCode })//对新表进行分组
+                 .Select(it => new
+                 {
+                     name = it.AcceptType,
+                     value = SqlFunc.AggregateCount(it.AcceptTypeCode)
+                 })
+                 .ToListAsync();
+
+            var formFileCount = _mapper.Map<IReadOnlyList<OrderFormCount>>(listFileType);
+            if (_appOptions.Value.IsZiGong)
+            {
+                List<OrderFormCount> orderForms = new List<OrderFormCount>();
+                List<string> fromName = ["咨询", "投诉", "求助", "建议", "举报", "表扬", "申报"];
+                foreach (var form in fromName)
+                {
+                    var data = formFileCount.FirstOrDefault(p => p.name == form);
+                    orderForms.Add(new OrderFormCount()
+                    {
+                        name = form,
+                        value = data == null ? 0 : data.value
+                    });
+                }
+                return OpenResponse.Ok(WebPortalDeResponse<List<OrderFormCount>>.Success(orderForms));
+            }
+            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<OrderFormCount>>.Success(formFileCount));
+        }
     }
 }

+ 41 - 13
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -30,6 +30,7 @@ using Hotline.Share.Mq;
 using Mapster;
 using MapsterMapper;
 using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 using Newtonsoft.Json;
@@ -303,18 +304,18 @@ namespace Hotline.Application.Subscribers
             }
             else
             {
-	            var nextHandler = new List<FlowStepHandler>();
-				if (_appOptions.Value.IsZiGong)
-	            {
-		            // 平均派单
-		            var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-		            if (averageSendOrder)
-		            {
-			            var handler = await _orderDomainService.AverageOrder(cancellationToken);
-			            nextHandler = new List<FlowStepHandler> { handler };
-		            }
-	            }
-				var isPaiDan = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, dto.Opinion,
+                var nextHandler = new List<FlowStepHandler>();
+                if (_appOptions.Value.IsZiGong)
+                {
+                    // 平均派单
+                    var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
+                    if (averageSendOrder)
+                    {
+                        var handler = await _orderDomainService.AverageOrder(cancellationToken);
+                        nextHandler = new List<FlowStepHandler> { handler };
+                    }
+                }
+                var isPaiDan = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, dto.Opinion,
                     order.Status >= EOrderStatus.Filed, order.ExpiredTime, nextHandler, cancellationToken);
                 order.FiledTime = null;
                 if (isPaiDan)
@@ -656,7 +657,7 @@ namespace Hotline.Application.Subscribers
             {
                 //处理省下行回访
                 var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.ProvinceNo).FirstAsync();
-                if (order != null && order.Status<= EOrderStatus.Filed)
+                if (order != null && order.Status <= EOrderStatus.Filed)
                 {
                     //判断是否有发布数据
                     var orderPublish = await _orderPublishRepository.Queryable()
@@ -1191,5 +1192,32 @@ namespace Hotline.Application.Subscribers
                 }
             }
         }
+
+        /// <summary>
+        /// 将未匹配到通话记录的工单处理为QT
+        /// </summary>
+        /// <param name="orderIds"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        [CapSubscribe(EventNames.RecUpdateOrderSourceChannel)]
+        public async Task UpdateOrderSourceChannel(List<string> orderIds, CancellationToken cancellationToken)
+        {
+            if (orderIds != null && orderIds.Any())
+            {
+                foreach (var item in orderIds)
+                {
+                    var orderData = await _orderRepository.GetAsync(p => p.Id == item || p.ProvinceNo == item, cancellationToken);
+
+                    if (orderData != null)
+                    {
+                        orderData.SourceChannel = "其他";
+                        orderData.SourceChannelCode = "QT";
+
+                        var orderDto = _mapper.Map<OrderDto>(orderData);
+                        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
+                    }
+                }
+            }
+        }
     }
 }

+ 6 - 1
src/Hotline.Share/Dtos/WebPortal/ArticleDetailsDto.cs

@@ -23,7 +23,7 @@ namespace Hotline.Share.Dtos.WebPortal
         /// <summary>
         /// 条数
         /// </summary>
-        public int Num { get; set; }
+        public int Num { get; set; } = 1;
 
         /// <summary>
         /// 是否查询图片
@@ -135,6 +135,11 @@ namespace Hotline.Share.Dtos.WebPortal
     /// </summary>
     public class ArticleListDataDto
     {
+        /// <summary>
+        /// 总条数
+        /// </summary>
+        public int Total { get; set; }
+
         /// <summary>
         /// 总页数
         /// </summary>

+ 49 - 1
src/Hotline.Share/Dtos/WebPortal/GetOrderCodePwd.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Requests;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Requests;
 
 namespace Hotline.Share.Dtos.WebPortal
 {
@@ -35,6 +36,11 @@ namespace Hotline.Share.Dtos.WebPortal
     /// </summary>
     public record QueryOrderListDto : PagedRequest
     {
+        /// <summary>
+        /// 来电/信人身份
+        /// </summary>
+        public EIdentityType? IdentityType { get; set; } 
+
         /// <summary>
         /// 信件编号
         /// </summary>
@@ -253,6 +259,16 @@ namespace Hotline.Share.Dtos.WebPortal
         /// 是否可以评价 0:不能评价,1:可以评价,2:已评价
         /// </summary>
         public string VisitType { get; set; }
+
+        /// <summary>
+        /// 一级部门code
+        /// </summary>
+        public string? OrgLevelOneCode { get; set; }
+
+        /// <summary>
+        /// 一级部门名称
+        /// </summary>
+        public string? OrgLevelOneName { get; set; }
     }
 
     /// <summary>
@@ -356,4 +372,36 @@ namespace Hotline.Share.Dtos.WebPortal
 
         public string? BulletinTypeName { get; set; }
     }
+
+    /// <summary>
+    /// 查询条件带时间
+    /// </summary>
+    public class OrderFormByMonthDto
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public string? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public string? EndTime { get; set; }
+    }
+
+    /// <summary>
+    /// 受理类型统计
+    /// </summary>
+    public class GetOrderFormByMonth
+    {
+        /// <summary>
+        /// 受理类型统计---受理
+        /// </summary>
+        public IReadOnlyList<OrderFormCount> formAcceptanceCount { get; set; }
+
+        /// <summary>
+        /// 受理类型统计--办理
+        /// </summary>
+        public IReadOnlyList<OrderFormCount> formFileCount { get; set; }
+    }
 }

+ 4 - 0
src/Hotline.Share/Dtos/WebPortal/QueryKnowledgeList.cs

@@ -31,6 +31,10 @@ namespace Hotline.Share.Dtos.WebPortal
     /// </summary>
     public class KnowledgeInfoDto
     {
+        /// <summary>
+        /// id
+        /// </summary>
+        public string Id { get; set; }
         /// <summary>
         /// 标题
         /// </summary>

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.108</Version>
+    <Version>1.0.111</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 7 - 2
src/Hotline.Share/Mq/EventNames.Share.cs

@@ -114,15 +114,20 @@
         /// 天阙推送工单,返回信息
         /// </summary>
         public const string TianQuePushOrderReceiver = "tian.que.push.order.receiver";
-        
+
         /// <summary>
         /// 收到shangring提供未关联callIds
         /// </summary>
         public const string RecUnrelationCalls = "rec.unrelation.calls";
-        
+
         /// <summary>
         /// 推送工单和通话记录信息(补偿推送关联通话记录的工单信息)
         /// </summary>
         public const string SharingOrderWithCallInfo = "sharing.order.with.call.info";
+
+        /// <summary>
+        /// 未查询到通话记录工单
+        /// </summary>
+        public const string RecUpdateOrderSourceChannel = "sharing.order.rec.update.order.source.channel";
     }
 }

+ 8 - 1
src/Hotline/WebPortal/WebFlowAccept.cs

@@ -1,4 +1,5 @@
-using SqlSugar;
+using Hotline.Share.Enums.Order;
+using SqlSugar;
 using XF.Domain.Repository;
 
 namespace Hotline.WebPortal
@@ -14,6 +15,12 @@ namespace Hotline.WebPortal
         [SugarColumn(ColumnDescription = "门户网站注册用户")]
         public string? WebUserID { get; set; }
 
+        /// <summary>
+        /// 来电/信人身份
+        /// </summary>
+        [SugarColumn(ColumnDescription = "来电/信人身份")]
+        public EIdentityType? IdentityType { get; set; } = EIdentityType.Citizen;
+
         /// <summary>
         /// 工单Id
         /// </summary>