using Hotline.Application.FlowEngine;
using Hotline.FlowEngine.Workflows;
using Hotline.Orders;
using Hotline.Repository.SqlSugar.Extensions;
using Hotline.Settings;
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 Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using XF.Domain.Authentications;
using XF.Domain.Exceptions;
using XF.Domain.Extensions;
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 IHotSpotTypeRepository _hotSpotTypeRepository;
private readonly ISystemDomainService _systemDomainService;
private readonly ISystemOrganizeRepository _organizeRepository;
private readonly IMapper _mapper;
public OrderController(
IOrderDomainService orderDomainService,
IOrderRepository orderRepository,
IWorkflowApplication workflowApplication,
IWorkflowDomainService workflowDomainService,
IHotSpotTypeRepository hotSpotTypeRepository,
ISystemDomainService systemDomainService,
ISystemOrganizeRepository organizeRepository,
IMapper mapper)
{
_orderDomainService = orderDomainService;
_orderRepository = orderRepository;
_workflowApplication = workflowApplication;
_workflowDomainService = workflowDomainService;
_hotSpotTypeRepository = hotSpotTypeRepository;
_systemDomainService = systemDomainService;
_organizeRepository = organizeRepository;
_mapper = mapper;
}
///
/// 工单列表
///
///
///
[HttpGet]
public async Task> Query([FromQuery] QueryOrderDto dto)
{
var (total, items) = await _orderRepository.Queryable()
.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword) || d.No.Contains(dto.Keyword))
.WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content))
.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.Channel))
.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId))
.WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone))
.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
.WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Employee.Name.Contains(dto.NameOrNo) || d.Employee.StaffNo.Contains(dto.NameOrNo))
.WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
.WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))
.WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.FromPhone.Contains(dto.PhoneNo) || d.Contact.Contains(dto.PhoneNo))
.WhereIF(dto.PushType.HasValue, d => d.PushType == dto.PushType)
.WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart)
.WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd)
.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 历史工单
///
///
///
[HttpGet("history")]
public async Task> Query([FromQuery] PagedRequest dto)
{
var (total, items) = await _orderRepository.Queryable()
.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
return new PagedDto(total, _mapper.Map>(items));
}
///
/// 查询工单详情
///
///
///
[HttpGet("{id}")]
public async Task Get(string id)
{
var order = await _orderRepository.Queryable()
.Includes(d => d.OrderComplain)
.Includes(d => d.OrderReport)
.FirstAsync(d => d.Id == id);
if (!string.IsNullOrEmpty(order.WorkflowId))
order.Workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSupplements: true, cancellationToken: HttpContext.RequestAborted);
return _mapper.Map(order);
}
///
/// 新增工单
///
///
///
[HttpPost]
public async Task Add([FromBody] AddOrderDto dto)
{
var order = _mapper.Map(dto);
return await _orderDomainService.AddAsync(order, HttpContext.RequestAborted);
}
[HttpDelete("{id}")]
public async Task Remove(string id)
{
var order = await _orderRepository.GetAsync(id, HttpContext.RequestAborted);
if (order == null) return;
if (order.Status != EOrderStatus.Temporary)
throw UserFriendlyException.SameMessage("非草稿工单不可删除");
await _orderRepository.RemoveAsync(order);
}
///
/// 更新工单信息
///
///
///
[HttpPut]
public async Task Update([FromBody] UpdateOrderDto dto)
{
var order = await _orderRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
if (order == null)
throw UserFriendlyException.SameMessage("无效工单编号");
if (order.Status != EOrderStatus.Temporary)
throw UserFriendlyException.SameMessage("非草稿工单不可编辑");
await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
}
///
/// 开始流程
///
/// 工单id
/// 流程开启参数
///
[HttpPost("{id}/startflow")]
public async Task StartFlow(string id, [FromBody] StartWorkflowDto dto)
{
var order = await _orderRepository.GetAsync(id, HttpContext.RequestAborted);
if (order == null)
throw UserFriendlyException.SameMessage("无效工单编号");
if (order.Status != EOrderStatus.Temporary || !string.IsNullOrEmpty(order.WorkflowId))
throw UserFriendlyException.SameMessage("工单已发起流程");
var workflowId = await _workflowApplication.StartWorkflowAsync(dto, HttpContext.RequestAborted);
order.StartFlow(workflowId);
await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
}
///
/// 列表页面基础数据
///
///
[HttpGet("base-data")]
public dynamic BaseData()
{
return new
{
AcceptTypeOptions = EnumExts.GetDescriptions(),
ChannelOptions = EnumExts.GetDescriptions(),
OrgsOptions = _organizeRepository.GetOrgJson(),
EmergencyLevelOptions = EnumExts.GetDescriptions(),
PushTypeOptions = EnumExts.GetDescriptions(),
OrderStatusOptions = EnumExts.GetDescriptions(),
};
}
///
/// 新增页面基础数据
///
///
[HttpGet("base-data-add")]
public dynamic BaseDataAdd()
{
return new
{
ChannelOptions = EnumExts.GetDescriptions(),
GenderOptions = EnumExts.GetDescriptions(),
IdentityTypeOptions = EnumExts.GetDescriptions(),
LicenceTypeOptions = EnumExts.GetDescriptions(),
AgeRangeOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.AgeRange),
OrderTypeOptions = EnumExts.GetDescriptions(),
AcceptTypeOptions = EnumExts.GetDescriptions(),
EmergencyLevelOptions = EnumExts.GetDescriptions(),
PushTypeOptions = EnumExts.GetDescriptions(),
};
}
///
/// 扩展信息新增页面基础数据
///
///
[HttpGet("base-data-ext")]
public dynamic BaseDataExtension()
{
return new
{
LicenceTypeOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.LicenceType),
IdentityTypeOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.ProviderIdentityType),
IdentityOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.Identity),
NationalityOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.Nationality),
NationOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.Nation),
MarketTypeOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.MarketType),
IndustryClassifyOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.IndustryClassify),
BrandOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.Brand),
ObjectClassifyOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.ObjectClassify),
ComplainClassifyOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.ComplainClassify),
SalesModeOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.SalesMode),
ECommercePlatformOptions = _systemDomainService.GetSysDicDataByCode(SysDicTypeConsts.ECommercePlatform),
ComplainTypeOptions = EnumExts.GetDescriptions()
};
}
///
/// 获取热点
///
/// 父级ID
///
[HttpGet("hotspottype-list-parent")]
public async Task> GetHotSpotType(string? parentId)
{
return await _hotSpotTypeRepository.Queryable().Where(x => x.ParentId == parentId).ToListAsync();
}
}