Parcourir la source

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

田爽 il y a 1 an
Parent
commit
6f2043fcc3

+ 0 - 4
src/Hotline.Ai.Jths/Hotline.Ai.Jths.csproj

@@ -16,8 +16,4 @@
     <ProjectReference Include="..\Hotline\Hotline.csproj" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Compile Remove="IJthsClient.cs" />
-  </ItemGroup>
-
 </Project>

+ 47 - 29
src/Hotline.Api/Controllers/OrderController.cs

@@ -212,10 +212,10 @@ public class OrderController : BaseController
                 d => d.Acceptor.Name.Contains(dto.PubMan!) || d.Acceptor.StaffNo.Contains(dto.PubMan!))
             .WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
             .WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
-            .WhereIF(dto.FiledType!=null && dto.FiledType == FiledType.CenterFiled,d=>d.ProcessType == EProcessType.Zhiban)
-            .WhereIF(dto.FiledType!=null && dto.FiledType == FiledType.OrgFiled,d=>d.ProcessType == EProcessType.Jiaoban)
-            .WhereIF(dto.IsCountersign!=null && dto.IsCountersign == true,d=>d.CounterSignType != null)
-            .WhereIF(dto.IsCountersign!=null && dto.IsCountersign == false,d=>d.CounterSignType == null)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
+            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.CounterSignType != null)
+            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.CounterSignType == null)
             .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
             .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
@@ -312,7 +312,7 @@ public class OrderController : BaseController
                     visitedDetail.Add(seatDetail);
                     await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, HttpContext.RequestAborted);
                 }
-                catch {}
+                catch { }
             }
         }
     }
@@ -714,16 +714,17 @@ public class OrderController : BaseController
                         }, cancellationToken: HttpContext.RequestAborted);
 
                 //推门户
-                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto(){ 
-                     Id = visit.Id,
-                     Order = orderDto,
-                     OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
-                     VisitName = _sessionContext.UserName,
-                     VisitTime = visit.VisitTime,
-                     VisitType = visit.VisitType,
-                     VisitState=visit.VisitState,
-                     PublishTime = visit.PublishTime,
-                },cancellationToken:HttpContext.RequestAborted);
+                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
+                {
+                    Id = visit.Id,
+                    Order = orderDto,
+                    OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
+                    VisitName = _sessionContext.UserName,
+                    VisitTime = visit.VisitTime,
+                    VisitType = visit.VisitType,
+                    VisitState = visit.VisitState,
+                    PublishTime = visit.PublishTime,
+                }, cancellationToken: HttpContext.RequestAborted);
                 //try
                 //{
                 //    await _provinceService.SubmitVisitInfo(new PublishVisitDto()
