Browse Source

Merge branch 'dev' of http://110.188.24.182:10023/Fengwo/hotline into dev

Dun.Jason 1 month ago
parent
commit
681c3755e0

+ 19 - 1
src/Hotline.Api/Controllers/Snapshot/SnapshotController.cs

@@ -103,7 +103,7 @@ public class SnapshotController : BaseController
         order.AcceptTypeCode = industry.AcceptTypeCode;
         order.AcceptType = industry.AcceptType;
         order.FromGender = EGender.Unknown;
-        order.Title = dto.GetTitle(industry.IndustryType, industry.AcceptType);
+        order.Title = dto.GetTitle(industry.IndustryType, industry.TitleSuffix);
         order.Content = dto.GetContent(industry.IndustryType);
         order.FromPhone = _sessionContext.Phone;
         order.Contact = _sessionContext.Phone;
@@ -367,6 +367,24 @@ public class SnapshotController : BaseController
     [HttpGet("points/rank")]
     public async Task<PointsRankOutDto> GetPointsRankAsync()
         => await _snapshotApplication.GetPointsRankAsync();
+
+    /// <summary>
+    /// 积分详情
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("points")]
+    public async Task<IList<PointItemsOutDto>> GetPointItemsAsync([FromQuery] PointItemsInDto dto)
+        => await _snapshotApplication.GetPointItemsAsync(dto, HttpContext.RequestAborted);
+
+    /// <summary>
+    /// 积分总计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("points/total")]
+    public async Task<int> GetPointsTotalAsync([FromQuery] PointItemsInDto dto)
+        => await _snapshotApplication.GetPointsTotalAsync(dto, HttpContext.RequestAborted);
     #endregion
 
     #region 第三方系统

+ 1 - 1
src/Hotline.Application/Exam/Service/ExamManages/ExamManageService.cs

@@ -592,7 +592,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                     ExamManageId = e.ExamManageId,
                     Score = e.Score,
                     Count = t.Count
-                });
+                }).Distinct();
                 return await result.ToListAsync();
             }
             else

+ 46 - 17
src/Hotline.Application/Exam/Service/ExamManages/ExtractRuleService.cs

@@ -145,7 +145,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
 
             ResolveExtractRuleId(actionRequest, actionRequest.Id);
 
-            _addExtractRuleDto = _mapper.Map<AddExtractRuleDto>(actionRequest);
+            ResolveAddExtractRuleDto(actionRequest);
 
             base.Entity.RuleTags = await ModifyRuleTags(actionRequest, cancellationToken);
 
@@ -154,6 +154,25 @@ namespace Hotline.Application.Exam.Service.ExamManages
             await base.Complete(base.Entity, OperationConstant.Update);
         }
 
+        private void ResolveAddExtractRuleDto(UpdateExtractRuleDto actionRequest)
+        {
+            _addExtractRuleDto = _mapper.Map<AddExtractRuleDto>(actionRequest);
+
+            //_addExtractRuleDto.RuleTagDtos = new List<AddRuleTagDto>();
+
+            //actionRequest.RuleTagDtos.ToList().ForEach(item =>
+            //{
+            //    _addExtractRuleDto.RuleTagDtos.Add(_mapper.Map<AddRuleTagDto>(item));
+            //});
+
+            //_addExtractRuleDto.TagQuestionDtos = new List<AddTagQuestionDto>();
+
+            //actionRequest.TagQuestionDtos.ToList().ForEach(item =>
+            //{
+            //    _addExtractRuleDto.TagQuestionDtos.Add(_mapper.Map<AddTagQuestionDto>(item));
+            //});
+        }
+
         /// <summary>
         /// 删除抽题规则
         /// </summary>
