IndustryApplication.cs 17 KB

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