using Hotline.Orders;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.Article;
using Hotline.Share.Dtos.Snapshot;
using Hotline.Share.Tools;
using Hotline.Snapshot;
using Hotline.Users;
using SqlSugar;
using XF.Domain.Authentications;
using XF.Domain.Dependency;
using XF.Domain.Repository;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Share.Enums;
using Hotline.Share.Enums.Order;
using Hotline.Share.Requests;
using Hotline.Share.Enums.Snapshot;
using Mapster;
using Hotline.Caching.Interfaces;
using NPOI.Util.ArrayExtensions;
using XF.Domain.Exceptions;
using Hotline.Settings;
using Hotline.Share.Dtos.Settings;
using Hotline.File;
namespace Hotline.Application.Snapshot;
///
/// 随手拍应用层
///
public abstract class SnapshotApplicationBase
{
private readonly IThirdAccountRepository _thirdAccountRepository;
private readonly IRepository _orderRepository;
private readonly IRepository _bulletinRepository;
///
/// 行业
///
private readonly IRepository _industryRepository;
private readonly IThirdIdentiyService _thirdLoginService;
private readonly ISessionContext _sessionContext;
private readonly IRepository _redPackRecordRepository;
private readonly IRepository _orderSnapshotRepository;
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
private readonly ISystemAreaDomainService _systemAreaDomainService;
private readonly IFileRepository _fileRepository;
private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IRepository industryRepository, IRepository bulletinRepository, ISessionContext sessionContext, IRepository redPackRecordRepository, IRepository orderRepository, IThirdAccountRepository thirdAccountRepository, IRepository orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager)
{
_thirdLoginService = thirdLoginService;
_industryRepository = industryRepository;
_bulletinRepository = bulletinRepository;
_sessionContext = sessionContext;
_redPackRecordRepository = redPackRecordRepository;
_orderRepository = orderRepository;
_thirdAccountRepository = thirdAccountRepository;
_orderSnapshotRepository = orderSnapshotRepository;
_systemSettingCacheManager = systemSettingCacheManager;
_systemAreaDomainService = systemAreaDomainService;
_fileRepository = fileRepository;
_systemDicDataCacheManager = systemDicDataCacheManager;
}
///
/// 获取随手拍小程序首页数据
///
///
public async Task GetHomePageAsync()
{
var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
var items = await _industryRepository.Queryable()
.Where(m => m.IsEnable)
.OrderBy(m => m.DisplayOrder)
.ToListAsync(m => new HomeIndustryOutDto());
items.ForEach(m =>
{
if (m.BackgroundImgUrl.NotNullOrEmpty())
m.BackgroundImgUrl = fileDownloadApi + m.BackgroundImgUrl;
if (m.BannerImgUrl.NotNullOrEmpty())
m.BannerImgUrl = fileDownloadApi + m.BannerImgUrl;
if (m.CareCellImgUrl.NotNullOrEmpty())
m.CareCellImgUrl = fileDownloadApi + m.CareCellImgUrl;
if (m.CellImgUrl.NotNullOrEmpty())
m.CellImgUrl = fileDownloadApi + m.CellImgUrl;
});
return new HomePageOutDto
{
Banners = _systemSettingCacheManager.AppBanner.Split('|').Select(m => fileDownloadApi + m).ToList(),
Industrys = items
};
}
///
/// 行业页面基础数据
///
///
///
///
public async Task GetIndustryBaseAsync(string id, CancellationToken requestAborted)
{
var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
var indurstry = await _industryRepository.GetAsync(id, requestAborted)
?? throw UserFriendlyException.SameMessage("行业不存在:" + id);
var outDto = new IndustryBaseOutDto
{
Industry = indurstry.Adapt()
};
if (indurstry.IndustryType == EIndustryType.Declare)
{
outDto.AreaTree = (await _systemAreaDomainService.GetAreaTree(parentId: "510300")).Adapt>();
outDto.Files = (await _fileRepository.GetByKeyAsync(indurstry.Id, requestAborted)).Adapt>();
outDto.Files.ToList().ForEach(m => m.Url = fileDownloadApi + m.AdditionId);
outDto.WorkArea = _systemDicDataCacheManager.WorkArea.Adapt>();
outDto.Workplace = _systemDicDataCacheManager.Workplace.Adapt>();
}
return outDto;
}
///
/// 获取随手拍小程序公告
///
///
public async Task> GetBulletinsAsync(BulletinInDto dto)
{
var items = await _bulletinRepository.Queryable()
.Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
.LeftJoin((bulletin, industry) => bulletin.BulletinTypeId == industry.BulletinTypePublicityId)
.Where((bulletin, industry) => industry.Id == dto.IndustryId)
.ToPageListAsync(dto.PageIndex, dto.PageSize);
return items.Adapt>();
}
///
/// 获取个人中心数据
///
///
public async Task GetSnapshotUserInfoAsync()
{
var openId = _sessionContext.OpenId;
var thirdAccount = await _thirdAccountRepository.QueryByOpenIdAsync(openId);
var dayTime = DateTime.Now;
var readPack = await _redPackRecordRepository.Queryable()
.Where(m => m.WXOpenId == openId && m.PickupStatus == Share.Enums.Snapshot.ERedPackPickupStatus.Received)
.Where(m => m.CreationTime.Date == dayTime.Date)
.Select(m => SqlFunc.AggregateSum(m.Amount))
.FirstAsync();
var outDto = await _orderRepository.Queryable()
.Where(m => m.Contact == thirdAccount.PhoneNumber)
.Select(m => new SnapshotUserInfoOutDto
{
NoReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status < Share.Enums.Order.EOrderStatus.Filed, 1, 0)),
ReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status >= Share.Enums.Order.EOrderStatus.Filed, 1, 0)),
AppraiseCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status == Share.Enums.Order.EOrderStatus.Visited, 1, 0)),
}).FirstAsync();
outDto.DayAmount = readPack;
outDto.TotalAmount = thirdAccount.TotalAmount;
outDto.PhoneNumber = thirdAccount.PhoneNumber;
return outDto;
}
public async Task> GetSnapshotOrdersAsync(OrderInDto dto)
{
var member = await _thirdAccountRepository.QueryByOpenIdAsync(_sessionContext.OpenId);
if (member == null)
{
return new PagedDto(0, new List());
}
var (total, items) = await _orderSnapshotRepository.Queryable()
.LeftJoin((snapshot, order) => snapshot.OrderId == order.Id)
.Where((snapshot, order) => order.Contact == member.PhoneNumber)
.WhereIF(dto.Status == EOrderQueryStatus.Appraise, (snapshot, order) => order.Status == EOrderStatus.Visited)
.WhereIF(dto.Status == EOrderQueryStatus.NoReply, (snapshot, order) => order.Status < EOrderStatus.Filed)
.WhereIF(dto.Status == EOrderQueryStatus.Reply, (snapshot, order) => order.Status >= EOrderStatus.Filed)
.WhereIF(dto.KeyWords.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.KeyWords))
.Select((snapshot, order) => new OrderOutDto
{
Id = snapshot.Id,
OrderNo = order.No,
Title = order.Title,
Status = order.Status,
IndustryName = snapshot.IndustryName,
CreationTime = order.CreationTime,
Area = order.City
})
.ToPagedListAsync(dto.PageIndex, dto.PageSize);
return new PagedDto(total, items);
}
public async Task GetSnapshotOrderDetailAsync(string id)
{
var detail = await _orderSnapshotRepository.Queryable()
.Where(m => m.Id == id)
.LeftJoin((snapshot, order) => snapshot.OrderId == order.Id)
.Select((snapshot, order) => new OrderDetailOutDto
{
Id = snapshot.Id,
OrderNo = order.No,
Title = order.Title,
Status = order.Status,
IndustryName = snapshot.IndustryName,
CreationTime = order.CreationTime,
Area = order.City
})
.FirstAsync();
return detail;
}
///
/// 获取当月详细红包列表
///
///
///
public async Task> GetRedPacksAsync(RedPacksInDto dto)
{
var openId = _sessionContext.OpenId;
var (total, items) = await _redPackRecordRepository.Queryable()
.Where(m => m.WXOpenId == openId)
.Where(m => m.PickupStatus == dto.Status)
.Where(m => m.CreationTime.ToString("yyyy-MM") == dto.Time)
.LeftJoin((red, order) => red.OrderId == order.Id)
.Select((red, order) => new RedPackOutDto
{
Amount = red.Amount,
Title = order.Title,
CreationTime = red.CreationTime
})
.ToPagedListAsync(dto.PageIndex, dto.PageSize);
return new PagedDto(total, items);
}
///
/// 按月统计红包金额
///
///
///
public async Task> GetRedPackDateAsync(RedPackDateInDto dto)
{
var openId = _sessionContext.OpenId;
var item = await _redPackRecordRepository.Queryable()
.Where(m => m.WXOpenId == openId)
.Where(m => m.PickupStatus == dto.Status)
.GroupBy(m => m.CreationTime.ToString("yyyy-MM"))
.OrderByDescending(m => m.CreationTime)
.Select(m => new RedPackDateOutDto
{
CreationTime = SqlFunc.AggregateMax(m.CreationTime.Date),
Amount = SqlFunc.AggregateSum(m.Amount)
})
.Take(dto.Count)
.ToListAsync();
return item;
}
public async Task GetBulletinsDetailAsync(string id)
{
var detail = await _bulletinRepository.Queryable()
.Where(m => m.Id == id)
.Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
.Select(m => new BulletinOutDto
{
Id = m.Id,
Title = m.Title,
Content = m.Content
})
.FirstAsync();
return detail;
}
}