Forráskód Böngészése

Merge branch 'test_feature_task363' into dev

Dun.Jason 1 hónapja
szülő
commit
fa579e86a2

+ 294 - 0
src/Hotline.Api/Controllers/EarlyController.cs

@@ -0,0 +1,294 @@
+using DocumentFormat.OpenXml.Drawing.Diagrams;
+using Hotline.Caching.Interfaces;
+using Hotline.Caching.Services;
+using Hotline.Early;
+using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Settings;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Early;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Early;
+using Hotline.Share.Enums.Order;
+using MapsterMapper;
+using Microsoft.AspNetCore.Mvc;
+using SqlSugar;
+using System.Threading;
+using XF.Domain.Authentications;
+using XF.Domain.Exceptions;
+using XF.Domain.Repository;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Api.Controllers
+{
+    public class EarlyController: BaseController
+    {
+        private readonly IRepository<EarlyWarningSetting> _earlyWarningRepository;
+        private readonly IMapper _mapper;
+        private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
+        private readonly IRepository<OrderWord> _orderWrodRepository;
+        private readonly IRepository<EarlyWarningOrder> _earlyWarningOrderRepository;
+        private readonly IRepository<EarlyWarningOrderDetail> _earlyWarningOrderDetailRepository;
+        private readonly IRepository<EarlyWarningPush> _earlyWarningPushRepository;
+        private readonly IRepository<EarlyWarningPushDetail> _earlyWarningPushDetailRepository;
+        private readonly ISessionContext _sessionContext;
+        private readonly IOrderRepository _orderRepository;
+
+
+
+        public EarlyController(IRepository<EarlyWarningSetting> earlyWarningRepository, IMapper mapper, ISystemDicDataCacheManager sysDicDataCacheManager, IRepository<OrderWord> orderWrodRepository, IRepository<EarlyWarningOrder> earlyWarningOrderRepository, IRepository<EarlyWarningOrderDetail> earlyWarningOrderDetailRepository, IRepository<EarlyWarningPush> earlyWarningPushRepository, IRepository<EarlyWarningPushDetail> earlyWarningPushDetailRepository, ISessionContext sessionContext, IOrderRepository orderRepository)
+        {
+            _earlyWarningRepository = earlyWarningRepository;
+            _mapper = mapper;
+            _sysDicDataCacheManager = sysDicDataCacheManager;
+            _orderWrodRepository = orderWrodRepository;
+            _earlyWarningOrderRepository = earlyWarningOrderRepository;
+            _earlyWarningOrderDetailRepository = earlyWarningOrderDetailRepository;
+            _earlyWarningPushRepository = earlyWarningPushRepository;
+            _earlyWarningPushDetailRepository = earlyWarningPushDetailRepository;
+            _sessionContext = sessionContext;
+            _orderRepository = orderRepository;
+        }
+
+        #region 预警设置
+
+        /// <summary>
+        /// 预警设置列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("earlysetting-pagelist")]
+        public async Task<PagedDto<EarlySettingDto>> EarlySettingPageList([FromQuery]EarlySettingPageListRequest dto)
+        {
+            var (total,items) = await _earlyWarningRepository.Queryable()
+                .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningName)== false, d => d.EarlyWarningName.Contains(dto.EarlyWarningName))
+                .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningLevelValue)==false ,d=> d.EarlyWarningLevelValue == dto.EarlyWarningLevelValue)
+                .WhereIF(dto.IsEnable.HasValue,d=>d.IsEnable == dto.IsEnable).ToPagedListAsync(dto.PageIndex,dto.PageSize,HttpContext.RequestAborted);
+
+            return new PagedDto<EarlySettingDto>(total, _mapper.Map<IReadOnlyList<EarlySettingDto>>(items));
+        }
+
+        /// <summary>
+        /// 新增预警设置
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("add-ealysetting")]
+        public async Task AddEarlySetting([FromBody] AddEarlySettingRequest dto)
+        {
+            var earlySetting = _mapper.Map<EarlyWarningSetting>(dto);
+            await _earlyWarningRepository.AddAsync(earlySetting,HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 修改预警设置
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("update-ealysetting")]
+        public async Task UpdateEarlySetting([FromBody] UpdateEarlySettingRequest dto)
+        {
+            var model = await _earlyWarningRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+            if (model == null)
+                throw UserFriendlyException.SameMessage("无效信息");
+            model = _mapper.Map<EarlyWarningSetting>(dto);
+            await _earlyWarningRepository.UpdateAsync(model, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 逻辑删除预警设置
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete("del-ealysetting")]
+        public async Task DelEarlySetting(string id)
+        {
+            var model = await _earlyWarningRepository.GetAsync(id, HttpContext.RequestAborted);
+            if (model == null)
+                throw UserFriendlyException.SameMessage("无效信息");
+            await _earlyWarningRepository.RemoveAsync(model,true, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 获取预警设置
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get-earlysetting/{id}")]
+        public async Task<EarlySettingDto> GetEarlySetting(string id)
+        {
+            var model = await _earlyWarningRepository.GetAsync(id, HttpContext.RequestAborted);
+            if (model == null)
+                throw UserFriendlyException.SameMessage("无效信息");
+            return _mapper.Map<EarlySettingDto>(model);
+        }
+
+        /// <summary>
+        /// 预警设置基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("earlysetting-basedata")]
+        public object EarlySettingBaseData()
+        {
+            return new
+            {
+                EarlyWarningLevel = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.EarlyWarningLevel),
+                EarlyWarningType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.EarlyWarningType),
+                EFrequency = EnumExts.GetDescriptions<EFrequency>(),
+                ECompareType = EnumExts.GetDescriptions<ECompareType>(),
+                SensitiveWords = _orderWrodRepository.Queryable().Where(x => x.IsEnable == 1 && x.Classify.Contains("敏感标签")).Select(x => x.Tag).ToList()
+            };
+        }
+
+
+        #endregion
+
+        #region 预警管理
+
+        /// <summary>
+        /// 预警管理
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("earlyorder-pagelist")]
+        public async Task<PagedDto<EarlyOrderDto>> EarlyOrderPageList([FromQuery]EarlyOrderPageListRequest dto)
+        {
+            var (total,items) = await _earlyWarningOrderRepository.Queryable()
+                .Includes(d=>d.EarlyWarningOrderDetails)
+                .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningName) == false, d => d.EarlyWarningSetting.EarlyWarningName.Contains(dto.EarlyWarningName))
+                .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningLevelValue) == false, d => d.EarlyWarningSetting.EarlyWarningLevelValue == dto.EarlyWarningLevelValue)
+                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<EarlyOrderDto>(total, _mapper.Map<IReadOnlyList<EarlyOrderDto>>(items));
+        }
+
+        /// <summary>
+        /// 获取预警管理对象
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("get-earlyorder/{id}")]
+        public async Task<EarlyOrderDto> GetEarlyOrder(string id)
+        {
+            var model = await _earlyWarningOrderRepository.GetAsync(id,HttpContext.RequestAborted);
+            if (model == null)
+                throw UserFriendlyException.SameMessage("无效信息");
+            return _mapper.Map<EarlyOrderDto>(model);
+        }
+
+
+        #endregion
+
+        #region 推送管理
+
+        /// <summary>
+        /// 推送报告列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("earlypush-pagelist")]
+        public async Task<PagedDto<EarlyPushDto>> EarlyPushPageList([FromQuery] EarlyPushPageListRequest dto)
+        {
+            var (total, items) = await _earlyWarningPushRepository.Queryable()
+               .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningPushName) == false, d => d.EarlyWarningPushName.Contains(dto.EarlyWarningPushName))
+               .WhereIF(dto.PushStatus.HasValue, d => d.PushStatus == dto.PushStatus)
+               .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<EarlyPushDto>(total, _mapper.Map<IReadOnlyList<EarlyPushDto>>(items));
+        }
+
+        /// <summary>
+        /// 新增推送报告 TODO
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("add-earlypush")]
+        public async Task AddEarlyPush([FromBody] AddEarlyPushRequest dto)
+        {
+            var earlySettingPush = _mapper.Map<EarlyWarningPush>(dto);
+            earlySettingPush.PushStatus = EPushStatus.Pushed;
+            if (dto.OperateModel==1)
+            {
+                earlySettingPush.PushStatus = EPushStatus.Draft;
+            }
+            if (dto.OperateModel!=1)
+            {
+                earlySettingPush.PushTime = DateTime.Now;
+            }
+            if (dto.OperateModel == 3)
+            {
+                //准备数据
+                var reportDto = GetEarlyReport(dto.EarlyWarningPushDetails,earlySettingPush);
+                
+                //推送生成报告消息TODO
+                earlySettingPush.PushReportUrl = "";
+            }
+            var id = await _earlyWarningPushRepository.AddAsync(earlySettingPush, HttpContext.RequestAborted);
+            dto.EarlyWarningPushDetails.ForEach(x =>
+            {
+                x.EarlyWarningPushId = id;
+            });
+            var detail = _mapper.Map<List<EarlyWarningPushDetail>>(dto.EarlyWarningPushDetails);
+            await _earlyWarningPushDetailRepository.AddRangeAsync(detail,HttpContext.RequestAborted);
+        }
+
+        private async Task<EarlyReportDto> GetEarlyReport(List<EarlyWarningPushDetailDto> dto, EarlyWarningPush earlyPush)
+        {
+            var reportDto = new EarlyReportDto();
+            reportDto.ReportName = earlyPush.EarlyWarningPushName;
+            reportDto.ReportPushTime = earlyPush.PushTime.Value;
+            List<string> orderIds = dto.Select(x => x.OrderId).ToList();
+            //查询所有工单
+            var orderList = await _orderRepository.Queryable().Where(x => orderIds.Contains(x.Id)).ToListAsync();
+            var result = from a in orderList
+                         join b in dto on a.Id equals b.OrderId
+                         select new ReportOrderListDto (){ Id = a.Id, ActualHandleOrgName = a.ActualHandleOrgName, IsSendWord = b.IsSendWord, County = a.County, OneHotspotName = a.HotspotSpliceName.Split("-")[0], HotspotName = a.HotspotName, Status = a.Status,FileOpinion = a.FileOpinion };
+
+            var reportHotDetail = orderList.GroupBy(x => x.HotspotSpliceName).ToList();
+
+                
+            //reportDto.ReportHotDetailDto = 
+
+            return reportDto;
+        }
+
+        /// <summary>
+        /// 获取推送报告
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("getearlypush/{id}")]
+        public async Task<EarlyPushDto> GetEarlyPush(string id)
+        {
+            var model = await _earlyWarningPushRepository.Queryable()
+                .Includes(x => x.EarlyWarningPushDetails)
+                .Includes(x=>x.EarlyWarningPushDetails,d=>d.Order)
+                .FirstAsync(HttpContext.RequestAborted);
+            if (model == null)
+                throw UserFriendlyException.SameMessage("无效信息");
+            return _mapper.Map<EarlyPushDto>(model);
+        }
+
+        #endregion
+
+        #region 报告接收
+
+        /// <summary>
+        /// 报告接收
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("report-receive")]
+        public async Task<PagedDto<EarlyPushDto>> ReportReceive([FromQuery] ReportReceiveRequest dto)
+        {
+            var (total, items) = await _earlyWarningPushRepository.Queryable()
+               .WhereIF(string.IsNullOrEmpty(dto.EarlyWarningPushName) == false, d => d.EarlyWarningPushName.Contains(dto.EarlyWarningPushName))
+               .Where(d=> d.PushStatus == EPushStatus.Pushed && SqlFunc.JsonListObjectAny(d.PushOrgs, "OrgCode", _sessionContext.OrgId))
+               .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<EarlyPushDto>(total, _mapper.Map<IReadOnlyList<EarlyPushDto>>(items));
+        }
+
+
+
+        #endregion
+    }
+}

