public Messages DeductQty(ActionEventArgs actionEventArgs, DataCollectFacade dataCollectFacade, MINNO minno) { SystemSettingFacade systemSettingFacade = new SystemSettingFacade(this.DataProvider); MaterialFacade materialFacade = new MaterialFacade(this.DataProvider); MOFacade moFacade = new MOFacade(this.DataProvider); OPBOMFacade opbomFacade = new OPBOMFacade(this.DataProvider); ItemFacade itemFacade = new ItemFacade(this.DataProvider); InventoryFacade inventoryFacade = new InventoryFacade(this.DataProvider); LotSimulation simulation = ((CINNOActionEventArgs)actionEventArgs).ProductInfo.NowSimulation; LotSimulationReport simulationReport = ((CINNOActionEventArgs)actionEventArgs).ProductInfo.NowSimulationReport; Messages returnValue = new Messages(); string lotNoList = string.Empty;// add by Jarvis For onWipItem ProductInfo productionInfo = actionEventArgs.ProductInfo; LotSimulation sim = actionEventArgs.ProductInfo.NowSimulation; int orgid = actionEventArgs.ProductInfo.Resource.OrganizationID; MO mo = actionEventArgs.ProductInfo.CurrentMO; if (mo == null) { mo = moFacade.GetMO(sim.MOCode) as MO; } //获取当前工单号 string moCode = productionInfo.NowSimulation.MOCode; //获取当前工序号 string opCode = productionInfo.NowSimulation.OPCode; //获取当前产品号 string itemCode = productionInfo.NowSimulation.ItemCode; //获取途程代码 string routeCode = productionInfo.NowSimulation.RouteCode; string resCode = productionInfo.Resource.ResourceCode; //获取ORGID int orgID = productionInfo.Resource.OrganizationID; string moBomVer = string.Empty; object objMo = moFacade.GetMO(moCode); if (objMo != null) { moBomVer = (objMo as MO).BOMVersion; } //获取物料名称 string MItemName = string.Empty; Domain.MOModel.Material material = ((Domain.MOModel.Material)itemFacade.GetMaterial(minno.MItemCode, orgID)); if (material != null) { MItemName = material.MaterialName; } //添加产品已上料扣料判断 tblonwip string lotNo = productionInfo.NowSimulation.LotCode; decimal seq = productionInfo.NowSimulation.LotSeq; //object[] objOnWip = dataCollectFacade.QueryLotOnWIP(lotNo, moCode, opCode, "CINNO"); //if (objOnWip != null && objOnWip.Length > 0) //{ // return returnValue; //} //remove by Jarvis 不检查工单BOM 20120321 //object[] objMoBoms = moFacade.QueryMoBom(sim.ItemCode, minno.MItemCode, sim.MOCode);//检查工单BOM是否有该首选料, Jarvis 20120319 //if (objMoBoms == null) //{ // throw new Exception("$CS_ItemCode[" + minno.MItemCode + "]" + "$Error_NotExistInMoBOM" + String.Format("[$MOCode='{0}']", sim.MOCode)); //} object[] opbomObjs = opbomFacade.QueryOPBOMDetail(sim.ItemCode, minno.MItemCode, string.Empty, string.Empty, string.Empty, sim.RouteCode, opCode, (int)MaterialType.CollectMaterial, int.MinValue, int.MaxValue, orgid, true); if (opbomObjs == null) { throw new Exception("$CS_ItemCode[" + minno.MItemCode + "]" + "$Error_NotExistInOPBOM" + String.Format("[$ItemCode='{0}']", sim.ItemCode)); } object[] moRouteObjs = moFacade.QueryMORoutes(sim.MOCode, sim.RouteCode); if (moRouteObjs == null) { throw new Exception("$Error_MORouteNOExist"); } bool iflag = false; decimal iOPBOMItemQty = 0; //需要比对的子阶料料号 比对成功的 只在工单生产BOM 中 if (opbomObjs == null)//去掉检查工单BOM是否为空 { return(returnValue); } //以工单标准BOM为基准,扣减当前工单的倒冲库存地(tblmo. EATTRIBUTE2)中相对应的库存信息 //for (int n = 0; n < objMoBoms.Length; n++)//去掉工单BOM 20120321 Jarvis //{ //求得opbom中对应的料品 string TempMOBOMItemCode = minno.MItemCode; iflag = false; iOPBOMItemQty = 0; for (int j = 0; j < opbomObjs.Length; j++) { if (TempMOBOMItemCode.ToUpper() == ((OPBOMDetail)opbomObjs[j]).OPBOMItemCode.ToUpper() || TempMOBOMItemCode.ToUpper() == ((OPBOMDetail)opbomObjs[j]).OPBOMSourceItemCode.ToUpper()) { //子阶料存在或有替代料可用 iflag = true; //TempMOBOMItemCode = ((OPBOMDetail)opbomObjs[j]).OPBOMItemCode;//remove by Jarvis 20120316 //For 替代料,记录首选料号,Jarvis 20120316 //TempMOBOMItemCode = ((MOBOM)objMoBoms[n]).MOBOMItemCode; iOPBOMItemQty = (decimal)((OPBOMDetail)opbomObjs[j]).OPBOMItemQty; iOPBOMItemQty *= sim.LotQty; break; } } //比对成功:子阶料料号一致 if (iflag)//子阶料不存在, 即只在工单标准bom中 { //object[] objInfos = inventoryFacade.QueryStorageInfoByIDAndMCode(mo.EAttribute2, TempMOBOMItemCode.ToUpper()); object[] objInfos = inventoryFacade.QueryStorageInfoByIDAndMCode(TempMOBOMItemCode.ToUpper()); if (objInfos == null) { throw new Exception("$CS_ItemCode[" + minno.MItemCode + "]" + "$CS_StorageQty_ERROR"); } //获取物料的总库存数,Jarvis 20120316 //decimal total = inventoryFacade.GetStorageQty(mo.EAttribute2, TempMOBOMItemCode.ToUpper()); decimal total = inventoryFacade.GetStorageQty(TempMOBOMItemCode.ToUpper()); if (total < iOPBOMItemQty) { throw new Exception("$CS_ItemCode[" + minno.MItemCode + "]" + "$CS_StorageQty_ERROR"); } #region //先判断备料批号中的数据量,不够扣减就退出 decimal temlotQty = 0; object[] objStorageLotInfo = null; ArrayList StorageLotInfoList = new ArrayList(); //获取子阶料的备料信息,Jarvis 20120316,按Seq排序 object[] minnoss = materialFacade.QueryMINNO_New(moCode, routeCode, opCode, resCode, moBomVer, minno.MSourceItemCode); //获取同一首选料的备料信息,Jarvis 20120321 //获取备料信息中可扣减数,Jarvis 20120316 foreach (MINNO temp in minnoss) { //objStorageLotInfo = inventoryFacade.QueryStorageLot(temp.LotNO, mo.EAttribute2, temp.MItemCode); objStorageLotInfo = inventoryFacade.QueryStorageLot(temp.LotNO, temp.MItemCode); if (objStorageLotInfo != null) { foreach (StorageLotInfo lotInfo in objStorageLotInfo) { temlotQty += lotInfo.Lotqty; if (lotInfo.Lotqty <= 0) //如果批数量为0不记录该批 { continue; } StorageLotInfoList.Add(lotInfo); } } } if (temlotQty < iOPBOMItemQty) { throw new Exception("$CS_ItemCode[" + minno.MItemCode + "-" + MItemName + "]" + "$CS_DeductQty_ERROR"); } #endregion #region 数量可以扣减 foreach (StorageLotInfo lotInfo in StorageLotInfoList) { if (iOPBOMItemQty > lotInfo.Lotqty) { iOPBOMItemQty = iOPBOMItemQty - lotInfo.Lotqty; inventoryFacade.DeleteStorageLotInfo(lotInfo); this.UpdateStorageQty(lotInfo, inventoryFacade, lotInfo.Lotqty); lotNoList += ("," + lotInfo.Lotno + ","); #region 记录过账信息 LotOnWipItem wipItem = new LotOnWipItem(); MINNO minnoTemp = null; object[] minnoTemps = materialFacade.QueryMINNO(moCode, routeCode, opCode, resCode, moBomVer, lotInfo.Mcode, minno.MSourceItemCode, lotInfo.Lotno); if (minnoTemps != null) { minnoTemp = (MINNO)minnoTemps[0]; } wipItem.DateCode = minnoTemp.DateCode; wipItem.LOTNO = minnoTemp.LotNO; wipItem.MItemCode = minnoTemp.MItemCode; wipItem.VendorCode = minnoTemp.VendorCode; wipItem.VendorItemCode = minnoTemp.VendorItemCode; wipItem.Version = minnoTemp.Version; wipItem.MSeq = seqForDeductQty; wipItem.MCardType = minno.EAttribute1; wipItem.Eattribute1 = simulation.EAttribute1; wipItem.ItemCode = simulation.ItemCode; wipItem.ResCode = simulation.ResCode; wipItem.RouteCode = simulation.RouteCode; wipItem.LotCode = simulation.LotCode; wipItem.LotSeq = simulation.LotSeq; wipItem.SegmentCode = simulationReport.SegmentCode; wipItem.BeginShiftCode = simulationReport.BeginShiftCode; wipItem.ShiftTypeCode = simulationReport.ShiftTypeCode; wipItem.StepSequenceCode = simulationReport.StepSequenceCode; wipItem.BeginTimePeriodCode = simulationReport.BeginTimePeriodCode; wipItem.MOCode = simulation.MOCode; wipItem.ModelCode = simulation.ModelCode; wipItem.OPCode = simulation.OPCode; wipItem.CollectStatus = simulation.CollectStatus; wipItem.BeginDate = simulation.BeginDate; wipItem.BeginTime = simulation.BeginTime; wipItem.MaintainUser = simulation.MaintainUser; wipItem.TransStatus = TransactionStatus.TransactionStatus_YES; wipItem.Qty = lotInfo.Lotqty; wipItem.ActionType = (int)MaterialType.CollectMaterial; wipItem.MOSeq = simulation.MOSeq; dataCollectFacade.AddLotOnWIPItem(wipItem); LotSimulationReport simulationRpt = dataCollectFacade.GetLastLotSimulationReport(wipItem.LotCode); if (simulationRpt != null) { dataCollectFacade.UpdateLotSimulationReport(simulationRpt); } seqForDeductQty++; #endregion } else { lotInfo.Lotqty = lotInfo.Lotqty - iOPBOMItemQty; inventoryFacade.UpdateStorageLotInfo(lotInfo); this.UpdateStorageQty(lotInfo, inventoryFacade, iOPBOMItemQty); #region 记录过账信息 LotOnWipItem wipItem = new LotOnWipItem(); MINNO minnoTemp = null; object[] minnoTemps = materialFacade.QueryMINNO(moCode, routeCode, opCode, resCode, moBomVer, lotInfo.Mcode, minno.MSourceItemCode, lotInfo.Lotno); if (minnoTemps != null) { minnoTemp = (MINNO)minnoTemps[0]; } wipItem.DateCode = minnoTemp.DateCode; wipItem.LOTNO = minnoTemp.LotNO; wipItem.MItemCode = minnoTemp.MItemCode; wipItem.VendorCode = minnoTemp.VendorCode; wipItem.VendorItemCode = minnoTemp.VendorItemCode; wipItem.Version = minnoTemp.Version; wipItem.MSeq = seqForDeductQty; wipItem.MCardType = minno.EAttribute1; wipItem.Eattribute1 = simulation.EAttribute1; wipItem.ItemCode = simulation.ItemCode; wipItem.ResCode = simulation.ResCode; wipItem.RouteCode = simulation.RouteCode; wipItem.LotCode = simulation.LotCode; wipItem.LotSeq = simulation.LotSeq; wipItem.SegmentCode = simulationReport.SegmentCode; wipItem.BeginShiftCode = simulationReport.BeginShiftCode; wipItem.ShiftTypeCode = simulationReport.ShiftTypeCode; wipItem.StepSequenceCode = simulationReport.StepSequenceCode; wipItem.BeginTimePeriodCode = simulationReport.BeginTimePeriodCode; wipItem.MOCode = simulation.MOCode; wipItem.ModelCode = simulation.ModelCode; wipItem.OPCode = simulation.OPCode; wipItem.CollectStatus = simulation.CollectStatus; wipItem.BeginDate = simulation.BeginDate; wipItem.BeginTime = simulation.BeginTime; wipItem.MaintainUser = simulation.MaintainUser; wipItem.TransStatus = TransactionStatus.TransactionStatus_YES; wipItem.Qty = iOPBOMItemQty; wipItem.ActionType = (int)MaterialType.CollectMaterial; wipItem.MOSeq = simulation.MOSeq; dataCollectFacade.AddLotOnWIPItem(wipItem); LotSimulationReport simulationRpt = dataCollectFacade.GetLastLotSimulationReport(wipItem.LotCode); if (simulationRpt != null) { dataCollectFacade.UpdateLotSimulationReport(simulationRpt); } seqForDeductQty++; #endregion iOPBOMItemQty = 0; lotNoList += ("," + lotInfo.Lotno + ","); break; } } #endregion } //} return(returnValue); }