SnapshotApplication.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. namespace Hotline.Application.Snapshot;
  18. /// <summary>
  19. /// 随手拍应用层
  20. /// </summary>
  21. public class SnapshotApplication : ISnapshotApplication, IScopeDependency
  22. {
  23. private readonly IThirdAccountRepository _thirdAccountRepository;
  24. private readonly IRepository<Order> _orderRepository;
  25. private readonly IRepository<Article.Bulletin> _bulletinRepository;
  26. private readonly IRepository<Industry> _industryRepository;
  27. private readonly IThirdIdentiyService _thirdLoginService;
  28. private readonly ISessionContext _sessionContext;
  29. private readonly IRepository<RedPackRecord> _redPackRecordRepository;
  30. private readonly IRepository<OrderSnapshot> _orderSnapshotRepository;
  31. public SnapshotApplication(IThirdIdentiyService thirdLoginService, IRepository<Industry> industryRepository, IRepository<Article.Bulletin> bulletinRepository, ISessionContext sessionContext, IRepository<RedPackRecord> redPackRecordRepository, IRepository<Order> orderRepository, IThirdAccountRepository thirdAccountRepository, IRepository<OrderSnapshot> orderSnapshotRepository)
  32. {
  33. _thirdLoginService = thirdLoginService;
  34. _industryRepository = industryRepository;
  35. _bulletinRepository = bulletinRepository;
  36. _sessionContext = sessionContext;
  37. _redPackRecordRepository = redPackRecordRepository;
  38. _orderRepository = orderRepository;
  39. _thirdAccountRepository = thirdAccountRepository;
  40. _orderSnapshotRepository = orderSnapshotRepository;
  41. }
  42. /// <summary>
  43. /// 获取随手拍小程序首页数据
  44. /// </summary>
  45. /// <returns></returns>
  46. public async Task<IReadOnlyList<HomePageOutDto>> GetHomePageAsync()
  47. {
  48. return await _industryRepository.Queryable()
  49. .Where(m => m.IsEnable)
  50. .OrderBy(m => m.DisplayOrder)
  51. .ToListAsync(m => new HomePageOutDto());
  52. }
  53. /// <summary>
  54. /// 获取随手拍小程序公告
  55. /// </summary>
  56. /// <returns></returns>
  57. public async Task<IReadOnlyList<BulletinOutDto>> GetBulletinsAsync(BulletinInDto dto)
  58. {
  59. var items = await _bulletinRepository.Queryable()
  60. .Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
  61. .LeftJoin<Industry>((bulletin, industry) => bulletin.BulletinTypeId == industry.BulletinTypePublicityId)
  62. .Where((bulletin, industry) => industry.Id == dto.IndustryId)
  63. .ToPageListAsync(dto.PageIndex, dto.PageSize);
  64. return items.MapTo<IReadOnlyList<BulletinOutDto>>();
  65. }
  66. /// <summary>
  67. /// 获取个人中心数据
  68. /// </summary>
  69. /// <returns></returns>
  70. public async Task<SnapshotUserInfoOutDto> GetSnapshotUserInfoAsync()
  71. {
  72. var openId = _sessionContext.OpenId;
  73. var thirdAccount = await _thirdAccountRepository.QueryByOpenIdAsync(openId);
  74. var dayTime = DateTime.Now;
  75. var readPack = await _redPackRecordRepository.Queryable()
  76. .Where(m => m.WXOpenId == openId && m.PickupStatus == Share.Enums.Snapshot.ERedPackPickupStatus.Received)
  77. .Where(m => m.CreationTime.Date == dayTime.Date)
  78. .Select(m => SqlFunc.AggregateSum(m.Amount))
  79. .FirstAsync();
  80. var outDto = await _orderRepository.Queryable()
  81. .Where(m => m.Contact == thirdAccount.PhoneNumber)
  82. .Select(m => new SnapshotUserInfoOutDto
  83. {
  84. NoReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status < Share.Enums.Order.EOrderStatus.Filed, 1, 0)),
  85. ReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status >= Share.Enums.Order.EOrderStatus.Filed, 1, 0)),
  86. AppraiseCount = SqlFunc.AggregateSum(SqlFunc.IIF(m.Status == Share.Enums.Order.EOrderStatus.Visited, 1, 0)),
  87. }).FirstAsync();
  88. outDto.DayAmount = readPack;
  89. outDto.TotalAmount = thirdAccount.TotalAmount;
  90. outDto.PhoneNumber = thirdAccount.PhoneNumber;
  91. return outDto;
  92. }
  93. public async Task<PagedDto<OrderOutDto>> GetSnapshotOrdersAsync(OrderInDto dto)
  94. {
  95. var member = await _thirdAccountRepository.QueryByOpenIdAsync(_sessionContext.OpenId);
  96. var (total, items) = await _orderSnapshotRepository.Queryable()
  97. .LeftJoin<Order>((snapshot, order) => snapshot.OrderId == order.Id)
  98. .Where((snapshot, order) => order.Contact == member.PhoneNumber)
  99. .WhereIF(dto.Status == EOrderQueryStatus.Appraise, (snapshot, order) => order.Status == EOrderStatus.Visited)
  100. .WhereIF(dto.Status == EOrderQueryStatus.NoReply, (snapshot, order) => order.Status < EOrderStatus.Filed)
  101. .WhereIF(dto.Status == EOrderQueryStatus.Reply, (snapshot, order) => order.Status >= EOrderStatus.Filed)
  102. .WhereIF(dto.KeyWords.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.KeyWords))
  103. .Select((snapshot, order) => new OrderOutDto
  104. {
  105. Id = snapshot.Id,
  106. OrderNo = order.No,
  107. Title = order.Title,
  108. Status = order.Status,
  109. IndustryName = snapshot.IndustryName,
  110. CreationTime = order.CreationTime,
  111. Area = order.City
  112. })
  113. .ToPagedListAsync(dto.PageIndex, dto.PageSize);
  114. return new PagedDto<OrderOutDto>(total, items);
  115. }
  116. public async Task<OrderDetailOutDto> GetSnapshotOrderDetailAsync(string id)
  117. {
  118. var detail = await _orderSnapshotRepository.Queryable()
  119. .Where(m => m.Id == id)
  120. .LeftJoin<Order>((snapshot, order) => snapshot.OrderId == order.Id)
  121. .Select((snapshot, order) => new OrderDetailOutDto
  122. {
  123. Id = snapshot.Id,
  124. OrderNo = order.No,
  125. Title = order.Title,
  126. Status = order.Status,
  127. IndustryName = snapshot.IndustryName,
  128. CreationTime = order.CreationTime,
  129. Area = order.City
  130. })
  131. .FirstAsync();
  132. return detail;
  133. }
  134. /// <summary>
  135. /// 获取当月详细红包列表
  136. /// </summary>
  137. /// <param name="dto"></param>
  138. /// <returns></returns>
  139. public async Task<PagedDto<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto)
  140. {
  141. var openId = _sessionContext.OpenId;
  142. var (total, items) = await _redPackRecordRepository.Queryable()
  143. .Where(m => m.WXOpenId == openId)
  144. .Where(m => m.PickupStatus == dto.Status)
  145. .Where(m => m.CreationTime.ToString("yyyy-MM") == dto.Time)
  146. .LeftJoin<Order>((red, order) => red.OrderId == order.Id)
  147. .Select((red, order) => new RedPackOutDto
  148. {
  149. Amount = red.Amount,
  150. Title = order.Title,
  151. CreationTime = red.CreationTime
  152. })
  153. .ToPagedListAsync(dto.PageIndex, dto.PageSize);
  154. return new PagedDto<RedPackOutDto>(total, items);
  155. }
  156. /// <summary>
  157. /// 按月统计红包金额
  158. /// </summary>
  159. /// <param name="count"></param>
  160. /// <returns></returns>
  161. public async Task<IReadOnlyList<RedPackDateOutDto>> GetRedPackDateAsync(RedPackDateInDto dto)
  162. {
  163. var openId = _sessionContext.OpenId;
  164. var item = await _redPackRecordRepository.Queryable()
  165. .Where(m => m.WXOpenId == openId)
  166. .Where(m => m.PickupStatus == dto.Status)
  167. .GroupBy(m => m.CreationTime.ToString("yyyy-MM"))
  168. .OrderByDescending(m => m.CreationTime)
  169. .Select(m => new RedPackDateOutDto
  170. {
  171. CreationTime = SqlFunc.AggregateMax(m.CreationTime.Date),
  172. Amount = SqlFunc.AggregateSum(m.Amount)
  173. })
  174. .Take(dto.Count)
  175. .ToListAsync();
  176. return item;
  177. }
  178. public async Task<BulletinOutDto> GetBulletinsDetailAsync(string id)
  179. {
  180. var detail = await _bulletinRepository.Queryable()
  181. .Where(m => m.Id == id)
  182. .Where(m => m.BulletinState == Share.Enums.Article.EBulletinState.ReviewPass)
  183. .Select(m => new BulletinOutDto
  184. {
  185. Id = m.Id,
  186. Title = m.Title,
  187. Content = m.Content
  188. })
  189. .FirstAsync();
  190. return detail;
  191. }
  192. }