Browse Source

合并 task_298

qinchaoyue 7 months ago
parent
commit
23f928dabf

+ 48 - 102
src/Hotline.Api/Controllers/OrderController.cs

@@ -5,6 +5,7 @@ using Hotline.Application.ExportExcel;
 using Hotline.Application.FlowEngine;
 using Hotline.Application.FlowEngine;
 using Hotline.Application.Orders;
 using Hotline.Application.Orders;
 using Hotline.Application.Quality;
 using Hotline.Application.Quality;
+using Hotline.Application.Systems;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Services;
 using Hotline.Caching.Services;
 using Hotline.Configurations;
 using Hotline.Configurations;
@@ -35,6 +36,7 @@ using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order.Migration;
 using Hotline.Share.Dtos.Order.Migration;
 using Hotline.Share.Dtos.Order.Publish;
 using Hotline.Share.Dtos.Order.Publish;
+using Hotline.Share.Dtos.Push;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
@@ -42,6 +44,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Mq;
 using Hotline.Share.Requests;
 using Hotline.Share.Requests;
 using Hotline.Share.Tools;
 using Hotline.Share.Tools;
 using Hotline.Tools;
 using Hotline.Tools;
@@ -58,6 +61,7 @@ using MongoDB.Driver;
 using SqlSugar;
 using SqlSugar;
 using StackExchange.Redis;
 using StackExchange.Redis;
 using System.Text;
 using System.Text;
+using System.Threading.Tasks;
 using XF.Domain.Authentications;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
 using XF.Domain.Cache;
 using XF.Domain.Entities;
 using XF.Domain.Entities;
@@ -75,6 +79,7 @@ public class OrderController : BaseController
 {
 {
     #region 注入
     #region 注入
     private readonly IOrderDomainService _orderDomainService;
     private readonly IOrderDomainService _orderDomainService;
+    private readonly BaseDataApplication _baseDataApplication;
     private readonly IOrderRepository _orderRepository;
     private readonly IOrderRepository _orderRepository;
     private readonly IWorkflowApplication _workflowApplication;
     private readonly IWorkflowApplication _workflowApplication;
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IWorkflowDomainService _workflowDomainService;
@@ -194,8 +199,9 @@ public class OrderController : BaseController
         Publisher publisher,
         Publisher publisher,
         IOrderAnalysisApplication orderAnalysisApplication,
         IOrderAnalysisApplication orderAnalysisApplication,
         ICalcExpireTime expireTime,
         ICalcExpireTime expireTime,
-        IRepository<OrderPushType> orderPushTypeRepository,
         IOptions<CityBaseConfiguration> cityBaseConfiguration)
         IOptions<CityBaseConfiguration> cityBaseConfiguration)
+        IRepository<OrderPushType> orderPushTypeRepository,
+        BaseDataApplication baseDataApplication)
     {
     {
         _orderDomainService = orderDomainService;
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
         _orderRepository = orderRepository;
@@ -257,7 +263,9 @@ public class OrderController : BaseController
         _expireTime = expireTime;
         _expireTime = expireTime;
         _orderPushTypeRepository = orderPushTypeRepository;
         _orderPushTypeRepository = orderPushTypeRepository;
         _cityBaseConfiguration = cityBaseConfiguration;
         _cityBaseConfiguration = cityBaseConfiguration;
+        _baseDataApplication = baseDataApplication;
 	}
 	}
+    }
     #endregion 
     #endregion 
 
 
     #region 工单发布
     #region 工单发布
@@ -839,20 +847,14 @@ public class OrderController : BaseController
     /// <returns></returns>
     /// <returns></returns>
     [HttpGet("visit/basedata")]
     [HttpGet("visit/basedata")]
     public async Task<object> VisitBaseData()
     public async Task<object> VisitBaseData()
-    {
-        var rsp = new
-        {
-            VisitType = EnumExts.GetDescriptions<EVisitType>(),
-            VoiceEvaluate = EnumExts.GetDescriptions<EVoiceEvaluate>(),
-            SeatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>(),
-            // 部门办件结果
-            VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
-            // 部门办件态度
-            VisitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
-            VisitStateQuery = EnumExts.GetDescriptions<EVisitStateQuery>()
-        };
-        return rsp;
-    }
+        => _baseDataApplication
+            .VisitType()
+            .VoiceEvaluate()
+            .SeatEvaluate()
+            .VisitSatisfaction()
+            .VisitManner()
+            .VisitStateQuery()
+            .Build();
 
 
     /// <summary>
     /// <summary>
     /// 回访详情
     /// 回访详情
@@ -1068,21 +1070,13 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <param name="dto"></param>
     /// <returns></returns>
     /// <returns></returns>
     [HttpGet("visit/batch-basedata")]
     [HttpGet("visit/batch-basedata")]
-    [AllowAnonymous]
     public async Task<dynamic> VisitBatchBaseDat()
     public async Task<dynamic> VisitBatchBaseDat()
-    {
-        return new
-        {
-            // 话务员评价
-            SeatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>(),
-            // 不满意原因
-            DissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason).Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
-            // 回访满意度
-            VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue }),
-            // 回访态度
-            VisitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1").Select(m => new { m.Id, m.DicDataName, m.DicDataValue })
-        };
-    }
+        => _baseDataApplication
+        .SeatEvaluate()
+        .DissatisfiedReason()
+        .VisitSatisfaction()
+        .VisitManner()
+        .Build();
 
 
     /// <summary>
     /// <summary>
     /// 扭转列表
     /// 扭转列表
