EarlyController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. using DocumentFormat.OpenXml.Drawing.Charts;
  2. using DocumentFormat.OpenXml.Drawing.Diagrams;
  3. using DocumentFormat.OpenXml.Vml;
  4. using DocumentFormat.OpenXml.Wordprocessing;
  5. using Hotline.Application.Early;
  6. using Hotline.Application.Tools;
  7. using Hotline.Caching.Interfaces;
  8. using Hotline.Caching.Services;
  9. using Hotline.Early;
  10. using Hotline.File;
  11. using Hotline.Orders;
  12. using Hotline.Repository.SqlSugar.Extensions;
  13. using Hotline.Settings;
  14. using Hotline.Share.Dtos;
  15. using Hotline.Share.Dtos.Early;
  16. using Hotline.Share.Dtos.ExportWord;
  17. using Hotline.Share.Dtos.Order;
  18. using Hotline.Share.Enums.Article;
  19. using Hotline.Share.Enums.Early;
  20. using Hotline.Share.Enums.Order;
  21. using Hotline.Share.Tools;
  22. using MapsterMapper;
  23. using Microsoft.AspNetCore.Mvc;
  24. using SqlSugar;
  25. using System.Threading;
  26. using XF.Domain.Authentications;
  27. using XF.Domain.Exceptions;
  28. using XF.Domain.Repository;
  29. using XF.Utility.EnumExtensions;
  30. namespace Hotline.Api.Controllers
  31. {
  32. public class EarlyController: BaseController
  33. {
  34. private readonly IRepository<EarlyWarningSetting> _earlyWarningRepository;
  35. private readonly IMapper _mapper;
  36. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  37. private readonly IRepository<OrderWord> _orderWrodRepository;
  38. private readonly IRepository<EarlyWarningOrder> _earlyWarningOrderRepository;
  39. private readonly IRepository<EarlyWarningOrderDetail> _earlyWarningOrderDetailRepository;
  40. private readonly IRepository<EarlyWarningPush> _earlyWarningPushRepository;
  41. private readonly IRepository<EarlyWarningPushDetail> _earlyWarningPushDetailRepository;
  42. private readonly IEarlyReportProvder _earlyReportProvder;
  43. private readonly IFileDomainService _fileDomainService;
  44. private readonly ISessionContext _sessionContext;
  45. private readonly IOrderRepository _orderRepository;
  46. public EarlyController(IRepository<EarlyWarningSetting> earlyWarningRepository, IMapper mapper, ISystemDicDataCacheManager sysDicDataCacheManager, IRepository<OrderWord> orderWrodRepository, IRepository<EarlyWarningOrder> earlyWarningOrderRepository, IRepository<EarlyWarningOrderDetail> earlyWarningOrderDetailRepository, IRepository<EarlyWarningPush> earlyWarningPushRepository, IRepository<EarlyWarningPushDetail> earlyWarningPushDetailRepository, IEarlyReportProvder earlyReportProvder,IFileDomainService fileDomainService, ISessionContext sessionContext, IOrderRepository orderRepository)
  47. {
  48. _earlyWarningRepository = earlyWarningRepository;
  49. _mapper = mapper;
  50. _sysDicDataCacheManager = sysDicDataCacheManager;
  51. _orderWrodRepository = orderWrodRepository;
  52. _earlyWarningOrderRepository = earlyWarningOrderRepository;
  53. _earlyWarningOrderDetailRepository = earlyWarningOrderDetailRepository;
  54. _earlyWarningPushRepository = earlyWarningPushRepository;
  55. _earlyWarningPushDetailRepository = earlyWarningPushDetailRepository;
  56. this._earlyReportProvder = earlyReportProvder;
  57. this._fileDomainService = fileDomainService;
  58. _sessionContext = sessionContext;
  59. _orderRepository = orderRepository;
  60. }
  61. #region 预警设置
  62. /// <summary>
  63. /// 预警设置列表
  64. /// </summary>
  65. /// <param name="dto"></param>
  66. /// <returns></returns>
  67. [HttpGet("earlysetting-pagelist")]
  68. public async Task<PagedDto<EarlySettingDto>> EarlySettingPageList([FromQuery]EarlySettingPageListRequest dto)
  69. {
  70. var (total,items) = await _earlyWarningRepository.Queryable()
  71. .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningName)== false, d => d.EarlyWarningName.Contains(dto.EarlyWarningName))
  72. .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningLevelValue)==false ,d=> d.EarlyWarningLevelValue == dto.EarlyWarningLevelValue)
  73. .WhereIF(dto.IsEnable.HasValue,d=>d.IsEnable == dto.IsEnable).ToPagedListAsync(dto.PageIndex,dto.PageSize,HttpContext.RequestAborted);
  74. return new PagedDto<EarlySettingDto>(total, _mapper.Map<IReadOnlyList<EarlySettingDto>>(items));
  75. }
  76. /// <summary>
  77. /// 新增预警设置
  78. /// </summary>
  79. /// <returns></returns>
  80. [HttpPost("add-ealysetting")]
  81. public async Task AddEarlySetting([FromBody] AddEarlySettingRequest dto)
  82. {
  83. var earlySetting = _mapper.Map<EarlyWarningSetting>(dto);
  84. await _earlyWarningRepository.AddAsync(earlySetting,HttpContext.RequestAborted);
  85. }
  86. /// <summary>
  87. /// 修改预警设置
  88. /// </summary>
  89. /// <param name="dto"></param>
  90. /// <returns></returns>
  91. [HttpPost("update-ealysetting")]
  92. public async Task UpdateEarlySetting([FromBody] UpdateEarlySettingRequest dto)
  93. {
  94. var model = await _earlyWarningRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  95. if (model == null)
  96. throw UserFriendlyException.SameMessage("无效信息");
  97. _mapper.Map(dto, model);
  98. await _earlyWarningRepository.UpdateAsync(model, HttpContext.RequestAborted);
  99. }
  100. /// <summary>
  101. /// 逻辑删除预警设置
  102. /// </summary>
  103. /// <param name="id"></param>
  104. /// <returns></returns>
  105. [HttpDelete("del-ealysetting")]
  106. public async Task DelEarlySetting([FromQuery]string id)
  107. {
  108. var model = await _earlyWarningRepository.GetAsync(id, HttpContext.RequestAborted);
  109. if (model == null)
  110. throw UserFriendlyException.SameMessage("无效信息");
  111. await _earlyWarningRepository.RemoveAsync(model,true, HttpContext.RequestAborted);
  112. }
  113. /// <summary>
  114. /// 获取预警设置
  115. /// </summary>
  116. /// <param name="id"></param>
  117. /// <returns></returns>
  118. [HttpGet("get-earlysetting/{id}")]
  119. public async Task<EarlySettingDto> GetEarlySetting(string id)
  120. {
  121. var model = await _earlyWarningRepository.GetAsync(id, HttpContext.RequestAborted);
  122. if (model == null)
  123. throw UserFriendlyException.SameMessage("无效信息");
  124. return _mapper.Map<EarlySettingDto>(model);
  125. }
  126. /// <summary>
  127. /// 预警设置基础数据
  128. /// </summary>
  129. /// <returns></returns>
  130. [HttpGet("earlysetting-basedata")]
  131. public object EarlySettingBaseData()
  132. {
  133. return new
  134. {
  135. EarlyWarningLevel = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.EarlyWarningLevel),
  136. EarlyWarningType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.EarlyWarningType),
  137. EFrequency = EnumExts.GetDescriptions<EFrequency>(),
  138. ECompareType = EnumExts.GetDescriptions<ECompareType>(),
  139. SensitiveWords = _orderWrodRepository.Queryable().Where(x => x.IsEnable == 1 && x.Classify.Contains("敏感标签")).Select(x => x.Tag).ToList(),
  140. ENextWhere = EnumExts.GetDescriptions<ENextWhere>(),
  141. };
  142. }
  143. #endregion
  144. #region 预警管理
  145. /// <summary>
  146. /// 预警管理
  147. /// </summary>
  148. /// <param name="dto"></param>
  149. /// <returns></returns>
  150. [HttpGet("earlyorder-pagelist")]
  151. public async Task<PagedDto<EarlyOrderDto>> EarlyOrderPageList([FromQuery]EarlyOrderPageListRequest dto)
  152. {
  153. var (total,items) = await _earlyWarningOrderRepository.Queryable()
  154. .Includes(d => d.EarlyWarningSetting)
  155. .Includes(d=>d.EarlyWarningOrderDetails)
  156. .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningName) == false, d => d.EarlyWarningSetting.EarlyWarningName.Contains(dto.EarlyWarningName))
  157. .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningLevelValue) == false, d => d.EarlyWarningSetting.EarlyWarningLevelValue == dto.EarlyWarningLevelValue)
  158. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  159. return new PagedDto<EarlyOrderDto>(total, _mapper.Map<IReadOnlyList<EarlyOrderDto>>(items));
  160. }
  161. /// <summary>
  162. /// 获取预警管理对象
  163. /// </summary>
  164. /// <param name="id"></param>
  165. /// <returns></returns>
  166. [HttpGet("get-earlyorder/{id}")]
  167. public async Task<EarlyOrderDto> GetEarlyOrder(string id)
  168. {
  169. var model = await _earlyWarningOrderRepository.Queryable()
  170. .Includes(x=>x.EarlyWarningSetting)
  171. .Includes(x=>x.EarlyWarningOrderDetails,d=>d.Order)
  172. .Where(x=>x.Id == id).FirstAsync(HttpContext.RequestAborted);
  173. if (model == null)
  174. throw UserFriendlyException.SameMessage("无效信息");
  175. return _mapper.Map<EarlyOrderDto>(model);
  176. }
  177. #endregion
  178. #region 推送管理
  179. /// <summary>
  180. /// 推送报告列表基础数据
  181. /// </summary>
  182. /// <returns></returns>
  183. [HttpGet("earlypush-pagelist-basedata")]
  184. public async Task<object> EarlyPushPageListBaseData()
  185. {
  186. return new
  187. {
  188. EarlyPushStatus = EnumExts.GetDescriptions<EEarlyPushStatus>()
  189. };
  190. }
  191. /// <summary>
  192. /// 推送报告列表
  193. /// </summary>
  194. /// <param name="dto"></param>
  195. /// <returns></returns>
  196. [HttpGet("earlypush-pagelist")]
  197. public async Task<PagedDto<EarlyPushDto>> EarlyPushPageList([FromQuery] EarlyPushPageListRequest dto)
  198. {
  199. var (total, items) = await _earlyWarningPushRepository.Queryable()
  200. .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningPushName) == false, d => d.EarlyWarningPushName.Contains(dto.EarlyWarningPushName))
  201. .WhereIF(dto.PushStatus.HasValue, d => d.PushStatus == dto.PushStatus)
  202. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  203. return new PagedDto<EarlyPushDto>(total, _mapper.Map<IReadOnlyList<EarlyPushDto>>(items));
  204. }
  205. /// <summary>
  206. /// 可以选择推送的工单
  207. /// </summary>
  208. /// <returns></returns>
  209. [HttpGet("early-canchooseorderbasedata")]
  210. public async Task<object> EarlyCanChooseOrderBaseData()
  211. {
  212. return new
  213. {
  214. OrderStatus = EnumExts.GetDescriptions<EOrderStatus>(),
  215. OrderPushStatus = EnumExts.GetDescriptions<EOrderPushStatus>()
  216. };
  217. }
  218. /// <summary>
  219. /// 可以选择推送的工单
  220. /// </summary>
  221. /// <param name="dto"></param>
  222. /// <returns></returns>
  223. [HttpGet("early-canchooseorder")]
  224. public async Task<PagedDto<CanChooseOrderRsp>> CanChooseOrder([FromQuery] CanChooseOrderRequest dto)
  225. {
  226. var (total,items) = await _earlyWarningOrderDetailRepository.Queryable()
  227. .Where(x => x.OrderPushStatus != EOrderPushStatus.FiledPush)
  228. .Where(x=> dto.ChooseOrderId.Contains(x.OrderId) == false)
  229. .ToPagedListAsync(dto.PageIndex,dto.PageSize,HttpContext.RequestAborted);
  230. return new PagedDto<CanChooseOrderRsp>(total, _mapper.Map<IReadOnlyList<CanChooseOrderRsp>>(items));
  231. }
  232. /// <summary>
  233. /// 新增推送报告 TODO
  234. /// </summary>
  235. /// <param name="dto"></param>
  236. /// <returns></returns>
  237. [HttpPost("add-earlypush")]
  238. public async Task AddEarlyPush([FromBody] AddEarlyPushRequest dto)
  239. {
  240. var earlySettingPush = _mapper.Map<EarlyWarningPush>(dto);
  241. earlySettingPush.PushStatus = EEarlyPushStatus.Pushed;
  242. if (dto.OperateModel==1)
  243. {
  244. earlySettingPush.PushStatus = EEarlyPushStatus.Draft;
  245. }
  246. if (dto.OperateModel!=1)
  247. {
  248. earlySettingPush.PushTime = DateTime.Now;
  249. }
  250. if (dto.OperateModel == 3)
  251. {
  252. //准备数据
  253. var reportDto = await GetEarlyReport(dto.EarlyWarningPushDetails,earlySettingPush);
  254. // 生成推送文件流
  255. var html = _earlyReportProvder.PushReport(reportDto);
  256. // 推送文件
  257. var fileJson = await _fileDomainService.UploadFileFromMemoryAsync(html.HtmlToWord(), "报表" + EFileType.word.GetFileExtension(), EFileType.word);
  258. //推送生成报告消息TODO
  259. earlySettingPush.PushReportUrl = "";
  260. }
  261. var id = await _earlyWarningPushRepository.AddAsync(earlySettingPush, HttpContext.RequestAborted);
  262. dto.EarlyWarningPushDetails.ForEach(x =>
  263. {
  264. x.EarlyWarningPushId = id;
  265. });
  266. var detail = _mapper.Map<List<EarlyWarningPushDetail>>(dto.EarlyWarningPushDetails);
  267. await _earlyWarningPushDetailRepository.AddRangeAsync(detail,HttpContext.RequestAborted);
  268. }
  269. private async Task<EarlyReportDto> GetEarlyReport(List<EarlyWarningPushDetailDto> dto, EarlyWarningPush earlyPush)
  270. {
  271. var reportDto = new EarlyReportDto();
  272. reportDto.ReportName = earlyPush.EarlyWarningPushName;
  273. reportDto.ReportPushTime = earlyPush.PushTime.Value;
  274. List<string> orderIds = dto.Select(x => x.OrderId).ToList();
  275. //查询所有工单
  276. var orderList = await _orderRepository.Queryable().Where(x => orderIds.Contains(x.Id)).ToListAsync();
  277. var result = (from a in orderList
  278. join b in dto on a.Id equals b.OrderId
  279. select new ReportOrderListDto (){ Id = a.Id, ActualHandleOrgName = a.ActualHandleOrgName, IsSendWord = b.IsSendWord, County = a.County, OneHotspotName = a.HotspotSpliceName.Split("-")[0], HotspotName = a.HotspotName, Status = a.Status,FileOpinion = a.FileOpinion, Content = a.Content }).ToList();
  280. //Title 热点汇总
  281. var reportHotDetail = result.GroupBy(x => x.OneHotspotName).ToList();
  282. reportHotDetail.ForEach(x =>
  283. {
  284. reportDto.ReportHotDetails.Add(new ReportHotDetailDto()
  285. {
  286. HotName = x.Key,
  287. Count = x.Count(),
  288. Content = string.Join(",",result.Where(d=>d.IsSendWord == true && d.OneHotspotName == x.Key).Select(d=>d.Content))
  289. });
  290. });
  291. //Title 地区汇总
  292. reportDto.ReportAreaDetails = result.GroupBy(x => x.County).Select(x=> new ReportAreaDetailDto() { AreaName = x.Key,Count = x.Count() }).ToList();
  293. //附件1:重点诉求处置情况
  294. reportDto.ReportOrderDetails = result.Where(x => x.Status < EOrderStatus.Filed && x.IsSendWord == true).Select(x => new ReportOrderDetailDto() { OneHotSportName = x.OneHotspotName, HotSportName = x.HotspotName, Content = x.Content, ActualOpinion = "已转发" + x.ActualHandleOrgName + ",正在处理中" }).ToList();
  295. //附件2:
  296. //查询往期
  297. var earlyWarningPushDetail = await _earlyWarningPushDetailRepository.Queryable().Includes(x=>x.EarlyWarningPush).Where(x => result.Select(x => x.Id).Contains(x.OrderId)).ToListAsync();
  298. var fujianTwoList = (from a in result
  299. join b in earlyWarningPushDetail on a.Id equals b.OrderId
  300. where a.Status>= EOrderStatus.Filed && a.IsSendWord == true
  301. select new ReportFiledOrderDetailDto() { ReportName = b.EarlyWarningPush.EarlyWarningPushName, OneHotSportName = a.OneHotspotName, HotSportName = a.HotspotName,Content = a.Content, ActualOpinion = a.FileOpinion }).ToList();
  302. reportDto.ReportFiledOrderDetails = fujianTwoList;
  303. return reportDto;
  304. }
  305. /// <summary>
  306. /// 获取推送报告
  307. /// </summary>
  308. /// <param name="id"></param>
  309. /// <returns></returns>
  310. [HttpGet("getearlypush/{id}")]
  311. public async Task<EarlyPushDto> GetEarlyPush(string id)
  312. {
  313. var model = await _earlyWarningPushRepository.Queryable()
  314. .Includes(x => x.EarlyWarningPushDetails)
  315. .Includes(x=>x.EarlyWarningPushDetails,d=>d.Order)
  316. .FirstAsync(HttpContext.RequestAborted);
  317. if (model == null)
  318. throw UserFriendlyException.SameMessage("无效信息");
  319. return _mapper.Map<EarlyPushDto>(model);
  320. }
  321. #endregion
  322. #region 报告接收
  323. /// <summary>
  324. /// 报告接收
  325. /// </summary>
  326. /// <param name="dto"></param>
  327. /// <returns></returns>
  328. [HttpGet("report-receive")]
  329. public async Task<PagedDto<EarlyPushDto>> ReportReceive([FromQuery] ReportReceiveRequest dto)
  330. {
  331. var (total, items) = await _earlyWarningPushRepository.Queryable()
  332. .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningPushName) == false, d => d.EarlyWarningPushName.Contains(dto.EarlyWarningPushName))
  333. .Where(d=> d.PushStatus == EEarlyPushStatus.Pushed && SqlFunc.JsonListObjectAny(d.PushOrgs, "OrgCode", _sessionContext.OrgId))
  334. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  335. return new PagedDto<EarlyPushDto>(total, _mapper.Map<IReadOnlyList<EarlyPushDto>>(items));
  336. }
  337. #endregion
  338. }
  339. }