瀏覽代碼

Merge branch 'feature/snapshot' into dev

qinchaoyue 5 月之前
父節點
當前提交
af9a6d2d81

+ 4 - 4
src/Hotline.Api/Controllers/Snapshot/SnapshotController.cs

@@ -168,8 +168,8 @@ public class SnapshotController : BaseController
     /// <param name="id"></param>
     /// <returns></returns>
     [HttpGet("order/{id}")]
-    public virtual async Task<OrderDetailOutDto> QueryOrderListAsync([FromQuery] string id)
-        => await _snapshotApplication.GetSnapshotOrderDetailAsync(id);
+    public virtual async Task<OrderPublishDetailOutDto> QueryOrderListAsync([FromQuery] string id)
+        => await _snapshotApplication.GetSnapshotOrderDetailAsync(id, HttpContext.RequestAborted);
 
     /// <summary>
     /// 统计红包金额, 每月的总金额
@@ -186,8 +186,8 @@ public class SnapshotController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpGet("redpack/month")]
-    public virtual async Task<PagedDto<RedPackOutDto>> QueryRedPackDateAsync([FromQuery] RedPacksInDto dto)
-        => await _snapshotApplication.GetRedPacksAsync(dto);
+    public virtual async Task<IList<RedPackOutDto>> QueryRedPackDateAsync([FromQuery] RedPacksInDto dto)
+        => await _snapshotApplication.GetRedPacksAsync(dto, HttpContext.RequestAborted);
 
     /// <summary>
     /// 获取随手拍电气焊动火作业待处理工单数量

+ 22 - 17
src/Hotline.Application.Tests/Application/SnapshotApplicationTest.cs

@@ -46,6 +46,7 @@ public class SnapshotApplicationTest : TestBase
         _orderServiceMock = orderServiceMock;
         _orderRepository = orderRepository;
         _orderSnapshotRepository = orderSnapshotRepository;
+        SetWeiXin();
     }
 
     [Fact]
@@ -125,6 +126,7 @@ public class SnapshotApplicationTest : TestBase
         items.Count.ShouldNotBe(0);
         var orderPublishDetail = await _snapshotApplication.GetOrderPublishDetailAsync(items.OrderByDescending(m => m.HandleTime).First().Id, CancellationToken.None);
         orderPublishDetail.ShouldNotBeNull();
+        orderPublishDetail.Workflow.Any(m => m.Name.IsNullOrEmpty()).ShouldBeFalse();
     }
 
     [Fact]
@@ -196,9 +198,11 @@ public class SnapshotApplicationTest : TestBase
     {
         var page = await _snapshotApplication.GetSnapshotOrdersAsync(new OrderInDto(), CancellationToken.None);
         var id = page.First().Id;
-        var detail = await _snapshotApplication.GetSnapshotOrderDetailAsync(id);
+        var detail = await _snapshotApplication.GetSnapshotOrderDetailAsync(id, CancellationToken.None);
         detail.Id.ShouldBe(id);
-        detail.IndustryName.ShouldNotBeNull();
+        detail.Title.ShouldNotBeNullOrEmpty();
+        detail.Opinion.ShouldNotBeNullOrEmpty();
+        detail.Content.ShouldNotBeNullOrEmpty();
     }
 
     [Theory]
@@ -216,8 +220,21 @@ public class SnapshotApplicationTest : TestBase
     [InlineData(ERedPackPickupStatus.Received)]
     public async Task GetRedPacksAsync(ERedPackPickupStatus status)
     {
-        var page = await _snapshotApplication.GetRedPacksAsync(new RedPacksInDto { Status = status });
-        page.Total.ShouldNotBe(0, "数据不应该为空");
+        for (int i = 0;i < 12;i++)
+        {
+            var now = DateTime.Now;
+            var entity = new RedPackRecord
+            {
+                OrderId = "111111111",
+                Amount = 10 * 10,
+                CreationTime = new DateTime(2024, i + 1, 02, now.Hour, now.Minute, now.Second),
+                WXOpenId = "测试生成的OpenId",
+                PickupStatus = status,
+            };
+            await _redPackRecordRepository.AddAsync(entity);
+        }
+        var page = await _snapshotApplication.GetRedPacksAsync(new RedPacksInDto { Status = status }, CancellationToken.None);
+        page.Count.ShouldNotBe(0, "数据不应该为空");
     }
 
     [Fact]
