using MapsterMapper;
using Microsoft.AspNetCore.Mvc;
using XF.Domain.Authentications;
using XF.Domain.Repository;
using Hotline.Application.Planlibrary;
using Hotline.Share.Dtos.Planlibrary;
using SqlSugar;
using Hotline.Planlibrary;
using XF.Domain.Exceptions;
using Hotline.Share.Dtos;
using Hotline.Share.Tools;
using Hotline.Share.Enums.Planlibrary;
using Hotline.Application.ExportWord;
using Hotline.Application.Tools;
using Hotline.Share.Enums.Article;
using XF.Utility.EnumExtensions;
using Hotline.Share.Dtos.Order;
using Hotline.Application.ExportExcel;
namespace Hotline.Api.Controllers
{
///
/// 预案库
///
public class PlanController : BaseController
{
#region 注入
private readonly IMapper _mapper;
private readonly ISessionContext _sessionContext;
private readonly IPlanApplication _planApplication;
private readonly IRepository _planTypeRepository;
private readonly IRepository _planListRepository;
private readonly IRepository _planCollectRepository;
private readonly IWordHelperService _wordHelperService;
private readonly IExportApplication _exportApplication;
public PlanController(
IMapper mapper,
ISessionContext sessionContext,
IPlanApplication planApplication,
IRepository planTypeRepository,
IRepository planListRepository,
IRepository planCollectRepository,
IWordHelperService wordHelperService,
IExportApplication exportApplication)
{
_mapper = mapper;
_sessionContext = sessionContext;
_planApplication = planApplication;
_planTypeRepository = planTypeRepository;
_planListRepository = planListRepository;
_planCollectRepository = planCollectRepository;
_wordHelperService = wordHelperService;
_exportApplication = exportApplication;
}
#endregion
#region 预案库类型管理
///
/// 获取列表层级分类
///
/// 是否启用
///
[HttpGet("type/treelist")]
public async Task> QueryAllTreeList(bool? IsEnable)
{
return await _planTypeRepository.Queryable()
.WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable)
.Where(x => SqlFunc.Subqueryable().Where(to => to.TypeId == x.Id).Any() ||
SqlFunc.Subqueryable().Where(to => to.TypeId == x.Id).NotAny()
)
.Select(x => new PlanTypeDto()
{
Id = x.Id.SelectAll()
}
)
.OrderBy(x => x.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id);
}
///
/// 新增
///
///
///
[HttpPost("type/add")]
public async Task AddType([FromBody] AddPlanTypeDto dto)
{
return await _planApplication.AddTypeAsync(dto, HttpContext.RequestAborted);
}
///
/// 编辑
///
///
///
[HttpPut("type/update")]
public async Task UpdateType([FromBody] UpdatePlanTypeDto dto)
{
await _planApplication.UpdateTypeAsync(dto, HttpContext.RequestAborted);
}
///
/// 查询详情
///
///
///
[HttpGet("type/info/{Id}")]
public async Task GetType(string Id)
{
var types = await _planTypeRepository.Queryable()
.Includes(x => x.PlanTypeOrgs) // 填充子对象
.Where(x => x.Id == Id)
.FirstAsync(HttpContext.RequestAborted);
if (types is null)
throw UserFriendlyException.SameMessage("查询失败!");
return types;
}
///
/// 删除
///
///
///
[HttpDelete("type/remove/{Id}")]
public async Task RemoveType(string Id)
{
await _planApplication.RemoveTypeAsync(Id, HttpContext.RequestAborted);
}
#endregion
#region 预案库管理
///
/// 预案库分类列表
///
///
///
[HttpGet("list/treelist")]
public async Task> QueryAllPlanTypeTreeList(bool? IsEnable)
{
return await _planTypeRepository.Queryable()
.WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable)
.Where(x => SqlFunc.Subqueryable().Where(to => to.TypeId == x.Id).Any() ||
SqlFunc.Subqueryable().Where(to => to.TypeId == x.Id).NotAny()
)
.Select(x => new PlanTypeDto()
{
Id = x.Id.SelectAll(),
PlanNum = SqlFunc.Subqueryable().LeftJoin((kr, k) => kr.PlanId == k.Id)
.Where((kr, k) => kr.PlanTypeId == x.Id)
.DistinctCount(kr => kr.PlanId)
}
)
.OrderBy(x => x.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id);
}
///
/// 预案库列表
///
///
///
[HttpGet("list")]
public async Task> QueryAllPlanList([FromQuery] PlanListDto pagedDto)
{
return (await _planApplication.QueryAllPlanListAsync(pagedDto, HttpContext.RequestAborted)).ToPaged();
}
///
/// 预案库草稿
///
///
///
[HttpPost("list/draft")]
public async Task PlanDraft([FromBody] AddPlanListDto dto)
{
dto.Status = EPlanStatus.NewDrafts;
return await _planApplication.AddPlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库草稿修改
///
///
///
[HttpPut("list/draftupdate")]
public async Task UpdatePlanDraft([FromBody] UpdatePlanListDto dto)
{
dto.Status = EPlanStatus.NewDrafts;
await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库草稿到审核
///
///
///
[HttpPut("list/draftadd")]
public async Task AddPlanDraft([FromBody] UpdatePlanListDto dto)
{
dto.ApplyStatus = EPlanApplyStatus.Add;
dto.Status = EPlanStatus.OnShelf;
await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库草稿删除
///
///
///
[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);
}
///
/// 预案库删除到审核
///
///
///
[HttpDelete("list/remove")]
public async Task RemovePlan([FromBody] DelPlanListDto dtoDel)
{
UpdatePlanListDto dto = new UpdatePlanListDto();
dto.ApplyStatus = EPlanApplyStatus.Delete;
dto.Status = EPlanStatus.Auditing;
dto.Id = dtoDel.Id;
dto.ApplyReason = dtoDel.ApplyReason;
await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库新增到审核
///
///
///
[HttpPost("list/add")]
public async Task AddPlan([FromBody] AddPlanListDto dto)
{
dto.ApplyStatus = EPlanApplyStatus.Add;
dto.Status = EPlanStatus.Auditing;
return await _planApplication.AddPlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库编辑提交到审核
///
///
///
[HttpPut("list/update")]
public async Task UpdatePlan([FromBody] UpdatePlanListDto dto)
{
dto.ApplyStatus = EPlanApplyStatus.Update;
dto.Status = EPlanStatus.Auditing;
await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库上架
///
/// 预案库ID
///
[HttpGet("list/onshelf/{Id}")]
public async Task OnshelfPlan(string Id)
{
UpdatePlanListDto dto = new UpdatePlanListDto();
dto.Id = Id;
dto.ApplyStatus = EPlanApplyStatus.Add;
dto.Status = EPlanStatus.OnShelf;
dto.OnShelfTime = DateTime.Now;
await _planApplication.AuditPlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库下架
///
/// 预案库ID
///
[HttpGet("list/offshelf/{Id}")]
public async Task OffshelfPlan(string Id)
{
UpdatePlanListDto dto = new UpdatePlanListDto();
dto.Id = Id;
dto.ApplyStatus = EPlanApplyStatus.Offshelf;
dto.Status = EPlanStatus.OffShelf;
dto.OffShelfTime = DateTime.Now;
await _planApplication.AuditPlanAsync(dto, HttpContext.RequestAborted);
}
///
/// 预案库审核(新增、修改、删除)
///
///
///
[HttpPut("list/examin")]
public async Task ExaminPlan([FromBody] AuditPlanListDto dto)
{
var plan = await _planListRepository.GetAsync(dto.Id);
if (plan == null)
throw UserFriendlyException.SameMessage("预案库查询失败");
var planDto = _mapper.Map(plan);
if (dto.State == 0)
{//不同意
planDto.Status = EPlanStatus.Revert;
}
else if (dto.State == 1)
{//同意
if (planDto.ApplyStatus == EPlanApplyStatus.Add)
{
planDto.Status = EPlanStatus.OnShelf;
planDto.OnShelfTime = DateTime.Now;
}
if (planDto.ApplyStatus == EPlanApplyStatus.Update)
{
planDto.Status = EPlanStatus.OnShelf;
planDto.OnShelfTime = DateTime.Now;
planDto.UpdateTime = DateTime.Now;
}
if (planDto.ApplyStatus == EPlanApplyStatus.Offshelf)
{
planDto.Status = EPlanStatus.OffShelf;
planDto.OffShelfTime = DateTime.Now;
}
if (planDto.ApplyStatus == EPlanApplyStatus.Delete)
{
planDto.Status = EPlanStatus.Drafts;
}
}
planDto.Id = dto.Id;
planDto.ExaminTime = DateTime.Now;
planDto.ExaminManId = _sessionContext.UserId;
planDto.ExaminOrganizeId = _sessionContext.OrgId;
planDto.ExaminOpinion = dto.ExaminOpinion;
await _planApplication.AuditPlanAsync(planDto, HttpContext.RequestAborted);
}
///
/// 预案库详情
///
///
///
///
[HttpGet("list/info")]
public async Task GetPlan(string Id, bool IsAddPv)
{
return await _planApplication.GetPlanAsync(Id, IsAddPv, HttpContext.RequestAborted);
}
///
/// 预案库申请理由
///
/// 预案库ID
///
[HttpGet("list/reason/{Id}")]
public async Task ReasonPlan(string Id)
{
var reason = await _planListRepository.GetAsync(x => x.Id == Id);
return _mapper.Map(reason);
}
///
/// 预案库评分
///
///
///
[HttpPut("list/score")]
public async Task ScorePlan([FromBody] PvPlanListDto dto)
{
var collect = await _planCollectRepository.GetAsync(x => x.PlanId == dto.Id && x.CreatorId == _sessionContext.UserId);
if (collect != null)
{
if (collect.Score > 0)
throw UserFriendlyException.SameMessage("当前知识已经评分");
collect.Score = dto.Score;
await _planCollectRepository.UpdateAsync(collect, HttpContext.RequestAborted);
}
else
{
collect = new PlanCollect();
collect.PlanId = dto.Id;
collect.Score = dto.Score;
await _planCollectRepository.AddAsync(collect, HttpContext.RequestAborted);
}
//计算总分
var sugar = _planCollectRepository.Queryable().Where(x => x.PlanId == dto.Id);
var count = await sugar.CountAsync();
var collects = await sugar.SumAsync(x => x.Score);
var scoreTemp = collects / count;
var plan = await _planListRepository.GetAsync(x => x.Id == dto.Id);
if (plan != null)
{
plan.Score = decimal.Round(scoreTemp.Value, 1);
await _planListRepository.UpdateAsync(plan, HttpContext.RequestAborted);
}
}
///
/// 预案库查重
///
///
///
[HttpPost("list/exist")]
public async Task ExistPlan([FromBody] PlanExistDto dto)
{
var any = await _planListRepository.Queryable()
.Where(x => x.Status == EPlanStatus.Auditing || x.Status >= EPlanStatus.OnShelf)
.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Equals(dto.Title))
.WhereIF(!string.IsNullOrEmpty(dto.Content), x => x.Content.Equals(dto.Content))
.WhereIF(!string.IsNullOrEmpty(dto.Id), x => x.Id != dto.Id)
.AnyAsync();
return any;
}
///
/// 预案库详情导出
///
///
///
[HttpPost("list/info/export")]
public async Task PlanInfoExport([FromBody] PlanInfoExportDto dto)
{
if (dto.Ids.Length > 1)
{
var streams = await _planApplication.PlanInfoListExportAsync(dto, HttpContext.RequestAborted);
byte[] fileBytes = _wordHelperService.ConvertZipStream(streams);
var name = DateTime.Now.ToString("yyyyMMddHHmmss");
return File(fileBytes, "application/octet-stream", $"{name}.zip");
}
var info = await _planListRepository.GetAsync(dto.Ids[0]) ?? throw UserFriendlyException.SameMessage("预案不存在");
return info.Content.HtmlToStream(dto.FileType).GetFileStreamResult(dto.FileType, info.Title, false);
}
///
/// 预案库列表导出
///
///
///
[HttpPost("export")]
public async Task GetPlanListExportAsync([FromBody] ExportExcelDto dto)
{
var items = (await _planApplication.QueryAllPlanListAsync(dto.QueryDto, HttpContext.RequestAborted)).Item2;
return _exportApplication.GetExcelFile(dto, items, "预案明细导出");
}
///
/// 预案库列表页面枚举值
///
///
[HttpGet("list/status-data")]
public Dictionary PlanStatus()
{
var tabStatusName = new List>
{
new KeyValuePair(3, "已上架"),
new KeyValuePair(4, "已下架"),
new KeyValuePair(1, "审核中"),
new KeyValuePair(7, "草稿"),
new KeyValuePair(-1, "全部")
};
var tabExamineName = new List>
{
new KeyValuePair(-1, "全部"),
new KeyValuePair(0, "新增审核"),
new KeyValuePair(1, "修改审核"),
new KeyValuePair(2, "删除审核")
};
var StatusName = new List>
{
new KeyValuePair(-1, "全部"),
new KeyValuePair(0, "待提交"),
new KeyValuePair(1, "审核中"),
new KeyValuePair(3, "已上架"),
new KeyValuePair(4, "已下架"),
new KeyValuePair(5, "审核不通过"),
new KeyValuePair(6, "已过期"),
new KeyValuePair(7, "草稿")
};
var ApplyStatusName = new List>
{
new KeyValuePair(-1, "全部"),
new KeyValuePair(0, "新增审核"),
new KeyValuePair(1, "修改审核"),
new KeyValuePair(2, "删除审核")
};
var ignoreFileType = EFileType.excel | EFileType.pdf;
var items = EnumExts.GetDescriptions();
var filteredDictionary = items
.Where(kvp => (ignoreFileType & (EFileType)kvp.Key) == 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
.ToList();
return new Dictionary
{
{ "fileType", filteredDictionary},
{ "tabStatusName", tabStatusName },
{ "tabExamineName", tabExamineName },
{ "StatusName", StatusName },
{ "ApplyStatusName", ApplyStatusName }
};
}
#endregion
#region 预案库检索
///
/// 检索列表
///
///
///
[HttpGet("search")]
public async Task> QueryOnShelfPlanList([FromQuery] PlanListDto pagedDto)
{
pagedDto.Status = EPlanStatus.OnShelf;
return (await _planApplication.QueryAllPlanListAsync(pagedDto, HttpContext.RequestAborted)).ToPaged();
}
///
/// 检索列表前10
///
///
[HttpGet("search/top10")]
public async Task> QueryTop10PlanList()
{
return await _planListRepository.Queryable()
.Take(10)
.Where(x => x.Status == EPlanStatus.OnShelf)
.Select(x => new PlanPageViewDto
{
Id = x.Id,
Title = x.Title,
PageView = x.PageView
})
.OrderBy(x => x.PageView, OrderByType.Desc)
.ToListAsync();
}
#endregion
}
}