using Hotline.FlowEngine.Workflows;
using Hotline.Settings;
using Hotline.Share.Dtos.Knowledge;
using Hotline.Share.Enums.KnowledgeBase;
using MapsterMapper;
using SqlSugar;
using XF.Domain.Dependency;
using XF.Domain.Exceptions;
namespace Hotline.KnowledgeBase
{
public class KnowledgeDomainService : IKnowledgeDomainService, IScopeDependency
{
private readonly IKnowledgeRepository _knowledgeRepository;
private readonly IKnowledgeTempRepository _knowledgeTempRepository;
private readonly IMapper _mapper;
private readonly IKnowledgePVRepository _knowledgePVRepository;
private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
private readonly IWorkflowDomainService _workflowDomainService;
private readonly IKnowledgeApplyRepository _knowledgeApplyRepository;
///
///
///
///
///
///
///
///
///
public KnowledgeDomainService(IKnowledgeRepository knowledgeRepository, IKnowledgeTempRepository knowledgeTempRepository, IMapper mapper, IKnowledgePVRepository knowledgePVRepository, IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository
, IWorkflowDomainService workflowDomainService, IKnowledgeApplyRepository knowledgeApplyRepository)
{
_knowledgeRepository = knowledgeRepository;
_mapper = mapper;
_knowledgeTempRepository = knowledgeTempRepository;
_knowledgePVRepository = knowledgePVRepository;
_knowledgeWorkFlowRepository = knowledgeWorkFlowRepository;
_workflowDomainService = workflowDomainService;
_knowledgeApplyRepository = knowledgeApplyRepository;
}
///
/// 知识库-查询详情-增加浏览量
///
///
///
public async Task KnowledgeInfo(string Id, CancellationToken cancellationToken)
{
var know = await _knowledgeRepository.GetAsync(Id, cancellationToken);
if (know is null)
throw UserFriendlyException.SameMessage("知识查询失败!");
return know;
}
///
/// 浏览记录写入
///
///
///
///
public async Task KnowledgePvIncreaseAsync(Knowledge know, CancellationToken cancellationToken)
{
//写入浏览记录
KnowledgePv knowledgePv = new()
{
CreationTime = DateTime.Now,
KnowledgeCode = know.Code
};
//浏览记录写入
await _knowledgePVRepository.AddAsync(knowledgePv, cancellationToken);
//修改浏览量
know.PageView++;
//修改点击量
await _knowledgeRepository.UpdateAsync(know, cancellationToken);
}
///
/// 知识审批主表
///
/// 知识Id
/// 流程ID
/// 申请类型
///
///
public async Task AddWorkFlow(string knowId, string workFlowId, EKnowledgeApplyType eKnowledgeApplyType, CancellationToken cancellationToken)
{
KnowledgeWorkFlow workFlow = new()
{
KnowledgeId = knowId,
WorkflowModuleStatus = eKnowledgeApplyType,
WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Auditing,
WorkflowId = workFlowId
};
return await _knowledgeWorkFlowRepository.AddAsync(workFlow, cancellationToken);
}
///
/// 修改流程ID
///
///
///
///
///
public async Task UpdateWorkFlowId(string knowledgeId, string workFlowId, CancellationToken cancellationToken)
{
var knowledge = await _knowledgeRepository.GetAsync(knowledgeId, cancellationToken);
knowledge.WorkflowId = workFlowId;
await _knowledgeRepository.UpdateAsync(knowledge, cancellationToken);
}
///
/// 知识库-新增
///
///
///
public async Task KnowledgeAdd(AddKnowledgeDto dto, CancellationToken cancellationToken)
{
var kn = _mapper.Map(dto);
//知识草稿ID如果不为空,则表示是草稿箱的数据
if (!string.IsNullOrEmpty(dto.Code))
{
//移除草稿箱数据
await _knowledgeTempRepository.RemoveAsync(p => p.Code == dto.Code, false, cancellationToken);
}
//如果草稿箱不存在数据,也就是Code为空,从新生成Code
if (string.IsNullOrEmpty(kn.Code))
kn.Code = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds).ToString();
kn.Status = EKnowledgeStatus.Auditing;
var knowledgeId = await _knowledgeRepository.AddAsync(kn, cancellationToken);
if (!string.IsNullOrEmpty(dto.Applies))
{
var apply = await _knowledgeApplyRepository.GetAsync(p => p.Id == dto.Applies, cancellationToken);
if (apply != null)
{
apply.KnowledgeId = knowledgeId;
await _knowledgeApplyRepository.UpdateAsync(apply, cancellationToken);
}
}
return knowledgeId;
}
///
/// 知识库-修改
///
///
///
public async Task KnowledgeUpdate(UpdateKnowledgeDto dto, CancellationToken cancellationToken)
{
//知识修改逻辑
//如果可以修改,此条数据不动,重新写入一条新数据,知识编号不变,版本号+1,审批通过以后在数据交换
var know = await _knowledgeRepository.GetAsync(dto.Id, cancellationToken);
if (know is null || know.IsDeleted)
throw UserFriendlyException.SameMessage("无效知识");
//审批中数据不能处理
if (know.Status == EKnowledgeStatus.Auditing)
throw UserFriendlyException.SameMessage("审批中数据不能修改");
var knowledge = _mapper.Map(dto);
knowledge.Code = know.Code;
knowledge.PageView = know.PageView;
knowledge.Status = EKnowledgeStatus.Auditing;
knowledge.Id = "";
knowledge.Version = 0;
var knowledgeId = await _knowledgeRepository.AddAsync(knowledge, cancellationToken);
if (!string.IsNullOrEmpty(dto.Applies))
{
var apply = await _knowledgeApplyRepository.GetAsync(p => p.Id == dto.Applies, cancellationToken);
if (apply != null)
{
apply.KnowledgeId = knowledgeId;
await _knowledgeApplyRepository.UpdateAsync(apply, cancellationToken);
}
}
//新增一条数据
return knowledgeId;
}
///
/// 撤销
///
///
///
///
public async Task KnowledgeRevoke(string workFlowId, CancellationToken cancellationToken)
{
var knowWorkFlow = await _knowledgeWorkFlowRepository.GetAsync(p => p.WorkflowId == workFlowId, cancellationToken);
if (knowWorkFlow is null)
throw UserFriendlyException.SameMessage("无效知识审批");
if (knowWorkFlow.WorkFlowApplyStatus != EKnowledgeWorkFlowStatus.Auditing)
throw UserFriendlyException.SameMessage("只有审批中的知识才能撤回!");
knowWorkFlow.WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Revoke;
await _knowledgeWorkFlowRepository.UpdateAsync(knowWorkFlow);
switch (knowWorkFlow.WorkflowModuleStatus)
{
case EKnowledgeApplyType.Add:
case EKnowledgeApplyType.Update:
//查询知识
var knowledge = await _knowledgeRepository.GetAsync(p => p.WorkflowId == workFlowId, cancellationToken);
if (knowledge != null)
{
//将知识保存到草稿箱
var tempKnow = _mapper.Map(knowledge);
await _knowledgeTempRepository.AddAsync(tempKnow, cancellationToken);
knowledge.Status = EKnowledgeStatus.Revert;
//删除现有知识
await _knowledgeRepository.UpdateAsync(knowledge, cancellationToken);
}
break;
}
//调用终止流程
await _workflowDomainService.TerminateAsync(workFlowId, cancellationToken);
}
///
/// 获取关键词
///
///
public async Task> GetKeyWord()
{
var temp = await _knowledgeRepository
.Queryable()
.Where(p => p.IsDeleted == false && p.Status == EKnowledgeStatus.OnShelf)
.Select((p) => new
{
index = SqlFunc.RowNumber($"{p.Version} desc ", $"{p.Code}"),
p.Version,
p.PageView,
p.Keywords
})
//将结果合并成一个表
.MergeTable()
//取第一条数据
.Where(d => d.index == 1 && d.Keywords != null && d.Keywords != "")
//根据点击量在排序
.OrderByDescending(p => p.PageView)
.Take(10)//取前10条
.ToListAsync();
//将数据组装到集合
List strList = new();
temp.ForEach(p =>
{
if (!string.IsNullOrEmpty(p.Keywords))
strList.AddRange(p.Keywords.Split(',').ToList());//添加数据
});
//取10条数据返回
return strList.Distinct().Take(10).ToList();
}
///
/// 流程审批完成,处理知识状态
///
///
///
///
///
public async Task EndWorkKnowledge(Workflow workflow, CancellationToken cancellationToken)
{
var knowledge = await _knowledgeRepository.GetAsync(p => p.WorkflowId == workflow.Id, cancellationToken);
if (knowledge == null)
throw new UserFriendlyException($"知识查询失败, workflowId: {workflow.Id}", "无效流程编号");
//修改主表审批状态
var workFlow = await _knowledgeWorkFlowRepository.GetAsync(p => p.WorkflowId == workflow.Id, cancellationToken);
if (workFlow != null)
{
workFlow.HandleTime = DateTime.Now;
workFlow.WorkFlowApplyStatus = EKnowledgeWorkFlowStatus.Success;
await _knowledgeWorkFlowRepository.UpdateAsync(workFlow, cancellationToken);
}
switch (workflow.ModuleCode)
{
case WorkflowModuleConsts.KnowledgeAdd://新增
//修改知识状态为已上架
knowledge.Status = EKnowledgeStatus.OnShelf;
knowledge.OnShelfTime = System.DateTime.Now;
await _knowledgeRepository.UpdateAsync(knowledge, cancellationToken);
break;
case WorkflowModuleConsts.KnowledgeUpdate://修改
//处理知识版本号
//根据Code查询目前使用的版本号,版本号+1
var oldKnowledge = await _knowledgeRepository
.Queryable()
.Where(p => p.Code == knowledge.Code && p.Status != EKnowledgeStatus.Auditing && p.Status != EKnowledgeStatus.Failed && p.IsDeleted == false)
.OrderByDescending(p => p.Version)
.Take(1)
.FirstAsync();
if (oldKnowledge == null)
knowledge.Version = 1;
else
knowledge.Version = oldKnowledge.Version + 1;
//修改知识状态为已上架
knowledge.Status = EKnowledgeStatus.OnShelf;
knowledge.OnShelfTime = System.DateTime.Now;
await _knowledgeRepository.UpdateAsync(knowledge, cancellationToken);
break;
case WorkflowModuleConsts.KnowledgeDelete://删除
//知识先下架,在删除
knowledge.Status = EKnowledgeStatus.OffShelf;
knowledge.OffShelfTime = System.DateTime.Now;
knowledge.WorkflowId = workflow.Id;
await _knowledgeRepository.UpdateAsync(knowledge, cancellationToken);
//删除知识
await _knowledgeRepository.RemoveAsync(p => p.Code == knowledge.Code, true, cancellationToken);
break;
}
}
}
}