@@ -290,20 +309,25 @@ namespace Hotline.Application.Exam.Service.ExamManages
         {
             if (actionRequest.TagQuestionDtos == null) return null;
 
-            var all = await _tagQuestionRepository.Queryable().Where(m => m.RuleId == actionRequest.Id).ToListAsync();
+            //var all = await _tagQuestionRepository.Queryable().Where(m => m.RuleId == actionRequest.Id).ToListAsync();
+
+            //actionRequest.TagQuestionDtos.ResolveOperationStatus(all);
+
+            var entityQueyRequest = ExpressionableUtility.CreateExpression<TagQuestion>()
+               .AndIF(actionRequest.Id.IsNotNullOrEmpty(), x => x.RuleId == actionRequest.Id).ToEntityQueryRequest<TagQuestion>();
 
-            actionRequest.TagQuestionDtos.ResolveOperationStatus(all);
+            await DeleteTagQuestions(entityQueyRequest, cancellationToken);
 
             var tagQuestions = new List<TagQuestion>();
 
             tagQuestions.AddRangeExt(await AddTagQuestions(_addExtractRuleDto, cancellationToken));
 
-            tagQuestions.AddRangeExt(await UpdateTagQuestions(actionRequest, all, cancellationToken));
+            //tagQuestions.AddRangeExt(await UpdateTagQuestions(actionRequest, all, cancellationToken));
 
-            var ruleTagDtos = actionRequest.TagQuestionDtos.Where(x => x.OperationStatus == EEOperationStatus.Delete).ToList();
-            var ids = ruleTagDtos.Select(x => x.Id).ToList();
-            var entityQueyRequest = ExpressionableUtility.CreateExpression<TagQuestion>()
-                .AndIF(ids.IsNotNull(), x => ids.Contains(x.Id)).ToEntityQueryRequest<TagQuestion>();
+            //var ruleTagDtos = actionRequest.TagQuestionDtos.Where(x => x.OperationStatus == EEOperationStatus.Delete).ToList();
+            //var ids = ruleTagDtos.Select(x => x.Id).ToList();
+            //var entityQueyRequest = ExpressionableUtility.CreateExpression<TagQuestion>()
+            //    .AndIF(ids.IsNotNull(), x => ids.Contains(x.Id)).ToEntityQueryRequest<TagQuestion>();
 
             await DeleteTagQuestions(entityQueyRequest, cancellationToken);
 
@@ -354,25 +378,30 @@ namespace Hotline.Application.Exam.Service.ExamManages
         /// <exception cref="NotImplementedException"></exception>
         private async Task<List<RuleTag>> ModifyRuleTags(UpdateExtractRuleDto actionRequest, CancellationToken cancellationToken)
         {
+            var ruleId = actionRequest.Id;
+
             if (actionRequest.RuleTagDtos == null) return null;
 
-            var all = await _ruleTagRepository.Queryable().Where(x => x.RuleId == actionRequest.Id).ToListAsync();
+            //var all = await _ruleTagRepository.Queryable().Where(x => x.RuleId == actionRequest.Id).ToListAsync();
 
-            actionRequest.RuleTagDtos.ResolveOperationStatus(all);
+            //actionRequest.RuleTagDtos.ResolveOperationStatus(all);
 
             var ruleTags = new List<RuleTag>();
 
-            ruleTags.AddRangeExt(await AddRuleTags(_addExtractRuleDto, cancellationToken));
-
-            ruleTags.AddRangeExt(await UpdateRuleTags(actionRequest, cancellationToken));
-
-            var ruleTagDtos = actionRequest.RuleTagDtos.Where(x => x.OperationStatus == EEOperationStatus.Delete).ToList();
-            var ids = ruleTagDtos.Select(x => x.Id).ToList();
             var entityQueyRequest = ExpressionableUtility.CreateExpression<RuleTag>()
-                .AndIF(ids.IsNotNull(), x => ids.Contains(x.Id)).ToEntityQueryRequest<RuleTag>();
+                .AndIF(ruleId.IsNotNullOrEmpty(), x => x.RuleId == ruleId).ToEntityQueryRequest<RuleTag>();
 
             await DeleteRuleTags(entityQueyRequest, cancellationToken);
 
+            ruleTags.AddRangeExt(await AddRuleTags(_addExtractRuleDto, cancellationToken));
+
+            //ruleTags.AddRangeExt(await UpdateRuleTags(actionRequest, cancellationToken));
+
+            //var ruleTagDtos = actionRequest.RuleTagDtos.Where(x => x.OperationStatus == EEOperationStatus.Delete).ToList();
+            //var ids = ruleTagDtos.Select(x => x.Id).ToList();
+            //var entityQueyRequest = ExpressionableUtility.CreateExpression<RuleTag>()
+            //    .AndIF(ids.IsNotNull(), x => ids.Contains(x.Id)).ToEntityQueryRequest<RuleTag>();
+
             return ruleTags;
         }
 

+ 15 - 0
src/Hotline.Application/Snapshot/Contracts/ISnapshotApplication.cs

@@ -218,4 +218,19 @@ public interface ISnapshotApplication
     /// </summary>
     /// <returns></returns>
     Task<PointsRankOutDto> GetPointsRankAsync();
+
+    /// <summary>
+    /// 积分详情集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    Task<IList<PointItemsOutDto>> GetPointItemsAsync(PointItemsInDto dto, CancellationToken token);
+
+    /// <summary>
+    /// 积分总计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <param name="requestAborted"></param>
+    /// <returns></returns>
+    Task<int> GetPointsTotalAsync(PointItemsInDto dto, CancellationToken requestAborted);
 }

