|
@@ -14,17 +14,11 @@ using Hotline.Share.Dtos;
|
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
using Hotline.Share.Dtos.Order;
|
|
|
using Hotline.Share.Enums.Order;
|
|
|
-using Hotline.Share.Requests;
|
|
|
using MapsterMapper;
|
|
|
using MediatR;
|
|
|
-using Microsoft.AspNetCore.Authorization;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
-using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
|
|
-using MongoDB.Driver.Linq;
|
|
|
-using System.Runtime.CompilerServices;
|
|
|
using XF.Domain.Authentications;
|
|
|
using XF.Domain.Exceptions;
|
|
|
-using XF.Domain.Extensions;
|
|
|
using XF.Utility.EnumExtensions;
|
|
|
|
|
|
namespace Hotline.Api.Controllers;
|
|
@@ -47,7 +41,8 @@ public class OrderController : BaseController
|
|
|
private readonly IMapper _mapper;
|
|
|
private readonly IMediator _mediator;
|
|
|
private readonly IOrderPublishedRepository _orderPublishedRepository;
|
|
|
-
|
|
|
+ private readonly IOrderVisitedRepository _orderVisitedRepository;
|
|
|
+ private readonly IOrderVisitedDetailRepository _orderVisitedDetailRepository;
|
|
|
|
|
|
public OrderController(
|
|
|
IOrderDomainService orderDomainService,
|
|
@@ -62,7 +57,9 @@ public class OrderController : BaseController
|
|
|
ISessionContext sessionContext,
|
|
|
IMapper mapper,
|
|
|
IMediator mediator,
|
|
|
- IOrderPublishedRepository orderPublishedRepository)
|
|
|
+ IOrderPublishedRepository orderPublishedRepository,
|
|
|
+ IOrderVisitedRepository orderVisitedRepository,
|
|
|
+ IOrderVisitedDetailRepository orderVisitedDetailRepository)
|
|
|
{
|
|
|
_orderDomainService = orderDomainService;
|
|
|
_orderRepository = orderRepository;
|
|
@@ -77,8 +74,12 @@ public class OrderController : BaseController
|
|
|
_mapper = mapper;
|
|
|
_mediator = mediator;
|
|
|
_orderPublishedRepository = orderPublishedRepository;
|
|
|
+ _orderVisitedRepository = orderVisitedRepository;
|
|
|
+ _orderVisitedDetailRepository = orderVisitedDetailRepository;
|
|
|
}
|
|
|
|
|
|
+ #region 工单发布
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 查询(工单发布)
|
|
|
/// </summary>
|
|
@@ -91,19 +92,20 @@ public class OrderController : BaseController
|
|
|
var (total, items) = await _orderRepository.Queryable()
|
|
|
.Includes(d => d.OrderPublished)
|
|
|
.Includes(d => d.Employee)
|
|
|
- .Where(x=>x.Status == EOrderStatus.Filed)
|
|
|
+ .Where(x => x.Status == EOrderStatus.Filed)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.OrderTitle), d => d.Title.Contains(dto.OrderTitle!))
|
|
|
.WhereIF(dto.PubState == EPubState.Pub, d => d.Progress == EProgress.Published || d.Progress == EProgress.Visited)
|
|
|
.WhereIF(dto.PubState == EPubState.NoPub, d => d.Progress == EProgress.Managing)
|
|
|
.WhereIF(!string.IsNullOrEmpty(dto.PubMan), d => d.Employee.Name.Contains(dto.PubMan!) || d.Employee.StaffNo.Contains(dto.PubMan!))
|
|
|
- .WhereIF(dto.PubRange != null, d => d.OrderPublished.PublishState == dto.PubRange)
|
|
|
+ .WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublished.PublishState)
|
|
|
+ .WhereIF(dto.PubRange == EPublicState.NoPub, d=>!d.OrderPublished.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.OrderPublished.CreationTime >= dto.CreationTimeStart)
|
|
|
.WhereIF(dto.FiledTimeEnd.HasValue, d => d.OrderPublished.CreationTime <= dto.CreationTimeEnd)
|
|
|
- .OrderByDescending(d => d.CreationTime)
|
|
|
+ .OrderBy(d => d.CreationTime)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
|
|
|
return new PagedDto<PublishDto>(total, _mapper.Map<IReadOnlyList<PublishDto>>(items));
|
|
@@ -149,6 +151,7 @@ public class OrderController : BaseController
|
|
|
orgDetail.VisitId = id;
|
|
|
orgDetail.VisitOrgCode = item.Id;
|
|
|
orgDetail.VisitOrgName = item.Name;
|
|
|
+ orgDetail.VisitTarget = EVisitTarget.Org;
|
|
|
visitedDetail.Add(orgDetail);
|
|
|
}
|
|
|
await _mediator.Publish(new AddVisitNotify(visitedDetail), HttpContext.RequestAborted);
|
|
@@ -183,12 +186,109 @@ public class OrderController : BaseController
|
|
|
throw UserFriendlyException.SameMessage("未知工单,无法发布");
|
|
|
|
|
|
var res = new PublishOrderPageBaseDto() { SourceChannel = order.SourceChannel, OrderTitle = order.Title, Content = order.Content, ActualOpinion = order.ActualOpinion };
|
|
|
- var (idName,idNames) = await _workflowDomainService.GetNoVisiteOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
|
|
|
+ var (idName, idNames) = await _workflowDomainService.GetNoVisiteOrgsAsync(order.WorkflowId, HttpContext.RequestAborted);
|
|
|
res.ActualHandleOrgName = idName;
|
|
|
res.idNames = idNames.ToList();
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 工单回访
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 回访列表
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="dto"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [Permission(EPermission.QueryOrderVisitList)]
|
|
|
+ [HttpGet("order-visit-list")]
|
|
|
+ public async Task<PagedDto<OrderVisit>> QueryOrderVisitList([FromQuery]QueryOrderVisitDto dto)
|
|
|
+ {
|
|
|
+ var (total, items) = await _orderVisitedRepository.Queryable()
|
|
|
+ .Includes(x => x.Order)
|
|
|
+ .Includes(x => x.Employee)
|
|
|
+ .WhereIF(dto.VisitState == EVisitStateQuery.NoVisit, x => x.VisitState == Share.Enums.Order.EVisitState.WaitForVisit || x.VisitState == Share.Enums.Order.EVisitState.NoSatisfiedWaitForVisit)
|
|
|
+ .WhereIF(dto.VisitState == EVisitStateQuery.Visited, x => x.VisitState == Share.Enums.Order.EVisitState.Visited)
|
|
|
+ .OrderBy(x => x.CreationTime)
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+ return new PagedDto<OrderVisit>(total, _mapper.Map<IReadOnlyList<OrderVisit>>(items));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 回访详情
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [Permission(EPermission.VisitInfo)]
|
|
|
+ [HttpGet("visit-entity/{id}")]
|
|
|
+ public async Task<object> VisitInfo(string id)
|
|
|
+ {
|
|
|
+ var orderVisit = await _orderVisitedRepository.Queryable()
|
|
|
+ .Includes(x => x.Order)
|
|
|
+ .Includes(x => x.Employee)
|
|
|
+ .FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ if (orderVisit is null)
|
|
|
+ {
|
|
|
+ throw UserFriendlyException.SameMessage("未知工单回访");
|
|
|
+ }
|
|
|
+
|
|
|
+ int count =await _orderVisitedRepository.CountAsync(x => x.OrderId == orderVisit.OrderId && x.VisitState == Share.Enums.Order.EVisitState.Visited,HttpContext.RequestAborted);
|
|
|
+ var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction);
|
|
|
+ var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
|
|
|
+ var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner);
|
|
|
+
|
|
|
+ return new { OrderVisitModel = orderVisit ,Count = count , VisitSatisfaction = visitSatisfaction, DissatisfiedReason= dissatisfiedReason, VisitManner= visitManner };
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 回访明细
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [Permission(EPermission.VisitDetailList)]
|
|
|
+ [HttpGet("visit-detail-list")]
|
|
|
+ public async Task<PagedDto<OrderVisitDetail>> VisitDetailList([FromQuery]VisitDetailListDto dto)
|
|
|
+ {
|
|
|
+ var (total,items) = await _orderVisitedDetailRepository.Queryable()
|
|
|
+ .Includes(x => x.OrderVisit)
|
|
|
+ .WhereIF(dto.VisitState == EVisitStateQuery.NoVisit, x=>x.OrderVisit.VisitState == Share.Enums.Order.EVisitState.WaitForVisit || x.OrderVisit.VisitState == Share.Enums.Order.EVisitState.NoSatisfiedWaitForVisit)
|
|
|
+ .WhereIF(dto.VisitState == EVisitStateQuery.Visited, x=>x.OrderVisit.VisitState == Share.Enums.Order.EVisitState.Visited)
|
|
|
+ .OrderByDescending(x => x.CreationTime)
|
|
|
+ .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ return new PagedDto<OrderVisitDetail>(total, _mapper.Map<IReadOnlyList<OrderVisitDetail>>(items));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 回访保存
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ [Permission(EPermission.Visit)]
|
|
|
+ [HttpPost("visit")]
|
|
|
+ public async Task Visit([FromBody]VisitDto dto)
|
|
|
+ {
|
|
|
+ var visit = await _orderVisitedRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
|
|
|
+ if (visit is null)
|
|
|
+ throw UserFriendlyException.SameMessage("未知回访信息");
|
|
|
+
|
|
|
+ //更新主表
|
|
|
+ visit.VisitState = Share.Enums.Order.EVisitState.Visited;
|
|
|
+ visit.VisitTime = DateTime.Now;
|
|
|
+ visit.IsPutThrough = dto.IsPutThrough;
|
|
|
+ visit.EmployeeId = _sessionContext.UserId;
|
|
|
+ await _orderVisitedRepository.UpdateAsync(visit,HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ //更新明細
|
|
|
+ var visitDetails = _mapper.Map <List<OrderVisitDetail>>(dto.VisitDetails);
|
|
|
+
|
|
|
+ await _orderVisitedDetailRepository.UpdateRangeAsync(visitDetails, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 工单列表
|
|
|
/// </summary>
|