新增 WMS 搬运规则与任务管理
支持搬运规则维护、候选预览、任务生成、预占、下发、取消和完成,并完善仓储管理前端交互。
This commit is contained in:
@@ -12,10 +12,14 @@ namespace MiGu.Server.Controllers;
|
||||
public sealed class WmsController : ControllerBase
|
||||
{
|
||||
private readonly WmsService _service;
|
||||
private readonly WmsTransportRuleService _transportRules;
|
||||
private readonly WmsTransportTaskService _transportTasks;
|
||||
|
||||
public WmsController(WmsService service)
|
||||
public WmsController(WmsService service, WmsTransportRuleService transportRules, WmsTransportTaskService transportTasks)
|
||||
{
|
||||
_service = service;
|
||||
_transportRules = transportRules;
|
||||
_transportTasks = transportTasks;
|
||||
}
|
||||
|
||||
[HttpGet("areas")]
|
||||
@@ -130,6 +134,53 @@ public sealed class WmsController : ControllerBase
|
||||
[HttpGet("container-material-history")]
|
||||
public Task<List<ContainerMaterialHistory>> ContainerMaterialHistory([FromQuery] Guid? containerId, [FromQuery] Guid? materialId) =>
|
||||
_service.MaterialHistory(containerId, materialId);
|
||||
|
||||
[HttpGet("transport-rules")]
|
||||
public Task<List<WmsTransportRule>> TransportRules([FromQuery] string? triggerType, [FromQuery] string? q) =>
|
||||
_transportRules.ListAsync(triggerType, q);
|
||||
|
||||
[HttpPost("transport-rules")]
|
||||
public async Task<IActionResult> SaveTransportRule([FromBody] TransportRuleRequest req) =>
|
||||
Ok(await _transportRules.SaveAsync(req, User.ActorName()));
|
||||
|
||||
[HttpPut("transport-rules/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateTransportRule(Guid id, [FromBody] TransportRuleRequest req) =>
|
||||
Ok(await _transportRules.SaveAsync(req with { Id = id }, User.ActorName()));
|
||||
|
||||
[HttpDelete("transport-rules/{id:guid}")]
|
||||
public async Task<IActionResult> DeleteTransportRule(Guid id, [FromQuery] long? version)
|
||||
{
|
||||
await _transportRules.DeleteAsync(id, version, User.ActorName());
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpGet("transport-candidates")]
|
||||
public async Task<IActionResult> TransportCandidates([FromQuery] TransportRequestQuery q) =>
|
||||
Ok(await _transportTasks.PreviewCandidatesAsync(q.ToRequest()));
|
||||
|
||||
[HttpPost("transport-tasks/generate")]
|
||||
public async Task<IActionResult> GenerateTransportTask([FromBody] TransportRequestQuery q) =>
|
||||
Ok(await _transportTasks.GenerateAsync(q.ToRequest(), User.ActorName()));
|
||||
|
||||
[HttpGet("transport-tasks")]
|
||||
public Task<List<WmsTransportTask>> TransportTasks([FromQuery] string? status, [FromQuery] string? triggerType) =>
|
||||
_transportTasks.ListAsync(status, triggerType);
|
||||
|
||||
[HttpPost("transport-tasks/{id:guid}/reserve")]
|
||||
public async Task<IActionResult> ReserveTransportTask(Guid id, [FromQuery] string? reason) =>
|
||||
Ok(await _transportTasks.ReserveAsync(id, User.ActorName(), reason ?? ""));
|
||||
|
||||
[HttpPost("transport-tasks/{id:guid}/cancel")]
|
||||
public async Task<IActionResult> CancelTransportTask(Guid id, [FromQuery] string? reason) =>
|
||||
Ok(await _transportTasks.CancelAsync(id, User.ActorName(), reason ?? ""));
|
||||
|
||||
[HttpPost("transport-tasks/{id:guid}/complete")]
|
||||
public async Task<IActionResult> CompleteTransportTask(Guid id, [FromQuery] string? reason) =>
|
||||
Ok(await _transportTasks.CompleteAsync(id, User.ActorName(), reason ?? ""));
|
||||
|
||||
[HttpPost("transport-tasks/{id:guid}/dispatch")]
|
||||
public async Task<IActionResult> DispatchTransportTask(Guid id) =>
|
||||
Ok(await _transportTasks.DispatchAsync(id, User.ActorName()));
|
||||
}
|
||||
|
||||
public sealed class WmsExceptionFilter : IExceptionFilter
|
||||
@@ -141,3 +192,23 @@ public sealed class WmsExceptionFilter : IExceptionFilter
|
||||
context.ExceptionHandled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class TransportRequestQuery
|
||||
{
|
||||
public string TriggerType { get; set; } = WmsTransportTriggerTypes.MaterialCall;
|
||||
public Guid? RuleId { get; set; }
|
||||
public string? RequestSiteId { get; set; }
|
||||
public Guid? MaterialId { get; set; }
|
||||
public decimal? Quantity { get; set; }
|
||||
public Guid? ContainerId { get; set; }
|
||||
public Guid? SourceStorageId { get; set; }
|
||||
public Guid? TargetStorageId { get; set; }
|
||||
public string? BatchNo { get; set; }
|
||||
public int Priority { get; set; }
|
||||
public string Reason { get; set; } = "";
|
||||
|
||||
public WmsTransportRequest ToRequest() => new(
|
||||
TriggerType, RuleId, RequestSiteId, MaterialId, Quantity,
|
||||
ContainerId, SourceStorageId, TargetStorageId, BatchNo,
|
||||
Priority, Reason, null);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user