|
@@ -0,0 +1,361 @@
|
|
|
+using DocumentFormat.OpenXml.Office2010.Excel;
|
|
|
+using Hotline.Application.Knowledge;
|
|
|
+using Hotline.KnowledgeBase;
|
|
|
+using Hotline.Planlibrary;
|
|
|
+using Hotline.Repository.SqlSugar.Knowledge;
|
|
|
+using Hotline.Settings.Hotspots;
|
|
|
+using Hotline.Share.Dtos;
|
|
|
+using Hotline.Share.Dtos.Knowledge;
|
|
|
+using Hotline.Share.Dtos.Planlibrary;
|
|
|
+using Hotline.Share.Enums.KnowledgeBase;
|
|
|
+using Hotline.Share.Enums.Planlibrary;
|
|
|
+using MapsterMapper;
|
|
|
+using XF.Domain.Authentications;
|
|
|
+using XF.Domain.Dependency;
|
|
|
+using XF.Domain.Exceptions;
|
|
|
+using XF.Domain.Repository;
|
|
|
+
|
|
|
+namespace Hotline.Application.Planlibrary
|
|
|
+{
|
|
|
+ /// <summary>
|
|
|
+ /// 预案库处理
|
|
|
+ /// </summary>
|
|
|
+ public class PlanApplication : IPlanApplication, IScopeDependency
|
|
|
+ {
|
|
|
+ #region 注册
|
|
|
+
|
|
|
+ private readonly IRepository<PlanList> _planListRepository; //预案库列表
|
|
|
+ private readonly IRepository<PlanRelationType> _planRelationTypeRepository; //预案库关联类型
|
|
|
+ private readonly IRepository<PlanType> _planTypeRepository; //预案库分类管理
|
|
|
+ private readonly IRepository<PlanTypeOrg> _planTypeOrgRepository; //预案库分类关联机构
|
|
|
+ private readonly ISessionContext _sessionContext;
|
|
|
+ private readonly IMapper _mapper;
|
|
|
+ private readonly IRepository<Hotspot> _hotspotTypeRepository;
|
|
|
+
|
|
|
+ public PlanApplication(
|
|
|
+ IRepository<PlanList> planListRepository,
|
|
|
+ IRepository<PlanRelationType> planRelationTypeRepository,
|
|
|
+ IRepository<PlanType> planTypeRepository,
|
|
|
+ IRepository<PlanTypeOrg> planTypeOrgRepository,
|
|
|
+ ISessionContext sessionContext,
|
|
|
+ IMapper mapper,
|
|
|
+ IRepository<Hotspot> hotspotTypeRepository)
|
|
|
+ {
|
|
|
+ _planListRepository = planListRepository;
|
|
|
+ _planRelationTypeRepository = planRelationTypeRepository;
|
|
|
+ _planTypeRepository = planTypeRepository;
|
|
|
+ _planTypeOrgRepository = planTypeOrgRepository;
|
|
|
+ _sessionContext = sessionContext;
|
|
|
+ _mapper = mapper;
|
|
|
+ _hotspotTypeRepository = hotspotTypeRepository;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 预案库类型管理
|
|
|
+
|
|
|
+ #region 预案库类型 - 新增
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 预案库类型 - 新增
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <param name="cancellationToken"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<string> AddType(AddPlanTypeDto dto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var sandard = await _planTypeRepository.GetAsync(p => p.ParentId == dto.ParentId && p.Name == dto.Name && p.IsDeleted == false, cancellationToken);
|
|
|
+ if (sandard is not null)
|
|
|
+ throw UserFriendlyException.SameMessage("当前层级已存在相同名称的分类!");
|
|
|
+
|
|
|
+ var type = _mapper.Map<PlanType>(dto);
|
|
|
+ type.InitId();
|
|
|
+ type.IsEnable = true;
|
|
|
+ //获取分类名称全称
|
|
|
+ string FullName = await GetFullName(type.ParentId);
|
|
|
+ //处理全称,如果为第一级直接用全称,否则获取全称后拼接名称
|
|
|
+ type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;
|
|
|
+ var id = await _planTypeRepository.AddAsync(type, cancellationToken);
|
|
|
+ return id;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 预案库类型 - 编辑
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 预案库类型 - 编辑
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <param name="cancellationToken"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task UpdateType(UpdatePlanTypeDto dto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ //查询原有数据
|
|
|
+ var type = await _planTypeRepository.GetAsync(dto.Id, cancellationToken);
|
|
|
+ if (type is null)
|
|
|
+ throw UserFriendlyException.SameMessage("编辑失败!");
|
|
|
+ bool result = type.Name != dto.Name || type.ParentId != dto.ParentId;
|
|
|
+ //是否更改分类名称或者层级
|
|
|
+
|
|
|
+ //转换
|
|
|
+ _mapper.Map(dto, type);
|
|
|
+ //如果更改了名称或者修改了层级,则修改全称,未更改不修改
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ string FullName = await GetFullName(type.ParentId);//获取分类名称全称
|
|
|
+ type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;//处理全称,如果为第一级直接用全称,否则获取全称后拼接名称
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改数据
|
|
|
+ await _planTypeRepository.UpdateAsync(type, cancellationToken);
|
|
|
+
|
|
|
+ //如果修改了名称,对应修改子分类全称
|
|
|
+ if (result)
|
|
|
+ await UpdateChildNode(type.Id);
|
|
|
+
|
|
|
+ // 修改关联机构
|
|
|
+ await _planTypeOrgRepository.RemoveAsync(x => x.TypeId == type.Id, false, cancellationToken);
|
|
|
+ if (dto.TypeOrgDtos != null && dto.TypeOrgDtos.Any())
|
|
|
+ {
|
|
|
+ List<PlanTypeOrg> orgs = _mapper.Map<List<PlanTypeOrg>>(dto.TypeOrgDtos);
|
|
|
+ orgs.ForEach(x => x.TypeId = type.Id);
|
|
|
+ await _planTypeOrgRepository.AddRangeAsync(orgs, cancellationToken);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 预案库类型 - 删除
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 预案库类型 - 删除
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Id"></param>
|
|
|
+ /// <param name="cancellationToken"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task RemoveType(string Id, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ //查询数据是否存在
|
|
|
+ var sandard = await _planTypeRepository.GetAsync(p => p.Id == Id && p.IsDeleted == false, cancellationToken);
|
|
|
+ if (sandard is null)
|
|
|
+ throw UserFriendlyException.SameMessage("分类不存在!");
|
|
|
+
|
|
|
+ //查询是否有子级分类
|
|
|
+ var checkChild = await _planTypeRepository.CountAsync(p => p.ParentId == Id && p.IsDeleted == false, cancellationToken);
|
|
|
+ if (checkChild > 0)
|
|
|
+ throw UserFriendlyException.SameMessage("存在子级分类!");
|
|
|
+
|
|
|
+ //查询是否有知识分类
|
|
|
+ var checkKnowledge = await _planListRepository.CountAsync(p => p.PlanTypes.Any(t => t.PlanId == Id), cancellationToken);
|
|
|
+ if (checkKnowledge > 0)
|
|
|
+ throw UserFriendlyException.SameMessage("分类存在预案!");
|
|
|
+
|
|
|
+ //删除操作
|
|
|
+ await _planTypeRepository.RemoveAsync(sandard, true, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 预案库管理
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 预案库 - 列表
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="pagedDto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ //public async Task<(int, IList<KnowledgeDataDto>)> GetKnowList(KnowPagedListDto pagedDto, CancellationToken cancellationToken)
|
|
|
+ //{
|
|
|
+ // if (!_sessionContext.OrgIsCenter)
|
|
|
+ // {
|
|
|
+ // pagedDto.Attribution = "部门知识库";
|
|
|
+ // }
|
|
|
+ // var typeSpliceName = string.Empty;
|
|
|
+ // var hotspotHotSpotFullName = string.Empty;
|
|
|
+ // if (!string.IsNullOrEmpty(pagedDto.KnowledgeTypeId))
|
|
|
+ // {
|
|
|
+ // var type = await _planTypeRepository.GetAsync(x => x.Id == pagedDto.KnowledgeTypeId);
|
|
|
+ // typeSpliceName = type?.SpliceName;
|
|
|
+ // }
|
|
|
+ // if (!string.IsNullOrEmpty(pagedDto.HotspotId))
|
|
|
+ // {
|
|
|
+ // var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
|
|
|
+ // hotspotHotSpotFullName = hotspot?.HotSpotFullName;
|
|
|
+ // }
|
|
|
+ // var (total, temp) = await _knowledgeRepository.Queryable(false, false, false)
|
|
|
+ // .Includes(x => x.User)
|
|
|
+ // .Includes(x => x.SystemOrganize)
|
|
|
+ // .Includes(x => x.SourceOrganize)
|
|
|
+ // .Includes(x => x.HotspotType)
|
|
|
+ // .Includes(x => x.Workflow)
|
|
|
+ // .Includes(x => x.KnowledgeType)
|
|
|
+ // .Where(x => x.IsDeleted == false)
|
|
|
+ // .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
|
|
|
+ // .Where(x => (x.Status == EKnowledgeStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EKnowledgeStatus.Drafts))
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!))
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), x => x.Title.Contains(pagedDto.Keyword!) || x.CreatorName.Contains(pagedDto.Keyword!) || x.CreatorOrgName.Contains(pagedDto.Keyword!) || x.SourceOrganize.Name.Contains(pagedDto.Keyword!))
|
|
|
+ // .WhereIF(pagedDto.Status.HasValue && pagedDto.Status != EKnowledgeStatus.OffShelf && pagedDto.Status != EKnowledgeStatus.NewDrafts && pagedDto.Status != EKnowledgeStatus.All, x => x.Status == pagedDto.Status && ((x.ExpiredTime != null && x.ExpiredTime > DateTime.Now) || x.ExpiredTime == null))
|
|
|
+ // .WhereIF(pagedDto.Status.HasValue && pagedDto.Status == EKnowledgeStatus.OffShelf, x => x.Status == pagedDto.Status || (x.ExpiredTime != null && x.ExpiredTime < DateTime.Now && x.Status != EKnowledgeStatus.Drafts))
|
|
|
+ // .WhereIF(pagedDto.IsPublic.HasValue, x => x.IsPublic == pagedDto.IsPublic)
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(pagedDto.Summary), x => x.Summary != null && x.Summary.Contains(pagedDto.Summary!))
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => x.KnowledgeType.Any(t => t.KnowledgeTypeSpliceName.StartsWith(typeSpliceName)))
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(hotspotHotSpotFullName), x => x.HotspotType.HotSpotFullName.EndsWith(hotspotHotSpotFullName!))
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.StartsWith(pagedDto.CreateOrgId!))
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(pagedDto.ModuleCode), x => x.Workflow.ModuleCode == pagedDto.ModuleCode)
|
|
|
+ // .WhereIF(pagedDto.Status == EKnowledgeStatus.NewDrafts, x => x.Status == EKnowledgeStatus.Drafts || x.Status == EKnowledgeStatus.Revert)
|
|
|
+ // .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Drafts, x => x.Status == EKnowledgeStatus.Drafts)
|
|
|
+ // .WhereIF(pagedDto.NewDraftsStatus is EKnowledgeStatus.Revert, x => x.Status == EKnowledgeStatus.Revert)
|
|
|
+
|
|
|
+ // .WhereIF(pagedDto.CreationStartTime.HasValue, x => x.CreationTime >= pagedDto.CreationStartTime)
|
|
|
+ // .WhereIF(pagedDto.CreationEndTime.HasValue, x => x.CreationTime <= pagedDto.CreationEndTime)
|
|
|
+
|
|
|
+ // .WhereIF(pagedDto.StartOnShelfTime.HasValue, x => x.OnShelfTime >= pagedDto.StartOnShelfTime)
|
|
|
+ // .WhereIF(pagedDto.EndOnShelfTime.HasValue, x => x.OnShelfTime <= pagedDto.EndOnShelfTime)
|
|
|
+
|
|
|
+ // .WhereIF(pagedDto.StartOffShelfTime.HasValue, x => x.OffShelfTime >= pagedDto.StartOffShelfTime)
|
|
|
+ // .WhereIF(pagedDto.EndOffShelfTime.HasValue, x => x.OffShelfTime <= pagedDto.EndOffShelfTime)
|
|
|
+
|
|
|
+ // .WhereIF(pagedDto.StartUpdateTime.HasValue, x => x.LastModificationTime >= pagedDto.StartUpdateTime)
|
|
|
+ // .WhereIF(pagedDto.EndUpdateTime.HasValue, x => x.LastModificationTime <= pagedDto.EndUpdateTime)
|
|
|
+ // .WhereIF(!string.IsNullOrEmpty(pagedDto.Attribution), x => x.Attribution == pagedDto.Attribution)
|
|
|
+ // .OrderByDescending(d => d.CreationTime)
|
|
|
+ // .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
|
|
|
+ // //返回数据
|
|
|
+ // return (total, _mapper.Map<IList<KnowledgeDataDto>>(temp));
|
|
|
+ //}
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ #region 私有方法
|
|
|
+
|
|
|
+ #region 查询所有子级
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 查询所有子级
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="treeDatas">分类数据</param>
|
|
|
+ /// <param name="ID">需要查询哪级下面的分类</param>
|
|
|
+ /// <param name="checkId">选中的数据ID</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private List<TreeListDto> GetChildren(List<PlanType> treeDatas, string ID, string? checkId)
|
|
|
+ {
|
|
|
+ List<TreeListDto> nodeList = new();
|
|
|
+ //根据ID查询子级
|
|
|
+ var children = treeDatas.Where(q => q.ParentId == ID);
|
|
|
+ foreach (var dr in children)
|
|
|
+ {
|
|
|
+ //组装数据
|
|
|
+ TreeListDto node = new()
|
|
|
+ {
|
|
|
+ name = dr.Name,
|
|
|
+ ParentID = dr.ParentId,
|
|
|
+ value = dr.Id,
|
|
|
+ IsEnable = dr.IsEnable
|
|
|
+ };
|
|
|
+ //是否选中
|
|
|
+ if (!string.IsNullOrEmpty(checkId) && checkId != Guid.Empty.ToString() && checkId == dr.Id)
|
|
|
+ node.selected = true;
|
|
|
+ //子级数据赋值
|
|
|
+ node.children = GetChildren(treeDatas, node.value, checkId);
|
|
|
+ //添加数据
|
|
|
+ nodeList.Add(node);
|
|
|
+ }
|
|
|
+ return nodeList;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 获取全称
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取全称
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<string> GetFullName(string? Id)
|
|
|
+ {
|
|
|
+ //获取全部父级名称
|
|
|
+ var list = await GetParentNode(Id);
|
|
|
+ //倒叙
|
|
|
+ list.Reverse();
|
|
|
+ //拆分
|
|
|
+ return string.Join("-", list.ToArray());
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 查询父级名称
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<List<string>> GetParentNode(string? Id)
|
|
|
+ {
|
|
|
+ List<string> list = new();
|
|
|
+ //查询父级数据
|
|
|
+ var type = await _planTypeRepository.GetAsync(p => p.Id == Id);
|
|
|
+ if (type != null)
|
|
|
+ {
|
|
|
+ //添加名称
|
|
|
+ list.Add(type.Name);
|
|
|
+ list.AddRange(await GetParentNode(type.ParentId));
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 修改子级分类全称
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 修改子级分类全称
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task UpdateChildNode(string Id)
|
|
|
+ {
|
|
|
+ //查询子分类
|
|
|
+ var list = await GetChildNode(Id);
|
|
|
+ if (list is not null && list.Count > 0)
|
|
|
+ {
|
|
|
+ foreach (var item in list)
|
|
|
+ {
|
|
|
+ //获取全称
|
|
|
+ string FullName = await GetFullName(item.ParentId);
|
|
|
+ item.SpliceName = string.IsNullOrEmpty(FullName) ? item.Name : FullName + "-" + item.Name;
|
|
|
+ //修改全称
|
|
|
+ await _planTypeRepository.UpdateAsync(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 查询子级节点数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="Id"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<List<PlanType>> GetChildNode(string Id)
|
|
|
+ {
|
|
|
+ List<PlanType> list = new();
|
|
|
+ //查询数据
|
|
|
+ var typelist = await _planTypeRepository.QueryAsync(p => p.ParentId == Id);
|
|
|
+ if (typelist != null)
|
|
|
+ {
|
|
|
+ //处理数据
|
|
|
+ foreach (var item in typelist)
|
|
|
+ {
|
|
|
+ list.Add(item);
|
|
|
+ list.AddRange(await GetChildNode(item.Id));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+}
|