using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.BaseServices; using WIDESEA_Core; using WIDESEA_IInboundService; using WIDESEA_Model.Models; using WIDESEA_Common.OrderEnum; using WIDESEA_Core.Helper; using Microsoft.AspNetCore.Mvc.RazorPages; using WIDESEA_Core.Enums; using SqlSugar; using WIDESEA_Core.BaseRepository; using WIDESEA_Common.StockEnum; using Microsoft.AspNetCore.Mvc; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.ReturnMES; using MailKit.Search; using static System.Collections.Specialized.BitVector32; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_IBasicService; namespace WIDESEA_InboundService { public class TakeStockOrderService : ServiceBase>, ITakeStockOrderService { public IRepository Repository => BaseDal; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IRepository _takeStockOrder; private readonly IRepository _stockInfoRepository; private readonly IRepository _takeStockOrderDetail; private readonly IRepository _taskRepository; private readonly ILocationInfoService _locationInfoService; public TakeStockOrderService(IRepository BaseDal, IUnitOfWorkManage unitOfWorkManage,IRepository takeStockOrder,IRepository stockInfoRepository,IRepository takeStockOrderDetail,IRepository taskRepository,ILocationInfoService locationInfoService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _takeStockOrder = takeStockOrder; _stockInfoRepository = stockInfoRepository; _takeStockOrderDetail = takeStockOrderDetail; _taskRepository = taskRepository; _locationInfoService = locationInfoService; } public WebResponseContent ValidateBoxNo(string orderNo, string boxNo) { try { Dt_StockInfo stockInfo = _stockInfoRepository.QueryFirst(x => x.PalletCode == boxNo); if (stockInfo == null) { return WebResponseContent.Instance.Error("未找到该托盘库存"); } if(stockInfo.StockStatus != StockStatusEmun.盘点出库完成.ObjToInt()) { return WebResponseContent.Instance.Error("该托盘处于非盘点状态,请检查盘点任务"); } Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == orderNo); if (takeStockOrder == null) { return WebResponseContent.Instance.Error("未找到该盘点单据"); } if (takeStockOrder.AllPalletCode.Contains(",")) { var remarkValues = takeStockOrder.AllPalletCode .Split(',') .Select(s => s.Trim()) .Where(s => !string.IsNullOrWhiteSpace(s)) .ToList(); if (remarkValues.Count == 0) { return WebResponseContent.Instance.Error("盘点单箱号仅包含逗号,无有效箱号数据"); } bool isMatch = remarkValues.Any(val => val.Equals(boxNo, StringComparison.OrdinalIgnoreCase)); if (!isMatch) { return WebResponseContent.Instance.Error($"箱号【{boxNo}】未在盘点单箱号【{takeStockOrder.Remark}】中找到匹配项"); } } else { bool isMatch = takeStockOrder.Remark.Trim().Equals(boxNo, StringComparison.OrdinalIgnoreCase); if (!isMatch) { return WebResponseContent.Instance.Error($"箱号【{boxNo}】与盘点单箱号【{takeStockOrder.Remark}】不匹配"); } } return WebResponseContent.Instance.OK(); } catch(Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ValidateBarcode(string boxNo, string barcode) { try { Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable().Where(x => x.PalletCode == boxNo).Includes(x => x.Details).First(); if(stockInfo == null) { return WebResponseContent.Instance.Error("未找到该料箱库存信息"); } if(stockInfo.Details == null) { return WebResponseContent.Instance.Error("未找到该料箱库存"); } List barcodes = stockInfo.Details.Select(x => x.Barcode).ToList(); bool isMatch = barcodes.Any(val => val.Equals(barcode, StringComparison.OrdinalIgnoreCase)); if (!isMatch) { return WebResponseContent.Instance.Error($"条码【{barcode}】未在【{boxNo}】料箱条码中找到匹配项"); } var stockDetail = stockInfo.Details.FirstOrDefault(x=>x.Barcode == barcode); var resultData = new { stockQuantity = stockDetail.StockQuantity }; return WebResponseContent.Instance.OK(data:resultData); } catch(Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent CompleteStockTake([FromBody] CompleteStockTakeDTO completeStockTakeDTO) { try { Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == completeStockTakeDTO.orderNo); if (takeStockOrder == null) { return WebResponseContent.Instance.Error("未找到该盘点单据"); } Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable().Where(x => x.PalletCode == completeStockTakeDTO.boxNo).Includes(x=>x.Details).First(); if(stockInfo == null) { return WebResponseContent.Instance.Error("未找到该托盘库存"); } Dt_StockInfoDetail stockInfoDetail = stockInfo.Details.FirstOrDefault(x => x.Barcode == completeStockTakeDTO.barcode); if(stockInfoDetail == null) { return WebResponseContent.Instance.Error("条码库存数据未找到匹配数据"); } Dt_TakeStockOrderDetail takeStockOrderDetail = new Dt_TakeStockOrderDetail() { TakeStockId = takeStockOrder.Id, MaterielCode = stockInfoDetail.MaterielCode, MaterielName = stockInfoDetail.MaterielName??"", BatchNo = stockInfoDetail.BatchNo, TakePalletCode = completeStockTakeDTO.boxNo, TakeDetalStatus = TakeStockDetailStatusEnum.盘点完成.ObjToInt(), Unit = stockInfoDetail.Unit, SysQty = completeStockTakeDTO.stockQuantity, Qty =completeStockTakeDTO.actualQuantity, Remark = completeStockTakeDTO.stockQuantity-completeStockTakeDTO.actualQuantity>=0 ?"盘亏":"盘盈", barcode = completeStockTakeDTO.barcode, WarehouseCode = stockInfoDetail.WarehouseCode??"", FactoryArea = stockInfoDetail.FactoryArea, SupplyCode = stockInfoDetail.SupplyCode??"", TakeStockNo = takeStockOrder.OrderNo, }; _unitOfWorkManage.BeginTran(); _takeStockOrderDetail.AddData(takeStockOrderDetail); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ReturnBox(string orderNo, string boxNo) { WebResponseContent content = new WebResponseContent(); try { Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == orderNo); if(takeStockOrder == null) { return content.Error("未找到该盘点单据"); } var stock = _stockInfoRepository.QueryFirst(x => x.PalletCode == boxNo); if (stock == null) { return content.Error($"未找到托盘{boxNo}库存信息不允许回库"); } var task = _taskRepository.QueryFirst(x => x.PalletCode == boxNo); if (task != null) { return content.Error($"托盘{boxNo}存在任务回库失败!"); } if(stock.StockStatus != StockStatusEmun.盘点出库完成.ObjToInt()) { return content.Error("该托盘状态不对,不允许盘点入库"); } stock.StockStatus = StockStatusEmun.入库确认.ObjToInt(); takeStockOrder.TakeStockStatus = TakeStockStatusEnum.盘点完成.ObjToInt(); // 分配新货位 var newLocation = _locationInfoService.AssignLocation(stock.LocationType); var newTask = new Dt_Task() { CurrentAddress = takeStockOrder.Remark, Grade = 0, PalletCode = boxNo, NextAddress = "", OrderNo = takeStockOrder.OrderNo, Roadway = newLocation.RoadwayNo, SourceAddress = takeStockOrder.Remark, TargetAddress = newLocation.LocationCode, TaskStatus = (int)TaskStatusEnum.New, TaskType = TaskTypeEnum.InInventory.ObjToInt(), PalletType = stock.PalletType, WarehouseId = stock.WarehouseId }; _unitOfWorkManage.BeginTran(); _stockInfoRepository.UpdateData(stock); _takeStockOrder.UpdateData(takeStockOrder); _taskRepository.AddData(newTask); _unitOfWorkManage.CommitTran(); //var moveResult = await _eSSApiService.MoveContainerAsync(new MoveContainerRequest //{ // slotCode = movestations[station], // containerCode = palletCode //}); return content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content.Error(ex.Message); } } } }