public void AddMaterialFlushBack(MaterialFlushBack materialFlushBack) { if (this._materialFlushBack == null) { this._materialFlushBack = new List <MaterialFlushBack>(); } this._materialFlushBack.Add(materialFlushBack); }
public IList <MaterialFlushBack> AssignMaterialFlushBack(MaterialFlushBack sourceMaterialFlushBack, IList <OrderDetail> orderDetailList) { if (orderDetailList != null && orderDetailList.Count > 0) { IList <OrderLocationTransaction> targetInOrderLocationTransactionList = new List <OrderLocationTransaction>(); foreach (OrderDetail orderDetail in orderDetailList) { IList <OrderLocationTransaction> inOrderLocationTransactionList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN); //入库(in)的OrderLocationTransaction只可能有一个 inOrderLocationTransactionList[0].CurrentReceiveQty = orderDetail.CurrentReceiveQty; inOrderLocationTransactionList[0].CurrentRejectQty = orderDetail.CurrentRejectQty; inOrderLocationTransactionList[0].CurrentScrapQty = orderDetail.CurrentScrapQty; targetInOrderLocationTransactionList.Add(inOrderLocationTransactionList[0]); } return(AssignMaterialFlushBack(sourceMaterialFlushBack, targetInOrderLocationTransactionList)); } return(null); }
private Receipt BuildReceipt(OrderLocationTransaction orderLocationTransaction, IList <DssImportHistory> dssImportHistoryList) { if (orderLocationTransaction == null || dssImportHistoryList == null || dssImportHistoryList.Count == 0) { return(null); } Receipt receipt = new Receipt(); IList <OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderLocationTransaction.OrderDetail.Id, BusinessConstants.IO_TYPE_OUT); foreach (var dssImportHistory in dssImportHistoryList) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.Receipt = receipt; receiptDetail.OrderLocationTransaction = orderLocationTransaction; receiptDetail.HuId = dssImportHistory.HuId; receiptDetail.ReceivedQty = dssImportHistory.Qty; #region 找Out的OrderLocTrans,填充MaterialFlushBack foreach (OrderLocationTransaction orderLocTrans in orderLocTransList) { MaterialFlushBack material = new MaterialFlushBack(); material.OrderLocationTransaction = orderLocTrans; if (orderLocTrans.UnitQty != 0) { material.Qty = dssImportHistory.Qty; } receiptDetail.AddMaterialFlushBack(material); } #endregion receipt.AddReceiptDetail(receiptDetail); } return(receipt); }
public virtual void ProcessSingleFile(string inboundDirectoryName, string inboundFileName) { log.Info("Start inbound file " + inboundFileName); FlatFileReader reader = new FlatFileReader(inboundFileName, Encoding.ASCII, "\t"); try { OrderHead orderHead = null; OrderDetail orderDetail = null; string shiftCode = string.Empty; Hu hu = null; string[] fields = reader.ReadLine(); while (fields != null) { string prodLine = fields[0]; string itemCode = fields[1]; string huId = fields[2]; decimal qty = decimal.Parse(fields[3]); string itemHuId = fields[4]; string onlineDate = fields[5]; string onlineTime = fields[6]; string offlineDate = fields[7]; string offlineTime = fields[8]; string customerCode = fields[9]; string customerLoc = fields[10]; if (orderHead == null) { #region 查找工单 shiftCode = BarcodeHelper.GetShiftCode(huId); DetachedCriteria criteria = DetachedCriteria.For <OrderHead>(); criteria.CreateAlias("Flow", "f"); //criteria.CreateAlias("Shift", "s"); criteria.Add(Expression.Like("f.Code", prodLine, MatchMode.End)); criteria.Add(Expression.Eq("s.Code", shiftCode)); criteria.Add(Expression.Eq("Status", BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS)); criteria.AddOrder(Order.Asc("StartTime")); IList <OrderHead> orderHeadList = this.criteriaMgr.FindAll <OrderHead>(criteria); #endregion if (orderHeadList != null && orderHeadList.Count > 0) { foreach (OrderHead targetOrderHead in orderHeadList) { orderHead = targetOrderHead; #region 查找工单明细 IList <OrderDetail> orderDetailList = orderHead.OrderDetails; foreach (OrderDetail targetOrderDetail in orderDetailList) { if (targetOrderDetail.Item.Code == itemCode) { log.Info("Find match wo " + orderHead.OrderNo); orderDetail = targetOrderDetail; orderDetail.CurrentReceiveQty = qty; break; } } #endregion if (orderDetail != null) { break; } } } else { throw new BusinessErrorException("No active wo find for prodline + " + prodLine + ", shift " + shiftCode); } if (orderDetail != null) { #region 创建外包装条码 if (this.huMgr.LoadHu(huId) == null) { log.Info("Insert hu " + huId + " into database."); hu = ResolveAndCreateHu(huId, orderDetail, qty); orderDetail.HuId = hu.HuId; Receipt receipt = new Receipt(); ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; receiptDetail.HuId = hu.HuId; receiptDetail.ReceivedQty = qty; receiptDetail.Receipt = receipt; receiptDetail.LotNo = hu.LotNo; #region 找Out的OrderLocTrans,填充MaterialFulshBack IList <OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_OUT); foreach (OrderLocationTransaction orderLocTrans in orderLocTransList) { MaterialFlushBack material = new MaterialFlushBack(); material.OrderLocationTransaction = orderLocTrans; if (orderLocTrans.UnitQty != 0) { material.Qty = qty; } receiptDetail.AddMaterialFlushBack(material); } #endregion receipt.AddReceiptDetail(receiptDetail); this.orderManager.ReceiveOrder(receipt, this.userMgr.GetMonitorUser()); } else { throw new BusinessErrorException("Hu " + huId + " already exist in database."); } #endregion } else { throw new BusinessErrorException("No item found for item code " + itemCode + " for prodline + " + prodLine + ", shift " + shiftCode); } } #region 创建内包装条码 if (this.huMgr.LoadHu(itemHuId) == null) { log.Info("Insert hu " + itemHuId + " into database."); CreateItemHu(itemHuId, orderDetail, hu.LotNo, hu.ManufactureDate); } else { throw new BusinessErrorException("Hu " + itemHuId + " already exist in database."); } #endregion fields = reader.ReadLine(); } } finally { reader.Dispose(); } }
private void ReceiveRender(object sender, EventArgs e) { bool isOddCreateHu = (bool)sender; IList <ReceiptDetail> receiptDetailList = this.ucDetailList.PopulateReceiptDetailList(); bool isReceiptOneItem = bool.Parse(TheEntityPreferenceMgr.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_IS_RECEIPT_ONE_ITEM).Value); if (this.ModuleType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && this.ModuleSubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_ADJ && isReceiptOneItem && receiptDetailList.Count > 1) { ShowErrorMessage("MasterData.Receipt.One.Item"); return; } IList <OrderLocationTransaction> inLocTransList = new List <OrderLocationTransaction>(); foreach (ReceiptDetail receiptDetail in receiptDetailList) { OrderLocationTransaction ol = receiptDetail.OrderLocationTransaction; ol.CurrentReceiveQty = ol.UnitQty * (receiptDetail.ReceivedQty.HasValue ? (decimal)receiptDetail.ReceivedQty : 0); ol.CurrentRejectQty = ol.UnitQty * (receiptDetail.RejectedQty.HasValue ? (decimal)receiptDetail.RejectedQty : 0); ol.CurrentScrapQty = ol.UnitQty * (receiptDetail.ScrapQty.HasValue ? (decimal)receiptDetail.ScrapQty : 0); inLocTransList.Add(ol); } IList <OrderLocationTransaction> orderLocTransList = this.ucInLocTransList.InLocTransList; //投入原材料List IList <OrderLocationTransaction> outLocTransList = new List <OrderLocationTransaction>(); //非零原材料List IList <OrderLocationTransaction> rwoLocTransList = new List <OrderLocationTransaction>(); //返工成品List foreach (OrderLocationTransaction inLocTrans in this.ucInLocTransList.InLocTransList) { if (inLocTrans.BomDetail == null) { rwoLocTransList.Add(inLocTrans); } else if (inLocTrans.CurrentReceiveQty != 0) { outLocTransList.Add(inLocTrans); } } try { #region 正常生产收货 if (outLocTransList.Count > 0) { foreach (ReceiptDetail receiptDetail in receiptDetailList) { foreach (OrderLocationTransaction orderLocationTransaction in outLocTransList) { MaterialFlushBack materialFlushBack = new MaterialFlushBack(); materialFlushBack.RawMaterial = orderLocationTransaction.Item; materialFlushBack.Uom = orderLocationTransaction.OrderDetail.Uom; materialFlushBack.Operation = orderLocationTransaction.Operation; materialFlushBack.Qty = orderLocationTransaction.CurrentReceiveQty; IList <MaterialFlushBack> materialFlushBackList = TheMaterialFlushBackMgr.AssignMaterialFlushBack(materialFlushBack, inLocTransList); foreach (MaterialFlushBack m in materialFlushBackList) { if (m.OrderLocationTransaction.OrderDetail.Id == receiptDetail.OrderLocationTransaction.OrderDetail.Id) { if (m.OrderLocationTransaction.UnitQty != 0) { m.Qty = m.Qty / m.OrderLocationTransaction.UnitQty; } materialFlushBack = m; receiptDetail.AddMaterialFlushBack(materialFlushBack); break; } } } } } #endregion #region 新品收货 if (this.IsNewItem) { IList <TransformerDetail> transformerDetailList = this.ucNewItemInLocTransList.NewItemInLocTransList; //新品原材料List if (transformerDetailList.Count > 0) { foreach (ReceiptDetail receiptDetail in receiptDetailList) { foreach (TransformerDetail transformerDetail in transformerDetailList) { MaterialFlushBack materialFlushBack = new MaterialFlushBack(); LocationLotDetail newItemLocationLotDetail = TheLocationLotDetailMgr.LoadLocationLotDetail(transformerDetail.LocationLotDetId); materialFlushBack.RawMaterial = newItemLocationLotDetail.Item; materialFlushBack.Uom = newItemLocationLotDetail.Hu.Uom; materialFlushBack.Qty = newItemLocationLotDetail.Qty; materialFlushBack.HuId = newItemLocationLotDetail.Hu.HuId; IList <MaterialFlushBack> materialFlushBackList = TheMaterialFlushBackMgr.AssignMaterialFlushBack(materialFlushBack, inLocTransList); foreach (MaterialFlushBack m in materialFlushBackList) { if (m.OrderLocationTransaction.OrderDetail.Id == receiptDetail.OrderLocationTransaction.OrderDetail.Id) { if (m.OrderLocationTransaction.UnitQty != 0) { m.Qty = m.Qty / m.OrderLocationTransaction.UnitQty; } materialFlushBack = m; receiptDetail.AddMaterialFlushBack(materialFlushBack); break; } } } } } } #endregion #region 返工收货 if (rwoLocTransList.Count > 0) { foreach (OrderLocationTransaction rwoOrderLocTran in rwoLocTransList) { foreach (ReceiptDetail receiptDetail in receiptDetailList) { if (receiptDetail.OrderLocationTransaction.Item.Code == rwoOrderLocTran.Item.Code) { MaterialFlushBack materialFlushBack = new MaterialFlushBack(); materialFlushBack.RawMaterial = rwoOrderLocTran.Item; materialFlushBack.Uom = rwoOrderLocTran.OrderDetail.Uom; materialFlushBack.Operation = rwoOrderLocTran.Operation; materialFlushBack.Qty = rwoOrderLocTran.CurrentReceiveQty; IList <MaterialFlushBack> materialFlushBackList = TheMaterialFlushBackMgr.AssignMaterialFlushBack(materialFlushBack, inLocTransList); foreach (MaterialFlushBack m in materialFlushBackList) { if (m.OrderLocationTransaction.OrderDetail.Id == receiptDetail.OrderLocationTransaction.OrderDetail.Id) { if (m.OrderLocationTransaction.UnitQty != 0) { m.Qty = m.Qty / m.OrderLocationTransaction.UnitQty; } materialFlushBack = m; receiptDetail.AddMaterialFlushBack(materialFlushBack); break; } } } } } } #endregion Receipt receipt = TheOrderMgr.ReceiveOrder(receiptDetailList, this.CurrentUser, null, null, null, true, isOddCreateHu); OrderHead orderHead = TheOrderHeadMgr.LoadOrderHead(this.OrderNo); if (RefreshListEvent != null) { this.RefreshListEvent(new object[] { receipt.ReceiptNo, orderHead.NeedPrintReceipt }, e); } } catch (BusinessErrorException ex) { this.ShowErrorMessage(ex); } }
public IList <MaterialFlushBack> AssignMaterialFlushBack(MaterialFlushBack sourceMaterialFlushBack, IList <OrderLocationTransaction> inOrderLocationTransactionList) { Hu hu = null; if (sourceMaterialFlushBack.HuId != null && sourceMaterialFlushBack.HuId.Trim() != string.Empty) { hu = this.huMgr.CheckAndLoadHu(sourceMaterialFlushBack.HuId); } IList <MaterialFlushBack> materialFlushBackList = new List <MaterialFlushBack>(); decimal theoryTotalQty = 0; //理论消耗量 if (inOrderLocationTransactionList != null && inOrderLocationTransactionList.Count > 0) { foreach (OrderLocationTransaction inOrderLocationTransaction in inOrderLocationTransactionList) { IList <OrderLocationTransaction> orderLocationTransactionList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(inOrderLocationTransaction.OrderDetail.Id, BusinessConstants.IO_TYPE_OUT); if (orderLocationTransactionList != null && orderLocationTransactionList.Count > 0) { foreach (OrderLocationTransaction orderLocationTransaction in orderLocationTransactionList) { if (orderLocationTransaction.Item.Code == sourceMaterialFlushBack.RawMaterial.Code) { if (sourceMaterialFlushBack.Operation == 0 || orderLocationTransaction.Operation == sourceMaterialFlushBack.Operation) { if ((hu == null) || //按数量分配 (hu != null && (hu.Version == null || hu.Version.Trim() == string.Empty)) || //按条码分配 (hu != null && hu.Version != null && hu.Version.Trim() != string.Empty && hu.Version == orderLocationTransaction.ItemVersion)) //按条码和工程状态分配 { MaterialFlushBack materialFlushBack = new MaterialFlushBack(); materialFlushBack.OrderDetail = inOrderLocationTransaction.OrderDetail; materialFlushBack.OrderLocationTransaction = orderLocationTransaction; materialFlushBack.Operation = orderLocationTransaction.Operation; materialFlushBack.RawMaterial = orderLocationTransaction.Item; materialFlushBack.Uom = orderLocationTransaction.OrderDetail.Uom; materialFlushBack.HuId = sourceMaterialFlushBack.HuId; if (inOrderLocationTransaction.OrderDetail.OrderHead.Type != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) { materialFlushBack.Qty = inOrderLocationTransaction.CurrentReceiveQty * orderLocationTransaction.UnitQty; } else { //生产,废品和次品都消耗原材料 materialFlushBack.Qty = (inOrderLocationTransaction.CurrentReceiveQty + inOrderLocationTransaction.CurrentRejectQty + inOrderLocationTransaction.CurrentScrapQty) * orderLocationTransaction.UnitQty; } theoryTotalQty += materialFlushBack.Qty; materialFlushBackList.Add(materialFlushBack); } } } } } } } int FlushBackListCount = materialFlushBackList.Count; if (FlushBackListCount == 0) { throw new BusinessErrorException("Order.Error.ReceiveOrder.AssignMaterial", sourceMaterialFlushBack.RawMaterial.Code); } EntityPreference entityPreference = entityPreferenceMgr.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_AMOUNT_DECIMAL_LENGTH); int decimalLength = int.Parse(entityPreference.Value); decimal remainFlushBack = sourceMaterialFlushBack.Qty; for (int i = 0; i < FlushBackListCount; i++) { //分配的消耗量等于实际的总消耗量 / 理论总消耗量 * 单个物料的消耗量,最后一条用减法处理 if (i < FlushBackListCount - 1) { materialFlushBackList[i].Qty = Math.Round(sourceMaterialFlushBack.Qty / theoryTotalQty * materialFlushBackList[i].Qty, decimalLength, MidpointRounding.AwayFromZero);; remainFlushBack = remainFlushBack - materialFlushBackList[i].Qty; } else { materialFlushBackList[i].Qty = remainFlushBack; } } //foreach(MaterialFlushBack materialFlushBack in materialFlushBackList) //{ // materialFlushBack.Qty = sourceMaterialFlushBack.Qty / theoryTotalQty * materialFlushBack.Qty; //} return(materialFlushBackList); }