Эх сурвалжийг харах

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf 1 жил өмнө
parent
commit
cf9b10cf1d

+ 80 - 1
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -17,6 +17,8 @@ using XF.Domain.Exceptions;
 using Microsoft.AspNetCore.Authorization;
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
+using Org.BouncyCastle.Utilities;
+using Polly.Caching;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -657,7 +659,7 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="StartDate"></param>
         /// <param name="EndDate"></param>
         /// <returns></returns>
-        [HttpGet("Center_report_forms_statistics")]
+        [HttpGet("center_report_forms_statistics")]
         public async Task<CenterReportStatisticsDto> CenterReportFormsStatistics(DateTime StartDate, DateTime EndDate)
         {
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
@@ -856,6 +858,83 @@ namespace Hotline.Api.Controllers.Bi
             return centerReportStatisticsDto;
         }
 
+        /// <summary>
+        /// 部门受理类型统计周期
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <param name="TypeCode">0:全部,1:中心,2:部门</param>
+        /// <returns></returns>
+        [HttpGet("department_acceptance_type_statistics")]
+        public async Task<List<DepartmentAcceptanceTypeStatisticsDto>> DepartmentAcceptanceTypeStatistics(DateTime StartDate, DateTime EndDate, int TypeCode)
+        {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+            var orderData = await _orderRepository.Queryable()
+              .LeftJoin<SystemOrganize>((it, o) => it.OrgLevelOneCode == o.Id)
+              .Where((it, o) => it.CreationTime >= StartDate && it.CreationTime <= EndDate && (int)it.Status >= 300)
+                .WhereIF(TypeCode == 1, (it, o) => it.OrgLevelOneCode == "001")
+                .WhereIF(TypeCode == 2, (it, o) => it.OrgLevelOneCode != "001")
+               .GroupBy((it, o) => new
+               {
+                   it.OrgLevelOneCode,
+                   o.Name,
+                   o.OrgType
+               })
+                .Select((it, o) => new DepartmentAcceptanceTypeStatisticsDto
+                {
+                    OrgName = it.OrgLevelOneCode == "001" ? "热线中心" : o.Name,
+                    OrgCode = it.OrgLevelOneCode,
+                    OrgType = (int)o.OrgType == 2 ? "区县部门" : "市直部门",
+                    ZxAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "10", 1, 0)),
+                    ZxAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "10" && it.AllDuration != null, it.AllDuration, 0)),
+                    ZxAcceptanceTypeCode = "10",
+
+                    JyAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "15", 1, 0)),
+                    JyAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "15" && it.FileDurationWorkday != null, it.FileDurationWorkday, 0)),
+                    JyAcceptanceTypeCode = "15",
+
+                    QzAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "20", 1, 0)),
+                    QzAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "20" && it.FileDurationWorkday != null, it.FileDurationWorkday, 0)),
+                    QzAcceptanceTypeCode = "20",
+
+                    ByAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "25", 1, 0)),
+                    ByAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "25" && it.FileDurationWorkday != null, it.FileDurationWorkday, 0)),
+                    ByAcceptanceTypeCode = "25",
+
+                    JbAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "30", 1, 0)),
+                    JbAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "30" && it.FileDurationWorkday != null, it.FileDurationWorkday, 0)),
+                    JbAcceptanceTypeCode = "30",
+
+                    TsAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "35", 1, 0)),
+                    TsAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "35" && it.FileDurationWorkday != null, it.FileDurationWorkday, 0)),
+                    TsAcceptanceTypeCode = "35",
+
+                    QtAllCount = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "40", 1, 0)),
+                    QtAllTimes = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptTypeCode == "40" && it.FileDurationWorkday != null, it.FileDurationWorkday, 0)),
+                    QtAcceptanceTypeCode = "40"
+                })
+              .ToListAsync();
+
+            return orderData;
+        }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("department_acceptance_type_order_list")]
+        public async Task<PagedDto<OrderDto>> DepartmentAcceptanceTypeOrderList([FromQuery] DepartmentKeyWordRequest dto)
+        {
+            dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
+            var (total, items) = await _orderRepository.Queryable()
+                .Where(p => p.CreationTime >= dto.StartDate && p.CreationTime <= dto.EndDate && (int)p.Status >= 300)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneCode), p => p.OrgLevelOneCode == dto.OrgLevelOneCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), p => p.AcceptTypeCode == dto.AcceptTypeCode)
+                .OrderByDescending(d => d.CreationTime)
+                .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+        }
     }
 }

