Explorar el Código

Merge branch 'dev' of http://git.12345lm.cn/Fengwo/hotline into dev

Dun.Jason hace 9 meses
padre
commit
4b78dbf1b0
Se han modificado 22 ficheros con 1829 adiciones y 277 borrados
  1. 68 68
      src/Hotline.Api/Controllers/EnforcementOrderController.cs
  2. 788 0
      src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs
  3. 51 29
      src/Hotline.Api/Controllers/OrderController.cs
  4. 1 1
      src/Hotline.Api/Controllers/OrderProvinceZmhdController.cs
  5. 2 2
      src/Hotline.Api/config/appsettings.Development.json
  6. 2 2
      src/Hotline.Api/config/appsettings.json
  7. 65 28
      src/Hotline.Application/JudicialManagement/EnforcementApplication.cs
  8. 1 1
      src/Hotline.Application/Mappers/CallMapperConfigs.cs
  9. 39 39
      src/Hotline.Application/Mappers/MapperConfigs.cs
  10. 16 0
      src/Hotline.Application/Orders/IOrderSendBackAuditApplication.cs
  11. 6 4
      src/Hotline.Application/Orders/OrderApplication.cs
  12. 43 0
      src/Hotline.Application/Orders/OrderSendBackAuditApplication.cs
  13. 2 2
      src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs
  14. 19 8
      src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs
  15. 38 93
      src/Hotline.Share/Dtos/JudicialManagement/EnforcementOrderListDto.cs
  16. 186 0
      src/Hotline.Share/Dtos/JudicialManagement/JudicialManagementAddOrderDto.cs
  17. 81 0
      src/Hotline.Share/Dtos/JudicialManagement/QueryEnforcementOrderDto.cs
  18. 15 0
      src/Hotline.Share/Enums/JudicialManagement/EOrderSoure.cs
  19. 33 0
      src/Hotline/JudicialManagement/EnforcementOrdersHandler.cs
  20. 13 0
      src/Hotline/JudicialManagement/IJudicialManagementOrdersService.cs
  21. 255 0
      src/Hotline/JudicialManagement/JudicialManagementOrders.cs
  22. 105 0
      src/Hotline/JudicialManagement/JudicialManagementOrdersService.cs

+ 68 - 68
src/Hotline.Api/Controllers/EnforcementOrderController.cs

@@ -638,74 +638,74 @@ namespace Hotline.Api.Controllers
             return new { DataList = list, SumModel = sumModel };
         }
 
-        /// <summary>
-        /// 部门满意度统计---明细
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("enforcement_visit_org_satisfaction_statistics_order_list")]
-        public async Task<PagedDto<EnforcementOrgSatisfactionOrderListDto>> GetVisitAndOrgSatisfactionStatisticsOrderListAsync([FromQuery] QueryOrgSatisfactionStatisticsDto dto)
-        {
-            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
-
-            var (total, items) = await _enforcementOrdersRepository.Queryable()
-                .Includes(x => x.Order)
-                .Where(x => x.Order.Id != null)
-                .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
-                .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
-                .Where((x, o, p) => o.VisitTime >= dto.StartTime && o.VisitTime <= dto.EndTime && p.VisitTarget == EVisitTarget.Org)
-                .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", (x, o, p) => p.VisitOrgCode == dto.OrgCode)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", (x, o, p) => p.VisitOrgCode.StartsWith(dto.OrgCode))
-                 .WhereIF(dto.TypeId == 1, (x, o, p) => SqlFunc.JsonField(p.OrgProcessingResults, "Key") == dto.DateValue)
-                .WhereIF(dto.TypeId == 2, (x, o, p) => SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == dto.DateValue)
-                .Select((x, o, p) => new EnforcementOrgSatisfactionOrderListDto
-                {
-                    Id = x.Id,
-                    WorkflowId = x.Order.WorkflowId,
-                    VisitId = o.Id,
-                    Status = x.Order.Status,
-                    No = x.Order.No,
-                    SourceChannel = x.Order.SourceChannel,
-                    SourceChannelCode = x.Order.SourceChannelCode,
-                    FromPhone = x.Order.FromPhone,
-                    TransferPhone = x.Order.TransferPhone,
-                    FromName = x.Order.FromName,
-                    Contact = x.Order.Contact,
-                    AcceptType = x.Order.AcceptType,
-                    AcceptTypeCode = x.Order.AcceptTypeCode,
-                    EmergencyLevel = x.Order.EmergencyLevel,
-                    Title = x.Order.Title,
-                    HotspotId = x.Order.HotspotId,
-                    HotspotName = x.Order.HotspotName,
-                    HotspotSpliceName = x.Order.HotspotSpliceName,
-                    CreationTime = x.Order.CreationTime,
-                    IsProvince = x.Order.IsProvince,
-                    ProvinceNo = x.Order.ProvinceNo,
-                    ActualHandleStepName = x.Order.ActualHandleStepName,
-                    ActualHandleTime = x.Order.ActualHandleTime,
-                    ExpiredTime = x.Order.ExpiredTime,
-                    NearlyExpiredTime = x.Order.NearlyExpiredTime,
-                    FiledTime = x.Order.FiledTime,
-                    OrgLevelOneCode = x.Order.OrgLevelOneCode,
-                    OrgLevelOneName = x.Order.OrgLevelOneName,
-                    ActualHandlerName = x.Order.ActualHandlerName,
-                    StartTime = x.Order.StartTime,
-                    ActualHandleOrgName = x.Order.ActualHandleOrgName,
-                    ActualHandleOrgCode = x.Order.ActualHandleOrgCode,
-                    IsEnforcementOrder = x.IsEnforcementOrder,
-                    IsPassTheBuckOrder = x.IsPassTheBuckOrder,
-                    IsTheClueTrue = x.IsTheClueTrue,
-                    EventTypeName = x.EventTypeName,
-                    EventTypeId = x.EventTypeId,
-                    EventTypeSpliceName = x.EventTypeSpliceName,
-                })
-               .MergeTable()
-               .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
-
-            return new PagedDto<EnforcementOrgSatisfactionOrderListDto>(total, _mapper.Map<IReadOnlyList<EnforcementOrgSatisfactionOrderListDto>>(items));
-
-        }
+        ///// <summary>
+        ///// 部门满意度统计---明细
+        ///// </summary>
+        ///// <param name="dto"></param>
+        ///// <returns></returns>
+        //[HttpGet("enforcement_visit_org_satisfaction_statistics_order_list")]
+        //public async Task<PagedDto<EnforcementOrgSatisfactionOrderListDto>> GetVisitAndOrgSatisfactionStatisticsOrderListAsync([FromQuery] QueryOrgSatisfactionStatisticsDto dto)
+        //{
+        //    dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+        //    var (total, items) = await _enforcementOrdersRepository.Queryable()
+        //        .Includes(x => x.Order)
+        //        .Where(x => x.Order.Id != null)
+        //        .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
+        //        .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
+        //        .Where((x, o, p) => o.VisitTime >= dto.StartTime && o.VisitTime <= dto.EndTime && p.VisitTarget == EVisitTarget.Org)
+        //        .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
+        //        .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", (x, o, p) => p.VisitOrgCode == dto.OrgCode)
+        //        .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", (x, o, p) => p.VisitOrgCode.StartsWith(dto.OrgCode))
+        //         .WhereIF(dto.TypeId == 1, (x, o, p) => SqlFunc.JsonField(p.OrgProcessingResults, "Key") == dto.DateValue)
+        //        .WhereIF(dto.TypeId == 2, (x, o, p) => SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == dto.DateValue)
+        //        .Select((x, o, p) => new EnforcementOrgSatisfactionOrderListDto
+        //        {
+        //            Id = x.Id,
+        //            WorkflowId = x.Order.WorkflowId,
+        //            VisitId = o.Id,
+        //            Status = x.Order.Status,
+        //            No = x.Order.No,
+        //            SourceChannel = x.Order.SourceChannel,
+        //            SourceChannelCode = x.Order.SourceChannelCode,
+        //            FromPhone = x.Order.FromPhone,
+        //            TransferPhone = x.Order.TransferPhone,
+        //            FromName = x.Order.FromName,
+        //            Contact = x.Order.Contact,
+        //            AcceptType = x.Order.AcceptType,
+        //            AcceptTypeCode = x.Order.AcceptTypeCode,
+        //            EmergencyLevel = x.Order.EmergencyLevel,
+        //            Title = x.Order.Title,
+        //            HotspotId = x.Order.HotspotId,
+        //            HotspotName = x.Order.HotspotName,
+        //            HotspotSpliceName = x.Order.HotspotSpliceName,
+        //            CreationTime = x.Order.CreationTime,
+        //            IsProvince = x.Order.IsProvince,
+        //            ProvinceNo = x.Order.ProvinceNo,
+        //            ActualHandleStepName = x.Order.ActualHandleStepName,
+        //            ActualHandleTime = x.Order.ActualHandleTime,
+        //            ExpiredTime = x.Order.ExpiredTime,
+        //            NearlyExpiredTime = x.Order.NearlyExpiredTime,
+        //            FiledTime = x.Order.FiledTime,
+        //            OrgLevelOneCode = x.Order.OrgLevelOneCode,
+        //            OrgLevelOneName = x.Order.OrgLevelOneName,
+        //            ActualHandlerName = x.Order.ActualHandlerName,
+        //            StartTime = x.Order.StartTime,
+        //            ActualHandleOrgName = x.Order.ActualHandleOrgName,
+        //            ActualHandleOrgCode = x.Order.ActualHandleOrgCode,
+        //            IsEnforcementOrder = x.IsEnforcementOrder,
+        //            IsPassTheBuckOrder = x.IsPassTheBuckOrder,
+        //            IsTheClueTrue = x.IsTheClueTrue,
+        //            EventTypeName = x.EventTypeName,
+        //            EventTypeId = x.EventTypeId,
+        //            EventTypeSpliceName = x.EventTypeSpliceName,
+        //        })
+        //       .MergeTable()
+        //       .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+        //    return new PagedDto<EnforcementOrgSatisfactionOrderListDto>(total, _mapper.Map<IReadOnlyList<EnforcementOrgSatisfactionOrderListDto>>(items));
+
+        //}
 
         /// <summary>
         /// 处理司法历史工单数据

+ 788 - 0
src/Hotline.Api/Controllers/JudicialManagementOrdersController.cs

