田爽 9 月之前
父節點
當前提交
70a5175b74

+ 6 - 3
src/Hotline.Api/Controllers/OrderController.cs

@@ -4275,7 +4275,7 @@ public class OrderController : BaseController
                     ETimeType.WorkDay,
                     dto.TimeLimit.Value, order.AcceptTypeCode);
                 endTime = expiredTime.EndTime;
-                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne })
+                await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,Status = EOrderStatus.SendBack })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
@@ -6173,7 +6173,7 @@ public class OrderController : BaseController
         if (string.IsNullOrEmpty(dto.StepId))
         {
             await _orderRepository.Updateable()
-                .SetColumns(o => new Orders.Order() { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username })
+                .SetColumns(o => new Orders.Order() { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username,Status = EOrderStatus.HandOver })
                 .Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
         }
         else
@@ -6187,7 +6187,10 @@ public class OrderController : BaseController
             {
                 new(dto.Handler.UserId,dto.Handler.Username,dto.Handler.OrgId,dto.Handler.OrgName,step.RoleId,step.RoleName, new List<WorkflowStep>{step})
             }, HttpContext.RequestAborted);
-        }
+			await _orderRepository.Updateable()
+				.SetColumns(o => new Orders.Order() { Status = EOrderStatus.HandOver })
+				.Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
+		}
     }
 
     #endregion

+ 155 - 0
src/Hotline.Api/Controllers/ProvinceStatisticsController.cs

@@ -0,0 +1,155 @@
+using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.ProvinceStatistics;
+using Hotline.Share.Enums.Order;
+using MapsterMapper;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Authentications;
+using XF.Domain.Exceptions;
+using XF.Domain.Repository;
+
+namespace Hotline.Api.Controllers
+{
+    public class ProvinceStatisticsController : BaseController
+    {
+        private readonly IMapper _mapper;
+        private readonly ISessionContext _sessionContext;
+        private readonly IRepository<OrderSendBack> _orderSendBackRepository;
+        private readonly IRepository<OrderDelay> _orderDelayRepository;
+        private readonly IRepository<OrderScreen> _orderScreenRepository;
+
+
+        public ProvinceStatisticsController(IMapper mapper,
+           ISessionContext sessionContext,
+            IRepository<OrderSendBack> orderSendBackRepository,
+            IRepository<OrderDelay> orderDelayRepository,
+            IRepository<OrderScreen> orderScreenRepository)
+        {
+            _mapper = mapper;
+            _sessionContext = sessionContext;
+            _orderSendBackRepository = orderSendBackRepository;
+            _orderDelayRepository = orderDelayRepository;
+            _orderScreenRepository = orderScreenRepository;
+        }
+
+        /// <summary>
+        /// 省退单查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_send_back_list")]
+        public async Task<PagedDto<ProvinceSendBackListDto>> GetProvinceSendBackList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            var (total, items) = await _orderSendBackRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.Destination == ESendBackDestination.Province && p.State == dto.State)
+                           .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.CreatorName == dto.ApplyUserName)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime <= dto.ApplyStartTime.Value)
+                           .OrderByDescending(x => x.CreationTime)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceSendBackListDto>(total, _mapper.Map<IReadOnlyList<ProvinceSendBackListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获取退回详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_send_back_detail")]
+        public async Task<OrderSendBack> GetOrderSendBackDetail(string id)
+        {
+            var data = await _orderSendBackRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("退回查询失败");
+            return data;
+        }
+
+        /// <summary>
+        /// 省延期查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_order_delay_list")]
+        public async Task<PagedDto<ProvinceOrderDelayListDto>> GetProvinceOrderDelayList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            var (total, items) = await _orderDelayRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.IsProDelay == true && (int)p.DelayState == dto.State)
+                           .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.EmployeeName == dto.ApplyUserName)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.ApplyDelayTime >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.ApplyDelayTime <= dto.ApplyStartTime.Value)
+                           .OrderByDescending(x => x.ApplyDelayTime)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceOrderDelayListDto>(total, _mapper.Map<IReadOnlyList<ProvinceOrderDelayListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获取延期详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_delay_detail")]
+        public async Task<OrderDelay> GetOrderDelayDetail(string id)
+        {
+            var data = await _orderDelayRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("延期查询失败");
+            return data;
+        }
+
+        /// <summary>
+        /// 省甄别查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_province_order_screen_list")]
+        public async Task<PagedDto<ProvinceOrderScreenListDto>> GetProvinceOrderScreenList([FromQuery] QueryProvinceSendBackDto dto)
+        {
+            dto.State = dto.State switch
+            {
+                0 => 1,
+                1 => 2,
+                2 => 3,
+                _ => 1,
+            };
+            var (total, items) = await _orderScreenRepository.Queryable()
+                           .Includes(p => p.Order)
+                           .Where(p => p.IsProScreen == true && (int)p.Status == dto.State)
+                          .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No == dto.No)
+                           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title == dto.Title)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.Order.ProvinceNo == dto.ProvinceNo)
+                           .WhereIF(!string.IsNullOrEmpty(dto.ApplyUserName), p => p.CreatorName == dto.ApplyUserName)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime >= dto.ApplyStartTime.Value)
+                           .WhereIF(dto.ApplyStartTime.HasValue, p => p.CreationTime <= dto.ApplyStartTime.Value)
+                           .OrderByDescending(x => x.CreationTime)
+                           .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<ProvinceOrderScreenListDto>(total, _mapper.Map<IReadOnlyList<ProvinceOrderScreenListDto>>(items));
+        }
+
+        /// <summary>
+        /// 获取甄别详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_screen_detail")]
+        public async Task<OrderScreen> GetOrderScreenDetail(string id)
+        {
+            var data = await _orderScreenRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data == null)
+                throw UserFriendlyException.SameMessage("甄别查询失败");
+            return data;
+        }
+    }
+}