@@ -232,19 +249,7 @@ public class SnapshotApplicationTest : TestBase
     [Fact]
     public async Task InitRedPackDataAsync()
     {
-        for (int i = 0;i < 12;i++)
-        {
-            var now = DateTime.Now;
-            var entity = new RedPackRecord
-            {
-                OrderId = "111111111",
-                Amount = 10 * 1000,
-                CreationTime = new DateTime(2024, i + 1, 02, now.Hour, now.Minute, now.Second),
-                WXOpenId = "测试生成的OpenId",
-                PickupStatus = ERedPackPickupStatus.Received,
-            };
-            await _redPackRecordRepository.AddAsync(entity);
-        }
+       
     }
 
     /// <summary>

+ 9 - 0
src/Hotline.Application/Mappers/SnapshotMapperConfigs.cs

@@ -24,5 +24,14 @@ public class SnapshotMapperConfigs : IRegister
             .Map(m => m.Contact, n => n.PhoneNumber)
             .Map(m => m.FromName, n => n.Name)
             .Map(m => m.FromPhone, n => n.PhoneNumber);
+
+        config.ForType<SnapshotOrderPublish, OrderPublishDetailOutDto>()
+            .Map(m => m.Title, n => n.ArrangeTitle)
+            .Map(m => m.Content, n => n.ArrangeContent)
+            .Map(m => m.Opinion, n => n.ArrangeOpinion);
+
+        config.ForType<Order, OrderPublishDetailOutDto>()
+            .Map(m => m.Opinion, n => n.ActualOpinion);
+
     }
 }

+ 2 - 2
src/Hotline.Application/Snapshot/ISnapshotApplication.cs

@@ -40,7 +40,7 @@ public interface ISnapshotApplication
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
-    Task<OrderDetailOutDto> GetSnapshotOrderDetailAsync(string id);
+    Task<OrderPublishDetailOutDto> GetSnapshotOrderDetailAsync(string id, CancellationToken cancellationToken);
 
     /// <summary>
     /// 统计红包金额, 每月的总金额
@@ -54,7 +54,7 @@ public interface ISnapshotApplication
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    Task<PagedDto<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto);
+    Task<IList<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto, CancellationToken cancellationToken);
 
     /// <summary>
     /// 获取公告详情

+ 56 - 34
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -28,6 +28,7 @@ using DotNetCore.CAP;
 using Microsoft.AspNetCore.Http;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.FlowEngine.Workflows;
+using Hotline.Share.Enums.FlowEngine;
 
 namespace Hotline.Application.Snapshot;
 
@@ -204,16 +205,25 @@ public abstract class SnapshotApplicationBase
 
         var outDto = publish.Adapt<OrderPublishDetailOutDto>();
         var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
-        foreach (var item in outDto.FileJson)
+        if (outDto.FileJson != null)
         {
-            item.Path = fileServiceUrl + item.Path;
+            foreach (var item in outDto.FileJson)
+            {
+                item.Path = fileServiceUrl + item.Path;
+            }
         }
-        outDto.Workflow = await _workflowTraceRepository.Queryable()
-            .Where(m => m.ExternalId == publish.OrderId && m.AcceptTime != null && m.AcceptorOrgName != null)
+        var traces = await _workflowTraceRepository.Queryable()
+            .Where(m => m.ExternalId == publish.OrderId && m.Status == EWorkflowStepStatus.Handled)
             .OrderBy(m => m.AcceptTime)
-            .Select<SnapshotWorkflow>()
             .ToListAsync(requestAborted);
-
+        var centre = traces.Where(m => m.StepType == EStepType.End || m.StepType == EStepType.Start || m.BusinessType == EBusinessType.Send || m.BusinessType == EBusinessType.Seat || m.BusinessType == EBusinessType.File)
+            .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
+            .ToList();
+        outDto.Workflow = traces.Where(m => !centre.Select(s => s.Id).ToList().Contains(m.Id))
+            .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
+            .ToList();
+        outDto.Workflow.AddRange(centre);
+        outDto.Workflow = outDto.Workflow.OrderBy(m => m.HandleTime).ToList();
         return outDto;
     }
 
@@ -262,16 +272,14 @@ public abstract class SnapshotApplicationBase
         return outDto;
     }
 
+    /// <summary>
+    /// 获取工单列表
+    /// </summary>
     public async Task<IList<OrderOutDto>> GetSnapshotOrdersAsync(OrderInDto dto, CancellationToken cancellationToken)
     {
-        var member = await _thirdAccountRepository.QueryByOpenIdAsync(_sessionContext.OpenId);
-        if (member == null)
-        {
-            return new List<OrderOutDto>();
-        }
         var items = await _orderSnapshotRepository.Queryable()
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
-            .Where((snapshot, order) => order.Contact == member.PhoneNumber)
+            .Where((snapshot, order) => order.Contact == _sessionContext.Phone)
             .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)
