using DocumentFormat.OpenXml.Office2010.Excel; using Hotline.Caching.Interfaces; using Hotline.File; using Hotline.Repository.SqlSugar.Extensions; using Hotline.Settings; using Hotline.Share.Dtos; using Hotline.Share.Dtos.Snapshot; using Hotline.Share.Tools; using Hotline.Snapshot; using Hotline.Snapshot.Interfaces; using Hotline.Tools; using Mapster; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using XF.Domain.Dependency; using XF.Domain.Exceptions; namespace Hotline.Application.Snapshot; public class IndustryApplication : IIndustryApplication, IScopeDependency { private readonly IIndustryRepository _industryRepository; private readonly IFileRepository _fileRepository; private readonly ISystemSettingCacheManager _sysSetting; private readonly IIndustryCaseRepository _industryCaseRepository; private readonly ISnapshotSMSTemplateRepository _snapshotSMSTemplateRepository; private readonly IPractitionerRepository _practitionerRepository; private readonly IVolunteerRepository _volunteerRepository; private readonly IVolunteerReportRepository _volunteerReportRepository; private readonly IIndustryLogRepository _industryLogRepository; private readonly ISystemOrganizeRepository _systemOrganizeRepository; public IndustryApplication(IIndustryRepository industryRepository, IFileRepository fileRepository, ISystemSettingCacheManager sysSetting, IIndustryCaseRepository industryCaseRepository, ISnapshotSMSTemplateRepository snapshotSMSTemplateRepository, IPractitionerRepository practitionerRepository, IVolunteerRepository volunteerRepository, IVolunteerReportRepository volunteerReportRepository, IIndustryLogRepository industryLogRepository, ISystemOrganizeRepository systemOrganizeRepository) { _industryRepository = industryRepository; _fileRepository = fileRepository; _sysSetting = sysSetting; _industryCaseRepository = industryCaseRepository; _snapshotSMSTemplateRepository = snapshotSMSTemplateRepository; _practitionerRepository = practitionerRepository; _volunteerRepository = volunteerRepository; _volunteerReportRepository = volunteerReportRepository; _industryLogRepository = industryLogRepository; _systemOrganizeRepository = systemOrganizeRepository; } /// /// 新增行业 /// /// /// /// public async Task AddIndustryAsync(AddIndustryDto dto, CancellationToken cancellationToken) { if (dto.ApproveOrgId.NotNullOrEmpty() && dto.ApproveOrgName.IsNullOrEmpty()) { await _systemOrganizeRepository.GetAsync(dto.ApproveOrgId, cancellationToken) .Then(async org => { dto.ApproveOrgName = org.Name; }); } var entity = dto.Adapt(); var id = await _industryRepository.AddAsync(entity, cancellationToken); if (dto.Files.NotNullOrEmpty()) { var fileEntities = dto.Files.Adapt>(); fileEntities.ForEach(m => m.Key = id); await _fileRepository.AddRangeAsync(fileEntities, cancellationToken); } return id; } [Description("行业集合")] public ISugarQueryable GetIndustres(IndustryListInDto dto) { var query = _industryRepository.Queryable() .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name)) .WhereIF(dto.ApproveOrgName.NotNullOrEmpty(), m => m.ApproveOrgName.Contains(dto.ApproveOrgName)) .OrderByDescending(m => m.CreationTime) .Select(); return query; } public async Task GetIndustryDetailAsync(string id) { var fileServiceUrl = _sysSetting.FileServerUrl; var fileDownloadApi = fileServiceUrl + _sysSetting.FileDownloadApi; var industry = await _industryRepository.GetAsync(id); var files = await _fileRepository.GetByKeyAsync(id, CancellationToken.None); var outDto = industry.Adapt(); outDto.Files = files.Adapt>(); return outDto; } /// /// 修改行业 /// /// /// /// /// public async Task UpdateIndustryAsync(UpdateIndustryInDto dto, CancellationToken requestAborted) { dto.ValidateObject(); if (dto.ApproveOrgId.NotNullOrEmpty() && dto.ApproveOrgName.IsNullOrEmpty()) { await _systemOrganizeRepository.GetAsync(dto.ApproveOrgId, requestAborted) .Then(async org => { dto.ApproveOrgName = org.Name; }); } var entity = await _industryRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"行业不存在 {dto.Id}"); if (dto.Files.NotNullOrEmpty()) { var fileEntities = dto.Files.Adapt>(); fileEntities.ForEach(m => m.Key = entity.Id); await _fileRepository.Removeable().Where(m => m.Key == entity.Id).ExecuteCommandAsync(requestAborted); await _fileRepository.AddRangeAsync(fileEntities, requestAborted); } dto.Adapt(entity); await _industryRepository.UpdateAsync(entity, requestAborted); } #region 行业线索 [Description("行业线索")] public ISugarQueryable GetIndustryCaseItems(IndustryCaseItemInDto dto) { var query = _industryCaseRepository.Queryable() .LeftJoin((c, i) => c.IndustryId == i.Id) .WhereIF(dto.IndustryName.NotNullOrEmpty(), (c, i) => i.Name.Contains(dto.IndustryName)) .WhereIF(dto.CaseName.NotNullOrEmpty(), (c, i) => c.Name.Contains(dto.CaseName)) .OrderByDescending((c, i) => c.CreationTime) .Select((c, i) => new IndustryCaseItemOutDto { Id = c.Id, Name = c.Name, IndustryId = i.Id, IndustryName = i.Name }, true); return query; } /// /// 添加行业线索 /// /// /// public async Task AddIndustryCaseAsync(AddIndustryCaseDto dto) { dto.ValidateObject(); var entity = dto.Adapt(); return await _industryCaseRepository.AddAsync(entity); } /// /// 修改行业线索 /// /// /// public async Task UpdateIndustryCaseAsync(UpdateIndustryCaseDto dto) { dto.ValidateObject(); var entity = await _industryCaseRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"行业线索不存在 {dto.Id}"); dto.Adapt(entity); await _industryCaseRepository.UpdateAsync(entity); } public async Task GetIndustryCaseAsync(string caseId) { return await _industryCaseRepository.GetAsync(caseId); } #endregion #region 行业短信模板 /// /// 行业模板集合 /// /// /// [Description("行业模板")] public ISugarQueryable GetSMSTemplates(SnapshotSMSTemplateItemsInDto dto) { var query = _snapshotSMSTemplateRepository.Queryable() .LeftJoin((s, i) => s.IndustryId == i.Id) .WhereIF(dto.IndustryName.NotNullOrEmpty(), (s, i) => i.Name.Contains(dto.IndustryName)) .OrderByDescending((s, i) => s.DisplayOrder) .Select(); return query; } /// /// 添加行业模板 /// /// /// public async Task AddSMSTemplateAsync(AddSnapshotSMSTemplateInDto dto) { dto.ValidateObject(); var entity = dto.Adapt(); return await _snapshotSMSTemplateRepository.AddAsync(entity); } /// /// 修改行业模板 /// /// /// public async Task UpdateSMSTemplateAsync(UpdateSnapshotSMSTemplateInDto dto) { dto.ValidateObject(); var entity = await _snapshotSMSTemplateRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"行业短信模板不存在 {dto.Id}"); dto.Adapt(entity); await _snapshotSMSTemplateRepository.UpdateAsync(entity); } /// /// 短信详情 /// /// /// public async Task GetSMSTemplateDetailAsync(string id) { return await _snapshotSMSTemplateRepository.Queryable() .LeftJoin((s, i) => s.IndustryId == i.Id) .Where((s, i) => s.Id == id) .Select((s, i) => new SnapshotSMSTemplateItemsOutDto { Status = s.Status }, true) .FirstAsync(); } #endregion #region 区域从业人员 /// /// 区域从业人员集合 /// /// /// /// public ISugarQueryable GetPractitionerItems(PractitionerItemsInDto dto) { var query = _practitionerRepository.Queryable() .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name!)) .WhereIF(dto.SystemAreaName.NotNullOrEmpty(), m => m.SystemAreaName.Contains(dto.SystemAreaName!)) .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber!)) .OrderByDescending(m => m.CreationTime) .Select(); return query; } /// /// 添加区域从业人员 /// /// /// public async Task AddPractitionerAsync(AddPractitionerInDto dto) { dto.ValidateObject(); var entity = dto.Adapt(); return await _practitionerRepository.AddAsync(entity); } /// /// 区域从业人员详情 /// /// /// public async Task GetPractitionerAsync(string id) { return (await _practitionerRepository.GetAsync(id)).Adapt(); } /// /// 删除区域从业人员 /// /// /// public async Task DeletePractitionerAsync(IList id) { await _practitionerRepository.Updateable() .SetColumns(m => m.IsDeleted, true) .Where(m => id.Contains(m.Id)) .ExecuteCommandAsync(); } /// /// 修改区域从业人员 /// /// /// public async Task UpdatePractitionerAsync(UpdatePractitionerInDto dto) { dto.ValidateObject(); var entity = await _practitionerRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"从业人员不存在 {dto.Id}"); dto.Adapt(entity); await _practitionerRepository.UpdateAsync(entity); } #endregion #region 志愿者 /// /// 志愿者集合 /// /// /// /// public ISugarQueryable GetVolunteerItems(VolunteerItemsInDto dto) { var query = _volunteerRepository.Queryable() .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name)) .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber)) .OrderByDescending(m => m.CreationTime) .Select(); return query; } /// /// 添加志愿者 /// /// /// public async Task AddVolunteerAsync(AddVolunteerInDto dto) { var entity = dto.Adapt(); entity.Id = await _volunteerRepository.AddAsync(entity); return entity.Id; } /// /// 批量删除志愿者 /// /// /// public async Task DeleteVolunteerAsync(IList ids) { await _volunteerRepository.Updateable() .SetColumns(m => m.IsDeleted, true) .Where(m => ids.Contains(m.Id)) .ExecuteCommandAsync(); } /// /// 志愿者详情 /// /// /// public async Task GetVolunteerAsync(string id) { return await _volunteerRepository.GetAsync(id); } /// /// 修改志愿者 /// /// /// public async Task UpdateVolunteerAsync(UpdateVolunteerInDto dto) { dto.ValidateObject(); var entity = await _volunteerRepository.GetAsync(dto.Id) ?? throw UserFriendlyException.SameMessage($"志愿者不存在 {dto.Id}"); dto.Adapt(entity); await _volunteerRepository.UpdateAsync(entity); } /// /// 志愿者上报集合 /// /// /// public ISugarQueryable GetVolunteerReportItems(VolunteerReportItemsInDto dto) { var query = _volunteerReportRepository.Queryable() .WhereIF(dto.Name.NotNullOrEmpty(), m => m.Name.Contains(dto.Name)) .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), m => m.PhoneNumber.Contains(dto.PhoneNumber)) .OrderByDescending(m => m.CreationTime) .Select(); return query; } /// /// 行业修改记录 /// /// /// public ISugarQueryable GetIndustryLogItems(IndustryLogItemsInDto dto) { var query = _industryLogRepository.Queryable() .WhereIF(dto.No.NotNullOrEmpty(), m => m.No.Contains(dto.No)) .WhereIF(dto.ChangeName.NotNullOrEmpty(), m => m.CreatorName.Contains(dto.ChangeName)) .WhereIF(dto.IndustryName.NotNullOrEmpty(), m => m.IndustryName.Contains(dto.IndustryName)) .WhereIF(dto.oldIndustryName.NotNullOrEmpty(), m => m.OldIndustryName.Contains(dto.oldIndustryName)) .WhereIF(dto.BeginTime.HasValue && dto.EndTime.HasValue, m => m.CreationTime >= dto.BeginTime.Value && m.CreationTime <= dto.EndTime.Value) .Select(); return query; } /// /// 删除行业短信模板 /// /// /// public async Task DeleteSMSTemplateAsync(IList ids) { await _snapshotSMSTemplateRepository.Queryable() .Where(m => ids.Contains(m.Id)) .ToListAsync() .Then(async sms => { for (int i = 0;i < sms.Count;i++) { sms[i].IsDeleted = true; await _snapshotSMSTemplateRepository.UpdateAsync(sms[i]); } }); } #endregion }