@@ -0,0 +1,788 @@
+using Hotline.Api.Filter;
+using Hotline.Caching.Interfaces;
+using Hotline.File;
+using Hotline.JudicialManagement;
+using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Settings;
+using Hotline.Settings.TimeLimits;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.JudicialManagement;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.JudicialManagement;
+using Hotline.Share.Enums.Order;
+using MapsterMapper;
+using Microsoft.AspNetCore.Mvc;
+using SqlSugar;
+using XF.Domain.Authentications;
+using XF.Domain.Exceptions;
+using XF.Domain.Repository;
+
+namespace Hotline.Api.Controllers
+{
+    public class JudicialManagementOrdersController : BaseController
+    {
+        private readonly IRepository<JudicialComplaintsEventType> _judicialComplaintsEventTypeRepository;
+        private readonly IRepository<EnforcementHotspot> _enforcementHotspotRepository;
+        private readonly IMapper _mapper;
+        private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
+        private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
+        private readonly ISessionContext _sessionContext;
+        private readonly IRepository<SystemArea> _systemAreaRepository;
+        private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
+        private readonly IFileRepository _fileRepository;
+        private readonly IJudicialManagementOrdersService _judicialManagementOrdersService;
+        private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="judicialComplaintsEventTypeRepository"></param>
+        /// <param name="enforcementHotspotRepository"></param>
+        /// <param name="mapper"></param>
+        /// <param name="sysDicDataCacheManager"></param>
+        /// <param name="systemOrganizeRepository"></param>
+        /// <param name="sessionContext"></param>
+        /// <param name="systemAreaRepository"></param>
+        /// <param name="judicialManagementOrdersRepository"></param>
+        /// <param name="fileRepository"></param>
+        /// <param name="judicialManagementOrdersService"></param>
+        /// <param name="enforcementOrdersHandlerRepository"></param>
+        public JudicialManagementOrdersController(
+         IRepository<JudicialComplaintsEventType> judicialComplaintsEventTypeRepository,
+         IRepository<EnforcementHotspot> enforcementHotspotRepository,
+         IMapper mapper,
+         ISystemDicDataCacheManager sysDicDataCacheManager,
+         IRepository<SystemOrganize> systemOrganizeRepository,
+         ISessionContext sessionContext,
+         IRepository<SystemArea> systemAreaRepository,
+         IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
+          IFileRepository fileRepository,
+          IJudicialManagementOrdersService judicialManagementOrdersService,
+           IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
+         )
+        {
+            _judicialComplaintsEventTypeRepository = judicialComplaintsEventTypeRepository;
+            _enforcementHotspotRepository = enforcementHotspotRepository;
+            _mapper = mapper;
+            _sysDicDataCacheManager = sysDicDataCacheManager;
+            _systemOrganizeRepository = systemOrganizeRepository;
+            _sessionContext = sessionContext;
+            _systemAreaRepository = systemAreaRepository;
+            _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
+            _fileRepository = fileRepository;
+            _judicialManagementOrdersService = judicialManagementOrdersService;
+            _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
+        }
+
+        /// <summary>
+        /// 新增工单
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [LogFilter("新增司法工单")]
+        public async Task<string> Add([FromBody] JudicialManagementAddOrderDto dto)
+        {
+            dto.InitAddress();
+            var order = _mapper.Map<JudicialManagementOrders>(dto);
+            order.InitId();
+            if (dto.Files.Any())
+                order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", HttpContext.RequestAborted);
+            await _judicialManagementOrdersService.AddAsync(order, true, HttpContext.RequestAborted);
+            //处理执法部门
+            if (dto.EnforcementOrdersHandler != null && dto.EnforcementOrdersHandler.Any())
+            {
+                List<EnforcementOrdersHandler> enforcementOrdersHandlers = new();
+                foreach (var item in dto.EnforcementOrdersHandler)
+                {
+                    enforcementOrdersHandlers.Add(new EnforcementOrdersHandler
+                    {
+                        OrderId = order.Id,
+                        OrderNo = order.No,
+                        OrderSoure = EOrderSoure.Enforcement,
+                        OrgCode = item.Value,
+                        OrgName = item.Key
+                    });
+                }
+                if (enforcementOrdersHandlers != null && enforcementOrdersHandlers.Any())
+                    await _enforcementOrdersHandlerRepository.AddRangeAsync(enforcementOrdersHandlers, HttpContext.RequestAborted);
+            }
+            return order.Id;
+        }
+
+        /// <summary>
+        /// 更新工单信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut]
+        [LogFilter("更新司法工单")]
+        public async Task Update([FromBody] JudicialManagementUpdateOrderDto dto)
+        {
+            dto.InitAddress();
+            var order = await _judicialManagementOrdersRepository.Queryable().FirstAsync(d => d.Id == dto.Id);
+            if (order == null)
+                throw UserFriendlyException.SameMessage("无效工单编号");
+
+            _mapper.Map(dto, order);
+            if (dto.Files.Any())
+                order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", HttpContext.RequestAborted);
+            await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
+
+            //处理执法部门
+            if (dto.EnforcementOrdersHandler != null && dto.EnforcementOrdersHandler.Any())
+            {
+                List<EnforcementOrdersHandler> enforcementOrdersHandlers = new();
+                foreach (var item in dto.EnforcementOrdersHandler)
+                {
+                    enforcementOrdersHandlers.Add(new EnforcementOrdersHandler
+                    {
+                        OrderId = order.Id,
+                        OrderNo = order.No,
+                        OrderSoure = EOrderSoure.Enforcement,
+                        OrgCode = item.Value,
+                        OrgName = item.Key
+                    });
+                    if (enforcementOrdersHandlers != null && enforcementOrdersHandlers.Any())
+                    {
+                        await _enforcementOrdersHandlerRepository.RemoveAsync(p => p.OrderId == order.Id, false, HttpContext.RequestAborted);
+                        await _enforcementOrdersHandlerRepository.AddRangeAsync(enforcementOrdersHandlers, HttpContext.RequestAborted);
+                    }
+
+                }
+            }
+        }
+
+        /// <summary>
+        /// 受理工单
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("getownorderlist")]
+        public async Task<PagedDto<EnforcementOrderListDto>> GetOwnOrderList([FromQuery] QueryEnforcementOrderNewDto dto)
+        {
+            var (total, items) = await _judicialManagementOrdersRepository.Queryable()
+                .Where(d => d.CreatorId == _sessionContext.UserId)
+                  .WhereIF(dto.IsEnforcementOrder.HasValue, d => d.IsEnforcementOrder == dto.IsEnforcementOrder)//是否行政执法类
+                  .WhereIF(dto.IsPassTheBuckOrder.HasValue, d => d.IsPassTheBuckOrder == dto.IsPassTheBuckOrder)//是否推诿
+                   .WhereIF(dto.IsTheClueTrue.HasValue, d => d.IsTheClueTrue == dto.IsTheClueTrue)//线索是否属实
+                   .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => dto.EventTypeId == d.EventTypeId)//事项分类
+                   .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!)) //标题
+                   .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
+                   .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
+                   .WhereIF(!string.IsNullOrEmpty(dto.ChannelCode), d => d.SourceChannelCode == dto.ChannelCode) //来源渠道
+                    .WhereIF(!string.IsNullOrEmpty(dto.HotspotId), d => d.TransferPhone == dto.HotspotId) //热点类型
+                    .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
+                    .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
+                   .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+                     .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
+                     .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode) //区域
+                     .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => SqlFunc.JsonListObjectAny(d.EnforcementOrdersHandler, "Value", dto.OrgCode))//执法部门
+                     .OrderByDescending(d => d.CreationTime)
+                     .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            var data = _mapper.Map<List<EnforcementOrderListDto>>(items);
+
+            if (_sessionContext.RequiredOrgId == "001188")
+            {
+                foreach (var item in data)
+                {
+                    if (item.IsTheClueTrue.HasValue)
+                        item.IsShowUpdateButton = true;
+                }
+            }
+            return new PagedDto<EnforcementOrderListDto>(total, data);
+        }
+
+        /// <summary>
+        /// 启用/禁用
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task Update(string id)
+        {
+            var order = await _judicialManagementOrdersRepository.GetAsync(id, HttpContext.RequestAborted);
+            if (order == null)
+                throw UserFriendlyException.SameMessage("工单查询失败");
+            if (order.IsItCounted)
+                order.IsItCounted = false;
+            else
+                order.IsItCounted = true;
+            await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 查询工单详情
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("{id}")]
+        public async Task<JudicialManagementOrderDto> Get(string id)
+        {
+            var order = await _judicialManagementOrdersRepository.Queryable().FirstAsync(d => d.Id == id);
+            if (order == null)
+                return new();
+            var dto = _mapper.Map<JudicialManagementOrderDto>(order);
+
+            if (dto.FileJson != null && dto.FileJson.Any())
+            {
+                var ids = order.FileJson.Select(x => x.Id).ToList();
+                var files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+                dto.Files = files.Where(x => string.IsNullOrEmpty(x.FlowKey)).ToList();
+            }
+            return dto;
+        }
+
+        /// <summary>
+        /// 删除工单
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete("{id}")]
+        [LogFilter("删除工单")]
+        public async Task Remove(string id)
+        {
+            var order = await _judicialManagementOrdersRepository.GetAsync(id, HttpContext.RequestAborted);
+            if (order == null) return;
+            //if (order.Status != EOrderStatus.WaitForAccept)
+            //    throw UserFriendlyException.SameMessage("非草稿工单不可删除");
+            await _judicialManagementOrdersRepository.RemoveAsync(order);
+        }
+
+        /// <summary>
+        /// 司法行政监督管理工单查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("getorderlist")]
+        public async Task<PagedDto<EnforcementOrderListDto>> GetOrderList([FromQuery] QueryEnforcementOrderNewDto dto)
+        {
+            var areaCode = _sessionContext.OrgAreaCode ?? "511500";
+
+            var (total, items) = await _judicialManagementOrdersRepository.Queryable()
+                  .WhereIF(areaCode != "511500", d => d.AreaCode.StartsWith(areaCode))
+                  .WhereIF(dto.IsEnforcementOrder.HasValue, d => d.IsEnforcementOrder == dto.IsEnforcementOrder)//是否行政执法类
+                  .WhereIF(dto.IsPassTheBuckOrder.HasValue, d => d.IsPassTheBuckOrder == dto.IsPassTheBuckOrder)//是否推诿
+                   .WhereIF(dto.IsTheClueTrue.HasValue, d => d.IsTheClueTrue == dto.IsTheClueTrue)//线索是否属实
+                   .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => dto.EventTypeId == d.EventTypeId)//事项分类
+                   .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!)) //标题
+                   .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
+                   .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
+                   .WhereIF(!string.IsNullOrEmpty(dto.ChannelCode), d => d.SourceChannelCode == dto.ChannelCode) //来源渠道
+                    .WhereIF(!string.IsNullOrEmpty(dto.HotspotId), d => d.TransferPhone == dto.HotspotId) //热点类型
+                    .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
+                    .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
+                   .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+                     .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
+                     .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode) //区域
+                     .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => SqlFunc.JsonListObjectAny(d.EnforcementOrdersHandler, "Value", dto.OrgCode))//执法部门
+                     .OrderByDescending(d => d.CreationTime)
+                     .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            var data = _mapper.Map<List<EnforcementOrderListDto>>(items);
+
+            if (_sessionContext.RequiredOrgId == "001188")
+            {
+                foreach (var item in data)
+                {
+                    if (item.IsTheClueTrue.HasValue)
+                        item.IsShowUpdateButton = true;
+                }
+            }
+            return new PagedDto<EnforcementOrderListDto>(total, data);
+        }
+
+        /// <summary>
+        /// 列表页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("base-data")]
+        public async Task<object> BaseData()
+        {
+            var orgList = await _systemOrganizeRepository.Queryable().OrderBy(d => d.Id).ToTreeAsync(x => x.Children, it => it.ParentId, null);
+            var judicialManagementOrg = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.JudicialManagementOrg);
+
+            List<SystemOrganize> OrgsOptions = new();
+            foreach (var item in judicialManagementOrg)
+            {
+                var tempOrg = orgList.Find(p => p.Id == item.DicDataValue);
+                if (tempOrg != null)
+                    OrgsOptions.Add(tempOrg);
+            }
+            var listChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel).ToList();
+            var ChannelOptions = new List<Kv>();
+            foreach (var item in listChannelOptions)
+            {
+                ChannelOptions.Add(new Kv { Key = item.DicDataName, Value = item.DicDataValue });
+            }
+            ChannelOptions.Add(new Kv { Key = "自定义", Value = "ZDY" });
+            var listAcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType).ToList();
+            var AcceptTypeOptions = new List<Kv>();
+            foreach (var item in listAcceptTypeOptions)
+            {
+                AcceptTypeOptions.Add(new Kv { Key = item.DicDataName, Value = item.DicDataValue });
+            }
+            var rsp = new
+            {
+                AcceptTypeOptions,
+                ChannelOptions,
+                OrgsOptions,
+                EnforcementHotspot = await _enforcementHotspotRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id)
+            };
+            return rsp;
+        }
+
+        /// <summary>
+        /// 获取省市区树形
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("area/tree")]
+        public async Task<List<SystemArea>> GetAreaTree()
+        {
+            var areaCode = _sessionContext.OrgAreaCode;
+            if (string.IsNullOrEmpty(areaCode))
+                areaCode = "511500";
+            if (areaCode == "511500")
+            {
+                return await _systemAreaRepository.Queryable().OrderBy(x => x.Id).ToTreeAsync(x => x.Children, q => q.ParentId, "510000");
+            }
+            else
+            {
+                string parentId = "510000";
+                var data = await _systemAreaRepository.GetAsync(p => p.Id == areaCode);
+                if (data != null)
+                    parentId = data.ParentId;
+                return await _systemAreaRepository.Queryable().Where(p => p.Id.StartsWith(areaCode)).OrderBy(x => x.Id).ToTreeAsync(x => x.Children, q => q.ParentId, parentId);
+            }
+        }
+
+        /// <summary>
+        /// 线索核实  
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("clue_verification")]
+        public async Task ClueVerificationAsync([FromBody] ClueVerificationDto dto)
+        {
+            if (dto.OrderIds == null || dto.OrderIds.Count == 0)
+                throw UserFriendlyException.SameMessage("工单不能为空");
+
+            if (dto.IsTheClueTrue.HasValue && dto.IsTheClueTrue.Value == true)
+            {
+                if (string.IsNullOrEmpty(dto.EventTypeId) || string.IsNullOrEmpty(dto.EventTypeName))
+                    throw UserFriendlyException.SameMessage("事项不能为空");
+            }
+
+            foreach (var item in dto.OrderIds)
+            {
+                var order = await _judicialManagementOrdersRepository.GetAsync(p => p.Id == item, HttpContext.RequestAborted);
+                if (order == null)
+                    throw UserFriendlyException.SameMessage("工单查询失败");
+
+                order.IsTheClueTrue = dto.IsTheClueTrue;
+
+                if (!string.IsNullOrEmpty(dto.EventTypeName))
+                    order.EventTypeName = dto.EventTypeName;
+                else
+                    order.EventTypeName = "";
+
+                if (!string.IsNullOrEmpty(dto.EventTypeSpliceName))
+                    order.EventTypeSpliceName = dto.EventTypeSpliceName;
+                else
+                    order.EventTypeSpliceName = "";
+
+                if (!string.IsNullOrEmpty(dto.EventTypeId))
+                {
+                    order.EventTypeOneLevelId = dto.EventTypeId.Substring(0, 2);
+                    order.EventTypeId = dto.EventTypeId;
+                }
+                else
+                {
+                    order.EventTypeOneLevelId = "";
+                    order.EventTypeId = "";
+                }
+                if (!order.IsTheClueTrue.HasValue || order.IsTheClueTrue.Value == false)
+                {
+                    order.EventTypeName = "";
+                    order.EventTypeSpliceName = "";
+                    order.EventTypeOneLevelId = "";
+                    order.EventTypeId = "";
+                }
+                await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
+            }
+        }
+
+        /// <summary>
+        /// 行政执法活动投诉事项类型- 获取层级分类
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("treelist")]
+        public async Task<List<JudicialComplaintsEventType>> GetTreeList()
+        {
+            return await _judicialComplaintsEventTypeRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id);
+        }
+
+        /// <summary>
+        /// 事项分类统计
+        /// </summary>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="Id"></param>
+        /// <param name="AreaCode"></param>
+        /// <returns></returns>
+        [HttpGet("event_classification_statistics")]
+        public async Task<object> GetEventClassificationStatisticsAsync(DateTime StartTime, DateTime EndTime, string Id, string AreaCode)
+        {
+
+            var items = await _judicialComplaintsEventTypeRepository.Queryable()
+             .LeftJoin<JudicialManagementOrders>((x, o) => o.EventTypeSpliceName != null && (x.EventTypeName == o.EventTypeSpliceName || o.EventTypeSpliceName.Contains(x.EventTypeName)))
+            .Where((x, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
+            .WhereIF(!string.IsNullOrEmpty(AreaCode), (x, o) => o.AreaCode.StartsWith(AreaCode))
+             .Where((x, o) => x.ParentId == Id)
+             .GroupBy((x, o) => new { x.Id, x.EventTypeName })
+             .Select((x, o) => new
+             {
+                 Id = x.Id,
+                 Name = x.EventTypeName,
+                 Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+                 Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.EventTypeName != o.EventTypeName, 1, 0)) > 0,
+             })
+             .MergeTable()
+             .ToListAsync();
+
+            var data = await _judicialManagementOrdersRepository.Queryable()
+                .Where(d => d.CreationTime >= StartTime && d.CreationTime <= EndTime)
+                .GroupBy(d => d.Id)
+                 .Select(d => new EventClassificationOrderCountDto
+                 {
+                     TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
+                     TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
+                     EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
+                     PassTheBuckOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0))
+                 })
+                   .ToListAsync();
+
+            var orderCount = new
+            {
+                TheClueIsTrue = data.Sum(x => x.TheClueIsTrue),
+                TheClueIsNotTrue = data.Sum(x => x.TheClueIsNotTrue),
+                EnforcementOrder = data.Sum(x => x.EnforcementOrder),
+                PassTheBuckOrder = data.Sum(x => x.PassTheBuckOrder),
+            };
+
+            return new { List = items, OrderCount = orderCount };
+        }
+
+        /// <summary>
+        /// 事项分类统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("event_classification_statistics_order_list")]
+        public async Task<PagedDto<EnforcementOrderListDto>> GetEventClassificationStatisticsOrderListAsync([FromQuery] QueryEventClassificationStatisticsDto dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+            var (total, items) = await _judicialManagementOrdersRepository.Queryable()
+            .Where(d => d.CreationTime >= dto.StartTime && d.CreationTime <= dto.EndTime && d.EventTypeId != null)
+            .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => d.EventTypeId.StartsWith(dto.EventTypeId))
+            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode.StartsWith(dto.AreaCode))
+            .OrderByDescending(d => d.CreationTime)
+           .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
+        }
+
+        /// <summary>
+        /// 执法部门办件统计
+        /// </summary>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <returns></returns>
+        [HttpGet("enforcement_departmental_processing_statistics")]
+        public async Task<object> GetDepartmentalProcessingStatisticsAsync(DateTime StartTime, DateTime EndTime)
+        {
+            var data = await _enforcementOrdersHandlerRepository.Queryable()
+                  .LeftJoin<JudicialManagementOrders>((h, o) => h.OrderId == o.Id)
+                  .Where((x, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
+                   .GroupBy((x, o) => new
+                   {
+                       OrgCode = x.OrgCode,
+                       OrgName = x.OrgName
+                   })
+                   .Select((x, o) => new
+                   {
+                       OrgCode = x.OrgCode,
+                       OrgName = x.OrgName,
+                       CountNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.OrgCode != null, 1, 0)),
+                       TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsTheClueTrue.HasValue && o.IsTheClueTrue.Value == true, 1, 0)),
+                       TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsTheClueTrue.HasValue && o.IsTheClueTrue.Value == false, 1, 0)),
+                       EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsEnforcementOrder.HasValue && o.IsEnforcementOrder.Value == true, 1, 0))
+                   })
+                     .ToListAsync();
+
+            return data;
+        }
+
+        /// <summary>
+        /// 执法部门办件统计---明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("enforcement_departmental_processing_statistics_order_list")]
+        public async Task<PagedDto<EnforcementOrderListDto>> GetDepartmentalProcessingStatisticsOrderListAsync([FromQuery] QueryDepartmentalProcessingStatisticsDto dto)
+        {
+            RefAsync<int> total = 0;
+            var queryData = await _enforcementOrdersHandlerRepository.Queryable()
+                .LeftJoin<JudicialManagementOrders>((h, o) => h.OrderId == o.Id)
+                .Where((x, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Id != null)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", (x, o) => x.OrgCode == dto.OrgCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", (x, o) => x.OrgCode.StartsWith(dto.OrgCode))
+                .WhereIF(dto.TheClueIsTrue == true, (x, o) => o.IsTheClueTrue == true)
+                .WhereIF(dto.TheClueIsNotTrue == true, (x, o) => o.IsTheClueTrue == false)
+                .WhereIF(dto.EnforcementOrder == true, (x, o) => o.IsEnforcementOrder == true)
+                .OrderByDescending((x, o) => o.CreationTime)
+                 .Select((x, o) => new { o })
+                .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+            var dtos = queryData.Select(d =>
+            {
+                var dto = _mapper.Map<EnforcementOrderListDto>(d.o);
+                return dto;
+            }).ToList();
+            return new PagedDto<EnforcementOrderListDto>(total, dtos);
+        }
+
+        /// <summary>
+        /// 区域分类统计
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("regional_classification_statistics")]
+        public async Task<object> GetRegionalClassificationStatisticsAsync(DateTime StartTime, DateTime EndTime)
+        {
+
+            var areaCode = _sessionContext.OrgAreaCode ?? "511500";
+            var list = await _judicialManagementOrdersRepository.Queryable()
+               .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime)
+               .LeftJoin<SystemArea>((x, o) => x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
+               .WhereIF(areaCode != "511500", (x, o) => x.AreaCode.StartsWith(areaCode))
+               .GroupBy((x, o) => new
+               {
+                   AreaCode = x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                   o.AreaName,
+               })
+               .Select((x, o) => new
+               {
+                   AreaCode = x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                   AreaName = o.AreaName,
+                   OrderCountNum = SqlFunc.AggregateCount(x.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+                   TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsTheClueTrue.HasValue && x.IsTheClueTrue.Value == true, 1, 0)),
+                   TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsTheClueTrue.HasValue && x.IsTheClueTrue.Value == false, 1, 0)),
+                   EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsEnforcementOrder.HasValue && x.IsEnforcementOrder.Value == true, 1, 0))
+               }).MergeTable()
+                .Where(x => x.AreaCode != "519800" && x.AreaCode != "519900")
+                .OrderByDescending(it => it.OrderCountNum)
+                .ToListAsync();
+            return list;
+        }
+
+        /// <summary>
+        /// 区域分类统计---明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("regional_classification_statistics_order_list")]
+        public async Task<PagedDto<EnforcementOrderListDto>> GetRegionalClassificationStatisticsOrderListAsync([FromQuery] QueryRegionalClassificationStatisticsDto dto)
+        {
+            var (total, items) = await _judicialManagementOrdersRepository.Queryable()
+            .Where(d => d.CreationTime >= dto.StartTime && d.CreationTime <= dto.EndTime)
+            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode.StartsWith(dto.AreaCode))
+            .WhereIF(dto.TheClueIsTrue == true, d => d.IsTheClueTrue == true)
+            .WhereIF(dto.TheClueIsNotTrue == true, d => d.IsTheClueTrue == false)
+            .WhereIF(dto.EnforcementOrder == true, d => d.IsEnforcementOrder == true)
+              .OrderByDescending(d => d.CreationTime)
+           .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
+        }
+
+        /// <summary>
+        /// 部门满意度统计
+        /// </summary>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="TypeId">1:办件结果 2:办件态度</param>
+        /// <returns></returns>
+        [HttpGet("enforcement_visit_org_satisfaction_statistics")]
+        public async Task<object> GetVisitAndOrgSatisfactionStatisticsAsync(DateTime StartTime, DateTime EndTime, int TypeId)
+        {
+            EndTime = EndTime.AddDays(1).AddSeconds(-1);
+
+            var list = await _judicialManagementOrdersRepository.Queryable()
+                 .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
+                 .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
+                .Where((x, o, p) => o.VisitTime >= StartTime && o.VisitTime <= EndTime && p.VisitTarget == EVisitTarget.Org
+                && o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode) && x.OrderSoure == EOrderSoure.Hotline)
+                .GroupBy((x, o, p) => new
+                {
+                    VisitOrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+                })
+                .Select((x, o, p) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                    TotalSumCount = SqlFunc.AggregateCount(p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+                    VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+                    SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                    RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+                    DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+                    NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+                    NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+                    NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+                })
+                .MergeTable()
+                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgName = o.Name,
+                    OrgCode = it.OrgCode,
+                    OrgType = o.OrgType,
+                    TotalSumCount = it.TotalSumCount,
+                    VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+                    SatisfiedCount = it.SatisfiedCount, //满意数
+                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+                    DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+                    NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+                    NoEvaluateCount = it.NoEvaluateCount,//未做评价
+                    NoPutThroughCount = it.NoPutThroughCount,//未接通
+                })
+                .ToListAsync();
+
+
+            var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
+            {
+                OrgName = "总计",
+                TotalSumCount = list.Sum(x => x.TotalSumCount),
+                VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
+                SatisfiedCount = list.Sum(x => x.SatisfiedCount),
+                RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
+                DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
+                NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
+                NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
+                NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
+            };
+
+
+            return new { DataList = list, SumModel = sumModel };
+        }
+
+        /// <summary>
+        /// 部门满意度统计---明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("enforcement_visit_org_satisfaction_statistics_order_list")]
+        public async Task<PagedDto<EnforcementOrgSatisfactionOrderListDto>> GetVisitAndOrgSatisfactionStatisticsOrderListAsync([FromQuery] QueryOrgSatisfactionStatisticsDto dto)
+        {
+            RefAsync<int> total = 0;
+            var queryData = await _judicialManagementOrdersRepository.Queryable()
+                .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
+                .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
+                .Where((x, o, p) => o.VisitTime >= dto.StartTime && o.VisitTime <= dto.EndTime && p.VisitTarget == EVisitTarget.Org && x.OrderSoure == EOrderSoure.Hotline)
+                .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", (x, o, p) => p.VisitOrgCode == dto.OrgCode)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", (x, o, p) => p.VisitOrgCode.StartsWith(dto.OrgCode))
+                 .WhereIF(dto.TypeId == 1, (x, o, p) => SqlFunc.JsonField(p.OrgProcessingResults, "Key") == dto.DateValue)
+                .WhereIF(dto.TypeId == 2, (x, o, p) => SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == dto.DateValue)
+                .Select((x, o, p) => new
+                {
+                    x,
+                    p.VisitId
+                })
+               .MergeTable()
+               .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+            var dtos = queryData.Select(d =>
+            {
+                var dto = _mapper.Map<EnforcementOrgSatisfactionOrderListDto>(d);
+                return dto;
+            }).ToList();
+            return new PagedDto<EnforcementOrgSatisfactionOrderListDto>(total, dtos);
+
+        }
+
+        ///// <summary>
+        ///// 处理司法历史工单数据
+        ///// </summary>
+        ///// <param name="Year"></param>
+        ///// <param name="Month"></param>
+        ///// <returns></returns>
+        //[HttpGet("add_enforcement_old_order")]
+        //public async Task AddEnforcementOldOrder(int Year, int Month)
+        //{
+        //    DateTime StartDate = DateTime.Parse(Year + "-" + Month + "-01 00:00:00");
+        //    DateTime EndDate = StartDate.AddMonths(1).AddSeconds(-1);
+
+        //    var list = await _orderRepository.Queryable()
+        //        .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate && p.Status >= EOrderStatus.Filed && p.AcceptTypeCode != "10")
+        //        .Select(p => new EnforcementOldOrder()
+        //        {
+        //            Id = p.Id,
+        //            No = p.No,
+        //            HotspotId = p.HotspotId,
+        //            HandleTime = p.ActualHandleTime,
+        //            OrgLevelOneCode = p.OrgLevelOneCode,
+        //            ActualHandleOrgCode = p.ActualHandleOrgCode
+        //        })
+        //        .ToListAsync();
+
+        //    if (list != null && list.Count > 0)
+        //    {
+        //        //查询指定热点数据
+        //        var hotList = await _enforcementHotspotRepository.Queryable().ToListAsync();
+
+        //        //查询指定部门数据
+        //        var JudicialManagementOrg = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.JudicialManagementOrg).ToList();
+
+        //        foreach (var item in list)
+        //        {
+        //            bool isAdd = false;
+
+        //            //如果是特定热点写入数据
+        //            if (hotList.Exists(p => p.Id == item.HotspotId))
+        //                isAdd = true;
+
+        //            if (!string.IsNullOrEmpty(item.OrgLevelOneCode))
+        //            {
+        //                //如果是特定部门办理写入数据
+        //                if (JudicialManagementOrg.Exists(p => p.DicDataValue.Trim() == item.OrgLevelOneCode))
+        //                    isAdd = true;
+        //            }
+
+        //            if (isAdd)
+        //            {
+        //                //是否存在此工单
+        //                if (!await _enforcementOrdersRepository.AnyAsync(p => p.Id == item.Id, HttpContext.RequestAborted))
+        //                {
+        //                    //  不存在写入
+        //                    EnforcementOrders enforcementOrders = new()
+        //                    {
+        //                        Id = item.Id,
+        //                        OrderNo = item.No,
+        //                        IsEnforcementOrder = false,
+        //                        IsTheClueTrue = null,
+        //                        IsPassTheBuckOrder = false,
+        //                        CreationTime = item.HandleTime != null ? item.HandleTime.Value : DateTime.Now
+        //                    };
+        //                    await _enforcementOrdersRepository.AddAsync(enforcementOrders, HttpContext.RequestAborted);
+
+        //                }
+        //            }
+        //        }
+        //    }
+        //}
+
+
+    }
+}

