浏览代码

完成取消发布功能

qinchaoyue 5 月之前
父节点
当前提交
02b882e27b

+ 37 - 2
src/Hotline.Api/Controllers/OrderController.cs

@@ -69,6 +69,8 @@ using Microsoft.AspNetCore.Components;
 using Quartz.Simpl;
 using static Lucene.Net.Util.Fst.Util;
 using DocumentFormat.OpenXml.Spreadsheet;
+using System.Threading;
+using Hotline.Caching.Services;
 
 namespace Hotline.Api.Controllers;
 
@@ -418,6 +420,22 @@ public class OrderController : BaseController
             await _publisher.PublishAsync(new ContingencyManagementNotify(order, dto.ArrangeTitle, dto.ArrangeContent, dto.ArrangeOpinion),
                 PublishStrategy.ParallelWhenAll, HttpContext.RequestAborted);
 
+        // 取消发布功能开关
+        var cancelPublishOrderEnabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
+        // 取消发布的工单数量
+        var orderPublishDeletedCount = await _orderPublishRepository.Queryable(includeDeleted: true)
+            .Where(m => m.OrderId == order.Id && m.IsDeleted == true)
+            .CountAsync(HttpContext.RequestAborted);
+        var orderVisitVisitedCount = await _orderVisitRepository.Queryable()
+            .Where(m => m.OrderId == order.Id && m.VisitState == EVisitState.Visited)
+            .CountAsync(HttpContext.RequestAborted);
+
+        // 若取消发布的工单,已经被回访过了,没有经过重新办理,再次发布后,自动跳过回访环节,展示取消发布前的回访结果
+        if (orderPublishDeletedCount != 0 && orderVisitVisitedCount != 0 && cancelPublishOrderEnabled == true)
+        {
+            return;
+        }
+
         var orderVisit = new OrderVisit();
         orderVisit.No = order.No;
         orderVisit.OrderId = order.Id;
@@ -557,7 +575,6 @@ public class OrderController : BaseController
         return res;
     }
 
-
     /// <summary>
     /// 已发布列表
     /// </summary>
@@ -744,6 +761,22 @@ public class OrderController : BaseController
         return rsp;
     }
 
+    /// <summary>
+    /// 取消发布
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPut("publish/cancel")]
+    public async Task<string> PublishCancelAsync([FromBody]PublishCancelInDto dto)
+    {
+        var enabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
+        if (enabled == false) return "取消发布功能已被关闭";
+        var publish = await _orderPublishRepository.GetAsync(dto.OrderPublishId)
+            ?? throw UserFriendlyException.SameMessage("发布单不存在");
+        publish.IsDeleted = true;
+        await _orderPublishRepository.UpdateAsync(publish);
+        return "取消成功";
+    }
     #endregion
 
     #region 工单回访
@@ -4897,7 +4930,7 @@ public class OrderController : BaseController
 	/// <summary>
 	/// 工单重办信息
 	/// </summary>
-	/// <param name="dtos"></param>
+	/// <param name="dto"></param>
 	/// <returns></returns>
 	[HttpPost("re_transact")]
     [LogFilter("工单重办")]
@@ -5041,6 +5074,8 @@ public class OrderController : BaseController
                 .Where(o => o.Id == order.Id)
                 .ExecuteCommandAsync(HttpContext.RequestAborted);
 
+            // 重办清空已取消发布的工单的回访信息
+            await _orderDomainService.VisitNoneByCancelPublishAsync(order.Id, HttpContext.RequestAborted);
             //var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == dto.OrderId && x.VisitState != EVisitState.None);
             //if (visit != null)
             //{

+ 26 - 0
src/Hotline.Application.Tests/Application/SystemSettingCacheManagerTest.cs

