Explorar o código

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

libin hai 4 meses
pai
achega
59fe460c77

+ 9 - 4
Hotline.sln

@@ -59,9 +59,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Logger", "src\Hotli
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.WeChat", "src\Hotline.WeChat\Hotline.WeChat.csproj", "{75215667-65AF-4B7B-85E7-3140239B30CC}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TianQue.Sdk", "src\TianQue.Sdk\TianQue.Sdk.csproj", "{6CF27647-D0E0-4D17-80FB-3EE57864A2B4}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TianQue.Sdk", "src\TianQue.Sdk\TianQue.Sdk.csproj", "{6CF27647-D0E0-4D17-80FB-3EE57864A2B4}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hotline.Ai.XingTang", "src\Hotline.Ai.XingTang\Hotline.Ai.XingTang.csproj", "{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Ai.XingTang", "src\Hotline.Ai.XingTang\Hotline.Ai.XingTang.csproj", "{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Pdf", "src\Hotline.Pdf\Hotline.Pdf.csproj", "{3AB75B51-A69D-4145-A564-1D9D1695992E}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -165,6 +167,10 @@ Global
 		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3AB75B51-A69D-4145-A564-1D9D1695992E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3AB75B51-A69D-4145-A564-1D9D1695992E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3AB75B51-A69D-4145-A564-1D9D1695992E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3AB75B51-A69D-4145-A564-1D9D1695992E}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -195,8 +201,7 @@ Global
 		{9F99C272-5BC2-452C-9D97-BC756AF04669} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
 		{37784861-ABC0-41F4-87B4-2E08A89A2C42} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
 		{75215667-65AF-4B7B-85E7-3140239B30CC} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
-		{6CF27647-D0E0-4D17-80FB-3EE57864A2B4} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
-		{8E4F64EF-314A-45BA-8BB2-46FF5B06F7D5} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
+		{3AB75B51-A69D-4145-A564-1D9D1695992E} = {D041C554-B78E-4AAF-B597-E309DC8EEF4F}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {4B8EA790-BD13-4422-8D63-D6DBB77B823F}

+ 55 - 7
src/Hotline.Api/Controllers/Bi/BiQualityController.cs

@@ -9,6 +9,14 @@ using Hotline.Share.Dtos.Quality;
 using Hotline.Tools;
 using Hotline.Quality;
 using Hotline.Share.Enums.Quality;
+using Hotline.Caching.Services;
+using Hotline.Settings;
+using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
+using XF.Utility.EnumExtensions;
+using Hotline.Caching.Interfaces;
+using Hotline.Users;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -17,17 +25,22 @@ namespace Hotline.Api.Controllers.Bi
 		private readonly IMapper _mapper;
 		private readonly IQualityApplication _qualityApplication;
 		private readonly IQualityRepository _qualityRepository;
-
+		private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+		private readonly IRepository<User> _userRepository;
 
 		public BiQualityController(
 			IMapper mapper,
 			IQualityApplication qualityApplication,
-			IQualityRepository qualityRepository
+			IQualityRepository qualityRepository,
+			ISystemSettingCacheManager systemSettingCacheManager,
+			IRepository<User> userRepository
 			)
 		{
 			_mapper = mapper;
 			_qualityApplication = qualityApplication;
 			_qualityRepository = qualityRepository;
+			_systemSettingCacheManager = systemSettingCacheManager;
+			_userRepository = userRepository;
 		}
 
 
@@ -115,7 +128,7 @@ namespace Hotline.Api.Controllers.Bi
 			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
 
 			var dtos = listDtos
-				.Select(stu => _mapper.Map(stu, typeof(SeatsQualityAnalyseDto), dynamicClass))
+				.Select(stu => _mapper.Map(stu, typeof(QualityOrderOverviewDto), dynamicClass))
 				.Cast<object>()
 				.ToList();
 
@@ -133,8 +146,16 @@ namespace Hotline.Api.Controllers.Bi
 		[HttpGet("seats_quality_grade_analyse")]
 		public async Task<SeatsQualityGradeAnalyseDto> SeatsQualityGradeAnalyse([FromQuery] QualityWorkAnalysisRequest dto)
 		{
-			var items = await _qualityApplication.SeatsQualityGradeAnalyse(dto, HttpContext.RequestAborted).FirstAsync(HttpContext.RequestAborted);
-			return items;
+			var temps = await _qualityApplication.SeatsQualityGradeAnalyse(dto, HttpContext.RequestAborted).ToListAsync(HttpContext.RequestAborted);
+			var temp = new SeatsQualityGradeAnalyseDto()
+			{
+				NinetyGrade = temps.Sum(x => x.NinetyGrade),
+			    EightyGrade = temps.Sum(x => x.EightyGrade),
+				SeventyGrade = temps.Sum(x => x.SeventyGrade),
+				SixtyGrade = temps.Sum(x => x.SixtyGrade),
+				FiftyGrade = temps.Sum(x => x.FiftyGrade)
+			};
+			return temp;
 		}
 
 
@@ -144,11 +165,38 @@ namespace Hotline.Api.Controllers.Bi
 		/// <param name="dto"></param>
 		/// <returns></returns>
 		[HttpGet("month_quality_grade")]
-		public async Task<object> MonthQualityGrade([FromQuery] QualityWorkAnalysisRequest dto)
+		public async Task<List<MonthQualityGradeDto>> MonthQualityGrade([FromQuery] QualityWorkAnalysisRequest dto)
 		{
-			var items = await _qualityApplication.MonthQualityGrade(dto, HttpContext.RequestAborted).ToListAsync(HttpContext.RequestAborted);
+			var items = await _qualityApplication.MonthQualityGrade(dto, HttpContext.RequestAborted);
 			return items;
 		}
+
+
+		/// <summary>
+		/// 列表页面基础数据
+		/// </summary>
+		/// <returns></returns>
+		[HttpGet("quality_work/base")]
+		public async Task<object> QualityWorkBaseData()
+		{
+			var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RoleZuoXi);
+			var roles = setting?.SettingValue.ToList();
+			var users = await _userRepository.Queryable()
+				.Includes(d => d.Organization)
+				.Includes(d => d.Roles)
+				.Where(d => d.Roles.Any(x => roles.Contains(x.Name)))
+				.Select(x => new Kv {
+					Key = x.Id,
+					Value = x.Name
+				})
+				.ToListAsync(HttpContext.RequestAborted);
+
+			var rsp = new
+			{
+				Seats = users
+			};
+			return rsp;
+		}
 		#endregion
 	}
 }

