TANG JIANG 1 жил өмнө
parent
commit
426e0c4fd1

+ 1 - 1
src/Sharing.Api/config/appsettings.Development.json

@@ -47,7 +47,7 @@
       "UrlAddress": "CityHandOver.asmx/FlowWrite"
     },
     "MediaCode": {
-      "MediaCode": "123456"
+      "MediaCode": "FWYB0828"
     },
     //系统市州编码
     "CityCode": {

+ 183 - 22
src/Sharing.ConvergenceMedia/Controllers/ConvergenceMediaController.cs

@@ -1,20 +1,16 @@
 using DotNetCore.CAP;
-using Hotline.Share.Dtos.Knowledge;
-using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Sharing.ConvergenceMedia.Dtos;
 using Sharing.Orders;
 using Sharing.Share.Dtos.ConvergenceMedia;
 using Sharing.WebCore;
-using System.Threading;
-using XF.Domain.Authentications;
-using XF.Domain.Repository;
-using Microsoft.IdentityModel.Tokens;
 using SqlSugar;
-using Hotline.Share.Enums.Order;
+using XF.Domain.Repository;
 
 namespace Sharing.ConvergenceMedia.Controllers
 {
@@ -25,6 +21,7 @@ namespace Sharing.ConvergenceMedia.Controllers
         private readonly IChannelConfigurationManager _channelConfigurationManager;
         private readonly IRepository<MediaDataReceive> _mediaDataReceiveRepository;
         private readonly IDataOrderRepository _dataOrderRepository;
+        private readonly IRepository<DataOrderWorkFlow> _dataOrderWorkFlowRepository;
 
         /// <summary>
         /// 
@@ -34,14 +31,16 @@ namespace Sharing.ConvergenceMedia.Controllers
         /// <param name="channelConfigurationManager"></param>
         /// <param name="mediaDataReceiveRepository"></param>
         /// <param name="dataOrderRepository"></param>
+        /// <param name="dataOrderWorkFlowRepository"></param>
         public ConvergenceMediaController(IMapper mapper, ICapPublisher capPublisher, IChannelConfigurationManager channelConfigurationManager,
-            IRepository<MediaDataReceive> mediaDataReceiveRepository, IDataOrderRepository dataOrderRepository)
+            IRepository<MediaDataReceive> mediaDataReceiveRepository, IDataOrderRepository dataOrderRepository, IRepository<DataOrderWorkFlow> dataOrderWorkFlowRepository)
         {
             _mapper = mapper;
             _capPublisher = capPublisher;
             _channelConfigurationManager = channelConfigurationManager;
             _mediaDataReceiveRepository = mediaDataReceiveRepository;
             _dataOrderRepository = dataOrderRepository;
+            _dataOrderWorkFlowRepository = dataOrderWorkFlowRepository;
         }
 
         /// <summary>
@@ -51,21 +50,18 @@ namespace Sharing.ConvergenceMedia.Controllers
         /// <returns></returns>
         [HttpPost("WriteOrder")]
         [AllowAnonymous]
-        public async Task<DeReponse<WriteOrderResponseDto>> WriteOrder([FromBody] MediaDataReceiveDto mediaDataReceiveDto)
+        public async Task<List<DeReponse<WriteOrderResponseDto>>> WriteOrder([FromBody] MediaDataReceiveDto mediaDataReceiveDto)
         {
-            // 验证
-            if (mediaDataReceiveDto is null)
-                return DeReponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "数据解析失败", Code = "0" }, "1", "数据解析失败");
+            //验证密钥
+            var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
+            if (mediaCode.MediaCode.ToLower().Trim() != mediaDataReceiveDto.Code.ToLower().Trim())
+                return DeReponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "密钥错误", Code = "-900" }, "1", "密钥错误");
 
             //验证数据
             string strResult = mediaDataReceiveDto.Validate();
             if (!string.IsNullOrEmpty(strResult))
                 return DeReponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = strResult, Code = "0" }, "1", description: strResult);
 
