浏览代码

Merge branch 'feature/task_4_knowledge_bath' into test

qinchaoyue 5 月之前
父节点
当前提交
05e027e028

+ 33 - 3
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -10,6 +10,7 @@ using Hotline.Application.Systems;
 using Hotline.Application.Tools;
 using Hotline.File;
 using Hotline.FlowEngine.WorkflowModules;
+using Hotline.FlowEngine.Workflows;
 using Hotline.KnowledgeBase;
 using Hotline.KnowledgeBase.Notifies;
 using Hotline.Permissions;
@@ -36,6 +37,7 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore.Metadata.Internal;
 using Org.BouncyCastle.Utilities.IO;
 using SqlSugar;
+using System.Text;
 using System.Threading;
 using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
@@ -323,15 +325,42 @@ namespace Hotline.Api.Controllers
 
         }
 
-
         /// <summary>
         /// 批量审核
         /// </summary>
         /// <returns></returns>
         [HttpPost("batch_audit")]
-        public async Task KnowledgeBatchAuditAsync()
+        public async Task<string> KnowledgeBatchAuditAsync([FromBody] KnowledgeBatchAuditInDto dto)
         {
-            // TODO: qcy 批量审核 
+            var result = new StringBuilder();
+            var fail = 0;
+            var success = 0;
+            foreach (var knowledgeId in dto.KnowledgeIds)
+            {
+                try
+                {
+                    var knowledge = await _knowledgeDomainService.KnowledgeInfo(knowledgeId, HttpContext.RequestAborted);
+                    dto.NextWorkflowDto.WorkflowId = knowledge.WorkflowId;
+                    var next = await _workflowApplication.GetNextStepsAsync(knowledge.WorkflowId, HttpContext.RequestAborted);
+                    dto.NextWorkflowDto.StepId = next.StepId;
+                    dto.NextWorkflowDto.NextStepCode = next.Steps.First().Key;
+                    dto.NextWorkflowDto.NextStepName = next.Steps.First().Value;
+                    if (dto.IsPass)
+                        await _workflowApplication.NextAsync(dto.NextWorkflowDto, cancellationToken: HttpContext.RequestAborted);
+                    else
+                    {
+                        var reject = dto.NextWorkflowDto.Adapt<RejectDto>();
+                        await _workflowApplication.RejectAsync(reject, HttpContext.RequestAborted);
+                    }
+                }
+                catch (UserFriendlyException e)
+                {
+                    result.Append(e.Message);
+                    fail++;
+                }
+                success++;
+            }
+            return $"总共: {dto.KnowledgeIds.Length}, 成功: {success}, 失败: {fail}, 失败原因: {result.ToString()}";
         }
 
         /// <summary>
@@ -679,6 +708,7 @@ namespace Hotline.Api.Controllers
                 .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize);
             return new PagedDto<KnowledgeWorkFlowDto>(total, _mapper.Map<IReadOnlyList<KnowledgeWorkFlowDto>>(temp));
         }
+
         /// <summary>
         /// 知识查重
         /// </summary>

+ 69 - 0
src/Hotline.Application.Tests/Controller/KnowledgeControllerTest.cs

