OrgController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using Hotline.Api.Filter;
  2. using Hotline.Caching.Interfaces;
  3. using Hotline.Application.ExportExcel;
  4. using Hotline.Application.Users;
  5. using Hotline.Configurations;
  6. using Hotline.Permissions;
  7. using Hotline.Settings;
  8. using Hotline.Share.Dtos.Order;
  9. using Hotline.Share.Dtos.Org;
  10. using Hotline.Share.Enums.Order;
  11. using MapsterMapper;
  12. using Microsoft.AspNetCore.Authorization;
  13. using Microsoft.AspNetCore.Mvc;
  14. using Microsoft.Extensions.Options;
  15. using System.Threading.Channels;
  16. using XF.Domain.Authentications;
  17. using XF.Domain.Exceptions;
  18. using XF.Utility.EnumExtensions;
  19. namespace Hotline.Api.Controllers
  20. {
  21. /// <summary>
  22. /// 组织架构相关接口
  23. /// </summary>
  24. public class OrgController : BaseController
  25. {
  26. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  27. private readonly ISystemDomainService _systemDomainService;
  28. private readonly ISystemAreaDomainService _areaDomainService;
  29. private readonly IMapper _mapper;
  30. private readonly ISessionContext _sessionContext;
  31. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  32. private readonly IOrgApplication _orgApplication;
  33. private readonly IExportApplication _exportApplication;
  34. public OrgController(
  35. ISystemOrganizeRepository systemOrganizeRepository,
  36. ISystemDomainService systemDomainService,
  37. ISystemAreaDomainService areaDomainService,
  38. IMapper mapper,
  39. ISessionContext sessionContext,
  40. IOptionsSnapshot<AppConfiguration> appOptions,
  41. IOrgApplication orgApplication,
  42. IExportApplication exportApplication)
  43. {
  44. _systemOrganizeRepository = systemOrganizeRepository;
  45. _systemDomainService = systemDomainService;
  46. _areaDomainService = areaDomainService;
  47. _mapper = mapper;
  48. _sessionContext = sessionContext;
  49. _appOptions = appOptions;
  50. _orgApplication = orgApplication;
  51. _exportApplication = exportApplication;
  52. }
  53. /// <summary>
  54. /// 组织机构获取树形列表
  55. /// </summary>
  56. /// <returns></returns>
  57. [HttpGet("getorgjson")]
  58. [AllowAnonymous]
  59. public async Task<IReadOnlyList<SystemOrganize>> GetOrgJson()
  60. {
  61. return await _systemOrganizeRepository.GetOrgJson();
  62. }
  63. [HttpGet("getorgjsonforuser")]
  64. [AllowAnonymous]
  65. public async Task<IReadOnlyList<SystemOrganize>> GetOrgJsonItems()
  66. {
  67. return await _orgApplication.GetOrgJsonItems();
  68. }
  69. [HttpPost("getorgjsonforuser/export")]
  70. [LogFilterAlpha("导出日志")]
  71. [AllowAnonymous]
  72. public async Task<FileStreamResult> GetOrgJsonItemsExport([FromBody] ExportExcelDto<string> dto)
  73. {
  74. var items = await _systemOrganizeRepository.GetOrgAll(_sessionContext.OrgIsCenter,_sessionContext.RequiredOrgId);
  75. return _exportApplication.GetExcelFile(dto, items.ToList(), "组织架构");
  76. }
  77. ///// <summary>
  78. ///// 新增组织架构
  79. ///// </summary>
  80. ///// <param name="dto"></param>
  81. ///// <returns></returns>
  82. //[HttpPost("add-org")]
  83. //[Obsolete]
  84. //public async Task AddOrg([FromBody] AddOrgDto dto)
  85. //{
  86. // var org = _mapper.Map<SystemOrganize>(dto);
  87. // //验证名称是否重复
  88. // if (await _systemDomainService.IsNameRepeat(dto.Name, HttpContext.RequestAborted) > 0)
  89. // throw UserFriendlyException.SameMessage("组织名称重复");
  90. // if (await _systemDomainService.IsShrotNameRepeat(dto.ShortName, HttpContext.RequestAborted) > 0)
  91. // throw UserFriendlyException.SameMessage("组织简称重复");
  92. // //处理编码
  93. // org.Id = await _systemDomainService.GenerateNewOrgCodeAsync(dto.ParentId, HttpContext.RequestAborted);
  94. // org.InitOrgLevel();
  95. // await _systemOrganizeRepository.AddAsync(org, HttpContext.RequestAborted);
  96. //}
  97. /// <summary>
  98. /// 新增组织架构
  99. /// </summary>
  100. /// <param name="dto"></param>
  101. /// <returns></returns>
  102. [HttpPost]
  103. public async Task Add([FromBody] AddOrgDto dto)
  104. {
  105. var exists = await _systemOrganizeRepository.AnyAsync(
  106. d => d.Name == dto.Name || d.ShortName == dto.ShortName, HttpContext.RequestAborted);
  107. if (exists)
  108. throw UserFriendlyException.SameMessage("名称或简称已存在");
  109. await _systemDomainService.AddOrgAsync(dto, HttpContext.RequestAborted);
  110. }
  111. ///// <summary>
  112. ///// 修改组织架构
  113. ///// </summary>
  114. ///// <param name="dto"></param>
  115. ///// <returns></returns>
  116. //[HttpPost("update-org")]
  117. //[Obsolete]
  118. //public async Task UpdateOrg([FromBody] UpdateOrgDto dto)
  119. //{
  120. // var org = await _systemOrganizeRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  121. // if (org is null)
  122. // throw UserFriendlyException.SameMessage("无效组织架构");
  123. // if (org.Id == dto.ParentId)
  124. // throw UserFriendlyException.SameMessage("父级不能为自己");
  125. // //验证名称是否重复
  126. // if (await _systemDomainService.IsNameRepeat(dto.Name, HttpContext.RequestAborted) > 1)
  127. // throw UserFriendlyException.SameMessage("组织名称重复");
  128. // if (await _systemDomainService.IsShrotNameRepeat(dto.ShortName, HttpContext.RequestAborted) > 1)
  129. // throw UserFriendlyException.SameMessage("组织简称重复");
  130. // _mapper.Map(dto, org);
  131. // await _systemOrganizeRepository.UpdateAsync(org, HttpContext.RequestAborted);
  132. //}
  133. /// <summary>
  134. /// 修改组织架构(不支持修改上级)
  135. /// </summary>
  136. /// <param name="dto"></param>
  137. /// <returns></returns>
  138. [HttpPut]
  139. public async Task Update([FromBody] UpdateOrgDto dto)
  140. {
  141. var org = await _systemOrganizeRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  142. if (org is null)
  143. throw UserFriendlyException.SameMessage("无效组织架构");
  144. if (org.Id == dto.ParentId)
  145. throw UserFriendlyException.SameMessage("父级不能为自己");
  146. var exists = await _systemOrganizeRepository.AnyAsync(
  147. d => d.Id != dto.Id &&
  148. (d.Name == dto.Name || d.ShortName == dto.ShortName), HttpContext.RequestAborted);
  149. if (exists)
  150. throw UserFriendlyException.SameMessage("名称或简称已存在");
  151. _mapper.Map(dto, org);
  152. await _systemOrganizeRepository.UpdateAsync(org, HttpContext.RequestAborted);
  153. }
  154. /// <summary>
  155. /// 删除组织数据
  156. /// </summary>
  157. /// <param name="id"></param>
  158. /// <returns></returns>
  159. [HttpDelete("delete-org/{id}")]
  160. [LogFilter("删除组织")]
  161. public async Task DeleteOrg(string id)
  162. {
  163. var org = await _systemOrganizeRepository.GetAsync(id, HttpContext.RequestAborted);
  164. if (org is null)
  165. throw UserFriendlyException.SameMessage("无效组织架构");
  166. var chail= await _systemOrganizeRepository.AnyAsync(p => p.ParentId == org.Id);
  167. if(chail==true)
  168. throw UserFriendlyException.SameMessage("存在下级部门,请先删除下级部门数据!");
  169. await _systemOrganizeRepository.RemoveAsync(org, true, HttpContext.RequestAborted);
  170. }
  171. /// <summary>
  172. /// 获取组织
  173. /// </summary>
  174. /// <param name="id"></param>
  175. /// <returns></returns>
  176. [HttpGet("getorg/{id}")]
  177. public async Task<SystemOrganize> GetOrg(string id)
  178. {
  179. var org = await _systemOrganizeRepository.GetAsync(id, HttpContext.RequestAborted);
  180. if (org is null)
  181. throw UserFriendlyException.SameMessage("无效组织架构");
  182. return org;
  183. }
  184. /// <summary>
  185. /// 获取一级部门
  186. /// </summary>
  187. /// <param name="id"></param>
  188. /// <returns></returns>
  189. [HttpGet("get_one_org")]
  190. public async Task<List<SystemOrganize>> GetOneOrg()
  191. {
  192. var oneOrgs = await _systemOrganizeRepository.Queryable().Where(x=>x.Level == 1).ToListAsync();
  193. return oneOrgs;
  194. }
  195. /// <summary>
  196. /// 获取可用组织架构树形
  197. /// </summary>
  198. /// <returns></returns>
  199. [HttpGet("getcanuseorg")]
  200. public async Task<IReadOnlyList<SystemOrganize>> GetCanUseOrg()
  201. {
  202. return await _systemOrganizeRepository.GetCanUseOrg();
  203. }
  204. /// <summary>
  205. /// 获取可用组织架构树形(用户管理)
  206. /// </summary>
  207. /// <returns></returns>
  208. [HttpGet("getcanuseorgforuser")]
  209. public async Task<IReadOnlyList<SystemOrganize>> GetCanUseOrgForUser()
  210. {
  211. if (_sessionContext.OrgIsCenter)
  212. {
  213. return await _systemOrganizeRepository.GetCanUseOrg();
  214. }
  215. else
  216. {
  217. return await _systemOrganizeRepository.GetCanUseOrgByOrgCode(_sessionContext.RequiredOrgId);
  218. }
  219. }
  220. [HttpGet("cascade")]
  221. public async Task<IReadOnlyList<SystemOrganize>> GetOrgsCascade([FromQuery]string? id)
  222. {
  223. return await _systemOrganizeRepository.Queryable()
  224. .OrderBy(d => d.Id)
  225. .ToTreeAsync(it => it.Children, it => it.ParentId, id);
  226. }
  227. /// <summary>
  228. /// 新增页面基础数据
  229. /// </summary>
  230. /// <returns></returns>
  231. [HttpGet("base-data-add")]
  232. [Obsolete]
  233. public async Task<object> BaseDataAdd()
  234. {
  235. var rep = new
  236. {
  237. OrgType = EnumExts.GetDescriptions<EOrgType>()
  238. };
  239. return rep;
  240. }
  241. /// <summary>
  242. /// 部门页面基础数据
  243. /// </summary>
  244. /// <returns></returns>
  245. [HttpGet("base-data")]
  246. public async Task<dynamic> BaseData() =>
  247. new
  248. {
  249. OrgTypeOptions = EnumExts.GetDescriptions<EOrgType>(),
  250. Areas = await _areaDomainService.GetAreaTree(_appOptions.Value.IsZiGong ? 6 : 0)
  251. };
  252. }
  253. }