using DotNetCore.CAP;
using Hotline.Api.Filter;
using Hotline.Application.CallCenter;
using Hotline.Application.ExportExcel;
using Hotline.Application.FlowEngine;
using Hotline.Application.Orders;
using Hotline.Application.Quality;
using Hotline.Application.Systems;
using Hotline.Caching.Interfaces;
using Hotline.Configurations;
using Hotline.ContingencyManagement.Notifies;
using Hotline.EventBus;
using Hotline.File;
using Hotline.FlowEngine.Definitions;
using Hotline.FlowEngine.WorkflowModules;
using Hotline.FlowEngine.Workflows;
using Hotline.Import;
using Hotline.Orders;
using Hotline.Orders.Notifications;
using Hotline.OrderTranspond;
using Hotline.Permissions;
using Hotline.Push.FWMessage;
using Hotline.Push.Notifies;
using Hotline.Repository.SqlSugar.CallCenter;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Repository.SqlSugar.Ts;
using Hotline.SeedData;
using Hotline.Settings;
using Hotline.Settings.Hotspots;
using Hotline.Settings.TimeLimitDomain;
using Hotline.Settings.TimeLimits;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.FlowEngine;
using Hotline.Share.Dtos.FlowEngine.Workflow;
using Hotline.Share.Dtos.Order;
using Hotline.Share.Dtos.Order.Migration;
using Hotline.Share.Dtos.Order.Publish;
using Hotline.Share.Dtos.Settings;
using Hotline.Share.Enums.CallCenter;
using Hotline.Share.Enums.FlowEngine;
using Hotline.Share.Enums.Order;
using Hotline.Share.Enums.Push;
using Hotline.Share.Enums.Settings;
using Hotline.Share.Requests;
using Hotline.Share.Tools;
using Hotline.Tools;
using Hotline.Users;
using Hotline.YbEnterprise.Sdk;
using Mapster;
using MapsterMapper;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MiniExcelLibs;
using SqlSugar;
using System.Text;
using System.Text.Json;
using Hotline.Share.Dtos.Order.Handle;
using XF.Domain.Authentications;
using XF.Domain.Cache;
using XF.Domain.Entities;
using XF.Domain.Exceptions;
using XF.Domain.Repository;
using XF.Utility.EnumExtensions;
using Hotline.Application.Contracts.Validators.FlowEngine;
using Hotline.Authentications;
using Microsoft.AspNetCore.Components;
using Quartz.Simpl;
using static Lucene.Net.Util.Fst.Util;
using DocumentFormat.OpenXml.Spreadsheet;
namespace Hotline.Api.Controllers;
///
/// 工单
///
public class OrderController : BaseController
{
#region 注入
private readonly IOrderDomainService _orderDomainService;
private readonly BaseDataApplication _baseDataApplication;
private readonly IOrderRepository _orderRepository;
private readonly IWorkflowApplication _workflowApplication;
private readonly IWorkflowDomainService _workflowDomainService;
private readonly IRepository _hotspotTypeRepository;
private readonly ISystemOrganizeRepository _organizeRepository;
private readonly IDefinitionDomainService _definitionDomainService;
private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
private readonly ITypedCache _typeCache;
private readonly ISessionContext _sessionContext;
private readonly IMapper _mapper;
private readonly IMediator _mediator;
private readonly IRepository _orderPublishRepository;
private readonly IRepository _orderVisitRepository;
private readonly IRepository _orderVisitedDetailRepository;
private readonly ICapPublisher _capPublisher;
private readonly IOrderDelayRepository _orderDelayRepository;
private readonly ITimeLimitDomainService _timeLimitDomainService;
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
private readonly IRepository _orderRedoRepository;
private readonly IRepository _orderSuperviseRepository;
private readonly IRepository _orderUrgeRepository;
private readonly IFileRepository _fileRepository;
private readonly IOrderScreenRepository _orderScreenRepository;
private readonly IRepository _orderPublishHistoryRepository;
private readonly IRepositoryTextSearch _repositoryts;
private readonly IQualityApplication _qualityApplication;
private readonly IRepository _workflowRepository;
private readonly IRepository _workflowStepRepository;
private readonly ICitizenRepository _citizenRepository;
private readonly IRepository _labelDetailRepository;
private readonly IRepository _repeatableEventRepository;
private readonly IRepeatableEventDetailRepository _repeatableEventDetailRepository;
private readonly IRepository _orderWrodRepository;
private readonly IRepository _orderObserveRepository;
private readonly IRepository _orderVisitApplyRepository;
private readonly IRepository _orderFinalityRepository;
private readonly IRepository _orderSendBackRepository;
private readonly IRepository _orderSpecialRepository;
private readonly IRepository _workflowTraceRepository;
private readonly IOrderApplication _orderApplication;
private readonly IPushDomainService _pushDomainService;
private readonly ILogger _logger;
private readonly ITypedCache _cacheResponse;
private readonly IRepository _orderSendBackAuditRepository;
private readonly IRepository _userRepository;
private readonly IExportApplication _exportApplication;
private readonly IRepository _transpondCityRawDataRepository;
private readonly IRepository _orderSpecialDetailRepository;
private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
private readonly IRepository _orderCopyRepository;
private readonly IRepository _externalCitizensRepository;
private readonly IRepository _orderModifyingRecordsRepository;
private readonly ICallApplication _callApplication;
private readonly ICallNativeRepository _callNativeRepository;
private readonly IOptionsSnapshot _appOptions;
private readonly IOrderSendBackAuditApplication _orderSendBackAuditApplication;
private readonly Publisher _publisher;
private readonly ICallNativeApplication _callNativeApplication;
private readonly IOrderAnalysisApplication _orderAnalysisApplication;
private readonly ICalcExpireTime _expireTime;
private readonly IRepository _orderPushTypeRepository;
private readonly IRepository _orderRevokeRepository;
private readonly IOrderTerminateRepository _orderTerminateRepository;
public OrderController(
IOrderDomainService orderDomainService,
IOrderRepository orderRepository,
IWorkflowApplication workflowApplication,
IWorkflowDomainService workflowDomainService,
IRepository hotspotTypeRepository,
ISystemOrganizeRepository organizeRepository,
IDefinitionDomainService definitionDomainService,
ISystemDicDataCacheManager sysDicDataCacheManager,
ISessionContext sessionContext,
IMapper mapper,
IMediator mediator,
IRepository orderPublishRepository,
IRepository orderVisitRepository,
IRepository orderVisitedDetailRepository,
ICapPublisher capPublisher,
IOrderDelayRepository orderDelayRepository,
//ITimeLimitDomainService timeLimitDomainService,
ISystemSettingCacheManager systemSettingCacheManager,
IRepository orderRedoRepository,
IRepository orderSuperviseRepository,
IRepository orderUrgeRepository,
IFileRepository fileRepository,
IOrderScreenRepository orderScreenRepository,
IRepository orderPublishHistoryRepository,
IRepositoryTextSearch repositoryts,
IQualityApplication qualityApplication,
IRepository workflowRepository,
IRepository workflowStepRepository,
ICitizenRepository citizenRepository,
IRepository labelDetailRepository,
IRepository repeatableEventRepository,
IRepeatableEventDetailRepository repeatableEventDetailRepository,
IRepository orderWrodRepository,
IRepository orderObserveRepository,
IRepository orderFinalityRepository,
IRepository orderVisitApplyRepository,
IRepository orderSendBackRepository,
IRepository orderSpecialRepository,
IRepository workflowTraceRepository,
IOrderApplication orderApplication,
IPushDomainService pushDomainService,
ILogger logger,
ITypedCache cacheResponse,
IRepository orderSendBackAuditRepository,
IRepository userRepository,
IExportApplication exportApplication,
IRepository transpondCityRawDataRepository,
IRepository orderSpecialDetailRepository,
IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
IRepository orderCopyRepository,
IRepository externalCitizensRepository,
ICallApplication callApplication,
IOptionsSnapshot appOptions,
IRepository orderModifyingRecordsRepository,
IOrderSendBackAuditApplication orderSendBackAuditApplication,
Publisher publisher,
IOrderAnalysisApplication orderAnalysisApplication,
ICalcExpireTime expireTime,
IRepository orderPushTypeRepository,
ICallNativeRepository callNativeRepository,
ICallNativeApplication callNativeApplication,
IRepository orderRevokeRepository,
BaseDataApplication baseDataApplication,
IOrderTerminateRepository orderTerminateRepository,
ITypedCache typeCache)
{
_orderDomainService = orderDomainService;
_orderRepository = orderRepository;
_workflowApplication = workflowApplication;
_workflowDomainService = workflowDomainService;
_hotspotTypeRepository = hotspotTypeRepository;
_organizeRepository = organizeRepository;
_definitionDomainService = definitionDomainService;
_sysDicDataCacheManager = sysDicDataCacheManager;
_sessionContext = sessionContext;
_mapper = mapper;
_mediator = mediator;
_orderPublishRepository = orderPublishRepository;
_orderVisitRepository = orderVisitRepository;
_orderVisitedDetailRepository = orderVisitedDetailRepository;
_capPublisher = capPublisher;
_orderDelayRepository = orderDelayRepository;
//_timeLimitDomainService = timeLimitDomainService;
_systemSettingCacheManager = systemSettingCacheManager;
_orderRedoRepository = orderRedoRepository;
_orderSuperviseRepository = orderSuperviseRepository;
_orderUrgeRepository = orderUrgeRepository;
_fileRepository = fileRepository;
_orderScreenRepository = orderScreenRepository;
_orderPublishHistoryRepository = orderPublishHistoryRepository;
_repositoryts = repositoryts;
_qualityApplication = qualityApplication;
_workflowRepository = workflowRepository;
_workflowStepRepository = workflowStepRepository;
_citizenRepository = citizenRepository;
_labelDetailRepository = labelDetailRepository;
_repeatableEventRepository = repeatableEventRepository;
_repeatableEventDetailRepository = repeatableEventDetailRepository;
_orderWrodRepository = orderWrodRepository;
_orderObserveRepository = orderObserveRepository;
_orderFinalityRepository = orderFinalityRepository;
_orderVisitApplyRepository = orderVisitApplyRepository;
_orderSendBackRepository = orderSendBackRepository;
_orderSpecialRepository = orderSpecialRepository;
_workflowTraceRepository = workflowTraceRepository;
_logger = logger;
_orderApplication = orderApplication;
_pushDomainService = pushDomainService;
_cacheResponse = cacheResponse;
_orderSendBackAuditRepository = orderSendBackAuditRepository;
_userRepository = userRepository;
_exportApplication = exportApplication;
_transpondCityRawDataRepository = transpondCityRawDataRepository;
_orderSpecialDetailRepository = orderSpecialDetailRepository;
_orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
_orderCopyRepository = orderCopyRepository;
_externalCitizensRepository = externalCitizensRepository;
_orderModifyingRecordsRepository = orderModifyingRecordsRepository;
_callApplication = callApplication;
_appOptions = appOptions;
_orderSendBackAuditApplication = orderSendBackAuditApplication;
_publisher = publisher;
_orderAnalysisApplication = orderAnalysisApplication;
_expireTime = expireTime;
_orderPushTypeRepository = orderPushTypeRepository;
_callNativeRepository = callNativeRepository;
_callNativeApplication = callNativeApplication;
_baseDataApplication = baseDataApplication;
_orderTerminateRepository = orderTerminateRepository;
_orderRevokeRepository = orderRevokeRepository;
_typeCache = typeCache;
_baseDataApplication = baseDataApplication;
}
#endregion
#region 工单发布
///
/// 查询(工单发布)
///
///
///
[HttpGet("publish")]
public async Task> PublishOrderList([FromQuery] QueryOrderPublishDto dto)
{
var (total, items) = await _orderRepository.Queryable()
.Includes(d => d.OrderPublish)
.Where(x => x.Status == EOrderStatus.Filed)
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!))
.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
.WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
.WhereIF(dto.PubState == EPubState.Pub, d => d.Status >= EOrderStatus.Published)
.WhereIF(dto.PubState == EPubState.NoPub, d => d.Status < EOrderStatus.Published)
.WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
.WhereIF(!string.IsNullOrEmpty(dto.OrderTag), d => d.OrderTagCode == dto.OrderTag!) //工单标签
.WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName == dto.CenterToOrgHandlerName!) //派单人
.WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
.WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
.WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
//.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
// d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
.WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
.WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
.WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.CounterSignType != null)
.WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.CounterSignType == null)
.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
.WhereIF(dto.Resolve.HasValue, d => d.OrderPublish.Resolve == dto.Resolve)
.WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
.WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
.WhereIF(dto.FiledTimeStart.HasValue, d => d.FiledTime >= dto.FiledTimeStart)
.WhereIF(dto.FiledTimeEnd.HasValue, d => d.FiledTime <= dto.FiledTimeEnd)
.WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.WaitForPublisherId == _sessionContext.RequiredUserId)
.WhereIF(dto.IsOverTime == true,
d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
(d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
.WhereIF(dto.IsOverTime == false,
d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) ||
(d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
.OrderByDescending(d => d.FiledTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 批量发布工单
///
///
///
[HttpPost("batch-publish")]
public async Task BatchPublishOrder([FromBody] BatchPublishOrderDto dto)
{
var hasHuiQian = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.CounterSignType != null);
if (hasHuiQian)
throw UserFriendlyException.SameMessage("选择的工单中含有会签工单, 不能批量发布. 请排除会签工单.");
var hasProvince = await _orderRepository.Queryable().AnyAsync(x => dto.Ids.Contains(x.Id) && x.IsProvince == true);
if (hasProvince)
throw UserFriendlyException.SameMessage("选择的工单中含有省工单, 不能批量发布. 请排除省工单.");
foreach (var item in dto.Ids)
{
var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
if (order != null && order.Status == EOrderStatus.Filed)
{
try
{
await _orderDomainService.OrderPublishAsync(order, HttpContext.RequestAborted);
}
catch
{
}
}
}
}
///
/// 发布工单
///
///
[Permission(EPermission.PublishOrder)]
[HttpPost("publish")]
[LogFilter("发布工单")]
public async Task PublishOrder([FromBody] PublishOrderDto dto)
{
//验证订单
var order = await _orderRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
if (order is null)
throw UserFriendlyException.SameMessage("未找到工单,无法发布");
if (order.Status != EOrderStatus.Filed)
throw UserFriendlyException.SameMessage("当前状态无法发布");
//新增发布工单
var orderPublish = _mapper.Map(dto);
orderPublish.OrderId = order.Id;
orderPublish.No = order.No;
string id = await _orderPublishRepository.AddAsync(orderPublish);
order.Publish(orderPublish.PublishState);
await _orderRepository.UpdateAsync(order);
//推省上
var publishPublishOrder = _mapper.Map(orderPublish);
publishPublishOrder.Order = _mapper.Map(order);
//查询实际办理附件
if (!string.IsNullOrEmpty(order.ActualHandleStepId))
{
var actualHandleStep = await _workflowStepRepository.GetAsync(order.ActualHandleStepId, HttpContext.RequestAborted);
publishPublishOrder.FileJsons = actualHandleStep?.FileJson;
}
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
//推应急管理局
//是否开启
var isOpenContingencyManagement = _systemSettingCacheManager.GetSetting(SettingConstants.IsOpenContingencyManagement)?.SettingValue[0];
if (isOpenContingencyManagement == "true")
await _publisher.PublishAsync(new ContingencyManagementNotify(order, dto.ArrangeTitle, dto.ArrangeContent, dto.ArrangeOpinion),
PublishStrategy.ParallelWhenAll, HttpContext.RequestAborted);
var orderVisit = new OrderVisit();
orderVisit.No = order.No;
orderVisit.OrderId = order.Id;
orderVisit.VisitState = EVisitState.WaitForVisit;
orderVisit.PublishTime = DateTime.Now;
orderVisit.IsCanHandle = true;
if (!order.IsProvince)
{
orderVisit.EmployeeId = _sessionContext.RequiredUserId;
}
if (_appOptions.Value.IsZiGong)
{
orderVisit.EmployeeId = string.Empty;
}
if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null } && !order.IsProvince)
{
orderVisit.VisitState = EVisitState.Visited;
orderVisit.VisitTime = DateTime.Now;
orderVisit.VisitType = EVisitType.OtherVisit;
orderVisit.NowEvaluate = new Kv() { Key = "4", Value = "满意" };
if (_appOptions.Value.IsZiGong)
{
// 根据禅道 自贡需求 Id_361, 第一条, 3小条需求;
// 直办件归档后自动回访量需统计在“胡玲”的默认回访量中;
orderVisit.EmployeeId = _systemSettingCacheManager.DefaultVisitEmployeeId;
}
}
if (order.CounterSignType != ECounterSignType.Center)
{
orderVisit.IsCanAiVisit = true;
}
string visitId = await _orderVisitRepository.AddAsync(orderVisit);
//新增回访信息
var visitedDetail = new List();
var seatDetail = new OrderVisitDetail();
seatDetail.VisitId = visitId;
seatDetail.VisitTarget = EVisitTarget.Seat;
foreach (var item in dto.IdNames)
{
var orgDetail = new OrderVisitDetail();
orgDetail.VisitId = visitId;
orgDetail.VisitOrgCode = item.Key;
orgDetail.VisitOrgName = item.Value;
orgDetail.VisitTarget = EVisitTarget.Org;
if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null })
{
var satisfy = new Kv() { Key = "4", Value = "满意" };
orgDetail.OrgProcessingResults = satisfy;
//orgDetail.OrgHandledAttitude = satisfy;
}
visitedDetail.Add(orgDetail);
}
if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null, IsProvince: false })
{
seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
order.Visited("4", "满意");
order.Status = EOrderStatus.Visited;
await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
}
visitedDetail.Add(seatDetail);
await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, HttpContext.RequestAborted);
if (orderVisit.VisitState == EVisitState.Visited && !order.IsProvince)
{
//推省上
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
new PublishVisitDto()
{
Order = _mapper.Map(order),
No = orderVisit.No,
VisitType = orderVisit.VisitType,
VisitName = orderVisit.CreatorName,
VisitTime = orderVisit.VisitTime,
VisitRemark = orderVisit.NowEvaluate?.Value,
AreaCode = order.AreaCode!,
SubjectResultSatifyCode = orderVisit.NowEvaluate?.Key,
FirstSatisfactionCode = orderVisit.NowEvaluate?.Key,
ClientGuid = ""
}, cancellationToken: HttpContext.RequestAborted);
}
//推送回访信息
//推门户
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
{
Id = orderVisit.Id,
Order = _mapper.Map(order),
OrderVisitDetails = _mapper.Map>(orderVisit.OrderVisitDetails),
VisitName = _sessionContext.UserName,
VisitTime = orderVisit.VisitTime,
VisitType = orderVisit.VisitType,
VisitState = orderVisit.VisitState,
PublishTime = orderVisit.PublishTime,
}, cancellationToken: HttpContext.RequestAborted);
}
///
/// 发布页面基础信息
///
///
[HttpGet("publish-order-pagebase/{id}")]
public async Task PublishOrderPageBase(string id)
{
var order = await _orderRepository.Queryable()
.Includes(d => d.OrderExtension)
.FirstAsync(d => d.Id == id);
if (order is null)
throw UserFriendlyException.SameMessage("未知工单,无法发布");
var res = new PublishOrderPageBaseDto()
{
SourceChannel = order.SourceChannel,
OrderTitle = order.Title,
Content = order.Content,
ActualOpinion = order.FileOpinion,
NetizenEvaluateType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.NetizenEvaluateType)
.Select(x => new Kv { Key = x.DicDataValue, Value = x.DicDataName }).ToList()
};
var (idName, idNames) = await _workflowDomainService.GetHandleOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
res.ActualHandleOrgName = idName;
res.idNames = order.CounterSignType == null
? null
: idNames.Where(d => d.Key != idName.Key).ToList();
return res;
}
///
/// 已发布列表
///
///
///
[HttpGet("published")]
public async Task> PublishedOrderList([FromQuery] PublishedPagedRequest dto)
{
var (total, items) = await _orderPublishRepository.Queryable()
.Includes(x => x.Order)
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.StartsWith(dto.Keyword!))
.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No!))
.WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title!))
.WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)
.WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd)
.WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.Order.FromPhone == dto.FromPhone) //来电号码
.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName),
d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.Order.AcceptTypeCode == dto.AcceptType) //受理类型
.WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot))
.WhereIF(!string.IsNullOrEmpty(dto.PublishName), d => d.CreatorName.Contains(dto.PublishName!))
.WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
d => d.Order.AcceptorName == dto.NameOrNo! || d.Order.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
.WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
.WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
.WhereIF(dto.Resolve.HasValue, x => x.Resolve == dto.Resolve)
.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)) //否 超期
.OrderByDescending(d => d.CreationTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 发布详情
///
///
///
[HttpGet("published-order/{id}")]
public async Task PublishedOrder(string id)
{
var publishedOrder = await _orderPublishRepository.GetAsync(id, HttpContext.RequestAborted);
if (publishedOrder is null)
{
throw UserFriendlyException.SameMessage("未知数据!");
}
var pubentity = _mapper.Map(publishedOrder);
var visit = await _orderVisitRepository.Queryable().Includes(x => x.OrderVisitDetails)
.OrderByDescending(x => x.CreationTime)
.FirstAsync(x => x.OrderId == publishedOrder.OrderId, HttpContext.RequestAborted);
if (visit != null)
{
var details = visit.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).ToList();
if (details != null && details.Count > 0)
{
pubentity.IdNames = new List();
details.ForEach(f => pubentity.IdNames.Add(new Kv() { Key = f.VisitOrgCode, Value = f.VisitOrgName }));
}
}
return pubentity;
}
///
/// 修改发布内容
///
///
///
[Permission(EPermission.PublishedModify)]
[HttpPost("published-order-modify")]
[LogFilter("修改发布内容")]
public async Task PublishedModify([FromBody] PublishOrderModifyDto dto)
{
var publishOrder = await _orderPublishRepository.Queryable()
.Includes(x => x.Order)
.Where(x => x.Id == dto.Id)
.FirstAsync(HttpContext.RequestAborted);
if (publishOrder is null)
{
throw UserFriendlyException.SameMessage("无效数据");
}
var history = new OrderPublishHistory();
history.ArrangeTitleBefor = publishOrder.ArrangeTitle;
history.ArrangeTitleAfter = dto.ArrangeTitle;
history.ArrangeContentBefor = publishOrder.ArrangeContent;
history.ArrangeContentAfter = dto.ArrangeContent;
history.ArrangeOpinionBefor = publishOrder.ArrangeOpinion;
history.ArrangeOpinionAfter = dto.ArrangeOpinion;
history.PublishStateBefor = publishOrder.PublishState;
history.PublishStateAfter = dto.PublishState;
history.No = publishOrder.No;
history.OrderId = publishOrder.OrderId;
history.OrderPublishId = publishOrder.Id;
publishOrder.ArrangeTitle = dto.ArrangeTitle;
publishOrder.ArrangeContent = dto.ArrangeContent;
publishOrder.ArrangeOpinion = dto.ArrangeOpinion;
publishOrder.PublishState = dto.PublishState;
await _orderPublishRepository.UpdateAsync(publishOrder, HttpContext.RequestAborted);
await _orderPublishHistoryRepository.AddAsync(history, HttpContext.RequestAborted);
//推省上
var publishPublishOrder = _mapper.Map(publishOrder);
publishPublishOrder.Order = _mapper.Map(publishOrder.Order);
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
}
///
/// 发布修改记录
///
///
///
[HttpGet("published-history-list/{id}")]
public async Task> QueryPublishedHistory(string id)
{
return await _orderPublishHistoryRepository.Queryable().Where(x => x.OrderPublishId == id)
.OrderByDescending(x => x.CreationTime).ToListAsync(HttpContext.RequestAborted);
}
///
/// 查询发布平移待办理人
///
[HttpGet("published/migration")]
public async Task> PublishMigration()
{
var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RolePaiDan);
var roles = setting?.SettingValue.ToList();
var users = await _userRepository.Queryable()
.Includes(d => d.Organization)
.Includes(d => d.Roles)
.Where(d => d.Roles.Any(x => roles.Contains(x.Name)))
.ToListAsync(HttpContext.RequestAborted);
return users.Select(d => new OrderMigrationHandler
{
UserId = d.Id,
Username = d.Name,
OrgId = d.OrgId,
OrgName = d.Organization.Name,
RoleNames = string.Join(',', d.Roles.Select(x => x.DisplayName).ToList())
}).ToList();
}
///
/// 发布平移
///
[HttpPost("publish/migration")]
public async Task PublishMigrationBatch([FromBody] PublishMigrationDto dto)
{
var orders = await _orderRepository.Queryable()
.Where(d => dto.OrderIds.Contains(d.Id) && d.Status == EOrderStatus.Filed)
.ToListAsync(HttpContext.RequestAborted);
foreach (var order in orders)
{
order.WaitForPublisherId = dto.UserId;
}
await _orderRepository.UpdateRangeAsync(orders, HttpContext.RequestAborted);
}
///
/// 列表页面基础数据
///
///
[HttpGet("publish/base-data")]
public async Task