+ 536 - 0
src/Hotline.Share/Dtos/Early/EarlyDto.cs

@@ -0,0 +1,536 @@
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Early;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Requests;
+using Lucene.Net.Util.Fst;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Utility.EnumExtensions;
+
+namespace Hotline.Share.Dtos.Early
+{
+    #region 预警设置
+    public class EarlySettingDto
+    {
+        public string Id { get; set; }
+        /// <summary>
+        /// 预警名称
+        /// </summary>
+        public string EarlyWarningName { get; set; }
+
+        /// <summary>
+        /// 预警级别名称
+        /// </summary>
+        public string EarlyWarningLevelName { get; set; }
+
+        /// <summary>
+        /// 预警类型名称
+        /// </summary>
+        public string EarlyWarningTypeName { get; set; }
+
+        /// <summary>
+        /// 是否启用
+        /// </summary>
+        public bool IsEnable { get; set; }
+
+        /// <summary>
+        /// 预警原因
+        /// </summary>
+        public string EarlyWarningRemark { get; set; }
+
+        /// <summary>
+        /// 频率
+        /// </summary>
+        public EFrequency Frequency { get; set; }
+
+        /// <summary>
+        /// 频率
+        /// </summary>
+        public string FrequencyText => Frequency.GetDescription();
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
+
+        /// <summary>
+        /// 规则明细
+        /// </summary>
+        public List<EarlyWarningRuleDto> EarlyWarningRules { get; set; }
+    }
+
+    public record EarlyWarningRuleDto
+    {
+        /// <summary>
+        /// 敏感词
+        /// </summary>
+        public string SensitiveWord { get; set; }
+
+        /// <summary>
+        /// 比较方式
+        /// </summary>
+        public ECompareType CompareType { get; set; }
+
+        /// <summary>
+        /// 次数
+        /// </summary>
+        public int Times { get; set; }
+    }
+
+    public record EarlySettingPageListRequest:PagedRequest
+    {
+        /// <summary>
+        /// 预警名称
+        /// </summary>
+        public string? EarlyWarningName { get; set; }
+        /// <summary>
+        /// 预警级别
+        /// </summary>
+        public string? EarlyWarningLevelValue { get; set; }
+
+        /// <summary>
+        /// 是否启用
+        /// </summary>
+        public bool? IsEnable { get; set; }
+
+    }
+    public record UpdateEarlySettingRequest: AddEarlySettingRequest
+    {
+        public string Id { get; set; }
+    }
+
+    public record AddEarlySettingRequest
+    {
+        /// <summary>
+        /// 预警名称
+        /// </summary>
+        public string EarlyWarningName { get; set; }
+
+        /// <summary>
+        /// 预警级别值
+        /// </summary>
+        public string EarlyWarningLevelValue { get; set; }
+
+        /// <summary>
+        /// 预警级别名称
+        /// </summary>
+        public string EarlyWarningLevelName { get; set; }
+
+        /// <summary>
+        /// 预警类型值
+        /// </summary>
+        public string EarlyWarningTypeValue { get; set; }
+
+        /// <summary>
+        /// 预警类型名称
+        /// </summary>
+        public string EarlyWarningTypeName { get; set; }
+
+        /// <summary>
+        /// 是否启用
+        /// </summary>
+        public bool IsEnable { get; set; }
+
+        /// <summary>
+        /// 预警原因
+        /// </summary>
+        public string EarlyWarningRemark { get; set; }
+
+        /// <summary>
+        /// 预警规则
+        /// </summary>
+
+        public List<EarlyWarningRule> EarlyWarningRules { get; set; }
+
+        /// <summary>
+        /// 频率
+        /// </summary>
+        public EFrequency Frequency { get; set; }
+    }
+
+    public record EarlyWarningRule
+    {
+        /// <summary>
+        /// 敏感词
+        /// </summary>
+        public string SensitiveWord { get; set; }
+
+        /// <summary>
+        /// 比较方式
+        /// </summary>
+        public ECompareType CompareType { get; set; }
+
+        /// <summary>
+        /// 比较方式
+        /// </summary>
+        public string CompareTypeText => CompareType.GetDescription();
+
+        /// <summary>
+        /// 次数
+        /// </summary>
+        public int Times { get; set; }
+    }
+
+    #endregion
+
+    #region 预警管理
+
+    public record EarlyOrderDto
+    {
+        /// <summary>
+        /// 预警设置ID
+        /// </summary>
+        public string EarlyWarningSettingId { get; set; }
+
+        /// <summary>
+        /// 预警设置
+        /// </summary>
+        public EarlySettingDto EarlyWarningSetting { get; set; }
+
+        /// <summary>
+        /// 最后预警时间
+        /// </summary>
+        public DateTime LastEarlyTime { get; set; }
+
+        /// <summary>
+        /// 预警明细
+        /// </summary>
+        public List<EarlyWarningOrderDetailDto> EarlyWarningOrderDetails { get; set; }
+
+        /// <summary>
+        /// 行政区划编码
+        /// </summary>
+        public string? AreaCode { get; set; }
+
+        /// <summary>
+        /// 省
+        /// </summary>
+        public string? Province { get; set; }
+
+        /// <summary>
+        /// 市
+        /// </summary>
+        public string? City { get; set; }
+
+        /// <summary>
+        /// 区/县
+        /// </summary>
+        public string? County { get; set; }
+
+        /// <summary>
+        /// 乡镇(4级行政区划)
+        /// </summary>
+        public string? Town { get; set; }
+
+        /// <summary>
+        /// 村/社区
+        /// </summary>
+        public string? Village { get; set; }
+
+        /// <summary>
+        /// 完整地址
+        /// </summary>
+        public string? FullAddress { get; set; }
+    }
+
+    public record EarlyWarningOrderDetailDto
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 工单内容快照
+        /// </summary>
+        public string OrderContent { get; set; }
+
+        /// <summary>
+        /// 工单标题快照
+        /// </summary>
+        public string OrderTitle { get; set; }
+
+        /// <summary>
+        /// 敏感标签
+        /// </summary>
+        public List<string>? Sensitive { get; set; }
+
+        /// <summary>
+        /// 工单推送状态
+        /// </summary>
+        public EOrderPushStatus OrderPushStatus { get; set; }
+
+        /// <summary>
+        /// 预警ID
+        /// </summary>
+        public string EarlyWarningOrderId { get; set; }
+    }
+
+
+    public record EarlyOrderPageListRequest: PagedRequest
+    {
+        /// <summary>
+        /// 预警名称
+        /// </summary>
+        public string? EarlyWarningName { get; set; }
+
+        /// <summary>
+        /// 预警级别
+        /// </summary>
+        public string? EarlyWarningLevelValue { get; set; }
+
+    }
+
+    #endregion
+
+    #region 报告管理
+
+    public record EarlyPushDto
+    {
+        /// <summary>
+        /// 推送报告名称
+        /// </summary>
+        public string EarlyWarningPushName { get; set; }
+
+        /// <summary>
+        /// 推送部门
+        /// </summary>
+        public List<PushOrgDto> PushOrgs { get; set; }
+
+        /// <summary>
+        /// 报告状态
+        /// </summary>
+        public EPushStatus PushStatus { get; set; }
+
+        /// <summary>
+        /// 办理中数量(推送后)
+        /// </summary>
+        public int? ProcessingCount { get; set; }
+
+        /// <summary>
+        /// 办理完成数量(推送后)
+        /// </summary>
+        public int? FiledCount { get; set; }
+
+        /// <summary>
+        /// 推送时间
+        /// </summary>
+        public DateTime? PushTime { get; set; }
+
+        /// <summary>
+        /// 推送报告下载地址
+        /// </summary>
+        public string? PushReportUrl { get; set; }
+
+        /// <summary>
+        /// 报告明细
+        /// </summary>
+        public List<EarlyWarningPushDetailDto> EarlyWarningPushDetails { get; set; }
+
+    }
+
+    public record EarlyWarningPushDetailDto
+    {
+        public string EarlyWarningPushId { get; set; }
+
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 是否生成word
+        /// </summary>
+        public bool IsSendWord { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        public OrderDto? Order { get; set; }
+    }
+
+    public record PushOrgDto
+    {
+        public string OrgCode { get; set; }
+
+        public string OrgName { get; set; }
+    }
+
+    public record EarlyPushPageListRequest:PagedRequest
+    {
+        /// <summary>
+        /// 推送报告名称
+        /// </summary>
+        public string EarlyWarningPushName { get; set; }
+
+        /// <summary>
+        /// 推送状态
+        /// </summary>
+        public EPushStatus? PushStatus { get; set; }
+    }
+
+    public record AddEarlyPushRequest
+    {
+        public string EarlyWarningPushName { get; set; }
+
+        public List<PushOrgDto> PushOrg { get; set; }
+
+        /// <summary>
+        /// 操作方式  1:暂存  2:推送 3:推送并生成报告
+        /// </summary>
+        public int OperateModel { get; set; }
+
+
+        public List<EarlyWarningPushDetailDto> EarlyWarningPushDetails { get; set; }
+    }
+
+    public record ReportReceiveRequest:PagedRequest
+    {
+        /// <summary>
+        /// 推送报告名称
+        /// </summary>
+        public string EarlyWarningPushName { get; set; }
+    }
+
+    public class EarlyReportDto
+    {
+        /// <summary>
+        /// 报告名称
+        /// </summary>
+        public string ReportName { get; set; }
+
+        /// <summary>
+        /// 报告时间
+        /// </summary>
+        public DateTime ReportPushTime { get; set; }
+
+        /// <summary>
+        /// 热点汇报简介
+        /// </summary>
+        public ReportHotDetailDto ReportHotDetail { get; set; }
+
+        /// <summary>
+        /// 区域汇报简介
+        /// </summary>
+        public ReportAreaDetailDto ReportAreaDetail { get; set; }
+
+        /// <summary>
+        /// 工单明细表
+        /// </summary>
+        public ReportOrderDetailDto ReportOrderDetail { get; set; }
+
+        /// <summary>
+        /// 往期明细工单
+        /// </summary>
+        public ReportFiledOrderDetailDto ReportFiledOrderDetail { get; set; }
+    }
+
+    public class ReportAreaDetailDto
+    {
+        /// <summary>
+        /// 区县名称
+        /// </summary>
+        public string AreaName { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Count { get; set; }
+    }
+
+    public class ReportHotDetailDto
+    {
+        /// <summary>
+        /// 热点名称
+        /// </summary>
+        public string HotName { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Count { get; set; }
+
+        /// <summary>
+        /// 主要涉及
+        /// </summary>
+        public string Content { get; set; }
+    }
+
+    public class ReportOrderDetailDto
+    {
+        /// <summary>
+        /// 一级热点
+        /// </summary>
+        public string OneHotSportName { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string HotSportName { get; set; }
+
+        /// <summary>
+        /// 诉求内容
+        /// </summary>
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 办理情况
+        /// </summary>
+        public string ActualOpinion { get; set; }
+    }
+
+    public class ReportFiledOrderDetailDto
+    {
+        /// <summary>
+        /// 期刊
+        /// </summary>
+        public string ReportName { get; set; }
+
+        /// <summary>
+        /// 一级热点
+        /// </summary>
+        public string OneHotSportName { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string HotSportName { get; set; }
+
+        /// <summary>
+        /// 诉求内容
+        /// </summary>
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 办理情况
+        /// </summary>
+        public string ActualOpinion { get; set; }
+    }
+
+
+    public class ReportOrderListDto()
+    {
+        public string Id { get; set; }
+
+        public string ActualHandleOrgName { get; set; }
+
+        public bool IsSendWord { get; set; }
+
+        public string County { get; set; }
+
+        public string OneHotspotName { get; set; }
+
+        public string HotspotName { get; set; }
+
+        public EOrderStatus Status { get; set; }
+
+        public string FileOpinion { get; set; }
+    }
+    #endregion
+}

+ 23 - 0
src/Hotline.Share/Enums/Early/ECompareType.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Early
+{
+    public enum ECompareType
+    {
+        /// <summary>
+        /// 大于
+        /// </summary>
+        [Description("大于")]
+        MoreThan = 1,
+        /// <summary>
+        /// 大于等于
+        /// </summary>
+        [Description("大于等于")]
+        MoreThanAndEqual = 2,
+    }
+}

+ 33 - 0
src/Hotline.Share/Enums/Early/EFrequency.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Early
+{
+    public enum EFrequency
+    {
+        /// <summary>
+        /// 每日
+        /// </summary>
+        [Description("每日")]
+        Day = 1,
+        /// <summary>
+        /// 每周
+        /// </summary>
+        [Description("每周")]
+        Week = 2,
+        /// <summary>
+        /// 每月
+        /// </summary>
+        [Description("每月")]
+        Month =3,
+        /// <summary>
+        /// 每年
+        /// </summary>
+        [Description("每年")]
+        Year = 4,
+    }
+}

+ 30 - 0
src/Hotline.Share/Enums/Early/EOrderPushStatus.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Early
+{
+    public enum EOrderPushStatus
+    {
+        /// <summary>
+        /// 未推送
+        /// </summary>
+        [Description("未推送")]
+        NoPush = 0,
+
+        /// <summary>
+        /// 办理中已推送
+        /// </summary>
+        [Description("办理中已推送")]
+        ProcessingPush = 1,
+
+        /// <summary>
+        /// 办理完成已推送
+        /// </summary>
+        [Description("办理完成已推送")]
+        FiledPush = 2,
+    }
+}

+ 24 - 0
src/Hotline.Share/Enums/Early/EPushStatus.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Early
+{
+    public enum EPushStatus
+    {
+        /// <summary>
+        /// 草稿
+        /// </summary>
+        [Description("草稿")]
+        Draft = 0,
+
+        /// <summary>
+        /// 已推送
+        /// </summary>
+        [Description("已推送")]
+        Pushed = 1,
+    }
+}

+ 46 - 0
src/Hotline/Early/EarlyWarningOrder.cs

@@ -0,0 +1,46 @@
+using Hotline.Orders;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Early
+{
+    public class EarlyWarningOrder: PositionEntity
+    {
+        /// <summary>
+        /// 预警设置ID
+        /// </summary>
+        public string EarlyWarningSettingId { get; set; }
+
+        /// <summary>
+        /// 预警设置
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(EarlyWarningSettingId))]
+        public EarlyWarningSetting EarlyWarningSetting { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 最后预警时间
+        /// </summary>
+        public DateTime LastEarlyTime { get; set; }
+        
+        /// <summary>
+        /// 预警明细
+        /// </summary>
+        [Navigate(NavigateType.OneToMany, nameof(EarlyWarningOrderDetail.EarlyWarningOrderId))]
+        public List<EarlyWarningOrderDetail> EarlyWarningOrderDetails { get; set; }
+    }
+}

+ 52 - 0
src/Hotline/Early/EarlyWarningOrderDetail.cs

@@ -0,0 +1,52 @@
+using Hotline.Orders;
+using Hotline.Share.Enums.Early;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Early
+{
+    public class EarlyWarningOrderDetail:CreationEntity
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        public Order Order { get; set; }
+
+        /// <summary>
+        /// 工单内容快照
+        /// </summary>
+        public string OrderContent { get; set; }
+
+        /// <summary>
+        /// 工单标题快照
+        /// </summary>
+        public string OrderTitle { get; set; }
+
+        /// <summary>
+        /// 敏感标签
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "敏感标签")]
+        public List<string>? Sensitive { get; set; }
+
+        /// <summary>
+        /// 工单推送状态
+        /// </summary>
+        public EOrderPushStatus OrderPushStatus { get; set; }
+
+        /// <summary>
+        /// 预警ID
+        /// </summary>
+        public string EarlyWarningOrderId { get; set; }
+    }
+}

