using JSMachine.WMS.Business.RcsCallBack.IService; using JSMachine.WMS.RPC.ErpRPC.Dto.Out; using JSMachine.WMS.RPC.RcsRPC.Dto.In; using Microsoft.AspNetCore.Mvc; using JSMachine.WMS.RPC.RcsRPC.Dto; using JSMachine.WMS.Business.StockIn.IService; using JSMachine.WMS.RPC.ErpRPC.Dto.In.XRBusinessResult; using JSMachine.WMS.RPC.ErpRPC.Dto.Out.XRBusinessResult; using JSMachine.WMS.Business.StockOut.IService; using JSMachine.WMS.Infrastructure.Helper; using Newtonsoft.Json; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.RPC.ErpRPC.Dto.In; using Microsoft.IdentityModel.Tokens; using JSMachine.WMS.App.IService; using JSMachine.WMS.App.Dto; using JSMachine.WMS.Common.Cache; using JSMachine.WMS.Application.IService; using JSMachine.WMS.Application.Dto; using JSMachine.WMS.Domain.Entity.Enums; namespace JSMachine.WMS.WebHost.Controllers { /// /// WMS 核心业务接口,接收 RCS、PDA 和 ERP 请求并委托给对应业务服务。 /// public class WmsController : ControllerBase { private IStockInService _stockInService; private IOperationLogService _operationLogService; private IStockOutService _stockOutService; /// 创建 WMS 核心业务控制器。 /// 入库业务服务。 /// 出库业务服务。 /// 操作日志服务。 public WmsController( IStockInService stockInService, IStockOutService stockOutService, IOperationLogService operationLogService) { _stockInService = stockInService; _stockOutService = stockOutService; _operationLogService = operationLogService; } #region 通过提供接口,给Rcs调用,获取AGV上报的任务状态 /// /// Rcs上传agv作业执行状态 /// /// /// [Route("api/Wms/PostAgvExcutionStatus")] [HttpPost] public async Task PostAgvExcutionStatus([FromBody] AgvExcutionInfo agvExcutionInfo) { LogHelper.Info($"收到Rcs上报的小车执行状态信息,任务Id {agvExcutionInfo.OrderId},当前状态 {agvExcutionInfo.Status}"); _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.RCS, OperationType = OperationType.RcsCallBack, NewObject = JsonConvert.SerializeObject(agvExcutionInfo) }); if (agvExcutionInfo == null || string.IsNullOrEmpty(agvExcutionInfo.OrderId)) { return await Task.FromResult(new RcsApiResult { code = 500, data = "参数不合法" }); } RcsCallbackCache.RcsCallbackQueue.Enqueue(agvExcutionInfo); return await Task.FromResult(new RcsApiResult() { code = 1000, }); } #endregion #region PDA入库 /// 接收 PDA 入库请求并创建入库业务任务。 /// PDA 提交的入库参数。 /// 标准化入库处理结果。 [Route("api/wms/StockInByPda")] [HttpPost] public async Task> StockInByPda([FromBody] PDAInParam pdaInParam) { _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.PDA, OperationType = OperationType.StockIn, NewObject = JsonConvert.SerializeObject(pdaInParam) }); ApiResult apiResult = new(); string msg = await _stockInService.StockIn(pdaInParam); if (string.IsNullOrEmpty(msg)) { apiResult.ResultCode = "200"; apiResult.Data = true; } else { apiResult.ResultCode = "500"; apiResult.Data = false; apiResult.ErrorMsg = msg; } return apiResult; } #endregion #region 销售出库/生产退库 private static readonly SemaphoreSlim _requestSemaphore = new(1, 1); /// /// 销售出库/生产退库 /// /// /// [Route("api/erp/out")] [HttpPost] public async Task Out([FromBody] StockOutParam erpSaleOutParam) { await _requestSemaphore.WaitAsync(); try { LogHelper.Info($"收到erp出库请求,请求方IP {HttpContext.Connection.RemoteIpAddress}," + $"原始参数信息 {JsonConvert.SerializeObject(erpSaleOutParam)}"); _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.ERP, OperationType = erpSaleOutParam.transport==4 ? OperationType.ProductionOut : OperationType.SaleOut, NewObject = JsonConvert.SerializeObject(erpSaleOutParam) }); XRResultDto apiResult = new(); string errMsg = await _stockOutService.Stockout(erpSaleOutParam); if (string.IsNullOrEmpty(errMsg)) { apiResult.success = true; apiResult.status = 200; } else { apiResult.success = false; apiResult.status = 500; apiResult.errors = errMsg; } return apiResult; } catch (Exception ex) { LogHelper.Error(ex); return new XRResultDto { status = 500, success = false, errors = "WMS服务端发生未知错误" }; } finally { _requestSemaphore.Release(); } } #endregion #region 出库撤单 /// /// 出库撤单 /// /// /// [Route("api/erp/retreat")] [HttpPost] public async Task> ErpCancelOrder([FromBody] ErpCancelOrderParam cancelOrderParam) { LogHelper.Info($"收到erp出库撤单请求,请求方IP {HttpContext.Connection.RemoteIpAddress}," + $"原始参数信息 {JsonConvert.SerializeObject(cancelOrderParam)}"); _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.ERP, OperationType = OperationType.StockOutCancel, NewObject = JsonConvert.SerializeObject(cancelOrderParam) }); return await _stockOutService.ErpCancelOrder(cancelOrderParam); } #endregion } }