+ 51 - 29
src/Hotline.Api/Controllers/OrderController.cs

@@ -125,8 +125,9 @@ public class OrderController : BaseController
     private readonly IRepository<OrderCopy> _orderCopyRepository;
     private readonly IRepository<ExternalCitizens> _externalCitizensRepository;
     private readonly IRepository<OrderModifyingRecords> _orderModifyingRecordsRepository;
+    private readonly IOrderSendBackAuditApplication _orderSendBackAuditApplication;
 
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -180,8 +181,9 @@ public class OrderController : BaseController
         IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
         IRepository<OrderCopy> orderCopyRepository,
         IRepository<ExternalCitizens> externalCitizensRepository,
-        IRepository<OrderModifyingRecords> orderModifyingRecordsRepository
-        )
+        IRepository<OrderModifyingRecords> orderModifyingRecordsRepository,
+        IOrderSendBackAuditApplication orderSendBackAuditApplication
+		)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -237,7 +239,9 @@ public class OrderController : BaseController
         _orderCopyRepository = orderCopyRepository;
         _externalCitizensRepository = externalCitizensRepository;
         _orderModifyingRecordsRepository = orderModifyingRecordsRepository;
-    }
+        _orderSendBackAuditApplication = orderSendBackAuditApplication;
+
+	}
 
     #region 工单发布
 
