using Dapper; using Estsh.Core.Base; using Estsh.Core.Model.EnumUtil; using Estsh.Core.Models; using Estsh.Core.Services; using Estsh.Core.Wms.IRepositories; using Estsh.Core.Wms.IServices; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Estsh.Core.Wms.Services { /// /// 委外配料 /// public class OutSourceBatchService : BaseService, IOutSourceBatchService { private readonly IOutSourceBatchRepository repository; public OutSourceBatchService(IOutSourceBatchRepository _repository) : base(_repository) { repository = _repository; } public SetObjectDetail GetOutSourceBatchOrderList(string orderNo) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 List wmsMoves = repository.GetOutSourceBatchOrderList(orderNo); if (wmsMoves.Count > 0) { rfInfo.type = "PASS"; rfInfo.message = "成功"; rfInfo.wmsObjectDetail = wmsMoves.ConvertAll(s => (object)s); } else { rfInfo.type = "FAIL"; rfInfo.message = "未查询到数据,请检查!"; } return rfInfo; } public SetObjectDetail GetOutSourceBatchOrderListByOrderNo(string orderNo) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 List wmsMoves = repository.GetOutSourceBatchOrderListByOrderNo(orderNo); if (wmsMoves.Count > 0) { rfInfo.type = "PASS"; rfInfo.message = "成功"; rfInfo.wmsObjectDetail = wmsMoves.ConvertAll(s => (object)s); } else { rfInfo.type = "FAIL"; rfInfo.message = "未查询到数据,请检查!"; } return rfInfo; } public SetObjectDetail GetStockByCartonNo(string cartonNo) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 List sysStocks = repository.GetStockByCartonNo(cartonNo); if (sysStocks.Count > 0) { rfInfo.type = "PASS"; rfInfo.message = "成功"; rfInfo.wmsObjectDetail = sysStocks.ConvertAll(s => (object)s); } else { rfInfo.type = "FAIL"; rfInfo.message = "箱条码不存在,请检查!"; } return rfInfo; } public SetObjectDetail CheckStockByCartonAlocate(string cartonNo, string orderNo, string groupNo, string isSplit, string loginId) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 //配料列表 List details = repository.CheckMoveDetail(orderNo); //扫描到的箱条码 SysStock Stock = repository.GetCartonInfo(cartonNo); if (Stock == null) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码不存在,请检查!"; return rfInfo; } if (Stock.Enabled.Equals("N")) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码已被冻结,请检查!"; return rfInfo; } else if (Stock.Status != (int)WmsEnumUtil.StockStatus.INSTOCKED) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:是" + Stock.StockStatus + "状态,请检查!"; return rfInfo; } if (Stock.Qty < 1) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码数量不足,无法拆分!"; return rfInfo; } List ifScan = details.Where(a => a.PartId == Stock.PartId).ToList(); if (ifScan.Count == 0) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:不在委外发运单中,请检查!"; return rfInfo; } if (ifScan[0].FactoryId != Stock.FactoryId) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:与委外发运单不在同工厂,请检查!"; return rfInfo; } if (ifScan[0].PickQty >= ifScan[0].Qty) { rfInfo.type = "FAIL"; rfInfo.message = "[" + ifScan[0].PartNo + "]:已完成配料!"; return rfInfo; } ////获取零件号 最早批次列表 //List PartByFIFO = repository.GetPartByFIFO(Stock.PartId.ToString()); //List isSure = PartByFIFO.Where(a => a.CartonNo == Stock.CartonNo).ToList(); //if (isSure.Count == 0) //{ // rfInfo.type = "FAIL"; // rfInfo.message = "[" + cartonNo + "]:箱条码不是最早批次,请扫描[" + PartByFIFO[0].CartonNo + "]"; // return rfInfo; //} if ((ifScan[0].PickQty + Stock.Qty) > ifScan[0].Qty && isSplit == "False") { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码为尾箱超出配料数,请开启拆分进行扫描!"; return rfInfo; } if (isSplit == "True") { //尾箱拆分 decimal needNum = ifScan[0].Qty - ifScan[0].PickQty; //需要拆的数量 if (needNum >= Stock.Qty) { //不需要拆 } else { //原条码 decimal oldQty = Stock.Qty - needNum; CheckMaterialSplit(Stock.CartonNo, Convert.ToInt32(oldQty), loginId, 1); //更新拆分后数据 Stock = repository.GetCartonInfo(cartonNo); return repository.UpdteStatus(orderNo, ifScan, Stock, groupNo, loginId); } } return repository.UpdteStatus(orderNo, ifScan, Stock, groupNo, loginId); } public SetObjectDetail CheckStockByCartonAlocateGroup(string carton_No, string orderNo, string groupNo, string isSplit, string loginId) { SetObjectDetail rfInfo = new SetObjectDetail();//返回消息 //配料列表 List details = repository.CheckMoveDetail(orderNo); List sysStocks = new List(); sysStocks = repository.GetCartonInfoByGroupNo(groupNo); for (int i = 0; i < sysStocks.Count; i++) { SysStock Stock = sysStocks[i]; string cartonNo = Stock.CartonNo; if (Stock == null) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码不存在,请检查!"; return rfInfo; } if (Stock.Enabled.Equals("N")) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码已被冻结,请检查!"; return rfInfo; } else if (Stock.Status != (int)WmsEnumUtil.StockStatus.INSTOCKED) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:是" + Stock.StockStatus + "状态,请检查!"; return rfInfo; } if (Stock.Qty < 1) { rfInfo.type = "FAIL"; rfInfo.message = "[" + cartonNo + "]:箱条码数量不足,无法拆分!"; return rfInfo; } } var stockGroupQtys = sysStocks.GroupBy(m => new { m.PartNo,m.FactoryCode}) .Select(a=> new {PartNo = a.Key.PartNo,FactoryCode = a.Key.FactoryCode ,qty = a.Sum(c=>c.Qty) }).ToList(); foreach (var stockGroupQty in stockGroupQtys) { var ifScan = details.FirstOrDefault(a => a.PartNo == stockGroupQty.PartNo); if (ifScan == null) { rfInfo.type = "FAIL"; rfInfo.message = "[" + stockGroupQty.PartNo + "]:不在委外发运单中,请检查!"; return rfInfo; } if (!stockGroupQty.FactoryCode.Equals(ifScan.FactoryCode)) { rfInfo.type = "FAIL"; rfInfo.message = "[" + stockGroupQty.PartNo + "]:与委外发运单不在同工厂,请检查!"; return rfInfo; } if (ifScan.PickQty >= ifScan.Qty) { rfInfo.type = "FAIL"; rfInfo.message = "[" + stockGroupQty.PartNo + "]:已完成配料!"; return rfInfo; } if (ifScan.PickQty + stockGroupQty.qty > ifScan.Qty) { rfInfo.type = "FAIL"; rfInfo.message = "本组托内零件:[" + stockGroupQty.PartNo + "]:本次配料数量[" + stockGroupQty.qty + "],大于待配料数量,不允许配料!"; return rfInfo; } } repository.UpdteStatusGroup(orderNo, groupNo, loginId); List wmsMoves1 = repository.getWmsOutstockDetailInfo(orderNo); for (int i = 0; i < wmsMoves1.Count; i++) { if (wmsMoves1[i].Qty != wmsMoves1[i].PickQty) { rfInfo.type = "PASS"; rfInfo.message = "校验成功!请继续扫描箱条码"; rfInfo.wmsObjectDetail = wmsMoves1.ConvertAll(s => (object)s); return rfInfo; } } rfInfo.type = "PASS"; rfInfo.message = "订单操作完成!请切换订单或移至委外发运"; rfInfo.wmsObjectDetail = wmsMoves1.ConvertAll(s => (object)s); return rfInfo; } public SetObjectDetail CheckMaterialSplit(string cartonNo, int splitNum, string loginId, int splitCount) { SetObjectDetail det = new SetObjectDetail(); //需要拆分的箱条码信息 List MaterialInfo = repository.GetMaterialInfo(cartonNo); if (MaterialInfo.Count == 0) { det.type = "NO"; det.message = "[" + cartonNo + "]:箱条码不存在,请检查!"; return det; } if (MaterialInfo[0].Enabled.Equals("N")) { det.type = "NO"; det.message = "[" + cartonNo + "]:箱条码已被冻结,请检查!"; return det; } if (MaterialInfo[0].Qty < 1) { det.type = "NO"; det.message = "[" + cartonNo + "]:箱条码数量不足,无法拆分!"; return det; } List NewStock = repository.CheckMaterialSplit(MaterialInfo, splitNum, loginId, splitCount); if (NewStock == null || NewStock.Count == 0) { det.type = "NO"; det.message = "执行失败!请重试!"; } else { det.type = "OK"; det.wmsObjectDetail = NewStock.ConvertAll(s => (object)s); } return det; } } }