-            var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
-            if (mediaCode.MediaCode.ToLower().Trim() != mediaDataReceiveDto.Code.ToLower().Trim())
-                return DeReponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "密钥错误", Code = "-900" }, "1", "密钥错误");
-
             //转换数据
             var dto = _mapper.Map<MediaDataReceive>(mediaDataReceiveDto);
             //添加数据
@@ -178,12 +174,14 @@ namespace Sharing.ConvergenceMedia.Controllers
         /// <returns></returns>
         [HttpPost("GetOrderByList")]
         [AllowAnonymous]
-        public async Task<DeReponse<GetOrderMediaDataDto>> GetOrderByList([FromBody] GetOrderMediaReceiveDto dto)
+        public async Task<List<DeReponse<GetOrderMediaDataDto>>> GetOrderByList([FromBody] GetOrderMediaReceiveDto dto)
         {
+            //密钥验证
             var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
             if (mediaCode.MediaCode.ToLower().Trim() != dto.Code.ToLower().Trim())
-                return DeReponse<GetOrderMediaDataDto>.Failed(new GetOrderMediaDataDto(), "0", "密钥错误");
+                return DeReponse<GetOrderMediaDataDto>.Failed(null, "0", "密钥错误");
 
+            //数据处理
             string AcceptTypeCode = "";
             switch (dto.PurTypeID)
             {
@@ -210,6 +208,7 @@ namespace Sharing.ConvergenceMedia.Controllers
                     break;
             }
 
+            //数据查询
             RefAsync<int> total = 0;
             var items = await _dataOrderRepository
             .Queryable()
@@ -224,6 +223,7 @@ namespace Sharing.ConvergenceMedia.Controllers
             {
                 FlowID = it.Id,
                 RowID = SqlFunc.MappingColumn(default(int), "  row_number()  over( order by 'AddDate' desc ) "),
+                //  RowID= SqlFunc.RowNumber(it.CaseDate),
                 Code = it.OrderNo,
                 Title = it.Title,
                 AddDate = it.CaseDate,
@@ -236,6 +236,7 @@ namespace Sharing.ConvergenceMedia.Controllers
             //计算总页数
             int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
 
+            //处理返回
             GetOrderMediaDataDto dataDto = new()
             {
                 PageCount = nPageCount,
@@ -244,13 +245,90 @@ namespace Sharing.ConvergenceMedia.Controllers
 
             return DeReponse<GetOrderMediaDataDto>.Success(dataDto, "成功");
 
-
         }
 
+        /// <summary>
+        /// 2.3 工单查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("GetOrderDetail")]
+        [AllowAnonymous]
+        public async Task<List<DeReponse<IReadOnlyList<MediaOrderDetailDataDto>>>> GetOrderDetail([FromBody] MediaOrderDetailReceiveDto dto)
+        {
+            //验证密钥
+            var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
+            if (mediaCode.MediaCode.ToLower().Trim() != dto.Code.ToLower().Trim())
+                return DeReponse<IReadOnlyList<MediaOrderDetailDataDto>>.Failed(null, "0", "密钥错误");
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return DeReponse<IReadOnlyList<MediaOrderDetailDataDto>>.Failed(null, "0", strResult);
 
+            //查询数据
+            var items = await _dataOrderRepository
+             .Queryable()
+             .Where(p => p.OrderNo == dto.AcceptCode)
+             .Where(p => p.Password == dto.AcceptPwd)
+              .Select(it => new
+              {
+                  FlowID = it.Id,
+                  FlowCode = it.OrderNo,
+                  FlowTitle = it.Title,
+                  FlowFromName = it.CaseSource,
+                  FlowPurTypeName = it.CaseType,
+                  FlowConTypeName = it.HotspotName,
+                  FlowAddDate = it.CaseDate,
+                  FlowLKName = it.FromName,
+                  FlowBMName = it.ActualHandleOrgName,
+                  FlowRSFlagName = it.HandleState,
+                  FlowContent = it.Content,
+                  FlowResult = it.ActualOpinion,
+              })
+              .ToListAsync();
+
+            if (items == null)
+                return DeReponse<IReadOnlyList<MediaOrderDetailDataDto>>.Failed(null, "0", "编号、密码错误!");
+            else
+                return DeReponse<IReadOnlyList<MediaOrderDetailDataDto>>.Success(_mapper.Map<IReadOnlyList<MediaOrderDetailDataDto>>(items), "成功");
 
+        }
 
+        /// <summary>
+        /// 2.4 今日受理分类统计
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        [HttpPost("GetPurTypeReport")]
+        [AllowAnonymous]
+        public async Task<List<DeReponse<List<GetPurTypeReportDataDto>>>> GetPurTypeReport([FromBody] string Code)
+        {
+            //验证密钥
+            var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
+            if (mediaCode.MediaCode.ToLower().Trim() != Code.ToLower().Trim())
+                return DeReponse<List<GetPurTypeReportDataDto>>.Failed(null, "0", "密钥错误");
+
+            //数据查询
+            var list = _dataOrderRepository.Queryable()
+                .Where(p => p.CaseDate >= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")))
+                .Where(p => p.CaseDate <= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")))
+                .Select(it => new
+                {
+                    it.CaseType,
+                    it.CaseTypeCode
+                })
+                .MergeTable()//将查询出来的结果合并成一个新表
+                 .GroupBy(it => new { it.CaseType, it.CaseTypeCode })//对新表进行分组
+                 .Select(it => new
+                 {
+                     PurTypeName = it.CaseType,
+                     Count = SqlFunc.AggregateCount(it.CaseTypeCode)
+                 })
+                 .ToListAsync();
 
+            var listData = _mapper.Map<List<GetPurTypeReportDataDto>>(list);
+            return DeReponse<List<GetPurTypeReportDataDto>>.Success(listData, "成功");
+        }
 
         /// <summary>
         /// 2.5 答复公开
@@ -259,12 +337,14 @@ namespace Sharing.ConvergenceMedia.Controllers
         /// <returns></returns>
         [HttpPost("GetOrderByListOpen")]
         [AllowAnonymous]
-        public async Task<DeReponse<GetOrderMediaDataDto>> GetOrderByListOpen([FromBody] GetOrderMediaReceiveOpenDto dto)
+        public async Task<List<DeReponse<GetOrderMediaDataDto>>> GetOrderByListOpen([FromBody] GetOrderMediaReceiveOpenDto dto)
         {
+            //密钥验证
             var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
             if (mediaCode.MediaCode.ToLower().Trim() != dto.Code.ToLower().Trim())
-                return DeReponse<GetOrderMediaDataDto>.Failed(new GetOrderMediaDataDto(), "0", "密钥错误");
+                return DeReponse<GetOrderMediaDataDto>.Failed(null, "0", "密钥错误");
 
+            //数据处理
             string AcceptTypeCode = "";
             switch (dto.PurTypeID)
             {
@@ -291,10 +371,11 @@ namespace Sharing.ConvergenceMedia.Controllers
                     break;
             }
 
+            //查询数据
             RefAsync<int> total = 0;
             var items = await _dataOrderRepository
             .Queryable()
-            .Where(p => p.Source == ESource.ConvergenceMedia.ToString())
+            .Where(p => p.IsPublish == Sharing.Share.Enums.EPublishState.Open)
             .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
             .WhereIF(!string.IsNullOrEmpty(AcceptTypeCode), p => p.CaseTypeCode == AcceptTypeCode)
             .WhereIF(!string.IsNullOrEmpty(dto.StartDate), p => p.CaseDate >= Convert.ToDateTime(dto.StartDate))
@@ -315,6 +396,7 @@ namespace Sharing.ConvergenceMedia.Controllers
             //计算总页数
             int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
 
+            //返回数据处理
             GetOrderMediaDataDto dataDto = new()
             {
                 PageCount = nPageCount,
@@ -324,5 +406,84 @@ namespace Sharing.ConvergenceMedia.Controllers
             return DeReponse<GetOrderMediaDataDto>.Success(dataDto, "成功");
 
         }
+
+        /// <summary>
+        /// 2.6 办理明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("GetOrderByRun")]
+        [AllowAnonymous]
+        public async Task<List<DeReponse<IReadOnlyList<GetOrderByRunDataDto>>>> GetOrderByRun([FromBody] MediaOrderDetailReceiveDto dto)
+        {
+            //密钥验证
+            var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
+            if (mediaCode.MediaCode.ToLower().Trim() != dto.Code.ToLower().Trim())
+                return DeReponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", "密钥错误");
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return DeReponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", strResult);
+
+            //验证信件是否存在
+            var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.AcceptCode && p.Password == dto.AcceptPwd);
+            if (data == null)
+                return DeReponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", "编号、密码错误!");
+
+            //数据查询
+            var list = await _dataOrderWorkFlowRepository.Queryable()
+                  .Where(p => p.OrderId == data.OrderId)
+                  .Where(p => p.WorkflowId == data.WorkflowId)
+                  .Select(it => new
+                  {
+                      BMName = it.HandlerOrgName,
+                      TTime = it.StepExpiredTime,
+                      DisposeDate = it.HandleTime
+                  })
+                  .ToListAsync();
+            return DeReponse<IReadOnlyList<GetOrderByRunDataDto>>.Success(_mapper.Map<IReadOnlyList<GetOrderByRunDataDto>>(list), "成功");
+        }
+
+        /// <summary>
+        /// 2.1.3 上传附件----未完成
+        /// </summary>
+        /// <param name="formData"></param>
+        /// <returns></returns>
+        [HttpPost("WriteFiles")]
+        [AllowAnonymous]
+        public async Task<byte[]> WriteFiles([FromForm] IFormCollection formData)
+        {
+            string Code = formData["Code"];
+            string AcceptCode = formData["AcceptCode"];
+            string AcceptPwd = formData["AcceptPwd"];
+
+            IFormFileCollection files = formData.Files;//等价于Request.Form.Files
+            long size = files.Sum(f => f.Length);
+            var file = files[0];
+
+            string FileName = file.FileName;
+
+            var stream = file.OpenReadStream();
+            byte[] ByteFile = i_StreamToBytes(stream);
+            return ByteFile;
+        }
+
+
+        #region 私有方法-将文件转化为文件流
+        /// <summary>
+        /// 将文件转化为文件流
+        /// </summary>
+        /// <param name="stream"></param>
+        /// <returns></returns>
+        private byte[] i_StreamToBytes(Stream stream)
+        {
+            byte[] bytes = new byte[stream.Length];
+            stream.Read(bytes, 0, bytes.Length);
+            // 设置当前流的位置为流的开始    
+            stream.Seek(0, SeekOrigin.Begin);
+            return bytes;
+        }
+        #endregion
     }
 }

+ 9 - 15
src/Sharing.ConvergenceMedia/Dtos/DeReponse.cs

@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Sharing.ConvergenceMedia.Dtos
+namespace Sharing.ConvergenceMedia.Dtos
 {
     public class DeReponse<TData>
     {
@@ -29,14 +23,14 @@ namespace Sharing.ConvergenceMedia.Dtos
         /// <param name="data"></param>
         /// <param name="description"></param>
         /// <returns></returns>
-        public static DeReponse<TData> Success(TData data, string? description = "")
+        public static List<DeReponse<TData>> Success(TData data, string? description = "")
         {
-            return new DeReponse<TData>
+            return new List<DeReponse<TData>>() { new DeReponse<TData>
             {
                 code = "1",
                 data = data,
                 msg = (description ?? "您已成功提交数据!")
-            };
+            }};
         }
 
         /// <summary>
@@ -46,14 +40,14 @@ namespace Sharing.ConvergenceMedia.Dtos
         /// <param name="code"></param>
         /// <param name="description"></param>
         /// <returns></returns>
-        public static DeReponse<TData> Failed(TData data,string? code = "0", string? description = "")
+        public static List<DeReponse<TData>> Failed(TData data, string? code = "0", string? description = "")
         {
-            return new DeReponse<TData>
+            return new List<DeReponse<TData>>() { new DeReponse<TData>
             {
-                code = code,
-                data=data,
+               code = code,
+                data = data,
                 msg = (description ?? "接口调用失败!")
-            };
+            }};
         }
     }
 }

