Ver Fonte

自贡12345 预案库

libin há 4 meses atrás
pai
commit
81d9dbbc60

+ 30 - 9
src/Hotline.Api/Controllers/CaseController.cs

@@ -16,6 +16,8 @@ using Hotline.Share.Dtos.Planlibrary;
 using Hotline.Share.Enums.Planlibrary;
 using Hotline.Share.Enums.Article;
 using XF.Utility.EnumExtensions;
+using Hotline.Share.Dtos.Order;
+using Hotline.Application.ExportExcel;
 
 namespace Hotline.Api.Controllers
 {
@@ -33,7 +35,8 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<CaseType> _caseTypeRepository;
         private readonly IRepository<CaseList> _caseListRepository;
         private readonly IRepository<CaseCollect> _caseCollectRepository;
-        private readonly IWordHelperService _wordHelperService;
+        private readonly IWordHelperService _wordHelperService; 
+        private readonly IExportApplication _exportApplication;
 
 
         public CaseController(
@@ -43,7 +46,8 @@ namespace Hotline.Api.Controllers
            IRepository<CaseType> CaseTypeRepository,
            IRepository<CaseList> CaseListRepository,
            IRepository<CaseCollect> CaseCollectRepository,
-           IWordHelperService wordHelperService)
+           IWordHelperService wordHelperService,
+           IExportApplication exportApplication)
         {
             _mapper = mapper;
             _sessionContext = sessionContext;
@@ -52,6 +56,7 @@ namespace Hotline.Api.Controllers
             _caseListRepository = CaseListRepository;
             _caseCollectRepository = CaseCollectRepository;
             _wordHelperService = wordHelperService;
+            _exportApplication = exportApplication;
         }
 
         #endregion
@@ -208,28 +213,31 @@ namespace Hotline.Api.Controllers
         /// <summary>
         /// 案例库草稿删除
         /// </summary>
-        /// <param name="dto"></param>
+        /// <param name="Id"></param>
         /// <returns></returns>
-        [HttpDelete("list/draftremove")]
-        public async Task RemovePlanDraft([FromBody] UpdateCaseListDto dto)
+        [HttpDelete("list/draftremove/{Id}")]
+        public async Task RemovePlanDraft(string Id)
         {
+            UpdateCaseListDto dto = new UpdateCaseListDto();
             dto.ApplyStatus = ECaseApplyStatus.Delete;
             dto.Status = ECaseStatus.Auditing;
+            dto.Id = Id;
             await _caseApplication.RemoveCaseAsync(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
         /// 案例库删除
         /// </summary>
-        /// <param name="Id"></param>
+        /// <param name="dtoDel"></param>
         /// <returns></returns>
         [HttpDelete("list/remove")]
-        public async Task RemovePlan(string Id)
+        public async Task RemovePlan([FromBody] DelCaseListDto dtoDel)
         {
             UpdateCaseListDto dto = new UpdateCaseListDto();
             dto.ApplyStatus = ECaseApplyStatus.Delete;
             dto.Status = ECaseStatus.Auditing;
-            dto.Id = Id;
+            dto.Id = dtoDel.Id;
+            dto.ApplyReason = dtoDel.ApplyReason;
             await _caseApplication.UpdateCaseAsync(dto, HttpContext.RequestAborted);
         }
 
@@ -332,6 +340,7 @@ namespace Hotline.Api.Controllers
             CaseDto.ExaminTime = DateTime.Now;
             CaseDto.ExaminManId = _sessionContext.UserId;
             CaseDto.ExaminOrganizeId = _sessionContext.OrgId;
+            CaseDto.ExaminOpinion = dto.ExaminOpinion;
 
             await _caseApplication.AuditCaseAsync(CaseDto, HttpContext.RequestAborted);
         }
@@ -407,7 +416,7 @@ namespace Hotline.Api.Controllers
         }
 
         /// <summary>
-        /// 案例库导出
+        /// 案例库详情导出
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
@@ -425,6 +434,18 @@ namespace Hotline.Api.Controllers
             return info.Result.HtmlToStream(dto.FileType).GetFileStreamResult(dto.FileType, info.Title, false);
         }
 
