qinchaoyue 1 hónapja
szülő
commit
a671d69aa8

+ 18 - 4
src/Hotline.Api/Controllers/Snapshot/BiSnapshotController.cs

@@ -183,8 +183,22 @@ public class BiSnapshotController : BaseController
     public async Task<PagedDto<DuplicateItemsOutDto>> GetDuplicateItemsAsync([FromQuery] DuplicateItemsInDto dto)
     => (await _biSnapshotApplication.GetDuplicateItems(dto).ToPagedListAsync(dto)).ToPaged();
 
-    
-    [HttpGet("county-statistics")]
-    public async Task<IList<CountyStatisticsOutDto>> GetCountyStatisticsAsync([FromQuery] CountyStatisticsInDto dto)
-        => await _biSnapshotApplication.GetCountyStatistics(dto).ToListAsync();
+    /// <summary>
+    /// 社区统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("community-statistics")]
+    public async Task<IList<CommunityStatisticsOutDto>> GetCommunityStatisticsAsync([FromQuery] CommunityStatisticsInDto dto)
+        => await _biSnapshotApplication.GetCommunityStatistics(dto).ToListAsync();
+
+    /// <summary>
+    /// 社区统计-详情
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("community-statistics-detail")]
+    public async Task<PagedDto<CommunityStatisticsDetailsOutDto>> GetCommunityStatisticsDetailsAsync([FromQuery] CommunityStatisticsDetailsInDto dto)
+        => (await _biSnapshotApplication.GetCommunityStatisticsDetails(dto).ToPagedListAsync(dto)).ToPaged();
+
 }

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

@@ -90,6 +90,8 @@ public class SnapshotMapperConfigs : IRegister
             .Map(m => m.MemberName, n => n.MemberName)
             .Map(m => m.MemberMobile, n => n.MemberMobile)
             .Map(m => m.CommunityId, n => n.OrgId)
+            .Map(m => m.CommunityName, n => n.OrgName)
+            .Map(m => m.CommunityFullName, n => n.OrgFullName)
             .Map(m => m.NetworkRemark, n => n.ReplyContent);
     }
 }

+ 29 - 29
src/Hotline.Application/Snapshot/BiSnapshotApplication.cs

@@ -521,38 +521,38 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
         return query;
     }
 
-    public ISugarQueryable<CountyStatisticsOutDto> GetCountyStatistics(CountyStatisticsInDto dto)
+    public ISugarQueryable<CommunityStatisticsOutDto> GetCommunityStatistics(CommunityStatisticsInDto dto)
     {
-        var IsCenter = _sessionContext.OrgIsCenter;
-        string count = "2";
-        string countx = string.Empty;
-        if (dto.CountyCode.NotNullOrEmpty())
-        {
-            count = (dto.CountyCode.Length + 2).ToString();
-            countx = dto.CountyCode.Length.ToString();
-        }
-        return _communityInfoRepository.Queryable()
-        .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
-        .LeftJoin<OrderSnapshot>((it, o, s) => o.Id == s.Id)
-        .Where((it, o, s) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && s.Id != null)
-        .WhereIF(dto.CountyCode.IsNullOrEmpty(), (it, o) => o.Id != null)
-        .WhereIF(dto.CountyCode.NotNullOrEmpty(), (it, o) => it.ParentCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == dto.CountyCode)
-        .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
-        .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
-        .Select((it, o) => new
+        var query = _communityInfoRepository.Queryable(includeDeleted: true)
+        .LeftJoin<OrderSnapshot>((it, s) => s.CommunityFullName.Contains(it.FullName) && s.CreationTime >= dto.StartTime && s.CreationTime <= dto.EndTime)
+        .WhereIF(dto.CommunityCode.IsNullOrEmpty(), (it, s) => it.ParentCode == null)
+        .WhereIF(dto.CommunityCode.NotNullOrEmpty(), (it, s) => it.ParentCode == dto.CommunityCode)
+        .WhereIF(dto.IndustryId.NotNullOrEmpty(), (it, s) => s.IndustryId == dto.IndustryId)
+        .GroupBy((it, s) => new { it.Name, it.Id })
+        .Select((it, s) => new CommunityStatisticsOutDto
         {
-            CommunityCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
-            SumCount = SqlFunc.AggregateCount(it.FullName)
-        })
-        .MergeTable()
-        .LeftJoin<CommunityInfo>((x, q) => x.CommunityCode == q.Id)
-        .Select((x, q) => new CountyStatisticsOutDto
-        {
-            CountyCode = x.CommunityCode,
-            SumCount = x.SumCount,
-            CountyName = q.Name,
-            HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.CommunityCode).Any()
+            CommunityCode = it.Id,
+            CommunityName = it.Name,
+            CommunityFullName = it.FullName,
+            SumCount = SqlFunc.Subqueryable<OrderSnapshot>().Where(snapshot => snapshot.CommunityFullName.Contains(it.FullName)).Count(),
+            HasChild = SqlFunc.Subqueryable<CommunityInfo>().Where(c => c.ParentCode == it.Id).Any()
         });
+#if DEBUG
+        var sql = query.ToSqlString();
+#endif
+        return query;
+    }
 