@@ -3642,34 +3646,52 @@ public class OrderController : BaseController
     [HttpGet("order_previous_list")]
     public async Task<PagedDto<SendBackDto>> AuditList([FromQuery] SendBackListDto dto)
     {
-        var query = _orderSendBackAuditRepository.Queryable()
-             .Includes(x => x.Order)
-             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                 d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-             .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title!) )
-             .WhereIF(!string.IsNullOrEmpty(dto.No),d => d.Order.No.Contains(dto.No!))
-             .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.Order.AcceptTypeCode == dto.AcceptTypeCode)
-             .WhereIF(!string.IsNullOrEmpty(dto.OrgName), d => d.ApplyOrgName == dto.OrgName)
-			 .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
-             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-             .WhereIF(dto.AuditState == 1, d => d.State == ESendBackAuditState.Apply)
-             .WhereIF(dto.AuditState == 2 && !dto.State.HasValue, d => d.State > ESendBackAuditState.Apply)
-             .WhereIF(dto.AuditState == 2 && dto.State.HasValue, d => d.State == dto.State)
-             .WhereIF(dto.AuditState == 3 && _sessionContext.RequiredOrgId != OrgSeedData.CenterId, x => x.SendBackOrgId.StartsWith(_sessionContext.OrgId))
-             .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false && dto.AuditState != 3,x => x.SendBackOrgId == _sessionContext.OrgId);// 123 系统管理员
-
-        var (total, items) = await query.OrderByDescending(x => x.CreationTime)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        var query = _orderSendBackAuditApplication.AuditList(dto);
+
+        var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
         return new PagedDto<SendBackDto>(total, _mapper.Map<IReadOnlyList<SendBackDto>>(items));
     }
 
-    /// <summary>
-    /// 退回详情
-    /// </summary>
-    /// <param name="id"></param>
-    /// <returns></returns>
-    [HttpGet("order_previous/{id}")]
+	/// <summary>
+	/// 工单业务退回审批列表导出
+	/// </summary>
+	/// <returns></returns>
+	[HttpPost("order_previous_list/_export")]
+    public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<SendBackListDto> dto)
+    {
+	    var query = _orderSendBackAuditApplication.AuditList(dto.QueryDto);
+	    List<OrderSendBackAudit> data;
+	    if (dto.IsExportAll)
+	    {
+		    data = await query.ToListAsync(HttpContext.RequestAborted);
+	    }
+	    else
+	    {
+		    var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+		    data = items;
+	    }
+
+	    var dataDtos = _mapper.Map<ICollection<SendBackDto>>(data);
+
+	    dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+	    var dtos = dataDtos
+		    .Select(stu => _mapper.Map(stu, typeof(SendBackDto), dynamicClass))
+		    .Cast<object>()
+		    .ToList();
+
+	    var stream = ExcelHelper.CreateStream(dtos);
+
+	    return ExcelStreamResult(stream, "工单退回列表数据");
+    }
+
+	/// <summary>
+	/// 退回详情
+	/// </summary>
+	/// <param name="id"></param>
+	/// <returns></returns>
+	[HttpGet("order_previous/{id}")]
     public async Task<OrderSendBackAudit> OrderSendBackEntity(string id)
     {
         return await _orderSendBackAuditRepository.Queryable()
@@ -4056,7 +4078,7 @@ public class OrderController : BaseController
                 NextStepCode = dto.NextStepCode,
                 NextStepName = dto.NextStepName,
                 NextHandlers = dto.NextHandlers,
-                Opinion = dto.Cause,
+                Opinion = dto.Reason,
                 FlowDirection = dto.FlowDirection,
                 HandlerType = dto.HandlerType,
                 BusinessType = dto.BusinessType

+ 1 - 1
src/Hotline.Api/Controllers/OrderProvinceZmhdController.cs

@@ -48,7 +48,7 @@ namespace Hotline.Api.Controllers
         {
             RefAsync<int> total = 0;
             var items = await _orderRepository.Queryable()
-                .Where(p => p.SourceChannelCode == "SZMHD" && p.IsProvince == false && p.Status > EOrderStatus.Filed)
+                .Where(p => p.SourceChannelCode == "SZMHD" && p.IsProvince == false && p.Status >= EOrderStatus.Filed)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.No == dto.No)
                 .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), p => p.ProvinceNo == dto.ProvinceNo)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.StartsWith(dto.Title!))