+ 59 - 11
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -353,6 +353,35 @@ public abstract class SnapshotApplicationBase
         return items;
     }
 
+    /// <summary>
+    /// 积分详情集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public async Task<IList<PointItemsOutDto>> GetPointItemsAsync(PointItemsInDto dto, CancellationToken token)
+    {
+        var items = await _pointsRecordRepository.Queryable()
+            .Where(m => m.UserId == _sessionContext.UserId && dto.Direction == m.Direction)
+            .Select(m => new PointItemsOutDto(), true)
+            .OrderByDescending(m => m.CreationTime)
+            .ToFixedListAsync(dto, token);
+        return items;
+    }
+
+    /// <summary>
+    /// 积分总计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <param name="requestAborted"></param>
+    /// <returns></returns>
+    public async Task<int> GetPointsTotalAsync(PointItemsInDto dto, CancellationToken token)
+    {
+        return await _pointsRecordRepository.Queryable()
+            .Where(m => m.UserId == _sessionContext.UserId && dto.Direction == m.Direction)
+            .SumAsync(m => m.Points);
+    }
+
+
     /// <summary>
     /// 获取工单详情
     /// </summary>
@@ -912,28 +941,47 @@ public abstract class SnapshotApplicationBase
         var outDto = new PointsRankOutDto();
         var record = await _pointsRecordRepository.Queryable()
             .Where(m => m.UserId == _sessionContext.UserId)