@@ -0,0 +1,26 @@
+using Hotline.Caching.Interfaces;
+using Hotline.Caching.Services;
+using Shouldly;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Tests.Application;
+public class SystemSettingCacheManagerTest
+{
+    private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+
+    public SystemSettingCacheManagerTest(ISystemSettingCacheManager systemSettingCacheManager)
+    {
+        _systemSettingCacheManager = systemSettingCacheManager;
+    }
+
+    [Fact]
+    public void CancelPublishOrderEnabled_Test()
+    {
+        var result = _systemSettingCacheManager.CancelPublishOrderEnabled;
+        result.ShouldBeFalse();
+    }
+}

+ 52 - 2
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -3,17 +3,21 @@ using Castle.DynamicProxy;
 using Hotline.Api.Controllers;
 using Hotline.Application.Tests.Infrastructure;
 using Hotline.Application.Tests.Mock;
+using Hotline.Caching.Interfaces;
+using Hotline.Caching.Services;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
 using Hotline.Orders;
+using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Tools;
 using Hotline.Users;
@@ -41,8 +45,11 @@ public class OrderControllerTest : TestBase
     private readonly OrderServiceMock _orderServiceMock;
     private readonly IRepository<OrderPublish> _orderPublishRepository;
     private readonly INotificationHandler<EndWorkflowNotify> _orderPublishEndWorkflowHandler;
+    private readonly IOrderVisitRepository _orderVisitRepository;
+    private readonly IRepository<SystemSetting> _systemSettingRepository;
+    private readonly ISystemSettingCacheManager _systemSettingCacheManager;
 
-    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository, INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository)
+    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository, INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler, IOrderVisitRepository orderVisitRepository, IRepository<SystemSetting> systemSettingRepository, ISystemSettingCacheManager systemSettingCacheManager) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository)
     {
         _hotspotRepository = hotspotRepository;
         _orderController = orderController;
@@ -54,6 +61,9 @@ public class OrderControllerTest : TestBase
         _orderServiceMock = orderServiceMock;
         _orderPublishRepository = orderPublishRepository;
         _orderPublishEndWorkflowHandler = orderPublishEndWorkflowHandler;
+        _orderVisitRepository = orderVisitRepository;
+        _systemSettingRepository = systemSettingRepository;
+        _systemSettingCacheManager = systemSettingCacheManager;
     }
 
 
@@ -82,7 +92,7 @@ public class OrderControllerTest : TestBase
         SetZuoXi();
         var order = _orderServiceMock.CreateOrder()
             .办理到派单员()
-            .办理到归档(SetPaiDanYuan, data => 
+            .办理到归档(SetPaiDanYuan, data =>
             {
                 data.IsEvasive = true;
                 data.IsInactively = true;
@@ -91,6 +101,7 @@ public class OrderControllerTest : TestBase
         var publish = await _orderPublishRepository.GetAsync(m => m.No == order.No);
         publish.ShouldNotBeNull(order.No);
         var orderEntity = await _orderRepository.GetAsync(order.Id);
+        orderEntity.ShouldNotBeNull();
         orderEntity.IsEvasive.ShouldBeTrue();
         orderEntity.IsInactively.ShouldBeTrue();
     }
@@ -159,4 +170,43 @@ public class OrderControllerTest : TestBase
         result.TimeText.ShouldBe("1个工作日");
         result.TimeType.ShouldBe(ETimeType.WorkDay);
     }
+
+
+    /// <summary>
+    /// 测试取消发布功能
+    /// </summary>
+    /// <returns></returns>
+    [Fact]
+    public async Task CancelOrderPublish_Test()
+    {
+        var system = await _systemSettingRepository.Queryable()
+            .Where(m => m.Code == SettingConstants.CancelPublishOrderEnabled)
+            .FirstAsync();
+        system.SettingValue[0] = "true";
+        await _systemSettingRepository.UpdateAsync(system);
+        _systemSettingCacheManager.DelSystemSetting(SettingConstants.CancelPublishOrderEnabled);
+
+        SetZuoXi();
+        var order = _orderServiceMock.CreateOrder()
+            .办理到派单员()
+            .办理到归档(SetPaiDanYuan, data =>
+            {
+                data.IsEvasive = true;
+                data.IsInactively = true;
+            })
+            .GetCreateResult();
+        var publish = await _orderPublishRepository.GetAsync(m => m.No == order.No);
+        publish.ShouldNotBeNull(order.No);
+        var orderEntity = await _orderRepository.GetAsync(order.Id);
+        orderEntity.ShouldNotBeNull();
+        orderEntity.IsEvasive.ShouldBeTrue();
+        orderEntity.IsInactively.ShouldBeTrue();
+
+        await _orderController.PublishCancelAsync(new PublishCancelInDto { OrderPublishId = publish.Id });
+        var visit = await _orderVisitRepository.GetAsync(m => m.OrderId == order.Id);
+        var publishCount = await _orderPublishRepository.Queryable().Where(m => m.OrderId == order.Id).CountAsync();
+        publishCount.ShouldBe(0);
+        visit.ShouldNotBeNull();
+        visit.VisitState.ShouldBe(EVisitState.Visited);
+    }
 }

