using Hotline.Orders;
using Hotline.Permissions;
using Hotline.Quality;
using Hotline.Share.Dtos.Quality;
using Hotline.Share.Dtos;
using Microsoft.AspNetCore.Mvc;
using XF.Domain.Authentications;
using XF.Domain.Exceptions;
using XF.Domain.Repository;
using Hotline.Api.Filter;
using Hotline.Caching.Services;
using Hotline.FlowEngine.WorkflowModules;
using Hotline.Repository.SqlSugar.Orders;
using Hotline.Settings;
using Hotline.Share.Dtos.FlowEngine;
using Hotline.Share.Dtos.Order;
using Hotline.Share.Enums.FlowEngine;
using Hotline.Share.Enums.Order;
using Hotline.Share.Enums.Settings;
using SqlSugar;
using XF.Utility.EnumExtensions;
using MapsterMapper;
using Hotline.File;
using Hotline.Application.FlowEngine;
using Hotline.FlowEngine.Workflows;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Application.Orders;
using Hotline.Share.Requests;
using Hotline.Tools;
namespace Hotline.Api.Controllers
{
///
/// 终止管理
///
public class OrderTerminateController : BaseController
{
private readonly ISessionContext _sessionContext;
private readonly IMapper _mapper;
private readonly IFileRepository _fileRepository;
private readonly IWorkflowApplication _workflowApplication;
private readonly IRepository _workflowRepository;
private readonly IWorkflowDomainService _workflowDomainService;
private readonly IOrderRepository _orderRepository;
private readonly IOrderDomainService _orderDomainService;
private readonly IOrderTerminateRepository _orderTerminateRepository;
private readonly IOrderApplication _orderApplication;
public OrderTerminateController(
ISessionContext sessionContext,
IMapper mapper,
IFileRepository fileRepository,
IWorkflowApplication workflowApplication,
IRepository workflowRepository,
IWorkflowDomainService workflowDomainService,
IOrderRepository orderRepository,
IOrderDomainService orderDomainService,
IOrderTerminateRepository orderTerminateRepository,
IOrderApplication orderApplication
)
{
_sessionContext = sessionContext;
_mapper = mapper;
_fileRepository = fileRepository;
_workflowApplication = workflowApplication;
_workflowRepository = workflowRepository;
_workflowDomainService = workflowDomainService;
_orderRepository = orderRepository;
_orderDomainService = orderDomainService;
_orderTerminateRepository = orderTerminateRepository;
_orderApplication= orderApplication;
}
///
/// 工单终止待申请列表
///
///
///
[HttpGet("may-terminate")]
public async Task> MayOrderTerminateList([FromQuery] OrderTerminateListDto dto)
{
var isAdmin = _orderDomainService.IsCheckAdmin();
var (total, items) =await _orderRepository.Queryable(isAdmin:isAdmin)
.Includes(d=>d.OrderTerminates)
.Where(d=> SqlFunc.Subqueryable().Where(t=> t.OrderId == d.Id && t.Status != ETerminateStatus.SendBackStart).NotAny())
.Where(d => d.Status >= EOrderStatus.Filed && d.ActualHandleOrgCode.StartsWith(_sessionContext.OrgId))
.WhereIF(!string.IsNullOrEmpty(dto.No),d=>d.No!.Contains(dto.No!))
.WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title!.Contains(dto.Title!))
.WhereIF(dto.ApplyStartTime.HasValue && dto.ApplyEndTime.HasValue,
d => d.OrderTerminates.Any(t=>t.CreationTime >= dto.ApplyStartTime && t.CreationTime<= dto.ApplyEndTime))
.WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue,d=>d.StartTime >= dto.StartTime && d.StartTime <= dto.EndTime)
.OrderByDescending(d => d.StartTime)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 工单终止列表
///
///
///
[HttpGet]
public async Task> OrderTerminateList([FromQuery] OrderTerminateListDto dto)
{
var (total, items) = await _orderApplication.OrderTerminateList(dto)
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 工单终止列表导出
///
///
///
[HttpPost("export")]
public async Task OrderTerminateListExport([FromBody] ExportExcelDto dto)
{
var query = _orderApplication.OrderTerminateList(dto.QueryDto);
List data;
if (dto.IsExportAll)
{
data = await query.ToListAsync(HttpContext.RequestAborted);
}
else
{
var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
data = items;
}
var dataDtos = _mapper.Map>(data);
dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
var dtos = dataDtos
.Select(stu => _mapper.Map(stu, typeof(OrderTerminateEntityDto), dynamicClass))
.Cast