+        /// <summary>
+        /// 预案库列表导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("export")]
+        public async Task<IActionResult> GetPlanListExportAsync([FromBody] ExportExcelDto<CaseListDto> dto)
+        {
+            var items = (await _caseApplication.QueryAllCaseListAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2;
+            return _exportApplication.GetExcelFile(dto, items, "预案明细导出");
+        }
+
         /// <summary>
         /// 案例库列表页面枚举值
         /// </summary>

+ 34 - 11
src/Hotline.Api/Controllers/PlanController.cs

@@ -15,6 +15,11 @@ using Hotline.Application.Tools;
 using Hotline.Share.Enums.Article;
 using XF.Utility.EnumExtensions;
 using Quartz.Simpl;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using Hotline.Share.Dtos.Caselibrary;
+using Hotline.Share.Dtos.Knowledge;
+using Hotline.Share.Dtos.Order;
+using Hotline.Application.ExportExcel;
 
 namespace Hotline.Api.Controllers
 {
@@ -33,7 +38,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<PlanList> _planListRepository;
         private readonly IRepository<PlanCollect> _planCollectRepository;
         private readonly IWordHelperService _wordHelperService;
-
+        private readonly IExportApplication _exportApplication;
 
         public PlanController(
            IMapper mapper,
@@ -42,7 +47,8 @@ namespace Hotline.Api.Controllers
            IRepository<PlanType> planTypeRepository,
            IRepository<PlanList> planListRepository,
            IRepository<PlanCollect> planCollectRepository,
-           IWordHelperService wordHelperService)
+           IWordHelperService wordHelperService,
+           IExportApplication exportApplication)
         {
             _mapper = mapper;
             _sessionContext = sessionContext;
@@ -51,6 +57,7 @@ namespace Hotline.Api.Controllers
             _planListRepository = planListRepository;
             _planCollectRepository = planCollectRepository;
             _wordHelperService = wordHelperService;
+            _exportApplication = exportApplication;
         }
 
         #endregion
@@ -207,28 +214,31 @@ namespace Hotline.Api.Controllers
         /// <summary>
         /// 预案库草稿删除
         /// </summary>
-        /// <param name="dto"></param>
+        /// <param name="Id"></param>
         /// <returns></returns>
-        [HttpDelete("list/draftremove")]
-        public async Task RemovePlanDraft([FromBody] UpdatePlanListDto dto)
+        [HttpDelete("list/draftremove/{Id}")]
+        public async Task RemovePlanDraft(string Id)
         {
+            UpdatePlanListDto dto = new UpdatePlanListDto();
             dto.ApplyStatus = EPlanApplyStatus.Delete;
             dto.Status = EPlanStatus.Auditing;
+            dto.Id = Id;
             await _planApplication.RemovePlanAsync(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
-        /// 预案库删除
+        /// 预案库删除到审核
         /// </summary>
-        /// <param name="Id"></param>
+        /// <param name="dtoDel"></param>
         /// <returns></returns>
-        [HttpDelete("list/remove/{Id}")]
-        public async Task RemovePlan(string Id)
+        [HttpDelete("list/remove")]
+        public async Task RemovePlan([FromBody] DelPlanListDto dtoDel)
         {
             UpdatePlanListDto dto = new UpdatePlanListDto();
             dto.ApplyStatus = EPlanApplyStatus.Delete;
             dto.Status = EPlanStatus.Auditing;
-            dto.Id = Id;
+            dto.Id = dtoDel.Id;
+            dto.ApplyReason = dtoDel.ApplyReason;
             await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
         }
 
@@ -331,6 +341,7 @@ namespace Hotline.Api.Controllers
             planDto.ExaminTime = DateTime.Now;
             planDto.ExaminManId = _sessionContext.UserId;
             planDto.ExaminOrganizeId = _sessionContext.OrgId;
+            planDto.ExaminOpinion = dto.ExaminOpinion;
 
             await _planApplication.AuditPlanAsync(planDto, HttpContext.RequestAborted);
         }
@@ -403,7 +414,7 @@ namespace Hotline.Api.Controllers
         }
 
         /// <summary>
-        /// 预案库导出
+        /// 预案库详情导出
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
@@ -421,6 +432,18 @@ namespace Hotline.Api.Controllers
             return info.Content.HtmlToStream(dto.FileType).GetFileStreamResult(dto.FileType, info.Title, false);
         }
 
