This commit is contained in:
ky_sunl
2021-04-22 13:37:25 +00:00
parent 575a22954f
commit d1c9e5a71e
699 changed files with 1062425 additions and 40640 deletions

View File

@@ -0,0 +1,60 @@
using System;
namespace Dilon.Core.Service
{
/// <summary>
/// 通知公告参数
/// </summary>
public class NoticeBase
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 类型(字典 1通知 2公告
/// </summary>
public int Type { get; set; }
/// <summary>
/// 发布人Id
/// </summary>
public long PublicUserId { get; set; }
/// <summary>
/// 发布人姓名
/// </summary>
public string PublicUserName { get; set; }
/// <summary>
/// 发布机构Id
/// </summary>
public long PublicOrgId { get; set; }
/// <summary>
/// 发布机构名称
/// </summary>
public string PublicOrgName { get; set; }
/// <summary>
/// 发布时间
/// </summary>
public DateTimeOffset PublicTime { get; set; }
/// <summary>
/// 撤回时间
/// </summary>
public DateTimeOffset CancelTime { get; set; }
/// <summary>
/// 状态(字典 0草稿 1发布 2撤回 3删除
/// </summary>
public int Status { get; set; }
}
}

View File

@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
namespace Dilon.Core.Service
{
/// <summary>
/// 系统通知公告详情参数
/// </summary>
public class NoticeDetailOutput : NoticeBase
{
/// <summary>
/// 通知到的用户Id集合
/// </summary>
public List<string> NoticeUserIdList { get; set; }
/// <summary>
/// 通知到的用户阅读信息集合
/// </summary>
public List<NoticeUserRead> NoticeUserReadInfoList { get; set; }
}
public class NoticeUserRead
{
/// <summary>
/// 用户Id
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 状态(字典 0未读 1已读
/// </summary>
public int ReadStatus { get; set; }
/// <summary>
/// 阅读时间
/// </summary>
public DateTimeOffset ReadTime { get; set; }
}
}

View File

@@ -0,0 +1,101 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace Dilon.Core.Service
{
/// <summary>
/// 通知公告参数
/// </summary>
public class NoticeInput : PageInputBase
{
/// <summary>
/// 标题
/// </summary>
public virtual string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public virtual string Content { get; set; }
/// <summary>
/// 类型(字典 1通知 2公告
/// </summary>
public virtual int Type { get; set; }
/// <summary>
/// 状态(字典 0草稿 1发布 2撤回 3删除
/// </summary>
public virtual int Status { get; set; }
/// <summary>
/// 通知到的人
/// </summary>
public virtual List<long> NoticeUserIdList { get; set; }
}
public class AddNoticeInput : NoticeInput
{
/// <summary>
/// 标题
/// </summary>
[Required(ErrorMessage = "标题不能为空")]
public override string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
[Required(ErrorMessage = "内容不能为空")]
public override string Content { get; set; }
/// <summary>
/// 类型(字典 1通知 2公告
/// </summary>
[Required(ErrorMessage = "类型不能为空")]
public override int Type { get; set; }
/// <summary>
/// 状态(字典 0草稿 1发布 2撤回 3删除
/// </summary>
[Required(ErrorMessage = "状态不能为空")]
public override int Status { get; set; }
/// <summary>
/// 通知到的人
/// </summary>
[Required(ErrorMessage = "通知到的人不能为空")]
public override List<long> NoticeUserIdList { get; set; }
}
public class DeleteNoticeInput
{
/// <summary>
/// Id
/// </summary>
[Required(ErrorMessage = "通知公告Id不能为空")]
public long Id { get; set; }
}
public class UpdateNoticeInput : AddNoticeInput
{
/// <summary>
/// Id
/// </summary>
[Required(ErrorMessage = "通知公告Id不能为空")]
public long Id { get; set; }
}
public class QueryNoticeInput : DeleteNoticeInput
{
}
public class ChangeStatusNoticeInput : DeleteNoticeInput
{
/// <summary>
/// 状态(字典 0草稿 1发布 2撤回 3删除
/// </summary>
[Required(ErrorMessage = "状态不能为空")]
public int Status { get; set; }
}
}

View File

@@ -0,0 +1,25 @@
using System;
namespace Dilon.Core.Service
{
/// <summary>
/// 通知公告接收参数
/// </summary>
public class NoticeReceiveOutput : NoticeBase
{
/// <summary>
/// Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 阅读状态(字典 0未读 1已读
/// </summary>
public int ReadStatus { get; set; }
/// <summary>
/// 阅读时间
/// </summary>
public DateTimeOffset ReadTime { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace Dilon.Core.Service.Notice
{
public interface ISysNoticeService
{
Task AddNotice(AddNoticeInput input);
Task ChangeStatus(ChangeStatusNoticeInput input);
Task DeleteNotice(DeleteNoticeInput input);
Task<NoticeDetailOutput> GetNotice([FromQuery] QueryNoticeInput input);
Task<dynamic> QueryNoticePageList([FromQuery] NoticeInput input);
Task<dynamic> ReceivedNoticePageList([FromQuery] NoticeInput input);
Task UpdateNotice(UpdateNoticeInput input);
}
}

View File

@@ -0,0 +1,13 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Dilon.Core.Service.Notice
{
public interface ISysNoticeUserService
{
Task Add(long noticeId, List<long> noticeUserIdList, int noticeUserStatus);
Task<List<SysNoticeUser>> GetNoticeUserListByNoticeId(long noticeId);
Task Read(long noticeId, long userId, int status);
Task Update(long noticeId, List<long> noticeUserIdList, int noticeUserStatus);
}
}

View File

@@ -0,0 +1,224 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Dilon.Core.Service.Notice
{
/// <summary>
/// 通知公告服务
/// </summary>
[ApiDescriptionSettings(Name = "Notice", Order = 100)]
public class SysNoticeService : ISysNoticeService, IDynamicApiController, ITransient
{
private readonly IRepository<SysNotice> _sysNoticeRep; // 通知公告表仓储
private readonly IRepository<SysNoticeUser> _sysNoticeUserRep; // 通知公告用户表仓储
private readonly IUserManager _userManager;
private readonly ISysNoticeUserService _sysNoticeUserService;
public SysNoticeService(IRepository<SysNotice> sysNoticeRep,
IRepository<SysNoticeUser> sysNoticeUserRep,
IUserManager userManager,
ISysNoticeUserService sysNoticeUserService)
{
_sysNoticeRep = sysNoticeRep;
_sysNoticeUserRep = sysNoticeUserRep;
_userManager = userManager;
_sysNoticeUserService = sysNoticeUserService;
}
/// <summary>
/// 分页查询通知公告
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysNotice/page")]
public async Task<dynamic> QueryNoticePageList([FromQuery] NoticeInput input)
{
var searchValue = !string.IsNullOrEmpty(input.SearchValue?.Trim());
var notices = await _sysNoticeRep.DetachedEntities
.Where(searchValue, u => EF.Functions.Like(u.Title, $"%{input.SearchValue.Trim()}%") ||
EF.Functions.Like(u.Content, $"%{input.SearchValue.Trim()}%"))
.Where(input.Type > 0, u => u.Type == input.Type)
.Where(u => u.Status != (int)NoticeStatus.DELETED)
.ToPagedListAsync(input.PageNo, input.PageSize);
return XnPageResult<SysNotice>.PageResult(notices);
}
/// <summary>
/// 增加通知公告
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysNotice/add")]
public async Task AddNotice(AddNoticeInput input)
{
if (input.Status != (int)NoticeStatus.DRAFT && input.Status != (int)NoticeStatus.PUBLIC)
throw Oops.Oh(ErrorCode.D7000);
var notice = input.Adapt<SysNotice>();
await UpdatePublicInfo(notice);
// 如果是发布,则设置发布时间
if (input.Status == (int)NoticeStatus.PUBLIC)
notice.PublicTime = DateTimeOffset.Now;
var newItem = await notice.InsertNowAsync();
// 通知到的人
var noticeUserIdList = input.NoticeUserIdList;
var noticeUserStatus = (int)NoticeUserStatus.UNREAD;
await _sysNoticeUserService.Add(newItem.Entity.Id, noticeUserIdList, noticeUserStatus);
}
/// <summary>
/// 删除通知公告
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysNotice/delete")]
public async Task DeleteNotice(DeleteNoticeInput input)
{
var notice = await _sysNoticeRep.FirstOrDefaultAsync(u => u.Id == input.Id);
if (notice.Status != (int)NoticeStatus.DRAFT && notice.Status != (int)NoticeStatus.CANCEL) // 只能删除草稿和撤回的
throw Oops.Oh(ErrorCode.D7001);
//notice.Status = (int)NoticeStatus.DELETED;
await notice.DeleteAsync();
}
/// <summary>
/// 更新通知公告
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysNotice/edit")]
public async Task UpdateNotice(UpdateNoticeInput input)
{
if (input.Status != (int)NoticeStatus.DRAFT && input.Status != (int)NoticeStatus.PUBLIC)
throw Oops.Oh(ErrorCode.D7000);
// 非草稿状态
if (input.Status != (int)NoticeStatus.DRAFT)
throw Oops.Oh(ErrorCode.D7002);
var notice = input.Adapt<SysNotice>();
if (input.Status == (int)NoticeStatus.PUBLIC)
{
notice.PublicTime = DateTimeOffset.Now;
await UpdatePublicInfo(notice);
}
await notice.UpdateAsync();
// 通知到的人
var noticeUserIdList = input.NoticeUserIdList;
var noticeUserStatus = (int)NoticeUserStatus.UNREAD;
await _sysNoticeUserService.Update(input.Id, noticeUserIdList, noticeUserStatus);
}
/// <summary>
/// 获取通知公告详情
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysNotice/detail")]
public async Task<NoticeDetailOutput> GetNotice([FromQuery] QueryNoticeInput input)
{
var notice = await _sysNoticeRep.FirstOrDefaultAsync(u => u.Id == input.Id);
// 获取通知到的用户
var noticeUserList = await _sysNoticeUserService.GetNoticeUserListByNoticeId(input.Id);
var noticeUserIdList = new List<string>();
var noticeUserReadInfoList = new List<NoticeUserRead>();
if (noticeUserList != null)
{
noticeUserList.ForEach(u =>
{
noticeUserIdList.Add(u.UserId.ToString());
var noticeUserRead = new NoticeUserRead
{
UserId = u.UserId,
UserName = _userManager.Name,
ReadStatus = u.ReadStatus,
ReadTime = u.ReadTime
};
noticeUserReadInfoList.Add(noticeUserRead);
});
}
var noticeResult = notice.Adapt<NoticeDetailOutput>();
noticeResult.NoticeUserIdList = noticeUserIdList;
noticeResult.NoticeUserReadInfoList = noticeUserReadInfoList;
// 如果该条通知公告为已发布,则将当前用户的该条通知公告设置为已读
if (notice.Status == (int)NoticeStatus.PUBLIC)
await _sysNoticeUserService.Read(notice.Id, _userManager.UserId, (int)NoticeUserStatus.READ);
return noticeResult;
}
/// <summary>
/// 修改通知公告状态
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysNotice/changeStatus")]
public async Task ChangeStatus(ChangeStatusNoticeInput input)
{
// 状态应为撤回或删除或发布
if (input.Status != (int)NoticeStatus.CANCEL && input.Status != (int)NoticeStatus.DELETED && input.Status != (int)NoticeStatus.PUBLIC)
throw Oops.Oh(ErrorCode.D7000);
var notice = await _sysNoticeRep.FirstOrDefaultAsync(u => u.Id == input.Id);
notice.Status = input.Status;
if (input.Status == (int)NoticeStatus.CANCEL)
{
notice.CancelTime = DateTimeOffset.Now;
}
else if (input.Status == (int)NoticeStatus.PUBLIC)
{
notice.PublicTime = DateTimeOffset.Now;
}
await notice.UpdateAsync();
}
/// <summary>
/// 获取接收的通知公告
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysNotice/received")]
public async Task<dynamic> ReceivedNoticePageList([FromQuery] NoticeInput input)
{
var searchValue = !string.IsNullOrEmpty(input.SearchValue?.Trim());
var notices = await _sysNoticeRep.DetachedEntities.Join(_sysNoticeUserRep.DetachedEntities, u => u.Id, e => e.NoticeId, (u, e) => new { u, e })
.Where(u => u.e.UserId == _userManager.UserId)
.Where(searchValue, u => EF.Functions.Like(u.u.Title, $"%{input.SearchValue.Trim()}%") || EF.Functions.Like(u.u.Content, $"%{input.SearchValue.Trim()}%"))
.Where(input.Type > 0, u => u.u.Type == input.Type)
.Where(u => u.u.Status != (int)NoticeStatus.DELETED)
.Select(u => u.u.Adapt<NoticeReceiveOutput>())
.ToPagedListAsync(input.PageNo, input.PageSize);
return XnPageResult<NoticeReceiveOutput>.PageResult(notices);
}
/// <summary>
/// 更新发布信息
/// </summary>
/// <param name="notice"></param>
[NonAction]
private async Task UpdatePublicInfo(SysNotice notice)
{
var emp = await _userManager.GetUserEmpInfo(_userManager.UserId);
notice.PublicUserId = _userManager.UserId;
notice.PublicUserName = _userManager.Name;
notice.PublicOrgId = emp.OrgId;
notice.PublicOrgName = emp.OrgName;
}
}
}

View File

@@ -0,0 +1,90 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Dilon.Core.Service.Notice
{
/// <summary>
/// 通知公告用户
/// </summary>
public class SysNoticeUserService : ISysNoticeUserService, ITransient
{
private readonly IRepository<SysNoticeUser> _sysNoticeUserRep; // 通知公告用户表仓储
public SysNoticeUserService(IRepository<SysNoticeUser> sysNoticeUserRep)
{
_sysNoticeUserRep = sysNoticeUserRep;
}
/// <summary>
/// 增加
/// </summary>
/// <param name="noticeId"></param>
/// <param name="noticeUserIdList"></param>
/// <param name="noticeUserStatus"></param>
/// <returns></returns>
public Task Add(long noticeId, List<long> noticeUserIdList, int noticeUserStatus)
{
noticeUserIdList.ForEach(u =>
{
new SysNoticeUser
{
NoticeId = noticeId,
UserId = u,
ReadStatus = noticeUserStatus
}.InsertAsync();
});
return Task.CompletedTask;
}
/// <summary>
/// 更新
/// </summary>
/// <param name="noticeId"></param>
/// <param name="noticeUserIdList"></param>
/// <param name="noticeUserStatus"></param>
/// <returns></returns>
public async Task Update(long noticeId, List<long> noticeUserIdList, int noticeUserStatus)
{
var noticeUsers = await _sysNoticeUserRep.Where(u => u.NoticeId == noticeId).ToListAsync();
noticeUsers.ForEach(u =>
{
u.Delete();
});
await Add(noticeId, noticeUserIdList, noticeUserStatus);
}
/// <summary>
/// 获取通知公告用户列表
/// </summary>
/// <param name="noticeId"></param>
/// <returns></returns>
public async Task<List<SysNoticeUser>> GetNoticeUserListByNoticeId(long noticeId)
{
return await _sysNoticeUserRep.Where(u => u.NoticeId == noticeId).ToListAsync();
}
/// <summary>
/// 设置通知公告读取状态
/// </summary>
/// <param name="noticeId"></param>
/// <param name="userId"></param>
/// <param name="status"></param>
/// <returns></returns>
public async Task Read(long noticeId, long userId, int status)
{
var noticeUser = await _sysNoticeUserRep.FirstOrDefaultAsync(u => u.NoticeId == noticeId && u.UserId == userId);
if (noticeUser != null)
{
noticeUser.ReadStatus = status;
noticeUser.ReadTime = DateTimeOffset.Now;
await noticeUser.UpdateAsync();
}
}
}
}