Эх сурвалжийг харах

Merge branch 'feature/snapshot' into dev

qinchaoyue 1 сар өмнө
parent
commit
fc45ffded7

+ 20 - 7
src/Hotline.Api/Controllers/Snapshot/SnapshotOrderController.cs

@@ -4,6 +4,7 @@ using Hotline.Application.Orders;
 using Hotline.Application.Snapshot;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Services;
+using Hotline.Configurations;
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
@@ -20,6 +21,7 @@ using Hotline.Snapshot;
 using Hotline.Snapshot.Interfaces;
 using Mapster;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using System.ComponentModel;
 using System.Text;
 using XF.Domain.Authentications;
@@ -46,8 +48,9 @@ public class SnapshotOrderController : BaseController
     private readonly IWorkflowApplication _workflowApplication;
     private readonly IRepository<WorkflowDefinition> _workflowDefinitionRepository;
     private readonly IOrderApplication _orderApplication;
+    private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
-    public SnapshotOrderController(IOrderSnapshotRepository orderSnapshotRepository, IOrderSnapshotApplication orderSnapshotApplication, ISystemAreaDomainService systemAreaDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, ISessionContext sessionContext, IWorkflowDomainService workflowDomainService, IOrderRepository orderRepository, IWorkflowApplication workflowApplication, IRepository<WorkflowDefinition> workflowDefinitionRepository, IOrderApplication orderApplication)
+    public SnapshotOrderController(IOrderSnapshotRepository orderSnapshotRepository, IOrderSnapshotApplication orderSnapshotApplication, ISystemAreaDomainService systemAreaDomainService, ISystemDicDataCacheManager systemDicDataCacheManager, IIndustryRepository industryRepository, ISessionContext sessionContext, IWorkflowDomainService workflowDomainService, IOrderRepository orderRepository, IWorkflowApplication workflowApplication, IRepository<WorkflowDefinition> workflowDefinitionRepository, IOrderApplication orderApplication, IOptionsSnapshot<AppConfiguration> appOptions)
     {
         _orderSnapshotRepository = orderSnapshotRepository;
         _orderSnapshotApplication = orderSnapshotApplication;
@@ -60,6 +63,7 @@ public class SnapshotOrderController : BaseController
         _workflowApplication = workflowApplication;
         _workflowDefinitionRepository = workflowDefinitionRepository;
         _orderApplication = orderApplication;
+        _appOptions = appOptions;
     }
 
     /// <summary>
@@ -90,11 +94,11 @@ public class SnapshotOrderController : BaseController
         await _workflowDefinitionRepository.Queryable()
             .Where(m => m.Status == EDefinitionStatus.Enable && m.Code == "gdbl")
             .OrderByDescending(m => m.Version)
