SnapshotPointsApplication.cs 4.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Hotline.Application.Snapshot.Contracts;
  2. using Hotline.Orders;
  3. using Hotline.Share.Dtos.Snapshot;
  4. using Hotline.Share.Enums.CallCenter;
  5. using Hotline.Share.Enums.Snapshot;
  6. using Hotline.Share.Tools;
  7. using Hotline.Snapshot;
  8. using Hotline.Snapshot.IRepository;
  9. using SqlSugar;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using XF.Domain.Dependency;
  16. namespace Hotline.Application.Snapshot;
  17. public class SnapshotPointsApplication : ISnapshotPointsApplication, IScopeDependency
  18. {
  19. private readonly ISnapshotPointsRecordRepository _snapshotPointsRecordRepository;
  20. private readonly ICitizenRepository _citizenRepository;
  21. private readonly ISafetyTypeRepository _safetyTypeRepository;
  22. public SnapshotPointsApplication(ISnapshotPointsRecordRepository snapshotPointsRecordRepository, ICitizenRepository citizenRepository, ISafetyTypeRepository safetyTypeRepository)
  23. {
  24. _snapshotPointsRecordRepository = snapshotPointsRecordRepository;
  25. _citizenRepository = citizenRepository;
  26. _safetyTypeRepository = safetyTypeRepository;
  27. }
  28. public ISugarQueryable<PointsItemsOutDto> GetPointsItems(PointsItemsInDto dto)
  29. {
  30. var query = _snapshotPointsRecordRepository.Queryable()
  31. .LeftJoin<Citizen>((points, citizen) => points.UserId == citizen.Id)
  32. .LeftJoin<Order>((points, citizen, order) => order.Id == points.OrderId)
  33. .WhereIF(dto.PhoneNumber.NotNullOrEmpty(), (points, citizen) => citizen.PhoneNumber.Contains(dto.PhoneNumber!))
  34. .WhereIF(dto.County.NotNullOrEmpty(), (points, citizen, order) => order.County == dto.County)
  35. .WhereIF(dto.StartTime != null && dto.EndTime != null, (points, citizen) => points.CreationTime >= dto.StartTime && points.CreationTime <= dto.EndTime)
  36. .Where((points, citizen) => points.CreationTime >= dto.StartTime && points.CreationTime <= dto.EndTime)
  37. .GroupBy((points, citizen) => new { points.UserId, citizen.IsSecurityMax, citizen.Name, citizen.PhoneNumber })
  38. .Select((points, citizen) => new PointsItemsOutDto
  39. {
  40. IsSecurityMax = citizen.IsSecurityMax ?? false,
  41. Rank = SqlFunc.MappingColumn<int>("DENSE_RANK() OVER (ORDER BY SUM(CASE WHEN \"points\".\"Direction\" = 0 THEN \"points\".\"Points\" ELSE 0 END) DESC)"),
  42. OutTotalPoint = SqlFunc.AggregateSum(SqlFunc.IIF(points.Direction == EPointsDirection.Out, points.Points, 0)),
  43. OutPoints = SqlFunc.AggregateSum(SqlFunc.IIF(points.Direction == EPointsDirection.Out && points.Source == EPointsSource.Audit, points.Points, 0)),
  44. TotalPoints = SqlFunc.AggregateSum(points.Points),
  45. InTotalPoint = SqlFunc.AggregateSum(SqlFunc.IIF(points.Direction == EPointsDirection.In, points.Points, 0)),
  46. UserName = citizen.Name!,
  47. PhoneNumber = citizen.PhoneNumber,
  48. UserId = points.UserId,
  49. })
  50. .OrderByPropertyNameIF(dto.SortField.NotNullOrEmpty() && dto.SortRule == 0, dto.SortField, OrderByType.Desc)
  51. .OrderByPropertyNameIF(dto.SortField.NotNullOrEmpty() && dto.SortRule == 1, dto.SortField, OrderByType.Asc);
  52. #if DEBUG
  53. var sql = query.ToSqlString();
  54. #endif
  55. return query;
  56. }
  57. public async Task UpdateIsSecurityMaxAsync(UpdateIsSecurityMaxAsync dto, CancellationToken token)
  58. {
  59. await _citizenRepository.Updateable()
  60. .SetColumns(citizen => citizen.IsSecurityMax, dto.IsSecurityMax)
  61. .Where(citizen => citizen.Id == dto.UserId)
  62. .ExecuteCommandAsync(token);
  63. await _citizenRepository.Queryable()
  64. .Includes(m => m.SafetyTypes)
  65. .Where(m => m.Id == dto.UserId)
  66. .FirstAsync(token)
  67. .Then(async citizen =>
  68. {
  69. await _safetyTypeRepository.Queryable()
  70. .Where(m => m.Name == "安全卫士")
  71. .FirstAsync(token)
  72. .Then(async safetyType =>
  73. {
  74. if (dto.IsSecurityMax)
  75. citizen.SafetyTypes.Add(safetyType);
  76. else
  77. {
  78. var delete = citizen.SafetyTypes.Where(m => m.Name == "安全卫士").ToList();
  79. foreach (var item in delete)
  80. {
  81. citizen.SafetyTypes.Remove(item);
  82. }
  83. }
  84. await _citizenRepository.UpdateNav(citizen).Include(m => m.SafetyTypes)
  85. .ExecuteCommandAsync();
  86. });
  87. });
  88. }
  89. }