+ 3 - 0
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -237,6 +237,9 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                 {
                     screen.Status = EScreenStatus.Approval;
                     screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
+                    //如果下个节点是省审批,则修改为省甄别
+                    if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org && nextTag.Value == TagDefaults.TagValue.Province)
+                        screen.IsProScreen = true;
                     await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
                 }
 

+ 3 - 2
src/Hotline.Application/Orders/OrderApplication.cs

@@ -231,7 +231,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
 			//.Where(d => d.ExpiredTime != null &&
    //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
-            .Where(d=>d.Status < EOrderStatus.Filed && ( dateTime > d.NearlyExpiredTimeOne || dateTime > d.NearlyExpiredTime ) && dateTime < d.ExpiredTime)
+            .Where(d=>d.Status < EOrderStatus.Filed && (dateTime > d.NearlyExpiredTimeOne  || dateTime > d.NearlyExpiredTime) && dateTime < d.ExpiredTime)
             .OrderByDescending(d => d.CreationTime);
     }
 
@@ -1288,7 +1288,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             _mapper.Map(dto, order);
             if (files != null && files.Any())
                 order.FileJson = await _fileRepository.AddFileAsync(files, order.Id, "", cancellationToken);
-            await _orderRepository.UpdateAsync(order, cancellationToken);
+            order.ReTransactNum++;
+			await _orderRepository.UpdateAsync(order, cancellationToken);
 
             if (orderExtension is not null)
             {

+ 2 - 2
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -231,7 +231,7 @@ namespace Hotline.Application.Orders
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
-                .Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle)
+                .Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
                 .Where((x, s) => x.OrderVisit.Order.CounterSignType == null && x.OrderVisit.Order.ActualHandleOrgCode == _sessionContext.OrgId)
                 ;
             if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
@@ -239,7 +239,7 @@ namespace Hotline.Application.Orders
                 query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                         (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
                                   x.OrderVisit.Order.No.Contains(dto.Keyword!))
-                    .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
+                    .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
                         SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
                         SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
                         || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||

