IndustryApplication.cs 16 KB

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