using Newtonsoft.Json.Serialization; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.APIEnum; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.OtherEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO; using WIDESEA_DTO.ERP; using WIDESEA_DTO.MES; using WIDESEA_ITaskInfoRepository; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; using WIDESEA_Common.OrderEnum; using System.Diagnostics.Metrics; using System.Reflection.Metadata; using WIDESEA_DTO.Task; using WIDESEA_DTO.Stock; using SqlSugar; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; namespace WIDESEA_TaskInfoService { public partial class TaskService { static object lock_out = new object(); /// /// 测试架出仓 /// /// /// public MesResponseContent TestToolOut(TestToolOutModel model) { lock (lock_out) { MesResponseContent responseContent = new MesResponseContent(); try { Dt_Task exsit = Repository.QueryFirst(x => x.TargetAddress == model.TargetAddressCode); if (exsit != null) { return responseContent.Error($"目标地址重复"); } Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString()); //获取库存记录 List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.WarehouseId == warehouse.WarehouseId && x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList(); Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ToolCode)); if (stockInfo == null) { return responseContent.Error($"测试架:{model.ToolCode}无可用库存"); } Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode); if (exsit2 != null) { return responseContent.Error($"测试架批次号重复"); } Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode && x.WarehouseId == stockInfo.WarehouseId && x.LocationStatus == (int)LocationStatusEnum.InStock && (x.EnableStatus == (int)EnableStatusEnum.Normal || x.EnableStatus == (int)EnableStatusEnum.OnlyOut)); if (locationInfo == null) { return responseContent.Error($"测试架货位。。。。。。。。。:{stockInfo.LocationCode}出库条件不满足"); } //生成测试架出库任务 锁定库存 更改货位状态 Dt_Task taskOut = new() { CurrentAddress = stockInfo.LocationCode, Grade = 0, PalletCode = stockInfo.PalletCode, NextAddress = "", Roadway = locationInfo.RoadwayNo, SourceAddress = stockInfo.LocationCode, TargetAddress = model.TargetAddressCode, TaskStatus = (int)TaskStatusEnum.New, TaskType = (int)TaskTypeEnum.Outbound, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), PalletType = stockInfo.PalletType, WarehouseId = stockInfo.WarehouseId, }; stockInfo.StockStatus = (int)StockStatusEmun.出库锁定; LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus; locationInfo.LocationStatus = (int)LocationStatusEnum.Lock; //判断是否有出库单信息 _unitOfWorkManage.BeginTran(); //更新库存状态 _stockRepository.StockInfoRepository.UpdateData(stockInfo); //更新货位状态 _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId); //新建任务 BaseDal.AddData(taskOut); //加入货位变动记录 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", taskOut.TaskNum); _unitOfWorkManage.CommitTran(); //将任务推送到WCS PushTasksToWCS(new List() { taskOut }, "AGV_CSJ"); responseContent.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); responseContent.Error(ex.Message); } return responseContent; } } /// /// 测试架退库 /// /// public MesResponseContent TestToolBack(TestToolBackModel backModel) { MesResponseContent responseContent = new MesResponseContent(); try { //获取测试架原库存信息 Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString()); //获取库存记录 List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.WarehouseId == warehouse.WarehouseId && x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList(); Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == backModel.TestToolCode)); if (stockInfo == null) { return responseContent.Error($"{backModel.TestToolCode}库存信息不存在"); } //生成退库任务 Dt_Task taskIn = new() { CurrentAddress = backModel.SourceAddressCode, Grade = 0, PalletCode = stockInfo.PalletCode, NextAddress = "", Roadway = "", SourceAddress = backModel.SourceAddressCode, TargetAddress = "", TaskStatus = (int)TaskStatusEnum.New, TaskType = (int)TaskTypeEnum.ProductionReturn, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), PalletType = stockInfo.PalletType, WarehouseId = stockInfo.WarehouseId, }; //更改库存状态 stockInfo.StockStatus = StockStatusEmun.退库.ObjToInt(); BaseDal.AddData(taskIn); _stockRepository.StockInfoRepository.UpdateData(stockInfo); //将任务推送到WCS PushTasksToWCS(new List() { taskIn }, "AGV_CSJ"); ; responseContent.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); responseContent.Error(ex.Message); } return responseContent; } /// /// 测试架报废 /// /// public MesResponseContent TestScrap(TestToolScrap toolScraps) { MesResponseContent responseContent = new MesResponseContent(); try { //获取测试架批次号库存 Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString()); //获取库存记录 List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.WarehouseId == warehouse.WarehouseId && x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList(); List stockInfoUpdates = new List(); List stockInfoDetails = new List(); foreach (var item in toolScraps.ToolCodes) { Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == item)); if (stockInfo == null) { return responseContent.Error($"{item}库存信息不存在"); } stockInfoUpdates.Add(stockInfo); stockInfoDetails.Add(stockInfo.Details.FirstOrDefault()); } //清除库存信息 _unitOfWorkManage.BeginTran(); _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfoUpdates, OperateTypeEnum.自动删除); _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfoDetails, OperateTypeEnum.自动删除); _unitOfWorkManage.CommitTran(); responseContent.OK($"报废成功"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); responseContent.Error(ex.Message); } return responseContent; } /// /// 同步测试架寿命 /// /// /// public WebResponseContent TestSynStock(TestToolSynInfo toolSynInfo) { WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_TestToolSync.ToString()); MESRoot root = new MESRoot() { From = "WMS", DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Content = toolSynInfo }; JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; string request = JsonConvert.SerializeObject(root, settings); string response = HttpMesHelper.Post(apiInfo.ApiAddress, request); MesResponseContent mesResponseContent = response.DeserializeObject(); //调用接口 if (mesResponseContent.BSucc == true) { content.OK(mesResponseContent.StrMsg); } else { content.Error(mesResponseContent.StrMsg); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 物料出库,WMS同步出库物料批次至MES /// /// /// public WebResponseContent UploadMesMaterialLotaAcept(MesMaterialLotaAceptModel model) { WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_MaterialLotaAcept.ToString()); MESRoot root = new MESRoot() { From = "WMS", DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Content = model }; JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; string request = JsonConvert.SerializeObject(root, settings); string response = HttpMesHelper.Post(apiInfo.ApiAddress, request); MesResponseContent mesResponseContent = response.DeserializeObject(); //调用接口 if (mesResponseContent.BSucc == true) { content.OK(mesResponseContent.StrMsg); } else { content.Error(mesResponseContent.StrMsg); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// WMS同步成品出库至MES /// /// /// public WebResponseContent ShipmentOrderSync(MesShipmentOrderSync model) { WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_ShipmentOrderSync.ToString()); MESRoot root = new MESRoot() { From = "WMS", DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Content = model }; JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; string request = JsonConvert.SerializeObject(root, settings); string response = HttpMesHelper.Post(apiInfo.ApiAddress, request); MesResponseContent mesResponseContent = response.DeserializeObject(); //调用接口 if (mesResponseContent.BSucc == true) { content.OK(mesResponseContent.StrMsg); } else { content.Error(mesResponseContent.StrMsg); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// /// /// /// /// /// /// /// /// /// public MesMaterialLotaAceptModel GetMesMaterialLotaAceptModel(Dt_StockInfo stockInfo, Dt_StockInfoDetail stockInfoDetail, string taskNo, string warehouseCode, float quantity, string cutedType = "", float ppWidth = 0) { MesMaterialLotaAceptModel model = new MesMaterialLotaAceptModel() { CarrierCode = stockInfo.PalletCode, CutedType = cutedType, ExpirationDate = stockInfoDetail.EffectiveDate, MaterialBarCode = stockInfoDetail.SerialNumber, MaterialCode = stockInfoDetail.MaterielCode, MaterialLot = stockInfoDetail.MaterielCode + "," + stockInfoDetail.BatchNo, MaterialName = stockInfoDetail.MaterielName, PPWidth = ppWidth, ProductionDate = stockInfoDetail.ProductionDate, Quantity = quantity, Supplier = "", TaskNo = taskNo, Type = 1, WarehouseArea = warehouseCode, WarehouseLocation = warehouseCode }; return model; } /// /// 基板出库 /// /// /// public MesResponseContent SubstrateOut(SubstrateOutModel model) { try { string line = string.Empty; if (!model.Line.Contains("SCUTL")) { line = WarehouseEnum.HA58.ToString(); } else { line = WarehouseEnum.HA57.ToString(); } Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == line); if (warehouse == null) { return MesResponseContent.Instance.Error($"仓库基础信息未配置"); } Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterialCode); if (materielInfo == null) { return MesResponseContent.Instance.Error($"未找到该物料信息"); } Dt_MesOutboundOrder mesOutboundOrder = new Dt_MesOutboundOrder() { CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), Line = model.Line, MaterialCode = model.MaterialCode, MaterialName = model.MaterialName, OrderQuantity = model.RequiredQuantity, TaskNo = model.TaskNo, Unit = model.Unit, OrderType = MesOutboundOrderTypeEnum.SubstrateOut.ObjToInt(), OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(), WarehouseId = warehouse.WarehouseId }; List tasks = new List(); List? stockInfos = null; List? outStockLockInfos = null; List? locationInfos = null; { (List, Dt_MesOutboundOrder, List, List) result = _outboundService.MesOutboundOrderService.AssignStockOutbound(mesOutboundOrder); if (result.Item1 != null && result.Item1.Count > 0) { tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound); result.Item2.OrderStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); result.Item3.ForEach(x => { x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); }); stockInfos = result.Item1; mesOutboundOrder = result.Item2; outStockLockInfos = result.Item3; locationInfos = result.Item4; } else { throw new Exception("无库存"); } } tasks.ForEach(x => { x.TargetAddress = model.Line; }); _unitOfWorkManage.BeginTran(); int id = BaseDal.AddData(tasks); outStockLockInfos.ForEach(x => { x.OrderNo = mesOutboundOrder.TaskNo; x.OrderDetailId = id; }); _outboundService.MesOutboundOrderService.Repository.AddData(mesOutboundOrder); if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) { WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks); if (!content.Status) { _unitOfWorkManage.RollbackTran(); return MesResponseContent.Instance.Error(content.Message); } } _unitOfWorkManage.CommitTran(); PushTasksToWCS(tasks); return MesResponseContent.Instance.OK(); } catch (Exception ex) { return MesResponseContent.Instance.Error(ex.Message); } } /// /// 基板余料退库 /// /// /// public MesResponseContent SubstrateBack(SubstrateBackModel model) { try { Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => model.CarrierCode.Contains(x.CodeStartStr)); if (palletTypeInfo == null) { return MesResponseContent.Instance.Error($"未识别该托盘类型,请确认托盘号"); } Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == palletTypeInfo.WarehouseId); Dt_StockInfo_Hty stockInfo_Hty = _stockRepository.StockInfo_HtyRepository.QueryData(x => x.PalletCode == model.CarrierCode).OrderByDescending(x => x.SourceId).First(); Dt_StockInfoDetail_Hty stockInfoDetail_Hty = _stockRepository.StockInfoDetail_HtyRepository.QueryFirst(x => x.StockId == stockInfo_Hty.SourceId); Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = stockInfoDetail_Hty?.BatchNo ?? "", EffectiveDate = model.ExpirationDate, MaterielCode = model.MaterialCode, InboundOrderRowNo = stockInfoDetail_Hty?.InboundOrderRowNo ?? 0, MaterielName = model.MaterialCode, ProductionDate = model.ProductionDate, OrderNo = stockInfoDetail_Hty?.OrderNo ?? "", OutboundQuantity = 0, SerialNumber = stockInfoDetail_Hty?.SerialNumber ?? "0", StockQuantity = model.Quantity, Status = model.Quantity <= 0.0 ? StockStatusEmun.MES空托退库.ObjToInt() : StockStatusEmun.MES退库.ObjToInt(), Unit = model.Unit }; Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = model.CarrierCode, PalletType = palletTypeInfo.PalletType, WarehouseId = warehouse.WarehouseId, StockStatus = stockInfoDetail.StockQuantity <= 0.0 ? StockStatusEmun.MES空托退库.ObjToInt() : StockStatusEmun.MES退库.ObjToInt(), Details = new List { stockInfoDetail }, Remark = stockInfoDetail.StockQuantity <= 0.0 ? StockStatusEmun.MES空托退库.ToString() : StockStatusEmun.MES退库.ToString() }; //Dt_Task task = new Dt_Task() //{ // PalletCode = stockInfo.PalletCode, // CurrentAddress = "", // NextAddress = "", // PalletType = stockInfo.PalletType, // Roadway = "RGV01_BC", // SourceAddress = "RGV01_BC", // TargetAddress = "", // TaskStatus = TaskStatusEnum.New.ObjToInt(), // TaskType = TaskTypeEnum.MesMatReturn.ObjToInt(), // WarehouseId = warehouse.WarehouseId //}; _unitOfWorkManage.BeginTran(); Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); //BaseDal.AddData(task); _unitOfWorkManage.CommitTran(); return MesResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return MesResponseContent.Instance.Error(ex.Message); } } /// /// PP大卷出库-进行分卷 /// /// /// public MesResponseContent PPSubsectionOut(PPSubsectionOutModel model) { MesResponseContent modelCount = new MesResponseContent(); try { Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString()); if (warehouse == null) { return MesResponseContent.Instance.Error("仓库信息未配置"); } Dt_MesPPOutboundOrder mesPPOutboundOrder = BaseDal.Db.Queryable().Where(x => x.TaskNo == model.TaskNo).Includes(x => x.Details).First(); if (mesPPOutboundOrder != null) { return MesResponseContent.Instance.Error("已存在此任务单号"); } List mesPPOutboundOrderDetail = new List(); foreach (var item in model.Carriers) { //mesPPOutboundOrderDetail.Add(_mapper.Map(item)); Dt_MesPPOutboundOrderDetail dt_MesPPOutboundOrderDetail = new Dt_MesPPOutboundOrderDetail { CarrierCode = item.CarrierCode, Warehouse = item.Warehouse, OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt() }; mesPPOutboundOrderDetail.Add(dt_MesPPOutboundOrderDetail); } Dt_MesPPOutboundOrder mesOutboundOrder = new Dt_MesPPOutboundOrder() { CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), MaterialCode = model.MaterialCode, MaterialName = model.MaterialName, OrderQuantity = model.RequiredQuantity, TaskNo = model.TaskNo, Unit = model.Unit,//PP需要转换成米(需求平方(PNL数*面积)/宽度) Width = model.Width, TargetAddressCode = model.TargetAddressCode, OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(), OrderType = OutOrderTypeEnum.Issue.ObjToInt(), WarehouseId = warehouse.WarehouseId, Details = mesPPOutboundOrderDetail }; #region //Db.InsertNav(mesOutboundOrder).Include(x=>x.Details).ExecuteCommand(); // List tasks = new List(); // List? stockInfos = null; // List? outStockLockInfos = null; // List? locationInfos = null; // { //(List, Dt_MesPPOutboundOrder, List, List) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesOutboundOrder); // if (result.Item1 != null && result.Item1.Count > 0) // { // tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound); // result.Item2.OrderStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // result.Item3.ForEach(x => // { // x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); // }); // stockInfos = result.Item1; // mesOutboundOrder = result.Item2; // outStockLockInfos = result.Item3; // locationInfos = result.Item4; // mesPPOutboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // } // else // { // throw new Exception("无库存"); // } // } // tasks.ForEach(x => // { // x.TargetAddress = model.TargetAddressCode; // }); // _unitOfWorkManage.BeginTran(); // int id = BaseDal.AddData(tasks); // outStockLockInfos.ForEach(x => // { // x.OrderNo = mesOutboundOrder.TaskNo; // x.OrderDetailId = id; // }); // //_outboundService.MesPPOutboundOrderService.Repository.AddData(mesOutboundOrder); // Db.InsertNav(mesOutboundOrder).Include(x => x.Details).ExecuteCommand(); // if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) // { // WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks); // if (!content.Status) // { // _unitOfWorkManage.RollbackTran(); // return MesResponseContent.Instance.Error(content.Message); // } // } // _unitOfWorkManage.CommitTran(); // PushTasksToWCS(tasks); //} #endregion Db.InsertNav(mesOutboundOrder).Include(x => x.Details).ExecuteCommand(); return MesResponseContent.Instance.OK(); } catch (Exception ex) { return MesResponseContent.Instance.Error(ex.Message); } } /// /// PP小卷出库 /// /// /// public MesResponseContent PPCutOut(PPCutOutModle model) { try { Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString()); if (warehouse == null) { return MesResponseContent.Instance.Error("仓库基础信息未配置"); } Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder = BaseDal.Db.Queryable().Where(x => x.TaskNo == model.TaskNo).Includes(x => x.Details).First(); if (mesPPCutOutboundOrder != null) { return MesResponseContent.Instance.Error("已存在此任务单号"); } List mesPPCutOutboundOrderDetail = new List(); foreach (var item in model.MaterialDetails) { mesPPCutOutboundOrderDetail.Add(_mapper.Map(item)); } Dt_MesPPCutOutboundOrder mesPPOutboundOrder = new Dt_MesPPCutOutboundOrder() { CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), TaskNo = model.TaskNo, OrderType = OutOrderTypeEnum.Issue.ObjToInt(), OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(), WarehouseId = warehouse.WarehouseId, Details = mesPPCutOutboundOrderDetail, }; _unitOfWorkManage.BeginTran(); Db.InsertNav(mesPPOutboundOrder).Include(x => x.Details).ExecuteCommand(); _unitOfWorkManage.CommitTran(); #region //List tasks = new List(); //List? stockInfos = null; //List? outStockLockInfos = null; //List? locationInfos = null; //{ //(List, Dt_MesPPCutOutboundOrderDetail, List, List) result = _outboundService.MesPPOutboundOrderService.AssignStockOutbound(mesPPOutboundOrder, mesPPCutOutboundOrderDetail); // if (result.Item1 != null && result.Item1.Count > 0) // { // tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound); // result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // result.Item3.ForEach(x => // { // x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); // }); // stockInfos = result.Item1; // mesPPCutOutboundOrderDetail = result.Item2; // outStockLockInfos = result.Item3; // locationInfos = result.Item4; // } // else // { // throw new Exception("无库存"); // } //} //tasks.ForEach(x => //{ // x.TargetAddress = mesPPCutOutboundOrderDetail.TargetAddressCode; //}); //_unitOfWorkManage.BeginTran(); //int id = BaseDal.AddData(tasks); //outStockLockInfos.ForEach(x => //{ // x.OrderNo = mesPPOutboundOrder.TaskNo; // x.OrderDetailId = id; //}); ////_outboundService.MesPPOutboundOrderService.Repository.AddData(mesOutboundOrder); //Db.InsertNav(mesPPOutboundOrder).Include(x => x.Details).ExecuteCommand(); //if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) //{ // WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks); // if (!content.Status) // { // _unitOfWorkManage.RollbackTran(); // return MesResponseContent.Instance.Error(content.Message); // } //} //_unitOfWorkManage.CommitTran(); //PushTasksToWCS(tasks, "AGV_PP"); #endregion return MesResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return MesResponseContent.Instance.Error(ex.Message); } } /// /// PP入库(大卷、小卷、张料) /// /// /// public MesResponseContent PPBack(PPBackModel model) { try { foreach (var item in model.MaterialLotInfo) { //获取物料信息 Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterialCode); if (materielInfo == null) { return MesResponseContent.Instance.Error($"物料{item.MaterialCode}不存在!"); } Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString()); if (warehouse == null) { return MesResponseContent.Instance.Error($"未找到仓库信息"); } Dt_MesPPBackInboundOrderDetail mesPPBackInboundOrderDetail = new Dt_MesPPBackInboundOrderDetail() { MaterialLot = item.MaterialLot, MaterielCode = item.MaterialCode, OrderQuantity = item.Quantity, CutedWidth = item.CutedWidth, MaterialLotOld = item.MaterialLotOld, Unit = item.Unit, ProductionDate = item.ProductionDate, EffectiveDate = item.ExpirationDate, OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), }; Dt_MesPPBackInboundOrder mesPPBackInboundOrder = new Dt_MesPPBackInboundOrder() { WarehouseId = warehouse.WarehouseId, SourceAddressCode = model.SourceAddressCode, CarrierCode = model.CarrierCode, OrderStatus = InOrderStatusEnum.未开始.ObjToInt(), CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), Details = new List { mesPPBackInboundOrderDetail } }; Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = mesPPBackInboundOrderDetail.MaterialLot, MaterielCode = mesPPBackInboundOrderDetail.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = "", SerialNumber = "", StockQuantity = mesPPBackInboundOrderDetail.OrderQuantity, OutboundQuantity = 0, Unit = materielInfo.MaterielUnit, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = mesPPBackInboundOrderDetail.ProductionDate, EffectiveDate = mesPPBackInboundOrderDetail.EffectiveDate, InboundOrderRowNo = mesPPBackInboundOrderDetail.RowNo, }; Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = model.CarrierCode, StockStatus = StockStatusEmun.组盘暂存.ObjToInt(), WarehouseId = mesPPBackInboundOrder.WarehouseId, Details = new List { stockInfoDetail } }; _unitOfWorkManage.BeginTran(); Db.InsertNav(mesPPBackInboundOrder).Include(x => x.Details).ExecuteCommand(); Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); WebResponseContent content = DeviceRequestInboundTask(mesPPBackInboundOrder, stockInfo); if (!content.Status) { _unitOfWorkManage.RollbackTran(); return MesResponseContent.Instance.Error(content.Message); } _unitOfWorkManage.CommitTran(); } return MesResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return MesResponseContent.Instance.Error(ex.Message); } } public WebResponseContent DeviceRequestInboundTask(Dt_MesPPBackInboundOrder mesPPBackInboundOrder, Dt_StockInfo stockInfo) { try { Dt_Task task = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode); if (task != null) { PushTasksToWCS(new List { task }); return WebResponseContent.Instance.Error($"该托盘已生成任务"); } if (Repository.QueryFirst(x => x.SourceAddress == stockInfo.PalletCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null) { return WebResponseContent.Instance.Error($"该站点已有未执行的任务"); } //Dt_StockInfo stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); //if (stockInfos == null) //{ // return WebResponseContent.Instance.Error($"未找到组盘信息"); //} //if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.出库完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES退库.ObjToInt()) //{ // return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库"); //} //if (!string.IsNullOrEmpty(stockInfo.LocationCode)) //{ // return WebResponseContent.Instance.Error($"该托盘已绑定货位"); //} //只入平库,需判断平库定义货位类型。。。。。。。。。。。。 Dt_LocationInfo? locationInfos = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == stockInfo.WarehouseId && x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt()); Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(locationInfos.RoadwayNo, stockInfo.PalletType, stockInfo.WarehouseId); if (locationInfo == null) { return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位"); } Dt_Task newTask = new Dt_Task() { CurrentAddress = mesPPBackInboundOrder.SourceAddressCode, Grade = 0, NextAddress = locationInfo.LocationCode, PalletCode = stockInfo.PalletCode, Roadway = locationInfo.RoadwayNo,//巷道号包含AGV SourceAddress = mesPPBackInboundOrder.SourceAddressCode, TargetAddress = locationInfo.LocationCode, TaskType = TaskTypeEnum.Inbound.ObjToInt(), TaskStatus = TaskStatusEnum.New.ObjToInt(), WarehouseId = stockInfo.WarehouseId, PalletType = stockInfo.PalletType }; LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus; _unitOfWorkManage.BeginTran(); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation); _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, newTask.PalletType, LocationStatusEnum.Lock, newTask.WarehouseId); BaseDal.AddData(newTask); _stockRepository.StockInfoRepository.UpdateData(stockInfo); _unitOfWorkManage.CommitTran(); PushTasksToWCS(new List { newTask }); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// PP库存查询 /// /// /// public MesResponseContent QueryPpByWidth(QueryPpByWidthModel model) { MesResponseContent content = new MesResponseContent(); try { //需判断查询立库,平库 Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA58.ToString()); List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.WarehouseId == warehouse.WarehouseId && x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList(); Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.MaterielCode == model.MaterialCode && x.CutedWidth == model.CutedWidth)); if (stockInfo == null) { return content.Error($"PP仓立库/平库:物料编号:{model.MaterialCode},裁切宽:{model.CutedWidth},未找到此物料库存信息"); } var stock = stockInfo.Details.FirstOrDefault(); if (stock != null) { content.Content = new { MaterialCode = stock.MaterielCode, Quantity = stock.StockQuantity, Unit = stock.Unit, Warehouse = warehouse.WarehouseCode, WarehouseName = warehouse.WarehouseName, CutedWidth = stock.CutedWidth, CarrierCode = stockInfo.PalletCode, MaterialLot = stock.BatchNo, }; } return content.OK(); } catch (Exception ex) { return MesResponseContent.Instance.Error(ex.Message); } } /// /// MES成品入库单接收 /// /// public MesResponseContent BagInfoSync(MesBagInfoModel bagInfoModel) { MesResponseContent content = new MesResponseContent(); try { Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == bagInfoModel.WarehouseCode); if (warehouse == null) { return content.Error("未找到仓库信息"); } Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.WarehouseId == warehouse.WarehouseId); if (locationInfo==null) { return content.Error($"未找到{warehouse.WarehouseCode}货位信息"); } //内包信息组盘 List mesProInOrderDetails = new List(); foreach (var item in bagInfoModel.BagDetails) { foreach (var child in item.BagItems) { Dt_MesProInOrderDetail mesProInOrderDetail = new Dt_MesProInOrderDetail() { BagNo = item.BagNo, ProductCode = item.ProductCode, ProductVersion = item.ProductVersion, SETQty = child.SETQty, OKPCSQTY = child.OKPCSQTY, DateCode = item.DateCode, XQty = child.XQty, XSite = child.XSite, Weight = item.Weight, PackingDate = item.PackingDate, LotNumber = child.LotNumber, ERPOrder = child.ERPOrder, SaleOrder = child.SaleOrder, MoNumber = child.MoNumber, }; mesProInOrderDetails.Add(mesProInOrderDetail); } } List proStockInfoDetails = new List(); foreach (var item in mesProInOrderDetails) { proStockInfoDetails.Add(_mapper.Map(item)); } Dt_MesProInOrder mesProInOrder = new Dt_MesProInOrder() { WarehouseId = warehouse.WarehouseId, BatchNo = bagInfoModel.BatchNo, WorkCenter = bagInfoModel.WorkCenter, MesProStatus = InOrderStatusEnum.未开始.ObjToInt(), UnPackStock = bagInfoModel.UnPackStock, Details = mesProInOrderDetails }; Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo() { PalletCode = bagInfoModel.BatchNo, PalletType = 1, WarehouseId = warehouse.WarehouseId, StockStatus = StockStatusEmun.入库确认.ObjToInt(), proStockInfoDetails = proStockInfoDetails }; //分配货位 locationInfo = _basicService.LocationInfoService.AssignLocation(locationInfo.RoadwayNo, ((PalletTypeEnum)proStockInfo.PalletType).ObjToInt(), proStockInfo.WarehouseId); Dt_Task newTask = new Dt_Task() { CurrentAddress = bagInfoModel.WorkCenter, Grade = 0, NextAddress = locationInfo.LocationCode, PalletCode = proStockInfo.PalletCode, Roadway = locationInfo.RoadwayNo, SourceAddress = bagInfoModel.WorkCenter, TargetAddress = locationInfo.LocationCode, TaskType = TaskTypeEnum.InProduct.ObjToInt(), TaskStatus = TaskStatusEnum.New.ObjToInt(), WarehouseId = warehouse.WarehouseId, PalletType = proStockInfo.PalletType }; locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); _unitOfWorkManage.BeginTran(); int taskId = BaseDal.AddData(newTask); newTask.TaskId = taskId; _basicRepository.LocationInfoRepository.UpdateData(locationInfo); Db.InsertNav(mesProInOrder).Include(x => x.Details).ExecuteCommand(); Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand(); _unitOfWorkManage.CommitTran(); //推送任务 PushTasksToWCS(new List { newTask }); return content.OK("接收成功"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } public MesResponseContent BoxStockin(MesBoxInfoModel boxInfoModel) { MesResponseContent content = new MesResponseContent(); try { Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString()); //获取MES内包信息 List mesProInOrderDetails = new List(); foreach (var item in boxInfoModel.Bags) { foreach (var child in item.BagItems) { Dt_MesProInOrderDetail mesProInOrderDetail = new Dt_MesProInOrderDetail() { BagNo = item.BagNo, ProductCode = item.ProductCode, ProductVersion = item.ProductVersion, SETQty = child.SETQty, OKPCSQTY = child.OKPCSQTY, DateCode = item.DateCode, XQty = child.XQty, XSite = child.XSite, Weight = item.Weight, PackingDate = item.PackingDate, LotNumber = child.LotNumber, ERPOrder = child.ERPOrder, SaleOrder = child.SaleOrder, MoNumber = child.MoNumber, }; mesProInOrderDetails.Add(mesProInOrderDetail); } } List proStockInfoDetails = new List(); foreach (var item in mesProInOrderDetails) { proStockInfoDetails.Add(_mapper.Map(item)); } Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo() { PalletCode = boxInfoModel.BoxNo, PalletType = 0, WarehouseId = warehouse.WarehouseId, ShipmentOrder = boxInfoModel.ShipmentOrder, StockStatus = StockStatusEmun.入库完成.ObjToInt(), proStockInfoDetails = proStockInfoDetails }; _unitOfWorkManage.BeginTran(); Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand(); _unitOfWorkManage.CommitTran(); return content.OK("外包接收成功"); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 成品返工提库 /// /// /// public MesResponseContent RworkTask(RworkTaskModel model) { try { Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA72.ToString()); //获取库存记录 List stockInfos = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.WarehouseId == warehouse.WarehouseId && x.StockStatus == (int)StockStatusEmun.入库完成).Includes(x => x.Details).ToList(); Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == model.ProductVersion)); if (stockInfo == null) { return MesResponseContent.Instance.Error($"尾数仓:{model.ProductVersion}无可用库存"); } Dt_Task exsit2 = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode); } catch (Exception ex) { throw; } return MesResponseContent.Instance.OK(); } /// /// 生成PP大卷出库任务 /// /// 出库单明细主键 /// public WebResponseContent MESPPGenerateOutboundTasks(int[] keys) { try { List tasks = new List(); List stockSelectViews = new List(); List stockInfos = new List(); List outboundOrderDetails = new List(); List outStockLockInfos = new List(); List locationInfos = new List(); (List, List?, List?, List?, List?, Dt_MesPPOutboundOrder mesPPOutboundOrder) result = MESPPOutboundTaskDataHandle(keys); if (result.Item2 != null && result.Item2.Count > 0) { stockInfos.AddRange(result.Item2); } if (result.Item3 != null && result.Item3.Count > 0) { outboundOrderDetails.AddRange(result.Item3); } if (result.Item4 != null && result.Item4.Count > 0) { outStockLockInfos.AddRange(result.Item4); } if (result.Item5 != null && result.Item5.Count > 0) { locationInfos.AddRange(result.Item5); } if (result.Item1 != null && result.Item1.Count > 0) { tasks.AddRange(result.Item1); } if (result.mesPPOutboundOrder != null) { } WebResponseContent content = MESPPGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, result.mesPPOutboundOrder); return content; } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// PP大卷出库任务数据处理 /// /// /// /// /// public (List, List?, List?, List?, List?, Dt_MesPPOutboundOrder mesPPOutboundOrder) MESPPOutboundTaskDataHandle(int[] keys) { List tasks = new List(); List outboundOrderDetails = BaseDal.Db.Queryable().Where(x => keys.Contains(x.Id)).ToList(); if (outboundOrderDetails == null || outboundOrderDetails.Count == 0) { throw new Exception("未找到出库单明细信息"); } if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null) { throw new Exception("所选出库单明细存在出库中或已完成"); } List? stockInfos = null; List? orderDetails = null; List? outStockLockInfos = null; List? locationInfos = null; Dt_MesPPOutboundOrder? mesPPOutboundOrders = null; if (outboundOrderDetails.FirstOrDefault().OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) { (List, List, List, List, Dt_MesPPOutboundOrder mesPPOutboundOrder) result = _outboundService.MesPPOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails); if (result.Item1 != null && result.Item1.Count > 0) { Dt_MesPPOutboundOrder outboundOrder = _outboundService.MesPPOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId); TaskTypeEnum typeEnum = outboundOrder.OrderType switch { (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound, (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate, (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality, _ => new TaskTypeEnum() }; tasks = GetTasks(result.Item1, typeEnum); result.Item2.ForEach(x => { x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); }); result.Item3.ForEach(x => { x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); }); stockInfos = result.Item1; orderDetails = result.Item2; outStockLockInfos = result.Item3; locationInfos = result.Item4; mesPPOutboundOrders = result.mesPPOutboundOrder; } else { throw new Exception("无库存"); } } //else //{ // List stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetails.oi, OutLockStockStatusEnum.已分配); // if (stockLockInfos != null && stockLockInfos.Count > 0) // { // List stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList()); // tasks = GetTasks(stocks); // } //} return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos, mesPPOutboundOrders); } /// /// PP平库直接出库 /// /// /// /// public WebResponseContent PPGeneratePKOutboundTask(int orderDetailId, List stockSelectViews) { try { (List, List?, List?, List?, List?) result = PPOutboundTaskDataHandle(orderDetailId, stockSelectViews); WebResponseContent content = PPGenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5); return content; } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// PP立库小卷直接出库 /// /// /// /// public WebResponseContent PPCutOutGenerateOutboundTasks(int orderDetailId, List stockSelectViews) { try { (List, List?, List?, List?, List?) result = PPOutboundTaskDataHandle(orderDetailId, stockSelectViews); WebResponseContent content = PPGenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5); return content; } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 出库任务数据处理 /// /// /// /// /// public (List, List?, List?, List?, List?) PPOutboundTaskDataHandle(int orderDetailId, List stockSelectViews) { List tasks = new List(); Dt_MesPPCutOutboundOrderDetail outboundOrderDetail = _outboundService.MesPPCutOutboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId); if (outboundOrderDetail == null) { throw new Exception("未找到出库单明细信息"); } if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity) { throw new Exception("选择数量超出单据数量"); } List? stockInfos = null; Dt_MesPPCutOutboundOrderDetail? orderDetail = null; List? outStockLockInfos = null; List? locationInfos = null; if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) { (List, Dt_MesPPCutOutboundOrderDetail, List, List) result = _outboundService.MesPPCutOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews); if (result.Item1 != null && result.Item1.Count > 0) { Dt_MesPPCutOutboundOrder outboundOrder = _outboundService.MesPPCutOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId); TaskTypeEnum typeEnum = outboundOrder.OrderType switch { (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound, (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate, (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality, _ => new TaskTypeEnum() }; tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound); result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); result.Item3.ForEach(x => { x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); }); stockInfos = result.Item1; orderDetail = result.Item2; outStockLockInfos = result.Item3; locationInfos = result.Item4; } else { throw new Exception("无库存"); } } else { List stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetail.OrderId, OutLockStockStatusEnum.已分配); if (stockLockInfos != null && stockLockInfos.Count > 0) { List stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList()); tasks = GetTasks(stocks, TaskTypeEnum.Outbound); } } return (tasks, stockInfos, orderDetail == null ? null : new List { orderDetail }, outStockLockInfos, locationInfos); } public WebResponseContent PPGenerateOutboundTaskDataUpdate(List tasks, List? stockInfos = null, List? outboundOrderDetails = null, List? outStockLockInfos = null, List? locationInfos = null) { try { _unitOfWorkManage.BeginTran(); BaseDal.AddData(tasks); if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) { stockInfos.ForEach(x => { x.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); }); WebResponseContent content = _outboundService.MesPPCutOutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks); if (!content.Status) { _unitOfWorkManage.RollbackTran(); return content; } } else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0) { outboundOrderDetails.ForEach(x => { x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); }); _outboundService.MesPPCutOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); } _unitOfWorkManage.CommitTran(); PushTasksToWCS(tasks); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } #region /// /// 生成PP小卷出库任务 /// /// 出库单明细主键 /// //public WebResponseContent PPCutOutGenerateOutboundTasks(int[] keys) //{ // try // { // List tasks = new List(); // List stockSelectViews = new List(); // List stockInfos = new List(); // List outboundOrderDetails = new List(); // List outStockLockInfos = new List(); // List locationInfos = new List(); // (List, List?, List?, List?, List?) result = PPCutOutboundTaskDataHandle(keys); // if (result.Item2 != null && result.Item2.Count > 0) // { // stockInfos.AddRange(result.Item2); // } // if (result.Item3 != null && result.Item3.Count > 0) // { // outboundOrderDetails.AddRange(result.Item3); // } // if (result.Item4 != null && result.Item4.Count > 0) // { // outStockLockInfos.AddRange(result.Item4); // } // if (result.Item5 != null && result.Item5.Count > 0) // { // locationInfos.AddRange(result.Item5); // } // if (result.Item1 != null && result.Item1.Count > 0) // { // tasks.AddRange(result.Item1); // } // WebResponseContent content = PPCutOutGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos); // return content; // } // catch (Exception ex) // { // _unitOfWorkManage.RollbackTran(); // return WebResponseContent.Instance.Error(ex.Message); // } //} ///// ///// PP小卷出库任务数据处理 ///// ///// ///// ///// ///// //public (List, List?, List?, List?, List?) PPCutOutboundTaskDataHandle(int[] keys) //{ // List tasks = new List(); // List outboundOrderDetails = BaseDal.Db.Queryable().Where(x => keys.Contains(x.Id)).ToList(); // if (outboundOrderDetails == null || outboundOrderDetails.Count == 0) // { // throw new Exception("未找到出库单明细信息"); // } // if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null) // { // throw new Exception("所选出库单明细存在出库中或已完成"); // } // List? stockInfos = null; // List? orderDetails = null; // List? outStockLockInfos = null; // List? locationInfos = null; // if (outboundOrderDetails.FirstOrDefault().OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) // { // (List, List, List, List) result = _outboundService.MesPPCutOutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails); // if (result.Item1 != null && result.Item1.Count > 0) // { // Dt_MesPPCutOutboundOrder outboundOrder = _outboundService.MesPPCutOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId); // //TaskTypeEnum typeEnum = outboundOrder.OrderType switch // //{ // // (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound, // // (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate, // // (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality, // // _ => new TaskTypeEnum() // //}; // tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound); // result.Item2.ForEach(x => // { // x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // }); // result.Item3.ForEach(x => // { // x.Status = OutLockStockStatusEnum.出库中.ObjToInt(); // }); // stockInfos = result.Item1; // orderDetails = result.Item2; // outStockLockInfos = result.Item3; // locationInfos = result.Item4; // } // else // { // throw new Exception("无库存"); // } // } // //else // //{ // // List stockLockInfos = _outboundService.OutboundStockLockInfoService.GetByOrderDetailId(outboundOrderDetails.OrderId, OutLockStockStatusEnum.已分配); // // if (stockLockInfos != null && stockLockInfos.Count > 0) // // { // // List stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList()); // // tasks = GetTasks(stocks); // // } // //} // return (tasks, stockInfos, orderDetails, outStockLockInfos, locationInfos); //} ///// ///// 生成PP小卷出库任务后数据更新到数据库 ///// ///// ///// ///// ///// ///// ///// //public WebResponseContent PPCutOutGenerateOutboundTaskDataUpdate(List tasks, List? stockInfos = null, List? outboundOrderDetails = null, List? outStockLockInfos = null, List? locationInfos = null) //{ // try // { // _unitOfWorkManage.BeginTran(); // BaseDal.AddData(tasks); // if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) // { // stockInfos.ForEach(x => // { // x.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); // }); // WebResponseContent content = _outboundService.MesPPCutOutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks); // if (!content.Status) // { // _unitOfWorkManage.RollbackTran(); // return content; // } // } // else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0) // { // outboundOrderDetails.ForEach(x => // { // x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); // }); // _outboundService.MesPPCutOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); // } // _unitOfWorkManage.CommitTran(); // PushTasksToWCS(tasks,"AGV_PP"); // return WebResponseContent.Instance.OK(); // } // catch (Exception ex) // { // _unitOfWorkManage.RollbackTran(); // return WebResponseContent.Instance.Error(ex.Message); // } //} #endregion /// /// 生成PP大卷出库任务后数据更新到数据库 /// /// /// /// /// /// /// public WebResponseContent MESPPGenerateOutboundTaskDataUpdate(List tasks, List? stockInfos = null, List? outboundOrderDetails = null, List? outStockLockInfos = null, List? locationInfos = null, Dt_MesPPOutboundOrder? mesPPOutboundOrder = null) { try { _unitOfWorkManage.BeginTran(); BaseDal.AddData(tasks); if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0) { stockInfos.ForEach(x => { x.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); }); WebResponseContent content = _outboundService.MesPPOutboundOrderDetailService.LockOutboundStockDataUpdate(mesPPOutboundOrder, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks); if (!content.Status) { _unitOfWorkManage.RollbackTran(); return content; } } else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0) { outboundOrderDetails.ForEach(x => { x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); }); _outboundService.MesPPOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); } _unitOfWorkManage.CommitTran(); PushTasksToWCS(tasks); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } } }