Forráskód Böngészése

Merge branch 'release' into fix/countersign_end

# Conflicts:
#	src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
xf 6 hónapja
szülő
commit
1c9eb5206c

+ 1 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -3755,7 +3755,7 @@ public class OrderController : BaseController
         rsp.LeaderSMS = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.LeaderSMS)
             .Select(m => new Kv { Key = m.Id, Value = m.DicDataName }).ToList();
         var opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
-        if (opinion.IsNullOrEmpty())
+        if (opinion.NotNullOrEmpty())
         {
             rsp.Opinion = opinion;
         }

+ 5 - 1
src/Hotline.Api/Controllers/WebPortalController.cs

@@ -660,7 +660,7 @@ namespace Hotline.Api.Controllers
         public async Task<OpenResponse> GetOrderByListAllOpen([FromBody] QueryOrderListDto dto)
         {
             var queryNew = _orderRepository.Queryable()
-                .LeftJoin<OrderPublish>((p,op)=>p.Id==op.OrderId)
+                .LeftJoin<OrderPublish>((p, op) => p.Id == op.OrderId)
                 .Where(p => p.IsPublicity == true)
                 .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), (p, op) => p.No == dto.FlowCode)
                 .WhereIF(!string.IsNullOrEmpty(dto.FlowName), (p, op) => p.Title.Contains(dto.FlowName))
@@ -850,6 +850,10 @@ namespace Hotline.Api.Controllers
         [HttpPost("orderacceptance")]
         public async Task<OpenResponse> OrderAcceptance([FromBody] WebFlowAccept dto)
         {
+            //电话号码去空格
+            if (!string.IsNullOrEmpty(dto.Mobile))
+                dto.Mobile = dto.Mobile.Trim();
+
             var data = _mapper.Map<Hotline.Share.Dtos.Order.AddOrderDto>(dto);
             if (string.IsNullOrEmpty(data.SourceChannelCode))
             {

+ 12 - 3
src/Hotline.Api/StartupHelper.cs

@@ -268,7 +268,8 @@ namespace Hotline.Api
                     .StartNow()
                     .WithCronSchedule("0 30 09,14 * * ?"));
 
-                switch (appConfiguration.AppScope)
+                var autoSendOrderKey = new JobKey(nameof(SendOrderJob), "send order task");
+				switch (appConfiguration.AppScope)
                 {
                     //智能化任务
                     case AppDefaults.AppScope.YiBin:
@@ -280,7 +281,6 @@ namespace Hotline.Api
                         .StartNow()
                         .WithCronSchedule("0 0/5 * * * ? *"));
 
-                        var autoSendOrderKey = new JobKey(nameof(SendOrderJob), "send order task");
                         d.AddJob<SendOrderJob>(autoSendOrderKey);
                         d.AddTrigger(t => t
                             .WithIdentity("task-send-order-trigger")
@@ -289,7 +289,16 @@ namespace Hotline.Api
                             .WithCronSchedule("0 10 9 * * ?")
                         );
                         break;
-                    default:
+                    case AppDefaults.AppScope.ZiGong:
+	                    d.AddJob<SendOrderJob>(autoSendOrderKey);
+	                    d.AddTrigger(t => t
+		                    .WithIdentity("task-send-order-trigger")
+		                    .ForJob(autoSendOrderKey)
+		                    .StartNow()
+		                    .WithCronSchedule("0 10 9 * * ?")
+	                    );
+						break;
+					default:
                         break;
                 }
 

+ 32 - 0
src/Hotline.Application.Tests/Application/DefaultCallApplicationTest.cs

@@ -0,0 +1,32 @@
+using Hotline.Api.Controllers;
+using Hotline.Application.CallCenter;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Share.Dtos.CallCenter;
+using Hotline.Users;
+using Microsoft.Extensions.DependencyInjection;
+using Shouldly;
+using SqlSugar.Extensions;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests.Application;
+public class DefaultCallApplicationTest
+{
+    private readonly XingTangCallApplication _defaultCallApplication;
+
+    public DefaultCallApplicationTest(XingTangCallApplication defaultCallApplication)
+    {
+        _defaultCallApplication = defaultCallApplication;
+    }
+
+    [Fact]
+    public async Task QueryCallsFixed_Test()
+    {
+        var inDto = new QueryCallsFixedDto();
+        inDto.CallStartTimeEnd = DateTime.Now;
+        inDto.CallStartTimeStart = "2024/10/01 00:00:00".ObjToDate();
+
+        var items = _defaultCallApplication.QueryCallsFixedAsync(inDto, new CancellationToken());
+        items.ShouldNotBeNull();
+    }
+}