@@ -0,0 +1,69 @@
+using Hotline.Api.Controllers;
+using Hotline.Api.Controllers.Bi;
+using Hotline.Application.Tests.Mock;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.KnowledgeBase;
+using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.KnowledgeBase;
+using Hotline.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using Shouldly;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests.Controller;
+public class KnowledgeControllerTest : TestBase
+{
+    private readonly KnowledgeServiceMock _knowledgeServiceMock;
+    private readonly KnowledgeController _knowledgeController;
+    private readonly IRepository<KnowledgeBase.Knowledge> _knowledgeRepository;
+
+    public KnowledgeControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, KnowledgeServiceMock knowledgeServiceMock, KnowledgeController knowledgeController, IRepository<KnowledgeBase.Knowledge> knowledgeRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository)
+    {
+        _knowledgeServiceMock = knowledgeServiceMock;
+        _knowledgeController = knowledgeController;
+        _knowledgeController.ControllerContext = new ControllerContext
+        {
+            HttpContext = new DefaultHttpContext()
+        };
+        _knowledgeRepository = knowledgeRepository;
+    }
+
+    [Fact]
+    public async Task KnowledgeBatchAudit_TestAsync()
+    {
+        SetPaiDanYuan();
+        var inDto = new KnowledgeBatchAuditInDto
+        {
+            IsPass = true,
+            KnowledgeIds = new string[3],
+            NextWorkflowDto = new NextWorkflowDto
+            {
+                ReviewResult = EReviewResult.Approval,
+                Opinion = "批量审核通过"
+            }
+        };
+        for (int i = 0;i < 3;i++)
+        {
+            inDto.KnowledgeIds[i] = _knowledgeServiceMock.创建并审核知识()
+                .GetKnowledgeId();
+
+        }
+        Set班长();
+        await _knowledgeController.KnowledgeBatchAuditAsync(inDto);
+        foreach (var id in inDto.KnowledgeIds)
+        {
+            var k = await _knowledgeRepository.GetAsync(id);
+            k.Status.ShouldBe(EKnowledgeStatus.OnShelf);
+        }
+    }
+}

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

@@ -10,6 +10,7 @@ public static class TestSettingConstants
     public const string PaiDanYuanAccountName = "UnitTestPDY";
     public const string FirstOrgAccountName = "cs";
     public const string SecondOrgAccountName = "cs21";
+    public const string BanZhangAccountName = "UnitTestBZ";
 }
 
 public static class TestSessionConstants
@@ -23,4 +24,5 @@ public static class TestSessionConstants
     public static string UserName = "";
 
     public static string OrgId = "";
+
 }

+ 53 - 0
src/Hotline.Application.Tests/Mock/KnowledgeServiceMock.cs

@@ -0,0 +1,53 @@
+using Hotline.Api.Controllers;
+using Hotline.Application.FlowEngine;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.FlowEngine.WorkflowModules;
+using Hotline.Identity.Accounts;
+using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Tools;
+using Hotline.Users;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests.Mock;
+public class KnowledgeServiceMock
+{
+    private readonly KnowledgeController _knowledgeController;
+    private string KnowledgeId;
+    private readonly IWorkflowApplication _workflowApplication;
+    private readonly IRepository<Account> _accountRepository;
+
+    public KnowledgeServiceMock(KnowledgeController knowledgeController, IWorkflowApplication workflowApplication, IRepository<Account> accountRepository)
+    {
+        _knowledgeController = knowledgeController;
+        _workflowApplication = workflowApplication;
+        _accountRepository = accountRepository;
+    }
+
+    public KnowledgeServiceMock 创建并审核知识()
+    {
+        var json = "{\"data\":{\"attribution\":\"中心知识库\",\"isPublic\":true,\"keywords\":[\"08dcfe29-01a5-4b6e-8b47-640d75aa8b23\",\"08dcfe29-01a7-4488-8412-65907c33576d\",\"08dcfe29-01a8-4217-84ae-45eda2481c9b\"],\"keywordsName\":\"张继科扥,金卡,希望\",\"knowledgeTypeId\":[\"08dc903c-aad8-4515-89f3-1ae2d6961b90\"],\"hotspotId\":\"\",\"knowledges\":[],\"files\":[],\"template\":\"\",\"content\":\"<p style=\\\"line-height: 2;\\\"><span style=\\\"font-size: 20px; font-family: 仿宋;\\\">你张继科扥金卡希望智啊</span></p>\",\"sourceOrganizeId\":\"\",\"title\":\"你张继科扥金卡希望智啊\",\"knowledgeType\":[{\"KnowledgeTypeName\":\"类型11\",\"KnowledgeTypeId\":\"08dc903c-aad8-4515-89f3-1ae2d6961b90\",\"KnowledgeTypeSpliceName\":\"类型11\"}]},\"workflow\":{\"isPass\":true,\"opinion\":\"123\",\"nextStepCode\":\"da354c75-d8f7-4c8c-af6f-1e69fb09c343\",\"nextStepName\":\"流程节点\",\"backToCountersignEnd\":false,\"nextHandlers\":[{\"userId\":\"08dc3c21-8e9b-4387-8306-6cc32d127397\",\"username\":\"班长2\",\"orgId\":\"001\",\"orgName\":\"市民热线服务中心\",\"roleId\":\"zhongxinlingdao\",\"roleName\":\"中心领导\",\"key\":\"08dc3c21-8e9b-4387-8306-6cc32d127397\",\"value\":\"班长2\"}],\"nextMainHandler\":\"08dc3c21-8e9b-4387-8306-6cc32d127397\",\"isSms\":false,\"isStartCountersign\":false,\"stepId\":null,\"nextHandler\":{},\"workflowId\":\"\",\"handlerType\":0,\"businessType\":0,\"flowDirection\":2,\"external\":{},\"files\":[]}}";
+        var inDto = json.FromJson<AddStartFlowDto>();
+        var nextStep = _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.KnowledgeAdd, CancellationToken.None).GetAwaiter().GetResult();
+        inDto.Data.Title = "单元测试" + DateTime.Now.ToString("yyyyMMddhhmmss");
+        inDto.Workflow.FlowDirection = EFlowDirection.CenterToCenter;
+        inDto.Workflow.NextStepCode = nextStep.Steps.First().Key;
+        inDto.Workflow.NextStepName = nextStep.Steps.First().Value;
+        var account = _accountRepository.GetAsync(m => m.UserName == TestSettingConstants.BanZhangAccountName).GetAwaiter().GetResult();
+        var handler = nextStep.Steps.First().Items.Where(m => m.Username == account.Name).First();
+        inDto.Workflow.NextHandlers.Add(handler);
+        KnowledgeId = _knowledgeController.AddKnowledge(inDto).GetAwaiter().GetResult();
+        return this;
+    }
+
+    public string GetKnowledgeId()
+    {
+        return KnowledgeId;
+    }
+}