+ 63 - 0
src/Hotline/Early/EarlyWarningPush.cs

@@ -0,0 +1,63 @@
+using Hotline.Share.Enums.Early;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Early
+{
+    public class EarlyWarningPush:CreationEntity
+    {
+        /// <summary>
+        /// 推送报告名称
+        /// </summary>
+        public string EarlyWarningPushName { get; set; }
+
+        /// <summary>
+        /// 推送部门
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "推送部门")]
+        public List<PushOrg> PushOrgs { get; set; }
+
+        /// <summary>
+        /// 报告状态
+        /// </summary>
+        public EPushStatus PushStatus { get; set; }
+
+        /// <summary>
+        /// 办理中数量(推送后)
+        /// </summary>
+        public int? ProcessingCount { get; set; }
+
+        /// <summary>
+        /// 办理完成数量(推送后)
+        /// </summary>
+        public int? FiledCount { get; set; }
+
+        /// <summary>
+        /// 推送时间
+        /// </summary>
+        public DateTime? PushTime { get; set; }
+
+        /// <summary>
+        /// 推送报告下载地址
+        /// </summary>
+        public string? PushReportUrl { get; set; }
+
+        /// <summary>
+        /// 明细
+        /// </summary>
+        [Navigate(NavigateType.OneToMany, nameof(EarlyWarningPushDetail.EarlyWarningPushId))]
+        public List<EarlyWarningPushDetail> EarlyWarningPushDetails { get; set; }
+    }
+
+    public class PushOrg
+    {
+        public string OrgCode { get; set; }
+
+        public string OrgName { get; set; }
+    }
+}