-            .Select(m => new { m.Id, m.Steps})
+            .Select(m => new { m.Id, m.Steps })
             .FirstAsync().Then(async workflowSteps =>
             {
                 steps = workflowSteps.Steps.Adapt<IList<NameCodeDto>>()
-               .ToList().Select(m => new Kv 
+               .ToList().Select(m => new Kv
                {
                    Key = m.Code,
                    Value = m.Name,
@@ -103,7 +107,7 @@ public class SnapshotOrderController : BaseController
         return new Dictionary<string, object>
         {
             { "orderStatus", EnumExts.GetDescriptions<EOrderStatus>()},
-            { "area", await _systemAreaDomainService.GetAreaKeyValue(parentId: "510300")},
+            { "area", await _systemAreaDomainService.GetAreaKeyValue(parentId: _appOptions.Value.AreaCode)},
             { "steps", steps},
             { "orderTags", _systemDicDataCacheManager.OrderTag},
             { "industry", await _industryRepository.Queryable().Select(d => new { d.Id, d.Name, }).ToListAsync()},
@@ -145,11 +149,11 @@ public class SnapshotOrderController : BaseController
     /// <returns></returns>
     [HttpGet("label/{id}")]
     public async Task<LabelOrderSnapshotDetailOutDto> GetLabelOrderSnapshotDetailAsync(string id)
-    { 
+    {
         var order = await _orderRepository.Queryable()
             .LeftJoin<OrderSnapshot>((order, snapshot) => order.Id == snapshot.Id)
             .Where((order, snapshot) => order.Id == id)
-            .Select((order, snapshot) => new LabelOrderSnapshotDetailOutDto { Id = order.Id, Title = order.Title, Lables =snapshot.Labels })
+            .Select((order, snapshot) => new LabelOrderSnapshotDetailOutDto { Id = order.Id, Title = order.Title, Lables = snapshot.Labels })
             .FirstAsync();
         var snapshot = await _orderSnapshotRepository.GetAsync(id, HttpContext.RequestAborted);
         order.Lables = snapshot.Labels;
@@ -250,7 +254,7 @@ public class SnapshotOrderController : BaseController
             { "publishStatus", EnumExts.GetDescriptions<EOrderSnapshotPublishStatus>()},
             { "acceptCode", _systemDicDataCacheManager.AcceptType.Adapt<List<Kv>>() },
             { "orderStatus", EnumExts.GetDescriptions<EOrderStatus>()},
-            { "area", await _systemAreaDomainService.GetAreaKeyValue(parentId: "510300")},
+            { "area", await _systemAreaDomainService.GetAreaKeyValue(parentId: _appOptions.Value.AreaCode)},
             { "industry", industry}
         };
     }
@@ -265,4 +269,13 @@ public class SnapshotOrderController : BaseController
     {
         await _orderApplication.HandleFromWanggeyuanToMaskAsync(id, HttpContext.RequestAborted);
     }
+
+    /// <summary>
+    /// 市民追加奖励集合
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("citizen/reward")]
+    public async Task<PagedDto<CitizenRewardOutDto>> GetCitizenRewardItemsAsync([FromQuery] CitizenRewardInDto dto)
+        => (await _orderSnapshotApplication.GetCitizenRewardItems(dto).ToPagedListAsync(dto)).ToPaged();
 }

+ 7 - 2
src/Hotline.Application/Snapshot/BiSnapshotApplication.cs

@@ -1,4 +1,5 @@
 using FluentValidation.Results;
+using Hotline.Configurations;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Orders;
@@ -20,6 +21,7 @@ using Mapster;
 using MediatR;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using NPOI.SS.Formula.Functions;
 using SqlSugar;
 using System;
@@ -47,8 +49,9 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
     private readonly IOrderRepository _orderRepository;
     private readonly ICommunityInfoRepository _communityInfoRepository;
     private readonly IRepository<SystemArea> _systemAreaRepository;
+    private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
-    public BiSnapshotApplication(IOrderSnapshotRepository orderSnapshotRepository, IRedPackRecordRepository redPackRecordRepository, IIndustryRepository industryRepository, IIndustryCaseRepository industryCaseRepository, IRedPackAuditRepository redPackAuditRepository, IRepository<Hotspot> hotspotTypeRepository, ISessionContext sessionContext, IOrderRepository orderRepository, ICommunityInfoRepository communityInfoRepository, IRepository<SystemArea> systemAreaRepository)
+    public BiSnapshotApplication(IOrderSnapshotRepository orderSnapshotRepository, IRedPackRecordRepository redPackRecordRepository, IIndustryRepository industryRepository, IIndustryCaseRepository industryCaseRepository, IRedPackAuditRepository redPackAuditRepository, IRepository<Hotspot> hotspotTypeRepository, ISessionContext sessionContext, IOrderRepository orderRepository, ICommunityInfoRepository communityInfoRepository, IRepository<SystemArea> systemAreaRepository, IOptionsSnapshot<AppConfiguration> appOptions)
     {
         _orderSnapshotRepository = orderSnapshotRepository;
         _redPackRecordRepository = redPackRecordRepository;
@@ -60,6 +63,7 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
         _orderRepository = orderRepository;
         _communityInfoRepository = communityInfoRepository;
         _systemAreaRepository = systemAreaRepository;
+        _appOptions = appOptions;
     }
 
     public ISugarQueryable<HotspotStatisticsOutDto> GetHotspotStatistics(HotspotStatisticsInDto dto)
@@ -562,6 +566,7 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
     [ExportExcel("随手拍区域统计", "County")]
     public ISugarQueryable<CountyRedPackStatisticsOutDto> GetCountyRedPackStatistics(CountyRedPackStatisticsInDto dto)
     {
+        var parentId = _appOptions.Value.AreaCode;
         var query = _systemAreaRepository.Queryable(includeDeleted: true)
             .LeftJoin<Order>((area, order) => order.County == area.AreaName && order.CreationTime >= dto.StartTime && order.CreationTime <= dto.EndTime && order.County != null)
             .LeftJoin<OrderSnapshot>((area, order, snapshot) => snapshot.Id == order.Id && (dto.IndustryId.IsNullOrEmpty() || snapshot.IndustryId == dto.IndustryId))
@@ -571,7 +576,7 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
             .LeftJoin<RedPackGuiderAudit>((area, order, snapshot, audit, record, supplement, guiderAudit) => guiderAudit.OrderId == snapshot.Id)
             .LeftJoin<RedPackRecord>((area, order, snapshot, audit, record, supplement, guiderAudit, guiderRecord) => guiderAudit.Id == guiderRecord.RedPackAuditId)
             .LeftJoin<Industry>((area, order, snapshot, audit, record, supplement, guiderAudit, guiderRecord, industry) => snapshot.IndustryId == industry.Id)
-            .Where((area, order, snapshot, audit, record, supplement, guiderAudit, guiderRecord) => area.ParentId == "510300" || area.AreaName == "外地")
+            .Where((area, order, snapshot, audit, record, supplement, guiderAudit, guiderRecord) => area.ParentId == parentId || area.AreaName == "外地")
             .GroupBy((area, order, snapshot, audit, record, supplement, guiderAudit, guiderRecord) => new { area.AreaName, order.County })
             .Select((area, order, snapshot, audit, record, supplement, guiderAudit, guiderRecord, industry) => new CountyRedPackStatisticsOutDto
             {

+ 1 - 0
src/Hotline.Application/Snapshot/IOrderSnapshotApplication.cs

@@ -135,4 +135,5 @@ public interface IOrderSnapshotApplication
     /// <param name="remark"></param>
     /// <returns></returns>
     Task<OrderSnapshot> UpdateSafetyAsync(string orderId, bool isSafetyDepartment, string remark);
+    ISugarQueryable<CitizenRewardOutDto> GetCitizenRewardItems(CitizenRewardInDto dto);
 }

+ 35 - 0
src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs

@@ -545,4 +545,39 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
         return await _orderSnapshotRepository.UpdateSafetyAsync(orderId, isSafetyDepartment, remark);
     }
 
+    public ISugarQueryable<CitizenRewardOutDto> GetCitizenRewardItems(CitizenRewardInDto dto)
+    {
+        var query = _orderSnapshotRepository.Queryable()
+            .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
+            .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order) => order.No.Contains(dto.No))
+            .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order) => order.Title.Contains(dto.Title))
+            .WhereIF(dto.ActualHandleOrgName.NotNullOrEmpty(), (snapshot, order) => order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
+            .WhereIF(dto.AcceptType.NotNullOrEmpty(), (snapshot, order) => order.AcceptType == dto.AcceptType)
+            .WhereIF(dto.AcceptorName.NotNullOrEmpty(), (snapshot, order) => order.AcceptorName == dto.AcceptorName)
+            .WhereIF(dto.ActualHandlerName.NotNullOrEmpty(), (snapshot, order) => order.ActualHandlerName == dto.ActualHandlerName)
+            .WhereIF(dto.FromPhone.NotNullOrEmpty(), (snapshot, order) => order.FromPhone == dto.FromPhone)
+            .WhereIF(dto.FromName.NotNullOrEmpty(), (snapshot, order) => order.FromName == dto.FromName)
+            .WhereIF(dto.BeginExpiredTime.HasValue && dto.EndExpiredTime.HasValue, (snapshot, order) => order.ExpiredTime >= dto.BeginExpiredTime && order.ExpiredTime <= dto.EndExpiredTime)
+            .WhereIF(dto.BeginCreationTime.HasValue && dto.EndCreationTime.HasValue, (snapshot, order) => order.CreationTime >= dto.BeginCreationTime && order.CreationTime <= dto.EndCreationTime)
+            .WhereIF(dto.Status.HasValue, (snapshot, order) => order.Status == dto.Status)
+            .WhereIF(dto.County.NotNullOrEmpty(), (snapshot, order) => order.County == dto.County)
+            .WhereIF(dto.IsScreen.HasValue && dto.IsScreen == true, (snapshot, order) => order.OrderScreens.Count() > 0)
+            .WhereIF(dto.IsScreen.HasValue && dto.IsScreen == false, (snapshot, order) => order.OrderScreens.Count() == 0)
+            .WhereIF(dto.CurrentStepName.NotNullOrEmpty(), (snapshot, order) => order.CurrentStepName == dto.CurrentStepName)
+            .WhereIF(dto.BeginFiledTime.HasValue && dto.EndFiledTime.HasValue, (snapshot, order) => order.FiledTime >= dto.BeginFiledTime && order.FiledTime <= dto.EndFiledTime)
+            .WhereIF(dto.HotspotName.NotNullOrEmpty(), (snapshot, order) => order.HotspotName.Contains(dto.HotspotName))
+            .WhereIF(dto.OrderTagCode.NotNullOrEmpty(), (snapshot, order) => order.OrderTagCode.Contains(dto.OrderTagCode))
+            .WhereIF(dto.IsUrgent.HasValue, (snapshot, order) => order.IsUrgent == dto.IsUrgent)
+            .WhereIF(dto.TransferPhone.NotNullOrEmpty(), (snapshot, order) => order.TransferPhone.Contains(dto.TransferPhone))
+            .WhereIF(dto.OrgLevelOneCode.NotNullOrEmpty(), (snapshot, order) => order.OrgLevelOneCode == dto.OrgLevelOneCode)
+            .WhereIF(dto.IndustryId.NotNullOrEmpty(), (snapshot, order) => snapshot.IndustryId == dto.IndustryId)
+            .Where((snapshot, order) => snapshot.IsAward == true)
+            .Select((snapshot, order) => new CitizenRewardOutDto
+            {
+                CreationTime = order.CreationTime
+            }
+             , true);
+        return query;
+
+    }
 }

+ 359 - 0
src/Hotline.Share/Dtos/Snapshot/OrderDto.cs

@@ -3,6 +3,7 @@ using Hotline.Share.Enums;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Snapshot;
 using Hotline.Share.Requests;
+using Hotline.Share.Tools;
 using System.ComponentModel.DataAnnotations;
 using XF.Utility.EnumExtensions;
 
@@ -2404,3 +2405,361 @@ public class LabelOrderSnapshotDetailOutDto
     /// </summary>
     public IReadOnlyCollection<SystemDicDataOutDto> LabelsBaseData { get; set; }
 }
