using Kean.Application.Command.ViewModels;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace Kean.Presentation.Rest.Controllers
{
///
/// 任务服务
///
[ApiController, Route("api/tasks")]
public class TasksController : ControllerBase
{
private readonly Application.Command.Interfaces.ITaskService _taskCommandService; // 任务命令服务
private readonly Application.Query.Interfaces.ITaskService _taskQueryService; // 任务查询服务
private readonly Application.Query.Interfaces.IIdentityService _identityQueryService; // 身份查询服务
///
/// 依赖注入
///
public TasksController(
Application.Command.Interfaces.ITaskService taskCommandService,
Application.Query.Interfaces.IIdentityService identityQueryService,
Application.Query.Interfaces.ITaskService taskQueryService)
{
_taskCommandService = taskCommandService;
_taskQueryService = taskQueryService;
_identityQueryService = identityQueryService;
}
///
/// 获取任务列表
///
/// 成功
[HttpGet]
[ProducesResponseType(200)]
public async Task GetList(
[FromQuery] int[] area,
[FromQuery] string type,
[FromQuery] string qualityState,
[FromQuery] string barcode,
[FromQuery] string original,
[FromQuery] string destination,
[FromQuery] DateTime? timeFrom,
[FromQuery] DateTime? timeTo,
[FromQuery] string sort,
[FromQuery] int? offset,
[FromQuery] int? limit)
{
if (area.Length == 0)
{
area = null;
}
var items = await _taskQueryService.GetTaskList(area, type, qualityState, barcode, original, destination, timeFrom, timeTo, sort, offset, limit);
if (offset.HasValue || limit.HasValue)
{
var total = await _taskQueryService.GetTaskCount(area, type, qualityState, barcode, original, destination, timeFrom, timeTo);
return StatusCode(200, new { items, total });
}
else
{
return StatusCode(200, new { items, total = items.Count() });
}
}
///
/// 创建任务
///
/// 成功
/// 非法操作
/// 请求内容错误
[HttpPost]
[ProducesResponseType(201)]
[ProducesResponseType(405)]
[ProducesResponseType(422)]
public async Task Create(
[FromMember] string operation,
[FromMiddleware] int session,
[FromMember] Application.Command.ViewModels.Task task
)
{
task.Operator = session;
var user = await _identityQueryService.GetUser(session);
try
{
JObject jObj = JObject.Parse(task.Tag);
JToken jPostUser = jObj.SelectToken("postUser");
if (jPostUser == null)
{
jObj.Add("postUser", user.Name);
}
else
{
jObj["postUser"] = user.Name;
}
task.Tag = JsonConvert.SerializeObject(jObj);
}
catch { }
(int Id, Failure Failure) result;
(string message, Failure Failure) resultReupload;
switch (operation)
{
case "infeed":
result = await _taskCommandService.Infeed(task);
break;
case "outfeed":
result = await _taskCommandService.Outfeed(task);
break;
case "transfer":
result = await _taskCommandService.Transfer(task);
break;
case "bypass":
result = await _taskCommandService.Bypass(task);
break;
case "applyout":
result = await _taskCommandService.ApplyOut(task);
break;
case "palletOut":
result = await _taskCommandService.PalletOut(task);
break;
case "Complete":
result.Failure = await _taskCommandService.Complete(task.Id);
break;
case "Cancel":
result.Failure = await _taskCommandService.Cancel(task.Id);
break;
case "ReuploadHiWMS":
resultReupload = await _taskCommandService.ReuploadHiWMS(task.Id);
result.Failure = resultReupload.Failure;
if (!string.IsNullOrEmpty(resultReupload.message))
{
result.Failure = new Failure();
result.Failure.ErrorMessage = resultReupload.message;
}
break;
case "SetRollByLocalComplete":
resultReupload = await _taskCommandService.SetRollTaskByLocalComplete(task.Id, session);
result.Failure = resultReupload.Failure;
break;
case "RecompleteForNoAgv":
result = await _taskCommandService.RecompleteForNoAgv(task);
break;
case "RecompleteForNoHiwms":
result = await _taskCommandService.RecompleteForNoHiwms(task);
break;
//case "directoutbound":
// result = await _taskCommandService.DirectOutbound(task);
// break;
case "CallDelete":
result.Failure = await _taskCommandService.CallDelete(task.Id);
break;
case "SetPriority":
result.Failure = await _taskCommandService.SetPriority(task);
break;
default:
return StatusCode(405);
}
if (result.Failure == null)
{
return StatusCode(201);
}
else
{
return StatusCode(422, result.Failure);
}
}
///////
/////// 设置应急模式
///////
/////// 成功
/////// 非法操作
/////// 请求内容错误
////[HttpPost("emergency")]
////[ProducesResponseType(201)]
////[ProducesResponseType(405)]
////[ProducesResponseType(422)]
////[Anonymous]
////public async Task SetEmergency(
//// [FromMember] string stationCode,
//// [FromMember] string stationModel,
//// [FromMiddleware] int session)
////{
//// Failure failure = await _taskCommandService.Emergency(stationCode, stationModel, session);
//// if (failure == null)
//// {
//// return StatusCode(201);
//// }
//// else
//// {
//// return StatusCode(422, failure);
//// }
////}
}
}