فهرست منبع

部门满意度明细表

Dun.Jason 10 ماه پیش
والد
کامیت
0ccbf3c0b3

+ 47 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -10,6 +10,7 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.Bigscreen;
 using Hotline.Share.Dtos.CallCenter;
@@ -23,6 +24,7 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using MiniExcelLibs;
 using SqlSugar;
+using System.Data;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
@@ -2961,6 +2963,51 @@ namespace Hotline.Api.Controllers.Bi
             var stream = ExcelHelper.CreateStream(dataTable);
             return ExcelStreamResult(stream, "受理类型分时统计数据");
         }
+
+        /// <summary>
+        /// 部门满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("org-visitdetail-list")]
+        public async Task<PagedDto<OrgVisitDetailListResp>> OrgVisitDetailList([FromQuery]OrgVisitDetailListReq dto)
+        {
+            var query = _orderRepository.OrgVisitDetailList(dto);
+            var (total,items) =await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
+        }
+
+        /// <summary>
+        /// 部门满意度明细导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("org-visitdetail-list-export")]
+        public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
+        {
+            var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
+
+            List<OrderVisitDetail> orders;
+            if (dto.IsExportAll)
+            {
+                orders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                orders = items;
+            }
+            var ordersDtos = _mapper.Map<ICollection<OrgVisitDetailListResp>>(orders);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = ordersDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "部门满意度明细");
+        }
     }
 
 }

+ 36 - 0
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -40,6 +40,42 @@ public class OrderMapperConfigs : IRegister
                 d.IsSuccessText = s.IsSuccess == true ? "是" : "否";
             });
 
+        config.ForType<OrderVisitDetail, OrgVisitDetailListResp>()
+            //.IgnoreIf((s, d) => s.OrderVisit == null, d => d.VisitId)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.Id)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.No)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.ReTransactNum)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.HotspotSpliceName)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.OrgLevelOneName)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.ActualHandleOrgName)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.Title)
+            .IgnoreIf((s, d) => s.OrderVisit.Employee == null, d => d.VisitUser)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.Content)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.FileOpinion)
+            .IgnoreIf((s, d) => s.OrderVisit.Order == null, d => d.FiledTime)
+            .Map(d => d.VisitId, s => s.OrderVisit.Id)
+            .Map(d => d.Id, s => s.OrderVisit.Order.Id)
+            .Map(d => d.No, s => s.OrderVisit.Order.No)
+            .Map(d => d.ReTransactNum, s => s.OrderVisit.Order.ReTransactNum)
+            .Map(d => d.HotspotSpliceName, s => s.OrderVisit.Order.HotspotSpliceName)
+            .Map(d => d.OrgLevelOneName, s => s.OrderVisit.Order.OrgLevelOneName)
+            .Map(d => d.ActualHandleOrgName, s => s.OrderVisit.Order.ActualHandleOrgName)
+            .Map(d => d.Title, s => s.OrderVisit.Order.Title)
+            .Map(d => d.VisitUser, s => s.OrderVisit.Employee.Name)
+            .Map(d => d.VisitType, s => s.OrderVisit.VisitType)
+            .Map(d => d.VisitTime, s => s.OrderVisit.VisitTime)
+            .Map(d => d.Content, s => s.OrderVisit.Order.Content)
+            .Map(d => d.FileOpinion, s => s.OrderVisit.Order.FileOpinion)
+            .Map(d => d.FiledTime, s => s.OrderVisit.Order.FiledTime)
+            .AfterMapping((s, d) =>
+            {
+                d.OrderScreenStatus = s.OrderVisit.Order.OrderScreens.OrderByDescending(q=>q.CreationTime).FirstOrDefault()?.Status;
+                d.OrgProcessingResults = s.OrgProcessingResults.Value;
+            });
+
+            
+
+
 
 
         config.ForType<AddOrderDto, Order>()

+ 29 - 0
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -6,10 +6,12 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 using SqlSugar;
 using System.Data;
 using System.Reflection;
+using System.Reflection.Emit;
 using XF.Domain.Dependency;
 
 namespace Hotline.Repository.SqlSugar.Orders
@@ -600,6 +602,33 @@ namespace Hotline.Repository.SqlSugar.Orders
             return dt;
         }
 
