ExportWordController.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using Hotline.Application.ExportWord;
  2. using Hotline.Caching.Interfaces;
  3. using Hotline.Configurations;
  4. using Hotline.Orders;
  5. using Hotline.Quality;
  6. using Hotline.Settings;
  7. using Hotline.Share.Dtos.OrderExportWord;
  8. using Hotline.Share.Dtos.QualityExportWord;
  9. using Hotline.Share.Enums.Order;
  10. using MapsterMapper;
  11. using Microsoft.AspNetCore.Mvc;
  12. using Microsoft.Extensions.Options;
  13. using MongoDB.Driver.Linq;
  14. using Novacode.NETCorePort;
  15. using XF.Domain.Repository;
  16. using XF.Utility.EnumExtensions;
  17. namespace Hotline.Api.Controllers
  18. {
  19. public class ExportWordController : BaseController
  20. {
  21. private readonly IOrderRepository _orderRepository;
  22. private readonly IWordHelperService _wordHelperService;
  23. private readonly IMapper _mapper;
  24. private readonly IRepository<OrderVisit> _orderVisitRepository;
  25. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  26. private readonly ILogger<ExportWordController> _logger;
  27. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  28. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  29. private readonly IQualityRepository _qualityRepository;
  30. public ExportWordController(IOrderRepository orderRepository,
  31. IWordHelperService wordHelperService,
  32. IMapper mapper,
  33. IRepository<OrderVisit> orderVisitRepository,
  34. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  35. ILogger<ExportWordController> logger,
  36. IOptionsSnapshot<AppConfiguration> appOptions,
  37. ISystemSettingCacheManager systemSettingCacheManager,
  38. IQualityRepository qualityRepository)
  39. {
  40. _orderRepository = orderRepository;
  41. _wordHelperService = wordHelperService;
  42. _mapper = mapper;
  43. _orderVisitRepository = orderVisitRepository;
  44. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  45. _logger = logger;
  46. _appOptions = appOptions;
  47. _systemSettingCacheManager = systemSettingCacheManager;
  48. _qualityRepository = qualityRepository;
  49. }
  50. /// <summary>
  51. /// 工单交办单导出
  52. /// </summary>
  53. /// <returns></returns>
  54. [HttpPost("order_submission_form")]
  55. public async Task<IActionResult> OrderSubmissionForm([FromBody] List<string> Ids)
  56. {
  57. var streams = new Dictionary<string, Stream>();
  58. var path = $"{Directory.GetCurrentDirectory()}/Template/AssignmentForm.doc";
  59. int num = 1;
  60. var isTheAssignmentFormConfidential = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTheAssignmentFormConfidential).SettingValue[0]);
  61. foreach (var item in Ids)
  62. {
  63. var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
  64. if (order == null)
  65. continue;
  66. //处理保密数据
  67. if (isTheAssignmentFormConfidential && order.IsSecret)
  68. {
  69. var maskString = "***";
  70. order.Contact = maskString;
  71. order.FromName = maskString;
  72. order.FromGender = EGender.Unknown;
  73. order.FromPhone = maskString;
  74. order.FullAddress = maskString;
  75. order.Address = maskString;
  76. order.City = maskString;
  77. order.Street = maskString;
  78. order.ContactMask = maskString;
  79. }
  80. var exportTest = _mapper.Map<OrderSubmissionForm>(order);
  81. if (_appOptions.Value.IsZiGong)
  82. exportTest.CityName = "自贡市";
  83. else if (_appOptions.Value.IsYiBin)
  84. exportTest.CityName = "宜宾市";
  85. else if (_appOptions.Value.IsLuZhou)
  86. exportTest.CityName = "泸州市";
  87. //查询回访信息
  88. var visitData = await _orderVisitRepository.GetAsync(p => p.OrderId == order.Id && p.VisitState == EVisitState.Visited, HttpContext.RequestAborted);
  89. if (visitData != null)
  90. {
  91. //回访明细
  92. var visitDetail = await _orderVisitedDetailRepository.Queryable().Where(p => p.VisitId == visitData.Id && p.VisitTarget == Share.Enums.Order.EVisitTarget.Org).ToListAsync();
  93. string visit = "";
  94. foreach (var itemVisit in visitDetail)
  95. {
  96. visit += "回访部门:" + itemVisit.VisitOrgName;
  97. visit += " \n办件结果:" + itemVisit.OrgProcessingResults?.Value + " 办事态度:" + itemVisit.OrgHandledAttitude?.Value + "\n";
  98. if (itemVisit.VisitOrgCode == order.ActualHandleOrgCode)
  99. exportTest.VisitContent = "回访内容:" + itemVisit.VisitContent;
  100. }
  101. exportTest.VisitOrg = visit;
  102. }
  103. if (Ids.Count > 1)
  104. {
  105. streams.Add(order.No + "_" + num + path.Substring(path.LastIndexOf(".")), _wordHelperService.WordStream(path, exportTest));
  106. num = num + 1;
  107. }
  108. else
  109. {
  110. var btyes = _wordHelperService.WordByte(path, exportTest);
  111. HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
  112. return File(btyes, "application/vnd.ms-word", order.No + path.Substring(path.LastIndexOf(".")));
  113. }
  114. }
  115. //调用压缩方法 进行压缩 (接收byte[] 数据)
  116. byte[] fileBytes = _wordHelperService.ConvertZipStream(streams);
  117. HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
  118. var name = DateTime.Now.ToString("yyyyMMddHHmmss");
  119. return File(fileBytes, "application/octet-stream", $"{name}.zip");
  120. }
  121. /// <summary>
  122. /// 质检单导出
  123. /// </summary>
  124. /// <param name="Ids"></param>
  125. /// <returns></returns>
  126. [HttpPost("quality_certificate")]
  127. public async Task<IActionResult> QualityCertificate([FromBody] List<string> Ids) {
  128. var streams = new Dictionary<string, Stream>();
  129. var path = $"{Directory.GetCurrentDirectory()}/Template/QualityCertificate.doc";
  130. int num = 1;
  131. foreach (var item in Ids)
  132. {
  133. var quality = await _qualityRepository.GetAsync(item, HttpContext.RequestAborted);
  134. if (quality == null)
  135. continue;
  136. var order = await _orderRepository.GetAsync(quality.OrderId, HttpContext.RequestAborted);
  137. if (order == null)
  138. continue;
  139. var exportTest = _mapper.Map<QualityCertificate>(order);
  140. if (_appOptions.Value.IsZiGong)
  141. exportTest.CityName = "自贡市";
  142. else if (_appOptions.Value.IsYiBin)
  143. exportTest.CityName = "宜宾市";
  144. else if (_appOptions.Value.IsLuZhou)
  145. exportTest.CityName = "泸州市";
  146. //质检信息
  147. exportTest.Grade = quality.Grade.ToString();
  148. exportTest.QualityContent = quality.Content;
  149. exportTest.UserName = quality.UserName;
  150. exportTest.QualityTime = quality.QualityTime.HasValue? quality.QualityTime.Value.ToString("yyyy-MM-dd HH:mm:ss") :string.Empty;
  151. exportTest.CenterToOrgTime = order.CenterToOrgTime.HasValue ? order.CenterToOrgTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : string.Empty;
  152. exportTest.CreationTime = order.CreationTime.ToString("yyyy-MM-dd HH:mm:ss");
  153. exportTest.ExpiredTime = order.ExpiredTime.HasValue ? order.ExpiredTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : string.Empty;
  154. exportTest.FromGender = order.FromGender.GetDescription();
  155. //查询回访信息
  156. var visitData = await _orderVisitRepository.GetAsync(p => p.OrderId == order.Id && p.VisitState == EVisitState.Visited, HttpContext.RequestAborted);
  157. if (visitData != null)
  158. {
  159. //回访明细
  160. var visitDetail = await _orderVisitedDetailRepository.Queryable().Where(p => p.VisitId == visitData.Id && p.VisitTarget == Share.Enums.Order.EVisitTarget.Org).ToListAsync();
  161. string visit = "";
  162. foreach (var itemVisit in visitDetail)
  163. {
  164. visit += "回访部门:" + itemVisit.VisitOrgName;
  165. visit += " \n办件结果:" + itemVisit.OrgProcessingResults?.Value + " 办事态度:" + itemVisit.OrgHandledAttitude?.Value + "\n";
  166. if (itemVisit.VisitOrgCode == order.ActualHandleOrgCode)
  167. exportTest.VisitContent = "回访内容:" + itemVisit.VisitContent;
  168. }
  169. exportTest.VisitOrg = visit;
  170. }
  171. if (Ids.Count > 1)
  172. {
  173. streams.Add(order.No + "_" + num + path.Substring(path.LastIndexOf(".")), _wordHelperService.WordStream(path, exportTest));
  174. num = num + 1;
  175. }
  176. else
  177. {
  178. var btyes = _wordHelperService.WordByte(path, exportTest);
  179. HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
  180. return File(btyes, "application/vnd.ms-word", order.No + path.Substring(path.LastIndexOf(".")));
  181. }
  182. }
  183. //调用压缩方法 进行压缩 (接收byte[] 数据)
  184. byte[] fileBytes = _wordHelperService.ConvertZipStream(streams);
  185. HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
  186. var name = DateTime.Now.ToString("yyyyMMddHHmmss");
  187. return File(fileBytes, "application/octet-stream", $"{name}.zip");
  188. }
  189. }
  190. }