IndustrialManagementController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. using Hotline.Api.Filter;
  2. using Hotline.Application.IndustryClassification;
  3. using Hotline.FlowEngine.Workflows;
  4. using Hotline.IndustryClassification;
  5. using Hotline.Orders;
  6. using Hotline.Repository.SqlSugar.Extensions;
  7. using Hotline.Settings;
  8. using Hotline.Share.Dtos;
  9. using Hotline.Share.Dtos.IndustryClassification;
  10. using Hotline.Share.Dtos.Order;
  11. using Hotline.Share.Requests;
  12. using Hotline.Tools;
  13. using MapsterMapper;
  14. using Microsoft.AspNetCore.Authorization;
  15. using Microsoft.AspNetCore.Mvc;
  16. using NPOI.POIFS.Properties;
  17. using SqlSugar;
  18. using XF.Domain.Authentications;
  19. using XF.Domain.Exceptions;
  20. using XF.Domain.Repository;
  21. namespace Hotline.Api.Controllers
  22. {
  23. /// <summary>
  24. /// 行业管理
  25. /// </summary>
  26. public class IndustrialManagementController : BaseController
  27. {
  28. private readonly IMapper _mapper;
  29. private readonly ISystemOrganizeRepository _organizeRepository;
  30. private readonly IIndustryClassificationRepositpry _industrialManagementRepository;
  31. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  32. private readonly IRepository<Order> _orderRepository;
  33. private readonly ISessionContext _sessionContext;
  34. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  35. private readonly IIndustryClassificationApplication _industryClassificationApplication;
  36. public IndustrialManagementController(IMapper mapper,
  37. ISystemOrganizeRepository organizeRepository,
  38. IIndustryClassificationRepositpry industrialManagementRepository,
  39. IRepository<SystemOrganize> systemOrganizeRepository,
  40. IRepository<Order> orderRepository,
  41. ISessionContext sessionContext,
  42. IRepository<WorkflowStep> workflowStepRepository,
  43. IIndustryClassificationApplication industryClassificationApplication)
  44. {
  45. _mapper = mapper;
  46. _organizeRepository = organizeRepository;
  47. _industrialManagementRepository = industrialManagementRepository;
  48. _systemOrganizeRepository = systemOrganizeRepository;
  49. _orderRepository = orderRepository;
  50. _sessionContext = sessionContext;
  51. _workflowStepRepository = workflowStepRepository;
  52. _industryClassificationApplication = industryClassificationApplication;
  53. }
  54. /// <summary>
  55. /// 获取部门
  56. /// </summary>
  57. /// <returns></returns>
  58. [HttpGet("getorglist")]
  59. public async Task<List<IndustrialOrgs>> GetOrgList()
  60. {
  61. var list = await _systemOrganizeRepository.Queryable()
  62. .Select(p => new IndustrialOrgs
  63. {
  64. OrgId = p.Id,
  65. OrgName = p.Name,
  66. ParentId = p.ParentId,
  67. ParentName = p.ParentId,
  68. IsDisable = SqlFunc.Subqueryable<IndustryAssociations>().Where(d => d.OrganizeId == p.Id).Any()
  69. })
  70. .ToTreeAsync(d => d.Children, it => it.ParentId, null);
  71. return list;
  72. }
  73. /// <summary>
  74. /// 新增行业
  75. /// </summary>
  76. /// <param name="dto"></param>
  77. /// <returns></returns>
  78. [HttpPost("industryadd")]
  79. [LogFilter("新增行业")]
  80. public async Task Add([FromBody] IndustryAddDto dto)
  81. {
  82. if (dto == null)
  83. throw UserFriendlyException.SameMessage("数据错误");
  84. if (string.IsNullOrEmpty(dto.IndustryName))
  85. throw UserFriendlyException.SameMessage("行业名称不能为空");
  86. if (dto.OrgsIds == null || dto.OrgsIds.Count == 0)
  87. throw UserFriendlyException.SameMessage("关联部门不能为空");
  88. var isHas = await _industrialManagementRepository.AnyAsync(p => p.IndustrialName == dto.IndustryName, HttpContext.RequestAborted);
  89. if (isHas)
  90. throw UserFriendlyException.SameMessage("存在此行业名称");
  91. var hasDat = await _industrialManagementRepository.Queryable()
  92. .Includes(d => d.Orgs)
  93. .AnyAsync(d => d.Orgs.Any(p => dto.OrgsIds.Contains(p.Id)));
  94. if (hasDat)
  95. throw UserFriendlyException.SameMessage("部门已关联行业!");
  96. IndustrialManagement industrialManagement = new()
  97. {
  98. IndustrialName = dto.IndustryName,
  99. LastModificationTime = DateTime.Now
  100. };
  101. await _industrialManagementRepository.AddAsync(industrialManagement, HttpContext.RequestAborted);
  102. industrialManagement.Orgs = dto.OrgsIds.Select(d => new SystemOrganize { Id = d }).ToList();
  103. await _industrialManagementRepository.SetIndustrialManagementAsync(industrialManagement, HttpContext.RequestAborted);
  104. }
  105. /// <summary>
  106. /// 修改行业
  107. /// </summary>
  108. /// <param name="dto"></param>
  109. /// <returns></returns>
  110. [HttpPost("industryupdate")]
  111. [LogFilter("修改行业")]
  112. public async Task Update([FromBody] IndustryUpdateDto dto)
  113. {
  114. if (dto == null)
  115. throw UserFriendlyException.SameMessage("数据错误");
  116. if (string.IsNullOrEmpty(dto.IndustryName))
  117. throw UserFriendlyException.SameMessage("行业名称不能为空");
  118. if (dto.OrgsIds == null || dto.OrgsIds.Count == 0)
  119. throw UserFriendlyException.SameMessage("关联部门不能为空");
  120. var isHas = await _industrialManagementRepository.AnyAsync(p => p.IndustrialName == dto.IndustryName && p.Id != dto.Id,
  121. HttpContext.RequestAborted);
  122. if (isHas)
  123. throw UserFriendlyException.SameMessage("存在此行业名称");
  124. var hasDat = await _industrialManagementRepository.Queryable()
  125. .Includes(d => d.Orgs)
  126. .AnyAsync(d => d.Id != dto.Id && d.Orgs.Any(p => dto.OrgsIds.Contains(p.Id)));
  127. if (hasDat)
  128. throw UserFriendlyException.SameMessage("部门已关联行业!");
  129. var data = await _industrialManagementRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
  130. if (data == null)
  131. throw UserFriendlyException.SameMessage("数据查询失败");
  132. data.IndustrialName = dto.IndustryName;
  133. await _industrialManagementRepository.UpdateAsync(data, HttpContext.RequestAborted);
  134. data.Orgs = dto.OrgsIds.Select(d => new SystemOrganize { Id = d }).ToList();
  135. await _industrialManagementRepository.SetIndustrialManagementAsync(data, HttpContext.RequestAborted);
  136. }
  137. /// <summary>
  138. /// 删除行业
  139. /// </summary>
  140. /// <param name="id"></param>
  141. /// <returns></returns>
  142. [HttpDelete("{id}")]
  143. [LogFilter("删除行业")]
  144. public async Task Remove(string id)
  145. {
  146. await _industrialManagementRepository.DelIndustrialManagementAsync(id, cancellationToken: HttpContext.RequestAborted);
  147. }
  148. /// <summary>
  149. /// 根据行业查询部门
  150. /// </summary>
  151. /// <param name="id"></param>
  152. /// <returns></returns>
  153. [HttpGet("getindustryassociationsbyid")]
  154. public async Task<IndustrialManagement> GetIndustryAssociationsById([FromQuery] string id)
  155. {
  156. var data = await _industrialManagementRepository.Queryable()
  157. .Includes(d => d.Orgs)
  158. .Where(d => d.Id == id)
  159. .FirstAsync();
  160. return data;
  161. }
  162. /// <summary>
  163. /// 查询行业列表
  164. /// </summary>
  165. /// <param name="dto"></param>
  166. /// <returns></returns>
  167. [HttpGet("getindustrialmanagementlist")]
  168. public async Task<PagedDto<IndustrialManagementDto>> GetIndustrialManagementList([FromQuery] PagedKeywordRequest dto)
  169. {
  170. var (total, items) = await _industryClassificationApplication.GetIndustrialManagementList(dto)
  171. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  172. return new PagedDto<IndustrialManagementDto>(total, items);
  173. }
  174. /// <summary>
  175. /// 查询行业列表--导出
  176. /// </summary>
  177. /// <param name="dto"></param>
  178. /// <returns></returns>
  179. [HttpPost("getindustrialmanagementlist_export")]
  180. public async Task<FileStreamResult> GetIndustrialManagementListExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  181. {
  182. var query = _industryClassificationApplication.GetIndustrialManagementList(dto.QueryDto);
  183. List<IndustrialManagementDto> data;
  184. if (dto.IsExportAll)
  185. {
  186. data = await query.ToListAsync(HttpContext.RequestAborted);
  187. }
  188. else
  189. {
  190. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  191. data = items;
  192. }
  193. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  194. var dtos = data
  195. .Select(stu => _mapper.Map(stu, typeof(IndustrialManagementDto), dynamicClass))
  196. .Cast<object>()
  197. .ToList();
  198. var stream = ExcelHelper.CreateStream(dtos);
  199. return ExcelStreamResult(stream, "行业列表数据");
  200. }
  201. /// <summary>
  202. /// 行业诉求工单
  203. /// </summary>
  204. [HttpGet("industrial-orders")]
  205. public async Task<PagedDto<IndustrialManagementOrderDto>> GetIndustrialManagementOrderList([FromQuery] IndustrialManagementRequestDto dto)
  206. {
  207. var (total, items) = await _industryClassificationApplication.GetIndustrialManagementOrderList(dto)
  208. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  209. return new PagedDto<IndustrialManagementOrderDto>(total, items);
  210. }
  211. /// <summary>
  212. /// 行业诉求工单--导出
  213. /// </summary>
  214. /// <param name="dto"></param>
  215. /// <returns></returns>
  216. [HttpPost("industrial-orders-export")]
  217. public async Task<FileStreamResult> GetIndustrialManagementOrderListExport([FromBody] ExportExcelDto<IndustrialManagementRequestDto> dto)
  218. {
  219. var query = _industryClassificationApplication.GetIndustrialManagementOrderList(dto.QueryDto);
  220. List<IndustrialManagementOrderDto> data;
  221. if (dto.IsExportAll)
  222. {
  223. data = await query.ToListAsync(HttpContext.RequestAborted);
  224. }
  225. else
  226. {
  227. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  228. data = items;
  229. }
  230. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  231. var dtos = data
  232. .Select(stu => _mapper.Map(stu, typeof(IndustrialManagementOrderDto), dynamicClass))
  233. .Cast<object>()
  234. .ToList();
  235. var stream = ExcelHelper.CreateStream(dtos);
  236. return ExcelStreamResult(stream, "行业诉求工单数据");
  237. }
  238. }
  239. }