-            .Select(m => new { 
+            .Select(m => new
+            {
                 Total = SqlFunc.AggregateSum(m.Points),
                 Out = SqlFunc.AggregateSum(SqlFunc.IIF(m.Direction == EPointsDirection.Out, m.Points, 0))
             }).FirstAsync();
         outDto.ValidPoints = record.Total - record.Out;
         var startTime = new DateTime(DateTime.Now.Year, 1, 1, 0, 0, 0);
         var endTime = new DateTime(DateTime.Now.Year, 12, 31, 23, 59, 59);
-        var items = await _pointsRecordRepository.Queryable()
+        var query = _pointsRecordRepository.Queryable()
             .LeftJoin<Citizen>((points, citizen) => points.UserId == citizen.Id)
             .Where((points, citizen) => points.CreationTime >= startTime && points.CreationTime <= endTime)
-            .GroupBy((points, citizen) => new { points.UserId, citizen.IsSecurityMax, citizen.Name, citizen.PhoneNumber })
-            .Select((points, citizen) => new PointsItemsOutDto
+            .GroupBy((points, citizen) => new { citizen.Id, points.UserId, citizen.IsSecurityMax, citizen.Name, citizen.PhoneNumber })
+            .Select((points, citizen) => new PointsRankUserDto
             {
                 IsSecurityMax = citizen.IsSecurityMax ?? false,
-                Rank = SqlFunc.MappingColumn<int>("DENSE_RANK() OVER (ORDER BY SUM(CASE WHEN \"points\".\"Direction\" = 1 THEN \"points\".\"Points\" ELSE 0 END) DESC)"),
-                OutTotalPoint = SqlFunc.AggregateSum(SqlFunc.IIF(points.Direction == EPointsDirection.Out, points.Points, 0)),
-                OutPoints = SqlFunc.AggregateSum(SqlFunc.IIF(points.Direction == EPointsDirection.Out && points.Source == EPointsSource.Audit, points.Points, 0)),
-                TotalPoints = SqlFunc.AggregateSum(points.Points),
-                InTotalPoint = SqlFunc.AggregateSum(SqlFunc.IIF(points.Direction == EPointsDirection.In, points.Points, 0)),
+                Rank = SqlFunc.MappingColumn<int>($@"
+            CASE 
+                WHEN citizen.""Id"" = '{_sessionContext.UserId}' THEN 1 
+                ELSE DENSE_RANK() OVER (ORDER BY SUM(CASE WHEN ""points"".""Direction"" = 1 THEN ""points"".""Points"" ELSE 0 END) DESC)
+            END"),
+                Points = SqlFunc.AggregateSum(points.Points),
                 UserName = citizen.Name!,
-                PhoneNumber = citizen.PhoneNumber
-            }).Take(11).ToListAsync();
+                PhoneNumber = citizen.PhoneNumber,
+                CitizenId = citizen.Id,
+            }).MergeTable()
+            .OrderByDescending(points => points.Rank)
+            .Take(11);
+
+#if DEBUG
+        var sql = query.ToSqlString();
+#endif
+        var item = await query.ToListAsync();
+
+        item.ForEach(m =>
+        {
+            if (m.IsSecurityMax)
+                m.HeadUrl = _systemDicDataCacheManager.HeaderImages("aqws");
+            else
+                m.HeadUrl = _systemDicDataCacheManager.HeaderImages("default");
+        });
+        outDto.Ranks = item;
         return outDto;
     }
     #endregion

+ 2 - 7
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -198,14 +198,9 @@ public class AddSnapshotOrderInDto : Position
         return $"{Description}";
     }
 
-    public string GetTitle(EIndustryType industryType, string acceptType)
+    public string GetTitle(EIndustryType industryType, string titleSuffix)
     {
-        if (industryType == EIndustryType.Declare)
-        {
-            return $"【随手拍】关于{Town}({County})的申报";
-        }
-
-        return $"【随手拍】关于{Town}({County})的" + acceptType;
+        return $"【随手拍】关于{Address}" + titleSuffix;
     }
 }
 

+ 50 - 1
src/Hotline.Share/Dtos/Snapshot/PointsDto.cs

@@ -1,4 +1,6 @@
-using Hotline.Share.Requests;
+using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Enums.Snapshot;
+using Hotline.Share.Requests;
 using Hotline.Share.Tools;
 using System;
 using System.Collections.Generic;
@@ -7,6 +9,7 @@ using System.Linq;
 using System.Text;
 using System.Text.Json.Serialization;
 using System.Threading.Tasks;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Snapshot;
 
@@ -135,4 +138,50 @@ public class PointsRankUserDto
     /// 积分
     /// </summary>
     public int Points { get; set; }
+
+    /// <summary>
+    /// UserId
+    /// </summary>
+    public string CitizenId { get; set; }
+
+    /// <summary>
+    /// 是否安全卫士
+    /// </summary>
+    public bool IsSecurityMax { get; set; }
+
+    /// <summary>
+    /// 头像地址
+    /// </summary>
+    public string HeadUrl { get; set; }
+}
+
+public class PointItemsInDto : QueryFixedDto
+{
+    /// <summary>
+    /// 收入或者支出
+    /// </summary>
+    public EPointsDirection Direction { get; set; }
+}
+
+public class PointItemsOutDto
+{
+    /// <summary>
+    /// 创建时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 积分来源
+    /// </summary>
+    public EPointsSource Source { get; set; }
+
+    /// <summary>
+    /// 积分来源
+    /// </summary>
+    public string SourceTxt => Source.GetDescription();
+
+    /// <summary>
+    /// 积分
+    /// </summary>
+    public int Points { get; set; }
 }