@@ -3251,7 +3245,6 @@ public class OrderController : BaseController
         ExpiredTimeWithConfig expiredTimeConfig;
         ExpiredTimeWithConfig expiredTimeConfig;
         if (dto.Workflow.NextHandlers.Any(d => d.Key == _cityBaseConfiguration.Value.CityProvince.OrgId || d.Key == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId))
         if (dto.Workflow.NextHandlers.Any(d => d.Key == _cityBaseConfiguration.Value.CityProvince.OrgId || d.Key == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId))
         {
         {
-            // var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
             var timeResult = await _expireTime.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
             var timeResult = await _expireTime.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
             expiredTimeConfig = new ExpiredTimeWithConfig
             expiredTimeConfig = new ExpiredTimeWithConfig
             {
             {
@@ -3284,7 +3277,6 @@ public class OrderController : BaseController
             else
             else
             {
             {
                 //期满时间
                 //期满时间
-                //expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.AcceptTypeCode);
                 expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
                 expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
             }
             }
 
 
@@ -3306,6 +3298,7 @@ public class OrderController : BaseController
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
             startDto.Title = order.Title;
             startDto.Title = order.Title;
+            startDto.IsForwarded = dto.IsForwarded;
             await _workflowApplication.StartWorkflowAsync(startDto, _sessionContext, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
             await _workflowApplication.StartWorkflowAsync(startDto, _sessionContext, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
         }
         }
         catch (Exception e)
         catch (Exception e)
@@ -3349,77 +3342,8 @@ public class OrderController : BaseController
     [HttpPost("handle")]
     [HttpPost("handle")]
     public async Task Handle([FromBody] NextWorkflowDto dto)
     public async Task Handle([FromBody] NextWorkflowDto dto)
     {
     {
-        var order = await _orderRepository.Queryable()
-            .FirstAsync(d => d.WorkflowId == dto.WorkflowId, HttpContext.RequestAborted);
-        if (order is null)
-            throw UserFriendlyException.SameMessage("无效工单编号");
-        //if (await _orderDelayRepository.AnyAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, HttpContext.RequestAborted))
-        //{
-        //    throw UserFriendlyException.SameMessage("该工单存在正在审核中的延期,不能办理");
-        //}
-        if (await _orderSendBackAuditRepository.AnyAsync(x => x.OrderId == order.Id && x.State == ESendBackAuditState.Apply,
-                HttpContext.RequestAborted))
-        {
-            throw UserFriendlyException.SameMessage("该工单存在正在审核中的退回,不能办理");
-        }
-
-        ExpiredTimeWithConfig? expiredTimeConfig = null;
-        if (dto.NextHandlers.Any(d => d.Key == _cityBaseConfiguration.Value.CityProvince.OrgId || d.Key == _cityBaseConfiguration.Value.CityProvinceAssign.OrgId))
-        {
-            // var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
-            var timeResult = await _expireTime.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
-            expiredTimeConfig = new ExpiredTimeWithConfig
-            {
-                Count = 45,
-                TimeType = ETimeType.WorkDay,
-                TimeText = "45个工作日",
-                ExpiredTime = timeResult.EndTime,
-                NearlyExpiredTime = timeResult.NearlyExpiredTime,
-                NearlyExpiredTimeOne = timeResult.NearlyExpiredTimeOne
-            };
-            var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
-            order.CenterToOrg(
-                expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime,
-                expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
-                _sessionContext.RequiredUserId, _sessionContext.UserName,
-                canUpdateOrderSender);
-            //TODO发送短信即将超期
-            //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
-        }
-        else if (dto.FlowDirection is EFlowDirection.CenterToOrg)
-        {
-            //expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.AcceptTypeCode);
-            expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
-            var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
-            order.CenterToOrg(
-                expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime,
-                expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
-                _sessionContext.RequiredUserId, _sessionContext.UserName,
-                canUpdateOrderSender);
-            //TODO发送短信即将超期
-            //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
-
-        }
-        else if (dto.FlowDirection is EFlowDirection.CenterToCenter)
-        {
-            if (_appOptions.Value.IsZiGong == false)
-            {
-                // expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, order.AcceptTypeCode);
-                expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, order.Adapt<OrderTimeClacInfo>());
-                order.CenterToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                    expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne);
-                //TODO发送短信即将超期
-                //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
-            }
-        }
+        var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
 
 
-        if (expiredTimeConfig is not null)
-        {
-            _mapper.Map(expiredTimeConfig, order);
-            await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
-        }
         //1.是否是判断节点  2.是否存在历史派单节点  3.存在获取上个派单节点  4.不存在走平均派单
         //1.是否是判断节点  2.是否存在历史派单节点  3.存在获取上个派单节点  4.不存在走平均派单
         if (dto.BusinessType == EBusinessType.Send)
         if (dto.BusinessType == EBusinessType.Send)
         {
         {
@@ -3450,6 +3374,20 @@ public class OrderController : BaseController
         await _workflowApplication.NextAsync(dto, _sessionContext, order.ExpiredTime, HttpContext.RequestAborted);
         await _workflowApplication.NextAsync(dto, _sessionContext, order.ExpiredTime, HttpContext.RequestAborted);
     }
     }
 
 
+    /// <summary>
+    /// 临时保存
+    /// </summary>
+    [HttpPost("steps/temp")]
+    public async Task TempSaveAsync([FromBody] StepTempInDto dto)
+    {
+        await _workflowStepRepository.GetAsync(dto.StepId)
+            .Then(async (step) =>
+            {
+                step!.Opinion = dto.Opinion;
+                await _workflowStepRepository.UpdateAsync(step);
+            });
+    }
+
     /// <summary>
     /// <summary>
     /// 查询工单办理下一步可选节点(带推荐部门)
     /// 查询工单办理下一步可选节点(带推荐部门)
     /// </summary>
     /// </summary>
@@ -3471,7 +3409,15 @@ public class OrderController : BaseController
             step.RecommendOrgId = org.Id;
             step.RecommendOrgId = org.Id;
             step.RecommendOrgName = org.Name;
             step.RecommendOrgName = org.Name;
         }
         }
-
+        rsp.LeaderSMS = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.LeaderSMS)
+            .Select(m => new Kv { Key = m.Id, Value = m.DicDataName }).ToList();
+        if (_appOptions.Value.IsZiGong)
+        {
+            await _workflowStepRepository.GetAsync(dto.StepId)
+                .Then(step => rsp.Opinion = step!.Opinion ?? string.Empty);
+        }
+        rsp.TranspondCity = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.TranspondCity)
+            .ToList().Adapt<List<SystemDicDataOutDto>>();
         return rsp;
         return rsp;
     }
     }
 
 

+ 56 - 1
src/Hotline.Application.Tests/Application/OrderApplicationTest.cs

@@ -1,6 +1,10 @@
 using Hotline.Application.Orders;
 using Hotline.Application.Orders;
+using Hotline.Caching.Interfaces;
 using Hotline.Orders;
 using Hotline.Orders;
+using Hotline.Settings;
+using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Order;
 using Shouldly;
 using Shouldly;
 using System;
 using System;
@@ -14,12 +18,16 @@ namespace Hotline.Application.Tests.Application;
 public class OrderApplicationTest
 public class OrderApplicationTest
 {
 {
     private readonly IOrderApplication _orderApplication;
     private readonly IOrderApplication _orderApplication;
+    private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
     private readonly IRepository<OrderVisit> _orderVisitRepository;
     private readonly IRepository<OrderVisit> _orderVisitRepository;
+    private readonly IRepository<Order> _orderRepository;
 
 
-    public OrderApplicationTest(IOrderApplication orderApplication, IRepository<OrderVisit> orderVisitRepository)
+    public OrderApplicationTest(IOrderApplication orderApplication, IRepository<OrderVisit> orderVisitRepository, IRepository<Order> orderRepository, ISystemDicDataCacheManager systemDicDataCacheManager)
     {
     {
         _orderApplication = orderApplication;
         _orderApplication = orderApplication;
         _orderVisitRepository = orderVisitRepository;
         _orderVisitRepository = orderVisitRepository;
+        _orderRepository = orderRepository;
+        _systemDicDataCacheManager = systemDicDataCacheManager;
     }
     }
 
 
     [Theory]
     [Theory]
@@ -40,4 +48,51 @@ public class OrderApplicationTest
         visit.VisitState.ShouldBe(EVisitState.SMSVisiting);
         visit.VisitState.ShouldBe(EVisitState.SMSVisiting);
         visit.VisitType.ShouldBe(EVisitType.SmsVisit);
         visit.VisitType.ShouldBe(EVisitType.SmsVisit);
     }
     }
