IndustryApplication.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. using DocumentFormat.OpenXml.Office2010.Excel;
  2. using Hotline.Caching.Interfaces;
  3. using Hotline.File;
  4. using Hotline.Repository.SqlSugar.Extensions;
  5. using Hotline.Settings;
  6. using Hotline.Share.Dtos;
  7. using Hotline.Share.Dtos.Snapshot;
  8. using Hotline.Share.Tools;
  9. using Hotline.Snapshot;
  10. using Hotline.Snapshot.Interfaces;
  11. using Hotline.Tools;
  12. using Mapster;
  13. using SqlSugar;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.ComponentModel;
  17. using System.Linq;
  18. using System.Text;
  19. using System.Threading;
  20. using System.Threading.Tasks;
  21. using XF.Domain.Dependency;
  22. using XF.Domain.Exceptions;
  23. namespace Hotline.Application.Snapshot;
  24. public class IndustryApplication : IIndustryApplication, IScopeDependency
  25. {
  26. private readonly IIndustryRepository _industryRepository;
  27. private readonly IFileRepository _fileRepository;
  28. private readonly ISystemSettingCacheManager _sysSetting;
  29. private readonly IIndustryCaseRepository _industryCaseRepository;
  30. private readonly ISnapshotSMSTemplateRepository _snapshotSMSTemplateRepository;
  31. private readonly IPractitionerRepository _practitionerRepository;
  32. private readonly IVolunteerRepository _volunteerRepository;
  33. private readonly IVolunteerReportRepository _volunteerReportRepository;
  34. private readonly IIndustryLogRepository _industryLogRepository;
  35. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  36. public IndustryApplication(IIndustryRepository industryRepository, IFileRepository fileRepository, ISystemSettingCacheManager sysSetting, IIndustryCaseRepository industryCaseRepository, ISnapshotSMSTemplateRepository snapshotSMSTemplateRepository, IPractitionerRepository practitionerRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, IIndustryLogRepository industryLogRepository, ISystemOrganizeRepository systemOrganizeRepository)
  37. {
  38. _industryRepository = industryRepository;
  39. _fileRepository = fileRepository;
  40. _sysSetting = sysSetting;
  41. _industryCaseRepository = industryCaseRepository;
  42. _snapshotSMSTemplateRepository = snapshotSMSTemplateRepository;
  43. _practitionerRepository = practitionerRepository;
  44. _volunteerRepository = volunteerRepository;
  45. _volunteerReportRepository = volunteerReportRepository;
  46. _industryLogRepository = industryLogRepository;
  47. _systemOrganizeRepository = systemOrganizeRepository;
  48. }
  49. /// <summary>
  50. /// 新增行业
  51. /// </summary>
  52. /// <param name="dto"></param>
  53. /// <returns></returns>
  54. /// <exception cref="NotImplementedException"></exception>
  55. public async Task<string> AddIndustryAsync(AddIndustryDto dto, CancellationToken cancellationToken)
  56. {
  57. if (dto.ApproveOrgId.NotNullOrEmpty() && dto.ApproveOrgName.IsNullOrEmpty())
  58. {
  59. await _systemOrganizeRepository.GetAsync(dto.ApproveOrgId, cancellationToken)
  60. .Then(async org => { dto.ApproveOrgName = org.Name; });
  61. }
  62. var entity = dto.Adapt<Industry>();
  63. var id = await _industryRepository.AddAsync(entity, cancellationToken);
  64. if (dto.Files.NotNullOrEmpty())
  65. {
  66. var fileEntities = dto.Files.Adapt<List<Hotline.File.File>>();
  67. fileEntities.ForEach(m => m.Key = id);
  68. await _fileRepository.AddRangeAsync(fileEntities, cancellationToken);
  69. }
  70. return id;
  71. }
  72. [Description("行业集合")]
  73. public ISugarQueryable<IndustryItemsOutDto> GetIndustres(IndustryListInDto dto)
  74. {
  75. var query = _industryRepository.Queryable()
  76. .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name))
  77. .WhereIF(dto.ApproveOrgName.NotNullOrEmpty(), m => m.ApproveOrgName.Contains(dto.ApproveOrgName))
  78. .OrderByDescending(m => m.CreationTime)
  79. .Select<IndustryItemsOutDto>();
  80. return query;
  81. }
  82. public async Task<IndustryDetailOutDto> GetIndustryDetailAsync(string id)
  83. {
  84. var fileServiceUrl = _sysSetting.FileServerUrl;
  85. var fileDownloadApi = fileServiceUrl + _sysSetting.FileDownloadApi;
  86. var industry = await _industryRepository.GetAsync(id);
  87. var files = await _fileRepository.GetByKeyAsync(id, CancellationToken.None);
  88. var outDto = industry.Adapt<IndustryDetailOutDto>();
  89. outDto.Files = files.Adapt<IList<IndustryFileDto>>();
  90. return outDto;
  91. }
  92. /// <summary>
  93. /// 修改行业
  94. /// </summary>
  95. /// <param name="dto"></param>
  96. /// <param name="requestAborted"></param>
  97. /// <returns></returns>
  98. /// <exception cref="NotImplementedException"></exception>
  99. public async Task UpdateIndustryAsync(UpdateIndustryInDto dto, CancellationToken requestAborted)
  100. {
  101. dto.ValidateObject();
  102. if (dto.ApproveOrgId.NotNullOrEmpty() && dto.ApproveOrgName.IsNullOrEmpty())
  103. {
  104. await _systemOrganizeRepository.GetAsync(dto.ApproveOrgId, requestAborted)
  105. .Then(async org => { dto.ApproveOrgName = org.Name; });
  106. }
  107. var entity = await _industryRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"行业不存在 {dto.Id}");
  108. if (dto.Files.NotNullOrEmpty())
  109. {
  110. var fileEntities = dto.Files.Adapt<List<File.File>>();
  111. fileEntities.ForEach(m => m.Key = entity.Id);
  112. await _fileRepository.Removeable().Where(m => m.Key == entity.Id).ExecuteCommandAsync(requestAborted);
  113. await _fileRepository.AddRangeAsync(fileEntities, requestAborted);
  114. }
  115. dto.Adapt(entity);
  116. await _industryRepository.UpdateAsync(entity, requestAborted);
  117. }
  118. #region 行业线索
  119. [Description("行业线索")]
  120. public ISugarQueryable<IndustryCaseItemOutDto> GetIndustryCaseItems(IndustryCaseItemInDto dto)
  121. {
  122. var query = _industryCaseRepository.Queryable()
  123. .LeftJoin<Industry>((c, i) => c.IndustryId == i.Id)
  124. .WhereIF(dto.IndustryName.NotNullOrEmpty(), (c, i) => i.Name.Contains(dto.IndustryName))
  125. .WhereIF(dto.CaseName.NotNullOrEmpty(), (c, i) => c.Name.Contains(dto.CaseName))
  126. .OrderByDescending((c, i) => c.CreationTime)
  127. .Select<IndustryCaseItemOutDto>((c, i) =>
  128. new IndustryCaseItemOutDto
  129. {
  130. Id = c.Id,
  131. Name = c.Name,
  132. IndustryId = i.Id,
  133. IndustryName = i.Name
  134. }, true);
  135. return query;
  136. }
  137. /// <summary>
  138. /// 添加行业线索
  139. /// </summary>
  140. /// <param name="dto"></param>
  141. /// <returns></returns>
  142. public async Task<string> AddIndustryCaseAsync(AddIndustryCaseDto dto)
  143. {
  144. dto.ValidateObject();
  145. var entity = dto.Adapt<IndustryCase>();
  146. return await _industryCaseRepository.AddAsync(entity);
  147. }
  148. /// <summary>
  149. /// 修改行业线索
  150. /// </summary>
  151. /// <param name="dto"></param>
  152. /// <returns></returns>
  153. public async Task UpdateIndustryCaseAsync(UpdateIndustryCaseDto dto)
  154. {
  155. dto.ValidateObject();
  156. var entity = await _industryCaseRepository.GetAsync(dto.Id)
  157. ?? throw UserFriendlyException.SameMessage($"行业线索不存在 {dto.Id}");
  158. dto.Adapt(entity);
  159. await _industryCaseRepository.UpdateAsync(entity);
  160. }
  161. public async Task<IndustryCase> GetIndustryCaseAsync(string caseId)
  162. {
  163. return await _industryCaseRepository.GetAsync(caseId);
  164. }
  165. #endregion
  166. #region 行业短信模板
  167. /// <summary>
  168. /// 行业模板集合
  169. /// </summary>
  170. /// <param name="dto"></param>
  171. /// <returns></returns>
  172. [Description("行业模板")]
  173. public ISugarQueryable<SnapshotSMSTemplateItemsOutDto> GetSMSTemplates(SnapshotSMSTemplateItemsInDto dto)
  174. {
  175. var query = _snapshotSMSTemplateRepository.Queryable()
  176. .LeftJoin<Industry>((s, i) => s.IndustryId == i.Id)
  177. .WhereIF(dto.IndustryName.NotNullOrEmpty(), (s, i) => i.Name.Contains(dto.IndustryName))
  178. .OrderByDescending((s, i) => s.DisplayOrder)
  179. .Select<SnapshotSMSTemplateItemsOutDto>();
  180. return query;
  181. }
  182. /// <summary>
  183. /// 添加行业模板
  184. /// </summary>
  185. /// <param name="dto"></param>
  186. /// <returns></returns>
  187. public async Task<string> AddSMSTemplateAsync(AddSnapshotSMSTemplateInDto dto)
  188. {
  189. dto.ValidateObject();
  190. var entity = dto.Adapt<SnapshotSMSTemplate>();
  191. return await _snapshotSMSTemplateRepository.AddAsync(entity);
  192. }
  193. /// <summary>
  194. /// 修改行业模板
  195. /// </summary>
  196. /// <param name="dto"></param>
  197. /// <returns></returns>
  198. public async Task UpdateSMSTemplateAsync(UpdateSnapshotSMSTemplateInDto dto)
  199. {
  200. dto.ValidateObject();
  201. var entity = await _snapshotSMSTemplateRepository.GetAsync(dto.Id)
  202. ?? throw UserFriendlyException.SameMessage($"行业短信模板不存在 {dto.Id}");
  203. dto.Adapt(entity);
  204. await _snapshotSMSTemplateRepository.UpdateAsync(entity);
  205. }
  206. /// <summary>
  207. /// 短信详情
  208. /// </summary>
  209. /// <param name="id"></param>
  210. /// <returns></returns>
  211. public async Task<SnapshotSMSTemplateItemsOutDto> GetSMSTemplateDetailAsync(string id)
  212. {
  213. return await _snapshotSMSTemplateRepository.Queryable()
  214. .LeftJoin<Industry>((s, i) => s.IndustryId == i.Id)
  215. .Where((s, i) => s.Id == id)
  216. .Select((s, i) => new SnapshotSMSTemplateItemsOutDto
  217. {
  218. Status = s.Status
  219. }, true)
  220. .FirstAsync();
  221. }
  222. #endregion
  223. #region 区域从业人员
  224. /// <summary>
  225. /// 区域从业人员集合
  226. /// </summary>
  227. /// <param name="dto"></param>
  228. /// <returns></returns>
  229. /// <exception cref="NotImplementedException"></exception>
  230. public ISugarQueryable<PractitionerItemsOutDto> GetPractitionerItems(PractitionerItemsInDto dto)
  231. {
  232. var query = _practitionerRepository.Queryable()
  233. .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name!))
  234. .WhereIF(dto.SystemAreaName.NotNullOrEmpty(), m => m.SystemAreaName.Contains(dto.SystemAreaName!))
  235. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber!))
  236. .OrderByDescending(m => m.CreationTime)
  237. .Select<PractitionerItemsOutDto>();
  238. return query;
  239. }
  240. /// <summary>
  241. /// 添加区域从业人员
  242. /// </summary>
  243. /// <param name="dto"></param>
  244. /// <returns></returns>
  245. public async Task<string> AddPractitionerAsync(AddPractitionerInDto dto)
  246. {
  247. dto.ValidateObject();
  248. var entity = dto.Adapt<Practitioner>();
  249. return await _practitionerRepository.AddAsync(entity);
  250. }
  251. /// <summary>
  252. /// 区域从业人员详情
  253. /// </summary>
  254. /// <param name="id"></param>
  255. /// <returns></returns>
  256. public async Task<PractitionerItemsOutDto> GetPractitionerAsync(string id)
  257. {
  258. return (await _practitionerRepository.GetAsync(id)).Adapt<PractitionerItemsOutDto>();
  259. }
  260. /// <summary>
  261. /// 删除区域从业人员
  262. /// </summary>
  263. /// <param name="id"></param>
  264. /// <returns></returns>
  265. public async Task DeletePractitionerAsync(IList<string> id)
  266. {
  267. await _practitionerRepository.Updateable()
  268. .SetColumns(m => m.IsDeleted, true)
  269. .Where(m => id.Contains(m.Id))
  270. .ExecuteCommandAsync();
  271. }
  272. /// <summary>
  273. /// 修改区域从业人员
  274. /// </summary>
  275. /// <param name="dto"></param>
  276. /// <returns></returns>
  277. public async Task UpdatePractitionerAsync(UpdatePractitionerInDto dto)
  278. {
  279. dto.ValidateObject();
  280. var entity = await _practitionerRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"从业人员不存在 {dto.Id}");
  281. dto.Adapt(entity);
  282. await _practitionerRepository.UpdateAsync(entity);
  283. }
  284. #endregion
  285. #region 志愿者
  286. /// <summary>
  287. /// 志愿者集合
  288. /// </summary>
  289. /// <param name="dto"></param>
  290. /// <returns></returns>
  291. /// <exception cref="NotImplementedException"></exception>
  292. public ISugarQueryable<VolunteerItemsOutDto> GetVolunteerItems(VolunteerItemsInDto dto)
  293. {
  294. var query = _volunteerRepository.Queryable()
  295. .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name))
  296. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber))
  297. .OrderByDescending(m => m.CreationTime)
  298. .Select<VolunteerItemsOutDto>();
  299. return query;
  300. }
  301. /// <summary>
  302. /// 添加志愿者
  303. /// </summary>
  304. /// <param name="dto"></param>
  305. /// <returns></returns>
  306. public async Task<string> AddVolunteerAsync(AddVolunteerInDto dto)
  307. {
  308. var entity = dto.Adapt<Volunteer>();
  309. entity.Id = await _volunteerRepository.AddAsync(entity);
  310. return entity.Id;
  311. }
  312. /// <summary>
  313. /// 批量删除志愿者
  314. /// </summary>
  315. /// <param name="ids"></param>
  316. /// <returns></returns>
  317. public async Task DeleteVolunteerAsync(IList<string> ids)
  318. {
  319. await _volunteerRepository.Updateable()
  320. .SetColumns(m => m.IsDeleted, true)
  321. .Where(m => ids.Contains(m.Id))
  322. .ExecuteCommandAsync();
  323. }
  324. /// <summary>
  325. /// 志愿者详情
  326. /// </summary>
  327. /// <param name="id"></param>
  328. /// <returns></returns>
  329. public async Task<Volunteer> GetVolunteerAsync(string id)
  330. {
  331. return await _volunteerRepository.GetAsync(id);
  332. }
  333. /// <summary>
  334. /// 修改志愿者
  335. /// </summary>
  336. /// <param name="dto"></param>
  337. /// <returns></returns>
  338. public async Task UpdateVolunteerAsync(UpdateVolunteerInDto dto)
  339. {
  340. dto.ValidateObject();
  341. var entity = await _volunteerRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"志愿者不存在 {dto.Id}");
  342. dto.Adapt(entity);
  343. await _volunteerRepository.UpdateAsync(entity);
  344. }
  345. /// <summary>
  346. /// 志愿者上报集合
  347. /// </summary>
  348. /// <param name="dto"></param>
  349. /// <returns></returns>
  350. public ISugarQueryable<VolunteerReportItemsOutDto> GetVolunteerReportItems(VolunteerReportItemsInDto dto)
  351. {
  352. var query = _volunteerReportRepository.Queryable()
  353. .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name))
  354. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber))
  355. .OrderByDescending(m => m.CreationTime)
  356. .Select<VolunteerReportItemsOutDto>();
  357. return query;
  358. }
  359. /// <summary>
  360. /// 行业修改记录
  361. /// </summary>
  362. /// <param name="dto"></param>
  363. /// <returns></returns>
  364. public ISugarQueryable<IndustryLogItemsOutDto> GetIndustryLogItems(IndustryLogItemsInDto dto)
  365. {
  366. var query = _industryLogRepository.Queryable()
  367. .WhereIF(dto.No.NotNullOrEmpty(), m => m.No.Contains(dto.No))
  368. .WhereIF(dto.ChangeName.NotNullOrEmpty(), m => m.CreatorName.Contains(dto.ChangeName))
  369. .WhereIF(dto.IndustryName.NotNullOrEmpty(), m => m.IndustryName.Contains(dto.IndustryName))
  370. .WhereIF(dto.oldIndustryName.NotNullOrEmpty(), m => m.OldIndustryName.Contains(dto.oldIndustryName))
  371. .WhereIF(dto.BeginTime.HasValue && dto.EndTime.HasValue, m => m.CreationTime >= dto.BeginTime.Value && m.CreationTime <= dto.EndTime.Value)
  372. .Select<IndustryLogItemsOutDto>();
  373. return query;
  374. }
  375. /// <summary>
  376. /// 删除行业短信模板
  377. /// </summary>
  378. /// <param name="ids"></param>
  379. /// <returns></returns>
  380. public async Task DeleteSMSTemplateAsync(IList<string> ids)
  381. {
  382. await _snapshotSMSTemplateRepository.Queryable()
  383. .Where(m => ids.Contains(m.Id))
  384. .ToListAsync()
  385. .Then(async sms => {
  386. for (int i = 0;i < sms.Count;i++)
  387. {
  388. sms[i].IsDeleted = true;
  389. await _snapshotSMSTemplateRepository.UpdateAsync(sms[i]);
  390. }
  391. });
  392. }
  393. #endregion
  394. }