+ 1 - 1
src/Hotline.Share/Tools/DataMaskExtensions.cs

@@ -23,7 +23,7 @@ public static class DataMaskExtensions
 
     public static string MaskPhoneNumber(this string original)
     {
-        if (original.Length != 11) return string.Empty;
+        if (original.Length < 11) return string.Empty;
         return original.Mask(3, 4);
     }
 

+ 7 - 0
src/Hotline/Caching/Interfaces/ISysDicDataCacheManager.cs

@@ -63,6 +63,13 @@ namespace Hotline.Caching.Interfaces
         /// <returns></returns>
         SystemDicDataOutDto GetSnapshotBulletinType(string dicDataValue);
 
+        /// <summary>
+        /// 用户头像
+        /// </summary>
+        /// <param name="v"></param>
+        /// <returns></returns>
+        string HeaderImages(string name);
+
         /// <summary>
         /// 红包补充发放类型
         /// </summary>

+ 19 - 0
src/Hotline/Caching/Services/SysDicDataCacheManager.cs

@@ -160,5 +160,24 @@ namespace Hotline.Caching.Services
             _cacheSysDicData.Remove(code);
         }
 
+        /// <summary>
+        /// 获取用户头像图片
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public string HeaderImages(string value)
+        {
+            var dto = GetOrAdd(SysDicTypeConsts.HeaderImages).Where(m => m.DicDataValue == value).FirstOrDefault() ?? new SystemDicDataOutDto();
+            if (dto.DicDataName == "LocalHeadImageDefault")
+            {
+                return SystemDicDataSeedData.LocalHeadImageDefault;
+            }
+            if (dto.DicDataName == "LocalHeadImageAQWS")
+            {
+                return SystemDicDataSeedData.LocalHeadImageAQWS;
+            }
+            return dto.DicDataName;
+        }
     }
 }

File diff suppressed because it is too large
+ 13 - 0
src/Hotline/SeedData/SystemDicDataSeedData.cs


+ 5 - 0
src/Hotline/Settings/SysDicTypeConsts.cs

@@ -327,6 +327,11 @@ public class SysDicTypeConsts
     /// </summary>
     public static string ExtraDeductionPointsType = "ExtraDeductionPointsType";
 
+    /// <summary>
+    /// 用户头像集合
+    /// </summary>
+    public static string HeaderImages = "HeaderImages";
+
     /// <summary>
     /// 预警级别
     /// </summary>

+ 4 - 0
test/Hotline.Tests/Application/PointsRecordApplicationTest.cs

@@ -47,5 +47,9 @@ public class PointsRecordApplicationTest : TestBase
     {
         var item = await _snapshotApplication.GetPointsRankAsync();
         item.ShouldNotBeNull();
+        foreach (var a in item.Ranks)
+        {
+            var s = a.PhoneNumber;
+        }
     }
 }

+ 10 - 0
test/Hotline.Tests/Application/SnapshotApplicationTest.cs

@@ -312,6 +312,16 @@ public class SnapshotApplicationTest : TestBase
         detail.Content.ShouldNotBeNullOrEmpty();
     }
 
+    [Fact]
+    public async Task GetPointsItems_Test()
+    {
+        SetWeiXin();
+        var items = await _snapshotApplication.GetPointItemsAsync(new PointItemsInDto(), CancellationToken.None);
+        items.ShouldNotBeNull();
+        var total = await _snapshotApplication.GetPointsTotalAsync(new PointItemsInDto(), CancellationToken.None);
+        total.ShouldNotBe(0);
+    }
+
     /// <summary>
     /// 红包列表记录
     /// </summary>

Some files were not shown because too many files changed in this diff