Explorar o código

案例库分类关系表优化

libin hai 3 meses
pai
achega
e90b9c40db

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

@@ -156,7 +156,7 @@ namespace Hotline.Api.Controllers
                 {
                     Id = x.Id.SelectAll(),
                     CaseNum = SqlFunc.Subqueryable<CaseRelationType>().LeftJoin<CaseList>((kr, k) => kr.CaseId == k.Id)
-                         .Where((kr, k) => kr.CaseTypeSpliceName.StartsWith(x.SpliceName))
+                         .Where((kr, k) => kr.CaseTypeId == x.Id)
                          .DistinctCount(kr => kr.CaseId)
                 }
                 )

+ 36 - 20
src/Hotline.Application/Caselibrary/CaseApplication.cs

@@ -20,6 +20,7 @@ using Hotline.KnowledgeBase;
 using Hotline.Share.Enums.Planlibrary;
 using System.Numerics;
 using Hotline.Share.Dtos.Planlibrary;
+using Hotline.Planlibrary;
 
 namespace Hotline.Application.Caselibrary
 {
@@ -32,7 +33,6 @@ namespace Hotline.Application.Caselibrary
         #region 注册
 
         private readonly IRepository<CaseList> _caseListRepository;                           //案例库列表
-        private readonly IRepository<CaseRelationType> _caseRelationTypeRepository;           //案例库关联类型
         private readonly IRepository<CaseType> _caseTypeRepository;                           //案例库分类管理
         private readonly IRepository<CaseTypeOrg> _caseTypeOrgRepository;                     //案例库分类关联机构
         private readonly IRepository<CaseCollect> _caseCollectRepository;                     //案例库收藏评分
@@ -46,7 +46,6 @@ namespace Hotline.Application.Caselibrary
 
         public CaseApplication(
             IRepository<CaseList> caseListRepository,
-            IRepository<CaseRelationType> caseRelationTypeRepository,
             IRepository<CaseType> caseTypeRepository,
             IRepository<CaseTypeOrg> caseTypeOrgRepository,
             IRepository<CaseCollect> caseCollectRepository,
@@ -59,7 +58,6 @@ namespace Hotline.Application.Caselibrary
             IBulletinApplication bulletinApplication)
         {
             _caseListRepository = caseListRepository;
-            _caseRelationTypeRepository = caseRelationTypeRepository;
             _caseTypeRepository = caseTypeRepository;
             _caseTypeOrgRepository = caseTypeOrgRepository;
             _caseCollectRepository = caseCollectRepository;
@@ -175,7 +173,7 @@ namespace Hotline.Application.Caselibrary
                 throw UserFriendlyException.SameMessage("存在子级分类!");
 
             //查询是否有案例分类
-            var checkKnowledge = await _caseListRepository.CountAsync(p => p.CaseTypes.Any(t => t.CaseId == Id), cancellationToken);
+            var checkKnowledge = await _caseListRepository.CountAsync(p => p.CaseTypes.Any(t => t.Id == Id), cancellationToken);
             if (checkKnowledge > 0)
                 throw UserFriendlyException.SameMessage("分类存在案例!");
 
@@ -251,7 +249,7 @@ namespace Hotline.Application.Caselibrary
                                                                                               (x.Status == ECaseStatus.Revert && x.CreatorId == _sessionContext.UserId) ||
                                                                                               (x.Status == ECaseStatus.NewDrafts && x.CreatorId == _sessionContext.UserId))
 
-                .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.CaseTypes.Any(t => t.CaseTypeSpliceName.StartsWith(typeSpliceName)))
+                .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.CaseTypes.Any(t => t.SpliceName.StartsWith(typeSpliceName)))
 
                 .WhereIF(pagedDto.CreationTimeStart.HasValue, x => x.CreationTime >= pagedDto.CreationTimeStart)
                 .WhereIF(pagedDto.CreationTimeEnd.HasValue, x => x.CreationTime <= pagedDto.CreationTimeEnd)