+ 27 - 7
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -126,6 +126,14 @@ namespace Hotline.Application.Subscribers
             {
                 sendBack.Result = dto.Result;
                 sendBack.Reason = dto.Reason;
+                sendBack.AuditName = dto.AuditName;
+                sendBack.AuditOrgName = dto.AuditOrgName;
+                sendBack.AuditTime = dto.AuditTime;
+                if (dto.Result == 0)
+                    sendBack.State = 2;
+                else if (dto.Result == 1)
+                    sendBack.State = 1;
+
                 if (dto.Files != null && dto.Files.Any())
                 {
                     sendBack.FileJson = await _fileRepository.AddFileAsync(dto.Files, sendBack.Id, string.Empty, cancellationToken);
@@ -180,7 +188,7 @@ namespace Hotline.Application.Subscribers
                 }
                 await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
             }
-            
+
         }
 
         /// <summary>
@@ -355,6 +363,10 @@ namespace Hotline.Application.Subscribers
             //    }
             //}
             orderScreen.ReplyContent = dto.ProvinceScreenResult.AuditOpinion;
+            orderScreen.AuditName = dto.ProvinceScreenResult.AuditPerson;
+            orderScreen.AuditOrgName = dto.ProvinceScreenResult.AuditOuname;
+            orderScreen.AuditTime = dto.ProvinceScreenResult.AuditTime;
+
             if (dto.Files.Any())
                 orderScreen.FileJson =
                     await _fileRepository.AddFileAsync(dto.Files, orderScreen.Id, "", cancellationToken);
@@ -490,13 +502,21 @@ namespace Hotline.Application.Subscribers
                 //查询延期
                 var orderDelay = await _orderDelayRepository
                     .GetAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, cancellationToken);
-                if (dto.Files != null && dto.Files.Any())
-                    orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
-                await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
+                if (orderDelay != null)
+                {
+                    orderDelay.AuditName = dto.AuditName;
+                    orderDelay.AuditOrgName = dto.AuditOrgName;
+                    orderDelay.AuditTime = dto.AuditTime;
+                    orderDelay.AuditOpinion = dto.Opinion;
 
-                var current = SessionContextCreator.CreateSessionContext(dto.Source);
-                await _workflowApplication.HandleToEndAsync(current, orderDelay.WorkflowId, dto.Opinion, dto.Files,
-                    dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken);
+                    if (dto.Files != null && dto.Files.Any())
+                        orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
+                    await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
+
+                    var current = SessionContextCreator.CreateSessionContext(dto.Source);
+                    await _workflowApplication.HandleToEndAsync(current, orderDelay.WorkflowId, dto.Opinion, dto.Files,
+                        dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken);
+                }
             }
         }
 

+ 18 - 0
src/Hotline.Share/Dtos/DataSharing/PusherHotlineDto/OrderSendBackResultDto.cs

@@ -16,5 +16,23 @@ public class OrderSendBackResultDto : DsSource
     /// </summary>
     public string? Reason { get; set; }
 
+    /// <summary>
+    /// 审核人
+    /// </summary>
+    public string? AuditName { get; set; }
+
+    /// <summary>
+    /// 审核部门
+    /// </summary>
+    public string? AuditOrgName { get; set; }
+
+    /// <summary>
+    /// 审核时间
+    /// </summary>
+    public DateTime? AuditTime { get; set; }
+
+    /// <summary>
+    /// 附件
+    /// </summary>
     public List<FileDto> Files { get; set; }
 }

+ 15 - 0
src/Hotline.Share/Dtos/DataSharing/PusherHotlineDto/ProvinceSendDelayResultDto.cs

@@ -21,6 +21,21 @@ namespace Hotline.Share.Dtos.DataSharing.PusherHotlineDto
         /// </summary>
         public string Opinion { get; set; }
 
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
         public List<FileDto> Files { get; set; }
     }
 }

+ 148 - 0
src/Hotline.Share/Dtos/ProvinceStatistics/OrderBaseDto.cs