+ 26 - 0
src/Sharing.ConvergenceMedia/Dtos/MediaOrderDetailReceiveDto.cs

@@ -0,0 +1,26 @@
+namespace Sharing.ConvergenceMedia.Dtos
+{
+    public class MediaOrderDetailReceiveDto
+    {
+        /// <summary>
+        /// 密钥
+        /// </summary>
+        [MDisplayName("密钥")]
+        [VRequired]
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [MDisplayName("工单编号")]
+        [VRequired]
+        public string AcceptCode { get; set; }
+
+        /// <summary>
+        /// 工单密码
+        /// </summary>
+        [MDisplayName("工单密码")]
+        [VRequired]
+        public string AcceptPwd { get; set; }
+    }
+}

+ 20 - 0
src/Sharing.Share/Dtos/ConvergenceMedia/GetOrderByRunDataDto.cs

@@ -0,0 +1,20 @@
+namespace Sharing.Share.Dtos.ConvergenceMedia
+{
+    public class GetOrderByRunDataDto
+    {
+        /// <summary>
+        /// 办理部门
+        /// </summary>
+        public string BMName { get; set; }
+
+        /// <summary>
+        /// 到期时间
+        /// </summary>
+        public DateTime? TTime { get; set; }
+
+        /// <summary>
+        /// 办理时间
+        /// </summary>
+        public DateTime? DisposeDate { get; set; }
+    }
+}