+ 13 - 9
src/Hotline.Application.Tests/DefaultHttpContextAccessor.cs → src/Hotline.Application.Tests/Controller/DefaultHttpContextAccessor.cs

@@ -1,4 +1,6 @@
-using Microsoft.AspNetCore.Http;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Identity.Accounts;
+using Microsoft.AspNetCore.Http;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -8,14 +10,15 @@ using System.Text;
 using System.Threading.Tasks;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
+using XF.Domain.Repository;
 
-namespace Hotline.Application.Tests;
+namespace Hotline.Application.Tests.Controller;
 public class DefaultHttpContextAccessor : ISessionContext, IScopeDependency
 {
     private HttpContext _content = new DefaultHttpContext();
 
     private HttpContext GetContext()
-    { 
+    {
         var context = new DefaultHttpContext();
         //var openId = new Claim(AppClaimTypes.OpenId, "测试生成的OpenId");
         var id = new ClaimsIdentity("身份");
@@ -27,28 +30,29 @@ public class DefaultHttpContextAccessor : ISessionContext, IScopeDependency
     }
     public HttpContext? HttpContext { get => GetContext(); set => _content = value; }
 
-  
 
-    public string? OpenId { get; set; }
+    public string? OpenId { get { return TestSessionConstants.OpenId; } set { } }
 
     /// <summary>
     /// Id of current tenant or null for host
     /// </summary>
-    public string? UserId { get; init; }
+    public string? UserId { get {
+            return TestSessionConstants.UserId;
+        } init { } }
 
     /// <summary>
     /// Id of current user or throw Exception for guest
     /// </summary>
     /// <exception cref="AuthenticationException"></exception>
     public string RequiredUserId { get; }
-    public string? UserName { get; init; }
+    public string? UserName { get { return TestSessionConstants.UserName; } init { } }
     public string? Phone { get; init; }
 
     /// <summary>
     /// Roles
     /// </summary>
-    public string[] Roles { get; init; }
-    public string? OrgId { get; init; }
+    public string[] Roles { get { return TestSessionConstants.Roles; } init { } }
+    public string? OrgId { get { return TestSessionConstants.OrgId;  } init { } }
     public string RequiredOrgId { get; }
     public string? OrgName { get; init; }
     public int OrgLevel { get; init; }

+ 38 - 15
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -1,10 +1,20 @@
 using AutoFixture;
 using Hotline.Api.Controllers;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Orders;
+using Hotline.Settings.Hotspots;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Tools;
+using Hotline.Users;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Testing;
+using Microsoft.Extensions.DependencyInjection;
 using Moq;
 using Shouldly;
 using System;
@@ -12,32 +22,25 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using XF.Domain.Authentications;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.Tests.Controller;
-public class OrderControllerTest : IClassFixture<WebApplicationFactory<Startup>>
+public class OrderControllerTest : TestBase
 {
     private readonly OrderController _orderController;
-    private readonly IFixture _fixture;
-    private readonly WebApplicationFactory<Startup> _factory;
+    private readonly IRepository<Hotspot> _hotspotRepository;
+    private readonly IOrderRepository _orderRepository;
 
-    public OrderControllerTest(OrderController orderController, WebApplicationFactory<Startup> factory)
-    //public OrderControllerTest(HttpClient testClient)
+    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository)
     {
-        _fixture = new Fixture();
+        _hotspotRepository = hotspotRepository;
         _orderController = orderController;
-        //_testClient = testClient;
-        _factory = factory;
         _orderController.ControllerContext = new ControllerContext
         {
             HttpContext = new DefaultHttpContext()
         };
-    }
-
-    [Fact]
-    public async Task SendSMS_Test()
-    {
-        var inDto = _fixture.Create<VisitSmsInDto>();
-        await _orderController.VisitPushSMSAsync(inDto);
+        _orderRepository = orderRepository;
     }
 
     [Fact]
@@ -48,4 +51,24 @@ public class OrderControllerTest : IClassFixture<WebApplicationFactory<Startup>>
         result.TimeText.ShouldBe("1个工作日");
         result.TimeType.ShouldBe(ETimeType.WorkDay);
     }
+
+    [Fact]
+    public async Task CreateOrder_Test()
+    {
+        await SetPaiDanYuan();
+        var orderDto = _fixture.Create<AddOrderDto>();
+        var hotspot = await _hotspotRepository.Queryable()
+            .OrderByDescending(m => m.CreationTime)
+            .FirstAsync();
+        orderDto.HotspotId = hotspot.Id;
+        orderDto.HotspotName = hotspot.HotSpotName;
+        orderDto.HotspotSpliceName = hotspot.HotSpotFullName;
+        orderDto.Files = new List<FileDto>();
+
+        var orderResult = await _orderController.Add(orderDto);
+        var orderId = orderResult.ToJson().FromJson<OrderDto>().Id;
+        var order = await _orderRepository.GetAsync(orderId);
+        order.ShouldNotBeNull();
+        order.CreatorId.ShouldBe(TestSessionConstants.UserId);
+    }
 }