@@ -0,0 +1,148 @@
+using Hotline.Share.Enums.Order;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.ProvinceStatistics
+{
+    public class OrderBaseDto
+    {
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus Status { get; set; }
+        public string StatusText => Status.GetDescription();
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public EExpiredStatus? ExpiredStatus => CalculateExpiredState();
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public string ExpiredStatusText => ExpiredStatus?.GetDescription() ?? string.Empty;
+
+        /// <summary>
+        /// 工单编码(20220101000001)
+        /// </summary>
+        public string No { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? SourceChannel { get; set; }
+        public string? SourceChannelCode { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string? HotspotId { get; set; }
+        public string? HotspotName { get; set; }
+        public string? HotspotSpliceName { get; set; }
+
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 省编号
+        /// </summary>
+        public string? ProvinceNo { get; set; }
+
+        /// <summary>
+        /// 过期时间
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期时间
+        /// </summary>
+        public DateTime? NearlyExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期第一级
+        /// </summary>
+        public DateTime? NearlyExpiredTimeOne { get; set; }
+
+        /// <summary>
+        /// 实际办理节点名称(会签状态此字段保存最外层会签发起节点名称)
+        /// </summary>
+        public string? ActualHandleStepName { get; set; }
+
+        /// <summary>
+        /// 是否紧急
+        /// </summary>
+        public bool IsUrgent { get; set; }
+
+        public string IsUrgentText => IsUrgent ? "紧急" : "";
+
+        /// <summary>
+        /// 实际办理时间
+        /// </summary>
+        public DateTime? ActualHandleTime { get; set; }
+
+        /// <summary>
+        /// 实际办理人id
+        /// </summary>
+        public string? ActualHandlerId { get; set; }
+
+        /// <summary>
+        /// 实际办理人名称
+        /// </summary>
+        public string? ActualHandlerName { get; set; }
+
+        /// <summary>
+        /// 实际办理部门名称
+        /// </summary>
+        public string? ActualHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 实际办理部门编码
+        /// </summary>
+        public string? ActualHandleOrgCode { get; set; }
+
+        public EExpiredStatus? CalculateExpiredState()
+        {
+            DateTime? dateTime = DateTime.Now;
+            if (Status >= EOrderStatus.Filed)
+            {
+                dateTime = ActualHandleTime;
+            }
+            //ExpiredStatus
+            if (ExpiredTime.HasValue)
+            {
+                if (NearlyExpiredTimeOne.HasValue && dateTime < NearlyExpiredTimeOne)
+                {
+                    return EExpiredStatus.Normal;
+                }
+                else if (!NearlyExpiredTimeOne.HasValue && dateTime < NearlyExpiredTime)
+                {
+                    return EExpiredStatus.Normal;
+                }
+                else if (NearlyExpiredTimeOne.HasValue && dateTime > NearlyExpiredTimeOne && dateTime < NearlyExpiredTime)
+                {
+                    return EExpiredStatus.GoingToExpiredOne;
+                }
+                else if (dateTime > NearlyExpiredTime && dateTime < ExpiredTime)
+                {
+                    return EExpiredStatus.GoingToExpired;
+                }
+                else
+                {
+                    return EExpiredStatus.Expired;
+                }
+            }
+            return null;
+        }
+    }
+}

+ 240 - 0
src/Hotline.Share/Dtos/ProvinceStatistics/ProvinceSendBackListDto.cs

@@ -0,0 +1,240 @@
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.ProvinceStatistics
+{
+    /// <summary>
+    /// 退回
+    /// </summary>
+    public class ProvinceSendBackListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string? CreatorName { get; set; }
+
+        /// <summary>
+        /// 申请部门
+        /// </summary>
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 申请原因
+        /// </summary>
+        public string? Content { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? AuditOpinion { get; set; }
+
+        /// <summary>
+		/// 工单
+		/// </summary>
+		public OrderDto Order { get; set; }
+
+        /// <summary>
+        ///  审核结果  0  待审核  1 审核通过  2 审核不通过
+        /// </summary>
+        public int State { get; set; }
+
+        public string StateText => CalcRate(State);
+
+        public string CalcRate(int state)
+        {
+            if (state == 1)
+                return "同意";
+            else if (state == 2)
+                return "不同意";
+            else
+                return "申请中";
+        }
+    }
+
+    /// <summary>
+    /// 延期
+    /// </summary>
+    public class ProvinceOrderDelayListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 延期申请时间
+        /// </summary>
+        public DateTime ApplyDelayTime { get; set; }
+
+        /// <summary>
+        /// 申请部门Code
+        /// </summary>
+        public string ApplyOrgCode { get; set; }
+
+        /// <summary>
+        /// 申请部门名称
+        /// </summary>
+        public string ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string EmployeeId { get; set; }
+
+        /// <summary>
+        /// 申请人名称
+        /// </summary>
+        public string? EmployeeName { get; set; }
+
+        /// <summary>
+        /// 延期申请时限
+        /// </summary>
+        public int DelayNum { get; set; }
+
+        /// <summary>
+        /// 延期申请单位
+        /// </summary>
+        public ETimeType DelayUnit { get; set; }
+        public string? DelayUnitText => DelayUnit.GetDescription();
+
+        /// <summary>
+        /// 延期申请理由
+        /// </summary>
+        public string DelayReason { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? AuditOpinion { get; set; }
+
+        /// <summary>
+        /// 审批状态
+        /// </summary>
+        public EDelayState DelayState { get; set; }
+
+        public string? DelayStateText => DelayState.GetDescription();
+
+    }
+
+    /// <summary>
+    /// 甄别
+    /// </summary>
+    public class ProvinceOrderScreenListDto
+    {
+        /// <summary>
+        /// 业务Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string? CreatorName { get; set; }
+
+        /// <summary>
+        /// 申请部门
+        /// </summary>
+        public string? CreatorOrgName { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 甄别申请原因
+        /// </summary>
+        public string? Content { get; set; }
+
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 审核内容
+        /// </summary>
+        public string? ReplyContent { get; set; }
+
+        /// <summary>
+        /// 甄别申请状态
+        /// </summary>
+        public EScreenStatus Status { get; set; }
+
+        public string? StatusText => Status.GetDescription();
+
+    }
+}

+ 42 - 0
src/Hotline.Share/Dtos/ProvinceStatistics/QueryProvinceSendBackDto.cs

@@ -0,0 +1,42 @@
+using Hotline.Share.Requests;
+
+namespace Hotline.Share.Dtos.ProvinceStatistics
+{
+    public record QueryProvinceSendBackDto : PagedRequest
+    {
+        /// <summary>
+        /// 本地编号
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 省编号
+        /// </summary>
+        public string? ProvinceNo { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string ApplyUserName { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime? ApplyStartTime { get; set; }
+
+        /// <summary>
+        /// 申请时间
+        /// </summary>
+        public DateTime? ApplyEndTime { get; set; }
+
+        /// <summary>
+        ///  审核结果  0  待审核  1 审核通过  2 审核不通过
+        /// </summary>
+        public int State { get; set; } = 0;
+    }
+}

+ 1 - 1
src/Hotline.Share/Enums/Order/EOrderStatus.cs

@@ -58,7 +58,7 @@ public enum EOrderStatus
 	/// 特提审批中
 	/// </summary>
 	[Description("特提审批中")]
-	SpecialAudit = 105,
+	SpecialAudit = 104,
 
 	/// <summary>
 	/// 退回审批中

+ 4 - 0
src/Hotline/Hotline.csproj

@@ -22,4 +22,8 @@
     <ProjectReference Include="..\XF.Domain.Repository\XF.Domain.Repository.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Province\" />
+  </ItemGroup>
+
 </Project>

+ 23 - 0
src/Hotline/Orders/OrderDelay.cs

@@ -92,6 +92,29 @@ namespace Hotline.Orders
         /// </summary>
         public EDelayState DelayState { get; set; }
 
+        #region 用于省平台查询
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核意见", ColumnDataType = "varchar(2000)")]
+        public string? AuditOpinion { get; set; } 
+        #endregion
+
         /// <summary>
         /// 审批类型
         /// </summary>

+ 24 - 0
src/Hotline/Orders/OrderScreen.cs

@@ -78,6 +78,30 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDescription = "甄别申请回复", ColumnDataType = "varchar(2000)")]
         public string? ReplyContent { get; set; }
 
+        #region 用于省平台查询
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
+
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
+
+        /// <summary>
+        /// 是否省甄别
+        /// </summary>
+        [SugarColumn(DefaultValue = "f")]
+        public bool IsProScreen { get; set; }
+
+        #endregion
+
 
         /// <summary>
         /// 甄别截至申请时间

+ 54 - 55
src/Hotline/Orders/OrderSendback.cs

@@ -1,13 +1,7 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Hotline.File;
-using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Enums.Order;
 using SqlSugar;
+using System.ComponentModel;
 using XF.Domain.Repository;
 
 namespace Hotline.Orders
@@ -17,64 +11,69 @@ namespace Hotline.Orders
     /// </summary>
 	[Description("工单退回")]
     public class OrderSendBack : FullStateEntity
-	{
+    {
         public string OrderId { get; set; }
 
-		/// <summary>
-		/// 默认操作类型 服务工单退回 0
-		/// </summary>
-		public int Handle { get; set; } = 0;
+        /// <summary>
+        /// 默认操作类型 服务工单退回 0
+        /// </summary>
+        public int Handle { get; set; } = 0;
+
+        /// <summary>
+        /// 申请原因
+        /// </summary>
+        [SugarColumn(ColumnDescription = "申请原因", ColumnDataType = "varchar(2000)")]
+        public string? Content { get; set; }
 
-		/// <summary>
-		/// 申请原因
-		/// </summary>
-		[SugarColumn(ColumnDescription = "申请原因", ColumnDataType = "varchar(2000)")]
-		public string? Content { get; set; }
+        /// <summary>
+        /// 省上退回反馈结果
+        /// </summary>
+        public int? Result { get; set; }
 
-		/// <summary>
-		/// 省上退回反馈结果
-		/// </summary>
-		public int? Result {  get; set; }
+        /// <summary>
+        /// 省上退回反馈
+        /// </summary>
+        [SugarColumn(ColumnDescription = "退回反馈", ColumnDataType = "varchar(2000)")]
+        public string? Reason { get; set; }
 
-		/// <summary>
-		/// 省上退回反馈
-		/// </summary>
-		[SugarColumn(ColumnDescription = "退回反馈", ColumnDataType = "varchar(2000)")]
-		public string? Reason { get; set; }
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? AuditName { get; set; }
 
-		/// <summary>
-		/// 审核人
-		/// </summary>
-		public string? AuditName { get; set; }
+        /// <summary>
+        /// 审核部门
+        /// </summary>
+        public string? AuditOrgName { get; set; }
 
-		/// <summary>
-		/// 审核时间
-		/// </summary>
-		public DateTime? AuditTime { get; set; }
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? AuditTime { get; set; }
 
-		/// <summary>
-		/// 审核意见
-		/// </summary>
-		[SugarColumn(ColumnDescription = "审核意见", ColumnDataType = "varchar(2000)")]
-		public string? AuditOpinion { get; set; }
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核意见", ColumnDataType = "varchar(2000)")]
+        public string? AuditOpinion { get; set; }
 
-		/// <summary>
-		///  审核结果  0  待审核  1 审核通过  2 审核不通过
-		/// </summary>
-		public int State { get; set; }
+        /// <summary>
+        ///  审核结果  0  待审核  1 审核通过  2 审核不通过
+        /// </summary>
+        public int State { get; set; }
 
-		/// <summary>
-		/// 工单
-		/// </summary>
-		[Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        /// <summary>
+        /// 工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
         public Order Order { get; set; }
 
-		/// <summary>
-		/// 退回目的地
-		/// </summary>
-		public ESendBackDestination Destination { get; set; }
+        /// <summary>
+        /// 退回目的地
+        /// </summary>
+        public ESendBackDestination Destination { get; set; }
 
-		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-		public List<FileJson>? FileJson { get; set; }
-	}
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<FileJson>? FileJson { get; set; }
+    }
 }

+ 1 - 1
src/Hotline/Permissions/EPermission.cs

@@ -433,7 +433,7 @@ namespace Hotline.Permissions
         /// <summary>
         /// 数据范围
         /// </summary>
-        [Display(GroupName = "退回列表", Name = "数据范围", Description = "数据范围")]
+        [Display(GroupName ="退回列表",Name ="数据范围",Description ="数据范围")]
         OrderPreviousDataRange = 200506,
         #endregion