+
+    [Theory]
+    [InlineData("08dcd937-5800-4e44-81d7-68a318dbc251", "沟通地点", "张三", "13666666666", "63344B7C-D2CB-4B40-8B13-009923393573")]
+    public async Task SaveOrderWorkflowInfo_Test(string workflowId,
+        string realCommunicationAddress,
+        string realHandlerName,
+        string realHandlerPhone,
+        string transpondCityId
+        )
+    {
+        await _orderRepository.Updateable()
+            .SetColumns(m => m.RealCommunicationAddress == null)
+            .Where(m => m.WorkflowId == workflowId)
+            .ExecuteCommandAsync();
+        var time = DateTime.Now;
+        var dicSystem = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.TranspondCity).First();
+        var dto = new NextWorkflowDto
+        {
+            RealCommunicationAddress = realCommunicationAddress,
+            WorkflowId = workflowId,
+            RealHandlerName = realHandlerName,
+            RealHandlerPhone = realHandlerPhone,
+            RealCommunicationMode = ERealCommunicationMode.Locale,
+            RealCommunicationTime = time,
+            RealIsContacted = true,
+            RealContactLocale = true,
+            IsOther = true,
+            OtherRemark = "备注",
+            TranspondCityId = dicSystem.Id,
+            TranspondCityName = dicSystem.DicDataName,
+            TranspondCityValue = dicSystem.DicDataValue,
+        };
+        var order = await _orderApplication.SaveOrderWorkflowInfo(dto, new CancellationToken());
+        order = await _orderRepository.GetAsync(order.Id);
+        order.RealCommunicationAddress.ShouldBe(realCommunicationAddress);
+        order.RealHandlerPhone.ShouldBe(realHandlerPhone);
+        order.RealHandlerName.ShouldBe(realHandlerName);
+        order.RealCommunicationMode.ShouldBe(ERealCommunicationMode.Locale);
+        order.RealCommunicationTime.Value.ToString("yyyy-MM-dd hh:mm:ss").ShouldBe(time.ToString("yyyy-MM-dd hh:mm:ss"));
+        order.RealIsContacted.ShouldBe(true);
+        order.RealContactLocale.ShouldBe(true);
+        order.IsOther.ShouldBe(true);
+        order.OtherRemark.ShouldBe("备注");
+        order.TranspondCityId.ShouldBe(dicSystem.Id);
+        order.TranspondCityName.ShouldBe(dicSystem.DicDataName);
+        order.TranspondCityValue.ShouldBe(dicSystem.DicDataValue);
+    }
 }
 }

+ 0 - 1
src/Hotline.Application.Tests/Repository/OrderVisitRepositoryTest.cs

@@ -10,7 +10,6 @@ using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
-using XF.Domain.Repository.Extensions;
 
 
 namespace Hotline.Application.Tests.Repository;
 namespace Hotline.Application.Tests.Repository;
 public class OrderVisitRepositoryTest
 public class OrderVisitRepositoryTest

+ 2 - 0
src/Hotline.Application/ApplicationStartupExtensions.cs

@@ -1,5 +1,6 @@
 using Hotline.Application.Contracts;
 using Hotline.Application.Contracts;
 using Hotline.Application.Mappers;
 using Hotline.Application.Mappers;
+using Hotline.Application.Systems;
 using Mapster;
 using Mapster;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 
 
