SnapshotApplicationBase.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using Hotline.Orders;
  2. using Hotline.Share.Dtos;
  3. using Hotline.Share.Dtos.Article;
  4. using Hotline.Share.Dtos.Snapshot;
  5. using Hotline.Share.Tools;
  6. using Hotline.Snapshot;
  7. using Hotline.Users;
  8. using SqlSugar;
  9. using XF.Domain.Authentications;
  10. using XF.Domain.Dependency;
  11. using XF.Domain.Repository;
  12. using Hotline.Repository.SqlSugar.Extensions;
  13. using Hotline.Share.Enums;
  14. using Hotline.Share.Enums.Order;
  15. using Hotline.Share.Requests;
  16. using Hotline.Share.Enums.Snapshot;
  17. using Mapster;
  18. using Hotline.Caching.Interfaces;
  19. using NPOI.Util.ArrayExtensions;
  20. using XF.Domain.Exceptions;
  21. using Hotline.Settings;
  22. using Hotline.Share.Dtos.Settings;
  23. using Hotline.File;
  24. namespace Hotline.Application.Snapshot;
  25. /// <summary>
  26. /// 随手拍应用层
  27. /// </summary>
  28. public abstract class SnapshotApplicationBase
  29. {
  30. private readonly IThirdAccountRepository _thirdAccountRepository;
  31. private readonly IRepository<Order> _orderRepository;
  32. private readonly IRepository<Article.Bulletin> _bulletinRepository;
  33. /// <summary>
  34. /// 行业
  35. /// </summary>
  36. private readonly IRepository<Industry> _industryRepository;
  37. private readonly IThirdIdentiyService _thirdLoginService;
  38. private readonly ISessionContext _sessionContext;
  39. private readonly IRepository<RedPackRecord> _redPackRecordRepository;
  40. private readonly IRepository<OrderSnapshot> _orderSnapshotRepository;
  41. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  42. private readonly ISystemAreaDomainService _systemAreaDomainService;
  43. private readonly IFileRepository _fileRepository;
  44. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  45. public SnapshotApplicationBase(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, IRepository<Article.Bulletin> bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IRepository<OrderSnapshot> orderSnapshotRepository, ISystemSettingCacheManager systemSettingCacheManager, ISystemAreaDomainService systemAreaDomainService, IFileRepository fileRepository, ISystemDicDataCacheManager systemDicDataCacheManager)
  46. {
  47. _thirdLoginService = thirdLoginService;
  48. _industryRepository = industryRepository;
  49. _bulletinRepository = bulletinRepository;
  50. _sessionContext = sessionContext;
  51. _redPackRecordRepository = redPackRecordRepository;
  52. _orderRepository = orderRepository;
  53. _thirdAccountRepository = thirdAccountRepository;
  54. _orderSnapshotRepository = orderSnapshotRepository;
  55. _systemSettingCacheManager = systemSettingCacheManager;
  56. _systemAreaDomainService = systemAreaDomainService;
  57. _fileRepository = fileRepository;
  58. _systemDicDataCacheManager = systemDicDataCacheManager;
  59. }
  60. /// <summary>
  61. /// 获取随手拍小程序首页数据
  62. /// </summary>
  63. /// <returns></returns>
  64. public async Task<HomePageOutDto> GetHomePageAsync()
  65. {
  66. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  67. var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
  68. var items = await _industryRepository.Queryable()
  69. .Where(m => m.IsEnable)
  70. .OrderBy(m => m.DisplayOrder)
  71. .ToListAsync(m => new HomeIndustryOutDto());
  72. items.ForEach(m =>
  73. {
  74. if (m.BackgroundImgUrl.NotNullOrEmpty())
  75. m.BackgroundImgUrl = fileDownloadApi + m.BackgroundImgUrl;
  76. if (m.BannerImgUrl.NotNullOrEmpty())
  77. m.BannerImgUrl = fileDownloadApi + m.BannerImgUrl;
  78. if (m.CareCellImgUrl.NotNullOrEmpty())
  79. m.CareCellImgUrl = fileDownloadApi + m.CareCellImgUrl;
  80. if (m.CellImgUrl.NotNullOrEmpty())
  81. m.CellImgUrl = fileDownloadApi + m.CellImgUrl;
  82. });
  83. return new HomePageOutDto
  84. {
  85. Banners = _systemSettingCacheManager.AppBanner.Split('|').Select(m => fileDownloadApi + m).ToList(),
  86. Industrys = items
  87. };
  88. }
  89. /// <summary>
  90. /// 行业页面基础数据
  91. /// </summary>
  92. /// <param name="id"></param>
  93. /// <param name="requestAborted"></param>
  94. /// <returns></returns>
  95. public async Task<IndustryBaseOutDto> GetIndustryBaseAsync(string id, CancellationToken requestAborted)
  96. {
  97. var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
  98. var fileDownloadApi = fileServiceUrl + _systemSettingCacheManager.FileDownloadApi;
  99. var indurstry = await _industryRepository.GetAsync(id, requestAborted)
  100. ?? throw UserFriendlyException.SameMessage("行业不存在:" + id);
  101. var outDto = new IndustryBaseOutDto
  102. {
  103. Industry = indurstry.Adapt<IndustryOutDto>()
  104. };
  105. if (indurstry.IndustryType == EIndustryType.Declare)
  106. {
  107. outDto.AreaTree = (await _systemAreaDomainService.GetAreaTree(parentId: "510300")).Adapt<List<SystemAreaOutDto>>();
  108. outDto.Files = (await _fileRepository.GetByKeyAsync(indurstry.Id, requestAborted)).Adapt<List<IndustryFileDto>>();
  109. outDto.Files.ToList().ForEach(m => m.Url = fileDownloadApi + m.AdditionId);
  110. outDto.WorkArea = _systemDicDataCacheManager.WorkArea.Adapt<List<SystemDicDataOutDto>>();
  111. outDto.Workplace = _systemDicDataCacheManager.Workplace.Adapt<List<SystemDicDataOutDto>>();
  112. }
  113. return outDto;
  114. }
  115. /// <summary>
  116. /// 获取随手拍小程序公告
  117. /// </summary>
  118. /// <returns></returns>
  119. public async Task<IReadOnlyList<BulletinOutDto>> GetBulletinsAsync(BulletinInDto dto)
  120. {
  121. var items = await _bulletinRepository.Queryable()
  122. .Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
  123. .LeftJoin<Industry>((bulletin, industry) => bulletin.BulletinTypeId == industry.BulletinTypePublicityId)
  124. .Where((bulletin, industry) => industry.Id == dto.IndustryId)
  125. .ToPageListAsync(dto.PageIndex, dto.PageSize);
  126. return items.Adapt<IReadOnlyList<BulletinOutDto>>();
  127. }
  128. /// <summary>
  129. /// 获取个人中心数据
  130. /// </summary>
  131. /// <returns></returns>
  132. public async Task<SnapshotUserInfoOutDto> GetSnapshotUserInfoAsync()
  133. {
  134. var openId = _sessionContext.OpenId;
  135. var thirdAccount = await _thirdAccountRepository.QueryByOpenIdAsync(openId);
  136. var dayTime = DateTime.Now;
  137. var readPack = await _redPackRecordRepository.Queryable()
  138. .Where(m => m.WXOpenId == openId && m.PickupStatus == Share.Enums.Snapshot.ERedPackPickupStatus.Received)
  139. .Where(m => m.CreationTime.Date == dayTime.Date)
  140. .Select(m => SqlFunc.AggregateSum(m.Amount))
  141. .FirstAsync();
  142. var outDto = await _orderRepository.Queryable()
  143. .Where(m => m.Contact == thirdAccount.PhoneNumber)
  144. .Select(m => new SnapshotUserInfoOutDto
  145. {
  146. NoReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status < Share.Enums.Order.EOrderStatus.Filed, 1, 0)),
  147. ReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status >= Share.Enums.Order.EOrderStatus.Filed, 1, 0)),
  148. AppraiseCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status == Share.Enums.Order.EOrderStatus.Visited, 1, 0)),
  149. }).FirstAsync();
  150. outDto.DayAmount = readPack;
  151. outDto.TotalAmount = thirdAccount.TotalAmount;
  152. outDto.PhoneNumber = thirdAccount.PhoneNumber;
  153. return outDto;
  154. }
  155. public async Task<PagedDto<OrderOutDto>> GetSnapshotOrdersAsync(OrderInDto dto)
  156. {
  157. var member = await _thirdAccountRepository.QueryByOpenIdAsync(_sessionContext.OpenId);
  158. if (member == null)
  159. {
  160. return new PagedDto<OrderOutDto>(0, new List<OrderOutDto>());
  161. }
  162. var (total, items) = await _orderSnapshotRepository.Queryable()
  163. .LeftJoin<Order>((snapshot, order) => snapshot.OrderId == order.Id)
  164. .Where((snapshot, order) => order.Contact == member.PhoneNumber)
  165. .WhereIF(dto.Status == EOrderQueryStatus.Appraise, (snapshot, order) => order.Status == EOrderStatus.Visited)
  166. .WhereIF(dto.Status == EOrderQueryStatus.NoReply, (snapshot, order) => order.Status < EOrderStatus.Filed)
  167. .WhereIF(dto.Status == EOrderQueryStatus.Reply, (snapshot, order) => order.Status >= EOrderStatus.Filed)
  168. .WhereIF(dto.KeyWords.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.KeyWords))
  169. .Select((snapshot, order) => new OrderOutDto
  170. {
  171. Id = snapshot.Id,
  172. OrderNo = order.No,
  173. Title = order.Title,
  174. Status = order.Status,
  175. IndustryName = snapshot.IndustryName,
  176. CreationTime = order.CreationTime,
  177. Area = order.City
  178. })
  179. .ToPagedListAsync(dto.PageIndex, dto.PageSize);
  180. return new PagedDto<OrderOutDto>(total, items);
  181. }
  182. public async Task<OrderDetailOutDto> GetSnapshotOrderDetailAsync(string id)
  183. {
  184. var detail = await _orderSnapshotRepository.Queryable()
  185. .Where(m => m.Id == id)
  186. .LeftJoin<Order>((snapshot, order) => snapshot.OrderId == order.Id)
  187. .Select((snapshot, order) => new OrderDetailOutDto
  188. {
  189. Id = snapshot.Id,
  190. OrderNo = order.No,
  191. Title = order.Title,
  192. Status = order.Status,
  193. IndustryName = snapshot.IndustryName,
  194. CreationTime = order.CreationTime,
  195. Area = order.City
  196. })
  197. .FirstAsync();
  198. return detail;
  199. }
  200. /// <summary>
  201. /// 获取当月详细红包列表
  202. /// </summary>
  203. /// <param name="dto"></param>
  204. /// <returns></returns>
  205. public async Task<PagedDto<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto)
  206. {
  207. var openId = _sessionContext.OpenId;
  208. var (total, items) = await _redPackRecordRepository.Queryable()
  209. .Where(m => m.WXOpenId == openId)
  210. .Where(m => m.PickupStatus == dto.Status)
  211. .Where(m => m.CreationTime.ToString("yyyy-MM") == dto.Time)
  212. .LeftJoin<Order>((red, order) => red.OrderId == order.Id)
  213. .Select((red, order) => new RedPackOutDto
  214. {
  215. Amount = red.Amount,
  216. Title = order.Title,
  217. CreationTime = red.CreationTime
  218. })
  219. .ToPagedListAsync(dto.PageIndex, dto.PageSize);
  220. return new PagedDto<RedPackOutDto>(total, items);
  221. }
  222. /// <summary>
  223. /// 按月统计红包金额
  224. /// </summary>
  225. /// <param name="count"></param>
  226. /// <returns></returns>
  227. public async Task<IReadOnlyList<RedPackDateOutDto>> GetRedPackDateAsync(RedPackDateInDto dto)
  228. {
  229. var openId = _sessionContext.OpenId;
  230. var item = await _redPackRecordRepository.Queryable()
  231. .Where(m => m.WXOpenId == openId)
  232. .Where(m => m.PickupStatus == dto.Status)
  233. .GroupBy(m => m.CreationTime.ToString("yyyy-MM"))
  234. .OrderByDescending(m => m.CreationTime)
  235. .Select(m => new RedPackDateOutDto
  236. {
  237. CreationTime = SqlFunc.AggregateMax(m.CreationTime.Date),
  238. Amount = SqlFunc.AggregateSum(m.Amount)
  239. })
  240. .Take(dto.Count)
  241. .ToListAsync();
  242. return item;
  243. }
  244. public async Task<BulletinOutDto> GetBulletinsDetailAsync(string id)
  245. {
  246. var detail = await _bulletinRepository.Queryable()
  247. .Where(m => m.Id == id)
  248. .Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
  249. .Select(m => new BulletinOutDto
  250. {
  251. Id = m.Id,
  252. Title = m.Title,
  253. Content = m.Content
  254. })
  255. .FirstAsync();
  256. return detail;
  257. }
  258. }