using DotNetCore.CAP;
using Hotline.Application.FlowEngine;
using Hotline.Caching.Interfaces;
using Hotline.File;
using Hotline.FlowEngine.Definitions;
using Hotline.FlowEngine.Workflows;
using Hotline.Orders;
using Hotline.Orders.Notifications;
using Hotline.Permissions;
using Hotline.Quality;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Repository.SqlSugar.Ts;
using Hotline.Settings;
using Hotline.Settings.Hotspots;
using Hotline.Settings.TimeLimits;
using Hotline.Share.Dtos;
using Hotline.Share.Dtos.FlowEngine;
using Hotline.Share.Dtos.Order;
using Hotline.Share.Dtos.Settings;
using Hotline.Share.Enums.Order;
using Hotline.Share.Enums.Quality;
using Hotline.Share.Enums.Settings;
using Hotline.Share.Mq;
using Hotline.Share.Requests;
using MapsterMapper;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Hotline.FlowEngine.WorkflowModules;
using Hotline.Share.Enums.FlowEngine;
using XF.Domain.Authentications;
using XF.Domain.Constants;
using XF.Domain.Exceptions;
using XF.Domain.Repository;
using XF.Utility.EnumExtensions;
using Hotline.CallCenter.Calls;
using Hotline.DataSharing.Province.Services;
using Hotline.Share.Dtos.File;
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 IProvinceService _provinceService;
private readonly IRepository _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 IRepository _orderScreenRepository;
private readonly IRepository _orderPublishHistoryRepository;
private readonly IRepositoryTextSearch _repositoryts;
private readonly IQualityRepository _qualityRepository;
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;
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,
IProvinceService provinceService,
IRepository orderDelayRepository,
ITimeLimitDomainService timeLimitDomainService,
ISystemSettingCacheManager systemSettingCacheManager,
IRepository orderRedoRepository,
IRepository orderSuperviseRepository,
IRepository orderUrgeRepository,
IFileRepository fileRepository,
IRepository orderScreenRepository,
IRepository orderPublishHistoryRepository,
IRepositoryTextSearch repositoryts,
IQualityRepository qualityRepository,
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
)
{
_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;
_provinceService = provinceService;
_orderDelayRepository = orderDelayRepository;
_timeLimitDomainService = timeLimitDomainService;
_systemSettingCacheManager = systemSettingCacheManager;
_orderRedoRepository = orderRedoRepository;
_orderSuperviseRepository = orderSuperviseRepository;
_orderUrgeRepository = orderUrgeRepository;
_fileRepository = fileRepository;
_orderScreenRepository = orderScreenRepository;
_orderPublishHistoryRepository = orderPublishHistoryRepository;
_repositoryts = repositoryts;
_qualityRepository = qualityRepository;
_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;
}
#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.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
.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.Acceptor.Name.Contains(dto.PubMan!) || d.Acceptor.StaffNo.Contains(dto.PubMan!))
.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
.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)
.OrderBy(d => d.CreationTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 发布工单
///
///
[Permission(EPermission.PublishOrder)]
[HttpPost("publish")]
public async Task PublishOrder([FromBody] PublishOrderDto dto)
{
//验证订单
var order = await _orderRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
if (order is null)
throw UserFriendlyException.SameMessage("未找到工单,无法发布");
//新增发布工单
OrderPublish orderPublish = new OrderPublish();
orderPublish.OrderId = order.Id;
orderPublish.No = order.No;
orderPublish.PublishState = dto.PublishState;
orderPublish.ArrangeTitle = dto.ArrangeTitle;
orderPublish.ArrangeContent = dto.ArrangeContent;
orderPublish.ArrangeOpinion = dto.ArrangeOpinion;
orderPublish.ProPublishState = dto.ProPublishState;
orderPublish.FeedBackPhone = dto.FeedBackPhone;
orderPublish.NoPubReason = dto.NoPubReason;
orderPublish.CreatorName = _sessionContext.UserName;
string id = await _orderPublishRepository.AddAsync(orderPublish);
order.Publish(orderPublish.PublishState);
await _orderRepository.UpdateAsync(order);
//TODO 推省上
try
{
var publishPublishOrder = _mapper.Map(orderPublish);
publishPublishOrder.Order = _mapper.Map(order);
}
catch {}
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;
}
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);
}
///
/// 发布页面基础信息
///
///
[HttpGet("publish-order-pagebase/{id}")]
public async Task PublishOrderPageBase(string id)
{
var order = await _orderRepository.Queryable()
.Includes(d => d.Acceptor)
.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
};
var (idName, idNames) =
await _workflowDomainService.GetUnvisitOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
res.ActualHandleOrgName = idName;
res.idNames = idNames.ToList();
return res;
}
///
/// 已发布列表
///
///
///
[Permission(EPermission.PublishedOrderList)]
[HttpGet("published")]
public async Task> PublishedOrderList([FromQuery] PagedKeywordRequest dto)
{
var (total, items) = await _orderPublishRepository.Queryable()
.Includes(x => x.Order)
.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
.OrderBy(d => d.CreationTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 发布详情
///
///
///
[Permission(EPermission.PublishedOrder)]
[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")]
public async Task PublishedModify([FromBody] PublishOrderModifyDto dto)
{
var publishOrder = await _orderPublishRepository.GetAsync(dto.Id, 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.No = publishOrder.No;
history.OrderId = publishOrder.OrderId;
history.OrderPublishId = publishOrder.Id;
publishOrder.ArrangeTitle = dto.ArrangeTitle;
publishOrder.ArrangeContent = dto.ArrangeContent;
publishOrder.ArrangeOpinion = dto.ArrangeOpinion;
await _orderPublishRepository.UpdateAsync(publishOrder, HttpContext.RequestAborted);
await _orderPublishHistoryRepository.AddAsync(history, HttpContext.RequestAborted);
}
///
/// 发布修改记录
///
///
///
[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);
}
#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 == Share.Enums.Order.EVisitState.WaitForVisit ||
x.VisitState == Share.Enums.Order.EVisitState.NoSatisfiedWaitForVisit) && x.Order.IsProvince == false)
.WhereIF(dto.VisitState == EVisitStateQuery.Visited,
x => x.VisitState == Share.Enums.Order.EVisitState.Visited)
.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
.OrderBy(x => x.CreationTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 回访详情
///
///
[HttpGet("visit/{id}")]
public async Task