@@ -296,26 +294,32 @@ namespace Hotline.Application.Caselibrary
         /// <returns></returns>
         public async Task<string> AddCaseAsync(AddCaseListDto dto, CancellationToken cancellationToken)
         {
-            var pList = _mapper.Map<CaseList>(dto);
+            var cList = _mapper.Map<CaseList>(dto);
 
             var any = await _caseListRepository.Queryable().Where(x => x.Status == ECaseStatus.OnShelf && x.Title == dto.Title).AnyAsync();
             if (any)
                 throw UserFriendlyException.SameMessage("当前案例标题存在重复标题!");
 
-            pList.InitId();
+            cList.InitId();
 
             if (dto.Files != null && dto.Files.Count > 0)
-                pList.FileJson = await _fileRepository.AddFileAsync(dto.Files, pList.Id, "", cancellationToken);
-            await _caseListRepository.AddAsync(pList, cancellationToken);
+                cList.FileJson = await _fileRepository.AddFileAsync(dto.Files, cList.Id, "", cancellationToken);
 
             if (dto.CaseTypes.Any())
             {
-                List<CaseRelationType> types = _mapper.Map<List<CaseRelationType>>(dto.CaseTypes);
-                types.ForEach(x => x.CaseId = pList.Id);
-                await _caseRelationTypeRepository.AddRangeAsync(types, cancellationToken);
+                cList.CaseTypes = dto.CaseTypes.Select(d => new CaseType
+                {
+                    Id = d.Id,
+                    Name = d.Name,
+                    SpliceName = d.SpliceName
+                }).ToList();
             }
 
-            return pList.Id;
+            await _caseListRepository.AddNav(cList)
+                                     .Include(d => d.CaseTypes)
+                                     .ExecuteCommandAsync();
+
+            return cList.Id;
         }
 
         #endregion
@@ -359,20 +363,32 @@ namespace Hotline.Application.Caselibrary
                     Case.FileJson = new List<Share.Dtos.File.FileJson>();
             }
 
-            await _caseListRepository.UpdateNullAsync(Case, cancellationToken);
 
             if (dto.ApplyStatus != ECaseApplyStatus.Delete)
             {
                 if (dto.CaseTypes.Any())
                 {
-                    var anyRelationTypes = await _caseRelationTypeRepository.Queryable().Where(x => x.CaseId == Case.Id).ToListAsync();
-                    if (anyRelationTypes.Any())
-                        await _caseRelationTypeRepository.RemoveRangeAsync(anyRelationTypes);
-                    List<CaseRelationType> types = _mapper.Map<List<CaseRelationType>>(dto.CaseTypes);
-                    types.ForEach(x => x.CaseId = dto.Id);
-                    await _caseRelationTypeRepository.AddRangeAsync(types, cancellationToken);
+                    Case.CaseTypes = dto.CaseTypes.Select(d => new CaseType
+                    {
+                        Id = d.Id
+                    }).ToList();
+
+                    await _caseListRepository.UpdateNav(Case)
+                        .Include(d => d.CaseTypes, new UpdateNavOptions
+                        {
+                            ManyToManyIsUpdateA = true
+                        })
+                        .ExecuteCommandAsync();
+                }
+                else
+                {
+                    await _caseListRepository.UpdateAsync(Case, cancellationToken);
                 }
             }
+            else
+            {
+                await _caseListRepository.UpdateAsync(Case, cancellationToken);
+            }
         }
 
         #endregion

+ 19 - 10
src/Hotline.Application/Planlibrary/PlanApplication.cs

@@ -17,6 +17,7 @@ using Hotline.Application.Tools;
 using SqlSugar;
 using System.Numerics;
 using Microsoft.AspNetCore.Http;
+using Hotline.Share.Enums.Caselibrary;
 
 namespace Hotline.Application.Planlibrary
 {
@@ -352,19 +353,27 @@ namespace Hotline.Application.Planlibrary
                     plan.FileJson = new List<Share.Dtos.File.FileJson>();
             }
 
-            if (dto.PlanTypes.Any())
+
+            if (dto.ApplyStatus != EPlanApplyStatus.Delete)
             {
-                plan.PlanTypes = dto.PlanTypes.Select(d => new PlanType
+                if (dto.PlanTypes.Any())
                 {
-                    Id = d.Id,
-                }).ToList();
-
-                await _planListRepository.UpdateNav(plan)
-                    .Include(d => d.PlanTypes, new UpdateNavOptions
+                    plan.PlanTypes = dto.PlanTypes.Select(d => new PlanType
                     {
-                        ManyToManyIsUpdateA = true
-                    })
-                    .ExecuteCommandAsync();
+                        Id = d.Id,
+                    }).ToList();
+
+                    await _planListRepository.UpdateNav(plan)
+                        .Include(d => d.PlanTypes, new UpdateNavOptions
+                        {
+                            ManyToManyIsUpdateA = true
+                        })
+                        .ExecuteCommandAsync();
+                }
+                else
+                {
+                    await _planListRepository.UpdateAsync(plan, cancellationToken);
+                }
             }
             else
             {

+ 4 - 4
src/Hotline.Share/Dtos/Caselibrary/CaseDataDto.cs

@@ -125,7 +125,7 @@ namespace Hotline.Share.Dtos.Caselibrary
 
             if (CaseTypes != null && CaseTypes.Any())
             {
-                var names = CaseTypes.Select(x => x.CaseTypeName).ToList();
+                var names = CaseTypes.Select(x => x.Name).ToList();
                 return string.Join(",", names);
             }
             return "";
@@ -172,18 +172,18 @@ namespace Hotline.Share.Dtos.Caselibrary
         /// <summary>
         /// 案例库类型ID
         /// </summary>
-        public string CaseTypeId { get; set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// 案例库类型名称
         /// </summary>
-        public string CaseTypeName { get; set; }
+        public string Name { get; set; }
 
 
         /// <summary>
         /// 案例库类型名称
         /// </summary>
-        public string CaseTypeSpliceName { get; set; }
+        public string SpliceName { get; set; }
     }
 }
 