@@ -291,24 +299,38 @@ public abstract class SnapshotApplicationBase
         return items;
     }
 
-    public async Task<OrderDetailOutDto> GetSnapshotOrderDetailAsync(string id)
+    /// <summary>
+    /// 获取工单详情
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    public async Task<OrderPublishDetailOutDto> GetSnapshotOrderDetailAsync(string id, CancellationToken cancellationToken)
     {
-        var detail = await _orderSnapshotRepository.Queryable()
-            .Where(m => m.Id == id)
-            .LeftJoin<Order>((snapshot, order) => snapshot.Id == 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();
+        var order = await _orderRepository.GetAsync(id) ?? 
+            throw UserFriendlyException.SameMessage("工单不存在");
 
-        return detail;
+        var outDto = order.Adapt<OrderPublishDetailOutDto>();
+        var fileServiceUrl = _systemSettingCacheManager.FileServerUrl;
+        if (outDto.FileJson != null)
+        {
+            foreach (var item in outDto.FileJson)
+            {
+                item.Path = fileServiceUrl + item.Path;
+            }
+        }
+        var traces = await _workflowTraceRepository.Queryable()
+            .Where(m => m.ExternalId == order.Id && m.Status == EWorkflowStepStatus.Handled)
+            .OrderBy(m => m.AcceptTime)
+            .ToListAsync(cancellationToken);
+        var centre = traces.Where(m => m.StepType == EStepType.End || m.StepType == EStepType.Start || m.BusinessType == EBusinessType.Send || m.BusinessType == EBusinessType.Seat || m.BusinessType == EBusinessType.File)
+            .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
+            .ToList();
+        outDto.Workflow = traces.Where(m => !centre.Select(s => s.Id).ToList().Contains(m.Id))
+            .Select(m => new SnapshotWorkflow(m.Id, m.Name, m.HandleTime.Value))
+            .ToList();
+        outDto.Workflow.AddRange(centre);
+        outDto.Workflow = outDto.Workflow.OrderBy(m => m.HandleTime).ToList();
+        return outDto;
     }
 
     /// <summary>
@@ -316,11 +338,11 @@ public abstract class SnapshotApplicationBase
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    public async Task<PagedDto<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto)
+    public async Task<IList<RedPackOutDto>> GetRedPacksAsync(RedPacksInDto dto, CancellationToken cancellationToken)
     {
-        var openId = _sessionContext.OpenId;
-        var (total, items) = await _redPackRecordRepository.Queryable()
-            .Where(m => m.WXOpenId == openId)
+        var items = await _redPackRecordRepository.Queryable(includeDeleted: true)
+            .Where(m => m.IsDeleted == false)
+            .Where(m => m.WXOpenId == _sessionContext.OpenId)
             .Where(m => m.PickupStatus == dto.Status)
             .Where(m => m.CreationTime.ToString("yyyy-MM") == dto.Time)
             .LeftJoin<Order>((red, order) => red.OrderId == order.Id)
@@ -330,9 +352,9 @@ public abstract class SnapshotApplicationBase
                 Title = order.Title,
                 CreationTime = red.CreationTime
             })
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize);
+            .ToFixedListAsync(dto, cancellationToken);
 
-        return new PagedDto<RedPackOutDto>(total, items);
+        return items;
     }
 
     /// <summary>

+ 11 - 1
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -51,7 +51,17 @@ public class OrderOutDto
     /// <summary>
     /// 工单状态描述
     /// </summary>
-    public string StatusText => this.Status.GetDescription();
+    public string StatusText
+    {
+        get
+        {
+            if (Status == EOrderStatus.Published || Status == EOrderStatus.Filed)
+            {
+                return "办理完成";
+            }
+            return Status.GetDescription();
+        }
+    }
 
     /// <summary>
     /// 时间

+ 25 - 3
src/Hotline.Share/Dtos/Snapshot/OrderPublishDto.cs

@@ -69,6 +69,16 @@ public class OrderPublishDetailOutDto : OrderPublishOutDto
     /// </summary>
     public bool IsSecret { get; set; }
 
+    /// <summary>
+    /// 事件描述
+    /// </summary>
+    public string Content { get; set; }
+
+    /// <summary>
+    /// 回复
+    /// </summary>
+    public string Opinion { get; set; }
+
     /// <summary>
     /// 附件
     /// </summary>