+    public ISugarQueryable<CommunityStatisticsDetailsOutDto> GetCommunityStatisticsDetails(CommunityStatisticsDetailsInDto dto)
+    {
+        var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
+            .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
+            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && snapshot.CommunityFullName.Contains(dto.CommunityFullName))
+            .WhereIF(dto.IndustryId.NotNullOrEmpty(), (snapshot, order) => snapshot.IndustryId == dto.IndustryId)
+            .Select((snapshot, order) => new CommunityStatisticsDetailsOutDto(), true);
+#if DEBUG
+        var sql = query.ToSqlString();
+#endif
+        return query;
     }
 }

+ 8 - 1
src/Hotline.Application/Snapshot/IBiSnapshotApplication.cs

@@ -54,5 +54,12 @@ public interface IBiSnapshotApplication
     /// <returns></returns>
     ISugarQueryable<GuiderWorkLogsOutDto> GetGuiderWorkLogs(GuiderWorkLogsInDto dto);
     ISugarQueryable<DuplicateItemsOutDto> GetDuplicateItems(DuplicateItemsInDto dto);
-    ISugarQueryable<CountyStatisticsOutDto> GetCountyStatistics(CountyStatisticsInDto dto);
+    ISugarQueryable<CommunityStatisticsOutDto> GetCommunityStatistics(CommunityStatisticsInDto dto);
+
+    /// <summary>
+    /// 社区统计-详情
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<CommunityStatisticsDetailsOutDto> GetCommunityStatisticsDetails(CommunityStatisticsDetailsInDto dto);
 }

+ 153 - 5
src/Hotline.Share/Dtos/Snapshot/StatisticsDto.cs

@@ -1900,7 +1900,7 @@ public class DuplicateItemsOutDto
     public string AcceptorName { get; set; }
 }
 
-public class CountyStatisticsInDto
+public class CommunityStatisticsInDto
 {
     [Required]
     public DateTime StartTime { get; set; }
@@ -1912,14 +1912,162 @@ public class CountyStatisticsInDto
     /// </summary>
     public string? IndustryId { get; set; }
 
-    public string? CountyCode { get; set; }
+    public string? CommunityCode { get; set; }
 }
 