+ 2 - 2
src/Hotline.Api/config/appsettings.Development.json

@@ -1,7 +1,7 @@
 {
   "AllowedHosts": "*",
   "CallCenterConfiguration": {
-    "CallCenterType": "XingTang", //XunShi、WeiErXin、TianRun、XingTang
+    "CallCenterType": "TianRun", //XunShi、WeiErXin、TianRun、XingTang
     "NewRock": {
       "Address": "http://192.168.100.100/xml",
       "Authorize": true,
@@ -28,7 +28,7 @@
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
     //"Redis": "110.188.24.182:50179",
     //"MongoDB": "mongodb://192.168.100.121:27017",
     //"Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"

+ 2 - 2
src/Hotline.Api/config/appsettings.json

@@ -28,7 +28,7 @@
     }
   },
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=hotline_dev;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
     //"Redis": "110.188.24.182:50179,password=fengwo22@@",
     //"MongoDB": "mongodb://192.168.100.121:27017",
     //"Wex": "server=222.212.82.225;Port=4509;Database=fs_kft;Uid=root;Pwd=Wex@12345;"
@@ -37,7 +37,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     "Password": "fengwo123!$!$",
-    "Database": 5
+    "Database": 3
   },
   "Swagger": true,
   "Cors": {

+ 65 - 28
src/Hotline.Application/JudicialManagement/EnforcementApplication.cs

@@ -1,6 +1,10 @@
-using Hotline.Caching.Interfaces;
+using Consul;
+using Hotline.Caching.Interfaces;
 using Hotline.JudicialManagement;
 using Hotline.Settings;
+using Hotline.Share.Dtos;
+using Hotline.Share.Enums.JudicialManagement;
+using MapsterMapper;
 using SqlSugar;
 using XF.Domain.Constants;
 using XF.Domain.Dependency;
@@ -15,6 +19,9 @@ namespace Hotline.Application.JudicialManagement
         private readonly IRepository<EnforcementHotspot> _enforcementHotspotRepository;
         private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
+        private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
+        private readonly IMapper _mapper;
 
 
         /// <summary>
@@ -25,17 +32,26 @@ namespace Hotline.Application.JudicialManagement
         /// <param name="enforcementHotspotRepository"></param>
         /// <param name="sysDicDataCacheManager"></param>
         /// <param name="systemSettingCacheManager"></param>
+        /// <param name="judicialManagementOrdersRepository"></param>
+        /// <param name="enforcementOrdersHandlerRepository"></param>
+        /// <param name="mapper"></param>
         public EnforcementApplication(IRepository<EnforcementOrderHander> enforcementOrderHanderRepository,
            IRepository<EnforcementOrders> enforcementOrdersRepository,
-          IRepository<EnforcementHotspot> enforcementHotspotRepository,
-        ISystemDicDataCacheManager sysDicDataCacheManager,
-       ISystemSettingCacheManager systemSettingCacheManager)
+           IRepository<EnforcementHotspot> enforcementHotspotRepository,
+           ISystemDicDataCacheManager sysDicDataCacheManager,
+           ISystemSettingCacheManager systemSettingCacheManager,
+           IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
+           IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository,
+           IMapper mapper)
         {
             _enforcementOrderHanderRepository = enforcementOrderHanderRepository;
             _enforcementOrdersRepository = enforcementOrdersRepository;
             _enforcementHotspotRepository = enforcementHotspotRepository;
             _sysDicDataCacheManager = sysDicDataCacheManager;
             _systemSettingCacheManager = systemSettingCacheManager;
+            _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
+            _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
+            _mapper = mapper;
         }
 
         /// <summary>
@@ -47,7 +63,7 @@ namespace Hotline.Application.JudicialManagement
         public async Task AddEnforcementOrderAsync(Hotline.Orders.Order order, CancellationToken cancellationToken)
         {
             //排除咨询件
-            if (order.AcceptTypeCode == "10")
+            if (order.AcceptTypeCode != "35")
                 return;
 
             //如果没开启则不处理
@@ -73,23 +89,32 @@ namespace Hotline.Application.JudicialManagement
             //需要添加
             if (isAdd)
             {
-                var orderData = await _enforcementOrdersRepository.GetAsync(p => p.Id == order.Id, cancellationToken);
+
+                var orderData = await _judicialManagementOrdersRepository.GetAsync(p => p.Id == order.Id, cancellationToken);
                 if (orderData == null)
                 {
-                    EnforcementOrders enforcementOrders = new EnforcementOrders()
+                    //处理工单
+                    _mapper.Map(order, orderData);
+                    orderData.IsEnforcementOrder = order.IsEnforcementOrder.HasValue ? order.IsEnforcementOrder.Value : false;
+                    orderData.IsTheClueTrue = null;
+                    orderData.IsPassTheBuckOrder = false;
+                    List<Kv> kvs = new List<Kv>
                     {
-                        Id = order.Id,
-                        OrderNo = order.No,
-                        IsEnforcementOrder = order.IsEnforcementOrder.HasValue ? order.IsEnforcementOrder.Value : false,
-                        IsTheClueTrue = null,
-                        IsPassTheBuckOrder = false
+                        new Kv { Key = order.OrgLevelOneName, Value = order.OrgLevelOneCode }
                     };
+                    orderData.EnforcementOrdersHandler = kvs;
+                    await _judicialManagementOrdersRepository.AddAsync(orderData, cancellationToken);
 
-                    await _enforcementOrdersRepository.AddAsync(enforcementOrders, cancellationToken);
-                }
-                else
-                {
-                    //是否需要更新数据
+                    //处理部门
+                    EnforcementOrdersHandler enforcementOrdersHandler = new EnforcementOrdersHandler()
+                    {
+                        OrderId = order.Id,
+                        OrderNo = order.No,
+                        OrderSoure = EOrderSoure.Hotline,
+                        OrgCode = order.OrgLevelOneCode,
+                        OrgName = order.OrgLevelOneName
+                    };
+                    await _enforcementOrdersHandlerRepository.AddAsync(enforcementOrdersHandler, cancellationToken);
                 }
             }
 
@@ -109,7 +134,7 @@ namespace Hotline.Application.JudicialManagement
                 return;
 
             //排除咨询件
-            if (order.AcceptTypeCode == "10")
+            if (order.AcceptTypeCode != "35")
                 return;
 
             //如果没开启则不处理
@@ -153,19 +178,32 @@ namespace Hotline.Application.JudicialManagement
                 if (enforcementOrder.HandleNum >= CountNum)
                 {
                     //查找工单数据
-                    var orderData = await _enforcementOrdersRepository.GetAsync(p => p.Id == order.Id, cancellationToken);
+                    var orderData = await _judicialManagementOrdersRepository.GetAsync(p => p.Id == order.Id, cancellationToken);
                     if (orderData == null)
                     {
-                        //没有工单数据,直接写入
-                        EnforcementOrders enforcementOrders = new()
+                        //处理工单
+                        _mapper.Map(order, orderData);
+                        orderData.IsEnforcementOrder = order.IsEnforcementOrder.HasValue ? order.IsEnforcementOrder.Value : false;
+                        orderData.IsTheClueTrue = null;
+                        orderData.IsPassTheBuckOrder = true;
+                        List<Kv> kvs = new List<Kv>
                         {
-                            Id = order.Id,
+                            new Kv { Key = order.OrgLevelOneName, Value = order.OrgLevelOneCode }
+                        };
+                        orderData.EnforcementOrdersHandler = kvs;
+                        await _judicialManagementOrdersRepository.AddAsync(orderData, cancellationToken);
+
+                        //处理部门
+                        EnforcementOrdersHandler enforcementOrdersHandler = new EnforcementOrdersHandler()
+                        {
+                            OrderId = order.Id,
                             OrderNo = order.No,
-                            IsEnforcementOrder = order.IsEnforcementOrder.HasValue ? order.IsEnforcementOrder.Value : false,
-                            IsTheClueTrue = null,
-                            IsPassTheBuckOrder = true
+                            OrderSoure = EOrderSoure.Hotline,
+                            OrgCode = order.OrgLevelOneCode,
+                            OrgName = order.OrgLevelOneName
                         };
-                        await _enforcementOrdersRepository.AddAsync(orderData, cancellationToken);
+                        await _enforcementOrdersHandlerRepository.AddAsync(enforcementOrdersHandler, cancellationToken);
+
                     }
                     else
                     {
@@ -173,12 +211,11 @@ namespace Hotline.Application.JudicialManagement
                         if (orderData.IsPassTheBuckOrder != true)
                         {
                             orderData.IsPassTheBuckOrder = true;
-                            await _enforcementOrdersRepository.UpdateAsync(orderData, cancellationToken);
+                            await _judicialManagementOrdersRepository.UpdateAsync(orderData, cancellationToken);
                         }
                     }
                 }
             }
-
         }
     }
 }

+ 1 - 1
src/Hotline.Application/Mappers/CallMapperConfigs.cs

@@ -73,7 +73,7 @@ namespace Hotline.Application.Mappers
                 .Map(d => d.BeginIvrTime, s => s.CallStartTime)
                 .Map(d => d.EndIvrTime, s => s.EnqueueTime)
                 .Map(d => d.BeginRingTime, s => s.RingStartTime)
-                //.Map(d=>d.EndRingTimg,s=>)
+                .Map(d => d.EndRingTimg, s => s.ReceiveEndTime.HasValue ? s.ReceiveEndTime : s.CallEndTime)
                 .Map(d => d.OlaQueue, s => s.SkillId.ToString())
                 .Map(d => d.Duration, s => s.Duration)
                 .Map(d => d.RingTimes, s => s.RingTime)

+ 39 - 39
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -40,45 +40,45 @@ namespace Hotline.Application.Mappers
 
             
 