+ 7 - 1
src/Hotline.Api/Controllers/ExportWordController.cs

@@ -11,7 +11,9 @@ using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using MongoDB.Driver.Linq;
+using Novacode.NETCorePort;
 using XF.Domain.Repository;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers
 {
@@ -158,10 +160,14 @@ namespace Hotline.Api.Controllers
 					exportTest.CityName = "泸州市";
 
                 //质检信息
-                exportTest.Grade = quality.Grade;
+                exportTest.Grade = quality.Grade.ToString();
                 exportTest.QualityContent = quality.Content;
 				exportTest.UserName = quality.UserName;
 				exportTest.QualityTime = quality.QualityTime.HasValue? quality.QualityTime.Value.ToString("yyyy-MM-dd HH:mm:ss") :string.Empty;
+				exportTest.CenterToOrgTime = order.CenterToOrgTime.HasValue ? order.CenterToOrgTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : string.Empty;
+                exportTest.CreationTime = order.CreationTime.ToString("yyyy-MM-dd HH:mm:ss");
+                exportTest.ExpiredTime = order.ExpiredTime.HasValue ? order.ExpiredTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : string.Empty;
+				exportTest.FromGender = order.FromGender.GetDescription();
 
 				//查询回访信息
 				var visitData = await _orderVisitRepository.GetAsync(p => p.OrderId == order.Id && p.VisitState == EVisitState.Visited, HttpContext.RequestAborted);

+ 46 - 2
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -45,6 +45,9 @@ using Hotline.Import;
 using Hotline.Caching.Services;
 using Hotline.Share.Enums.Order;
 using MiniExcelLibs;
+using DocumentFormat.OpenXml.Wordprocessing;
+using Hotline.Pdf;
+using Microsoft.AspNetCore.Authorization;
 
 namespace Hotline.Api.Controllers
 {
@@ -56,6 +59,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<KnowledgeHotWord> _knowledgeHotWordRepository;
         private readonly IRepository<KnowledgeApprove> _knowledgeApproRepository;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IPdfManager _pdfManager;
         private readonly IRepository<KnowledgeWord> _knowledgeWordRepository;
         private readonly IWordHelperService _wordHelperService;
         private readonly BaseDataApplication _baseDataApplication;
@@ -121,7 +125,8 @@ namespace Hotline.Api.Controllers
             IOptionsSnapshot<AppConfiguration> appOptions,
             IRepository<KnowledgeHotWord> knowledgeHotWordRepository,
             IRepository<KnowledgeApprove> knowledgeApproRepository,
-            ISystemSettingCacheManager _systemSettingCacheManager)
+            ISystemSettingCacheManager _systemSettingCacheManager,
+            IPdfManager pdfManager)
         {
             _knowledgeRepository = knowledgeRepository;
             _sessionContext = sessionContext;
@@ -155,6 +160,7 @@ namespace Hotline.Api.Controllers
             _knowledgeHotWordRepository = knowledgeHotWordRepository;
             _knowledgeApproRepository = knowledgeApproRepository;
             this._systemSettingCacheManager = _systemSettingCacheManager;
+            _pdfManager = pdfManager;
             _appOptions = appOptions;
         }
 
