ArticleController.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. using Hotline.Application.FlowEngine;
  2. using Hotline.Article;
  3. using Hotline.Caching.Interfaces;
  4. using Hotline.Permissions;
  5. using Hotline.Repository.SqlSugar.Extensions;
  6. using Hotline.Settings;
  7. using Hotline.Share.Dtos;
  8. using Hotline.Share.Dtos.Article;
  9. using Hotline.Share.Dtos.Users;
  10. using Hotline.Share.Enums.Article;
  11. using Hotline.Users;
  12. using MapsterMapper;
  13. using MediatR;
  14. using Microsoft.AspNetCore.Mvc;
  15. using XF.Domain.Authentications;
  16. using XF.Domain.Exceptions;
  17. using XF.Domain.Repository;
  18. using XF.Utility.EnumExtensions;
  19. namespace Hotline.Api.Controllers
  20. {
  21. public class ArticleController : BaseController
  22. {
  23. private readonly IRepository<Bulletin> _bulletinRepository;
  24. private readonly IMapper _mapper;
  25. private readonly ISystemOrganizeRepository _organizeRepository;
  26. private readonly IWorkflowApplication _workflowApplication;
  27. private readonly IRepository<Circular> _circularRepository;
  28. private readonly ISessionContext _sessionContext;
  29. private readonly IRepository<CircularRecord> _circularRecordRepository;
  30. private readonly IRepository<CircularReadGroup> _circularReadGroupRepository;
  31. private readonly IRepository<User> _userRepository;
  32. private readonly ICircularRecordDomainService _circularRecordDomainService;
  33. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  34. private readonly IMediator _mediator;
  35. public ArticleController(IRepository<Bulletin> bulletinRepository, IMapper mapper, ISystemDomainService systemDomainService, ISystemOrganizeRepository organizeRepository, IWorkflowApplication workflowApplication, IRepository<Circular> circularRepository, ISessionContext sessionContext, IRepository<CircularRecord> circularRecordRepository, IRepository<CircularReadGroup> circularReadGroupRepository, IRepository<User> userRepository, ICircularRecordDomainService circularRecordDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IMediator mediator)
  36. {
  37. _bulletinRepository = bulletinRepository;
  38. _mapper = mapper;
  39. _organizeRepository = organizeRepository;
  40. _workflowApplication = workflowApplication;
  41. _circularRepository = circularRepository;
  42. _sessionContext = sessionContext;
  43. _circularRecordRepository = circularRecordRepository;
  44. _circularReadGroupRepository = circularReadGroupRepository;
  45. _userRepository = userRepository;
  46. _circularRecordDomainService = circularRecordDomainService;
  47. _systemDicDataCacheManager = systemDicDataCacheManager;
  48. _mediator = mediator;
  49. }
  50. #region 通知
  51. /// <summary>
  52. /// 获取所有用户不分页
  53. /// </summary>
  54. /// <returns></returns>
  55. [HttpGet("alluser")]
  56. public async Task<List<UserDto>> GetAllUser()
  57. {
  58. var list = await _userRepository.Queryable(includeDeleted: false)
  59. .Includes(d => d.Account)
  60. .Includes(d => d.Organization)
  61. .OrderByDescending(x => x.CreationTime)
  62. .ToListAsync();
  63. return new List<UserDto>(_mapper.Map<IReadOnlyList<UserDto>>(list));
  64. }
  65. /// <summary>
  66. /// 我的通知列表
  67. /// </summary>
  68. /// <param name="dto"></param>
  69. /// <returns></returns>
  70. [HttpGet("circular/muquery")]
  71. public async Task<PagedDto<CircularDto>> GetMyCircularList([FromQuery] QueryCircularListRequestDto dto)
  72. {
  73. var (total, items) = await _circularRepository.Queryable()
  74. .Includes(x => x.CircularReadGroups)
  75. .Includes(x => x.ExaminMan)
  76. .WhereIF(!string.IsNullOrEmpty(dto.CircularTypeId), d => d.CircularTypeId == dto.CircularTypeId)
  77. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
  78. .WhereIF(dto.CircularTimeStart.HasValue, d => d.CircularTime >= dto.CircularTimeStart)
  79. .WhereIF(dto.CircularTimeEnd.HasValue, d => d.CircularTime <= dto.CircularTimeEnd)
  80. .WhereIF(dto.CircularState != null, d => d.CircularState == dto.CircularState)
  81. //.WhereIF(dto.IsRead!=null,d=>d.CircularReadGroups.Any(x=>x.IsRead == dto.IsRead) && (d.CircularReadGroups.Any(x => x.UserId == _sessionContext.RequiredUserId) || d.CircularReadGroups.Any(x => x.OrgId == _sessionContext.RequiredOrgId)))
  82. .WhereIF(dto.IsRead != null, d => (d.CircularReadGroups.Any(x => x.IsRead == dto.IsRead && x.UserId == _sessionContext.UserId)) ||
  83. (d.CircularReadGroups.Any(x => x.IsRead == dto.IsRead && x.OrgId == _sessionContext.OrgId)))
  84. //.Where(d=>d.CircularReadGroups.Any(x=> x.UserId == _sessionContext.RequiredUserId) || d.CircularReadGroups.Any(x=>x.OrgId == _sessionContext.RequiredOrgId))
  85. .OrderByDescending(d => d.CreationTime)
  86. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  87. return new PagedDto<CircularDto>(total, _mapper.Map<IReadOnlyList<CircularDto>>(items));
  88. }
  89. /// <summary>
  90. /// 查询通知列表
  91. /// </summary>
  92. /// <param name="dto"></param>
  93. /// <returns></returns>
  94. [Permission(EPermission.QueryCircularList)]
  95. [HttpGet("circular/query")]
  96. public async Task<PagedDto<CircularDto>> QueryCircularList([FromQuery] QueryCircularListRequestDto dto)
  97. {
  98. var (total, items) = await _circularRepository.Queryable()
  99. .Includes(x => x.CircularReadGroups)
  100. .Includes(x => x.ExaminMan)
  101. .WhereIF(!string.IsNullOrEmpty(dto.CircularTypeId), d => d.CircularTypeId == dto.CircularTypeId)
  102. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
  103. .WhereIF(dto.CircularTimeStart.HasValue, d => d.CircularTime >= dto.CircularTimeStart)
  104. .WhereIF(dto.CircularTimeEnd.HasValue, d => d.CircularTime <= dto.CircularTimeEnd)
  105. .WhereIF(dto.CircularState != null, d => d.CircularState == dto.CircularState)
  106. .OrderByDescending(d => d.CreationTime)
  107. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  108. return new PagedDto<CircularDto>(total, _mapper.Map<IReadOnlyList<CircularDto>>(items));
  109. }
  110. /// <summary>
  111. /// 通知详情(内部)
  112. /// </summary>
  113. /// <param name="id"></param>
  114. /// <returns></returns>
  115. [HttpGet("circular/entity/{id}")]
  116. public async Task<CircularDto> CircularEntity(string id)
  117. {
  118. var model = await _circularRepository.Queryable()
  119. .Includes(x => x.CircularReadGroups)
  120. .Includes(x => x.ExaminMan)
  121. .FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
  122. return _mapper.Map<CircularDto>(model);
  123. }
  124. /// <summary>
  125. /// 通知审核
  126. /// </summary>
  127. /// <param name="dto"></param>
  128. /// <returns></returns>
  129. [Permission(EPermission.ExamineCircular)]
  130. [HttpPost("circular/examine")]
  131. public async Task ExamineCircular([FromBody] ExamineCircularDto dto)
  132. {
  133. var circular = await _circularRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  134. if (circular == null)
  135. throw UserFriendlyException.SameMessage("无效数据");
  136. if (circular.CircularState != ECircularState.InReview)
  137. throw UserFriendlyException.SameMessage("当前状态不能审核");
  138. if (dto.IsPass)
  139. {
  140. //更新审核状态
  141. circular.CircularState = Share.Enums.Article.ECircularState.ReviewPass;
  142. circular.CircularTime = DateTime.Now;
  143. circular.ExaminOpinion = dto.Reason;
  144. circular.ExaminTime = DateTime.Now;
  145. circular.ExaminManId = _sessionContext.RequiredUserId;
  146. await _circularRepository.UpdateAsync(circular, HttpContext.RequestAborted);
  147. //更新阅读数量
  148. if (circular.CircularType == Share.Enums.Article.ECircularType.Person)
  149. {
  150. //个人
  151. var userlist = await _circularReadGroupRepository.Queryable()
  152. .Where(x => x.CircularId == circular.Id)
  153. .Select(x => x.UserId)
  154. .ToListAsync(HttpContext.RequestAborted);
  155. if (userlist != null && userlist.Count > 0)
  156. {
  157. await _circularRecordDomainService.RecordUserHandle(userlist, true);
  158. }
  159. }
  160. else
  161. {
  162. //部门
  163. var orglist = await _circularReadGroupRepository.Queryable()
  164. .Where(x => x.CircularId == circular.Id)
  165. .Select(x => x.OrgId)
  166. .ToListAsync(HttpContext.RequestAborted);
  167. if (orglist != null && orglist.Count > 0)
  168. {
  169. await _circularRecordDomainService.RecordOrgHandle(orglist, true);
  170. }
  171. }
  172. }
  173. else
  174. {
  175. //驳回
  176. circular.CircularState = Share.Enums.Article.ECircularState.ReviewNoPass;
  177. circular.ExaminOpinion = dto.Reason;
  178. circular.ExaminTime = DateTime.Now;
  179. circular.ExaminManId = _sessionContext.RequiredUserId;
  180. await _circularRepository.UpdateAsync(circular, HttpContext.RequestAborted);
  181. }
  182. }
  183. /// <summary>
  184. /// 提交通知
  185. /// </summary>
  186. /// <param name="id"></param>
  187. /// <returns></returns>
  188. [Permission(EPermission.CommitCircular)]
  189. [HttpGet("circular/commit/{id}")]
  190. public async Task CommitCircular(string id)
  191. {
  192. var circular = await _circularRepository.GetAsync(id, HttpContext.RequestAborted);
  193. if (circular == null)
  194. throw UserFriendlyException.SameMessage("无效数据");
  195. if (circular.CircularState != ECircularState.Draft && circular.CircularState != ECircularState.ReviewNoPass)
  196. throw UserFriendlyException.SameMessage("当前状态不能提交");
  197. circular.CircularState = ECircularState.InReview;
  198. circular.CommitTime = DateTime.Now;
  199. await _circularRepository.UpdateAsync(circular, HttpContext.RequestAborted);
  200. }
  201. /// <summary>
  202. /// 修改通知
  203. /// </summary>
  204. /// <param name="dto"></param>
  205. /// <returns></returns>
  206. [Permission(EPermission.UpdateCircular)]
  207. [HttpPost("circular/update")]
  208. public async Task UpdateCircular([FromBody] UpdateCircularDto dto)
  209. {
  210. var circular = await _circularRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  211. if (circular == null)
  212. throw UserFriendlyException.SameMessage("无效数据");
  213. if (circular.CircularState != ECircularState.Draft && circular.CircularState != ECircularState.ReviewNoPass)
  214. throw UserFriendlyException.SameMessage("当前状态不能修改");
  215. //处理主表
  216. circular.Title = dto.Title;
  217. circular.Content = dto.Content;
  218. circular.CircularTypeId = dto.CircularTypeId;
  219. circular.CircularTypeName = dto.CircularTypeName;
  220. circular.CircularType = dto.CircularType;
  221. circular.IsMustRead = dto.IsMustRead;
  222. circular.SourceOrgId = dto.SourceOrgId;
  223. circular.SourceOrgName = dto.SourceOrgName;
  224. circular.NeedReadNum = dto.CircularReadGroups.Count;
  225. await _circularRepository.UpdateAsync(circular, HttpContext.RequestAborted);
  226. //移除子表重新添加
  227. await _circularReadGroupRepository.RemoveAsync(x => x.CircularId == dto.Id, false, HttpContext.RequestAborted);
  228. var list = dto.CircularReadGroups;
  229. var readGroupList = new List<CircularReadGroup>();
  230. foreach (var item in list)
  231. {
  232. var readGroup = _mapper.Map<CircularReadGroup>(item);
  233. readGroup.CircularId = dto.Id;
  234. readGroup.IsRead = false;
  235. readGroupList.Add(readGroup);
  236. }
  237. await _circularReadGroupRepository.AddRangeAsync(readGroupList);
  238. }
  239. /// <summary>
  240. /// 删除通知
  241. /// </summary>
  242. /// <param name="id"></param>
  243. /// <returns></returns>
  244. [Permission(EPermission.DelCircular)]
  245. [HttpGet("circular/del/{id}")]
  246. public async Task DelCircular(string id)
  247. {
  248. var circular = await _circularRepository.GetAsync(id, HttpContext.RequestAborted);
  249. if (circular == null)
  250. throw UserFriendlyException.SameMessage("无效数据");
  251. if (circular.CircularState != ECircularState.Draft)
  252. throw UserFriendlyException.SameMessage("当前状态不能删除");
  253. await _circularReadGroupRepository.RemoveAsync(x => x.CircularId == id, false, HttpContext.RequestAborted);
  254. await _circularRepository.RemoveAsync(x => x.Id == id, false, HttpContext.RequestAborted);
  255. }
  256. /// <summary>
  257. /// 新增通知
  258. /// </summary>
  259. /// <param name="dto"></param>
  260. /// <returns></returns>
  261. [Permission(EPermission.AddCircular)]
  262. [HttpPost("circular/add")]
  263. public async Task AddCircular([FromBody] AddCircularDto dto)
  264. {
  265. var model = _mapper.Map<Circular>(dto);
  266. model.CircularState = ECircularState.Draft;
  267. model.ReadedNum = 0;
  268. model.NeedReadNum = model.CircularReadGroups.Count;
  269. var id = await _circularRepository.AddAsync(model, HttpContext.RequestAborted);
  270. //子表
  271. var list = dto.CircularReadGroups;
  272. var readGroupList = new List<CircularReadGroup>();
  273. foreach (var item in list)
  274. {
  275. var readGroup = _mapper.Map<CircularReadGroup>(item);
  276. readGroup.CircularId = id;
  277. readGroup.IsRead = false;
  278. readGroupList.Add(readGroup);
  279. }
  280. await _circularReadGroupRepository.AddRangeAsync(readGroupList);
  281. }
  282. /// <summary>
  283. /// 列表页面基础信息
  284. /// </summary>
  285. /// <returns></returns>
  286. [HttpGet("circular/listbasedata")]
  287. public async Task<object> CircularBaseData()
  288. {
  289. var rsp = new
  290. {
  291. CircularType = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CircularType)
  292. };
  293. return rsp;
  294. }
  295. /// <summary>
  296. /// 新增页面基础数据
  297. /// </summary>
  298. /// <returns></returns>
  299. [HttpGet("circular/addbasedata")]
  300. public async Task<object> CircularAddBaseData()
  301. {
  302. var rsp = new
  303. {
  304. CircularType = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CircularType),
  305. OrgsOptions = await _organizeRepository.GetOrgJson(),
  306. CircularTypeEnum = EnumExts.GetDescriptions<ECircularType>()
  307. };
  308. return rsp;
  309. }
  310. /// <summary>
  311. /// 通知阅读(内部)
  312. /// </summary>
  313. /// <param name="id"></param>
  314. /// <returns></returns>
  315. [HttpGet("circular/read/{id}")]
  316. public async Task<CircularDto> CircularRead(string id)
  317. {
  318. var model = await _circularRepository.Queryable()
  319. .Includes(x => x.CircularReadGroups)
  320. .FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
  321. //更新阅读信息
  322. if (model.CircularType == ECircularType.Person)
  323. {
  324. //个人阅读
  325. var readGroup = model.CircularReadGroups.FirstOrDefault(x => x.UserId == _sessionContext.RequiredUserId && !x.IsRead);
  326. if (readGroup != null)
  327. {
  328. readGroup.IsRead = true;
  329. readGroup.ReadTime = DateTime.Now;
  330. if (DateTime.Now > model.LostEfficacyTime)
  331. readGroup.IsTimeOut = true;
  332. else
  333. readGroup.IsTimeOut = false;
  334. await _circularReadGroupRepository.UpdateAsync(readGroup, HttpContext.RequestAborted);
  335. model.ReadedNum++;
  336. await _circularRepository.UpdateAsync(model, HttpContext.RequestAborted);
  337. //处理计数
  338. await _circularRecordDomainService.RecordUserHandle(new List<string> { _sessionContext.RequiredUserId }, false, cancellationToken: HttpContext.RequestAborted);
  339. }
  340. }
  341. else
  342. {
  343. //部门阅读
  344. var readGroup = model.CircularReadGroups.FirstOrDefault(x => x.OrgId == _sessionContext.RequiredOrgId && !x.IsRead);
  345. if (readGroup != null)
  346. {
  347. readGroup.IsRead = true;
  348. readGroup.ReadTime = DateTime.Now;
  349. if (DateTime.Now > model.LostEfficacyTime)
  350. readGroup.IsTimeOut = true;
  351. else
  352. readGroup.IsTimeOut = false;
  353. await _circularReadGroupRepository.UpdateAsync(readGroup, HttpContext.RequestAborted);
  354. model.ReadedNum++;
  355. await _circularRepository.UpdateAsync(model, HttpContext.RequestAborted);
  356. //处理部门计数
  357. await _circularRecordDomainService.RecordOrgHandle(new List<string> { _sessionContext.RequiredOrgId }, false, cancellationToken: HttpContext.RequestAborted);
  358. }
  359. }
  360. return _mapper.Map<CircularDto>(model);
  361. }
  362. /// <summary>
  363. /// 获取小红点计数
  364. /// </summary>
  365. /// <returns></returns>
  366. [HttpGet("megcount")]
  367. public async Task<CircularRecordDto> QueryMegCount()
  368. {
  369. var list = await _circularRecordRepository.Queryable().Where(x => x.UserId == _sessionContext.UserId || x.OrgId == _sessionContext.OrgId).ToListAsync();
  370. if (list != null && list.Count > 0)
  371. {
  372. var rsp = new CircularRecordDto();
  373. rsp.OrgCount = list.FirstOrDefault(x => x.CircularType == ECircularType.Org)?.RecordCount ?? 0;
  374. rsp.PersonCount = list.FirstOrDefault(x => x.CircularType == ECircularType.Person)?.RecordCount ?? 0;
  375. return rsp;
  376. }
  377. return new CircularRecordDto() { OrgCount = 0, PersonCount = 0 };
  378. }
  379. #endregion
  380. #region 公告
  381. /// <summary>
  382. /// 查询公告列表
  383. /// </summary>
  384. /// <param name="dto"></param>
  385. /// <returns></returns>
  386. [HttpGet("bulletin/query")]
  387. public async Task<PagedDto<BulletinDto>> QueryBulletinList([FromQuery] QueryBulletinListRequestDto dto)
  388. {
  389. var (total, items) = await _bulletinRepository.Queryable()
  390. .Includes(x => x.ExaminMan)
  391. .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), d => d.BulletinTypeId == dto.BulletinTypeId)
  392. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
  393. .WhereIF(dto.BulletinTimeStart.HasValue, d => d.BulletinTime >= dto.BulletinTimeStart)
  394. .WhereIF(dto.BulletinTimeEnd.HasValue, d => d.BulletinTime <= dto.BulletinTimeEnd)
  395. .WhereIF(dto.BulletinState != null, d => d.BulletinState == dto.BulletinState)
  396. .WhereIF(dto.IsLoseEfficacy != null && dto.IsLoseEfficacy == false, d => d.LoseEfficacyTime > DateTime.Now)
  397. .OrderByDescending(d => d.CreationTime)
  398. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  399. return new PagedDto<BulletinDto>(total, _mapper.Map<IReadOnlyList<BulletinDto>>(items));
  400. }
  401. /// <summary>
  402. /// 公告详情(内部)
  403. /// </summary>
  404. /// <param name="id"></param>
  405. /// <returns></returns>
  406. [HttpGet("bulletin/entity/{id}")]
  407. public async Task<BulletinDto> BulletinEntity(string id)
  408. {
  409. var model = await _bulletinRepository.Queryable()
  410. .Includes(x => x.ExaminMan)
  411. .FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
  412. return _mapper.Map<BulletinDto>(model);
  413. }
  414. /// <summary>
  415. /// 公告审核
  416. /// </summary>
  417. /// <param name="dto"></param>
  418. /// <returns></returns>
  419. [Permission(EPermission.ExamineBulletin)]
  420. [HttpPost("bulletin/examine")]
  421. public async Task ExamineBulletin([FromBody] ExamineBulletinDto dto)
  422. {
  423. var bulletin = await _bulletinRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  424. if (bulletin == null)
  425. throw UserFriendlyException.SameMessage("无效数据");
  426. if (bulletin.BulletinState != EBulletinState.InReview)
  427. throw UserFriendlyException.SameMessage("当前状态不能审核");
  428. if (dto.IsPass)
  429. {
  430. bulletin.BulletinState = Share.Enums.Article.EBulletinState.ReviewPass;
  431. bulletin.BulletinTime = DateTime.Now;
  432. bulletin.ExaminOpinion = dto.Reason;
  433. bulletin.ExaminTime = DateTime.Now;
  434. bulletin.ExaminManId = _sessionContext.RequiredUserId;
  435. await _bulletinRepository.UpdateAsync(bulletin, HttpContext.RequestAborted);
  436. var publishBulletin = _mapper.Map<PublishBulletinDto>(bulletin);
  437. //todo await _bulletinService.PushBulletin(publishBulletin, HttpContext.RequestAborted);
  438. }
  439. else
  440. {
  441. bulletin.ExaminOpinion = dto.Reason;
  442. bulletin.ExaminTime = DateTime.Now;
  443. bulletin.ExaminManId = _sessionContext.RequiredUserId;
  444. bulletin.BulletinState = Share.Enums.Article.EBulletinState.ReviewNoPass;
  445. await _bulletinRepository.UpdateAsync(bulletin, HttpContext.RequestAborted);
  446. }
  447. }
  448. /// <summary>
  449. /// 提交公告
  450. /// </summary>
  451. /// <param name="id"></param>
  452. /// <returns></returns>
  453. [Permission(EPermission.CommitBulletin)]
  454. [HttpGet("bulletin/commit")]
  455. public async Task CommitBulletin(string id)
  456. {
  457. var bulletin = await _bulletinRepository.GetAsync(id, HttpContext.RequestAborted);
  458. if (bulletin == null)
  459. throw UserFriendlyException.SameMessage("无效数据");
  460. if (bulletin.BulletinState != EBulletinState.Draft && bulletin.BulletinState != EBulletinState.ReviewNoPass)
  461. throw UserFriendlyException.SameMessage("当前状态不能提交");
  462. bulletin.BulletinState = EBulletinState.InReview;
  463. bulletin.CommitTime = DateTime.Now;
  464. await _bulletinRepository.UpdateAsync(bulletin, HttpContext.RequestAborted);
  465. }
  466. /// <summary>
  467. /// 修改公告
  468. /// </summary>
  469. /// <param name="dto"></param>
  470. /// <returns></returns>
  471. [Permission(EPermission.UpdateBulletin)]
  472. [HttpPost("bulletin/update")]
  473. public async Task UpdateBulletin([FromBody] UpdateBulletinDto dto)
  474. {
  475. var bulletin = await _bulletinRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  476. if (bulletin == null)
  477. throw UserFriendlyException.SameMessage("无效数据");
  478. if (bulletin.BulletinState != EBulletinState.Draft && bulletin.BulletinState != EBulletinState.ReviewNoPass)
  479. throw UserFriendlyException.SameMessage("当前状态不能修改");
  480. bulletin.Title = dto.Title;
  481. bulletin.Content = dto.Content;
  482. bulletin.BulletinTypeId = dto.BulletinTypeId;
  483. bulletin.BulletinTypeName = dto.BulletinTypeName;
  484. bulletin.LoseEfficacyTime = dto.LoseEfficacyTime;
  485. bulletin.PushRanges = dto.PushRanges;
  486. bulletin.SourceOrgId = dto.SourceOrgId;
  487. bulletin.SourceOrgName = dto.SourceOrgName;
  488. await _bulletinRepository.UpdateAsync(bulletin, HttpContext.RequestAborted);
  489. }
  490. /// <summary>
  491. /// 删除公告
  492. /// </summary>
  493. /// <param name="id"></param>
  494. /// <returns></returns>
  495. [Permission(EPermission.DelBulletin)]
  496. [HttpGet("bulletin/del/{id}")]
  497. public async Task DelBulletin(string id)
  498. {
  499. var bulletin = await _bulletinRepository.GetAsync(id, HttpContext.RequestAborted);
  500. if (bulletin == null)
  501. throw UserFriendlyException.SameMessage("无效数据");
  502. if (bulletin.BulletinState != EBulletinState.Draft)
  503. throw UserFriendlyException.SameMessage("当前状态不能删除");
  504. await _bulletinRepository.RemoveAsync(x => x.Id == id, false, HttpContext.RequestAborted);
  505. }
  506. /// <summary>
  507. /// 新增公告
  508. /// </summary>
  509. /// <param name="dto"></param>
  510. /// <returns></returns>
  511. [Permission(EPermission.AddBulletin)]
  512. [HttpPost("bulletin/add")]
  513. public async Task AddBulletin([FromBody] AddBulletinDto dto)
  514. {
  515. var model = _mapper.Map<Bulletin>(dto);
  516. model.BulletinState = Share.Enums.Article.EBulletinState.Draft;
  517. model.ReadedNum = 0;
  518. await _bulletinRepository.AddAsync(model, HttpContext.RequestAborted);
  519. }
  520. /// <summary>
  521. /// 列表页面基础数据
  522. /// </summary>
  523. /// <returns></returns>
  524. [HttpGet("bulletin/listbasedata")]
  525. public async Task<object> BulletinListBaseData()
  526. {
  527. var rsp = new
  528. {
  529. BulletinType = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.BulletinType)
  530. };
  531. return rsp;
  532. }
  533. /// <summary>
  534. /// 新增页面基础数据
  535. /// </summary>
  536. /// <returns></returns>
  537. [HttpGet("bulletin/addbasedata")]
  538. public async Task<object> BulletinAddBaseData()
  539. {
  540. var rsp = new
  541. {
  542. BulletinType = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.BulletinType),
  543. PushRanges = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.BulletinPushRange),
  544. OrgsOptions = await _organizeRepository.GetOrgJson(),
  545. };
  546. return rsp;
  547. }
  548. #endregion
  549. }
  550. }