+ 29 - 0
src/Hotline/Early/EarlyWarningPushDetail.cs

@@ -0,0 +1,29 @@
+using Hotline.Orders;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Early
+{
+    public class EarlyWarningPushDetail:CreationEntity
+    {
+        public string EarlyWarningPushId { get; set; }
+
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 是否生成word
+        /// </summary>
+        public bool IsSendWord { get; set; }
+
+        /// <summary>
+        /// 工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(OrderId))]
+        public Order Order { get; set; }
+    }
+}

+ 72 - 0
src/Hotline/Early/EarlyWarningSetting.cs

@@ -0,0 +1,72 @@
+using Hotline.Share.Enums.Early;
+using XF.Domain.Repository;
+
+namespace Hotline.Early
+{
+    public class EarlyWarningSetting: FullStateEntity
+    {
+        /// <summary>
+        /// 预警名称
+        /// </summary>
+        public string EarlyWarningName { get; set; }
+
+        /// <summary>
+        /// 预警级别值
+        /// </summary>
+        public string EarlyWarningLevelValue { get; set; }
+
+        /// <summary>
+        /// 预警级别名称
+        /// </summary>
+        public string EarlyWarningLevelName { get; set; }
+
+        /// <summary>
+        /// 预警类型值
+        /// </summary>
+        public string EarlyWarningTypeValue { get; set; }
+
+        /// <summary>
+        /// 预警类型名称
+        /// </summary>
+        public string EarlyWarningTypeName { get; set; }
+
+        /// <summary>
+        /// 是否启用
+        /// </summary>
+        public bool IsEnable { get; set; }
+
+        /// <summary>
+        /// 预警原因
+        /// </summary>
+        public string EarlyWarningRemark { get; set; }
+
+        /// <summary>
+        /// 预警规则
+        /// </summary>
+        
+        public List<EarlyWarningRule> EarlyWarningRules { get; set; }
+
+        /// <summary>
+        /// 频率
+        /// </summary>
+        public EFrequency Frequency { get; set; }
+    }
+
+    public class EarlyWarningRule
+    {
+        /// <summary>
+        /// 敏感词
+        /// </summary>
+        public string SensitiveWord { get; set; }
+
+        /// <summary>
+        /// 比较方式
+        /// </summary>
+        public ECompareType CompareType { get; set; }
+
+        /// <summary>
+        /// 次数
+        /// </summary>
+        public int Times { get; set; }
+    }
+}