+        /// <summary>
+        /// 满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderVisitDetail> OrgVisitDetailList(OrgVisitDetailListReq dto)
+        {
+            return Db.Queryable<OrderVisitDetail>()
+                .Includes(x => x.OrderVisit, x => x.Order, x => x.OrderScreens)
+                .Includes(x => x.OrderVisit, x => x.Employee)
+                .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.VisitTarget == EVisitTarget.Org)
+                .WhereIF(dto.OrgVisitStatisticsType.HasValue, x => x.OrderVisit.Order.ProcessType == (EProcessType)((int)dto.OrgVisitStatisticsType))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
+                .WhereIF(!string.IsNullOrEmpty(dto.VisitUser), x => x.OrderVisit.Employee.Name.Contains(dto.VisitUser))
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order.Title.Contains(dto.Title))
+                .WhereIF(dto.OrgCodes.Any(), x => dto.OrgCodes.Contains(x.VisitOrgCode))
+                .WhereIF(dto.HotspotIds.Any(), x => dto.HotspotIds.Contains(x.OrderVisit.Order.HotspotId))
+                .WhereIF(dto.Channels.Any(), x => dto.Channels.Contains(x.OrderVisit.Order.SourceChannelCode))
+                .WhereIF(dto.CreationTimeStart.HasValue, x => x.OrderVisit.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始
+                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.OrderVisit.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+                .WhereIF(dto.ActualHandleTimeStart.HasValue, x => x.OrderVisit.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
+                .WhereIF(dto.ActualHandleTimeEnd.HasValue, x => x.OrderVisit.Order.ActualHandleTime <= dto.ActualHandleTimeEnd); //办结时间结束
+        }
+
+
+
         public ISugarQueryable<SelectOrderId> OrderListUnionAll(ISugarQueryable<SelectOrderId> t1, ISugarQueryable<SelectOrderId> t2)
         {
             return Db.UnionAll(t1, t2).Select(it => new SelectOrderId { Id = it.Id }).MergeTable();

+ 100 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -271,6 +271,106 @@ namespace Hotline.Share.Dtos.Order
     }
 
 
+	public class OrgVisitDetailListResp
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 回访ID
+		/// </summary>
+		public string VisitId { get; set; }
+		/// <summary>
+		/// 工单编号
+		/// </summary>
+		public string No { get; set; }
+
+		/// <summary>
+		/// 重办次数
+		/// </summary>
+		public string ReTransactNum { get; set; }
+
+		/// <summary>
+		/// 甄别状态
+		/// </summary>
+		public EScreenStatus? OrderScreenStatus { get; set; }
+		public string? OrderScreenStatusText => OrderScreenStatus?.GetDescription();
+
+        /// <summary>
+        /// 回访内容
+        /// </summary>
+        public string VisitContent { get; set; }
+
+		/// <summary>
+		/// 热点全称
+		/// </summary>
+		public string HotspotSpliceName { get; set; }
+
+		/// <summary>
+		/// 一级部门
+		/// </summary>
+		public string OrgLevelOneName { get; set; }
+
+		/// <summary>
+		/// 办结部门
+		/// </summary>
+		public string ActualHandleOrgName { get; set; }
+
+		/// <summary>
+		/// 受理时间
+		/// </summary>
+		public DateTime CreationTime { get; set; }
+
+		/// <summary>
+		/// 工单标题
+		/// </summary>
+		public string Title { get; set; }
+
+		/// <summary>
+		/// 回访人
+		/// </summary>
+		public string VisitUser { get; set; }
+
+		/// <summary>
+		/// 回访部门
+		/// </summary>
+		public string VisitOrgName { get; set; }
+
+		/// <summary>
+		/// 回访方式
+		/// </summary>
+		public EVisitType? VisitType { get; set; }
+
+		public string? VisitTypeText => VisitType?.GetDescription();
+
+		/// <summary>
+		/// 回访时间
+		/// </summary>
+		public DateTime VisitTime { get; set; }
+
+		/// <summary>
+		/// 满意度
+		/// </summary>
+		public string OrgProcessingResults { get; set; }
+
+		/// <summary>
+		/// 受理内容
+		/// </summary>
+		public string Content { get; set; }
+
+		/// <summary>
+		/// 承办意见
+		/// </summary>
+		public string FileOpinion { get; set;}
+
+		/// <summary>
+		/// 办结时间
+		/// </summary>
+		public DateTime? FiledTime { get; set; }
+    }
+
 
 
     public class VisitAndOrgSatisfactionStatisticsDto

+ 14 - 0
src/Hotline.Share/Enums/Order/EOrgVisitStatisticsType.cs