-            config.ForType<EnforcementOrders, EnforcementOrderListDto>()
-                .Map(d => d.Id, x => x.Id)
-                .Map(d => d.WorkflowId, x => x.Order.WorkflowId)
-                .Map(d => d.Status, x => x.Order.Status)
-                .Map(d => d.No, x => x.Order.No)
-                .Map(d => d.SourceChannel, x => x.Order.SourceChannel)
-                .Map(d => d.SourceChannelCode, x => x.Order.SourceChannelCode)
-                .Map(d => d.FromPhone, x => x.Order.FromPhone)
-                .Map(d => d.TransferPhone, x => x.Order.TransferPhone)
-                .Map(d => d.FromName, x => x.Order.FromName)
-                .Map(d => d.Contact, x => x.Order.Contact)
-                .Map(d => d.AcceptType, x => x.Order.AcceptType)
-                .Map(d => d.AcceptTypeCode, x => x.Order.AcceptTypeCode)
-                .Map(d => d.EmergencyLevel, x => x.Order.EmergencyLevel)
-                .Map(d => d.Title, x => x.Order.Title)
-                .Map(d => d.HotspotId, x => x.Order.HotspotId)
-                .Map(d => d.HotspotName, x => x.Order.HotspotName)
-                .Map(d => d.HotspotSpliceName, x => x.Order.HotspotSpliceName)
-                .Map(d => d.CreationTime, x => x.Order.CreationTime)
-                .Map(d => d.IsProvince, x => x.Order.IsProvince)
-                .Map(d => d.ProvinceNo, x => x.Order.ProvinceNo)
-                .Map(d => d.ActualHandleStepName, x => x.Order.ActualHandleStepName)
-                .Map(d => d.ActualHandleTime, x => x.Order.ActualHandleTime)
-                .Map(d => d.ExpiredTime, x => x.Order.ExpiredTime)
-                .Map(d => d.NearlyExpiredTime, x => x.Order.NearlyExpiredTime)
-                .Map(d => d.FiledTime, x => x.Order.FiledTime)
-                .Map(d => d.OrgLevelOneCode, x => x.Order.OrgLevelOneCode)
-                .Map(d => d.OrgLevelOneName, x => x.Order.OrgLevelOneName)
-                .Map(d => d.ActualHandlerName, x => x.Order.ActualHandlerName)
-                .Map(d => d.StartTime, x => x.Order.StartTime)
-                .Map(d => d.ActualHandleOrgName, x => x.Order.ActualHandleOrgName)
-                .Map(d => d.ActualHandleOrgCode, x => x.Order.ActualHandleOrgCode)
-                .Map(d => d.IsEnforcementOrder, x => x.IsEnforcementOrder)
-                .Map(d => d.IsPassTheBuckOrder, x => x.IsPassTheBuckOrder)
-                .Map(d => d.IsTheClueTrue, x => x.IsTheClueTrue)
-                .Map(d => d.EventTypeName, x => x.EventTypeName)
-                .Map(d => d.EventTypeId, x => x.EventTypeId)
-                .Map(d => d.EventTypeSpliceName, x => x.EventTypeSpliceName)
-                 ;
+            //config.ForType<EnforcementOrders, EnforcementOrderListDto>()
+            //    .Map(d => d.Id, x => x.Id)
+            //    .Map(d => d.WorkflowId, x => x.Order.WorkflowId)
+            //    .Map(d => d.Status, x => x.Order.Status)
+            //    .Map(d => d.No, x => x.Order.No)
+            //    .Map(d => d.SourceChannel, x => x.Order.SourceChannel)
+            //    .Map(d => d.SourceChannelCode, x => x.Order.SourceChannelCode)
+            //    .Map(d => d.FromPhone, x => x.Order.FromPhone)
+            //    .Map(d => d.TransferPhone, x => x.Order.TransferPhone)
+            //    .Map(d => d.FromName, x => x.Order.FromName)
+            //    .Map(d => d.Contact, x => x.Order.Contact)
+            //    .Map(d => d.AcceptType, x => x.Order.AcceptType)
+            //    .Map(d => d.AcceptTypeCode, x => x.Order.AcceptTypeCode)
+            //    .Map(d => d.EmergencyLevel, x => x.Order.EmergencyLevel)
+            //    .Map(d => d.Title, x => x.Order.Title)
+            //    .Map(d => d.HotspotId, x => x.Order.HotspotId)
+            //    .Map(d => d.HotspotName, x => x.Order.HotspotName)
+            //    .Map(d => d.HotspotSpliceName, x => x.Order.HotspotSpliceName)
+            //    .Map(d => d.CreationTime, x => x.Order.CreationTime)
+            //    .Map(d => d.IsProvince, x => x.Order.IsProvince)
+            //    .Map(d => d.ProvinceNo, x => x.Order.ProvinceNo)
+            //    .Map(d => d.ActualHandleStepName, x => x.Order.ActualHandleStepName)
+            //    .Map(d => d.ActualHandleTime, x => x.Order.ActualHandleTime)
+            //    .Map(d => d.ExpiredTime, x => x.Order.ExpiredTime)
+            //    .Map(d => d.NearlyExpiredTime, x => x.Order.NearlyExpiredTime)
+            //    .Map(d => d.FiledTime, x => x.Order.FiledTime)
+            //    .Map(d => d.OrgLevelOneCode, x => x.Order.OrgLevelOneCode)
+            //    .Map(d => d.OrgLevelOneName, x => x.Order.OrgLevelOneName)
+            //    .Map(d => d.ActualHandlerName, x => x.Order.ActualHandlerName)
+            //    .Map(d => d.StartTime, x => x.Order.StartTime)
+            //    .Map(d => d.ActualHandleOrgName, x => x.Order.ActualHandleOrgName)
+            //    .Map(d => d.ActualHandleOrgCode, x => x.Order.ActualHandleOrgCode)
+            //    .Map(d => d.IsEnforcementOrder, x => x.IsEnforcementOrder)
+            //    .Map(d => d.IsPassTheBuckOrder, x => x.IsPassTheBuckOrder)
+            //    .Map(d => d.IsTheClueTrue, x => x.IsTheClueTrue)
+            //    .Map(d => d.EventTypeName, x => x.EventTypeName)
+            //    .Map(d => d.EventTypeId, x => x.EventTypeId)
+            //    .Map(d => d.EventTypeSpliceName, x => x.EventTypeSpliceName)
+            //     ;
 
             config.ForType<Order, OrderSubmissionForm>()
              .Map(d => d.FromGender, x => x.FromGender == EGender.Male ? "男" : x.FromGender == EGender.Female ? "女" : "未知")

+ 16 - 0
src/Hotline.Application/Orders/IOrderSendBackAuditApplication.cs

@@ -0,0 +1,16 @@
+using Hotline.Orders;
+using Hotline.Share.Dtos.Order;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Orders
+{
+	public interface IOrderSendBackAuditApplication
+	{
+		ISugarQueryable<OrderSendBackAudit> AuditList(SendBackListDto dto);
+	}
+}

+ 6 - 4
src/Hotline.Application/Orders/OrderApplication.cs

@@ -313,10 +313,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             if (word is { WordType: WordType.SimplifiedChinese, Word.Length: > 1 } )
 	            words.Add(splitWords.ElementAt(i).Word);
 		}
-        var vector = await _repositoryts.SearchAsync(orderId, cancellationToken);
-        if (vector != null && vector.Any()) await _repositoryts.UpdateVectorAsync(orderId, words, cancellationToken);
-        else await _repositoryts.AddVectorAsync(orderId, time, words, cancellationToken);
-
+        if (words.Any())
+        {
+			var vector = await _repositoryts.SearchAsync(orderId, cancellationToken);
+			if (vector != null && vector.Any()) await _repositoryts.UpdateVectorAsync(orderId, words, cancellationToken);
+			else await _repositoryts.AddVectorAsync(orderId, time, words, cancellationToken);
+		}
         //var words = await _orderWrodRepository.Queryable().Where(x => x.IsEnable == 1 && x.Classify.Contains("普通标签")).Select(x => x.Tag).ToListAsync(cancellationToken);
         //var res = new List<string>();
         //if (words.Any()) res = ParticipleTool.SegMMDouble(inputStr, ref words);

+ 43 - 0
src/Hotline.Application/Orders/OrderSendBackAuditApplication.cs

@@ -0,0 +1,43 @@
+using Hotline.Orders;
+using Hotline.SeedData;
+using Hotline.Share.Dtos.Bi;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
+using SqlSugar;
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Orders
+{
+	public class OrderSendBackAuditApplication : IOrderSendBackAuditApplication, IScopeDependency
+	{
+		private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
+		private readonly ISessionContext _sessionContext;
+		public OrderSendBackAuditApplication(IRepository<OrderSendBackAudit> orderSendBackAuditRepository, ISessionContext sessionContext) 
+		{ 
+			_orderSendBackAuditRepository = orderSendBackAuditRepository; 
+			_sessionContext = sessionContext;
+ 		}
+
+		public ISugarQueryable<OrderSendBackAudit> AuditList(SendBackListDto dto) 
+		{
+			return _orderSendBackAuditRepository.Queryable()
+				.Includes(x => x.Order)
+				.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+					d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
+				.WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title!))
+				.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No!))
+				.WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.Order.AcceptTypeCode == dto.AcceptTypeCode)
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), d => d.ApplyOrgName == dto.OrgName)
+				.WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
+				.WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
+				.WhereIF(dto.AuditState == 1, d => d.State == ESendBackAuditState.Apply)
+				.WhereIF(dto is { AuditState: 2, State: null }, d => d.State > ESendBackAuditState.Apply)
+				.WhereIF(dto.AuditState is 2 or 3 && dto.State.HasValue, d => d.State == dto.State)
+				.WhereIF(dto.AuditState == 3 && _sessionContext.RequiredOrgId != OrgSeedData.CenterId, x => x.SendBackOrgId.StartsWith(_sessionContext.OrgId))
+				.WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false && dto.AuditState != 3, x => x.SendBackOrgId == _sessionContext.OrgId) // 123 系统管理员;
+				.OrderByDescending(x => x.CreationTime);
+		}
+	}
+}

+ 2 - 2
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -207,8 +207,8 @@ namespace Hotline.Repository.SqlSugar.Extensions
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
-                Log.Information("Sql: {0}", sql);
-                Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
+                //Log.Information("Sql: {0}", sql);
+                //Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