@@ -962,7 +968,7 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <returns></returns>
         [HttpGet("dl-template")]
-        public object DownLoadKnowledgeTemplate()
+        public IActionResult DownLoadKnowledgeTemplate()
         {
             return _exportApplication.ExportData(new List<KnowledgeImportTemplate>
             {
@@ -1033,6 +1039,44 @@ namespace Hotline.Api.Controllers
                 : $"导入{items.Count}条,成功{kns.Count}条,{err}";
         }
 
+        /// <summary>
+        /// 导出知识(new)
+        /// </summary>
+        [HttpGet("export-knowledge")]
+        public async Task<IActionResult> ExportKnowledge([FromQuery] ExportKnowledgeRequest request)
+        {
+            if (string.IsNullOrEmpty(request.Id))
+                throw new UserFriendlyException("无效知识编号");
+            var kn = await _knowledgeRepository.GetAsync(request.Id, HttpContext.RequestAborted);
+            if (kn is null)
+                throw new UserFriendlyException("无效知识编号");
+            var content = kn.Content
+                  .Replace("&nbsp;", " ")
+                  .Replace("&amp;", "&")
+                  .Replace("&quot;", "\"")
+                  .Replace("&gt;", ">")
+                  .Replace("&lt;", "<")
+                  ;
+
+
+            switch (request.ExportType)
+            {
+                case "pdf":
+                    var fileName = $"{kn.Title}.pdf";
+                    var stream = new MemoryStream();
+                    _pdfManager.GeneratePdf(kn.Title, content, stream);
+                    stream.Seek(0, SeekOrigin.Begin);
+                    return new FileStreamResult(stream, "application/pdf")
+                    {
+                        FileDownloadName = fileName ?? DateTime.Now.ToString("yyyyMMddhhmmss") + ".pdf"
+                    };
+
+                    break;
+            }
+
+
+            return null;
+        }
 
         #endregion
 

+ 21 - 8
src/Hotline.Api/Controllers/QualityController.cs

@@ -123,12 +123,25 @@ namespace Hotline.Api.Controllers
             await _qualityApplication.UpdateQualityAsync(dto, HttpContext.RequestAborted);
         }
 
-        /// <summary>
-        /// 获取质检列表
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("list")]
+		/// <summary>
+		/// 更新质检
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpPut("transfer")]
+		public async Task TransferUpdate([FromBody] TransferUpdate dto)
+		{
+			await _qualitey.Updateable().SetColumns(x=> new Hotline.Quality.Quality { Transfer  = dto.Transfer }).Where(x=>x.Id == dto.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+		}
+
+
+
+		/// <summary>
+		/// 获取质检列表
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("list")]
         public async Task<PagedDto<QualityDto>> List([FromQuery] QualityListDto dto)
         {
             var (total, items) = await _qualitey.Queryable()
@@ -644,7 +657,7 @@ namespace Hotline.Api.Controllers
 		}
 
 		/// <summary>
-		/// 智能质检转写
+		/// 智能质检转写_兴唐_定时调用
 		/// </summary>
 		/// <param name="dto"></param>
 		/// <returns></returns>
@@ -666,7 +679,7 @@ namespace Hotline.Api.Controllers
             else {
 				var notStarted = await _qualityTransferRecordsRepository.Queryable().Where(x => x.IsFinished == false && x.TransferState == EQualityTransferState.NotStarted).OrderBy(x => x.TransferTime).FirstAsync();
 				await _qualityTransferRecordsRepository.Updateable().SetColumns(x => new QualityTransferRecords { TransferState = EQualityTransferState.Translating , TransferTime = DateTime.Now }).Where(x => x.Id == notStarted.Id).ExecuteCommandAsync();
-				_qualityApplication.Transfer_XT(notStarted.QualityId, HttpContext.RequestAborted);
+				await _qualityApplication.Transfer_XT(notStarted.QualityId, HttpContext.RequestAborted);
 			}
 		}
 

+ 3 - 0
src/Hotline.Api/Hotline.Api.csproj

