using DotNetCore.CAP;
using Hotline.Api.Filter;
using Hotline.Application.ExportExcel;
using Hotline.Application.FlowEngine;
using Hotline.Application.Orders;
using Hotline.Application.Quality;
using Hotline.Caching.Interfaces;
using Hotline.CallCenter.Calls;
using Hotline.Enterprise;
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.Extensions;
using Hotline.Repository.SqlSugar.Ts;
using Hotline.SeedData;
using Hotline.Settings;
using Hotline.Settings.Hotspots;
using Hotline.Settings.TimeLimits;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.Enterprise;
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.Quality;
using Hotline.Share.Enums.Settings;
using Hotline.Share.Requests;
using Hotline.Tools;
using Hotline.Users;
using Hotline.YbEnterprise.Sdk;
using MapsterMapper;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.OpenApi.Writers;
using MiniExcelLibs;
using MongoDB.Driver;
using NPOI.SS.Formula.Functions;
using NPOI.SS.Util;
using Org.BouncyCastle.Utilities;
using SqlSugar;
using StackExchange.Redis;
using System.Diagnostics.Tracing;
using XF.Domain.Authentications;
using XF.Domain.Cache;
using XF.Domain.Constants;
using XF.Domain.Entities;
using XF.Domain.Exceptions;
using XF.Domain.Repository;
using XF.Utility.EnumExtensions;
namespace Hotline.Api.Controllers;
///
/// 工单
///
public class OrderController : BaseController
{
private readonly IOrderDomainService _orderDomainService;
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 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 IRepository _trCallRecordRepository;
private readonly IOrderApplication _orderApplication;
private readonly IEnterpriseService _enterpriseService;
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;
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,
IRepository trCallRecordRepository,
IOrderApplication orderApplication,
IEnterpriseService enterpriseService,
IPushDomainService pushDomainService,
ILogger logger,
ITypedCache cacheResponse,
IRepository orderSendBackAuditRepository,
IRepository userRepository,
IExportApplication exportApplication,
IRepository transpondCityRawDataRepository,
IRepository orderSpecialDetailRepository,
IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
IRepository orderCopyRepository,
IRepository externalCitizensRepository,
IRepository orderModifyingRecordsRepository
)
{
_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;
_trCallRecordRepository = trCallRecordRepository;
_logger = logger;
_orderApplication = orderApplication;
_enterpriseService = enterpriseService;
_pushDomainService = pushDomainService;
_cacheResponse = cacheResponse;
_orderSendBackAuditRepository = orderSendBackAuditRepository;
_userRepository = userRepository;
_exportApplication = exportApplication;
_transpondCityRawDataRepository = transpondCityRawDataRepository;
_orderSpecialDetailRepository = orderSpecialDetailRepository;
_orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
_orderCopyRepository = orderCopyRepository;
_externalCitizensRepository = externalCitizensRepository;
_orderModifyingRecordsRepository = orderModifyingRecordsRepository;
}
#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 == dto.No)
.WhereIF(dto.PubState == EPubState.Pub, d => d.Status >= EOrderStatus.Published)
.WhereIF(dto.PubState == EPubState.NoPub, d => d.Status < EOrderStatus.Published)
//.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.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.OrderPublish.CreationTime >= dto.CreationTimeStart)
.WhereIF(dto.FiledTimeEnd.HasValue, d => d.OrderPublish.CreationTime <= dto.CreationTimeEnd)
.WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.WaitForPublisherId == _sessionContext.RequiredUserId)
.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)
{
foreach (var item in dto.Ids)
{
var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
if (order != null)
{
try
{
OrderPublish orderPublish = new OrderPublish();
orderPublish.OrderId = order.Id;
orderPublish.No = order.No;
orderPublish.PublishState = false;//当前写死为false
orderPublish.ArrangeTitle = order.Title;
orderPublish.ArrangeContent = order.Content;
orderPublish.ArrangeOpinion = order.ActualOpinion;
orderPublish.ProPublishState = false;
orderPublish.FeedBackPhone = order.Contact;
orderPublish.CreatorName = _sessionContext.UserName;
await _orderPublishRepository.AddAsync(orderPublish);
order.Publish(orderPublish.PublishState);
await _orderRepository.UpdateAsync(order);
//推省上
var publishPublishOrder = _mapper.Map(orderPublish);
publishPublishOrder.Order = _mapper.Map(order);
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
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 is { ProcessType: EProcessType.Zhiban, CounterSignType: null })
{
orderVisit.VisitState = EVisitState.Visited;
}
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;
var orgDetail = new OrderVisitDetail();
orgDetail.VisitId = visitId;
orgDetail.VisitOrgCode = order.ActualHandleOrgCode;
orgDetail.VisitOrgName = order.ActualHandleOrgName;
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 })
{
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);
}
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("未找到工单,无法发布");
//新增发布工单
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);
await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
var orderVisit = new OrderVisit();
orderVisit.No = order.No;
orderVisit.OrderId = order.Id;
orderVisit.VisitState = EVisitState.WaitForVisit;
orderVisit.PublishTime = DateTime.Now;
orderVisit.IsCanHandle = true;
orderVisit.EmployeeId = _sessionContext.RequiredUserId;
if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null })
{
orderVisit.VisitState = EVisitState.Visited;
}
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 })
{
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);
//推送回访信息
//推门户
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.ActualOpinion,
NetizenEvaluateType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.NetizenEvaluateType).Select(x => new Kv { Key = x.DicDataValue, Value = x.DicDataName }).ToList()
};
var (idName, idNames) =
await _workflowDomainService.GetUnvisitOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
res.ActualHandleOrgName = idName;
res.idNames = idNames.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 == dto.No!)
.WhereIF(dto.Resolve.HasValue, x => x.Resolve == dto.Resolve)
.OrderBy(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);
}
#endregion
#region 工单回访
///
/// 回访列表
///
///
///
[HttpGet("visit")]
public async Task> QueryOrderVisitList([FromQuery] QueryOrderVisitDto dto)
{
var (total, items) = await _orderVisitRepository.Queryable()
.Includes(x => x.Order)
.Includes(x => x.Employee)
.Includes(x => x.OrderVisitDetails)
.WhereIF(dto.VisitState == EVisitStateQuery.NoVisit,
x => (x.VisitState == EVisitState.WaitForVisit ||
x.VisitState == EVisitState.NoSatisfiedWaitForVisit) &&
x.Order.IsProvince == false)
.WhereIF(dto.VisitState == EVisitStateQuery.Visited, x => x.VisitState == EVisitState.Visited)
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.StartsWith(dto.Keyword!))
.WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
.WhereIF(dto.VisitType != null, x => x.VisitType == dto.VisitType)
.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
.WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
.WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.Order.CounterSignType == null)
.WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.EmployeeId == _sessionContext.RequiredUserId)
.OrderByDescending(x => x.PublishTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 回访查询基础数据
///
///
[HttpGet("visit/basedata")]
public async Task