+ 60 - 0
src/Hotline/Early/OrderEarlyWarning.cs

@@ -0,0 +1,60 @@
+using XF.Domain.Repository;
+
+namespace Hotline.Early
+{
+    public class OrderEarlyWarning:CreationEntity
+    {
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 坐席预警级别值
+        /// </summary>
+        public string SeatEarlyWarningLevelValue { get; set; }
+
+        /// <summary>
+        /// 坐席预警级别名称
+        /// </summary>
+        public string SeatEarlyWarningLevelName { get; set; }
+
+        /// <summary>
+        /// 坐席预警类型值
+        /// </summary>
+        public string SeatEarlyWarningTypeValue { get; set; }
+
+        /// <summary>
+        /// 坐席预警类型名称
+        /// </summary>
+        public string SeatEarlyWarningTypeName { get; set; }
+
+
+        /// <summary>
+        /// 派单预警级别值
+        /// </summary>
+        public string DispatchEarlyWarningLevelValue { get; set; }
+
+        /// <summary>
+        /// 派单预警级别名称
+        /// </summary>
+        public string DispatchEarlyWarningLevelName { get; set; }
+
+        /// <summary>
+        /// 派单预警类型值
+        /// </summary>
+        public string DispatchEarlyWarningTypeValue { get; set; }
+
+        /// <summary>
+        /// 派单预警类型名称
+        /// </summary>
+        public string DispatchEarlyWarningTypeName { get; set; }
+
+        /// <summary>
+        /// 派单选择预警
+        /// </summary>
+        public List<EarlyWarningSetting> DispatchEarlyWarning { get; set; }
+
+        /// <summary>
+        /// 可选择预警设置
+        /// </summary>
+        public List<EarlyWarningSetting> CanChooseEarlyWarning { get; set; }
+    }
+}

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

@@ -316,4 +316,14 @@ public class SysDicTypeConsts
     /// 随手拍特殊红包审核类型
     /// </summary>
     public static string SnapshotRedPackSpecialType = "SnapshotRedPackSpecialType";
+
+    /// <summary>
+    /// 预警级别
+    /// </summary>
+    public static string EarlyWarningLevel = "EarlyWarningLevel";
+
+    /// <summary>
+    /// 预警类型
+    /// </summary>
+    public static string EarlyWarningType = "EarlyWarningType";
 }

+ 5 - 0
src/XF.Domain.Repository/Entity.cs

@@ -292,6 +292,11 @@ public abstract class PositionEntity : FullStateEntity
     /// </summary>
     public string? Town { get; set; }
 
+    /// <summary>
+    /// 村/社区
+    /// </summary>
+    public string? Village { get; set; }
+
     /// <summary>
     /// 详细街道
     /// </summary>