@@ -35,6 +35,9 @@
     <None Update="Template\AssignmentForm.doc">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="Template\QualityCertificate.doc">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Remove="logs\**" />
   </ItemGroup>
 

+ 4 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -48,6 +48,7 @@ using Hotline.Orders.DatabaseEventHandler;
 using Hotline.Snapshot;
 using Hotline.WeChat;
 using Hotline.Ai.XingTang;
+using Hotline.Pdf;
 
 
 namespace Hotline.Api;
@@ -218,7 +219,9 @@ internal static class StartupExtensions
 
         //job
         services.RegisterJob(appConfiguration);
-        
+
+        services.AddPdfManager();
+
         //compression
         services.RejisterCompression();
 

+ 1 - 1
src/Hotline.Application/ExportWord/WordHelper.cs

@@ -11,7 +11,7 @@ namespace Hotline.Application.ExportWord
     {
         public static Stream ConvertHtmlToPdf(string htmlContent)
         {
-            var pdf = Pdf
+            var pdf = OpenHtmlToPdf.Pdf
                 .From(htmlContent)
                 .WithObjectSetting("web.defaultEncoding", "utf-8")
                 .Content();

+ 1 - 0
src/Hotline.Application/Hotline.Application.csproj

@@ -20,6 +20,7 @@
     <ProjectReference Include="..\Hotline.Ai.XingTang\Hotline.Ai.XingTang.csproj" />
     <ProjectReference Include="..\Hotline.Application.Contracts\Hotline.Application.Contracts.csproj" />
     <ProjectReference Include="..\Hotline.NewRock\Hotline.NewRock.csproj" />
+    <ProjectReference Include="..\Hotline.Pdf\Hotline.Pdf.csproj" />
     <ProjectReference Include="..\Hotline.Repository.SqlSugar\Hotline.Repository.SqlSugar.csproj" />
     <ProjectReference Include="..\Hotline.Wex\Hotline.Wex.csproj" />
     <ProjectReference Include="..\Hotline.XingTang\Hotline.XingTang.csproj" />

+ 1 - 1
src/Hotline.Application/Quality/IQualityApplication.cs

@@ -19,7 +19,7 @@ namespace Hotline.Application.Quality
 		ISugarQueryable<QualityOrderOverviewDto> QualityOrderOverview(QualityWorkAnalysisRequest dto, int allOrderNum, CancellationToken cancellationToken);
 		ISugarQueryable<SeatsQualityGradeAnalyseDto> SeatsQualityGradeAnalyse(QualityWorkAnalysisRequest dto, CancellationToken cancellationToken);
 
-		ISugarQueryable<object> MonthQualityGrade(QualityWorkAnalysisRequest dto, CancellationToken cancellationToken);
+		Task<List<MonthQualityGradeDto>> MonthQualityGrade(QualityWorkAnalysisRequest dto, CancellationToken cancellationToken);
 
 	}
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 2
src/Hotline.Application/Quality/QualityApplication.cs


+ 17 - 0
src/Hotline.Pdf/Hotline.Pdf.csproj

@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="QuestPDF" Version="2024.12.2" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Hotline\Hotline.csproj" />
+  </ItemGroup>
+
+</Project>

+ 52 - 0
src/Hotline.Pdf/QuestPdfManager.cs

@@ -0,0 +1,52 @@
+using Hotline.Ai.Quality;
+using QuestPDF.Fluent;
+using QuestPDF.Helpers;
+using QuestPDF.Infrastructure;
+
+namespace Hotline.Pdf
+{
+    public class QuestPdfManager : IPdfManager
+    {
+        public void GeneratePdf(string title, string content, Stream stream) => CreateDocument(title, content).GeneratePdf(stream);
+
+        public void GeneratePdf(string title, string content, string path) => CreateDocument(title, content).GeneratePdf(path);
+
+
+        private Document CreateDocument(string title, string content)
+        {
+            return Document.Create(container =>
+            {
+                container.Page(page =>
+                {
+                    page.Size(PageSizes.A4);
+                    page.Margin(2, Unit.Centimetre);
+                    page.PageColor(Colors.White);
+                    page.DefaultTextStyle(x => x.FontSize(20));
+
+                    page.Header()
+                        .Text(title)
+                        .SemiBold().FontSize(36).FontColor(Colors.Blue.Medium);
+
+                    page.Content()
+                        .PaddingVertical(1, Unit.Centimetre)
+                        .Column(x =>
+                        {
+                            x.Spacing(20);
+
+                            //x.Item().Text(Placeholders.LoremIpsum());
+                            //x.Item().Image(Placeholders.Image(200, 100));
+                            x.Item().Text(content);
+                        });
+
+                    page.Footer()
+                        .AlignCenter()
+                        .Text(x =>
+                        {
+                            x.Span("Page ");
+                            x.CurrentPageNumber();
+                        });
+                });
+            });
+        }
+    }
+}

+ 16 - 0
src/Hotline.Pdf/QuestPdfManagerStartupExtensions.cs

@@ -0,0 +1,16 @@
+using Microsoft.Extensions.DependencyInjection;
+using QuestPDF.Infrastructure;
+
+namespace Hotline.Pdf;
+
+public static class QuestPdfManagerStartupExtensions
+{
+    public static IServiceCollection AddPdfManager(this IServiceCollection services)
+    {
+        services.AddSingleton<IPdfManager, QuestPdfManager>();
+
+        QuestPDF.Settings.License = LicenseType.Community;
+
+        return services;
+    }
+}

+ 15 - 0
src/Hotline.Share/Dtos/Knowledge/ExportKnowledgeRequest.cs

@@ -0,0 +1,15 @@
+namespace Hotline.Share.Dtos.Knowledge;
+
+public class ExportKnowledgeRequest
+{
+    /// <summary>
+    /// 知识id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// pdf(暂只支持)
+    /// </summary>
+    public string ExportType { get; set; }
+
+}

+ 3 - 49
src/Hotline.Share/Dtos/Quality/BiQualityDto.cs

@@ -99,57 +99,11 @@ namespace Hotline.Share.Dtos.Quality
 
 	public class MonthQualityGradeDto
 	{
+		public string Month { get; set; }
 
-		/// <summary>
-		/// 一月
-		/// </summary>
-		public int JanuaryNum { get; set; }
-		/// <summary>
-		/// 二月
-		/// </summary>
-		public int FebruaryNum { get; set; }
-		/// <summary>
-		/// 三月
-		/// </summary>
-		public int MarchNum { get; set; }
-		/// <summary>
-		/// 四月
-		/// </summary>
-		public int AprilNum { get; set; }
-		/// <summary>
-		/// 五月
-		/// </summary>
-		public int MayNum { get; set; }
-		/// <summary>
-		/// 六月
-		/// </summary>
-		public int JuneNum { get; set; }
-		/// <summary>
-		/// 七月
-		/// </summary>
-		public int JulyNum { get; set; }
-		/// <summary>
-		/// 八月
-		/// </summary>
-		public int AugustNum { get; set; }
-		/// <summary>
-		/// 九月
-		/// </summary>
-		public int SeptemberNum { get; set; }
-		/// <summary>
-		/// 十月
-		/// </summary>
-		public int OctoberNum { get; set; }
-		/// <summary>
-		/// 十一月
-		/// </summary>
-		public int NovemberNum { get; set; }
-
-		/// <summary>
-		/// 十二月
-		/// </summary>
-		public int DecemberNum { get; set; }
+		public int Num { get; set; }
 	}
 
 
+
 }