+ 15 - 0
src/Sharing.Share/Dtos/ConvergenceMedia/GetPurTypeReportDataDto.cs

@@ -0,0 +1,15 @@
+namespace Sharing.Share.Dtos.ConvergenceMedia
+{
+    public class GetPurTypeReportDataDto
+    {
+        /// <summary>
+        /// 受理分类名称
+        /// </summary>
+        public string PurTypeName { get; set; }
+
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int Count { get; set; }
+    }
+}

+ 70 - 0
src/Sharing.Share/Dtos/ConvergenceMedia/MediaOrderDetailDataDto.cs

@@ -0,0 +1,70 @@
+namespace Sharing.Share.Dtos.ConvergenceMedia
+{
+    public class MediaOrderDetailDataDto
+    {
+        /// <summary>
+        /// 标识
+        /// </summary>
+        public string FlowID { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string FlowCode { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string FlowTitle { get; set; }
+
+        /// <summary>
+        /// 工单来源
+        /// </summary>
+        public string FlowFromName { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string FlowPurTypeName { get; set; }
+
+        /// <summary>
+        /// 热点类型
+        /// </summary>
+        public string FlowConTypeName { get; set; }
+
+        /// <summary>
+        /// 保存时间
+        /// </summary>
+        public string FlowAddDate { get; set; }
+
+        /// <summary>
+        /// 联系人
+        /// </summary>
+        public string FlowLKName { get; set; }
+
+        /// <summary>
+        /// 办理部门
+        /// </summary>
+        public string FlowBMName { get; set; }
+
+        /// <summary>
+        /// 办理状态
+        /// </summary>
+        public string FlowRSFlagName { get; set; }
+
+        /// <summary>
+        /// 受理内容
+        /// </summary>
+        public string FlowContent { get; set; }
+
+        /// <summary>
+        /// 处理结果
+        /// </summary>
+        public string FlowResultg { get; set; }
+    }
+
+    public class MediaOrderDetailDataDtoList
+    {
+        public IReadOnlyList<MediaOrderDetailDataDto> Data { get; set; }
+    }
+}

+ 12 - 0
src/Sharing/Orders/DataOrder.cs

@@ -26,6 +26,18 @@ public class DataOrder : CreationModificationEntity
     [SugarColumn(ColumnDescription = "工单编号", ColumnDataType = "varchar(50)")]
     public string OrderNo { get; set; }
 
+    /// <summary>
+    /// 流程ID
+    /// </summary>
+    [SugarColumn(ColumnDescription = "流程ID", ColumnDataType = "varchar(50)")]
+    public string WorkflowId { get; set; }
+
+    /// <summary>
+    /// 信件查询密码
+    /// </summary>
+    [SugarColumn(ColumnDescription = "信件查询密码", ColumnDataType = "varchar(20)")]
+    public string Password { get; set; }
+
     /// <summary>
     /// 工单标题
     /// </summary>

+ 111 - 0
src/Sharing/Orders/DataOrderWorkFlow.cs

@@ -0,0 +1,111 @@
+using SqlSugar;
+using XF.Domain.Repository;
+
+namespace Sharing.Orders
+{
+    public class DataOrderWorkFlow : CreationModificationEntity
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单ID", ColumnDataType = "varchar(50)")]
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "流程ID", ColumnDataType = "varchar(50)")]
+        public string WorkflowId { get; set; }
+
+        #region 接办
+
+        /// <summary>
+        /// 接办人ID
+        /// </summary>
+        public string? AcceptorId { get; set; }
+
+        /// <summary>
+        /// 接办人
+        /// </summary>
+        public string? AcceptorName { get; set; }
+
+        /// <summary>
+        /// 接办人部门code
+        /// </summary>
+        public string? AcceptorOrgId { get; set; }
+
+        /// <summary>
+        /// 接办人部门名称
+        /// </summary>
+        public string? AcceptorOrgName { get; set; }
+
+        /// <summary>
+        /// 接办人部门行政区划代码
+        /// </summary>
+        public string? AcceptorOrgAreaCode { get; set; }
+
+        /// <summary>
+        /// 接办人部门行政区划名称
+        /// </summary>
+        public string? AcceptorOrgAreaName { get; set; }
+
+        /// <summary>
+        /// 接办时间
+        /// </summary>
+        public DateTime? AcceptTime { get; set; }
+
+        #endregion
+
+        #region 办理信息
+        /// <summary>
+        /// 办理人ID
+        /// </summary>
+        public string? HandlerId { get; set; }
+
+        /// <summary>
+        /// 办理人名称
+        /// </summary>
+        public string? HandlerName { get; set; }
+
+        /// <summary>
+        /// 办理人部门code
+        /// </summary>
+        public string? HandlerOrgId { get; set; }
+
+        /// <summary>
+        /// 办理人部门名称
+        /// </summary>
+        public string? HandlerOrgName { get; set; }
+
+        /// <summary>
+        /// 办理人部门行政区划代码
+        /// </summary>
+        public string? HandlerOrgAreaCode { get; set; }
+
+        /// <summary>
+        /// 办理人部门行政区划名称
+        /// </summary>
+        public string? HandlerOrgAreaName { get; set; }
+
+        /// <summary>
+        /// 办理完成时间
+        /// </summary>
+        public DateTime? HandleTime { get; set; }
+
+        /// <summary>
+        /// 办理意见
+        /// </summary>
+        public string? Opinion { get; set; }
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        public List<string> Additions { get; set; } = new();
+
+        /// <summary>
+        /// 节点期满时间
+        /// </summary>
+        public DateTime? StepExpiredTime { get; set; }
+        #endregion
+    }
+}