+ 19 - 8
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -184,7 +184,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<object> OrderAreaTime(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new List<int>();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new List<int>();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -236,7 +237,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> OrderAreaTimeExport(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -288,7 +290,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<object> OrderHotspotTime(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new List<int>();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new List<int>();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -340,7 +343,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> OrderHotspotTimeExport(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -392,7 +396,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<object> OrderAcceptanceTime(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new List<int>();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new List<int>();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -444,7 +449,9 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> OrderAcceptanceTimeExport(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+			List<int> dts = new();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -496,7 +503,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<object> OrderSourceTime(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new List<int>();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new List<int>();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -551,7 +559,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> OrderSourceTimeExport(TimeSharingPagedKeywordRequest dto)
         {
-            List<int> dts = new();
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+			List<int> dts = new();
             for (int i = 0; i < 24; i++)
             {
                 dts.Add(i);
@@ -602,6 +611,7 @@ namespace Hotline.Repository.SqlSugar.Orders
 		/// <returns></returns>
 		public async Task<object> OrderSource(QueryOrderSourceRequest dto)
 		{
+			dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 			var listOrder = Db.Queryable<Order>()
 				 .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
 				 .WhereIF(dto.IdentityType != null, p => p.IdentityType == dto.IdentityType)
@@ -637,6 +647,7 @@ namespace Hotline.Repository.SqlSugar.Orders
 		/// <returns></returns>
 		public async Task<DataTable> OrderSourceExport(QueryOrderSourceRequest dto)
 		{
+			dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 			var listOrder = Db.Queryable<Order>()
 				 .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
 				 .WhereIF(dto.IdentityType != null, p => p.IdentityType == dto.IdentityType)

+ 38 - 93
src/Hotline.Share/Dtos/JudicialManagement/EnforcementOrderListDto.cs

@@ -1,28 +1,15 @@
 using Hotline.Share.Enums.Order;
-using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.JudicialManagement
 {
     public class EnforcementOrderListDto
     {
-        public string Id { get; set; }
-        public string WorkflowId { get; set; }
-
         /// <summary>
-        /// 工单状态
+        /// 是否统计
         /// </summary>
-        public EOrderStatus Status { get; set; }
-        public string StatusText => Status.GetDescription();
+        public bool IsItCounted { get; set; } = true;
 
-        /// <summary>
-        /// 过期状态
-        /// </summary>
-        public EExpiredStatus? ExpiredStatus => CalculateExpiredState();
-
-        /// <summary>
-        /// 过期状态
-        /// </summary>
-        public string ExpiredStatusText => ExpiredStatus?.GetDescription() ?? string.Empty;
+        public string Id { get; set; }
 
         /// <summary>
         /// 工单编码(20220101000001)
@@ -66,6 +53,9 @@ namespace Hotline.Share.Dtos.JudicialManagement
         /// </summary>
         public EEmergencyLevel EmergencyLevel { get; set; }
 
+        /// <summary>
+        /// 标题
+        /// </summary>
         public string Title { get; set; }
 
         /// <summary>
@@ -78,130 +68,85 @@ namespace Hotline.Share.Dtos.JudicialManagement
         public DateTime CreationTime { get; set; }
 
         /// <summary>
-        /// 是否为省工单
-        /// </summary>
-        public bool IsProvince { get; set; }
-
-        /// <summary>
-        /// 同步省工单编号和省上传下来的工单都用这个字段
+        /// 省
         /// </summary>
-        public string? ProvinceNo { get; set; }
+        public string? Province { get; set; }
 
         /// <summary>
-        /// 实际办理节点名称(会签状态此字段保存最外层会签发起节点名称)
+        /// 市
         /// </summary>
-        public string? ActualHandleStepName { get; set; }
+        public string? City { get; set; }
 
         /// <summary>
-        /// 实际办理时间
+        /// 区/县
         /// </summary>
-        public DateTime? ActualHandleTime { get; set; }
+        public string? County { get; set; }
 
         /// <summary>
-        /// 超期时间(期满时间)
+        /// 乡镇(4级行政区划)
         /// </summary>
-        public DateTime? ExpiredTime { get; set; }
+        public string? Town { get; set; }
 
         /// <summary>
-        /// 即将超期时间
-        /// </summary>
-        public DateTime? NearlyExpiredTime { get; set; }
-
-        /// <summary>
-        /// 归档时间(暂为流程结束时间,因流程结束自动归档)
-        /// </summary>
-        public DateTime? FiledTime { get; set; }
-
-        /// <summary>
-        /// 工单开始时间(受理/接办时间=流程开启时间)
-        /// </summary>
-        public DateTime? StartTime { get; set; }
-
-        /// <summary>
-        /// 实际办理部门名称
+        /// 是否行政执法类
         /// </summary>
-        public string? ActualHandleOrgName { get; set; }
+        public bool? IsEnforcementOrder { get; set; }
 
         /// <summary>
-        /// 实际办理部门编码
+        /// 是否推诿
         /// </summary>
-        public string? ActualHandleOrgCode { get; set; }
+        public bool? IsPassTheBuckOrder { get; set; }
 
         /// <summary>
-        /// 一级部门code
+        /// 线索是否属实
         /// </summary>
-        public string? OrgLevelOneCode { get; set; }
+        public bool? IsTheClueTrue { get; set; }
 
         /// <summary>
-        /// 一级部门名称
+        /// 诉事项类型Id
         /// </summary>
-        public string? OrgLevelOneName { get; set; }
+        public string? EventTypeId { get; set; }
 
         /// <summary>
-        /// 实际办理人名称
+        /// 诉事项类型名称
         /// </summary>
-        public string? ActualHandlerName { get; set; }
+        public string? EventTypeName { get; set; }
 
         /// <summary>
-        /// 是否行政执法类
+        /// 诉事项类型名称
         /// </summary>
-        public bool? IsEnforcementOrder { get; set; }
+        public string? EventTypeSpliceName { get; set; }
 
         /// <summary>
-        /// 是否推诿
+        /// 是否显示修改按钮
         /// </summary>
-        public bool? IsPassTheBuckOrder { get; set; }
+        public bool IsShowUpdateButton { get; set; }
 
         /// <summary>
-        /// 线索是否属实
+        /// 受理人id
         /// </summary>
-        public bool? IsTheClueTrue { get; set; }
+        public string? AcceptorId { get; set; }
 
         /// <summary>
-        /// 诉事项类型Id
+        /// 受理人名称
         /// </summary>
-        public string? EventTypeId { get; set; }
+        public string? AcceptorName { get; set; }
 
         /// <summary>
-        /// 诉事项类型名称
+        /// 受理人工号
         /// </summary>
-        public string? EventTypeName { get; set; }
+        public string? AcceptorStaffNo { get; set; }
 
         /// <summary>
-        /// 诉事项类型名称
+        /// 受理人部门编码
         /// </summary>
-        public string? EventTypeSpliceName { get; set; }
+        public string? AcceptorOrgCode { get; set; }
 
         /// <summary>
-        /// 是否显示修改按钮
+        /// 受理人部门名称
         /// </summary>
-        public bool IsShowUpdateButton { get; set; }
+        public string? AcceptorOrgName { get; set; }
 
-        public EExpiredStatus? CalculateExpiredState()
-        {
-            DateTime? dateTime = DateTime.Now;
-            if (Status >= EOrderStatus.Filed)
-            {
-                dateTime = ActualHandleTime;
-            }
-            //ExpiredStatus
-            if (ExpiredTime.HasValue)
-            {
-                if (dateTime < NearlyExpiredTime)
-                {
-                    return EExpiredStatus.Normal;
-                }
-                else if (dateTime > NearlyExpiredTime && dateTime < ExpiredTime)
-                {
-                    return EExpiredStatus.GoingToExpired;
-                }
-                else
-                {
-                    return EExpiredStatus.Expired;
-                }
-            }
-            return null;
-        }
     }
 
     public class EnforcementOrgSatisfactionOrderListDto : EnforcementOrderListDto

+ 186 - 0
src/Hotline.Share/Dtos/JudicialManagement/JudicialManagementAddOrderDto.cs

@@ -0,0 +1,186 @@
+using Hotline.Share.Dtos.File;
+using Hotline.Share.Enums.JudicialManagement;
+using Hotline.Share.Enums.Order;
+
+namespace Hotline.Share.Dtos.JudicialManagement
+{
+    /// <summary>
+    /// 修改
+    /// </summary>
+    public class JudicialManagementAddOrderDto: Position
+    {
+        /// <summary>
+        /// 来源渠道(电话、网站、APP等)
+        /// </summary>
+        public string? SourceChannel { get; set; }
+
+        public string? SourceChannelCode { get; set; }
+
+        /// <summary>
+        /// 来电号码
+        /// </summary>
+        public string? FromPhone { get; set; }
+
+        /// <summary>
+        /// 转接号码(转接来源)
+        /// </summary>
+        public string? TransferPhone { get; set; }
+
+        /// <summary>
+        /// 来电/信人姓名
+        /// </summary>
+        public string? FromName { get; set; }
+
+        /// <summary>
+        /// 来电/信人性别
+        /// </summary>
+        public EGender FromGender { get; set; }
+
+        /// <summary>
+        /// 来电/信人身份
+        /// </summary>
+        public EIdentityType? IdentityType { get; set; }
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        public string? Contact { get; set; }
+
+        public string? ContactMask { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+
+        public string? AcceptTypeCode { get; set; }
+
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string? HotspotId { get; set; }
+
+        public string? HotspotName { get; set; }
+
+        public string? HotspotSpliceName { get; set; }
+
+        /// <summary>
+        /// 外部数据(为前端提供级联功能)
+        /// </summary>
+        public string? HotspotExternal { get; set; }
+
+        /// <summary>
+        /// 附件列表
+        /// </summary>
+        public List<FileDto> Files { get; set; } = new();
+
+        /// <summary>
+        /// 诉求内容
+        /// </summary>
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 工单来源
+        /// </summary>
+        public EOrderSoure? OrderSoure { get; set; }
+
+        /// <summary>
+        /// 是否行政执法类
+        /// </summary>
+        public bool? IsEnforcementOrder { get; set; }
+
+        /// <summary>
+        /// 执法部门
+        /// </summary>
+        public List<Kv> EnforcementOrdersHandler { get; set; }
+    }
+
+    /// <summary>
+    /// 编辑
+    /// </summary>
+    public class JudicialManagementUpdateOrderDto : JudicialManagementAddOrderDto
+    {
+        public string Id { get; set; }
+    }
+
+    public class JudicialManagementOrderDto : JudicialManagementUpdateOrderDto
+    {
+        /// <summary>
+        /// 工单编码(20220101000001)
+        /// </summary>
+        public string No { get; set; }
+
+        /// <summary>
+        /// 是否推诿
+        /// </summary>
+        public bool IsPassTheBuckOrder { get; set; }
+
+        /// <summary>
+        /// 线索是否属实
+        /// </summary>
+        public bool? IsTheClueTrue { get; set; }
+
+        /// <summary>
+        /// 诉事项类型ID
+        /// </summary>
+        public string? EventTypeId { get; set; }
+
+        /// <summary>
+        /// 诉事项类型名称
+        /// </summary>
+        public string? EventTypeName { get; set; }
+
+        /// <summary>
+        /// 诉事项类型名称
+        /// </summary>
+        public string? EventTypeSpliceName { get; set; }
+
+        /// <summary>
+        /// 诉事项类型一级Id
+        /// </summary>
+        public string? EventTypeOneLevelId { get; set; }
+
+        /// <summary>
+        /// 同步省工单编号和省上传下来的工单都用这个字段
+        /// </summary>
+        public string? ProvinceNo { get; set; }
+
+        /// <summary>
+        /// 市民查询密码
+        /// </summary>
+        public string? Password { get; set; }
+
+        /// <summary>
+        /// 受理人id
+        /// </summary>
+        public string? AcceptorId { get; set; }
+
+        /// <summary>
+        /// 受理人名称
+        /// </summary>
+        public string? AcceptorName { get; set; }
+
+        /// <summary>
+        /// 受理人工号
+        /// </summary>
+        public string? AcceptorStaffNo { get; set; }
+
+        /// <summary>
+        /// 受理人部门编码
+        /// </summary>
+        public string? AcceptorOrgCode { get; set; }
+
+        /// <summary>
+        /// 受理人部门名称
+        /// </summary>
+        public string? AcceptorOrgName { get; set; }
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        public List<FileDto>? Additions { get; set; } = new();
+        public List<FileJson>? FileJson { get; set; }
+    }
+}

+ 81 - 0
src/Hotline.Share/Dtos/JudicialManagement/QueryEnforcementOrderDto.cs

@@ -152,4 +152,85 @@ namespace Hotline.Share.Dtos.JudicialManagement
         /// </summary>
         public bool? IsTheClueTrue { get; set; }
     }
+
+    /// <summary>
+    /// 司法行政监督管理工单查询参数--新版
+    /// </summary>
+    public record QueryEnforcementOrderNewDto : PagedRequest
+    {
+        /// <summary>
+        /// 本地编号
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点分类
+        /// </summary>
+        public string? HotspotId { get; set; }
+
+        /// <summary>
+        /// 事项类型
+        /// </summary>
+        public string? EventTypeId { get; set; }
+
+        /// <summary>
+        /// 受理坐席名字或工号
+        /// </summary>
+        public string? NameOrNo { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? ChannelCode { get; set; }
+
+        /// <summary>
+        /// 区域
+        /// </summary>
+        public string AreaCode { get; set; }
+
+        /// <summary>
+        /// 工单创建时间
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime? CreationTimeEnd { get; set; }
+
+        /// <summary>
+        /// 执法部门
+        /// </summary>
+        public string? OrgCode { get; set; }
+
+        /// <summary>
+        /// 来电人姓名
+        /// </summary>
+        public string? FromName { get; set; }
+
+        /// <summary>
+        /// 是否行政执法类
+        /// </summary>
+        public bool? IsEnforcementOrder { get; set; }
+
+        /// <summary>
+        /// 是否推诿
+        /// </summary>
+        public bool? IsPassTheBuckOrder { get; set; }
+
+        /// <summary>
+        /// 线索是否属实
+        /// </summary>
+        public bool? IsTheClueTrue { get; set; }
+    }
 }

+ 15 - 0
src/Hotline.Share/Enums/JudicialManagement/EOrderSoure.cs

@@ -0,0 +1,15 @@
+namespace Hotline.Share.Enums.JudicialManagement
+{
+    public enum EOrderSoure
+    {
+        /// <summary>
+        /// 12345热线平台工单
+        /// </summary>
+        Hotline = 0,
+
+        /// <summary>
+        /// 司法自建
+        /// </summary>
+        Enforcement = 1
+    }
+}

+ 33 - 0
src/Hotline/JudicialManagement/EnforcementOrdersHandler.cs

@@ -0,0 +1,33 @@
+using Hotline.Share.Enums.JudicialManagement;
+using XF.Domain.Repository;
+
+namespace Hotline.JudicialManagement
+{
+    public class EnforcementOrdersHandler : CreationSoftDeleteEntity
+    {
+        /// <summary>
+        /// 工单Id
+        /// </summary>
+        public string? OrderId { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string? OrderNo { get; set; }
+
+        /// <summary>
+        /// 工单来源
+        /// </summary>
+        public EOrderSoure? OrderSoure { get; set; }
+
+        /// <summary>
+        ///部门编号
+        /// </summary>
+        public string OrgCode { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+    }
+}

+ 13 - 0
src/Hotline/JudicialManagement/IJudicialManagementOrdersService.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.JudicialManagement
+{
+    public  interface IJudicialManagementOrdersService
+    {
+        Task<string> AddAsync(JudicialManagementOrders order, bool autoAccept = false, CancellationToken cancellationToken = default);
+    }
+}

+ 255 - 0
src/Hotline/JudicialManagement/JudicialManagementOrders.cs

@@ -0,0 +1,255 @@
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.File;
+using Hotline.Share.Enums.JudicialManagement;
+using Hotline.Share.Enums.Order;
+using SqlSugar;
+using XF.Domain.Extensions;
+using XF.Domain.Repository;
+
+namespace Hotline.JudicialManagement
+{
+    public class JudicialManagementOrders : PositionEntity
+    {
+        /// <summary>
+        /// 来源渠道(电话、网站、APP等)
+        /// </summary>
+        public string? SourceChannel { get; set; }
+
+        public string? SourceChannelCode { get; set; }
+
+        /// <summary>
+        /// 来电号码
+        /// </summary>
+        public string? FromPhone { get; set; }
+
+        /// <summary>
+        /// 转接号码(转接来源)
+        /// </summary>
+        public string? TransferPhone { get; set; }
+
+        /// <summary>
+        /// 来电/信人姓名
+        /// </summary>
+        public string? FromName { get; set; }
+
+        /// <summary>
+        /// 来电/信人性别
+        /// </summary>
+        public EGender FromGender { get; set; }
+
+        /// <summary>
+        /// 来电/信人身份
+        /// </summary>
+        public EIdentityType? IdentityType { get; set; }
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        [SugarColumn(ColumnDescription = "联系电话", IsNullable = true)]
+        public string? Contact { get; set; }
+
+        [SugarColumn(ColumnDescription = "联系电话脱敏", IsNullable = true)]
+        public string? ContactMask { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+
+        public string? AcceptTypeCode { get; set; }
+
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string? HotspotId { get; set; }
+
+        public string? HotspotName { get; set; }
+
+        public string? HotspotSpliceName { get; set; }
+
+        /// <summary>
+        /// 外部数据(为前端提供级联功能)
+        /// </summary>
+        public string? HotspotExternal { get; set; }
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true)]
+        public List<FileDto>? Additions { get; set; } = new();
+
+        /// <summary>
+        /// 诉求内容
+        /// </summary>
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 工单编码(20220101000001)
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 市民查询密码
+        /// </summary>
+        public string? Password { get; set; }
+
+        /// <summary>
+        /// 受理人id
+        /// </summary>
+        public string? AcceptorId { get; set; }
+
+        /// <summary>
+        /// 受理人名称
+        /// </summary>
+        public string? AcceptorName { get; set; }
+
+        /// <summary>
+        /// 受理人工号
+        /// </summary>
+        public string? AcceptorStaffNo { get; set; }
+
+        /// <summary>
+        /// 受理人部门编码
+        /// </summary>
+        public string? AcceptorOrgCode { get; set; }
+
+        /// <summary>
+        /// 受理人部门名称
+        /// </summary>
+        public string? AcceptorOrgName { get; set; }
+
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<FileJson>? FileJson { get; set; }
+
+        /// <summary>
+        /// 是否统计
+        /// </summary>
+        public bool IsItCounted { get; set; } = true;
+
+        /// <summary>
+        /// 工单来源
+        /// </summary>
+        public EOrderSoure? OrderSoure { get; set; }
+
+        /// <summary>
+        /// 执法部门
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<Kv> EnforcementOrdersHandler { get; set; }
+
+        /// <summary>
+        /// 是否推诿
+        /// </summary>
+        public bool IsPassTheBuckOrder { get; set; }
+
+        /// <summary>
+        /// 线索是否属实
+        /// </summary>
+        public bool? IsTheClueTrue { get; set; }
+
+        /// <summary>
+        /// 诉事项类型ID
+        /// </summary>
+        public string? EventTypeId { get; set; }
+
+        /// <summary>
+        /// 诉事项类型名称
+        /// </summary>
+        public string? EventTypeName { get; set; }
+
+        /// <summary>
+        /// 诉事项类型名称
+        /// </summary>
+        public string? EventTypeSpliceName { get; set; }
+
+        /// <summary>
+        /// 诉事项类型一级Id
+        /// </summary>
+        public string? EventTypeOneLevelId { get; set; }
+
+        /// <summary>
+        /// 是否行政执法类
+        /// </summary>
+        public bool? IsEnforcementOrder { get; set; }
+
+        /// <summary>
+        /// 同步省工单编号和省上传下来的工单都用这个字段
+        /// </summary>
+        public string? ProvinceNo { get; set; }
+
+        public void Init()
+        {
+            if (!string.IsNullOrEmpty(Contact))
+                ContactMask = Contact.MaskPhoneNumber();
+        }
+
+        public void AutoAccept(string userId, string? userName, string? staffNo, string? acceptorOrgCode, string? acceptorOrgName)
+        {
+            AcceptorId = userId;
+            AcceptorName = userName;
+            AcceptorStaffNo = staffNo;
+            AcceptorOrgCode = acceptorOrgCode;
+            AcceptorOrgName = acceptorOrgName;
+        }
+
+    }
+    public abstract class PositionEntity : FullStateEntity
+    {
+        /// <summary>
+        /// 经度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "经度")]
+        public double? Longitude { get; set; }
+
+        /// <summary>
+        /// 维度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "纬度")]
+        public double? Latitude { get; set; }
+
+        /// <summary>
+        /// 行政区划编码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "行政区划编码")]
+        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? Street { get; set; }
+
+        /// <summary>
+        /// 行政区划地址
+        /// </summary>
+        public string? Address { get; set; }
+
+        /// <summary>
+        /// 完整地址
+        /// </summary>
+        public string? FullAddress { get; set; }
+    }
+
+}

+ 105 - 0
src/Hotline/JudicialManagement/JudicialManagementOrdersService.cs

@@ -0,0 +1,105 @@
+using DotNetCore.CAP;
+using Hotline.File;
+using Hotline.Orders;
+using MapsterMapper;
+using Microsoft.Extensions.Logging;
+using XF.Domain.Authentications;
+using XF.Domain.Cache;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace Hotline.JudicialManagement
+{
+    public class JudicialManagementOrdersService : IJudicialManagementOrdersService, IScopeDependency
+    {
+        private readonly ISessionContext _sessionContext;
+        private readonly ICapPublisher _capPublisher;
+        private readonly IMapper _mapper;
+        private readonly ILogger<OrderDomainService> _logger;
+        private readonly IFileRepository _fileRepository;
+        private readonly ITypedCache<CacheOrderNO> _cacheOrderNo;
+        private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
+
+        public JudicialManagementOrdersService(ISessionContext sessionContext,
+               ICapPublisher capPublisher,
+               IMapper mapper,
+               ILogger<OrderDomainService> logger,
+               IFileRepository fileRepository,
+               ITypedCache<CacheOrderNO> cacheOrderNo,
+               IRepository<JudicialManagementOrders> judicialManagementOrdersRepository)
+        {
+            _sessionContext = sessionContext;
+            _capPublisher = capPublisher;
+            _mapper = mapper;
+            _logger = logger;
+            _fileRepository = fileRepository;
+            _cacheOrderNo = cacheOrderNo;
+            _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
+        }
+
+        public async Task<string> AddAsync(JudicialManagementOrders order, bool autoAccept = false, CancellationToken cancellationToken = default)
+        {
+            if (autoAccept)
+            {
+                order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo, _sessionContext.RequiredOrgId, _sessionContext.OrgName);
+            }
+            order.Init();
+            var no = GenerateNewOrderNoSF();
+            order.No = no + "SF";
+            order.Password = Random.Shared.Next(100000, 1000000).ToString();
+            order.ProvinceNo ??= GenerateNewProvinceNoSF(no, order.SourceChannelCode);
+            return await _judicialManagementOrdersRepository.AddAsync(order, cancellationToken);
+        }
+
+
+        private string GenerateNewOrderNoSF()
+        {
+            var today = DateTime.Today;
+            var cacheKey = $"{today:yyyyMMdd}SF";
+            var cacheOrderNo = _cacheOrderNo.GetOrSet(cacheKey, f =>
+            {
+                var todayOrderCount = _judicialManagementOrdersRepository.Queryable()
+                    .CountAsync(d => d.CreationTime.Date == today.Date)
+                    .GetAwaiter()
+                    .GetResult();
+                return new CacheOrderNO { TotalCount = todayOrderCount };
+            }, TimeSpan.FromDays(1));
+            cacheOrderNo!.TotalCount += 1;
+            var no = GenerateOrderNo(today, cacheOrderNo.TotalCount);
+            _cacheOrderNo.Set(cacheKey, cacheOrderNo);
+            return no;
+        }
+
+        private string GenerateNewProvinceNoSF(string no, string sourceChannelCode)
+        {
+            //诉求渠道+成员单位标识+行政区划代码+年月日+流水号
+            //成员单位标识  99
+            //宜宾市 511500  市级
+            var today = DateTime.Today;
+            //var count = no.Substring(no.Length - 5);
+
+            //todo 双系统并行暂时执行此方案
+            var count = no.Substring(no.Length - 4);
+            count = (Convert.ToInt32(count) + 500000).ToString();
+
+            var provinceCodes = new[] { "RGDH", "WX", "WB", "AP", "WZ", "YJ", "SCZWFWW", "XCX", "QT" };
+            var prefix = provinceCodes.Any(d => d.Equals(sourceChannelCode))
+                ? sourceChannelCode
+                : "QT";
+            return $"{prefix}99511500{today:yyMMdd}{count}";
+        }
+
+
+        private string GenerateOrderNo(DateTime today, int count)
+        {
+            return $"{today:yyyyMMdd}{count:000000}";
+        }
+
+    }
+
+    public class CacheOrderNO
+    {
+        public int TotalCount { get; set; }
+    }
+}
+