+        /// <summary>
+        /// 预案库列表导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("export")]
+        public async Task<IActionResult> GetPlanListExportAsync([FromBody] ExportExcelDto<PlanListDto> dto)
+        {
+            var items = (await _planApplication.QueryAllPlanListAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2;
+            return _exportApplication.GetExcelFile(dto, items, "预案明细导出");
+        }
+
 
         /// <summary>
         /// 预案库列表页面枚举值

+ 1 - 0
src/Hotline.Application/Caselibrary/CaseApplication.cs

@@ -196,6 +196,7 @@ namespace Hotline.Application.Caselibrary
             //单表分页
             var (total, temp) = await _caseListRepository.Queryable()
                 .Includes(x => x.CaseTypes)
+                .Includes(x => x.ExaminMan)
                 .Where(x => x.IsDeleted == false)
                 .Where(x => (x.Status == ECaseStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != ECaseStatus.Drafts))
                 .WhereIF(OrgSeedData.CenterId != pagedDto.CreateOrgId && !string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.StartsWith(pagedDto.CreateOrgId!))

+ 30 - 9
src/Hotline.Application/Planlibrary/PlanApplication.cs

@@ -16,6 +16,9 @@ using Hotline.Share.Tools;
 using Hotline.Application.Tools;
 using SqlSugar;
 using Hotline.KnowledgeBase;
+using Hotline.Repository.SqlSugar.Knowledge;
+using Hotline.Share.Enums.KnowledgeBase;
+using Microsoft.AspNetCore.Http;
 
 namespace Hotline.Application.Planlibrary
 {
@@ -31,6 +34,7 @@ namespace Hotline.Application.Planlibrary
         private readonly IRepository<PlanRelationType> _planRelationTypeRepository;      //预案库关联类型
         private readonly IRepository<PlanType> _planTypeRepository;                      //预案库分类管理
         private readonly IRepository<PlanTypeOrg> _planTypeOrgRepository;                //预案库分类关联机构
+        private readonly IRepository<PlanCollect> _planCollectRepository;                //预案库分类关联机构
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
         private readonly IRepository<Hotspot> _hotspotTypeRepository;
@@ -46,7 +50,8 @@ namespace Hotline.Application.Planlibrary
             IMapper mapper,
             IRepository<Hotspot> hotspotTypeRepository,
             IFileRepository fileRepository,
-            IBulletinApplication bulletinApplication)
+            IBulletinApplication bulletinApplication,
+            IRepository<PlanCollect> planCollectRepository)
         {
             _planListRepository = planListRepository;
             _planRelationTypeRepository = planRelationTypeRepository;
@@ -57,6 +62,7 @@ namespace Hotline.Application.Planlibrary
             _hotspotTypeRepository = hotspotTypeRepository;
             _fileRepository = fileRepository;
             _bulletinApplication = bulletinApplication;
+            _planCollectRepository = planCollectRepository;
         }
 
         #endregion
@@ -209,6 +215,7 @@ namespace Hotline.Application.Planlibrary
             var (total, temp) = await _planListRepository.Queryable()
                 .Includes(x => x.PlanTypes)
                 .Includes(x => x.HotspotType)
+                .Includes(x => x.ExaminMan)
                 .Where(x => x.IsDeleted == false)
                 .Where(x => (x.Status == EPlanStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EPlanStatus.Drafts))
                 .WhereIF(OrgSeedData.CenterId != pagedDto.CreateOrgId && !string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.StartsWith(pagedDto.CreateOrgId!))
@@ -274,9 +281,9 @@ namespace Hotline.Application.Planlibrary
                 pList.FileJson = await _fileRepository.AddFileAsync(dto.Files, pList.Id, "", cancellationToken);
             await _planListRepository.AddAsync(pList, cancellationToken);
 
-            if (dto.PlanType.Any())
+            if (dto.PlanTypes.Any())
             {
-                List<PlanRelationType> types = _mapper.Map<List<PlanRelationType>>(dto.PlanType);
+                List<PlanRelationType> types = _mapper.Map<List<PlanRelationType>>(dto.PlanTypes);
                 types.ForEach(x => x.PlanId = pList.Id);
                 await _planRelationTypeRepository.AddRangeAsync(types, cancellationToken);
             }
@@ -318,12 +325,12 @@ namespace Hotline.Application.Planlibrary
                 plan.FileJson = new List<Share.Dtos.File.FileJson>();
 
             await _planListRepository.UpdateNullAsync(plan, cancellationToken);
-            if (dto.PlanType.Any())
+            if (dto.PlanTypes.Any())
             {
                 var anyRelationTypes = await _planRelationTypeRepository.Queryable().Where(x => x.PlanId == plan.Id).ToListAsync();
                 if (anyRelationTypes.Any())
                     await _planRelationTypeRepository.RemoveRangeAsync(anyRelationTypes);
-                List<PlanRelationType> types = _mapper.Map<List<PlanRelationType>>(dto.PlanType);
+                List<PlanRelationType> types = _mapper.Map<List<PlanRelationType>>(dto.PlanTypes);
                 types.ForEach(x => x.PlanId = dto.Id);
                 await _planRelationTypeRepository.AddRangeAsync(types, cancellationToken);
             }