+ 1 - 1
src/Hotline.Share/Dtos/Caselibrary/CaseListDto.cs

@@ -394,7 +394,7 @@ namespace Hotline.Share.Dtos.Caselibrary
 
             if (CaseTypes != null && CaseTypes.Any())
             {
-                var names = CaseTypes.Select(x => x.CaseTypeName).ToList();
+                var names = CaseTypes.Select(x => x.Name).ToList();
                 return string.Join(",", names);
             }
             return "";

+ 8 - 4
src/Hotline/CaseLibrary/CaseList.cs

@@ -8,6 +8,7 @@ using Hotline.Share.Enums.Caselibrary;
 using Hotline.Share.Dtos.File;
 using Hotline.Orders;
 using Hotline.KnowledgeBase;
+using Hotline.Planlibrary;
 
 namespace Hotline.CaseLibrary;
 
@@ -193,10 +194,13 @@ public class CaseList : CreationEntity
     public Knowledge? Knowledge { get; set; }
 
     /// <summary>
-	/// 案例库类型关联ID
-	/// </summary>
-	[Navigate(NavigateType.OneToMany, nameof(CaseRelationType.CaseId))]
-    public List<CaseRelationType> CaseTypes { get; set; }
+    /// 案例库类型关联ID
+    /// </summary>
+    //[Navigate(NavigateType.OneToMany, nameof(CaseRelationType.CaseId))]
+    //   public List<CaseRelationType> CaseTypes { get; set; }
+
+    [Navigate(typeof(CaseRelationType), nameof(CaseRelationType.CaseId), nameof(CaseRelationType.CaseTypeId))]
+    public List<CaseType> CaseTypes { get; set; }
 
     /// <summary>
     /// 附件

+ 3 - 23
src/Hotline/CaseLibrary/CaseRelationType.cs

@@ -1,6 +1,5 @@
-using SqlSugar;
-using System.ComponentModel;
-using XF.Domain.Repository;
+using System.ComponentModel;
+using XF.Domain.Entities;
 
 namespace Hotline.CaseLibrary;
 
@@ -8,10 +7,7 @@ namespace Hotline.CaseLibrary;
 /// 案例库关联类型
 /// </summary>
 [Description("案例库关联类型")]
-[SugarIndex("index_caseRelationType_caseId", nameof(CaseRelationType.CaseId), OrderByType.Desc)]
-[SugarIndex("index_caseRelationType_typeId", nameof(CaseRelationType.CaseTypeId), OrderByType.Desc)]
-[SugarIndex("index_caseRelationType_spliceName", nameof(CaseRelationType.CaseTypeSpliceName), OrderByType.Desc)]
-public class CaseRelationType : FullStateEntity
+public class CaseRelationType : ITable, IEntity
 {
     /// <summary>
     /// 案例库ID
@@ -22,21 +18,5 @@ public class CaseRelationType : FullStateEntity
     /// 案例库类型ID
     /// </summary>
     public string CaseTypeId { get; set; }
-
-    /// <summary>
-    /// 案例库类型名称
-    /// </summary>
-    public string CaseTypeName { get; set; }
-
-    /// <summary>
-    /// 案例库类型名称
-    /// </summary>
-    public string CaseTypeSpliceName { get; set; }
-
-    /// <summary>
-    /// 案例库类型
-    /// </summary>
-    [Navigate(NavigateType.OneToOne, nameof(CaseTypeId))]
-    public CaseType CaseType { get; set; }
 }