+ 2 - 0
src/Hotline.Application.Tests/Startup.cs

@@ -149,11 +149,13 @@ public class Startup
             services.AddScoped<IExportApplication, ExportApplication>();
             services.AddScoped<OrderController>();
             services.AddScoped<UserController>();
+            services.AddScoped<KnowledgeController>();
             services.AddScoped<PushMessageController>();
             services.AddScoped<ISessionContext, DefaultHttpContextAccessor>();
             services.AddScoped<ISessionContextProvider, SessionContextProvider>();
             services.AddScoped<ICallApplication, XingTangCallApplication>();
             services.AddScoped<OrderServiceMock>();
+            services.AddScoped<KnowledgeServiceMock>();
             //ServiceLocator.Instance = services.BuildServiceProvider();
         }
 

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

@@ -51,6 +51,10 @@ public class TestBase
         SetOperator("部门经办人", "测试部门/测试二级部门", "cs21", "001094001", "13408389849", EUserType.Seat, TestSettingConstants.SecondOrgAccountName);
     }
 
+    public void Set班长()
+    {
+        SetOperator("中心班长", "市民热线服务中心", "单元测试班长", "001", "13408389849", EUserType.Normal, TestSettingConstants.BanZhangAccountName);
+    }
 
     public void SetZuoXi()
     {

+ 18 - 0
src/Hotline.Share/Dtos/Knowledge/KnowledgeDto.cs

@@ -525,4 +525,22 @@ namespace Hotline.Share.Dtos.Knowledge
         /// </summary>
         public string TypeTxt => Type?.GetDescription();
     }
+
+    public class KnowledgeBatchAuditInDto
+    {
+        /// <summary>
+        /// 流程信息
+        /// </summary>
+        public NextWorkflowDto NextWorkflowDto { get; set; }
+
+        /// <summary>
+        /// 知识Id集合
+        /// </summary>
+        public string[] KnowledgeIds { get; set; }
+
+        /// <summary>
+        /// 是否通过
+        /// </summary>
+        public bool IsPass { get; set; }
+    }
 }