@@ -399,17 +406,31 @@ namespace Hotline.Application.Planlibrary
             if (plan == null)
                 throw UserFriendlyException.SameMessage("预案库查询失败");
             ;
-            //转化
+            // 转化
             var planInfoDto = _mapper.Map<PlanInfoDto>(plan);
 
+            // 内容
             if (plan != null && !string.IsNullOrEmpty(plan.Content))
                 planInfoDto.Content = _bulletinApplication.GetSiteUrls(plan.Content);
 
             // 热点
-            //var hot = await _hotspotTypeRepository.GetAsync(plan.HotspotId, cancellationToken);
-            //if (hot != null)
-            //    planDto.HotspotId = hot.HotSpotFullName;
+            var hot = await _hotspotTypeRepository.GetAsync(plan.HotspotId, cancellationToken);
+            if (hot != null)
+                planInfoDto.HotspotName = hot.HotSpotFullName;
 
+            // 分类
+            var relationType = await _planRelationTypeRepository.QueryAsync(x => x.PlanId == Id && x.CreatorId == _sessionContext.UserId);
+            if (relationType != null)
+            {
+                planInfoDto.PlanTypes = _mapper.Map<List<PlanRelationTypeDto>>(relationType);
+            }
+
+            // 收藏
+            var collect = await _planCollectRepository.GetAsync(x => x.PlanId == Id && x.CreatorId == _sessionContext.UserId);
+            if (collect != null)
+                planInfoDto.Collect = _mapper.Map<PlanCollectDto>(collect);
+
+            // 附件
             if (planInfoDto.FileJson != null && planInfoDto.FileJson.Any())
             {
                 var ids = planInfoDto.FileJson.Select(x => x.Id).ToList();

+ 16 - 0
src/Hotline.Share/Dtos/Caselibrary/CaseDataDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos.Hotspots;
+using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.Article;
 using Hotline.Share.Enums.Caselibrary;
 using XF.Utility.EnumExtensions;
@@ -72,6 +73,21 @@ namespace Hotline.Share.Dtos.Caselibrary
         /// </summary>
         public DateTime? ExpiredTime { get; set; }
 
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? ExaminOpinion { get; set; }
+
+        /// <summary>
+        /// 审核人ID
+        /// </summary>
+        public string? ExaminManId { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public UserDto? ExaminMan { get; set; }
+
         /// <summary>
         /// 文档状态
         /// </summary>

+ 19 - 0
src/Hotline.Share/Dtos/Caselibrary/CaseListDto.cs

@@ -259,6 +259,15 @@ namespace Hotline.Share.Dtos.Caselibrary
         /// 修改时间
         /// </summary>
         public DateTime? UpdateTime { get; set; }
+        /// <summary>
+        /// 申请理由
+        /// </summary>
+        public string ApplyReason { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string ExaminOpinion { get; set; }
     }
 
     public record DelCaseListDto
@@ -267,6 +276,11 @@ namespace Hotline.Share.Dtos.Caselibrary
         /// 案例库ID
         /// </summary>
         public string Id { get; set; }
+
+        /// <summary>
+        /// 申请理由
+        /// </summary>
+        public string ApplyReason { get; set; }
     }
 
 
@@ -364,6 +378,11 @@ namespace Hotline.Share.Dtos.Caselibrary
         /// 审核状态 0不同意 1同意
         /// </summary>
         public int State { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string ExaminOpinion { get; set; }
     }
 
     public record PvCaseListDto

+ 16 - 0
src/Hotline.Share/Dtos/Planlibrary/PlanDataDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos.Hotspots;
+using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.Article;
 using Hotline.Share.Enums.Planlibrary;
 using XF.Utility.EnumExtensions;
@@ -72,6 +73,21 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// </summary>
         public DateTime? ExpiredTime { get; set; }
 
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? ExaminOpinion { get; set; }
+
+        /// <summary>
+        /// 审核人ID
+        /// </summary>
+        public string? ExaminManId { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public UserDto? ExaminMan { get; set; }
+
         /// <summary>
         /// 预案归属
         /// </summary>

+ 96 - 1
src/Hotline.Share/Dtos/Planlibrary/PlanListDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Enums.Planlibrary;
 using Hotline.Share.Requests;
 
@@ -176,7 +177,7 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// <summary>
         /// 分类
         /// </summary>
-        public List<PlanRelationTypeDto> PlanType { get; set; }
+        public List<PlanRelationTypeDto> PlanTypes { get; set; }
 
         /// <summary>
         /// 热点
@@ -235,6 +236,16 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// 修改时间
         /// </summary>
         public DateTime? UpdateTime { get; set; }
+
+        /// <summary>
+        /// 申请理由
+        /// </summary>
+        public string ApplyReason { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string ExaminOpinion { get; set; }
     }
 
     public record DelPlanListDto
@@ -243,6 +254,11 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// 预案库ID
         /// </summary>
         public string Id { get; set; }
+
+        /// <summary>
+        /// 申请理由
+        /// </summary>
+        public string ApplyReason { get; set; }
     }
 
 
@@ -306,6 +322,60 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// </summary>
         public string? CreatorOrgName { get; set; }
 
+
+        /// <summary>
+        /// 预案分类
+        /// </summary>
+        public List<PlanRelationTypeDto> PlanTypes { get; set; }
+
+        /// <summary>
+        /// 预案分类名称
+        /// </summary>
+        public string PlanTypeText => GetPlanTypeText(PlanTypes);
+
+        /// <summary>
+        /// 获取预案分类名称
+        /// </summary>
+        /// <returns></returns>
+        public string GetPlanTypeText(List<PlanRelationTypeDto> items)
+        {
+
+            if (PlanTypes != null && PlanTypes.Any())
+            {
+                var names = PlanTypes.Select(x => x.PlanTypeName).ToList();
+                return string.Join(",", names);
+            }
+            return "";
+        }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string HotspotId { get; set; }
+
+        /// <summary>
+        /// 热点名称
+        /// </summary>
+        public string HotspotName { get; set; }
+
+        /// <summary>
+        /// 外部数据(为前端提供级联功能)
+        /// </summary>
+        //public string HotspotExternal { get; set; }
+
+        public PlanCollectDto Collect { get; set; }
+
+        /// <summary>
+        /// 预案申请状态
+        /// </summary>
+        public EPlanApplyStatus ApplyStatus { get; set; }
+
+        /// <summary>
+        /// 预案状态
+        /// </summary>
+        public EPlanStatus Status { get; set; }
+
+
         public List<FileDto> Files { get; set; }
 
         /// <summary>
@@ -314,6 +384,26 @@ namespace Hotline.Share.Dtos.Planlibrary
         public List<FileJson>? FileJson { get; set; }
     }
 