+ 2 - 8
src/Hotline.Repository.SqlSugar/Orders/OrderVisitRepository.cs

@@ -8,6 +8,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos.Push;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Tools;
+using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Logging;
 using SqlSugar;
 using XF.Domain.Dependency;
@@ -18,17 +19,10 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
 namespace Hotline.Repository.SqlSugar.Orders;
 public class OrderVisitRepository : BaseRepository<OrderVisit>, IOrderVisitRepository, IScopeDependency
 {
-    private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
     private readonly ILogger<OrderVisitRepository> _logger;
-    private readonly IRepository<Order> _orderRepository;
-    private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
 
-    public OrderVisitRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder, IRepository<OrderVisitDetail> orderVisitDetailRepository, ILogger<OrderVisitRepository> logger, IRepository<Order> orderRepository, ISystemDicDataCacheManager systemDicDataCacheManager) : base(uow, dataPermissionFilterBuilder)
+    public OrderVisitRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder,  ILogger<OrderVisitRepository> logger) : base(uow, dataPermissionFilterBuilder)
     {
-        _orderVisitDetailRepository = orderVisitDetailRepository;
         _logger = logger;
-        _orderRepository = orderRepository;
-        _systemDicDataCacheManager = systemDicDataCacheManager;
     }
-
 }

+ 7 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -1370,6 +1370,13 @@ namespace Hotline.Share.Dtos.Order
         public string OrderId { get; set; }
     }
 
+    public class PublishCancelInDto
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public string OrderPublishId { get; set; }
+    }
 
     public class OrderListOutDto
     {

+ 1 - 0
src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs

@@ -25,5 +25,6 @@ namespace Hotline.Caching.Interfaces
         /// 自动发布中心直办归档工单
         /// </summary>
         bool AutomaticPublishOrder { get; }
+        bool CancelPublishOrderEnabled { get; }
     }
 }

+ 38 - 19
src/Hotline/Caching/Services/SystemSettingCacheManager.cs

@@ -36,6 +36,30 @@ namespace Hotline.Caching.Services
             _cacheSystemSetting.Remove(code);
         }
 
+        public string GetOrDefault(string code, string name, string defaultValue, string remark)
+        {
+            try
+            {
+                var value = GetSetting(code)?.SettingValue[0];
+                if (value == null) return defaultValue;
+                return value.Trim();
+            }
+            catch (UserFriendlyException e)
+            {
+                if (e.Message.Contains("无效系统设置"))
+                {
+                    _systemSettingRepository.AddAsync(new SystemSetting
+                    {
+                        Code = code,
+                        SettingName = name,
+                        SettingValue = [defaultValue],
+                        Remark = remark
+                    }).GetAwaiter().GetResult();
+                }
+            }
+            return defaultValue;
+        }
+
         public int EffectiveTimes
             => int.Parse(GetSetting(SettingConstants.EffectiveTimes)?.SettingValue[0]);
 
@@ -60,28 +84,23 @@ namespace Hotline.Caching.Services
         {
             get
             {
-
-                try
+                var value = GetOrDefault(SettingConstants.AutomaticPublishOrder, "自动发布中心直办归档工单", "false", "用于中心直办件归档后默认自动发布, 开启就自动发布.true 或者 false");
+                if (value == "true")
                 {
-                    var value = GetSetting(SettingConstants.AutomaticPublishOrder)?.SettingValue[0];
-                    if (value == null) return false;
-                    if (value.Trim() == "true")
-                    {
-                        return true;
-                    }
+                    return true;
                 }
-                catch (UserFriendlyException e)
+                return false;
+            }
+        }
+
+        public bool CancelPublishOrderEnabled
+        {
+            get
+            {
+                var value = GetOrDefault(SettingConstants.CancelPublishOrderEnabled, "取消发布功能开关", "false", "取消发布功能总开关, 关闭后取消发布功能的所有代码都不会执行.true 或者 false");
+                if (value == "true")
                 {
-                    if (e.Message.Contains("无效系统设置"))
-                    {
-                        _systemSettingRepository.AddAsync(new SystemSetting 
-                        {
-                            Code = SettingConstants.AutomaticPublishOrder,
-                            SettingName = "自动发布中心直办归档工单",
-                            SettingValue = ["false"],
-                            Remark = "用于中心直办件归档后默认自动发布, 开启就自动发布.true 或者 false"
-                        });
-                    }
+                    return true;
                 }
                 return false;
             }

+ 8 - 0
src/Hotline/Orders/IOrderDomainService.cs

@@ -104,5 +104,13 @@ namespace Hotline.Orders
         Task SendOverTimeSms(CancellationToken cancellationToken);
         Task OrderPublishAsync(Order order, CancellationToken cancellationToken);
         Task OrderAutomaticPublishAsync(Order order, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 重办和退回工单时如果有取消发布的工单, 清除回访待办和回访列表中的数据
+        /// </summary>
+        /// <param name="orderId"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task VisitNoneByCancelPublishAsync(string orderId, CancellationToken cancellationToken);
     }
 }

+ 75 - 36
src/Hotline/Orders/OrderDomainService.cs

@@ -170,7 +170,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         var publishPublishOrder = orderPublish.Adapt<PublishPublishOrderDto>();
         publishPublishOrder.Order = order.Adapt<OrderDto>();
         //查询实际办理附件
-        if (!string.IsNullOrEmpty(order.ActualHandleStepId)) 
+        if (!string.IsNullOrEmpty(order.ActualHandleStepId))
         {
             var actualHandleStep = await _workflowStepRepository.GetAsync(order.ActualHandleStepId, cancellationToken);
             publishPublishOrder.FileJsons = actualHandleStep?.FileJson;
@@ -186,6 +186,19 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             await _publisher.PublishAsync(new ContingencyManagementNotify(order, order.Title, order.Content, order.ActualOpinion),
                 PublishStrategy.ParallelWhenAll, cancellationToken);
 
+        // 取消发布的工单数量
+        var orderPublishDeletedCount = await _orderPublishRepository.Queryable(includeDeleted: true)
+            .Where(m => m.OrderId == order.Id && m.IsDeleted == true)
+            .CountAsync(cancellationToken);
+        var orderVisitVisitedCount = await _orderVisitRepository.Queryable()
+            .Where(m => m.OrderId == order.Id && m.VisitState == EVisitState.Visited)
+            .CountAsync(cancellationToken);
+
+        // 若取消发布的工单,已经被回访过了,没有经过重新办理,再次发布后,自动跳过回访环节,展示取消发布前的回访结果
+        if (orderPublishDeletedCount != 0 && orderVisitVisitedCount !=0)
+        {
+            return;
+        }
         var orderVisit = new OrderVisit
         {
             No = order.No,
@@ -260,6 +273,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         visitedDetail.Add(seatDetail);
         await _orderVisitDetailRepository.AddRangeAsync(visitedDetail, cancellationToken);
 
+
         if (order.IsProvince == false && orderVisit.VisitState == EVisitState.Visited)
         {
             //推省上
@@ -293,6 +307,31 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         }, cancellationToken: cancellationToken);
     }
 
+    /// <summary>
+    /// 重办和退回工单时如果有取消发布的工单, 清除回访待办和回访列表中的数据
+    /// </summary>
+    /// <param name="orderId"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async Task VisitNoneByCancelPublishAsync(string orderId, CancellationToken cancellationToken)
+    {
+        var cancelPublishOrderEnabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
+
+        // 取消发布的工单数量
+        var orderPublishDeletedCount = await _orderPublishRepository.Queryable(includeDeleted: true)
+            .Where(m => m.OrderId == orderId && m.IsDeleted == true)
+            .CountAsync(cancellationToken);
+
+        if (orderPublishDeletedCount == 0 || cancelPublishOrderEnabled == false) return;
+
+        var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == orderId && x.VisitState != EVisitState.None, cancellationToken);
+        if (visit != null)
+        {
+            visit.VisitState = EVisitState.None;
+            await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+        }
+    }
+
     public async Task<Order> GetOrderAsync(string? orderId, bool withHotspot = false, bool withAcceptor = false,
         bool withExtension = false, CancellationToken cancellationToken = default)
     {
@@ -323,8 +362,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         order.Init();
         order.No = GenerateNewOrderNo();
         order.Password = Random.Shared.Next(100000, 1000000).ToString();
-		order.ProvinceNo = string.IsNullOrEmpty(order.ProvinceNo) ? GenerateNewProvinceNo(order.No, order.SourceChannelCode) : order.ProvinceNo;
-		return await _orderRepository.AddOrderNavAsync(order, cancellationToken);
+        order.ProvinceNo = string.IsNullOrEmpty(order.ProvinceNo) ? GenerateNewProvinceNo(order.No, order.SourceChannelCode) : order.ProvinceNo;
+        return await _orderRepository.AddOrderNavAsync(order, cancellationToken);
     }
 
     /// <summary>
@@ -407,7 +446,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             return false;
     }
 
-   
+
 
     #region 平均派单
     /// <summary>
@@ -501,30 +540,30 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 cancellationToken);
             if (steps.Any())
             {
-	            List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)> handlers = new();
-				var avg = steps.Count / schedulings.Count;
+                List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)> handlers = new();
+                var avg = steps.Count / schedulings.Count;
                 var remaining = steps.Count % schedulings.Count;
                 var skip = 0;
-                for (var i = 0; i < schedulings.Count; i++)
+                for (var i = 0;i < schedulings.Count;i++)
                 {
-					var scheduling = schedulings[i];
+                    var scheduling = schedulings[i];
                     var size = avg + (i < remaining ? 1 : 0);
                     if (size > 0)
                     {
-						handlers.Add(new(
-							scheduling.SchedulingUser.UserId,
-							scheduling.SchedulingUser.UserName,
-							scheduling.SchedulingUser.OrgId,
-							scheduling.SchedulingUser.OrgIdName,
-							null, null,
-							steps.Skip(skip).Take(size).ToList()));
+                        handlers.Add(new(
+                            scheduling.SchedulingUser.UserId,
+                            scheduling.SchedulingUser.UserName,
+                            scheduling.SchedulingUser.OrgId,
+                            scheduling.SchedulingUser.OrgIdName,
+                            null, null,
+                            steps.Skip(skip).Take(size).ToList()));
                         skip += size;
-						scheduling.SendOrderNum += size;
-						await _schedulingRepository.Updateable()
-							.SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum })
-							.Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
-					}
-				}
+                        scheduling.SendOrderNum += size;
+                        await _schedulingRepository.Updateable()
+                            .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum })
+                            .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
+                    }
+                }
                 if (handlers.Any())
                     await _workflowDomainService.ChangeHandlerBatchAsync(handlers, cancellationToken);
             }
@@ -549,7 +588,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 //投诉举报
                 case "30":
                 case "35":
-                    valid.Validation = dto.Title.Contains("意见") || dto.Title.Contains("建议")  || dto.Title.Contains("咨询") 
+                    valid.Validation = dto.Title.Contains("意见") || dto.Title.Contains("建议") || dto.Title.Contains("咨询")
                         || dto.Content.Contains("意见") || dto.Content.Contains("建议") || dto.Content.Contains("咨询");
                     if (dto.Content.Length < 25)
                     {
@@ -559,7 +598,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                     break;
                 // 意见
                 case "1":
-                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报")|| dto.Title.Contains("咨询") 
+                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("咨询")
                         || dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("咨询");
                     if (dto.Content.Length < 5)
                     {
@@ -570,7 +609,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                 //建议求助
                 case "15":
                 case "20":
-                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报")  || dto.Title.Contains("咨询") 
+                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("咨询")
                         || dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("咨询");
                     if (dto.Content.Length < 25)
                     {
@@ -580,7 +619,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
                     break;
                 // 咨询
                 case "10":
-                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("意见") 
+                    valid.Validation = dto.Title.Contains("投诉") || dto.Title.Contains("举报") || dto.Title.Contains("意见")
                         || dto.Title.Contains("建议") || dto.Content.Contains("投诉") || dto.Content.Contains("举报") || dto.Content.Contains("意见") || dto.Content.Contains("建议");
                     if (dto.Content.Length < 5)
                     {
@@ -629,19 +668,19 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         }
         //查询即将超期和超期工单
         var orderList = await _orderRepository.Queryable()
-            .Where(x=> x.Status< EOrderStatus.Filed && !string.IsNullOrEmpty(x.CurrentHandleOrgId))
-            .GroupBy(x=>x.CurrentHandleOrgId)
+            .Where(x => x.Status < EOrderStatus.Filed && !string.IsNullOrEmpty(x.CurrentHandleOrgId))
+            .GroupBy(x => x.CurrentHandleOrgId)
             .Select(x => new OverTimeOrderDto
-            { 
-                 OrgId = x.CurrentHandleOrgId,
-                 NearlyOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(now >= x.NearlyExpiredTime  && now < x.ExpiredTime ,1,0)),
-                 ExpiredTimeOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.ExpiredTime<now,1,0))
+            {
+                OrgId = x.CurrentHandleOrgId,
+                NearlyOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(now >= x.NearlyExpiredTime && now < x.ExpiredTime, 1, 0)),
+                ExpiredTimeOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.ExpiredTime < now, 1, 0))
             })
             .ToListAsync(cancellationToken);
 
         foreach (var item in orderList)
         {
-            if (item.NearlyOrderCount==0 && item.ExpiredTimeOrderCount==0)
+            if (item.NearlyOrderCount == 0 && item.ExpiredTimeOrderCount == 0)
             {
                 continue;
             }
@@ -724,12 +763,12 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         //成员单位标识  99
         //宜宾市 511500  市级
         var today = DateTime.Today;
-		//var count = no.Substring(no.Length - 5);
-		var setting = _systemSettingCacheManager.GetSetting(SettingConstants.VersionsAreaCode);
+        //var count = no.Substring(no.Length - 5);
+        var setting = _systemSettingCacheManager.GetSetting(SettingConstants.VersionsAreaCode);
         var versionsAreaCode = setting?.SettingValue[0];
 
-		//todo 双系统并行暂时执行此方案
-		var count = no.Substring(no.Length - 4);
+        //todo 双系统并行暂时执行此方案
+        var count = no.Substring(no.Length - 4);
         count = (Convert.ToInt32(count) + 50000).ToString();
 
         var provinceCodes = new[] { "RGDH", "WX", "WB", "AP", "WZ", "YJ", "SCZWFWW", "XCX", "QT" };

+ 5 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -580,5 +580,10 @@ namespace Hotline.Settings
         /// 国家政务平台办理结果字数限制
         /// </summary>
         public const string NationalPlatformWordLimit = "NationalPlatformWordLimit";
+
+        /// <summary>
+        /// 取消发布功能总开关
+        /// </summary>
+        public const string CancelPublishOrderEnabled = "CancelPublishOrderEnabled";
     }
 }