@@ -0,0 +1,14 @@
+
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.Order
+{
+    public enum EOrgVisitStatisticsType
+    {
+        [Description("中心统计")]
+        CallCenter = 10,
+
+        [Description("部门统计")]
+        Org = 20,
+    }
+}

+ 56 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -289,3 +289,59 @@ public record TimeSharingPagedKeywordRequest : PagedKeywordRequest
     public List<string> AddColumnName { get; set; }
 }
 
+
+public record OrgVisitDetailListReq: PagedKeywordRequest
+{
+    /// <summary>
+    /// 部门分类
+    /// </summary>
+    public EOrgVisitStatisticsType? OrgVisitStatisticsType { get; set; }
+
+    /// <summary>
+    /// 办件结果
+    /// </summary>
+    public string? OrgProcessingResults { get; set; }
+
+    /// <summary>
+    /// 回访人
+    /// </summary>
+    public string? VisitUser { get; set; }
+
+    /// <summary>
+    /// 工单编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 工单标题
+    /// </summary>
+    public string? Title { get; set; }
+
+    /// <summary>
+    /// 回访部门
+    /// </summary>
+    public List<string> OrgCodes { get; set; } = new();
+
+    /// <summary>
+    /// 热点分类
+    /// </summary>
+    public List<string> HotspotIds { get; set; } = new();
+
+    /// <summary>
+    /// 来源渠道(√)
+    /// </summary>
+    public List<string> Channels { get; set; } = new();
+
+    /// <summary>
+    /// 受理时间(工单创建时间)(√)
+    /// </summary>
+    public DateTime? CreationTimeStart { get; set; }
+    public DateTime? CreationTimeEnd { get; set; }
+
+    /// <summary>
+    /// 办结时间(√)
+    /// </summary>
+    public DateTime? ActualHandleTimeStart { get; set; }
+    public DateTime? ActualHandleTimeEnd { get; set; }
+}
+

+ 7 - 0
src/Hotline/Orders/IOrderRepository.cs

@@ -68,6 +68,13 @@ namespace Hotline.Orders
         /// <returns></returns>
         Task<DataTable> OrderAcceptanceTimeExport(TimeSharingPagedKeywordRequest dto);
 
+        /// <summary>
+        /// 满意度明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisitDetail> OrgVisitDetailList(OrgVisitDetailListReq dto);
+
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>

+ 3 - 4
src/Hotline/dataview.md

@@ -37,7 +37,7 @@ END AS "OrderScreenStatus"
 "ExpiredTime" AS "ExpiredTime" , 
 "OrgLevelOneName" AS "OrgLevelOneName" , 
 "OrgLevelTwoName" AS "OrgLevelTwoName" , 
-"AcceptorOrgName" AS "AcceptorOrgName" , 
+"ActualHandleOrgName" AS "ActualHandleOrgName" , 
 "FiledTime" AS "FiledTime" , 
 "AcceptType" AS "AcceptType" , 
 "HotspotName" AS "HotspotName",
@@ -71,7 +71,7 @@ END AS "FromGender" ,
 "Content" AS "Content" , 
 "ActualOpinion" AS "ActualOpinion" ,
 "FileOpinion" AS "FileOpinion" ,
-"Id" AS "SugarNav_Id" FROM "order" ordertemp  WHERE (( "CreationTime" >= '2024-06-26' ) AND ( "CreationTime" < '2024-07-3' ))  AND ( "IsDeleted" = FALSE )ORDER BY "CreationTime" ASC) aaa
+"Id" AS "SugarNav_Id" FROM "order" ordertemp  WHERE (( "CreationTime" >= '2024-03-29' ) AND ( "CreationTime" < '2024-07-1' ))  AND ( "IsDeleted" = FALSE )ORDER BY "CreationTime" ASC) aaa
 left join 
 (select DISTINCT CASE visitdetailtemp."SeatEvaluate"
 	WHEN 0 THEN '默认满意'
@@ -85,5 +85,4 @@ left join
 END AS "SeatVisitResult",visittemp."OrderId" as "OrderId"
  from order_visit visittemp
 left join order_visit_detail visitdetailtemp on visittemp."Id"= visitdetailtemp."VisitId"  
-where visittemp."CreationTime">='2024-06-26' and visitdetailtemp."VisitTarget"=10 AND visittemp."VisitState"=30 ) bbb on aaa."SugarNav_Id"=bbb."OrderId"
-
+where visittemp."CreationTime">='2024-03-29' and visitdetailtemp."VisitTarget"=10 AND visittemp."VisitState"=30 ) bbb on aaa."SugarNav_Id"=bbb."OrderId"