@@ -82,15 +92,27 @@ public class OrderPublishDetailOutDto : OrderPublishOutDto
 
 public class SnapshotWorkflow
 {
+    public SnapshotWorkflow(string id, string name, DateTime dateTime)
+    {
+        Id = id;
+        Name = name;
+        HandleTime = dateTime;
+    }
+
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
     /// <summary>
     /// 接办部门名称
     /// </summary>
-    public string AcceptorOrgName { get; set; }
+    public string Name { get; set; }
 
     /// <summary>
     /// 接办时间
     /// </summary>
-    public DateTime AcceptTime { get; set; }
+    public DateTime HandleTime { get; set; }
 }
 
 public class OrderPublishOutDto
@@ -108,7 +130,7 @@ public class OrderPublishOutDto
     /// <summary>
     /// 标题
     /// </summary>
-    public string ArrangeTitle { get; set; }
+    public string Title { get; set; }
 
     /// <summary>
     /// 受理时间

+ 13 - 5
src/Hotline.Share/Dtos/Snapshot/RedPackDto.cs

@@ -1,5 +1,6 @@
 using Hotline.Share.Enums.Snapshot;
 using Hotline.Share.Requests;
+using Hotline.Share.Tools;
 using System.ComponentModel.DataAnnotations;
 
 namespace Hotline.Share.Dtos.Snapshot;
@@ -8,14 +9,19 @@ public class RedPackOutDto
     public string Title { get; set; }    
     public DateTime CreationTime { get; set; }
     public string CreationTimeText => CreationTime.ToString("yyyy-MM-dd HH:mm:ss");
+
+    /// <summary>
+    /// 金额(单位:元)
+    /// </summary>
+    public string AmountTxt => Amount.ToYuanFinance();
+
     /// <summary>
     /// 金额(单位:分)
     /// </summary>
     public int Amount { get; set; }
-    public string AmountText => (Amount / 1000).ToString();
 }
 
-public record RedPacksInDto : PagedRequest
+public class RedPacksInDto : QueryFixedDto
 { 
     /// <summary>
     /// 时间; 格式:yyyy-MM
@@ -55,8 +61,10 @@ public class RedPackDateOutDto
     /// 金额(单位:分)
     /// </summary>
     public int Amount { get; set; }
-}
 
-internal class RedPackDto
-{
+    /// <summary>
+    /// 金额(单位:元)
+    /// </summary>
+    public string AmountTxt => Amount.ToYuanFinance();
 }
+

+ 4 - 15
src/Hotline.Share/Dtos/Snapshot/SnapshotUserInfoDto.cs

@@ -13,26 +13,19 @@ public class SnapshotUserInfoOutDto
     /// </summary>
     public string PhoneNumberMask => PhoneNumber.MaskPhoneNumber();
 
-    private long dayAmount;
+    public int DayAmount { get; set; }
 
     /// <summary>
     /// 当日奖励(单元: 元)
     /// </summary>
-    public long DayAmount
-    {
-        get
-        {
-            return (int)(dayAmount * 1000);
-        }
-        set { dayAmount = value; }
-    }
+    public string DayAmountTxt => DayAmount.ToYuanFinance();
 
-    private long totalAmount;
+    public int TotalAmount { get; set; }
 
     /// <summary>
     /// 总奖励(单位:元)
     /// </summary>
-    public long TotalAmount { get { return totalAmount * 1000; } set { totalAmount = value; } }
+    public string TotalAmountTxt => TotalAmount.ToYuanFinance();
 
     /// <summary>
     /// 未回复数量
@@ -50,7 +43,3 @@ public class SnapshotUserInfoOutDto
     public int AppraiseCount { get; set; }
 }
 
-public class SnapshotUserInfoDto
-{
-}
-

+ 7 - 1
src/Hotline.Share/Tools/DoubleExtensions.cs

@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Tartarus.Snowball;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -46,4 +47,9 @@ public static class DoubleExtensions
 
         return value.Value.SecondsToString();
     }
+
+    public static string ToYuanFinance(this int value)
+    {
+        return (value / 100.0).ToString("F2");
+    }
 }

+ 1 - 1
src/Hotline/Snapshot/ThirdAccount.cs

@@ -57,7 +57,7 @@ public class ThirdAccount : CreationSoftDeleteEntity
     /// 历史已经领取金额总和(分)
     /// </summary>
     [SugarColumn(ColumnDescription = "历史已经领取金额总和(分)")]
-    public long TotalAmount { get; set; }
+    public int TotalAmount { get; set; }
 
     /// <summary>
     /// 用户头像Url