|
@@ -1,23 +1,39 @@
|
|
|
-using Hotline.Orders;
|
|
|
+using Hotline.Application.FlowEngine;
|
|
|
+using Hotline.FlowEngine.Workflows;
|
|
|
+using Hotline.Orders;
|
|
|
using Hotline.Repository.SqlSugar.Extensions;
|
|
|
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.Mvc;
|
|
|
+using XF.Domain.Authentications;
|
|
|
+using XF.Domain.Exceptions;
|
|
|
+using XF.Domain.Extensions;
|
|
|
|
|
|
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 IMapper _mapper;
|
|
|
|
|
|
public OrderController(
|
|
|
+ IOrderDomainService orderDomainService,
|
|
|
IOrderRepository orderRepository,
|
|
|
+ IWorkflowApplication workflowApplication,
|
|
|
+ IWorkflowDomainService workflowDomainService,
|
|
|
IMapper mapper)
|
|
|
{
|
|
|
+ _orderDomainService = orderDomainService;
|
|
|
_orderRepository = orderRepository;
|
|
|
+ _workflowApplication = workflowApplication;
|
|
|
+ _workflowDomainService = workflowDomainService;
|
|
|
_mapper = mapper;
|
|
|
}
|
|
|
|
|
@@ -27,12 +43,93 @@ public class OrderController : BaseController
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
|
[HttpGet]
|
|
|
- public async Task<PagedDto<OrderDto>> Query(PagedKeywordRequest dto)
|
|
|
+ public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
|
|
|
{
|
|
|
var (total, items) = await _orderRepository.Queryable()
|
|
|
- .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword) || x.No.Contains(dto.Keyword))
|
|
|
+ .Includes(d => d.Employee)
|
|
|
+ .Includes(d => d.Workflow, d => d.Assigns)
|
|
|
+ .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.AcceptType.HasValue, d => d.AcceptType == dto.AcceptType)
|
|
|
+ .WhereIF(dto.Channel.HasValue, d => d.Channel == dto.Channel)
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.HotspotId), d => d.HotspotId == dto.HotspotId)
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), d => d.Workflow.Assigns.Any(x => x.OrgCode == dto.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.EmergencyLevel.HasValue, d => d.EmergencyLevel == dto.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.Status.HasValue, d => d.Status == dto.Status)
|
|
|
.ToPagedListAsync(dto.PageIndex, dto.PageSize);
|
|
|
|
|
|
return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
|
|
|
}
|
|
|
+
|
|
|
+ [HttpGet("{id}")]
|
|
|
+ public async Task<OrderDto> Get(string id)
|
|
|
+ {
|
|
|
+ var order = await _orderRepository.Queryable()
|
|
|
+ .Includes(d => d.OrderComplain)
|
|
|
+ .FirstAsync(d => d.Id == id);
|
|
|
+ order.Workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId,
|
|
|
+ withSupplements: true, cancellationToken: HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ return _mapper.Map<OrderDto>(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ [HttpPost]
|
|
|
+ public async Task<string> Add([FromBody] AddOrderDto dto)
|
|
|
+ {
|
|
|
+ var order = _mapper.Map<Order>(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);
|
|
|
+ }
|
|
|
+
|
|
|
+ [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.WorkflowId = workflowId;
|
|
|
+ await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
|
|
|
+ }
|
|
|
+
|
|
|
+ [HttpGet("base-data")]
|
|
|
+ public dynamic BaseData()
|
|
|
+ {
|
|
|
+ return new
|
|
|
+ {
|
|
|
+ //ModuleOptions = WorkflowModule.Modules.ToList(),
|
|
|
+ //GenderOptions = EnumExts.GetDescriptions<EHandlerType>(),
|
|
|
+ //CountersignMode = EnumExts.GetDescriptions<ECountersignMode>().Where(d => d.Key != 1)
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|