@@ -9,6 +10,7 @@ namespace Hotline.Application
     {
     {
         public static IServiceCollection AddApplication(this IServiceCollection services)
         public static IServiceCollection AddApplication(this IServiceCollection services)
         {
         {
+            services.AddScoped<BaseDataApplication>();
             TypeAdapterConfig.GlobalSettings.Scan(typeof(MapperConfigs).Assembly);
             TypeAdapterConfig.GlobalSettings.Scan(typeof(MapperConfigs).Assembly);
             return services.AddAppContracts();
             return services.AddAppContracts();
         }
         }

+ 5 - 0
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -21,6 +21,11 @@ namespace Hotline.Application.Mappers
     {
     {
         public void Register(TypeAdapterConfig config)
         public void Register(TypeAdapterConfig config)
         {
         {
+            config.ForType<SystemDicData, SystemDicDataOutDto>()
+                .Map(m => m.Id, n => n.Id)
+                .Map(m => m.DicDataName, n => n.DicDataName)
+                .Map(m => m.DicDataValue, n => n.DicDataValue);
+
             config.ForType<Tr.Sdk.Tels.QueryTelResponse, TelOutDto>()
             config.ForType<Tr.Sdk.Tels.QueryTelResponse, TelOutDto>()
                 .Map(m => m.TelPwd, x => x.Password)
                 .Map(m => m.TelPwd, x => x.Password)
                 .Map(m =>m.Queue, x => x.QueueId);
                 .Map(m =>m.Queue, x => x.QueueId);

+ 29 - 0
src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs

@@ -1,9 +1,11 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.FlowEngine.Workflows;
+using Hotline.Orders;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Definition;
 using Hotline.Share.Dtos.FlowEngine.Definition;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Tools;
 using Mapster;
 using Mapster;
 
 
 namespace Hotline.Application.Mappers;
 namespace Hotline.Application.Mappers;
@@ -79,6 +81,33 @@ public class WorkflowMapperConfigs : IRegister
             .Map(d => d.RealContactLocale, s => s.RealContactLocale)
             .Map(d => d.RealContactLocale, s => s.RealContactLocale)
             .IgnoreNonMapped(true);
             .IgnoreNonMapped(true);
 
 
+        config.ForType<NextWorkflowDto, Order>()
+            .Map(src => src.RealCommunicationAddress, dest => dest.RealCommunicationAddress)
+            .IgnoreIf((src, dest) => src.RealCommunicationAddress.IsNullOrEmpty(), dest => dest.RealCommunicationAddress)
+            .Map(src => src.RealHandlerPhone , dest => dest.RealHandlerPhone)
+            .IgnoreIf((src, dest) => src.RealHandlerPhone.IsNullOrEmpty(), dest => dest.RealHandlerPhone)
+            .Map(src => src.RealHandlerName, dest => dest.RealHandlerName)
+            .IgnoreIf((src, dest) => src.RealHandlerName.IsNullOrEmpty(), dest => dest.RealHandlerName)
+            .Map(src => src.RealCommunicationMode, dest => dest.RealCommunicationMode)
+            .IgnoreIf((src, dest) => src.RealCommunicationMode == null, dest => dest.RealCommunicationMode)
+            .Map(src => src.RealCommunicationTime, dest => dest.RealCommunicationTime)
+            .IgnoreIf((src, dest) => src.RealCommunicationTime == null, dest => dest.RealCommunicationTime)
+            .Map(src => src.RealIsContacted, dest => dest.RealIsContacted)
+            .IgnoreIf((src, dest) => src.RealIsContacted == null, dest => dest.RealIsContacted)
+            .Map(src => src.RealContactLocale, dest => dest.RealContactLocale)
+            .IgnoreIf((src, dest) => src.RealContactLocale == null, dest => dest.RealContactLocale)
+            .Map(src => src.IsOther, dest => dest.IsOther)
+            .IgnoreIf((src, dest) => src.IsOther == null, dest => dest.IsOther)
+            .Map(src => src.OtherRemark, dest => dest.OtherRemark)
+            .IgnoreIf((src, dest) => src.OtherRemark.IsNullOrEmpty(), dest => dest.OtherRemark)
+            .Map(src => src.TranspondCityId, dest => dest.TranspondCityId)
+            .IgnoreIf((src, dest) => src.TranspondCityId.IsNullOrEmpty(), dest => dest.TranspondCityId)
+            .Map(src => src.TranspondCityName, dest => dest.TranspondCityName)
+            .IgnoreIf((src, dest) => src.TranspondCityName.IsNullOrEmpty(), dest => dest.TranspondCityName)
+            .Map(src => src.TranspondCityValue, dest => dest.TranspondCityValue)
+            .IgnoreIf((src, dest) => src.TranspondCityValue.IsNullOrEmpty(), dest => dest.TranspondCityValue)
+            .IgnoreNonMapped(true);
+
         config.ForType<Workflow, WorkflowStep>()
         config.ForType<Workflow, WorkflowStep>()
             .Map(d => d.WorkflowId, s => s.Id)
             .Map(d => d.WorkflowId, s => s.Id)
             .Map(d => d.ExternalId, s => s.ExternalId)
             .Map(d => d.ExternalId, s => s.ExternalId)

+ 8 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -11,6 +11,7 @@ using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
+using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Order;
@@ -116,6 +117,13 @@ namespace Hotline.Application.Orders
 
 
         ISugarQueryable<Order> QueryOrders(QueryOrderDto dto);
         ISugarQueryable<Order> QueryOrders(QueryOrderDto dto);
 
 
+        /// <summary>
+        /// 保存工单办理时页面填写的数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<Order> SaveOrderWorkflowInfo(NextWorkflowDto dto, CancellationToken cancellationToken);
+
         #endregion
         #endregion
 
 
         /// <summary>
         /// <summary>

+ 119 - 14
src/Hotline.Application/Orders/OrderApplication.cs

@@ -58,6 +58,12 @@ using Hotline.Share.Enums.Push;
 using Hotline.Push.Notifies;
 using Hotline.Push.Notifies;
 using Hotline.Configurations;
 using Hotline.Configurations;
 using Microsoft.Extensions.Options;
 using Microsoft.Extensions.Options;
+using Hotline.Share.Dtos.Push;
+using Mapster;
+using Hotline.Share.Tools;
+using Hotline.EventBus;
+using Hotline.Orders.Notifications;
+using Hotline.OrderTranspond;
 
 
 namespace Hotline.Application.Orders;
 namespace Hotline.Application.Orders;
 
 
@@ -65,6 +71,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 {
 {
 
 
     private readonly IMediator _mediator;
     private readonly IMediator _mediator;
+    private readonly IRepository<TranspondCityRawData> _transpondCityRawDataRepository;
+    private readonly Publisher _publisher;
+    private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
     private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
     private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
     private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
     private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
     private readonly IOrderDomainService _orderDomainService;
     private readonly IOrderDomainService _orderDomainService;
@@ -127,6 +136,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<OrderVisitDetail> orderVisitedDetailRepository,
         IRepository<OrderVisitDetail> orderVisitedDetailRepository,
         IOptionsSnapshot<AppConfiguration> appOptions,
         IOptionsSnapshot<AppConfiguration> appOptions,
         IOptions<CityBaseConfiguration> cityBaseConfiguration)
         IOptions<CityBaseConfiguration> cityBaseConfiguration)
+        ISystemDicDataCacheManager sysDicDataCacheManager,
+        Publisher publisher,
+        IRepository<TranspondCityRawData> transpondCityRawDataRepository)
     {
     {
         _orderDomainService = orderDomainService;
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
         _workflowDomainService = workflowDomainService;
@@ -157,6 +169,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _mediator = mediator;
         _mediator = mediator;
         _orderVisitedDetailRepository = orderVisitedDetailRepository;
         _orderVisitedDetailRepository = orderVisitedDetailRepository;
         _appOptions = appOptions;
         _appOptions = appOptions;
+        _sysDicDataCacheManager = sysDicDataCacheManager;
+        _publisher = publisher;
+        _transpondCityRawDataRepository = transpondCityRawDataRepository;
         _cityBaseConfiguration = cityBaseConfiguration;
         _cityBaseConfiguration = cityBaseConfiguration;
 	}
 	}
 
 
@@ -285,13 +300,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var IsCenter = _sessionContext.OrgIsCenter;
         var IsCenter = _sessionContext.OrgIsCenter;
 
 
         return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
         return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
-	        .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
-		        .Where(step => step.ExternalId == d.Id &&
-		                       ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-		                        (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-		                        (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
-		        .Any())
-			.WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+            .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+                .Where(step => step.ExternalId == d.Id &&
+                               ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+                                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
+                .Any())
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!))
             .WhereIF(dto.Delay.HasValue && dto.Delay == 1, d => d.OrderDelays.Any() == true)
             .WhereIF(dto.Delay.HasValue && dto.Delay == 1, d => d.OrderDelays.Any() == true)
@@ -393,7 +408,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var seg = new Segment();
         var seg = new Segment();
         ICollection<WordInfo> splitWords = seg.DoSegment(inputStr);
         ICollection<WordInfo> splitWords = seg.DoSegment(inputStr);
         var words = new List<string>();
         var words = new List<string>();
-        for (int i = 0; i < splitWords.Count; i++)
+        for (int i = 0;i < splitWords.Count;i++)
         {
         {
             var word = splitWords.ElementAt(i);
             var word = splitWords.ElementAt(i);
             if (word is { WordType: WordType.SimplifiedChinese, Word.Length: > 1 })
             if (word is { WordType: WordType.SimplifiedChinese, Word.Length: > 1 })
@@ -615,7 +630,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             visit.VisitTime = dto.VisitTime;
             visit.VisitTime = dto.VisitTime;
             visit.VisitType = dto.VisitType;
             visit.VisitType = dto.VisitType;
 
 
-            for (int i = 0; i < visit.OrderVisitDetails.Count; i++)
+            for (int i = 0;i < visit.OrderVisitDetails.Count;i++)
             {
             {
                 var detail = visit.OrderVisitDetails[i];
                 var detail = visit.OrderVisitDetails[i];
                 var detaildto = dto.OrderVisitDetailDto.FirstOrDefault(x => x.Id == detail.Id);
                 var detaildto = dto.OrderVisitDetailDto.FirstOrDefault(x => x.Id == detail.Id);
@@ -653,6 +668,96 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
         }
     }
     }
 
 
+    /// <summary>
+    /// 保存工单办理时页面填写的数据
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public async Task<Order> SaveOrderWorkflowInfo(NextWorkflowDto dto, CancellationToken cancellationToken)
+    {
+        var order = await _orderRepository.Queryable()
+            .FirstAsync(d => d.WorkflowId == dto.WorkflowId, cancellationToken)
+            ?? throw UserFriendlyException.SameMessage("无效工单编号");
+        if (await _orderSendBackAuditRepository.AnyAsync(x => x.OrderId == order.Id && x.State == ESendBackAuditState.Apply,
+                cancellationToken))
+        {
+            throw UserFriendlyException.SameMessage("该工单存在正在审核中的退回,不能办理");
+        }
+
+        ExpiredTimeWithConfig? expiredTimeConfig = null;
+        if (dto.NextHandlers.Any(d => d.Key == "001171" || d.Key == "001178"))
+        {
+            var timeResult = await _expireTime.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 45, 80, 50);
+            expiredTimeConfig = new ExpiredTimeWithConfig
+            {
+                Count = 45,
+                TimeType = ETimeType.WorkDay,
+                TimeText = "45个工作日",
+                ExpiredTime = timeResult.EndTime,
+                NearlyExpiredTime = timeResult.NearlyExpiredTime,
+                NearlyExpiredTimeOne = timeResult.NearlyExpiredTimeOne
+            };
+            var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
+            order.CenterToOrg(
+                expiredTimeConfig.TimeText, expiredTimeConfig.Count,
+                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime,
+                expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
+                _sessionContext.RequiredUserId, _sessionContext.UserName,
+                canUpdateOrderSender);
+            //TODO发送短信即将超期
+            //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+        }
+        else if (dto.FlowDirection is EFlowDirection.CenterToOrg)
+        {
+            expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
+            var canUpdateOrderSender = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.CanUpdateOrderSender).SettingValue[0]);
+            order.CenterToOrg(
+                expiredTimeConfig.TimeText, expiredTimeConfig.Count,
+                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime,
+                expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
+                _sessionContext.RequiredUserId, _sessionContext.UserName,
+                canUpdateOrderSender);
+            //TODO发送短信即将超期
+            //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+
+        }
+        else if (dto.FlowDirection is EFlowDirection.CenterToCenter)
+        {
+            if (_appOptions.Value.IsZiGong == false)
+            {
+                expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, order.Adapt<OrderTimeClacInfo>());
+                order.CenterToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
+                    expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne);
+                //TODO发送短信即将超期
+                //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+            }
+        }
+
+        if (expiredTimeConfig is not null)
+            _mapper.Map(expiredTimeConfig, order);
+
+        if (dto.LeaderSMSKey != null)
+        {
+            var dic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.LeaderSMS).First(m => m.Id == dto.LeaderSMSKey);
+            _capPublisher.Publish(EventNames.HotlineLeaderSMS, new PublishLeaderSMSDto(order.Id, dic.DicDataName, dic.DicDataValue));
+        }
+
+        _mapper.Map(dto, order);
+        await _orderRepository.UpdateAsync(order, cancellationToken);
+
+        if (_appOptions.Value.IsZiGong && dto.Transpond.HasValue && dto.Transpond.Value == true)
+        {
+            var count = await _transpondCityRawDataRepository.Queryable()
+                .Where(m => m.OrderCode == order.No && m.CityName == order.TranspondCityName
+                && m.Direction == ETranspondDirection.Out)
+                .CountAsync();
+            //处理市州互转
+            if (count == 0)
+                await _publisher.PublishAsync(new OrderStartWorkflowNotify(order.Id), PublishStrategy.ParallelWhenAll, cancellationToken);
+        }
+        return order;
+    }
+
     /// <summary>
     /// <summary>
     /// 回访保存
     /// 回访保存
     /// </summary>
     /// </summary>
@@ -777,7 +882,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var orderVisitList = await _orderVisitRepository.Queryable()
         var orderVisitList = await _orderVisitRepository.Queryable()
             .Includes(d => d.Order)
             .Includes(d => d.Order)
             .Where(d => dto.Ids.Contains(d.Id) && d.VisitState == EVisitState.WaitForVisit)
             .Where(d => dto.Ids.Contains(d.Id) && d.VisitState == EVisitState.WaitForVisit)
-            .Select(d => new { d.Id, d.Order.SourceChannelCode,  d.Order.Contact, d.Order.Password, d.No, d.OrderId, d.Order.Title, d.Order.FromName })
+            .Select(d => new { d.Id, d.Order.SourceChannelCode, d.Order.Contact, d.Order.Password, d.No, d.OrderId, d.Order.Title, d.Order.FromName })
             .ToListAsync(cancellationToken);
             .ToListAsync(cancellationToken);
 
 
         foreach (var item in orderVisitList)
         foreach (var item in orderVisitList)
@@ -1426,10 +1531,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             dt.Columns.Remove("Column1");
             dt.Columns.Remove("Column1");
 
 
         //计算小计
         //计算小计
-        for (int i = 0; i < dt.Rows.Count; i++)
+        for (int i = 0;i < dt.Rows.Count;i++)
         {
         {
             int sumcount = 0;
             int sumcount = 0;
-            for (int j = 1; j < dt.Columns.Count - 1; j++)
+            for (int j = 1;j < dt.Columns.Count - 1;j++)
             {
             {
                 sumcount += Convert.ToInt32(dt.Rows[i][j].ToString());
                 sumcount += Convert.ToInt32(dt.Rows[i][j].ToString());
             }
             }
@@ -1440,10 +1545,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         DataRow totalRow = dt.NewRow();
         DataRow totalRow = dt.NewRow();
         if (dt.Columns[0].ColumnName == "HotspotName") totalRow["HotspotName"] = "合计";
         if (dt.Columns[0].ColumnName == "HotspotName") totalRow["HotspotName"] = "合计";
         else totalRow["一级热点"] = "合计";
         else totalRow["一级热点"] = "合计";
-        for (int i = 1; i < dt.Columns.Count; i++)
+        for (int i = 1;i < dt.Columns.Count;i++)
         {
         {
             int sumcount = 0;
             int sumcount = 0;
-            for (int j = 0; j < dt.Rows.Count; j++)
+            for (int j = 0;j < dt.Rows.Count;j++)
             {
             {
                 sumcount += Convert.ToInt32(dt.Rows[j][i].ToString());
                 sumcount += Convert.ToInt32(dt.Rows[j][i].ToString());
             }
             }

+ 36 - 10
src/Hotline.Application/Subscribers/InternalCapSubscriber.cs

@@ -11,13 +11,14 @@ using Hotline.Share.Mq;
 using Hotline.Users;
 using Hotline.Users;
 using MediatR;
 using MediatR;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
+using NPOI.SS.Formula.Functions;
 using StackExchange.Redis;
 using StackExchange.Redis;
 using XF.Domain.Dependency;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
 
 
 namespace Hotline.Application.Subscribers
 namespace Hotline.Application.Subscribers
 {
 {
-    public class InternalCapSubscriber: ICapSubscribe, ITransientDependency
+    public class InternalCapSubscriber : ICapSubscribe, ITransientDependency
     {
     {
         private readonly IOrderRepository _orderRepository;
         private readonly IOrderRepository _orderRepository;
         private readonly IMediator _mediator;
         private readonly IMediator _mediator;
@@ -25,7 +26,7 @@ namespace Hotline.Application.Subscribers
         private readonly ICapPublisher _capPublisher;
         private readonly ICapPublisher _capPublisher;
         private readonly IRepository<BatchSmsTask> _batchSmsTaskRepository;
         private readonly IRepository<BatchSmsTask> _batchSmsTaskRepository;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
-        public InternalCapSubscriber(IOrderRepository orderRepository,IMediator mediator,IRepository<User> userRepository,ICapPublisher capPublisher,IRepository<BatchSmsTask> batchSmsTaskRepository,ISystemSettingCacheManager systemSettingCacheManager)
+        public InternalCapSubscriber(IOrderRepository orderRepository, IMediator mediator, IRepository<User> userRepository, ICapPublisher capPublisher, IRepository<BatchSmsTask> batchSmsTaskRepository, ISystemSettingCacheManager systemSettingCacheManager)
         {
         {
             _orderRepository = orderRepository;
             _orderRepository = orderRepository;
             _mediator = mediator;
             _mediator = mediator;
@@ -42,17 +43,17 @@ namespace Hotline.Application.Subscribers
         /// <param name="cancellationToken"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         /// <returns></returns>
         [CapSubscribe(EventNames.HotlineOrderNearlyExpiredTimeSms)]
         [CapSubscribe(EventNames.HotlineOrderNearlyExpiredTimeSms)]
-        public async Task SendOrderNearlyExpiredTimeSms(PublishNearlyExpiredTimeSmsDto dto,CancellationToken cancellationToken)
+        public async Task SendOrderNearlyExpiredTimeSms(PublishNearlyExpiredTimeSmsDto dto, CancellationToken cancellationToken)
         {
         {
             var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
             var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
-            if (order!=null && order.Status< Share.Enums.Order.EOrderStatus.Filed && order.NearlyExpiredTime?.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
+            if (order != null && order.Status < Share.Enums.Order.EOrderStatus.Filed && order.NearlyExpiredTime?.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
             {
             {
                 //当前办理人不为空发短信给个人
                 //当前办理人不为空发短信给个人
                 if (!string.IsNullOrEmpty(order.CurrentHandlerId))
                 if (!string.IsNullOrEmpty(order.CurrentHandlerId))
                 {
                 {
                     //查询人员
                     //查询人员
                     var user = await _userRepository.GetAsync(order.CurrentHandlerId, cancellationToken);
                     var user = await _userRepository.GetAsync(order.CurrentHandlerId, cancellationToken);
-                    if(user!=null && !string.IsNullOrEmpty(user.PhoneNo))
+                    if (user != null && !string.IsNullOrEmpty(user.PhoneNo))
                     {
                     {
                         //发送短信
                         //发送短信
                         var messageDto = new Share.Dtos.Push.MessageDto
                         var messageDto = new Share.Dtos.Push.MessageDto
@@ -71,7 +72,7 @@ namespace Hotline.Application.Subscribers
                     }
                     }
                 }
                 }
                 //当前办理部门不为空,发短信给部门经办人
                 //当前办理部门不为空,发短信给部门经办人
-                else if(!string.IsNullOrEmpty(order.CurrentHandleOrgId))
+                else if (!string.IsNullOrEmpty(order.CurrentHandleOrgId))
                 {
                 {
                     var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
                     var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
                     //查询部门经办人
                     //查询部门经办人
@@ -111,7 +112,7 @@ namespace Hotline.Application.Subscribers
         /// <param name="cancellationToken"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         /// <returns></returns>
         [CapSubscribe(EventNames.HotlineOrderExpiredTimeSms)]
         [CapSubscribe(EventNames.HotlineOrderExpiredTimeSms)]
-        public async Task SendOrderExpiredTimeSms(PublishNearlyExpiredTimeSmsDto dto,CancellationToken cancellationToken)
+        public async Task SendOrderExpiredTimeSms(PublishNearlyExpiredTimeSmsDto dto, CancellationToken cancellationToken)
         {
         {
             var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
             var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
             if (order != null && order.Status < Share.Enums.Order.EOrderStatus.Filed && order.NearlyExpiredTime?.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
             if (order != null && order.Status < Share.Enums.Order.EOrderStatus.Filed && order.NearlyExpiredTime?.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
@@ -178,11 +179,11 @@ namespace Hotline.Application.Subscribers
         /// <param name="cancellationToken"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         /// <returns></returns>
         [CapSubscribe(EventNames.HotlineBatchSmsTask)]
         [CapSubscribe(EventNames.HotlineBatchSmsTask)]
-        public async Task SendBatchSmsTask(PublishBatchSmsTaskDto dto,CancellationToken cancellationToken)
+        public async Task SendBatchSmsTask(PublishBatchSmsTaskDto dto, CancellationToken cancellationToken)
         {
         {
             var task = await _batchSmsTaskRepository.Queryable()
             var task = await _batchSmsTaskRepository.Queryable()
-                .Includes(x=>x.BatchSmsTaskDetails)
-                .Where(x=> x.Id == dto.TaskId).FirstAsync();
+                .Includes(x => x.BatchSmsTaskDetails)
+                .Where(x => x.Id == dto.TaskId).FirstAsync();
             if (task != null && task.SmsTaskState == ESmsTaskState.WaitDo && task.PlanSendTime.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
             if (task != null && task.SmsTaskState == ESmsTaskState.WaitDo && task.PlanSendTime.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
             {
             {
                 foreach (var item in task.BatchSmsTaskDetails)
                 foreach (var item in task.BatchSmsTaskDetails)
@@ -200,5 +201,30 @@ namespace Hotline.Application.Subscribers
                 }
                 }
             }
             }
         }
         }
+
+        /// <summary>
+        /// 批量发送短信
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        [CapSubscribe(EventNames.HotlineLeaderSMS)]
+        public async Task SendLeaderSMS(PublishLeaderSMSDto dto, CancellationToken cancellationToken)
+        {
+            //发送短信
+            var messageDto = new Share.Dtos.Push.MessageDto
+            {
+                PushBusiness = EPushBusiness.OrderSend,
+                ExternalId = dto.OrderId,
+                OrderId = dto.OrderId,
+                PushPlatform = EPushPlatform.Sms,
+                Remark = string.Empty,
+                Name = dto.Name,
+                TemplateCode = "1014",
+                Params = new(),
+                TelNumber = dto.TelNumber,
+            };
+            await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+        }
     }
     }
 }
 }

+ 102 - 0
src/Hotline.Application/Systems/BaseDataApplication.cs

@@ -0,0 +1,102 @@
+using Hotline.Caching.Interfaces;
+using Hotline.Settings;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Dependency;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Application.Systems;
+public class BaseDataApplication : IScopeDependency
+{
+    private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
+
+    public BaseDataApplication(ISystemDicDataCacheManager sysDicDataCacheManager)
+    {
+        _sysDicDataCacheManager = sysDicDataCacheManager;
+    }
+
+    private ConcurrentDictionary<string, dynamic> _baseData = new ConcurrentDictionary<string, dynamic>();
+    //private ConcurrentDictionary<string, int> _baseType = new ConcurrentDictionary<string, int>();
+    //private ConcurrentDictionary<string, int> _enumType = new ConcurrentDictionary<string, int>();
+    #region 内部方法
+    private void Add(Type type)
+    {
+        var name = new StackTrace().GetFrame(1).GetMethod().Name;
+        var method = typeof(EnumExts).GetMethod("GetDescriptions", BindingFlags.Static | BindingFlags.Public);
+        var genericMethod = method.MakeGenericMethod(type);
+        var result = genericMethod.Invoke(null, null);
+        _baseData.TryAdd(name, result);
+    }
+
+    private void Add(string key)
+    {
+        var name = new StackTrace().GetFrame(1).GetMethod().Name;
+        var result = _sysDicDataCacheManager
+            .GetSysDicDataCache(key)
+            .Where(x => x.DicDataValue != "-1")
+            .Select(m => new { m.Id, m.DicDataName, m.DicDataValue });
+        _baseData.TryAdd(name, result);
+    }
+    #endregion
+
+    public BaseDataApplication Source()
+    {
+        Add(typeof(ESource));
+        return this;
+    }
+
+    public BaseDataApplication VisitType()
+    {
+        Add(typeof(EVisitType));
+        return this;
+    }
+
+    public Dictionary<string, dynamic> Build()
+    {
+        return new Dictionary<string, dynamic>(_baseData);
+    }
+
+    public BaseDataApplication VoiceEvaluate()
+    {
+        Add(typeof(EVoiceEvaluate));
+        return this;
+    }
+
+    public BaseDataApplication SeatEvaluate()
+    {
+        Add(typeof(ESeatEvaluate));
+        return this;
+    }
+
+    public BaseDataApplication VisitSatisfaction()
+    {
+        Add(SysDicTypeConsts.VisitSatisfaction);
+        return this;
+    }
+
+    public BaseDataApplication VisitManner()
+    {
+        Add(SysDicTypeConsts.VisitManner);
+        return this;
+    }
+
+    public BaseDataApplication VisitStateQuery()
+    {
+        Add(typeof(EVisitStateQuery));
+        return this;
+    }
+
+    public BaseDataApplication DissatisfiedReason()
+    {
+        Add(SysDicTypeConsts.DissatisfiedReason);
+        return this;
+    }
+}

+ 0 - 1
src/Hotline.Repository.SqlSugar/Orders/OrderVisitRepository.cs

@@ -12,7 +12,6 @@ using SqlSugar;
 using XF.Domain.Dependency;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
-using XF.Domain.Repository.Extensions;
 
 
 namespace Hotline.Repository.SqlSugar.Orders;
 namespace Hotline.Repository.SqlSugar.Orders;
 public class OrderVisitRepository : BaseRepository<OrderVisit>, IOrderVisitRepository, IScopeDependency
 public class OrderVisitRepository : BaseRepository<OrderVisit>, IOrderVisitRepository, IScopeDependency

+ 26 - 1
src/Hotline.Share/Dtos/FlowEngine/NextStepsDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.FlowEngine;
 
 
 namespace Hotline.Share.Dtos.FlowEngine;
 namespace Hotline.Share.Dtos.FlowEngine;
 
 
@@ -45,8 +46,32 @@ public class NextStepsWithOpinionDto<TSteps> : NextStepsDto<TSteps>
 {
 {
     /// <summary>
     /// <summary>
     /// 宜宾需求:汇总节点办理前展示前一节点办理意见
     /// 宜宾需求:汇总节点办理前展示前一节点办理意见
+    /// 自贡需求: 临时保存的办理意见
     /// </summary>
     /// </summary>
     public string? Opinion { get; set; }
     public string? Opinion { get; set; }
+
+    /// <summary>
+    /// 自贡需求: 选择某一部门后会给对应部门领导发短信
+    /// </summary>
+    public IList<Kv>? LeaderSMS { get; set; }
+
+    /// <summary>
+    /// 市州转办信息
+    /// </summary>
+    public List<SystemDicDataOutDto>? TranspondCity { get; set; }
+}
+
+public class StepTempInDto
+{
+    /// <summary>
+    /// 节点Id
+    /// </summary>
+    public string StepId { get; set; }
+
+    /// <summary>
+    /// 意见
+    /// </summary>
+    public string Opinion { get; set; }
 }
 }
 
 
 
 

+ 60 - 2
src/Hotline.Share/Dtos/FlowEngine/NextWorkflowDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using System.ComponentModel;
 
 
 namespace Hotline.Share.Dtos.FlowEngine;
 namespace Hotline.Share.Dtos.FlowEngine;
 
 
@@ -49,15 +50,72 @@ public class NextWorkflowDto : BasicWorkflowDto
 
 
     /// <summary>
     /// <summary>
     /// 已与市民沟通
     /// 已与市民沟通
+    /// 已与市民电话联系,确认办理结果
     /// </summary>
     /// </summary>
+    [Description("已与市民电话联系,确认办理结果")]
     public bool? RealIsContacted { get; set; }
     public bool? RealIsContacted { get; set; }
 
 
     /// <summary>
     /// <summary>
     /// 已与市民现场沟通
     /// 已与市民现场沟通
+    /// 已赴现场处置,将处理结果告知市民
     /// </summary>
     /// </summary>
+    [Description("已赴现场处置,将处理结果告知市民")]
     public bool? RealContactLocale { get; set; }
     public bool? RealContactLocale { get; set; }
 
 
-   
+    #endregion
 
 
-	#endregion
+    #region task_298
+    /// <summary>
+    /// 其它
+    /// </summary>
+    [Description("其它")]
+    public bool? IsOther { get; set; }
+
+    /// <summary>
+    /// 其它原因
+    /// </summary>
+    [Description("其它原因")]
+    public string? OtherRemark { get; set; }
+
+    /// <summary>
+    /// 是否紧急
+    /// </summary>
+    public bool? IsUrgent { get; set; }
+
+    /// <summary>
+    /// 是否推诿
+    /// </summary>
+    public bool? IsEvasive { get; set; }
+
+    /// <summary>
+    /// 是否不积极
+    /// </summary>
+    public bool? IsInactively { get; set; }
+
+    /// <summary>
+    /// 领导短信Key
+    /// </summary>
+    public string? LeaderSMSKey { get; set; }
+
+    /// <summary>
+    /// 是否市州转办
+    /// </summary>
+    public bool? Transpond { get; set; }
+
+    /// <summary>
+    /// 市州转办信息
+    /// </summary>
+    public string? TranspondCityName { get; set; }
+
+    /// <summary>
+    /// 市州转办信息
+    /// </summary>
+    public string? TranspondCityId { get; set; }
+
+    /// <summary>
+    /// 市州转办信息
+    /// </summary>
+    public string? TranspondCityValue { get; set; }
+
+    #endregion
 }
 }

+ 4 - 0
src/Hotline.Share/Dtos/FlowEngine/StartWorkflowDto.cs

@@ -13,6 +13,10 @@
         /// </summary>
         /// </summary>
         public string Title { get; set; }
         public string Title { get; set; }
 
 
+        /// <summary>
+        /// 是否转办
+        /// </summary>
+        public bool IsForwarded { get; set; }
     }
     }
 
 
     public class StartWorkflowDto<TData>
     public class StartWorkflowDto<TData>

+ 4 - 1
src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs

@@ -11,7 +11,10 @@ namespace Hotline.Share.Dtos.Order
 {
 {
     public class OrderStartFlowDto : StartWorkflowDto<string>
     public class OrderStartFlowDto : StartWorkflowDto<string>
     {
     {
-        
+        /// <summary>
+        /// 是否转办
+        /// </summary>
+        public bool IsForwarded { get; set; }
     }
     }
 
 
     public class ScreenStartFlowDto : StartWorkflowDto<OrderScreenDto>
     public class ScreenStartFlowDto : StartWorkflowDto<OrderScreenDto>

+ 32 - 1
src/Hotline.Share/Dtos/Push/MessagePagedDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.Push;
+using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Enums.Push;
 using Hotline.Share.Requests;
 using Hotline.Share.Requests;
 using XF.Utility.EnumExtensions;
 using XF.Utility.EnumExtensions;
 
 
@@ -157,4 +158,34 @@ namespace Hotline.Share.Dtos.Push
     {
     {
         public string TaskId { get; set; }
         public string TaskId { get; set; }
     }
     }
+
+    public class PublishLeaderSMSDto
+    {
+        public PublishLeaderSMSDto()
+        {
+            
+        }
+
+        public PublishLeaderSMSDto(string orderId, string dicDataName, string dicDataValue)
+        {
+            OrderId = orderId;
+            TelNumber = dicDataValue;
+            Name = dicDataName;
+        }
+
+        /// <summary>
+        /// 工单Id
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 接收手机号码
+        /// </summary>
+        public string TelNumber { get; set; }
+
+        /// <summary>
+        /// 接收人
+        /// </summary>
+        public string Name { get; set; }
+    }
 }
 }

+ 20 - 0
src/Hotline.Share/Dtos/Settings/SystemDicDataDto.cs

@@ -0,0 +1,20 @@
+namespace Hotline.Share.Dtos.Settings
+{
+    public class SystemDicDataOutDto
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 字典名称
+        /// </summary>
+        public string DicDataName { get; set; }
+
+        /// <summary>
+        /// 字典值
+        /// </summary>
+        public string DicDataValue { get; set; }
+    }
+}

+ 5 - 0
src/Hotline.Share/Mq/EventNames.Order.cs

@@ -133,6 +133,11 @@ namespace Hotline.Share.Mq
         /// </summary>
         /// </summary>
         public const string HotlineBatchSmsTask = "hotline.order.batchsmstask";
         public const string HotlineBatchSmsTask = "hotline.order.batchsmstask";
 
 
+        /// <summary>
+        /// 领导通知短信
+        /// </summary>
+        public const string HotlineLeaderSMS = "hotline.order.leaser.sms";
+
         #endregion
         #endregion
 
 
      
      

+ 21 - 2
src/Hotline.Share/Tools/TaskExtensions.cs

@@ -1,4 +1,5 @@
-namespace XF.Domain.Repository.Extensions;
+namespace Hotline.Share.Tools;
+
 public static class TaskExtensions
 public static class TaskExtensions
 {
 {
     /// <summary>
     /// <summary>
@@ -17,5 +18,23 @@ public static class TaskExtensions
             await action(result);
             await action(result);
         }
         }
     }
     }
+
+    /// <summary>
+    /// 为 Task 类型的扩展方法,如果实体不为 null,则执行指定的操作。
+    /// </summary>
+    /// <typeparam name="T">实体的类型</typeparam>
+    /// <param name="task">Task 实例</param>
+    /// <param name="action">要执行的操作</param>
+    /// <returns>Task 返回自身</returns>
+    public static async Task Then<T>(this Task<T> task, Action<T> action)
+    {
+        var result = await task;
+
+        if (result != null)
+        {
+            action(result);
+        }
+    }
+
 }
 }
-  
+

+ 5 - 0
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -30,6 +30,11 @@ public abstract class StepBasicEntity : CreationEntity
 
 
     #endregion
     #endregion
 
 
+    /// <summary>
+    /// 是否转办
+    /// </summary>
+    public bool? IsForwarded { get; set; }
+
     /// <summary>
     /// <summary>
     /// 流程指派类型
     /// 流程指派类型
     /// </summary>
     /// </summary>

+ 1 - 1
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -7,6 +7,7 @@ using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Enums.Settings;
 using SqlSugar;
 using SqlSugar;
+using System.ComponentModel;
 using XF.Domain.Entities;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Exceptions;
 using XF.Domain.Extensions;
 using XF.Domain.Extensions;
@@ -161,7 +162,6 @@ public partial class Workflow : CreationEntity
     /// 已与市民现场沟通
     /// 已与市民现场沟通
     /// </summary>
     /// </summary>
     public bool? RealContactLocale { get; set; }
     public bool? RealContactLocale { get; set; }
-
     #endregion
     #endregion
 
 
     #region 当前办理节点信息(指派时赋值)
     #region 当前办理节点信息(指派时赋值)

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

@@ -596,6 +596,18 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDescription = "已与市民现场沟通")]
         [SugarColumn(ColumnDescription = "已与市民现场沟通")]
         public bool? RealContactLocale { get; set; }
         public bool? RealContactLocale { get; set; }
 
 
+        /// <summary>
+        /// 其它
+        /// </summary>
+        [SugarColumn(ColumnDescription = "其它")]
+        public bool? IsOther { get; set; }
+
+        /// <summary>
+        /// 其它的备注
+        /// </summary>
+        [SugarColumn(ColumnDescription = "其它的备注")]
+        public string? OtherRemark { get; set; }
+
         #endregion
         #endregion
 
 
         #region 当前办理节点信息(指派时赋值)
         #region 当前办理节点信息(指派时赋值)
@@ -944,6 +956,18 @@ namespace Hotline.Orders
         [SugarColumn(DefaultValue = "f", ColumnDescription = "是否紧急")]
         [SugarColumn(DefaultValue = "f", ColumnDescription = "是否紧急")]
         public bool IsUrgent { get; set; }
         public bool IsUrgent { get; set; }
 
 
+        /// <summary>
+        /// 是否推诿
+        /// </summary>
+        [SugarColumn(DefaultValue = "f", ColumnDescription = "是否推诿")]
+        public bool IsEvasive { get; set; }
+
+        /// <summary>
+        /// 是否不积极
+        /// </summary>
+        [SugarColumn(DefaultValue = "f", ColumnDescription = "是否不积极")]
+        public bool IsInactively { get; set; }
+
         /// <summary>
         /// <summary>
         /// 是否三方通话
         /// 是否三方通话
         /// </summary>
         /// </summary>
@@ -997,8 +1021,7 @@ namespace Hotline.Orders
 		/// </summary>
 		/// </summary>
 		[SugarColumn(ColumnDescription = "退回截至时间")]
 		[SugarColumn(ColumnDescription = "退回截至时间")]
 		public DateTime? SendBackAuditEndTime { get; set; }
 		public DateTime? SendBackAuditEndTime { get; set; }
-
-	}
+    }
 
 
     public partial class Order
     public partial class Order
     {
     {

+ 39 - 35
src/Hotline/Settings/SysDicTypeConsts.cs

@@ -155,15 +155,15 @@ public class SysDicTypeConsts
     /// </summary>
     /// </summary>
     public const string QualityItemGrouping = "QualityItemGrouping";
     public const string QualityItemGrouping = "QualityItemGrouping";
 
 
-	/// <summary>
-	/// 违禁词分类
-	/// </summary>
-	public const string ProhibitedClassify = "ProhibitedClassify";
+    /// <summary>
+    /// 违禁词分类
+    /// </summary>
+    public const string ProhibitedClassify = "ProhibitedClassify";
 
 
-	/// <summary>
-	/// 违禁词属性
-	/// </summary>
-	public const string ProhibitedType = "ProhibitedType";
+    /// <summary>
+    /// 违禁词属性
+    /// </summary>
+    public const string ProhibitedType = "ProhibitedType";
 
 
     /// <summary>
     /// <summary>
     /// 公告类型
     /// 公告类型
@@ -175,10 +175,10 @@ public class SysDicTypeConsts
     /// </summary>
     /// </summary>
     public const string BulletinPushRange = "BulletinPushRange";
     public const string BulletinPushRange = "BulletinPushRange";
 
 
-	/// <summary>
-	/// 通知类型
-	/// </summary>
-	public const string CircularType = "CircularType";
+    /// <summary>
+    /// 通知类型
+    /// </summary>
+    public const string CircularType = "CircularType";
 
 
     /// <summary>
     /// <summary>
     /// 工单词性分类
     /// 工单词性分类
@@ -203,46 +203,50 @@ public class SysDicTypeConsts
     /// 随手拍特提原因
     /// 随手拍特提原因
     /// </summary>
     /// </summary>
     public const string InstaShotSpecialReason = "InstaShotSpecialReason";
     public const string InstaShotSpecialReason = "InstaShotSpecialReason";
-	
 
 
-	/// <summary>
-	/// 网民评价类型
-	/// </summary>
-	public const string NetizenEvaluateType = "NetizenEvaluateType";
 
 
+    /// <summary>
+    /// 网民评价类型
+    /// </summary>
+    public const string NetizenEvaluateType = "NetizenEvaluateType";
 
 
-	/// <summary>
-	/// 市州工单互转
-	/// </summary>
-	public const string TranspondCity = "TranspondCity";
+    /// <summary>
+    /// 市州工单互转
+    /// </summary>
+    public const string TranspondCity = "TranspondCity";
 
 
-	/// <summary>
-	/// 错件类型
-	/// </summary>
-	public const string ReTransactErrorType = "ReTransactErrorType";
+    /// <summary>
+    /// 错件类型
+    /// </summary>
+    public const string ReTransactErrorType = "ReTransactErrorType";
 
 
     /// <summary>
     /// <summary>
     /// 行政司法指定部门
     /// 行政司法指定部门
     /// </summary>
     /// </summary>
     public const string JudicialManagementOrg = "JudicialManagementOrg";
     public const string JudicialManagementOrg = "JudicialManagementOrg";
 
 
-	/// <summary>
-	/// 通话转接来源
-	/// </summary>
-	public const string CallForwardingSource = "CallForwardingSource";
+    /// <summary>
+    /// 通话转接来源
+    /// </summary>
+    public const string CallForwardingSource = "CallForwardingSource";
 
 
-	/// <summary>
-	/// 通话转接分类
-	/// </summary>
-	public const string CallForwardingType = "CallForwardingType";
+    /// <summary>
+    /// 通话转接分类
+    /// </summary>
+    public const string CallForwardingType = "CallForwardingType";
 
 
     /// <summary>
     /// <summary>
     /// 工单标签
     /// 工单标签
     /// </summary>
     /// </summary>
-	public const string OrderTag = "OrderTag";
+    public const string OrderTag = "OrderTag";
 
 
     /// <summary>
     /// <summary>
     /// 重点关注事件
     /// 重点关注事件
     /// </summary>
     /// </summary>
-	public const string FocusOnEvent = "FocusOnEvent";
+    public const string FocusOnEvent = "FocusOnEvent";
+
+    /// <summary>
+    /// 领导电话号码
+    /// </summary>
+    public const string LeaderSMS = "LeaderSMS";
 }
 }