+public record CitizenRewardInDto : PagedRequest
+{
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string? Title { get; set; }
+
+    /// <summary>
+    /// 接办部门
+    /// </summary>
+    public string? ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 受理类型
+    /// </summary>
+    public string? AcceptType { get; set; }
+
+    /// <summary>
+    /// 受理人
+    /// </summary>
+    public string? AcceptorName { get; set; }
+
+    /// <summary>
+    /// 接办人名称
+    /// </summary>
+    public string? ActualHandlerName { get; set; }
+
+    /// <summary>
+    /// 来电号码
+    /// </summary>
+    public string? FromPhone { get; set; }
+
+    /// <summary>
+    /// 联系号码
+    /// </summary>
+    public string? Contact { get; set; }
+
+    /// <summary>
+    /// 来电人
+    /// </summary>
+    public string? FromName { get; set; }
+
+    /// <summary>
+    /// 期满时间开始
+    /// </summary>
+    public DateTime? BeginExpiredTime { get; set; }
+
+    /// <summary>
+    /// 期满时间结束
+    /// </summary>
+    public DateTime? EndExpiredTime { get; set; }
+
+    /// <summary>
+    /// 受理时间开始
+    /// </summary>
+    public DateTime? BeginCreationTime { get; set; }
+
+    /// <summary>
+    /// 受理时间结束
+    /// </summary>
+    public DateTime? EndCreationTime { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public EOrderStatus? Status { get; set; }
+
+    /// <summary>
+    /// 区域信息
+    /// </summary>
+    public string? County { get; set; }
+
+    /// <summary>
+    /// 是否甄别
+    /// </summary>
+    public bool? IsScreen { get; set; }
+
+    /// <summary>
+    /// 当前节点
+    /// </summary>
+    public string? CurrentStepName { get; set; }
+
+    /// <summary>
+    /// 办结时间开始
+    /// </summary>
+    public DateTime? BeginFiledTime { get; set; }
+
+    /// <summary>
+    /// 办结时间结束
+    /// </summary>
+    public DateTime? EndFiledTime { get; set; }
+
+    /// <summary>
+    /// 热点类型名称
+    /// </summary>
+    public string? HotspotName { get; set; }
+
+    /// <summary>
+    /// 工单标签
+    /// </summary>
+    public string? OrderTagCode { get; set; }
+
+    /// <summary>
+    /// 是否紧急
+    /// </summary>
+    public bool? IsUrgent { get; set; }
+
+    /// <summary>
+    /// 转接来源
+    /// </summary>
+    public string? TransferPhone { get; set; }
+
+    /// <summary>
+    /// 一级部门
+    /// </summary>
+    public string? OrgLevelOneCode { get; set; }
+
+    /// <summary>
+    /// 一级部门名称
+    /// </summary>
+    public string? OrgLevelOneName { get; set; }
+
+    /// <summary>
+    /// 不满意转办
+    /// </summary>
+    public bool? DiscontentTurnTo { get; set; }
+
+    /// <summary>
+    /// 行业
+    /// </summary>
+    public string? IndustryId { get; set; }
+}
+
+public class CitizenRewardOutDto
+{
+    /// <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 IndustryName { get; set; }
+
+    /// <summary>
+    /// 是否发放补充奖励
+    /// </summary>
+    public bool IsAward { get; set; }
+
+    /// <summary>
+    /// 追加奖励金额(元)
+    /// </summary>
+    public double? AwardAmount { get; set; }
+
+    /// <summary>
+    /// 发放时间
+    /// </summary>
+    public DateTime? AwardTime { get; set; }
+
+    /// <summary>
+    /// 追加奖励人银行卡号
+    /// </summary>
+    public string? AwardBankCardNo { get; set; }
+
+    /// <summary>
+    /// 追加奖励人开户银行
+    /// </summary>
+    public string? AwardOpenBank { get; set; }
+
+    /// <summary>
+    /// 补充发放人员
+    /// </summary>
+    public string? AwardName { get; set; }
+
+    /// <summary>
+    /// 重点
+    /// </summary>
+    public string? Emphasis { get; set; }
+
+    /// <summary>
+    /// 全流程时长(秒)
+    /// </summary>
+    public double? AllDuration { get; set; }
+
+    /// <summary>
+    /// 办理时长(天)
+    /// </summary>
+    public string? TotalFieldDay => AllDuration.HasValue ? (AllDuration.Value / 60 / 60 / 24).ToString("f2") : null;
+
+    /// <summary>
+    /// 区域
+    /// </summary>
+    public string? County { get; set; }
+
+    /// <summary>
+    /// 电话
+    /// </summary>
+    public string? FromPhone { get; set; }
+
+    /// <summary>
+    /// 网格员姓名
+    /// </summary>
+    public string? MemberName { get; set; }
+
+    /// <summary>
+    /// 网格员电话
+    /// </summary>
+    public string? MemberMobile { get; set; }
+
+    /// <summary>
+    /// 网格员回复内容
+    /// </summary>
+    public string? NetworkRemark { get; set; }
+
+    /// <summary>
+    /// 网格E通编号
+    /// </summary>
+    public string? NetworkENumber { get; set; }
+
+    /// <summary>
+    /// 一级部门名称
+    /// </summary>
+    public string? OrgLevelOneName { get; set; }
+
+    /// <summary>
+    /// 接办部门
+    /// </summary>
+    public string ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 接办时间
+    /// </summary>
+    public DateTime? ActualHandleTime { 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? AcceptorName { get; set; }
+
+    /// <summary>
+    /// 受理内容
+    /// </summary>
+    public string Content { get; set; }
+
+    /// <summary>
+    /// 办理结果
+    /// </summary>
+    public string? FileOpinion { get; set; }
+}

+ 1 - 0
src/Hotline/Configurations/AppConfiguration.cs

@@ -18,6 +18,7 @@ namespace Hotline.Configurations
         public bool IsYiBin => CheckScopeIs(AppDefaults.AppScope.YiBin);
         public bool IsZiGong => CheckScopeIs(AppDefaults.AppScope.ZiGong);
         public bool IsLuZhou => CheckScopeIs(AppDefaults.AppScope.LuZhou);
+        public string AreaCode => GetDefaultAppScopeConfiguration().AreaCode;
 
         private bool CheckScopeIs(string appscope) => string.CompareOrdinal(AppScope, appscope) == 0;