+ 4 - 0
src/Hotline.Application.Tests/Hotline.Application.Tests.csproj

@@ -47,4 +47,8 @@
     <Using Include="Xunit" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Authentications\" />
+  </ItemGroup>
+
 </Project>

+ 24 - 0
src/Hotline.Application.Tests/Infrastructure/TestSettingConstants.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Tests.Infrastructure;
+public static class TestSettingConstants
+{
+    public const string PaiDanYuanAccountName = "UnitTestPDY";
+}
+
+public static class TestSessionConstants
+{
+    public static string UserId = "";
+
+    public static string OpenId = "";
+
+    public static string[] Roles = [];
+
+    public static string UserName = "";
+
+    public static string OrgId = "";
+}

+ 8 - 17
src/Hotline.Application.Tests/Startup.cs

@@ -1,15 +1,9 @@
 using Microsoft.AspNetCore.Hosting;
 using Tr.Sdk;
 using Hotline.Repository.SqlSugar.Extensions;
-using Microsoft.AspNetCore.TestHost;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using Hotline.Api;
 using Microsoft.AspNetCore.Identity;
 using XF.Domain.Dependency;
@@ -19,36 +13,31 @@ using XF.Domain.Repository;
 using Hotline.Repository.SqlSugar;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Configurations;
-using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Builder;
 using Xunit.DependencyInjection.AspNetCoreTesting;
-using Polly;
-using Hotline.Share.Tools;
-using Hotline.Users;
-using Hotline.Identity;
 using XF.Domain.Cache;
 using XF.EasyCaching;
 using Mapster;
 using Hotline.EventBus;
 using XF.Utility.MQ;
-using Microsoft.Extensions.DependencyInjection.Extensions;
 using DotNetCore.CAP;
 using XF.Domain.Options;
 using Hotline.Settings.TimeLimitDomain;
 using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
-using Microsoft.AspNetCore.WebSockets;
 using Hotline.CallCenter.Configs;
 using MediatR;
 using Hotline.Application.Tests.Mock;
 using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Application.CallCenter;
 using Hotline.Application.CallCenter.Calls;
-using Hotline.CallCenter.Configs;
-using Tr.Sdk;
 using Hotline.Application.StatisticalReport.CallReport;
 using XF.Domain.Authentications;
 using Hotline.Api.Controllers;
 using Hotline.Application.ExportExcel;
+using Hotline.Identity.Accounts;
+using Hotline.Application.Tests.Controller;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Authentications;
 
 namespace Hotline.Application.Tests;
 public class Startup
@@ -154,11 +143,13 @@ public class Startup
             services.AddScoped<ZiGongCallReportApplication>();
             services.AddScoped<YiBinCallReportApplication>();
             services.AddScoped<IMediator, MediatorMock>();
-            services.AddScoped<ISessionContext, DefaultHttpContextAccessor>();
             services.AddScoped<IExportApplication, ExportApplication>();
             services.AddScoped<OrderController>();
+            services.AddScoped<UserController>();
             services.AddScoped<PushMessageController>();
-
+            services.AddScoped<ISessionContext, DefaultHttpContextAccessor>();
+            services.AddScoped<ISessionContextProvider, SessionContextProvider>();
+            services.AddScoped<ICallApplication, XingTangCallApplication>();
             //ServiceLocator.Instance = services.BuildServiceProvider();
         }
 

+ 84 - 0
src/Hotline.Application.Tests/TestBase.cs

@@ -0,0 +1,84 @@
+using AutoFixture;
+using Hotline.Api.Controllers;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Share.Dtos.Users;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.User;
+using Hotline.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests;
+public class TestBase
+{
+    public readonly IAccountRepository _accountRepository;
+    public readonly IRepository<User> _userRepository;
+    public readonly IRepository<Role> _roleRepository;
+    public readonly UserController _userController;
+    public readonly IFixture _fixture;
+    private readonly IServiceScopeFactory _scopeFactory;
+
+    public TestBase(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository)
+    {
+        _fixture = new Fixture();
+        _accountRepository = accountRepository;
+        _roleRepository = roleRepository;
+        _userController = userController;
+        _userController.ControllerContext = new ControllerContext
+        {
+            HttpContext = new DefaultHttpContext()
+        };
+        _scopeFactory = scopeFactory;
+        _userRepository = userRepository;
+    }
+
+    public async Task SetPaiDanYuan()
+    {
+        await SetOperator("派单员", "市民热线服务中心", "单元测试派单员", "001", "13408389849", EUserType.Normal, TestSettingConstants.PaiDanYuanAccountName);
+    }
+
+    public async Task SetZuoXi()
+    {
+        await SetOperator("坐席", "市民热线服务中心", "单元测试派单员", "001", "13408389849", EUserType.Seat, TestSettingConstants.PaiDanYuanAccountName);
+    }
+
+    private async Task SetOperator(string displayName, string fullOrgName, string name, string orgId, string phoneNo, EUserType userType, string userName)
+    {
+        var account = await _accountRepository.GetExtAsync(
+            d => d.UserName == userName,
+            d => d.Includes(x => x.Roles));
+
+        if (account == null)
+        {
+            var roleId = await _roleRepository.Queryable()
+                .Where(m => m.DisplayName == displayName)
+                .Select(m => m.Id)
+                .FirstAsync();
+            var newUser = new AddUserDto
+            {
+                FullOrgName = fullOrgName,
+                Gender = EGender.Male,
+                Name = name,
+                OrgId = orgId,
+                PhoneNo = phoneNo,
+                RoleIds = [roleId],
+                UserType = userType,
+                UserName = userName 
+            };
+            var accountId = await _userController.Add(newUser);
+            TestSessionConstants.UserId = accountId;
+            account = await _accountRepository.GetExtAsync(
+                d => d.UserName == userName,
+                d => d.Includes(x => x.Roles));
+        }
+        var user = await _userRepository.GetAsync(account.Id);
+        TestSessionConstants.UserId = account.Id;
+        TestSessionConstants.Roles = account.Roles.Select(m => m.Id).ToArray();
+        TestSessionConstants.UserName = account.UserName;
+        TestSessionConstants.OrgId = user.OrgId;
+    }
+}

+ 1 - 1
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -398,4 +398,4 @@ public abstract class DefaultCallApplication : ICallApplication
     public abstract List<Kv> GetTelOperationOptions();
 
     #endregion
-}
+}

+ 8 - 2
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -323,8 +323,14 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                                         orderDelay.DelayApplyType = EDelayApplyType.ProvinceApply;
                                         orderDelay.IsProDelay = true;
                                         await _orderDelayRepository.UpdateAsync(orderDelay);
-                                        //推送
-                                        var publishOrderDelay = _mapper.Map<PublishOrderDelayDto>(orderDelay);
+										//省件延期--以省审批前一个节点整理的延期意见为准推送省上 宜宾
+										if (_appOptions.Value.IsYiBin)
+                                        {
+	                                        orderDelay.DelayReason = notification.Dto.Opinion;
+                                        }
+
+										//推送
+										var publishOrderDelay = _mapper.Map<PublishOrderDelayDto>(orderDelay);
                                         await _capPublisher.PublishAsync(EventNames.HotlineOrderApplyDelay, publishOrderDelay,
                                             cancellationToken: cancellationToken);
 

+ 10 - 7
src/Hotline.Application/Orders/OrderApplication.cs

@@ -322,9 +322,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         //DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime? dateTime = DateTime.Now;
         var IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
-
+        int orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
+        var orgCode = _sessionContextProvider.SessionContext.OrgId;
         return _orderRepository.Queryable(canView: !IsCenter).Includes(d => d.OrderDelays)
-            .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+
+            .WhereIF(orgLevel==3,d => SqlFunc.Subqueryable<WorkflowStep>()
                 .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
                                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
                                  step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
@@ -333,14 +335,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
                                  _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId))))
                 .Any())
+            .WhereIF(orgLevel==2 || orgLevel == 1,d=> d.ActualHandleOrgCode.StartsWith(orgCode))
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
             .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 == 2, d => d.OrderDelays.Any() == false)
-            //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
-            //.Where(d => d.ExpiredTime != null &&
-            //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
             .Where(d => d.Status < EOrderStatus.Filed && dateTime > d.NearlyExpiredTime && dateTime < d.ExpiredTime)
             .OrderBy(d => d.NearlyExpiredTime);
     }
@@ -383,9 +383,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         // DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime stTime = _expireTime.WorkDay(DateTime.Now).GetAwaiter().GetResult();
         var IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
-
+        int orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
+        var orgCode = _sessionContextProvider.SessionContext.OrgId;
         return _orderRepository.Queryable(canView: false).Includes(d => d.OrderDelays)
-            .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
+            .WhereIF(orgLevel == 3,d => SqlFunc.Subqueryable<WorkflowStep>()
                 .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
                                ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
                                  step.HandlerId == _sessionContextProvider.SessionContext.RequiredUserId) ||
@@ -394,12 +395,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
                                  _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId))))
                 .Any())
+            .WhereIF(orgLevel == 2 || orgLevel == 1, d => d.ActualHandleOrgCode.StartsWith(orgCode))
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             //.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
             .WhereIF(dto.Delay.HasValue && dto.Delay == 1, d => d.OrderDelays.Any() == true)
             .WhereIF(dto.Delay.HasValue && dto.Delay == 2, d => d.OrderDelays.Any() == false)