-public class CountyStatisticsOutDto
+public class CommunityStatisticsOutDto
 {
-    public string CountyCode { get; set; }
+    [JsonIgnore]
+    [Newtonsoft.Json.JsonIgnore]
+    public string CommunityCode { get; set; }
     public int SumCount { get; set; }
-    public string CountyName { get; set; }
+    public string CommunityName { get; set; }
     public bool HasChild { get; set; }
+    public string CommunityFullName { get; set; }
+}
+
+public class CommunityStatisticsDetailsOutDto
+{
+
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 过期状态
+    /// </summary>
+    public EExpiredStatus? ExpiredStatus => FiledTime.CalculateExpiredState(Status, this.ExpiredTime, this.NearlyExpiredTime, this.NearlyExpiredTimeOne);
+
+    /// <summary>
+    /// 过期状态
+    /// </summary>
+    public string ExpiredStatusText => ExpiredStatus.GetDescription();
+
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string No { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public EOrderStatus Status { get; set; }
 
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public string StatusTxt => Status.GetDescription();
+
+    /// <summary>
+    /// 来源
+    /// </summary>
+    public string SourceChannel { get; set; }
+
+    /// <summary>
+    /// 当前节点
+    /// </summary>
+    public string CurrentStepName { get; set; }
+
+    /// <summary>
+    /// 重办次数
+    /// </summary>
+    public int ReTransactNum { get; set; }
+
+    /// <summary>
+    /// 是否紧急
+    /// </summary>
+    public bool IsUrgent { get; set; }
+
+    /// <summary>
+    /// 是否紧急
+    /// </summary>
+    public string IsUrgentText => IsUrgent ? "紧急" : "-";
+
+    /// <summary>
+    /// 期满时间
+    /// </summary>
+    public DateTime? ExpiredTime { get; set; }
+
+    /// <summary>
+    /// 即将超期时间
+    /// </summary>
+    public DateTime? NearlyExpiredTime { get; set; }
+
+    /// <summary>
+    /// 即将超期时间第一级
+    /// </summary>
+    public DateTime? NearlyExpiredTimeOne { get; set; }
+
+    /// <summary>
+    /// 是否超期
+    /// </summary>
+    public bool IsExpired
+    {
+        get
+        {
+            if (ExpiredTime.HasValue)
+                return DateTime.Now > ExpiredTime.Value;
+            return false;
+        }
+    }
+
+    /// <summary>
+    /// 受理时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string Title { get; set; }
+
+    /// <summary>
+    /// 接办部门
+    /// </summary>
+    public string ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 接办时间
+    /// </summary>
+    public DateTime? StartTime { get; set; }
+
+    /// <summary>
+    /// 办结时间
+    /// </summary>
+    public DateTime? FiledTime { get; set; }
+
+    /// <summary>
+    /// 受理类型
+    /// </summary>
+    public string AcceptType { get; set; }
+
+    /// <summary>
+    /// 热点类型
+    /// </summary>
+    public string HotspotName { get; set; }
+
+    /// <summary>
+    /// 社区名称
+    /// </summary>
+    public string CommunityName { get; set; }
+}
+
+public record CommunityStatisticsDetailsInDto : PagedRequest
+{
+    [Required]
+    public DateTime StartTime { get; set; }
+    [Required]
+    public DateTime EndTime { get; set; }
+
+    /// <summary>
+    /// 社区全称
+    /// </summary>
+    [Required]
+    public string CommunityFullName { get; set; }
+
+    /// <summary>
+    /// 行业Id
+    /// </summary>
+    public string? IndustryId { get; set; }
 }

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

@@ -33,7 +33,7 @@ public class CommunityInfo : CreationSoftDeleteEntity
     /// 父社区Code
     /// </summary>
     [SugarColumn(ColumnDescription = "父社区Code")]
-    public string ParentCode { get; set; }
+    public string? ParentCode { get; set; }
 
     /// <summary>
     /// 社区唯一

+ 6 - 0
src/Hotline/Snapshot/OrderSnapshot.cs

@@ -41,6 +41,12 @@ public class OrderSnapshot : CreationSoftDeleteEntity
     [SugarColumn(ColumnDescription = "社区名字")]
     public string? CommunityName { get; set; }
 
+    /// <summary>
+    /// 社区名字
+    /// </summary>
+    [SugarColumn(ColumnDescription = "社区名字")]
+    public string? CommunityFullName { get; set; }
+
     /// <summary>
     /// 作业类型
     /// </summary>

+ 64 - 0
test/Hotline.Tests/Application/BiSnapshotApplicationTest.cs

@@ -0,0 +1,64 @@
+using Hotline.Api.Controllers;
+using Hotline.Application.Snapshot;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Settings;
+using Hotline.Share.Dtos.Snapshot;
+using Hotline.Snapshot.Interfaces;
+using Hotline.Users;
+using Mapster;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Shouldly;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Cache;
+using XF.Domain.Repository;
+
+namespace Hotline.Tests.Application;
+public class BiSnapshotApplicationTest : TestBase
+{
+    private readonly IBiSnapshotApplication _biSnapshotApplication;
+    public BiSnapshotApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdIdentiyService, IThirdAccountRepository thirdAccountRepository, ITypedCache<SystemSetting> cacheSettingData, IBiSnapshotApplication biSnapshotApplication) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdIdentiyService, thirdAccountRepository, cacheSettingData)
+    {
+        _biSnapshotApplication = biSnapshotApplication;
+    }
+
+    [Fact]
+    public async Task GetCountyStatistics_Test()
+    {
+        var inDto = new CommunityStatisticsInDto
+        {
+            StartTime = DateTime.Now.AddDays(-30),
+            EndTime = DateTime.Now
+        };
+
+        var items = await _biSnapshotApplication.GetCommunityStatistics(inDto).ToListAsync();
+        var first = items.FirstOrDefault();
+        first.ShouldNotBeNull();
+        first.CommunityName.ShouldBe("自贡市");
+
+        var end = true;
+        while (end)
+        {
+            var hasChild = items.Where(m => m.SumCount != 0).FirstOrDefault();
+            if (hasChild == null)
+            {
+                end = false;
+                return;
+            }
+            inDto.CommunityCode = hasChild.CommunityCode;
+            items = await _biSnapshotApplication.GetCommunityStatistics(inDto).ToListAsync();
+            if (hasChild.SumCount != 0)
+            {
+                var inDto2 = inDto.Adapt<CommunityStatisticsDetailsInDto>();
+                inDto2.CommunityFullName = hasChild.CommunityFullName;
+                var details = await _biSnapshotApplication.GetCommunityStatisticsDetails(inDto2).ToListAsync();
+                details.Count.ShouldBe(hasChild.SumCount);
+            }
+        }
+    }
+}