+ 12 - 0
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -53,6 +53,18 @@ namespace Hotline.Share.Dtos.Quality
 	{
 		public string Id { get; set; }
 	}
+
+	public class TransferUpdate
+	{
+		/// <summary>
+		/// 质检ID
+		/// </summary>
+		public string Id { get; set; }
+		/// <summary>
+		/// 转写内容
+		/// </summary>
+		public List<Transfer>? Transfer { get; set; }
+	}
 	public class DeleteQualityDto
 	{
 		public List<string> Ids { get; set; }

+ 1 - 1
src/Hotline.Share/Dtos/QualityExportWord/QualityCertificate.cs

@@ -124,7 +124,7 @@ namespace Hotline.Share.Dtos.QualityExportWord
 		/// <summary>
 		/// 质检分数
 		/// </summary>
-		public int? Grade { get; set; }
+		public string Grade { get; set; }
 
 		/// <summary>
 		/// 质检评价

+ 2 - 2
src/Hotline.Share/Enums/Quality/EQuality.cs

@@ -61,13 +61,13 @@ namespace Hotline.Share.Enums.Quality
 		/// 转写成功
 		/// </summary>
 		[Description("转写成功")]
-		Succeed = 1,
+		Succeed = 2,
 
 		/// <summary>
 		/// 转写失败
 		/// </summary>
 		[Description("转写失败")]
-		Lose = 1,
+		Lose = 3,
 	}
 
 	public enum EQualityTransferType {

+ 14 - 0
src/Hotline/Pdf/IPdfManager.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Pdf
+{
+    public interface IPdfManager
+    {
+        void GeneratePdf(string title, string content, Stream stream);
+        void GeneratePdf(string title, string content, string path);
+    }
+}

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio