Эх сурвалжийг харах

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

xf 5 сар өмнө
parent
commit
6875aa472f

+ 25 - 5
src/Hotline.Api/Controllers/OrderController.cs

@@ -382,15 +382,24 @@ public class OrderController : BaseController
     public async Task PublishOrder([FromBody] PublishOrderDto dto)
     {
         //验证订单
-        var order = await _orderRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
-
-
-        if (order is null)
-            throw UserFriendlyException.SameMessage("未找到工单,无法发布");
+        var order = await _orderRepository.GetAsync(dto.Id, HttpContext.RequestAborted)
+            ?? throw UserFriendlyException.SameMessage("未找到工单,无法发布");
 
         if (order.Status != EOrderStatus.Filed)
             throw UserFriendlyException.SameMessage("当前状态无法发布");
 
+        var enabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
+        if (enabled)
+        {
+            // 获取上一次被取消发布的发布信息
+            var publishedDeleted = await _orderPublishRepository.Queryable().Where(m => m.OrderId == dto.Id && m.IsDeleted == true)
+                .OrderByDescending(m => m.CreationTime).FirstAsync(HttpContext.RequestAborted);
+            if (publishedDeleted != null && _sessionContext.RequiredUserId != publishedDeleted.CreatorId)
+            {
+                throw UserFriendlyException.SameMessage($"改工单被取消发布过, 之前的发布人是 [{publishedDeleted.CreatorName}], 您不能发布;");
+            }
+        }
+
         //新增发布工单
         var orderPublish = _mapper.Map<OrderPublish>(dto);
         orderPublish.OrderId = order.Id;
@@ -767,14 +776,25 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPut("publish/cancel")]
+    [LogFilter("取消发布")]
     public async Task<string> PublishCancelAsync([FromBody]PublishCancelInDto dto)
     {
         var enabled = _systemSettingCacheManager.CancelPublishOrderEnabled;
         if (enabled == false) return "取消发布功能已被关闭";
+
         var publish = await _orderPublishRepository.GetAsync(dto.OrderPublishId)
             ?? throw UserFriendlyException.SameMessage("发布单不存在");
         publish.IsDeleted = true;
+        var order = await _orderRepository.GetAsync(publish.OrderId, HttpContext.RequestAborted) ??
+            throw UserFriendlyException.SameMessage("工单不存在");
+        if (order.Status != EOrderStatus.Published && order.Status != EOrderStatus.Visited)
+            throw UserFriendlyException.SameMessage("工单状态非[已发布]和[已回访], 不可取消发布.");
+
         await _orderPublishRepository.UpdateAsync(publish);
+        order.Status = EOrderStatus.Filed;
+        // 被取消的工单继续由之前发布的用户继续发布;
+        order.WaitForPublisherId = publish.CreatorId;
+        await _orderRepository.UpdateAsync(order);
         return "取消成功";
     }
     #endregion

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

@@ -828,6 +828,7 @@ namespace Hotline.Api.Controllers
                     var orderPublish = await _orderPublishRepository.GetAsync(p => p.OrderId == data.Id, HttpContext.RequestAborted);
                     if (orderPublish != null)
                     {
+                        orderDetail.PubFlag = "1";
                         orderDetail.FlowTitle = orderPublish.ArrangeTitle;
                         orderDetail.FlowContent = orderPublish.ArrangeContent;
                         orderDetail.FlowResult = orderPublish.ArrangeOpinion;

+ 34 - 3
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -15,6 +15,7 @@ using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Order.Publish;
 using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
@@ -34,6 +35,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using XF.Domain.Authentications;
+using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 
 namespace Hotline.Application.Tests.Controller;
@@ -205,8 +207,37 @@ public class OrderControllerTest : TestBase
         await _orderController.PublishCancelAsync(new PublishCancelInDto { OrderPublishId = publish.Id });
         var visit = await _orderVisitRepository.GetAsync(m => m.OrderId == order.Id);
         var publishCount = await _orderPublishRepository.Queryable().Where(m => m.OrderId == order.Id && m.IsDeleted == false).CountAsync();
-        publishCount.ShouldBe(0);
-        visit.ShouldNotBeNull();
-        visit.VisitState.ShouldBe(EVisitState.Visited);
+        publishCount.ShouldBe(0, "发布工单数据已经被删除, 应该是0条");
+        visit.ShouldNotBeNull("回访信息不存在");
+        visit.VisitState.ShouldBe(EVisitState.Visited, "回访状态应该是已回访");
+
+        orderEntity = await _orderRepository.GetAsync(order.Id);
+        orderEntity.Status.ShouldBe(EOrderStatus.Filed);
+        var publishList = await _orderController.PublishOrderList(new QueryOrderPublishDto 
+        {
+            PageSize = 1000,
+            QuerySelf = true
+        });
+
+        publishList.Items.Any(m => m.Id == order.Id).ShouldBeTrue("工单发布列表中没有取消的工单");
+        SetZuoXi();
+        // 验证是否能非上次发布人员发布
+        try
+        {
+            await _orderController.PublishOrder(new PublishOrderDto { Id = order.Id });
+        }
+        catch (UserFriendlyException e)
+        {
+            e.Message.Contains("您不能发布").ShouldBeTrue();
+        }
+
+        // 验证被取消前的发布人能否继续发布
+        SetPaiDanYuan();
+        var inDto = _fixture.Create<PublishOrderDto>();
+        inDto.Id = order.Id;
+        await _orderController.PublishOrder(inDto);
+        var published = await _orderPublishRepository.Queryable().Where(m => m.OrderId == order.Id && m.IsDeleted == false).FirstAsync();
+        published.ShouldNotBeNull();
+        published.IsDeleted.ShouldBeFalse();
     }
 }

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

@@ -7,6 +7,7 @@ using System.Threading.Tasks;
 namespace Hotline.Application.Tests.Infrastructure;
 public static class TestSettingConstants
 {
+    public const string ZuoXiAccountName = "UnitTestZuoXi";
     public const string PaiDanYuanAccountName = "UnitTestPDY";
     public const string FirstOrgAccountName = "cs";
     public const string SecondOrgAccountName = "cs21";

+ 1 - 1
src/Hotline.Application.Tests/TestBase.cs

@@ -58,7 +58,7 @@ public class TestBase
 
     public void SetZuoXi()
     {
-        SetOperator("坐席", "市民热线服务中心", "单元测试派单员", "001", "13408389849", EUserType.Seat, TestSettingConstants.PaiDanYuanAccountName);
+        SetOperator("坐席", "市民热线服务中心", "单元测试坐席", "001", "13408389849", EUserType.Seat, TestSettingConstants.ZuoXiAccountName);
     }
 
     private void SetOperator(string displayName, string fullOrgName, string name, string orgId, string phoneNo, EUserType userType, string userName)

+ 29 - 29
src/Hotline.Application/Orders/OrderApplication.cs

@@ -2561,37 +2561,37 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var screen = await _orderScreenRepository.Queryable().Where(x => x.OrderId == dto.OrderId && (int)x.Status < 2).ToListAsync(cancellationToken);
         //var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
         var sendBackAudit = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == dto.OrderId && x.State == ESendBackAuditState.Apply).ToListAsync(cancellationToken);
-        //if (_appOptions.Value.IsYiBin)
-        //{
-        //	if (screen.Any())
-        //	{
-        //		_orderScreenRepository.RemoveRangeAsync(screen, true, cancellationToken);
-        //	}
-
-        //	if (sendBackAudit.Any())
-        //	{
-        //		_orderSendBackAuditRepository.RemoveRangeAsync(sendBackAudit, true, cancellationToken);
-        //	}
-
-        //	if (order.Workflow.IsInCountersign)
-        //	{
-        //		var workflowStep = await _workflowStepRepository.Queryable().Where(x => x.Id == order.Workflow.TopCountersignStepId).FirstAsync(cancellationToken);
-        //		if (workflowStep != null)
-        //		{
-        //			var dtoEnd = new EndCountersignDto() { CountersignId = workflowStep.StartCountersignId };
-        //			await EndCountersign(dtoEnd,cancellationToken);
-        //		}
-        //	}
-        //}
-        //else
-        //{
-        if (screen.Any()) throw UserFriendlyException.SameMessage("工单存在甄别中的信息!");
+        if (_appOptions.Value.IsYiBin)
+        {
+            if (screen.Any())
+            {
+                _orderScreenRepository.RemoveRangeAsync(screen, true, cancellationToken);
+            }
 
-        if (sendBackAudit.Any())
-            throw UserFriendlyException.SameMessage("该工单存在正在审核中的退回,不能办理");
+            if (sendBackAudit.Any())
+            {
+                _orderSendBackAuditRepository.RemoveRangeAsync(sendBackAudit, true, cancellationToken);
+            }
 
-        if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行特提!");
-        //}
+            if (order.Workflow.IsInCountersign)
+            {
+                var workflowStep = await _workflowStepRepository.Queryable().Where(x => x.Id == order.Workflow.TopCountersignStepId).FirstAsync(cancellationToken);
+                if (workflowStep != null)
+                {
+                    var dtoEnd = new EndCountersignDto() { CountersignId = workflowStep.StartCountersignId };
+                    await EndCountersign(dtoEnd, cancellationToken);
+                }
+            }
+        }
+        else
+        {
+            if (screen.Any()) throw UserFriendlyException.SameMessage("工单存在甄别中的信息!");
+
+            if (sendBackAudit.Any())
+                throw UserFriendlyException.SameMessage("该工单存在正在审核中的退回,不能办理");
+
+            if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行特提!");
+        }
     }
 
     public async Task EndCountersign(EndCountersignDto dto, CancellationToken cancellationToken)