+ 10 - 5
src/Hotline.Api/Controllers/OrderController.cs

@@ -46,6 +46,7 @@ using Hotline.Users;
 using MongoDB.Driver;
 using System.Threading;
 using Microsoft.AspNetCore.Authorization;
+using System.Collections.Generic;
 
 namespace Hotline.Api.Controllers;
 
@@ -2011,7 +2012,7 @@ public class OrderController : BaseController
     [HttpGet]
     public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
     {
-        var (total, items) = await _orderRepository.Queryable(permissionVerify: true)
+        var (total, items) = await _orderRepository.Queryable(viewFilter:true)
             .Includes(x => x.OrderScreens)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
@@ -3175,13 +3176,17 @@ public class OrderController : BaseController
                                                                 SqlFunc.JsonField(x.OrgProcessingResults, "Value") == "非常不满意"))
             .Distinct().Select(x => new { x.OrderVisit.OrderId }).CountAsync();
         //来电历史
-        //TODO 等待通讯对接完成 还缺少 上次来电时间 
-        //关注诉求
-        var hotspotNames = string.Join(",", oders.Select(x => x.HotspotName).Distinct().Take(5).ToList());
+        var calls = await _trCallRecordRepository.Queryable().Where(x => x.CallDirection == 0 && x.CPN == phone).OrderBy(x => x.CreatedTime).ToListAsync();
+        var oneCallTime = calls != null && calls.Count() > 0 ? calls[0].CreatedTime : DateTime.Now;
+        var lastNum = calls != null && calls.Count() > 0 ? calls.Count() - 1 : -1;
+        var lastCallTime = lastNum >= 0 ? calls[lastNum].CreatedTime : DateTime.Now;
+		//关注诉求
+		var hotspotNames = string.Join(",", oders.Select(x => x.HotspotName).Distinct().Take(5).ToList());
         var rsp = new
         {
             Citizen = citizen,
-            LastCallTime = DateTime.Now,
+            OneCallTime= oneCallTime,
+			LastCallTime = lastCallTime,
             Order = new
             {
                 allOrderNum = allOrderNum,

+ 12 - 0
src/Hotline.Api/Controllers/TestController.cs

@@ -7,6 +7,7 @@ using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Identity.Roles;
+using Hotline.Import;
 using Hotline.Orders;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar;
@@ -20,6 +21,7 @@ using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
+using MiniExcelLibs;
 using NewRock.Sdk;
 using NewRock.Sdk.Security;
 using SqlSugar;
@@ -129,6 +131,16 @@ public class TestController : BaseController
         return OpenResponse.Ok(now);
     }
 
+    [HttpPost("import")]
+    [AllowAnonymous]
+    public async Task<List<ExcelContent>> Import(IFormFile file)
+    {
+        List<ExcelContent> openExcelFile = MiniExcel.Query<ExcelContent>(file.FileName).ToList();
+        return openExcelFile;
+    }
+
+
+
     [HttpGet("time")]
     [AllowAnonymous]
     public async Task<OpenResponse> GetTime()

+ 1 - 0
src/Hotline.Api/Hotline.Api.csproj

@@ -14,6 +14,7 @@
     <PackageReference Include="Mapster.DependencyInjection" Version="1.0.0" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.9" />
     <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="7.0.14" />
+    <PackageReference Include="MiniExcel" Version="1.31.3" />
     <PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.1.0" />
     <PackageReference Include="Serilog.Sinks.MongoDB" Version="5.3.1" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />

+ 1 - 1
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionFilterBuilder.cs

@@ -31,7 +31,7 @@ public class DataPermissionFilterBuilder : IDataPermissionFilterBuilder, IScopeD
             case ETableAccessLevel.Org:
                 return d => d.CreatorOrgId == _sessionContext.RequiredOrgId;
             case ETableAccessLevel.OrgAndBelow:
-                return d => d.AreaId == _sessionContext.AreaId && _sessionContext.OrgLevel <= d.CreatorOrgLevel; //d.CreatorOrgId.StartsWith(orgId);
+                return d => d.CreatorOrgId.StartsWith(_sessionContext.RequiredOrgId); //d.AreaId == _sessionContext.AreaId && _sessionContext.OrgLevel <= d.CreatorOrgLevel;
             case ETableAccessLevel.All:
                 return d => true;
             case ETableAccessLevel.Deny:

+ 96 - 0
src/Hotline.Share/Dtos/Order/DepartmentAcceptanceTypeStatisticsDto.cs

@@ -0,0 +1,96 @@
+namespace Hotline.Share.Dtos.Order
+{
+
+    public class DepartmentAcceptanceTypeStatisticsDto
+    {
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+        public string OrgCode { get; set; }
+
+        /// <summary>
+        /// 部门类型
+        /// </summary>
+        public string OrgType { get; set; }
+
+        /// <summary>
+        /// 总量
+        /// </summary>
+        public int AllCount => ZxAllCount + JyAllCount + QzAllCount + ByAllCount + JbAllCount + TsAllCount + QtAllCount;
+        public double? AllTimes => ZxAllTimes + JyAllTimes + QzAllTimes + ByAllTimes + JbAllTimes + TsAllTimes + QtAllTimes;
+        public double? AverageTime => GetCalculateAverage(AllCount, AllTimes);
+       public string? AcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 咨询
+        /// </summary>
+        public int ZxAllCount { get; set; }
+        public double? ZxAllTimes { get; set; }
+        public double? ZxAverageTime => GetCalculateAverage(ZxAllCount, ZxAllTimes);
+        public string? ZxAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 建议
+        /// </summary>
+        public int JyAllCount { get; set; }
+        public double? JyAllTimes { get; set; }
+        public double? JyAverageTime => GetCalculateAverage(JyAllCount, JyAllTimes);
+        public string? JyAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 求助
+        /// </summary>
+        public int QzAllCount { get; set; }
+        public double? QzAllTimes { get; set; }
+        public double? QzAverageTime => GetCalculateAverage(QzAllCount, QzAllTimes);
+        public string? QzAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 表扬
+        /// </summary>
+        public int ByAllCount { get; set; }
+        public double? ByAllTimes { get; set; }
+        public double? ByAverageTime => GetCalculateAverage(ByAllCount, ByAllTimes);
+        public string? ByAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 举报
+        /// </summary>
+        public int JbAllCount { get; set; }
+        public double? JbAllTimes { get; set; }
+        public double? JbAverageTime => GetCalculateAverage(JbAllCount, JbAllTimes);
+        public string? JbAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 投诉
+        /// </summary>
+        public int TsAllCount { get; set; }
+        public double? TsAllTimes { get; set; }
+        public double? TsAverageTime => GetCalculateAverage(TsAllCount, TsAllTimes);
+        public string? TsAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 其他
+        /// </summary>
+        public int QtAllCount { get; set; }
+        public double? QtAllTimes { get; set; }
+        public double? QtAverageTime => GetCalculateAverage(QtAllCount, QtAllTimes);
+        public string? QtAcceptanceTypeCode { get; set; }
+
+        /// <summary>
+        /// 计算平均
+        /// </summary>
+        /// <param name="count"></param>
+        /// <param name="Times"></param>
+        /// <returns></returns>
+        public double GetCalculateAverage(int count, double? Times)
+        {
+            if (count != 0 && Times != null && Times != 0)
+            {
+                return Math.Round((Times.Value / (double)count) * 100, 2);
+            }
+            return 0;
+        }
+    }
+}

+ 25 - 0
src/Hotline.Share/Requests/DepartmentKeyWordRequest.cs

@@ -0,0 +1,25 @@
+namespace Hotline.Share.Requests
+{
+    public record DepartmentKeyWordRequest : PagedRequest
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartDate { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndDate { get; set; }
+
+        /// <summary>
+        /// 一级部门编码
+        /// </summary>
+        public string? OrgLevelOneCode { get; set; }
+
+        /// <summary>
+        /// 受理类型编码
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+    }
+}

+ 1 - 0
src/Hotline/Hotline.csproj

@@ -11,6 +11,7 @@
     <PackageReference Include="Mapster" Version="7.3.0" />
     <PackageReference Include="MediatR" Version="12.0.1" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="MiniExcel" Version="1.31.3" />
     <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
     <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="XF.Utility.MQ" Version="1.0.9" />

+ 72 - 0
src/Hotline/Import/ExcelContent.cs

@@ -0,0 +1,72 @@
+using Hotline.Share.Enums.Order;
+using MiniExcelLibs.Attributes;
+
+
+namespace Hotline.Import
+{
+    public class ExcelContent
+    {
+        [ExcelColumnName("编号")]
+        public string No { get; set; }
+
+        [ExcelColumnName("标题")]
+        public string Title { get; set; }
+
+        [ExcelColumnName("受理时间")]
+        public DateTime StartTime { get; set; }
+
+        [ExcelColumnName("内容")]
+        public string Content { get; set; }
+
+        [ExcelColumnName("受理类型编号(字典值)")]
+        public string AcceptTypeCode { get; set; }
+
+        [ExcelColumnName("受理类型")]
+        public string AcceptType { get; set; }
+
+        [ExcelColumnName("热点全称")]
+        public string HotspotFullName { get; set; }
+
+        [ExcelColumnName("热点名称")]
+        public string HotspotName { get; set; }
+
+        [ExcelColumnName("热点编码")]
+        public string HotspotCode { get; set; }
+
+        [ExcelColumnName("事件全称")]
+        public string EventFullName { get; set; }
+
+        [ExcelColumnName("事件名称")]
+        public string EventName { get; set; }
+
+        [ExcelColumnName("事件编码")]
+        public string EventCode { get; set; }
+
+        [ExcelColumnName("地址编码")]
+        public string AreaCode { get; set; }
+
+        [ExcelColumnName("市")]
+        public string CityName { get; set; }
+
+        [ExcelColumnName("区")]
+        public string County { get; set; }
+
+        [ExcelColumnName("详细地址")]
+        public string Address { get; set; }
+
+        [ExcelColumnName("办结时间")]
+        public DateTime ActualHandleTime { get; set; }
+
+        [ExcelColumnName("办结意见")]
+        public string ActualOpinion { get; set; }
+
+        [ExcelColumnName("办结部门")]
+        public string ActualHandleOrgName { get; set; }
+
+        [ExcelColumnName("联系电话")]
+        public string Contact { get; set; }
+
+        [ExcelColumnName("来电人身份")]
+        public EIdentityType IdentityType { get; set; }
+    }
+}

+ 2 - 0
src/Hotline/Orders/Order.cs

@@ -8,6 +8,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Users;
 using SqlSugar;
+using System.ComponentModel;
 using XF.Domain.Exceptions;
 using XF.Domain.Extensions;
 using XF.Domain.Repository;
@@ -18,6 +19,7 @@ namespace Hotline.Orders
     /// <summary>
     /// 工单
     /// </summary>
+    [Description("工单")]
     [SugarIndex("unique_order_no", nameof(Order.No), OrderByType.Desc, true)]
     public partial class Order : PositionWorkflowEntity
     {

+ 1 - 2
src/Hotline/Push/FWMessage/IPushDomainService.cs

@@ -1,5 +1,4 @@
 using Hotline.Share.Dtos.Push;
-using Hotline.Share.Dtos.Push.FWMessage;
 
 namespace Hotline.Push.FWMessage
 {
@@ -21,6 +20,6 @@ namespace Hotline.Push.FWMessage
         /// <returns></returns>
         Task PushMsgUpdateStateAsync(PushReceiveMessageDto dto, CancellationToken cancellation);
 
-       
+
     }
 }

+ 0 - 2
src/Hotline/Push/FWMessage/Message.cs

@@ -1,7 +1,5 @@
 using Hotline.Orders;
-using Hotline.Settings;
 using Hotline.Share.Enums.Push;
-using Hotline.Users;
 using SqlSugar;
 using XF.Domain.Repository;
 

+ 1 - 3
src/Hotline/Push/MessageTemplate.cs

@@ -1,6 +1,4 @@
-using Hotline.Share.Enums.Push;
-using SqlSugar;
-using XF.Domain.Repository;
+using XF.Domain.Repository;
 
 namespace Hotline.Push
 {