using Microsoft.AspNetCore.Mvc; using WIDESEA_Core; using WIDESEA_Core.BaseController; using WIDESEA_DTO.Outbound; using WIDESEA_IOutboundService; using WIDESEA_Model.Models; using static WIDESEA_OutboundService.OutboundBatchPickingService; namespace WIDESEA_WMSServer.Controllers.Outbound { [Route("api/OutboundBatchPicking")] [ApiController] public class OutboundBatchPickingController : ApiBaseController { private readonly ISplitPackageService _splitPackageService; private readonly IOutStockLockInfoService _outStockLockInfoService; private readonly IOutboundBatchPickingService _outboundBatchPickingService; private readonly ILogger _logger; public OutboundBatchPickingController(IOutboundBatchPickingService service, ISplitPackageService splitPackageService, IOutStockLockInfoService outStockLockInfoService, IOutboundBatchPickingService outboundBatchPickingService, ILogger logger) : base(service) { _splitPackageService = splitPackageService; _outStockLockInfoService = outStockLockInfoService; _outboundBatchPickingService = outboundBatchPickingService; _logger = logger; } /// /// 分拣确认 /// [HttpPost("confirm-picking")] public async Task ConfirmPicking([FromBody] ConfirmPickingDto dto) { return await _outboundBatchPickingService.ConfirmBatchPicking(dto.OrderNo, dto.PalletCode, dto.Barcode); } /// /// 取消分拣 /// [HttpPost("cancel-picking")] public async Task CancelPicking([FromBody] CancelPickingDto dto) { return await _outboundBatchPickingService.CancelPicking(dto.OrderNo, dto.PalletCode, dto.Barcode); } /// /// 取消拆包链 /// [HttpPost("cancel-split-chain")] public async Task CancelSplitChain([FromBody] CancelSplitChainDto dto) { return await _outboundBatchPickingService.CancelSplitPackageChain(dto.OrderNo, dto.PalletCode, dto.StartBarcode); } /// /// 获取拆包链信息 /// [HttpPost("split-package-chain-info")] public async Task GetSplitPackageChainInfo([FromBody] SplitPackageChainInfoRequestDto dto) { return await _outboundBatchPickingService.GetSplitPackageChainInfo(dto.OrderNo, dto.Barcode); } /// /// 查找完整拆包链(从根条码开始) /// [HttpPost("find-root-split-chain")] public async Task FindRootSplitChain([FromBody] SplitPackageChainInfoRequestDto dto) { try { // 查找根条码 var rootBarcode = await _outboundBatchPickingService. FindRootBarcode(dto.OrderNo, dto.Barcode); // 获取完整拆包链 var splitChain = await _outboundBatchPickingService.GetSplitPackageChain(dto.OrderNo, rootBarcode); var chainInfo = new SplitPackageChainInfoDto { OriginalBarcode = rootBarcode, RootBarcode = rootBarcode, TotalSplitTimes = splitChain.Count, ChainType = "root", SplitChain = splitChain.Select(x => new SplitChainItemDto { SplitTime = x.SplitTime, OriginalBarcode = x.OriginalBarcode, NewBarcode = x.NewBarcode, SplitQuantity = x.SplitQty, Operator = x.Operator, IsReverted = x.IsReverted }).ToList() }; return WebResponseContent.Instance.OK("获取成功", chainInfo); } catch (Exception ex) { _logger.LogError($"查找完整拆包链失败 - OrderNo: {dto.OrderNo}, Barcode: {dto.Barcode}, Error: {ex.Message}"); return WebResponseContent.Instance.Error("查找完整拆包链失败"); } } /// /// 手动拆包 /// [HttpPost("split-package")] public async Task SplitPackage([FromBody] SplitPackageDto dto) { return await _outboundBatchPickingService.ManualSplitPackage(dto.OrderNo, dto.PalletCode, dto.OriginalBarcode, dto.SplitQuantity); } /// /// 取消拆包 /// [HttpPost("cancel-split")] public async Task CancelSplit([FromBody] CancelSplitDto dto) { return await _outboundBatchPickingService.CancelSplitPackage(dto.OrderNo, dto.PalletCode, dto.NewBarcode); } /// /// 分批回库 /// [HttpPost("return-stock")] public async Task ReturnStock([FromBody] ReturnStockDto dto) { return await _outboundBatchPickingService.BatchReturnStock(dto.OrderNo, dto.PalletCode); } /// /// 获取托盘的锁定信息 /// [HttpPost("pallet-locks")] public async Task GetPalletLocks([FromBody] PalletLocksDto dto) { try { var locks = await _outboundBatchPickingService.GetPalletLockInfos(dto.OrderNo, dto.PalletCode); return WebResponseContent.Instance.OK("获取成功", locks); } catch (Exception ex) { _logger.LogError(ex, $"获取托盘锁定信息异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}"); return WebResponseContent.Instance.Error("系统异常,请稍后重试" + ex.Message); } } /// /// 获取已拣选列表 /// [HttpPost("pallet-picked-list")] public async Task GetPalletPickedList([FromBody] PalletLocksDto dto) { try { var pickedList = await _outboundBatchPickingService.GetPalletPickedList(dto.OrderNo, dto.PalletCode); return WebResponseContent.Instance.OK("获取成功", pickedList); } catch (Exception ex) { _logger.LogError(ex, $"获取已拣选列表异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}"); return WebResponseContent.Instance.Error("系统异常,请稍后重试" + ex.Message); } } /// /// 获取托盘状态 /// [HttpPost("pallet-status")] public async Task GetPalletStatus([FromBody] PalletLocksDto dto) { try { var status = await _outboundBatchPickingService.GetPalletStatus(dto.OrderNo, dto.PalletCode); return WebResponseContent.Instance.OK("获取成功", status); } catch (Exception ex) { _logger.LogError(ex, $"获取托盘状态异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}"); return WebResponseContent.Instance.Error("系统异常,请稍后重试" + ex.Message); } } /// /// 获取拆包信息 /// [HttpPost("split-package-info")] public async Task GetSplitPackageInfo([FromBody] SplitPackageInfoDto dto) { try { var info = await _outboundBatchPickingService.GetSplitPackageInfo(dto.OrderNo, dto.PalletCode, dto.Barcode); return WebResponseContent.Instance.OK("获取成功", info); } catch (Exception ex) { _logger.LogError(ex, $"获取拆包信息异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}, Barcode: {dto.Barcode}"); return WebResponseContent.Instance.Error("系统异常,请稍后重试" +ex.Message); } } /// /// 取走空箱 /// [HttpPost("remove-empty-pallet")] public async Task RemoveEmptyPallet([FromBody] RemoveEmptyPalletDto dto) { try { var result = await _outboundBatchPickingService.RemoveEmptyPallet(dto.OrderNo, dto.PalletCode); return result; } catch (Exception ex) { _logger.LogError(ex, $"取走空箱异常 - OrderNo: {dto.OrderNo}, PalletCode: {dto.PalletCode}"); return WebResponseContent.Instance.Error("系统异常,请稍后重试" +ex.Message); } } } }