+    public class PlanCollectDto
+    {
+        /// <summary>
+        /// 知识库ID
+        /// </summary>
+        public string PlanId { get; set; }
+
+        /// <summary>
+        /// 评分
+        /// </summary>
+        public decimal? Score { get; set; } = decimal.Zero;
+
+        /// <summary>
+        /// 是否收藏
+        /// </summary>
+        public bool? Collect { get; set; }
+    }
+
+
+
     public record AuditPlanListDto
     {
         /// <summary>
@@ -325,6 +415,11 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// 审核状态 0不同意 1同意
         /// </summary>
         public int State { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string ExaminOpinion { get; set; }
     }
 
     public record PvPlanListDto

+ 12 - 0
src/Hotline/CaseLibrary/CaseList.cs

@@ -115,6 +115,18 @@ public class CaseList : CreationEntity
     [SugarColumn(ColumnDescription = "更新时间")]
     public DateTime? UpdateTime { get; set; }
 
+    /// <summary>
+    /// 申请理由
+    /// </summary>
+    [SugarColumn(ColumnDescription = "申请理由")]
+    public string? ApplyReason { get; set; }
+
+    /// <summary>
+    /// 审核意见
+    /// </summary>
+    [SugarColumn(ColumnDescription = "审核意见")]
+    public string? ExaminOpinion { get; set; }
+
     /// <summary>
     /// 审核人ID
     /// </summary>

+ 12 - 0
src/Hotline/Planlibrary/PlanList.cs

@@ -114,6 +114,18 @@ public class PlanList : CreationEntity
     [SugarColumn(ColumnDescription = "更新时间")]
     public DateTime? UpdateTime { get; set; }
 
+    /// <summary>
+    /// 申请理由
+    /// </summary>
+    [SugarColumn(ColumnDescription = "申请理由")]
+    public string? ApplyReason { get; set; }
+
+    /// <summary>
+    /// 审核意见
+    /// </summary>
+    [SugarColumn(ColumnDescription = "审核意见")]
+    public string? ExaminOpinion { get; set; }
+
     /// <summary>
     /// 审核人ID
     /// </summary>