+            .Where(d=> d.Status < EOrderStatus.Filed)
             .Where(d => d.ExpiredTime != null &&
                         (((d.Status == EOrderStatus.Filed || d.Status == EOrderStatus.Published || d.Status == EOrderStatus.Visited) &&
                           d.FiledTime >= d.ExpiredTime) ||

+ 11 - 0
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenNextWorkflowHandler.cs

@@ -1,4 +1,5 @@
 using DotNetCore.CAP;
+using Hotline.Configurations;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Orders;
@@ -7,6 +8,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Mq;
 using MapsterMapper;
 using MediatR;
+using Microsoft.Extensions.Options;
 using XF.Domain.Authentications;
 using XF.Domain.Repository;
 
@@ -18,12 +20,14 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 	private readonly IOrderScreenRepository _orderScreenRepository;
 	private readonly ISessionContext _sessionContext;
 	private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
+	private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
 	public OrderScreenNextWorkflowHandler(
 		ICapPublisher capPublisher,
 		IMapper mapper,
 		IOrderScreenRepository orderScreenRepository,
 		ISessionContext sessionContext,
+		IOptionsSnapshot<AppConfiguration> appOptions,
 		IRepository<OrderScreenDetail> orderScreenDetailRepository)
 	{
 		_capPublisher = capPublisher;
@@ -31,6 +35,7 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 		_orderScreenRepository = orderScreenRepository;
 		_sessionContext = sessionContext;
 		_orderScreenDetailRepository = orderScreenDetailRepository;
+		_appOptions = appOptions;
 	}
 
 	/// <summary>Handles a notification</summary>
@@ -67,6 +72,12 @@ public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotif
 							if (screen.Order != null && screen.Order.Source == ESource.ProvinceStraight)
 							{
 								var screenOrderDto = _mapper.Map<OrderDto>(screen.Order);
+								//省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
+								if (_appOptions.Value.IsYiBin)
+								{
+									screenDto.Content = notification.Dto.Opinion;
+									screenDto.Files = new List<Share.Dtos.File.FileDto>();
+								}
 								//推省上
 								_capPublisher.Publish(EventNames.HotlineOrderScreenApply, new PublishScreenDto()
 								{

+ 1 - 1
src/Hotline.Application/StatisticalReport/CallReport/CallReportApplicationBase.cs

@@ -161,7 +161,7 @@ public abstract class CallReportApplicationBase : ICallReportApplication
         int connectByeTimes = _systemSettingCacheManager.ConnectByeTimes;
 
         var callData = await _callNativeRepository.Queryable()
-                .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime && p.GroupId == "1")
+                .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime && p.GroupId != "0")
                 .GroupBy(p => p.CreationTime.ToString("yyyy-MM-dd"))
                 .Select(p => new QueryCallsDetailStatistics
                 {

+ 13 - 4
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -557,7 +557,7 @@ namespace Hotline.Application.Subscribers
                 .Includes(x => x.Order)
                 .Includes(x => x.OrderVisitDetails)
                 .Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo &&
-                            x.VisitState != Share.Enums.Order.EVisitState.None).FirstAsync(cancellationToken);
+                            x.VisitState == Share.Enums.Order.EVisitState.WaitForVisit).FirstAsync(cancellationToken);
 
             if (orderVisit != null)
             {
@@ -811,8 +811,17 @@ namespace Hotline.Application.Subscribers
                     break;
                 case "1":
                     //办结:归档
-                    await _workflowApplication.HandleToEndAsync(order.WorkflowId, dto.Opinion, dto.Files,
-                        cancellationToken: cancellationToken);
+                    if (order.Status >= EOrderStatus.Filed)
+                    {
+                        order.ActualOpinion += dto.Opinion;
+                        await _orderRepository.Updateable().UpdateColumns(d => d.ActualOpinion).ExecuteCommandAsync(cancellationToken);
+                        await _workflowDomainService.AppendFileOpinionAsync(order.WorkflowId, dto.Opinion, dto.Files, cancellationToken);
+                    }
+                    else
+                    {
+                        await _workflowApplication.HandleToEndAsync(order.WorkflowId, dto.Opinion, dto.Files, cancellationToken: cancellationToken);
+                    }
+
                     break;
             }
 
@@ -1151,7 +1160,7 @@ namespace Hotline.Application.Subscribers
                         .ToListAsync(cancellationToken);
                     if (!query.Any()) return;
                     var orderCalls = query
-                        .Where(d=>!string.IsNullOrEmpty(d.Call.Id))
+                        .Where(d => !string.IsNullOrEmpty(d.Call.Id))
                         .Select(d => new PublishCallRecrodDto
                         {
                             Order = _mapper.Map<OrderDto>(d.Order),

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderWaitedDto.cs

@@ -59,7 +59,7 @@ namespace Hotline.Share.Dtos.Order
 
         /// <summary>
         /// 1: 交办件
-        /// 2: 办件
+        /// 2: 办
         /// </summary>
         public int? TypeCode { get; set; }
 

+ 1 - 0
src/Hotline/CallCenter/Calls/CallNative.cs

@@ -72,6 +72,7 @@ namespace Hotline.CallCenter.Calls
 
         /// <summary>
         /// 结束等待时间
+        /// 兴唐没值
         /// </summary>
         [SugarColumn(ColumnDescription = "结束等待时间")]
         public DateTime? EndQueueTime { get; set; }

+ 6 - 0
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -2,6 +2,7 @@
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Settings;
@@ -296,5 +297,10 @@ namespace Hotline.FlowEngine.Workflows
         /// 根据汇总对象id找到被汇总节点,生成指派到用户的办理对象
         /// </summary>
         FlowStepHandler GetSummaryTargetFlowStepHandler(Workflow workflow, string summaryTargetStepCode);
+
+        /// <summary>
+        /// 追加归档信息(接收ds推送12315归档信息)
+        /// </summary>
+        Task AppendFileOpinionAsync(string workflowId, string opinion, List<FileDto> files, CancellationToken cancellationToken);
     }
 }