using Hotline.Application.FlowEngine; using Hotline.Caching.Interfaces; using Hotline.FlowEngine.WorkflowModules; 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.Order; using MapsterMapper; using Microsoft.AspNetCore.Mvc; using SqlSugar; using XF.Domain.Authentications; using XF.Domain.Exceptions; using XF.Domain.Repository; using XF.Utility.EnumExtensions; namespace Hotline.Api.Controllers { public class EnforcementOrderController : BaseController { private readonly IRepository _enforcementOrdersRepository; private readonly IRepository _judicialComplaintsEventTypeRepository; private readonly IRepository _enforcementHotspotRepository; private readonly IMapper _mapper; private readonly IWorkflowApplication _workflowApplication; private readonly ISystemDicDataCacheManager _sysDicDataCacheManager; private readonly IRepository _systemOrganizeRepository; private readonly ISessionContext _sessionContext; private readonly IRepository _systemAreaRepository; /// /// /// /// /// /// /// /// /// /// /// /// public EnforcementOrderController(IRepository enforcementOrdersRepository, IRepository judicialComplaintsEventTypeRepository, IRepository enforcementHotspotRepository, IMapper mapper, IWorkflowApplication workflowApplication, ISystemDicDataCacheManager sysDicDataCacheManager, IRepository systemOrganizeRepository, ISessionContext sessionContext, IRepository systemAreaRepository ) { _enforcementOrdersRepository = enforcementOrdersRepository; _judicialComplaintsEventTypeRepository = judicialComplaintsEventTypeRepository; _enforcementHotspotRepository = enforcementHotspotRepository; _mapper = mapper; _workflowApplication = workflowApplication; _sysDicDataCacheManager = sysDicDataCacheManager; _systemOrganizeRepository = systemOrganizeRepository; _sessionContext = sessionContext; _systemAreaRepository = systemAreaRepository; } /// /// 司法行政监督管理工单查询 /// /// /// [HttpGet("getorderlist")] public async Task> GetOrderList([FromQuery] QueryEnforcementOrderDto dto) { var areaCode = _sessionContext.OrgAreaCode ?? "511500"; var (total, items) = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .WhereIF(areaCode != "511500", d => d.Order.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.Order.Title.Contains(dto.Title!)) //标题 .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.Order.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号 .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No)) //工单编码 .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.Order.AcceptTypeCode)) //受理类型 .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.Order.SourceChannelCode)) //来源渠道 .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.Order.HotspotId)) //热点类型 .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.Order.TransferPhone.Contains(dto.TransferPhone!)) //转接号码 .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.Order.ActualHandleOrgCode)) //接办部门 .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Order.AcceptorName.Contains(dto.NameOrNo!) || d.Order.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席 .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始 .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束 .WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.Order.EmergencyLevel)) //紧急程度 .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.Order.FromPhone.Contains(dto.FromPhone)) //来电号码 .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Order.Contact.Contains(dto.PhoneNo!)) //联系电话 .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.Order.PushTypeCode == dto.PushTypeCode) //推送分类 .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.Order.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始 .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.Order.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束 .WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Order.Status)) //工单状态 .WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Order.Status <= EOrderStatus.SpecialToUnAccept) .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.Order.ActualHandlerName.Contains(dto.ActualHandlerName)) //接办人 .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.Order.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点 .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始 .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.Order.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束 .WhereIF(dto.IsOverTime == true, d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) || (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期 .WhereIF(dto.IsOverTime == false, d => (d.Order.ExpiredTime > DateTime.Now && d.Order.Status < EOrderStatus.Filed) || (d.Order.ExpiredTime > d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //否 超期 .WhereIF(dto.IdentityType != null, d => d.Order.IdentityType == dto.IdentityType) //来电主体 .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.Order.FromName.Contains(dto.FromName)) //来电人姓名 .WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.Order.AreaCode)) //区域 .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true) .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false) .OrderByDescending(d => d.CreationTime) .ToPagedListAsync(dto, HttpContext.RequestAborted); var data = _mapper.Map>(items); if (_sessionContext.RequiredOrgId == "001188") { foreach (var item in data) { if (item.IsTheClueTrue.HasValue) item.IsShowUpdateButton = true; } } return new PagedDto(total, data); } /// /// 列表页面基础数据 /// /// [HttpGet("base-data")] public async Task BaseData() { var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted); var definition = wfModule.Definition; var orgList = await _systemOrganizeRepository.Queryable().OrderBy(d => d.Id).ToTreeAsync(x => x.Children, it => it.ParentId, null); var judicialManagementOrg = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.JudicialManagementOrg); List OrgsOptions = new(); foreach (var item in judicialManagementOrg) { var tempOrg = orgList.Find(p => p.Id == item.DicDataValue); if (tempOrg != null) OrgsOptions.Add(tempOrg); } var rsp = new { AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType), ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel), OrgsOptions, EmergencyLevelOptions = EnumExts.GetDescriptions(), PushTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PushType), OrderStatusOptions = EnumExts.GetDescriptions(), CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)), IdentityTypeOptions = EnumExts.GetDescriptions(), EnforcementHotspot = await _enforcementHotspotRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id) }; return rsp; } /// /// 获取省市区树形 /// /// [HttpGet("area/tree")] public async Task> 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); } } /// /// 线索核实 /// /// /// [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 _enforcementOrdersRepository.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 _enforcementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted); } } /// /// 行政执法活动投诉事项类型- 获取层级分类 /// /// [HttpGet("treelist")] public async Task> GetTreeList() { return await _judicialComplaintsEventTypeRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id); } /// /// 事项分类统计 /// /// /// /// /// /// [HttpGet("event_classification_statistics")] public async Task GetEventClassificationStatisticsAsync(DateTime StartDate, DateTime EndDate, string Id, string AreaCode) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var items = await _judicialComplaintsEventTypeRepository.Queryable() .LeftJoin((x, o) => o.EventTypeSpliceName != null && (x.EventTypeName == o.EventTypeSpliceName || o.EventTypeSpliceName.Contains(x.EventTypeName))) .LeftJoin((x, o, p) => p.Id == o.Id) .Where((x, o, p) => p.StartTime >= StartDate && p.StartTime <= EndDate) .WhereIF(!string.IsNullOrEmpty(AreaCode), (x, o, p) => p.AreaCode == AreaCode) .Where((x, o, p) => x.ParentId == Id) .GroupBy((x, o, p) => new { x.Id, x.EventTypeName }) .Select((x, o, p) => new { Id = x.Id, Name = x.EventTypeName, Num = SqlFunc.AggregateSum(SqlFunc.IIF(p.Id != null, 1, 0)), Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.EventTypeName != o.EventTypeName, 1, 0)) > 0, }) .MergeTable() .ToListAsync(); var data = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .Where(d => d.Order.StartTime >= StartDate && d.Order.StartTime <= EndDate) .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, 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 }; } /// /// 事项分类统计--明细 /// /// /// [HttpGet("event_classification_statistics_order_list")] public async Task> GetEventClassificationStatisticsOrderListAsync([FromQuery] QueryEventClassificationStatisticsDto dto) { dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1); var (total, items) = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .Where(d => d.Order.StartTime >= dto.StartDate && d.Order.StartTime <= dto.EndDate && d.EventTypeId != null) .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => d.EventTypeId.StartsWith(dto.EventTypeId)) .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.Order.AreaCode == dto.AreaCode) .OrderByDescending(d => d.CreationTime) .ToPagedListAsync(dto, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 执法部门办件统计 /// /// /// /// [HttpGet("enforcement_departmental_processing_statistics")] public async Task GetDepartmentalProcessingStatisticsAsync(DateTime StartDate, DateTime EndDate) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var data = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .Where(d => d.Order.StartTime >= StartDate && d.Order.StartTime <= EndDate) .GroupBy(d => new { OrgCode = d.Order.OrgLevelOneCode, OrgName = d.Order.OrgLevelOneName }) .Select(d => new { OrgCode = d.Order.OrgLevelOneCode, OrgName = d.Order.OrgLevelOneName, CountNum = SqlFunc.AggregateCount(d.Order.OrgLevelOneCode), 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, 1, 0)) }) .ToListAsync(); return data; } /// /// 执法部门办件统计---子级 /// /// /// /// /// [HttpGet("enforcement_departmental_processing_statistics_child")] public async Task GetDepartmentalProcessingStatisticsChildAsync(DateTime StartDate, DateTime EndDate, string OrgCode) { EndDate = EndDate.AddDays(1).AddSeconds(-1); if (string.IsNullOrEmpty(OrgCode)) throw UserFriendlyException.SameMessage("部门code不能为空!"); var data = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .Where(d => d.Order.StartTime >= StartDate && d.Order.StartTime <= EndDate) .WhereIF(OrgCode == "001", d => d.Order.ActualHandleOrgCode == OrgCode) .WhereIF(OrgCode != "001", d => d.Order.ActualHandleOrgCode.StartsWith(OrgCode)) .GroupBy(d => new { OrgCode = d.Order.ActualHandleOrgCode, OrgName = d.Order.ActualHandleOrgName }) .Select(d => new { OrgCode = d.Order.ActualHandleOrgCode, OrgName = d.Order.ActualHandleOrgName, CountNum = SqlFunc.AggregateCount(d.Order.ActualHandleOrgCode), 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, 1, 0)), }) .ToListAsync(); return data; } /// /// 执法部门办件统计---明细 /// /// /// [HttpGet("enforcement_departmental_processing_statistics_order_list")] public async Task> GetDepartmentalProcessingStatisticsOrderListAsync([FromQuery] QueryDepartmentalProcessingStatisticsDto dto) { dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1); var (total, items) = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .Where(d => d.Order.StartTime >= dto.StartDate && d.Order.StartTime <= dto.EndDate) .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", d => d.Order.ActualHandleOrgCode == dto.OrgCode) .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", d => d.Order.ActualHandleOrgCode.StartsWith(dto.OrgCode)) .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(total, _mapper.Map>(items)); } /// /// 区域分类统计 /// /// [HttpGet("regional_classification_statistics")] public async Task GetRegionalClassificationStatisticsAsync(DateTime StartDate, DateTime EndDate) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var areaCode = _sessionContext.OrgAreaCode ?? "511500"; var list = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(x => x.Order.Id != null) .Where(x => x.Order.StartTime >= StartDate && x.Order.StartTime <= EndDate) .LeftJoin((x, o) => x.Order.AreaCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")) == o.Id) .Where((x, o) => x.Order.Status >= EOrderStatus.Filed) .WhereIF(areaCode != "511500", (x, o) => x.Order.AreaCode.StartsWith(areaCode)) .GroupBy((x, o) => new { AreaCode = x.Order.AreaCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), o.AreaName, }) .Select((x, o) => new { AreaCode = x.Order.AreaCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), AreaName = o.AreaName, OrderCountNum = SqlFunc.AggregateCount(x.Order.AreaCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("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, 1, 0)) }).MergeTable() .Where(x => x.AreaCode != "519800" && x.AreaCode != "519900") .OrderByDescending(it => it.OrderCountNum) .ToListAsync(); return list; } /// /// 区域分类统计---明细 /// /// /// [HttpGet("regional_classification_statistics_order_list")] public async Task> GetRegionalClassificationStatisticsOrderListAsync([FromQuery] QueryRegionalClassificationStatisticsDto dto) { dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1); var (total, items) = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(d => d.Order.Id != null) .Where(d => d.Order.StartTime >= dto.StartDate && d.Order.StartTime <= dto.EndDate) .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.Order.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(total, _mapper.Map>(items)); } /// /// 部门满意度统计 /// /// /// /// 1:办件结果 2:办件态度 /// [HttpGet("enforcement_visit_org_satisfaction_statistics")] public async Task GetVisitAndOrgSatisfactionStatisticsAsync(DateTime StartDate, DateTime EndDate, int TypeId) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.OrderId) .LeftJoin((x, o, p) => o.Id == p.VisitId) .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org && o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode)) .GroupBy((x, o, p) => new { VisitOrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")) }) .Select((x, o, p) => new VisitAndOrgSatisfactionStatisticsDto() { OrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), TotalSumCount = SqlFunc.AggregateCount(p.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("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((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 }; } /// /// 部门满意度统计----子级 /// /// /// /// 1:办件结果 2:办件态度 /// /// [HttpGet("enforcement_visit_org_satisfaction_statistics_child")] public async Task GetVisitAndOrgSatisfactionStatisticsChildAsync(DateTime StartDate, DateTime EndDate, int TypeId, string OrgCode) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.OrderId) .LeftJoin((x, o, p) => o.Id == p.VisitId) .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org) .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode)) .WhereIF(!string.IsNullOrEmpty(OrgCode) && OrgCode == "001", (x, o, p) => p.VisitOrgCode == OrgCode) .WhereIF(!string.IsNullOrEmpty(OrgCode) && OrgCode != "001", (x, o, p) => p.VisitOrgCode.StartsWith(OrgCode)) .GroupBy((x, o, p) => new { VisitOrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("9")) }) .Select((x, o, p) => new VisitAndOrgSatisfactionStatisticsDto() { OrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("9")), TotalSumCount = SqlFunc.AggregateCount(p.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("9"))), 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((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 }; } /// /// 部门满意度统计---明细 /// /// /// [HttpGet("enforcement_visit_org_satisfaction_statistics_order_list")] public async Task> GetVisitAndOrgSatisfactionStatisticsOrderListAsync([FromQuery] QueryOrgSatisfactionStatisticsDto dto) { dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1); var (total, items) = await _enforcementOrdersRepository.Queryable() .Includes(x => x.Order) .Where(x => x.Order.Id != null) .LeftJoin((x, o) => x.Id == o.OrderId) .LeftJoin((x, o, p) => o.Id == p.VisitId) .Where((x, o, p) => o.VisitTime >= dto.StartDate && o.VisitTime <= dto.EndDate && 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(total, _mapper.Map>(items)); } } }