@@ -1270,18 +1271,18 @@ public class OrderController : BaseController
     [HttpGet("mayscreen")]
     public async Task<PagedDto<OrderVisitDetailDto>> MayScreenList([FromQuery] MayScreenListDto dto)
     {
-        var query = _orderVisitedDetailRepository.Queryable(false,true)
+        var query = _orderVisitedDetailRepository.Queryable(false, true)
             .Includes(x => x.OrderVisit)
             .Includes(x => x.OrderVisit, y => y.Order)
             .Includes(x => x.OrderVisit, y => y.Employee)
-            .LeftJoin<OrderScreen>((x,s)=> x.Id == s.VisitDetailId && (int)s.Status < 2 && s.IsDeleted == false)
-            .Where((x,s)=> s.Id == null)
+            .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && (int)s.Status < 2 && s.IsDeleted == false)
+            .Where((x, s) => s.Id == null)
             .Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle);
         if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
         {
             query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-					(x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-					          x.OrderVisit.Order.No.Contains(dto.Keyword!))
+                    (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
+                              x.OrderVisit.Order.No.Contains(dto.Keyword!))
                 .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
@@ -1292,8 +1293,8 @@ public class OrderController : BaseController
         else
         {
             query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-					(x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-					          x.OrderVisit.Order.No.Contains(dto.Keyword!))
+                    (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
+                              x.OrderVisit.Order.No.Contains(dto.Keyword!))
                 .Where((x, s) => x.VisitTarget == EVisitTarget.Org && (
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
@@ -1932,14 +1933,15 @@ public class OrderController : BaseController
             return new();
 
         var canHandle = false;
-        if (!string.IsNullOrEmpty(order?.WorkflowId))
+        var canEndCs = false;
+        if (!string.IsNullOrEmpty(order.WorkflowId))
         {
-            var (workflow, handlePermission) = await _workflowDomainService.GetWorkflowHandlePermissionAsync(
+            var (workflow, handlePermission, canEndCountersign) = await _workflowDomainService.GetWorkflowHandlePermissionAsync(
                 order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId,
-                withSteps: true, withSupplements: true,
                 cancellationToken: HttpContext.RequestAborted);
             order.Workflow = workflow;
             canHandle = handlePermission;
+            canEndCs = canEndCountersign;
 
             await _mediator.Publish(new GetOrderDetailNotify(order.Workflow,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
@@ -1948,6 +1950,7 @@ public class OrderController : BaseController
         }
 
         var dto = _mapper.Map<OrderDto>(order!);
+        dto.CanEndCountersign = canEndCs;
 
         if (dto.FileJson != null && dto.FileJson.Any())
         {
@@ -1959,8 +1962,11 @@ public class OrderController : BaseController
         var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == order.CallId).FirstAsync();
         if (call != null) dto.RecordingFileUrl = call.RecordingFileUrl;
 
-        if (order?.Workflow != null)
+        if (order.Workflow != null)
+        {
             dto.Workflow.CanHandle = canHandle;
+            dto.CanPrevious = !order.Workflow.IsInCountersign;
+        }
         var repeatablesMap = await _repeatableEventDetailRepository.Queryable()
             .Includes(x => x.Order)
             .Where(x => x.OrderId == id).Distinct().ToListAsync();
@@ -2138,6 +2144,18 @@ public class OrderController : BaseController
             HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 结束会签
+    /// </summary>
+    [HttpPost("cs-end")]
+    public async Task EndCountersign([FromBody] EndCountersignDto dto)
+    {
+        var order = await _orderDomainService.GetOrderAsync(dto.OrderId, cancellationToken: HttpContext.RequestAborted);
+        if (string.IsNullOrEmpty(order.WorkflowId))
+            throw new UserFriendlyException("该工单未开启流程");
+        await _workflowDomainService.EndCountersignAsync(order.WorkflowId, HttpContext.RequestAborted);
+    }
+
     /// <summary>
     /// 查询工单办理下一步可选节点(带推荐部门)
     /// </summary>
@@ -2317,9 +2335,9 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                 d => d.No.Contains(dto.Keyword!) || d.Title.Contains(dto.Keyword!))
             .Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
-            .OrderBy(d=>d.Status)
-            .OrderByIF(dto.IsHandled == true,d=>d.StartTime,OrderByType.Asc)
-            .OrderByIF(dto.IsHandled == false,d=> d.CreationTime,OrderByType.Desc)
+            .OrderBy(d => d.Status)
+            .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Asc)
+            .OrderByIF(dto.IsHandled == false, d => d.CreationTime, OrderByType.Desc)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));

+ 2 - 3
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -516,8 +516,7 @@ public class WorkflowController : BaseController
         centerIsTop.AddRange(orgs);
         return new
         {
-            ModuleOptions =
-                WorkflowModuleConsts.AllModules.Select(d => new KeyValuePair<string, string>(d.Code, d.Name)),
+            ModuleOptions = WorkflowModuleConsts.AllModules.Select(d => new KeyValuePair<string, string>(d.Code, d.Name)),
             HandlerTypeOptions = EnumExts.GetDescriptions<EHandlerType>(),
             BusinessTypeOptions = EnumExts.GetDescriptions<EBusinessType>(),
             StepPropertiesOptions = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.WorkflowStepComponent),
@@ -530,7 +529,7 @@ public class WorkflowController : BaseController
                 {
                     Key = d.Key,
                     Value = d.Value,
-                    Items = d.Key == 0 || d.Key == 2 ? centerIsTop : orgs
+                    Items = d.Key is 0 or 2 ? centerIsTop : orgs
                 }),
             FlowTypeOptions = EnumExts.GetDescriptions<EFlowType>()
         };

+ 0 - 5
src/Hotline.Application.Contracts/Hotline.Application.Contracts.csproj

@@ -15,9 +15,4 @@
     <ProjectReference Include="..\Hotline\Hotline.csproj" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Folder Include="Configurations\" />
-    <Folder Include="Validators\DataSharing\" />
-  </ItemGroup>
-
 </Project>

+ 2 - 1
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -4,6 +4,7 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Definition;
+using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.FlowEngine;
 
@@ -14,7 +15,7 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 开始流程
         /// </summary>
-        Task<string> StartWorkflowAsync(StartWorkflowDto dto, string externalId, ExpiredTimeWithConfig? expiredTimeConfig = null, 
+        Task<string> StartWorkflowAsync(StartWorkflowDto dto, string externalId, ExpiredTimeWithConfig? expiredTimeConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>

+ 1 - 33
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -29,6 +29,7 @@ using XF.Domain.Extensions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.Order;
 
 namespace Hotline.Application.FlowEngine;
 
@@ -528,39 +529,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             return dto;
         }
 
-        //if (currentStep.IsInCountersign())
-        //{
-        //    if (currentStep.IsCountersignEndStep)
-        //    {
-        //        //当前待办节点为会签汇总节点时:检查是否为顶级会签汇总节点,t:按配置往下走,f:继续往上汇总,不需要重复往下指派
-        //        if (!currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
-        //        {
-        //            //查找当前节点对应会签开始节点的上级作为下一个cs汇总节点的汇总对象
-        //            var startCountersignStep =
-        //                workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
-        //            if (startCountersignStep is null)
-        //                throw new UserFriendlyException(
-        //                    $"未查询到会签开始节点,workflowId: {workflow.Id}, startStepId: {currentStep.CountersignStartStepId}",
-        //                    "未查询到会签开始节点,数据异常");
-        //            var countersignEndOption = GetCsEndStepByPrev(workflow.Steps, startCountersignStep);
-
-        //            dto.Steps = new List<NextStepOption> { countersignEndOption };
-        //            return dto;
-        //        }
-        //    }
-        //    else
-        //    {
-        //        //汇总节点
-        //        var countersignEndOption = GetCsEndStepByPrev(workflow.Steps, currentStep);
-        //        //按会签策略
-        //        var nextStepOption =
-        //            await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, currentStep.StepType, currentStep.BusinessType,
-        //                cancellationToken);
-        //        dto.Steps = new List<NextStepOption> { nextStepOption, countersignEndOption };
-        //        return dto;
-        //    }
-        //}
-
         if (currentStep.IsInCountersign())
         {
             if (currentStep.IsCountersignEndStep)

+ 0 - 3
src/Hotline.Application/Handlers/CallCenter/FlowControl/IncomingNotificationHandler.cs

@@ -1,7 +1,6 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Devices;
-using Hotline.CallCenter.Ivrs;
 using Hotline.Realtimes;
 using Hotline.Settings;
 using Hotline.Share.Enums.CallCenter;
@@ -12,8 +11,6 @@ using Microsoft.Extensions.Options;
 using NewRock.Sdk;
 using NewRock.Sdk.Transfer.Connect.Request;
 using NewRock.Sdk.Transfer.Queue.Request;
-using Oracle.ManagedDataAccess.Types;
-using Org.BouncyCastle.Utilities.IO;
 using XF.Domain.Cache;
 using XF.Domain.Constants;
 using XF.Domain.Exceptions;

+ 13 - 0
src/Hotline.Share/Dtos/Order/EndCountersignDto.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Order
+{
+    public class EndCountersignDto
+    {
+        public string OrderId { get; set; }
+    }
+}

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

@@ -380,6 +380,16 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public bool CanSign => string.IsNullOrEmpty(SignerId);
 
+        /// <summary>
+        /// 是否可结束会签
+        /// </summary>
+        public bool CanEndCountersign { get; set; }
+
+        /// <summary>
+        /// 是否可退回
+        /// </summary>
+        public bool CanPrevious { get; set; }
+
         /// <summary>
         /// 延期申请数量
         /// </summary>

+ 7 - 3
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -34,9 +34,8 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询工作流包含当前用户办理权限(是否可办理)
         /// </summary>
-        Task<(Workflow, bool)> GetWorkflowHandlePermissionAsync(string workflowId, string userId, string orgCode,
-            bool withDefine = false, bool withSteps = false, bool withTraces = false, bool withSupplements = false,
-            bool withCountersigns = false, CancellationToken cancellationToken = default);
+        Task<(Workflow, bool, bool)> GetWorkflowHandlePermissionAsync(string workflowId, string userId, string orgCode,
+            CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 受理,接办
@@ -135,5 +134,10 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto, List<Kv> handlers);
+
+        /// <summary>
+        /// 结束会签(会签未办理节点无需再办,由发起会签节点继续办理)
+        /// </summary>
+        Task EndCountersignAsync(string workflowId, CancellationToken cancellationToken);
     }
 }

+ 2 - 3
src/Hotline/FlowEngine/Workflows/WorkflowCountersign.cs

@@ -115,7 +115,6 @@ namespace Hotline.FlowEngine.Workflows
         // public int Members { get; set; }
         [Navigate(NavigateType.OneToMany, nameof(WorkflowCountersignMember.WorkflowCountersignId))]
         public List<WorkflowCountersignMember> Members { get; set; }
-        //todo 发起时记录哪些待办,办理时记录哪些已办
 
         /// <summary>
         /// 流程指派类型(冗余,非工单办理为null)
@@ -164,8 +163,8 @@ namespace Hotline.FlowEngine.Workflows
         public void MemberHandled(string userId, string orgId)
         {
             var member = FlowAssignType == EFlowAssignType.Org
-                ? Members.FirstOrDefault(d => d.Id == orgId)
-                : Members.FirstOrDefault(d => d.Id == userId);
+                ? Members.FirstOrDefault(d => d.Key == orgId)
+                : Members.FirstOrDefault(d => d.Key == userId);
 
             if (member is null)
                 throw new UserFriendlyException($"未找到会签办理对象");

+ 50 - 12
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -207,16 +207,14 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询工作流包含当前用户办理权限(是否可办理)
         /// </summary>
-        public async Task<(Workflow, bool)> GetWorkflowHandlePermissionAsync(
-            string workflowId, string userId, string orgCode,
-            bool withDefine = false, bool withSteps = false, bool withTraces = false,
-            bool withSupplements = false, bool withCountersigns = false,
-            CancellationToken cancellationToken = default)
+        public async Task<(Workflow, bool, bool)> GetWorkflowHandlePermissionAsync(
+            string workflowId, string userId, string orgCode, CancellationToken cancellationToken = default)
         {
-            var workflow = await GetWorkflowAsync(workflowId, withDefine, withSteps, withTraces, withSupplements,
-                withCountersigns, cancellationToken);
+            var workflow = await GetWorkflowAsync(workflowId, withSteps: true, withSupplements: true,
+                withCountersigns: true, cancellationToken: cancellationToken);
             var canHandle = workflow.CanHandle(userId, orgCode);
-            return (workflow, canHandle);
+            var canEndCountersign = workflow.Countersigns.Any(d => !d.IsCompleted() && d.StarterId == userId);
+            return (workflow, canHandle, canEndCountersign);
         }
 
         /// <summary>
@@ -280,9 +278,8 @@ namespace Hotline.FlowEngine.Workflows
             #region 办理当前节点
 
             if (dto.Files.Any())
-                currentStep.FileJson =
-                    await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, currentStep.Id,
-                        cancellationToken);
+                currentStep.FileJson = await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, 
+                    currentStep.Id, cancellationToken);
 
             var counterSignType = GetCounterSignType(currentStep.BusinessType);
 
@@ -360,7 +357,9 @@ namespace Hotline.FlowEngine.Workflows
                         "会签数据异常");
                 countersign.MemberHandled(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
                 //update cs
-                await _workflowCountersignRepository.UpdateAsync(countersign, cancellationToken);
+                await _workflowCountersignRepository.UpdateNav(countersign)
+                    .Include(d => d.Members)
+                    .ExecuteCommandAsync();
             }
 
             await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
@@ -836,6 +835,39 @@ namespace Hotline.FlowEngine.Workflows
             return startStep;
         }
 
+        /// <summary>
+        /// 结束会签
+        /// </summary>
+        public async Task EndCountersignAsync(string workflowId, CancellationToken cancellationToken)
+        {
+            var workflow = await GetWorkflowAsync(workflowId,
+                withSteps: true, withCountersigns: true, cancellationToken: cancellationToken);
+            var countersign = workflow.Countersigns.FirstOrDefault(d =>
+                    !d.IsCompleted() && d.StarterId == _sessionContext.RequiredUserId);
+            if (countersign is null) return;
+
+            //var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == countersign.StartStepId);
+            //if (countersignStartStep is null)
+            //    throw new UserFriendlyException($"未查询到会签对应开始节点, workflowId: {workflowId}, csId: {countersign.Id}");
+            ////结束step会签信息
+            //countersignStartStep.CountersignEnd();
+            ////todo
+            //updateSteps.Add(countersignStartStep);
+
+            ////结束会签
+            //countersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
+            //    _sessionContext.RequiredUserId, _sessionContext.UserName,
+            //    _sessionContext.RequiredOrgId, _sessionContext.OrgName,
+            //    _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName);
+            //await _workflowCountersignRepository.UpdateAsync(currentCountersign, cancellationToken);
+
+
+            //todo thk: 以发起人/发起部门结束会签必须对应以发起人/发起部门开启会签限制
+            //todo 1.当前会签内未办节点处理为已办(默认办理意见xx结束会签)2.create new csEndStep(看做会签待办节点最后一个节点办理时)
+
+
+        }
+
         #region private method
 
         public async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
@@ -1069,7 +1101,13 @@ namespace Hotline.FlowEngine.Workflows
 
             //创建会签数据
             if (dto.IsStartCountersign)
+            {
+                var exists = workflow.Countersigns.Any(d =>
+                    !d.IsCompleted() && d.StarterId == _sessionContext.RequiredUserId);
+                if (exists)
+                    throw new UserFriendlyException("该用户在当前流程存在未结束会签");
                 await StartCountersignAsync(workflow, step, dto, flowAssignType, counterSignType, cancellationToken);
+            }
 
             //办理参数
             _mapper.Map(dto, step);

+ 0 - 4
src/Hotline/Hotline.csproj

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