+ 4 - 25
test/Hotline.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -99,7 +99,7 @@ public class OrderSnapshotApplicationTest : TestBase
         var inputLable = snapshotLabels.Where(m => m.DicDataValue == "bss").ToList();
         var order = _orderServiceMock.CreateSnapshotOrder(SetWeiXin)
             .办理到网格员(SetZuoXi)
-            .StepHandle(async order =>
+            .StepHandle(async (order, mock) =>
             {
                 await _snapshotApplication.PostOrderGuiderSystemAsync(order.Id, CancellationToken.None);
                 var orderSnapshot = await _orderSnapshotRepository.GetAsync(order.Id);
@@ -119,31 +119,10 @@ public class OrderSnapshotApplicationTest : TestBase
                     .Where(m => m.Id == order.Id)
                     .ExecuteCommandAsync();
                 orderSnapshot = await _orderSnapshotRepository.GetAsync(order.Id);
-                var replyDto = new GuiderSystemInDto
-                {
-                    ReplyCode = order.No,
-                    AppealNumber = orderSnapshot.NetworkENumber,
-                    ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
-                    ReplyUserName = "18181552753@zgsg",
-                    ReplyBMName = "瓦市村村民委员会",
-                    ReplyResultType = "2",
-                    ReplyISTrue = "1",
-                    IsRepeat = "0",
-                    IsHiddenDanger = "1",
-                    MemberName = "许利洪",
-                    MemberMobile = "18181552753",
-                    ReplyContent = "到现场查实,存在安全隐患",
-                    OrgId = "4828",
-                    OrgName = "瓦市村民委员会" + DateTime.Now.ToString("ss"),
-                    OrgFullName = "四川省/自贡市/沿滩区/永安镇/瓦市村村民委员会" + DateTime.Now.ToString("ss"),
-                    DepartmentNo = "510311106206",
-                    ParentOrgId = "4821",
-                    ReplyFileList = new List<string>
-                    {
-                        "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
-                    }
-                };
+                var replyDto =  mock.GetGuiderSystemInDto(orderSnapshot.NetworkENumber);
                 await _snapshotApplication.SaveGuiderSystemReplyAsync(replyDto, CancellationToken.None);
+                orderSnapshot = await _orderSnapshotRepository.GetAsync(order.Id);
+                orderSnapshot.CommunityName.ShouldNotBeNull();
                 var orderReply = await _orderSnapshotRepository.GetByNetworkENumberAsync(replyDto.AppealNumber);
                 orderReply.IsDanger.ShouldBe(true);
                 orderReply.MemberMobile.ShouldBe(replyDto.MemberMobile);

+ 130 - 0
test/Hotline.Tests/Mock/OrderServiceMock.cs

@@ -27,6 +27,7 @@ using Hotline.FlowEngine.Notifications;
 using Hotline.Api.Controllers.Bi;
 using XF.Domain.Exceptions;
 using System;
+using DocumentFormat.OpenXml.Bibliography;
 
 namespace Hotline.Tests.Mock;
 public class OrderServiceMock
@@ -431,6 +432,128 @@ public class OrderServiceMock
         return result;
     }
 
+    public GuiderSystemInDto GetGuiderSystemInDto(string number)
+    {
+        List<GuiderSystemInDto> items = [ new GuiderSystemInDto
+        {
+            ReplyCode = CreateOrderOutDto.No,
+            AppealNumber = number,
+            ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
+            ReplyUserName = "18181552753@zgsg",
+            ReplyBMName = "瓦市村村民委员会",
+            ReplyResultType = "2",
+            ReplyISTrue = "1",
+            IsRepeat = "0",
+            IsHiddenDanger = "1",
+            MemberName = "许利洪",
+            MemberMobile = "18181552753",
+            ReplyContent = "到现场查实,存在安全隐患",
+            OrgId = "4828",
+            OrgName = "瓦市村民委员会",
+            OrgFullName = "四川省/自贡市/沿滩区/永安镇/瓦市村村民委员会",
+            DepartmentNo = "510311106206",
+            ParentOrgId = "4821",
+            ReplyFileList =
+                    [
+                        "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
+                    ]
+        },
+        new GuiderSystemInDto {
+            ReplyCode = CreateOrderOutDto.No,
+            AppealNumber = number,
+            ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
+            ReplyUserName = "18015707487@zgsg",
+            ReplyBMName = "大岩社区第一网格",
+            ReplyResultType = "2",
+            ReplyISTrue = "1",
+            IsRepeat = "0",
+            IsHiddenDanger = "1",
+            MemberName = "黄敬",
+            MemberMobile = "18015707487",
+            ReplyContent = "到现场查实,存在安全隐患",
+            OrgId = "138497",
+            OrgName = "大岩社区第一网格",
+            OrgFullName = "四川省/自贡市/自贡高新区/红旗街道/大岩社区居民委员会/大岩社区第一网格",
+            DepartmentNo = "510323004002001",
+            ParentOrgId = "137874",
+            ReplyFileList =
+                    [
+                        "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
+                    ]
+        },
+        new GuiderSystemInDto {
+            ReplyCode = CreateOrderOutDto.No,
+            AppealNumber = number,
+            ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
+            ReplyUserName = "18015707367@zgsg",
+            ReplyBMName = "悦景社区第一网格",
+            ReplyResultType = "2",
+            ReplyISTrue = "1",
+            IsRepeat = "0",
+            IsHiddenDanger = "0",
+            MemberName = "余文惠",
+            MemberMobile = "18015707367",
+            ReplyContent = "确认情况属实,但是不属于我们管辖。属于市政工程。",
+            OrgId = "138563",
+            OrgName = "悦景社区第一网格",
+            OrgFullName = "四川省/自贡市/自贡高新区/红旗街道/悦景社区居民委员会/悦景社区第一网格",
+            DepartmentNo = "510323004004001",
+            ParentOrgId = "137875",
+            ReplyFileList =
+                    [
+                        "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
+                    ]
+        },
+        new GuiderSystemInDto {
+            ReplyCode = CreateOrderOutDto.No,
+            AppealNumber = number,
+            ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
+            ReplyUserName = "18015707408@zgsg",
+            ReplyBMName = "大湾社区第一网格",
+            ReplyResultType = "2",
+            ReplyISTrue = "1",
+            IsRepeat = "0",
+            IsHiddenDanger = "0",
+            MemberName = "邓文文",
+            MemberMobile = "15928137497",
+            ReplyContent = "网格员到现场核实,情况属实,此地方属于物业处理,已通知物业及时处理。",
+            OrgId = "138520",
+            OrgName = "大湾社区第一网格",
+            OrgFullName = "四川省/自贡市/自贡高新区/红旗街道/大湾社区居民委员会/大湾社区第一网格",
+            DepartmentNo = "510323004001001",
+            ParentOrgId = "137873",
+            ReplyFileList =
+                    [
+                        "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
+                    ]
+        },
+        new GuiderSystemInDto {
+            ReplyCode = CreateOrderOutDto.No,
+            AppealNumber = number,
+            ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
+            ReplyUserName = "18015707443@zgsg",
+            ReplyBMName = "明珠社区第一网格",
+            ReplyResultType = "2",
+            ReplyISTrue = "",
+            IsRepeat = "",
+            IsHiddenDanger = "",
+            MemberName = "周洪英",
+            MemberMobile = "15881342458",
+            ReplyContent = "现场查看情况属实,属于汇东公园管辖范围",
+            OrgId = "138372",
+            OrgName = "明珠社区第一网格",
+            OrgFullName = "四川省/自贡市/自贡高新区/丹桂街道/明珠社区居民委员会/明珠社区第一网格",
+            DepartmentNo = "510323001010001",
+            ParentOrgId = "137777",
+            ReplyFileList =
+                    [
+                        "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
+                    ]
+        }];
+        var index = new Random().Next(0, items.Count);
+        return items[index];
+    }
+
     private string UploadFileFromMemory(byte[] fileBytes, string fileName, string uploadUrl)
     {
         using HttpClient client = new HttpClient();
@@ -447,12 +570,19 @@ public class OrderServiceMock
         return result;
     }
 
+    public OrderServiceMock StepHandle(Func<CreateOrderOutDto, OrderServiceMock, Task> handle)
+    {
+        handle(CreateOrderOutDto, this).GetAwaiter().GetResult();
+        return this;
+    }
+
     public OrderServiceMock StepHandle(Func<CreateOrderOutDto, Task> handle)
     {
         handle(CreateOrderOutDto).GetAwaiter().GetResult();
         return this;
     }
 
+
     public OrderServiceMock 办理到工单标注(Action action = null)
     {
         action?.Invoke();