using AutoMapper.QueryableExtensions; using LifePayment.Application.Contracts; using LifePayment.Domain; using LifePayment.Domain.LifePay; using LifePayment.Domain.Models; using LifePayment.Domain.Shared; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Nest; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.AutoMapper; using Volo.Abp.Domain.Repositories; using ZeroD.Util; namespace LifePayment.Application.Promoter { /// /// 推广服务 /// public class PromoterService : ApplicationService, IPromoterService { private readonly IMapperAccessor mapperAccessor; private readonly ILogger logger; private readonly IRepository lifePayPromoterRepository; private readonly IRepository lifePayChannelConsultationRepository; private readonly IRepository lifePayChannelConsultationFollowupRepository; private readonly IRepository userRepository; public PromoterService( IMapperAccessor mapperAccessor, ILogger logger, IRepository lifePayPromoterRepository, IRepository lifePayChannelConsultationRepository, IRepository lifePayChannelConsultationFollowupRepository, IRepository userRepository) { this.mapperAccessor = mapperAccessor; this.logger = logger; this.lifePayPromoterRepository = lifePayPromoterRepository; this.lifePayChannelConsultationRepository = lifePayChannelConsultationRepository; this.lifePayChannelConsultationFollowupRepository = lifePayChannelConsultationFollowupRepository; this.userRepository = userRepository; } #region 查询 /// /// 获取推广员列表 /// /// /// public async Task> GetPromoters(GetPromotersInput input) { var query = lifePayPromoterRepository.Select(it => new PromoterDto { Id = it.Id, CreationTime = it.CreationTime, IdNumber = it.IdNumber, Name = it.Name, PhoneNumber = it.PhoneNumber, ClickCount = it.ClickCount, ApplyCount = it.ApplyCount, Remark = it.Remark, }); if (input.StartDate.HasValue) { query = query.Where(s => s.CreationTime >= input.StartDate); } if (input.EndDate.HasValue) { query = query.Where(s => s.CreationTime <= input.EndDate); } if (!string.IsNullOrEmpty(input.SearchKey)) { query = query.Where(s => s.IdNumber.Contains(input.SearchKey) || s.PhoneNumber.Contains(input.SearchKey) || s.Name.Contains(input.SearchKey)); } var result = await query.GetPageResult(input.PageModel); return result; } /// /// 获取推广员信息 /// /// /// public async Task GetPromoter(string phoneNumber) { return await lifePayPromoterRepository .Where(it => it.PhoneNumber == phoneNumber) .Select(it => new PromoterDto { Id = it.Id, CreationTime = it.CreationTime, IdNumber = it.IdNumber, Name = it.Name, PhoneNumber = it.PhoneNumber, ClickCount = it.ClickCount, ApplyCount = it.ApplyCount, Remark = it.Remark, }) .FirstOrDefaultAsync(); } /// /// 获取渠道咨询列表 /// /// /// public async Task> GetChannelConsultation(GetChannelConsultationsInput input) { var query = from cc in lifePayChannelConsultationRepository join p in lifePayPromoterRepository on cc.PromoterId equals p.Id into pg from pgd in pg.DefaultIfEmpty() select new ChannelConsultationDto { Id = cc.Id, CreationTime = cc.CreationTime, Name = cc.Name, AgentType = cc.AgentType, PhoneNumber = cc.PhoneNumber, CompanyName = cc.CompanyName, CustomerResources = cc.CustomerResources, PromoterIdNumber = pgd.IdNumber, PromoterName = pgd.Name, PromoterPhoneNumber = pgd.PhoneNumber, FollowupStatus = cc.FollowupStatus, LastFollowupTime = cc.LastFollowupTime, FollowupRemark = cc.FollowupRemark, }; if (input.StartDate.HasValue) { query = query.Where(s => s.CreationTime >= input.StartDate); } if (input.EndDate.HasValue) { query = query.Where(s => s.CreationTime <= input.EndDate); } if (!string.IsNullOrEmpty(input.SearchKey)) { query = query.Where(s => s.Name.Contains(input.SearchKey) || s.PhoneNumber.Contains(input.SearchKey) || s.PromoterName.Contains(input.SearchKey) || s.PromoterPhoneNumber.Contains(input.SearchKey)); } var result = await query.GetPageResult(input.PageModel); return result; } /// /// 获取渠道咨询Id /// /// /// /// public async Task GetChannelConsultationById(Guid id) { var query = from cc in lifePayChannelConsultationRepository join p in lifePayPromoterRepository on cc.PromoterId equals p.Id into pg from pgd in pg.DefaultIfEmpty() where cc.Id == id select new ChannelConsultationDto { Id = cc.Id, CreationTime = cc.CreationTime, Name = cc.Name, AgentType = cc.AgentType, PhoneNumber = cc.PhoneNumber, CompanyName = cc.CompanyName, CustomerResources = cc.CustomerResources, PromoterIdNumber = pgd.IdNumber, PromoterName = pgd.Name, PromoterPhoneNumber = pgd.PhoneNumber, FollowupStatus = cc.FollowupStatus, LastFollowupTime = cc.LastFollowupTime, FollowupRemark = cc.FollowupRemark, }; return await query.FirstOrDefaultAsync(); } /// /// 获取渠道咨询回访记录 /// /// 渠道咨询Id /// public async Task> GetChannelConsultationFollowupList(Guid id) { var query = from f in lifePayChannelConsultationFollowupRepository join u in userRepository on f.CreatorId equals u.Id into ug from ugd in ug.DefaultIfEmpty() where f.ChannelConsultationId == id select new ChannelConsultationFollowupDto { CreatorId = f.CreatorId, Creator = ugd.Name, FollowupStatus = f.FollowupStatus, FollowupRemark = f.FollowupRemark, CreationTime = f.CreationTime, }; var list = await query.ToListAsync(); return list; } #endregion #region 写入 /// /// 创建或更新推广员 /// /// /// /// public async Task CreateOrUpdatePromoter(CreateOrUpdatePromoterInput input) { CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrWhiteSpace(input.Name), "请输入推广人"); CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrWhiteSpace(input.PhoneNumber), "请输入联系方式"); if (string.IsNullOrEmpty(input.IdNumber)) { input.IdNumber = BuildIdNumber(); } var exist = await lifePayPromoterRepository.FirstOrDefaultAsync(it => it.Id != input.Id && (it.IdNumber == input.IdNumber || it.PhoneNumber == input.PhoneNumber)); if (exist != null) { CheckExtensions.IfTrueThrowUserFriendlyException(exist.IdNumber == input.IdNumber, "该ID已存在"); CheckExtensions.IfTrueThrowUserFriendlyException(exist.PhoneNumber == input.PhoneNumber, "该手机号已申请"); } if (input.Id == null) { var entity = new LifePayPromoter(); ObjectMapper.Map(input, entity); await lifePayPromoterRepository.InsertAsync(entity); return new CreateOrUpdatePromoterOutput { Id = entity.Id, IdNumber = entity.IdNumber, }; } else { var entity = await lifePayPromoterRepository.FirstOrDefaultAsync(it => it.Id == input.Id); CheckExtensions.IfTrueThrowUserFriendlyException(entity == null, "该推广员不存在"); ObjectMapper.Map(input, entity); await lifePayPromoterRepository.UpdateAsync(entity); return new CreateOrUpdatePromoterOutput { Id = entity.Id, IdNumber = entity.IdNumber, }; } } /// /// 点击数+1 /// /// /// public async Task SetClickCount(string idnumber) { var entity = await lifePayPromoterRepository.FirstOrDefaultAsync(it => it.IdNumber == idnumber); CheckExtensions.IfTrueThrowUserFriendlyException(entity == null, "该推广员不存在"); entity.ClickCount++; await lifePayPromoterRepository.UpdateAsync(entity); } /// /// 申请渠道咨询 /// /// /// public async Task CreateChannelConsultation(CreateChannelConsultationInput input) { CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrWhiteSpace(input.Name), "请输入姓名"); CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrWhiteSpace(input.PhoneNumber), "请输入联系方式"); CheckExtensions.IfTrueThrowUserFriendlyException(input.AgentType == null, "请选择代理类型"); CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrWhiteSpace(input.CustomerResources), "请输入客户资源"); var entity = new LifePayChannelConsultation(); ObjectMapper.Map(input, entity); if (!string.IsNullOrWhiteSpace(input.IdNumber)) { var promoter = await lifePayPromoterRepository.FirstOrDefaultAsync(it => it.IdNumber == input.IdNumber); if (promoter != null) { entity.PromoterId = promoter.Id; promoter.ApplyCount++; await lifePayPromoterRepository.UpdateAsync(promoter); } } await lifePayChannelConsultationRepository.InsertAsync(entity); return entity.Id; } /// /// 新增回访 /// /// /// public async Task CreateChannelConsultationFollowup(CreateChannelConsultationFollowupInput input) { CheckExtensions.IfTrueThrowUserFriendlyException(input.FollowupStatus == null, "请选择回访状态"); CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrWhiteSpace(input.FollowupRemark), "请输入回访记录"); var consultation = await lifePayChannelConsultationRepository.FirstOrDefaultAsync(it => it.Id == input.ChannelConsultationId); CheckExtensions.IfTrueThrowUserFriendlyException(consultation == null, "该渠道咨询不存在"); var entity = new LifePayChannelConsultationFollowup(); ObjectMapper.Map(input, entity); await lifePayChannelConsultationFollowupRepository.InsertAsync(entity); consultation.FollowupRemark = entity.FollowupRemark; consultation.FollowupStatus = entity.FollowupStatus; consultation.LastFollowupTime = entity.CreationTime; await lifePayChannelConsultationRepository.UpdateAsync(consultation); return entity.Id; } #endregion /// /// 生成Id /// /// private string BuildIdNumber() { var num = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); var exist = lifePayPromoterRepository.Any(it => it.IdNumber == num); if (exist) { return BuildIdNumber(); } return num; } } }