public IList<ReceiptDetail> CreateReceiptDetail(Receipt receipt, OrderLocationTransaction inOrderLocationTransaction, IList<Hu> huList) { IList<ReceiptDetail> receiptDetailList = new List<ReceiptDetail>(); foreach (Hu hu in huList) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.Receipt = receipt; receiptDetail.OrderLocationTransaction = inOrderLocationTransaction; receiptDetail.HuId = hu.HuId; receiptDetail.LotNo = hu.LotNo; //����hu����������ж�����Ʒ���Ǵ�Ʒ if (hu.QualityLevel == BusinessConstants.CODE_MASTER_ITEM_QUALITY_LEVEL_VALUE_1) { //�ȳ�Hu.UnitQtyתΪ������λ���ڳ�outOrderLocationTransaction.UnitQtyתΪ������λ�� receiptDetail.ReceivedQty = hu.Qty * hu.UnitQty / inOrderLocationTransaction.UnitQty; } else if (hu.QualityLevel == BusinessConstants.CODE_MASTER_ITEM_QUALITY_LEVEL_VALUE_2) { receiptDetail.RejectedQty = hu.Qty * hu.UnitQty / inOrderLocationTransaction.UnitQty; } else { throw new TechnicalException("hu quality level:" + hu.QualityLevel + " not valided"); } this.CreateReceiptDetail(receiptDetail); receiptDetailList.Add(receiptDetail); receipt.AddReceiptDetail(receiptDetail); } return receiptDetailList; }
public Receipt ConvertInProcessLocationToReceipt(InProcessLocation inProcessLocation, IDictionary<string, string> huIdStorageBinDic, string externalOrderNo) { Receipt receipt = new Receipt(); receipt.ExternalReceiptNo = externalOrderNo; receipt.AddInProcessLocation(inProcessLocation); if (inProcessLocation.InProcessLocationDetails != null && inProcessLocation.InProcessLocationDetails.Count > 0) { foreach (InProcessLocationDetail inProcessLocationDetail in inProcessLocation.InProcessLocationDetails) { OrderLocationTransaction orderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; OrderLocationTransaction inOrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; bool isMerge = false; if (receipt.ReceiptDetails != null && receipt.ReceiptDetails.Count > 0 && !inProcessLocation.IsReceiptScanHu) { //如果收货不扫描条码,收货项需要根据发货项进行合并 foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) { if (inOrderLocationTransaction.Id == receiptDetail.OrderLocationTransaction.Id) { //if (inProcessLocationDetail.IsConsignment == receiptDetail.IsConsignment // && inProcessLocationDetail.PlannedBill == receiptDetail.PlannedBill) { // throw new BusinessErrorException("寄售库存,不能按按数量进行收货。"); //} isMerge = true; receiptDetail.ShippedQty += inProcessLocationDetail.Qty; receiptDetail.ReceivedQty += inProcessLocationDetail.Qty; break; } } } if (!isMerge) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.OrderLocationTransaction = inOrderLocationTransaction; receiptDetail.Id = inProcessLocationDetail.Id; receiptDetail.ShippedQty = inProcessLocationDetail.Qty; receiptDetail.ReceivedQty = inProcessLocationDetail.Qty; if (inProcessLocation.IsReceiptScanHu) //只有按条码收货才Copy条码信息 { receiptDetail.HuId = inProcessLocationDetail.HuId; receiptDetail.LotNo = inProcessLocationDetail.LotNo; //上架库位赋值 if (inOrderLocationTransaction.OrderDetail.OrderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML && huIdStorageBinDic != null && receiptDetail.HuId != null && receiptDetail.HuId.Trim() != string.Empty && huIdStorageBinDic.ContainsKey(receiptDetail.HuId.Trim())) { receiptDetail.PutAwayBinCode = huIdStorageBinDic[receiptDetail.HuId.Trim()]; } } receiptDetail.IsConsignment = inProcessLocationDetail.IsConsignment; receiptDetail.PlannedBill = inProcessLocationDetail.PlannedBill; receiptDetail.Receipt = receipt; if (receiptDetail.ShippedQty != 0)//过滤已收满数量 { receipt.AddReceiptDetail(receiptDetail); } } } } return receipt; }
public Receipt ConvertOrderDetailToReceipt(IList<OrderDetail> orderDetailList) { Receipt receipt = new Receipt(); if (orderDetailList != null && orderDetailList.Count > 0) { foreach (OrderDetail orderDetail in orderDetailList) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; if (orderDetail.OrderHead.IsReceiptScanHu) //只有收货扫描条码赋值 { receiptDetail.HuId = orderDetail.HuId; } //receiptDetail.ShippedQty = orderDetail.RemainShippedQty; ShippedQty都是后台赋值的,从InProcessLocationDetail中取值 //receiptDetail.ReceivedQty = receiptDetail.ShippedQty; receiptDetail.ReceivedQty = orderDetail.RemainShippedQty; receiptDetail.Receipt = receipt; //if (receiptDetail.ShippedQty != 0)//过滤已收满数量 if (receiptDetail.ReceivedQty != 0)//过滤已收满数量 receipt.AddReceiptDetail(receiptDetail); } } return receipt; }
public Receipt ReceiveOrder(IList<ReceiptDetail> receiptDetailList, User user, InProcessLocation inProcessLocation, string externalReceiptNo, IList<WorkingHours> workingHoursList, bool createIp, bool isOddCreateHu) { if (receiptDetailList != null && receiptDetailList.Count > 0) { Receipt receipt = new Receipt(); if (inProcessLocation != null) { receipt.AddInProcessLocation(inProcessLocation); } receipt.ExternalReceiptNo = externalReceiptNo; foreach (ReceiptDetail receiptDetail in receiptDetailList) { receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } return ReceiveOrder(receipt, user, workingHoursList, createIp, isOddCreateHu); } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } }
public Receipt ReceiveOrder(IList<ReceiptDetail> receiptDetailList, User user, InProcessLocation inProcessLocation, string externalReceiptNo) { if (receiptDetailList != null && receiptDetailList.Count > 0) { Receipt receipt = new Receipt(); if (inProcessLocation != null) { receipt.AddInProcessLocation(inProcessLocation); } receipt.ExternalReceiptNo = externalReceiptNo; foreach (ReceiptDetail receiptDetail in receiptDetailList) { receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } return ReceiveOrder(receipt, user, null, true, true); } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } }
public Receipt ReceiveOrder(IList<ReceiptDetail> receiptDetailList, User user) { if (receiptDetailList != null && receiptDetailList.Count > 0) { Receipt receipt = new Receipt(); foreach (ReceiptDetail receiptDetail in receiptDetailList) { receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } return ReceiveOrder(receipt, user, null, true, true); } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } }
public Receipt ReceiveOrder(IList<OrderDetail> orderDetailList, User user, bool isOddCreateHu) { if (orderDetailList != null && orderDetailList.Count > 0) { Receipt receipt = new Receipt(); foreach (OrderDetail orderDetail in orderDetailList) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; receiptDetail.HuId = orderDetail.HuId; receiptDetail.ReceivedQty = orderDetail.CurrentReceiveQty; receiptDetail.RejectedQty = orderDetail.CurrentRejectQty; receiptDetail.ScrapQty = orderDetail.CurrentScrapQty; receiptDetail.PutAwayBinCode = orderDetail.PutAwayBinCode; receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } return ReceiveOrder(receipt, user, null, true, isOddCreateHu); } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } }
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.criteriaMgrE.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.huMgrE.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.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; receiptDetail.HuId = hu.HuId; receiptDetail.ReceivedQty = qty; receiptDetail.Receipt = receipt; #region 找Out的OrderLocTrans,填充MaterialFulshBack IList<OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgrE.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.userMgrE.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.huMgrE.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(); } }
public void CreateReceipt(Receipt receipt, User user, bool isOddCreateHu) { log.Debug("Start create receipt"); #region 查找所有的发货项,收货单打印模板,收货差异处理选项 string orderType = null; Party partyFrom = null; Party partyTo = null; ShipAddress shipFrom = null; ShipAddress shipTo = null; string dockDescription = null; string receiptTemplate = null; string huTemplate = null; string grGapTo = null; IList<InProcessLocationDetail> inProcessLocationDetailList = new List<InProcessLocationDetail>(); if (receipt.InProcessLocations != null && receipt.InProcessLocations.Count > 0) { foreach (InProcessLocation inProcessLocation in receipt.InProcessLocations) { InProcessLocation currentIp = inProcessLocationMgrE.LoadInProcessLocation(inProcessLocation.IpNo); if (currentIp.Status == BusinessConstants.CODE_MASTER_STATUS_VALUE_CLOSE) { throw new BusinessErrorException("InProcessLocation.Error.StatusErrorWhenReceive", currentIp.Status, currentIp.IpNo); } if (orderType == null) { orderType = inProcessLocation.OrderType; } //判断OrderHead的PartyFrom是否一致 if (partyFrom == null) { partyFrom = inProcessLocation.PartyFrom; } else if (inProcessLocation.PartyFrom.Code != partyFrom.Code) { throw new BusinessErrorException("Order.Error.ReceiveOrder.PartyFromNotEqual"); } //判断OrderHead的PartyFrom是否一致 if (partyTo == null) { partyTo = inProcessLocation.PartyTo; } else if (inProcessLocation.PartyTo.Code != partyTo.Code) { throw new BusinessErrorException("Order.Error.ReceiveOrder.PartyToNotEqual"); } //判断OrderHead的ShipFrom是否一致 if (shipFrom == null) { shipFrom = inProcessLocation.ShipFrom; } else if (!AddressHelper.IsAddressEqual(inProcessLocation.ShipFrom, shipFrom)) { throw new BusinessErrorException("Order.Error.ReceiveOrder.ShipFromNotEqual"); } //判断OrderHead的ShipTo是否一致 if (shipTo == null) { shipTo = inProcessLocation.ShipTo; } else if (!AddressHelper.IsAddressEqual(inProcessLocation.ShipTo, shipTo)) { throw new BusinessErrorException("Order.Error.ReceiveOrder.ShipToNotEqual"); } if (dockDescription == null) { dockDescription = inProcessLocation.DockDescription; } else if (inProcessLocation.DockDescription != dockDescription) { throw new BusinessErrorException("Order.Error.ReceiveOrder.DockDescriptionNotEqual"); } //判断收货单打印模板是否一致 if (receiptTemplate == null) { receiptTemplate = inProcessLocation.ReceiptTemplate; } else { if (inProcessLocation.ReceiptTemplate != null && inProcessLocation.ReceiptTemplate != receiptTemplate) { throw new BusinessErrorException("Order.Error.ReceiveOrder.ReceiptTemplateNotEqual"); } } //判断条码打印模板是否一致 if (huTemplate == null) { huTemplate = inProcessLocation.HuTemplate; } else { if (inProcessLocation.HuTemplate != null && inProcessLocation.HuTemplate != huTemplate) { throw new BusinessErrorException("Order.Error.ReceiveOrder.HuTemplateNotEqual"); } } #region 查找收货差异处理选项 if (grGapTo == null) { grGapTo = inProcessLocation.GoodsReceiptGapTo; } else { if (inProcessLocation.GoodsReceiptGapTo != null && inProcessLocation.GoodsReceiptGapTo != grGapTo) { throw new BusinessErrorException("Order.Error.ReceiveOrder.GoodsReceiptGapToNotEqual"); } } #endregion IListHelper.AddRange<InProcessLocationDetail>( inProcessLocationDetailList, this.inProcessLocationDetailMgrE.GetInProcessLocationDetail(inProcessLocation)); } } #endregion IList<ReceiptDetail> targetReceiptDetailList = receipt.ReceiptDetails; receipt.ReceiptDetails = null; //清空Asn明细,稍后填充 #region 创建收货单Head receipt.ReceiptNo = numberControlMgrE.GenerateNumber(BusinessConstants.CODE_PREFIX_RECEIPT); receipt.OrderType = orderType; receipt.CreateDate = DateTime.Now; receipt.CreateUser = user; receipt.PartyFrom = partyFrom; receipt.PartyTo = partyTo; receipt.ShipFrom = shipFrom; receipt.ShipTo = shipTo; receipt.DockDescription = dockDescription; receipt.ReceiptTemplate = receiptTemplate; this.CreateReceipt(receipt); log.Debug("Create receipt " + receipt.ReceiptNo + " head successful"); #endregion #region HU处理/入库操作/创建收货明细 log.Debug("Start create receipt detail"); IList<LocationLotDetail> inspectLocationLotDetailList = new List<LocationLotDetail>(); foreach (ReceiptDetail receiptDetail in targetReceiptDetailList) { OrderLocationTransaction orderLocationTransaction = receiptDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (orderHead.CreateHuOption == BusinessConstants.CODE_MASTER_CREATE_HU_OPTION_VALUE_GR && receiptDetail.HuId == null) //如果订单设置为收货时创建Hu,但是收货时已经扫描过Hu了,按已扫描处理 { #region 收货时创建Hu log.Debug("Create receipt detail with generate barcode."); #region 生产本次收货+剩余零头生成Hu decimal oddQty = 0; if (!isOddCreateHu && orderDetail.HuLotSize.HasValue && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) //只有生产支持零头 { #region 查找剩余零头 + 本次收货数是否能够生成Hu Hu oddHu = this.CreateHuFromOdd(receiptDetail, user); if (oddHu != null) { log.Debug("Generate barcode using odd qty."); //如果零头生成了Hu,本次收货数会扣减 #region 创建Hu IList<Hu> oddHuList = new List<Hu>(); oddHuList.Add(oddHu); IList<ReceiptDetail> oddReceiptDetailList = this.receiptDetailMgrE.CreateReceiptDetail(receipt, orderLocationTransaction, oddHuList); log.Debug("Generate odd barcode successful."); #endregion #region 入库 IList<InventoryTransaction> inventoryTransactionList = this.locationMgrE.InventoryIn(oddReceiptDetailList[0], user, receiptDetail.PutAwayBinCode); log.Debug("odd Inventory in successful."); #endregion #region 是否检验 if (orderDetail.NeedInspection && orderHead.NeedInspection && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { LocationLotDetail locationLotDetail = this.locationLotDetailMgrE.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = locationLotDetail.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } #endregion } #endregion oddQty = receiptDetail.ReceivedQty.HasValue && orderDetail.HuLotSize.HasValue ? receiptDetail.ReceivedQty.Value % orderDetail.HuLotSize.Value : 0; //收货零头数 log.Debug("Receive odd qty is " + oddQty); receiptDetail.ReceivedQty = receiptDetail.ReceivedQty.Value - oddQty; //收货数量凑整 } #endregion #region 满包装/零头创建Hu处理 if (receiptDetail.ReceivedQty.HasValue || receiptDetail.RejectedQty.HasValue || receiptDetail.ScrapQty.HasValue) { //创建Hu IList<Hu> huList = this.huMgrE.CreateHu(receiptDetail, user); log.Debug("Create barcode successful."); //创建收货项 IList<ReceiptDetail> receiptDetailList = this.receiptDetailMgrE.CreateReceiptDetail(receipt, orderLocationTransaction, huList); log.Debug("Create receipt detail successful."); #region 如果还有次品或者废品收货,添加到收货列表 if ((receiptDetail.RejectedQty.HasValue && receiptDetail.RejectedQty > 0) || (receiptDetail.ScrapQty.HasValue && receiptDetail.ScrapQty > 0)) { ReceiptDetail rejAndScrapReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, rejAndScrapReceiptDetail); rejAndScrapReceiptDetail.ReceivedQty = null; rejAndScrapReceiptDetail.PutAwayBinCode = null; rejAndScrapReceiptDetail.Receipt = receipt; this.receiptDetailMgrE.CreateReceiptDetail(rejAndScrapReceiptDetail); receiptDetailList.Add(rejAndScrapReceiptDetail); receipt.AddReceiptDetail(rejAndScrapReceiptDetail); } #endregion foreach (ReceiptDetail huReceiptDetail in receiptDetailList) { #region 匹配ReceiptDetail和InProcessLocationDetail,Copy相关信息 if (orderHead.Type != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) { IList<InProcessLocationDetail> matchInProcessLocationDetailList = OrderHelper.FindMatchInProcessLocationDetail(receiptDetail, inProcessLocationDetailList); if (matchInProcessLocationDetailList != null && matchInProcessLocationDetailList.Count > 0) { if (matchInProcessLocationDetailList.Count > 1) { //只有当ASN中包含条码,按数量收货,并收货后创建条码才有可能发生这种情况。 //变态才这么干。 log.Error("只有当ASN中包含条码,按数量收货,并收货后创建条码才有可能发生这种情况。"); throw new BusinessErrorException("你是变态才这么设置。"); } //如果找到匹配项,只可能有一个 huReceiptDetail.PlannedBill = matchInProcessLocationDetailList[0].PlannedBill; huReceiptDetail.IsConsignment = matchInProcessLocationDetailList[0].IsConsignment; huReceiptDetail.ShippedQty = matchInProcessLocationDetailList[0].Qty; this.receiptDetailMgrE.UpdateReceiptDetail(huReceiptDetail); } //收货创建HU,分配PlannedAmount,todo:考虑余数 huReceiptDetail.PlannedAmount = receiptDetail.PlannedAmount / receiptDetail.ReceivedQty.Value * huReceiptDetail.ReceivedQty.Value; } #endregion #region 入库 IList<InventoryTransaction> inventoryTransactionList = this.locationMgrE.InventoryIn(huReceiptDetail, user, receiptDetail.PutAwayBinCode); log.Debug("Inventory in successful."); #endregion #region 是否检验 if (orderDetail.NeedInspection && orderHead.NeedInspection && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML && huReceiptDetail.ReceivedQty.HasValue && huReceiptDetail.ReceivedQty > 0) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Location.Code != BusinessConstants.SYSTEM_LOCATION_REJECT) { LocationLotDetail locationLotDetail = this.locationLotDetailMgrE.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = inventoryTransaction.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } } #endregion } } #endregion #region 生产剩余零头处理 if (oddQty > 0) { log.Debug("Start handle odd qty."); ReceiptDetail oddReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, oddReceiptDetail); oddReceiptDetail.ReceivedQty = oddQty; oddReceiptDetail.RejectedQty = 0; oddReceiptDetail.ScrapQty = 0; #region 零头入库 oddReceiptDetail.Receipt = receipt; IList<InventoryTransaction> inventoryTransactionList = this.locationMgrE.InventoryIn(oddReceiptDetail, user, receiptDetail.PutAwayBinCode); #endregion #region 零头创建收货明细 this.receiptDetailMgrE.CreateReceiptDetail(oddReceiptDetail); receipt.AddReceiptDetail(oddReceiptDetail); #endregion #region 创建HuOdd LocationLotDetail locationLotDetail = locationLotDetailMgrE.LoadLocationLotDetail(inventoryTransactionList[0].LocationLotDetailId); this.huOddMgrE.CreateHuOdd(oddReceiptDetail, locationLotDetail, user); #endregion log.Debug("End handle odd qty."); } #endregion #endregion } else { #region 收货时不创建Hu log.Debug("Create receipt detail with no generate barcode."); #region 更新Hu上的OrderNo、ReceiptNo和AntiResloveHu if (receiptDetail.HuId != null && receiptDetail.HuId.Trim() != string.Empty) { Hu hu = this.huMgrE.LoadHu(receiptDetail.HuId); bool isUpdated = false; if (hu.OrderNo == null || hu.ReceiptNo == null) { if (hu.OrderNo == null) { log.Debug("Update hu OrderNo " + orderHead.OrderNo + "."); hu.OrderNo = orderHead.OrderNo; } if (hu.ReceiptNo == null) { log.Debug("Update hu ReceiptNo " + receipt.ReceiptNo + "."); hu.ReceiptNo = receipt.ReceiptNo; } isUpdated = true; } if (hu.AntiResolveHu == null && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PROCUREMENT) { hu.AntiResolveHu = orderHead.AntiResolveHu; isUpdated = true; } if (isUpdated) { this.huMgrE.UpdateHu(hu); } } #endregion IList<ReceiptDetail> noCreateHuReceiptDetailList = new List<ReceiptDetail>(); #region 匹配ReceiptDetail和InProcessLocationDetail,Copy相关信息 log.Debug("Start match ReceiptDetail and InProcessLocationDetail."); if (orderHead.Type != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && orderHead.SubType != BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_ADJ) //收货调整已经匹配过InProcessLocationDetail,不需要在匹配 { IList<InProcessLocationDetail> matchInProcessLocationDetailList = OrderHelper.FindMatchInProcessLocationDetail(receiptDetail, inProcessLocationDetailList); log.Debug("Find matched InProcessLocationDetailList, count = " + matchInProcessLocationDetailList != null ? matchInProcessLocationDetailList.Count : 0); if (matchInProcessLocationDetailList != null && matchInProcessLocationDetailList.Count == 1) { //一次收货对应一次发货。 log.Debug("one ipdet vs one receiptdet."); receiptDetail.PlannedBill = matchInProcessLocationDetailList[0].PlannedBill; receiptDetail.IsConsignment = matchInProcessLocationDetailList[0].IsConsignment; if (matchInProcessLocationDetailList[0].InProcessLocation.Type == BusinessConstants.CODE_MASTER_INPROCESS_LOCATION_TYPE_VALUE_GAP) { receiptDetail.ShippedQty = 0 - matchInProcessLocationDetailList[0].Qty; } else { receiptDetail.ShippedQty = matchInProcessLocationDetailList[0].Qty; } receiptDetail.ReceivedInProcessLocationDetail = matchInProcessLocationDetailList[0]; noCreateHuReceiptDetailList.Add(receiptDetail); } else if (matchInProcessLocationDetailList != null && matchInProcessLocationDetailList.Count > 1) { //一次收货对应多次发货。 //如:发货按条码,收货按数量。 log.Debug("multi ipdet vs one receiptdet."); decimal totalRecQty = receiptDetail.ReceivedQty.Value; InProcessLocationDetail lastInProcessLocationDetail = null; log.Debug("Start Fetch matched InProcessLocationDetailList."); foreach (InProcessLocationDetail inProcessLocationDetail in matchInProcessLocationDetailList) { lastInProcessLocationDetail = inProcessLocationDetail; //记录最后一次发货项,供没有对应发货的收货项使用 if (inProcessLocationDetail.ReceivedQty.HasValue && Math.Abs(inProcessLocationDetail.ReceivedQty.Value) >= Math.Abs(inProcessLocationDetail.Qty)) { continue; } if (Math.Abs(totalRecQty) > 0) { log.Debug("Start cloned ReceiptDetail."); ReceiptDetail clonedReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, clonedReceiptDetail); log.Debug("End cloned ReceiptDetail."); clonedReceiptDetail.PlannedBill = inProcessLocationDetail.PlannedBill; clonedReceiptDetail.IsConsignment = inProcessLocationDetail.IsConsignment; #region if (matchInProcessLocationDetailList[0].InProcessLocation.Type == BusinessConstants.CODE_MASTER_INPROCESS_LOCATION_TYPE_VALUE_GAP) { inProcessLocationDetail.Qty = 0 - inProcessLocationDetail.Qty; } #endregion if (Math.Abs(totalRecQty) > Math.Abs(inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero))) { clonedReceiptDetail.ReceivedQty = inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero); clonedReceiptDetail.ShippedQty = inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero); totalRecQty -= inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero); } else { clonedReceiptDetail.ReceivedQty = totalRecQty; clonedReceiptDetail.ShippedQty = totalRecQty; totalRecQty = 0; } //因为去掉了数量,记录已经匹配的发货项,避免差异处理的时候匹配多条而产生差异。 clonedReceiptDetail.ReceivedInProcessLocationDetail = inProcessLocationDetail; noCreateHuReceiptDetailList.Add(clonedReceiptDetail); } else { break; } } log.Debug("End Fetch matched InProcessLocationDetailList."); //超收,没有找到对应的发货项,只记录收货数,发货数记0 if (Math.Abs(totalRecQty) > 0) { ReceiptDetail clonedReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, clonedReceiptDetail); clonedReceiptDetail.ShippedQty = 0; clonedReceiptDetail.ReceivedQty = totalRecQty; clonedReceiptDetail.ReceivedInProcessLocationDetail = lastInProcessLocationDetail; noCreateHuReceiptDetailList.Add(clonedReceiptDetail); } } else { noCreateHuReceiptDetailList.Add(receiptDetail); } } else { noCreateHuReceiptDetailList.Add(receiptDetail); } log.Debug("End match ReceiptDetail and InProcessLocationDetail."); #endregion foreach (ReceiptDetail noCreateHuReceiptDetail in noCreateHuReceiptDetailList) { noCreateHuReceiptDetail.Receipt = receipt; if (noCreateHuReceiptDetail.ReceivedQty != 0) { #region 入库 log.Debug("Start Inventory In."); IList<InventoryTransaction> inventoryTransactionList = this.locationMgrE.InventoryIn(noCreateHuReceiptDetail, user, noCreateHuReceiptDetail.PutAwayBinCode); log.Debug("End Inventory In."); #endregion #region 是否检验 if (orderDetail.NeedInspection && orderHead.NeedInspection && inventoryTransactionList != null && inventoryTransactionList.Count > 0 && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Location.Code != BusinessConstants.SYSTEM_LOCATION_REJECT) { LocationLotDetail locationLotDetail = this.locationLotDetailMgrE.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = inventoryTransaction.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } } #endregion } #region 创建收货明细 log.Debug("Start Create Receipt Detail."); this.receiptDetailMgrE.CreateReceiptDetail(noCreateHuReceiptDetail); receipt.AddReceiptDetail(noCreateHuReceiptDetail); log.Debug("End Create Receipt Detail."); #endregion } #endregion } } #endregion #region 检验 if (inspectLocationLotDetailList.Count > 0) { //对于没有Hu的,如果收货时已经回冲了负数库存,也就是库存数量和待检验数量不一致可能会有问题 //增加ipno,receiptno,isseperated字段 this.inspectOrderMgrE.CreateInspectOrder(inspectLocationLotDetailList, user,receipt.InProcessLocations[0].IpNo,receipt.ReceiptNo,false); } #endregion //#region 匹配收货发货项,查找差异 //IList<InProcessLocationDetail> gapInProcessLocationDetailList = new List<InProcessLocationDetail>(); //#region 发货项不匹配 //foreach (InProcessLocationDetail inProcessLocationDetail in inProcessLocationDetailList) //{ // if (inProcessLocationDetail.OrderLocationTransaction.OrderDetail.OrderHead.Type // != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) //生产暂时不支持差异 // { // decimal receivedQty = 0; //发货项的累计收货数 // //一条发货项可能对应多条收货项 // foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) // { // //匹配收货项和发货项 // if (receiptDetail.ReceivedInProcessLocationDetail != null) // { // //对于已经匹配的,直接按发货项匹配 // if (receiptDetail.ReceivedInProcessLocationDetail.Id == inProcessLocationDetail.Id) // { // if (receiptDetail.ReceivedQty.HasValue) // { // receivedQty += receiptDetail.ReceivedQty.Value; // } // } // } // else if (OrderHelper.IsInProcessLocationDetailMatchReceiptDetail( // inProcessLocationDetail, receiptDetail)) // { // if (receiptDetail.ReceivedQty.HasValue) // { // receivedQty += receiptDetail.ReceivedQty.Value; // } // } // } // if (receivedQty != inProcessLocationDetail.Qty) // { // #region 收货数量和发货数量不匹配,记录差异 // InProcessLocationDetail gapInProcessLocationDetail = new InProcessLocationDetail(); // gapInProcessLocationDetail.Qty = receivedQty - inProcessLocationDetail.Qty; // gapInProcessLocationDetail.OrderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; // //gapInProcessLocationDetail.HuId = inProcessLocationDetail.HuId; // gapInProcessLocationDetail.LotNo = inProcessLocationDetail.LotNo; // gapInProcessLocationDetail.IsConsignment = inProcessLocationDetail.IsConsignment; // gapInProcessLocationDetail.PlannedBill = inProcessLocationDetail.PlannedBill; // gapInProcessLocationDetailList.Add(gapInProcessLocationDetail); // #endregion // } // } //} //#endregion //#region 收货项不匹配 //foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) //{ // if (receiptDetail.OrderLocationTransaction.OrderDetail.OrderHead.Type // != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) //生产暂时不支持差异 // { // IList<InProcessLocationDetail> matchInProcessLocationDetailList = OrderHelper.FindMatchInProcessLocationDetail(receiptDetail, inProcessLocationDetailList); // if (matchInProcessLocationDetailList == null || matchInProcessLocationDetailList.Count == 0) // { // OrderLocationTransaction outOrderLocationTransaction = // this.orderLocationTransactionMgrE.GetOrderLocationTransaction(receiptDetail.OrderLocationTransaction.OrderDetail, BusinessConstants.IO_TYPE_OUT)[0]; // #region 没有找到和收货项对应的发货项 // InProcessLocationDetail gapInProcessLocationDetail = new InProcessLocationDetail(); // gapInProcessLocationDetail.Qty = receiptDetail.ReceivedQty.Value; // gapInProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; // //gapInProcessLocationDetail.HuId = receiptDetail.HuId; // gapInProcessLocationDetail.LotNo = receiptDetail.LotNo; // gapInProcessLocationDetail.IsConsignment = receiptDetail.IsConsignment; // gapInProcessLocationDetail.PlannedBill = receiptDetail.PlannedBill; // gapInProcessLocationDetailList.Add(gapInProcessLocationDetail); // #endregion // } // } //} //#endregion //#endregion #region 关闭InProcessLocation if (receipt.InProcessLocations != null && receipt.InProcessLocations.Count > 0) { foreach (InProcessLocation inProcessLocation in receipt.InProcessLocations) { if (inProcessLocation.IsAsnUniqueReceipt) { //不支持多次收货直接关闭 this.inProcessLocationMgrE.CloseInProcessLocation(inProcessLocation, user); } else { this.inProcessLocationMgrE.TryCloseInProcessLocation(inProcessLocation, user); } } } #endregion }
public void StartOrder(string orderNo, User user) { OrderHead orderHead = this.orderHeadMgrE.CheckAndLoadOrderHead(orderNo); Flow flow = this.flowMgrE.LoadFlow(orderHead.Flow); //权限校验 //if (!OrderHelper.CheckOrderOperationAuthrize(orderHead, user, BusinessConstants.ORDER_OPERATION_START_ORDER)) //{ // throw new BusinessErrorException("Order.Error.NoStartPermission", orderHead.OrderNo); //} if (orderHead.Status == BusinessConstants.CODE_MASTER_STATUS_VALUE_SUBMIT) { #region 检查生产单最大上线数量 if (orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && orderHead.Flow != null && flow.MaxOnlineQty > 0 && this.GetInPorcessWOCount(orderHead.Flow, user) >= flow.MaxOnlineQty) { throw new BusinessErrorException("Order.Error.ExcceedMaxOnlineQty"); } #endregion DateTime nowDate = DateTime.Now; orderHead.Status = BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS; orderHead.StartDate = nowDate; orderHead.StartUser = user; orderHead.LastModifyDate = nowDate; orderHead.LastModifyUser = user; this.orderHeadMgrE.UpdateOrderHead(orderHead); #region 判断自动PickList、Ship if (orderHead.IsAutoShip && orderHead.IsAutoReceive && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) { if (orderHead.CompleteLatency.HasValue && orderHead.CompleteLatency.Value > 0) { //todo 收货延迟,记录到Quratz表中 throw new NotImplementedException("Complete Latency Not Implemented"); } else { //立即收货 Receipt receipt = new Receipt(); foreach (OrderDetail orderDetail in orderHead.OrderDetails) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; receiptDetail.HuId = orderDetail.HuId; receiptDetail.ReceivedQty = orderDetail.OrderedQty; receiptDetail.Receipt = receipt; #region 生产自动收货,找Out的OrderLocTrans,填充MaterialFulshBack if (orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) { IList<OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgrE.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 = orderLocTrans.OrderedQty / orderLocTrans.UnitQty; } receiptDetail.AddMaterialFlushBack(material); } } #endregion receipt.AddReceiptDetail(receiptDetail); } ReceiveOrder(receipt, user); } } else if (orderHead.IsAutoShip) { if (orderHead.StartLatency.HasValue && orderHead.StartLatency.Value > 0) { //todo 上线延迟,记录到Quratz表中 throw new NotImplementedException("Start Latency Not Implemented"); } else { //立即上线 IList<InProcessLocationDetail> inProcessLocationDetailList = new List<InProcessLocationDetail>(); foreach (OrderDetail orderDetail in orderHead.OrderDetails) { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_OUT)[0]; inProcessLocationDetail.Qty = orderDetail.OrderedQty; inProcessLocationDetailList.Add(inProcessLocationDetail); } ShipOrder(inProcessLocationDetailList, user); } } else if (orderHead.IsAutoCreatePickList && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML) //过滤掉退货和调整 { IList<OrderLocationTransaction> orderLocationTransactionList = new List<OrderLocationTransaction>(); foreach (OrderDetail orderDetail in orderHead.OrderDetails) { IList<OrderLocationTransaction> outOrderLocationTransactionList = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_OUT); foreach (OrderLocationTransaction orderLocationTransaction in outOrderLocationTransactionList) { orderLocationTransaction.CurrentShipQty = orderLocationTransaction.OrderedQty; } IListHelper.AddRange<OrderLocationTransaction>(orderLocationTransactionList, outOrderLocationTransactionList); } this.pickListMgrE.CreatePickList(orderLocationTransactionList, user); } #endregion } else { throw new BusinessErrorException("Order.Error.StatusErrorWhenStart", orderHead.Status, orderNo); } }
private void SynOrderBindReceive(string bindedOrderNo, IList<ReceiptDetail> receiptDetailList, string referenceReceiptNo, User user) { OrderHead bindedorderHead = this.LoadOrder(bindedOrderNo, user); Receipt bindedReceipt = new Receipt(); bindedReceipt.ExternalReceiptNo = referenceReceiptNo; foreach (ReceiptDetail receiptDetail in receiptDetailList) { foreach (OrderDetail orderDetail in bindedorderHead.OrderDetails) { OrderLocationTransaction inOrderLocationTransaction = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; if (receiptDetail.OrderLocationTransaction.Item.Code == inOrderLocationTransaction.Item.Code) //&& LocationHelper.IsLocationEqual(receiptDetail.OrderLocationTransaction.Location, inOrderLocationTransaction.Location)) { ReceiptDetail bindedReceiptDetail = new ReceiptDetail(); bindedReceiptDetail.OrderLocationTransaction = inOrderLocationTransaction; bindedReceiptDetail.ReceivedQty = receiptDetail.ReceivedQty * receiptDetail.OrderLocationTransaction.UnitQty / inOrderLocationTransaction.UnitQty; if (receiptDetail.HuId != null) { bindedReceiptDetail.HuId = receiptDetail.HuId; } bindedReceiptDetail.Receipt = bindedReceipt; bindedReceipt.AddReceiptDetail(bindedReceiptDetail); break; } } } ReceiveOrder(bindedReceipt, user); }
public void DoReceiveWO(string huId, OrderDetail orderDetail, decimal qty) { #region 创建外包装条码 有创建状态的条码就不创建条码了 Hu hu = new Hu(); DetachedCriteria criteria = DetachedCriteria.For<Hu>(); criteria.Add(Expression.Eq("HuId", huId)); criteria.Add(Expression.Eq("Status", BusinessConstants.CODE_MASTER_STATUS_VALUE_CREATE)); IList<Hu> huList = this.criteriaMgr.FindAll<Hu>(criteria); if (huList != null && huList.Count > 0) { hu = huList[0]; } else { hu = ResolveAndCreateHu(huId, orderDetail, qty); } #endregion #region 工单收货 orderDetail.HuId = hu.HuId; Receipt receipt = new Receipt(); ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.HuId = hu.HuId; receiptDetail.LotNo = hu.LotNo; receiptDetail.ReceivedQty = qty; receiptDetail.Receipt = receipt; #region 找Out的OrderLocTrans,填充MaterialFulshBack IList<OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id); foreach (OrderLocationTransaction orderLocTrans in orderLocTransList) { if (orderLocTrans.IOType == BusinessConstants.IO_TYPE_OUT) { MaterialFlushBack material = new MaterialFlushBack(); material.OrderLocationTransaction = orderLocTrans; if (orderLocTrans.UnitQty != 0) { material.Qty = qty; } receiptDetail.AddMaterialFlushBack(material); } else { receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; } } #endregion receipt.AddReceiptDetail(receiptDetail); this.ReceiveOrder(receipt, this.userMgr.GetMonitorUser()); #endregion }
public string ReceiveWorkOrder(Resolver resolver) { Receipt receipt = new Receipt(); foreach (Transformer transformer in resolver.Transformers) { ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.OrderLocationTransaction = orderLocationTransactionMgr.LoadOrderLocationTransaction(transformer.OrderLocTransId); receiptDetail.HuId = null; receiptDetail.ReceivedQty = transformer.CurrentQty; receiptDetail.RejectedQty = transformer.CurrentRejectQty; receiptDetail.ScrapQty = transformer.ScrapQty; receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } List<WorkingHours> workingHoursList = new List<WorkingHours>(); foreach (string[] stringArray in resolver.WorkingHours) { WorkingHours workingHours = new WorkingHours(); workingHours.Employee = employeeMgr.LoadEmployee(stringArray[0]); workingHours.Hours = Convert.ToDecimal(stringArray[1]); workingHoursList.Add(workingHours); } return orderMgr.ReceiveOrder(receipt, resolver.UserCode, workingHoursList).ReceiptNo; }
public void CreateReceipt(Receipt receipt, User user, bool isOddCreateHu) { log.Debug("Start create receipt"); #region �������еķ�����ջ�����ӡģ�壬�ջ����촦��ѡ�� string orderType = null; Party partyFrom = null; Party partyTo = null; ShipAddress shipFrom = null; ShipAddress shipTo = null; string dockDescription = null; string receiptTemplate = null; string huTemplate = null; string grGapTo = null; IList<InProcessLocationDetail> inProcessLocationDetailList = new List<InProcessLocationDetail>(); if (receipt.InProcessLocations != null && receipt.InProcessLocations.Count > 0) { foreach (InProcessLocation inProcessLocation in receipt.InProcessLocations) { InProcessLocation currentIp = inProcessLocationMgr.LoadInProcessLocation(inProcessLocation.IpNo); if (currentIp.Status == BusinessConstants.CODE_MASTER_STATUS_VALUE_CLOSE) { throw new BusinessErrorException("InProcessLocation.Error.StatusErrorWhenReceive", currentIp.Status, currentIp.IpNo); } if (orderType == null) { orderType = inProcessLocation.OrderType; } //�ж�OrderHead��PartyFrom�Ƿ�һ�� if (partyFrom == null) { partyFrom = inProcessLocation.PartyFrom; } else if (inProcessLocation.PartyFrom.Code != partyFrom.Code) { throw new BusinessErrorException("Order.Error.ReceiveOrder.PartyFromNotEqual"); } //�ж�OrderHead��PartyFrom�Ƿ�һ�� if (partyTo == null) { partyTo = inProcessLocation.PartyTo; } else if (inProcessLocation.PartyTo.Code != partyTo.Code) { throw new BusinessErrorException("Order.Error.ReceiveOrder.PartyToNotEqual"); } //�ж�OrderHead��ShipFrom�Ƿ�һ�� if (shipFrom == null) { shipFrom = inProcessLocation.ShipFrom; } else if (!AddressHelper.IsAddressEqual(inProcessLocation.ShipFrom, shipFrom)) { throw new BusinessErrorException("Order.Error.ReceiveOrder.ShipFromNotEqual"); } //�ж�OrderHead��ShipTo�Ƿ�һ�� if (shipTo == null) { shipTo = inProcessLocation.ShipTo; } else if (!AddressHelper.IsAddressEqual(inProcessLocation.ShipTo, shipTo)) { throw new BusinessErrorException("Order.Error.ReceiveOrder.ShipToNotEqual"); } if (dockDescription == null) { dockDescription = inProcessLocation.DockDescription; } else if (inProcessLocation.DockDescription != dockDescription) { throw new BusinessErrorException("Order.Error.ReceiveOrder.DockDescriptionNotEqual"); } //�ж��ջ�����ӡģ���Ƿ�һ�� if (receiptTemplate == null) { receiptTemplate = inProcessLocation.ReceiptTemplate; } else { if (inProcessLocation.ReceiptTemplate != null && inProcessLocation.ReceiptTemplate != receiptTemplate) { throw new BusinessErrorException("Order.Error.ReceiveOrder.ReceiptTemplateNotEqual"); } } //�ж������ӡģ���Ƿ�һ�� if (huTemplate == null) { huTemplate = inProcessLocation.HuTemplate; } else { if (inProcessLocation.HuTemplate != null && inProcessLocation.HuTemplate != huTemplate) { throw new BusinessErrorException("Order.Error.ReceiveOrder.HuTemplateNotEqual"); } } #region �����ջ����촦��ѡ�� if (grGapTo == null) { grGapTo = inProcessLocation.GoodsReceiptGapTo; } else { if (inProcessLocation.GoodsReceiptGapTo != null && inProcessLocation.GoodsReceiptGapTo != grGapTo) { throw new BusinessErrorException("Order.Error.ReceiveOrder.GoodsReceiptGapToNotEqual"); } } #endregion IListHelper.AddRange<InProcessLocationDetail>( inProcessLocationDetailList, this.inProcessLocationDetailMgr.GetInProcessLocationDetail(inProcessLocation)); } } #endregion IList<ReceiptDetail> targetReceiptDetailList = receipt.ReceiptDetails; receipt.ReceiptDetails = null; //���Asn��ϸ���Ժ���� #region �����ջ���Head receipt.ReceiptNo = numberControlMgr.GenerateNumber(BusinessConstants.CODE_PREFIX_RECEIPT); receipt.OrderType = orderType; receipt.CreateDate = DateTime.Now; receipt.CreateUser = user; receipt.PartyFrom = partyFrom; receipt.PartyTo = partyTo; receipt.ShipFrom = shipFrom; receipt.ShipTo = shipTo; receipt.DockDescription = dockDescription; receipt.ReceiptTemplate = receiptTemplate; receipt.IsPrinted = false; receipt.NeedPrint = false; if (receipt.InProcessLocations != null && receipt.InProcessLocations.Count > 0) { foreach (InProcessLocation inProcessLocation in receipt.InProcessLocations) { if (inProcessLocation.NeedPrintReceipt) { receipt.NeedPrint = true; break; } } } this.CreateReceipt(receipt); log.Debug("Create receipt " + receipt.ReceiptNo + " head successful"); #endregion #region HU����/������/�����ջ���ϸ log.Debug("Start create receipt detail"); IList<LocationLotDetail> inspectLocationLotDetailList = new List<LocationLotDetail>(); foreach (ReceiptDetail receiptDetail in targetReceiptDetailList) { OrderLocationTransaction orderLocationTransaction = receiptDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (orderHead.CreateHuOption == BusinessConstants.CODE_MASTER_CREATE_HU_OPTION_VALUE_GR && receiptDetail.HuId == null) //�����������Ϊ�ջ�ʱ����Hu�������ջ�ʱ�Ѿ�ɨ���Hu�ˣ�����ɨ�账�� { #region �ջ�ʱ����Hu log.Debug("Create receipt detail with generate barcode."); #region ���������ջ�+ʣ����ͷ����Hu decimal oddQty = 0; if (!isOddCreateHu && orderDetail.HuLotSize.HasValue && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) //ֻ������֧����ͷ { #region ����ʣ����ͷ + �����ջ����Ƿ��ܹ�����Hu Hu oddHu = this.CreateHuFromOdd(receiptDetail, user); if (oddHu != null) { log.Debug("Generate barcode using odd qty."); //�����ͷ������Hu�������ջ�����ۼ� #region ����Hu IList<Hu> oddHuList = new List<Hu>(); oddHuList.Add(oddHu); IList<ReceiptDetail> oddReceiptDetailList = this.receiptDetailMgr.CreateReceiptDetail(receipt, orderLocationTransaction, oddHuList); log.Debug("Generate odd barcode successful."); #endregion #region ��� IList<InventoryTransaction> inventoryTransactionList = this.locationMgr.InventoryIn(oddReceiptDetailList[0], user, receiptDetail.PutAwayBinCode); log.Debug("odd Inventory in successful."); #endregion #region �Ƿ���� if (orderDetail.NeedInspection && orderHead.NeedInspection && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { LocationLotDetail locationLotDetail = this.locationLotDetailMgr.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = locationLotDetail.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } #endregion } #endregion oddQty = receiptDetail.ReceivedQty.HasValue && orderDetail.HuLotSize.HasValue ? receiptDetail.ReceivedQty.Value % orderDetail.HuLotSize.Value : 0; //�ջ���ͷ�� log.Debug("Receive odd qty is " + oddQty); receiptDetail.ReceivedQty = receiptDetail.ReceivedQty.Value - oddQty; //�ջ��������� } #endregion #region ����װ/��ͷ����Hu���� if (receiptDetail.ReceivedQty.HasValue || receiptDetail.RejectedQty.HasValue || receiptDetail.ScrapQty.HasValue) { //����Hu IList<Hu> huList = this.huMgr.CreateHu(receiptDetail, user); log.Debug("Create barcode successful."); //�����ջ��� IList<ReceiptDetail> receiptDetailList = this.receiptDetailMgr.CreateReceiptDetail(receipt, orderLocationTransaction, huList); log.Debug("Create receipt detail successful."); #region ������д�Ʒ���߷�Ʒ�ջ�����ӵ��ջ��б� if ((receiptDetail.RejectedQty.HasValue && receiptDetail.RejectedQty > 0) || (receiptDetail.ScrapQty.HasValue && receiptDetail.ScrapQty > 0)) { ReceiptDetail rejAndScrapReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, rejAndScrapReceiptDetail); rejAndScrapReceiptDetail.ReceivedQty = null; rejAndScrapReceiptDetail.PutAwayBinCode = null; rejAndScrapReceiptDetail.Receipt = receipt; this.receiptDetailMgr.CreateReceiptDetail(rejAndScrapReceiptDetail); receiptDetailList.Add(rejAndScrapReceiptDetail); receipt.AddReceiptDetail(rejAndScrapReceiptDetail); } #endregion foreach (ReceiptDetail huReceiptDetail in receiptDetailList) { #region ƥ��ReceiptDetail��InProcessLocationDetail��Copy�����Ϣ if (orderHead.Type != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) { IList<InProcessLocationDetail> matchInProcessLocationDetailList = OrderHelper.FindMatchInProcessLocationDetail(receiptDetail, inProcessLocationDetailList); if (matchInProcessLocationDetailList != null && matchInProcessLocationDetailList.Count > 0) { if (matchInProcessLocationDetailList.Count > 1) { //ֻ�е�ASN�а������룬�������ջ������ջ���������п��ܷ������������ //��̬����ô�ɡ� log.Error("ֻ�е�ASN�а������룬�������ջ������ջ���������п��ܷ������������"); throw new BusinessErrorException("���DZ�̬����ô���á�"); } //����ҵ�ƥ���ֻ������һ�� huReceiptDetail.PlannedBill = matchInProcessLocationDetailList[0].PlannedBill; huReceiptDetail.IsConsignment = matchInProcessLocationDetailList[0].IsConsignment; huReceiptDetail.ShippedQty = matchInProcessLocationDetailList[0].Qty; this.receiptDetailMgr.UpdateReceiptDetail(huReceiptDetail); } //�ջ�����HU������PlannedAmount��todo���������� huReceiptDetail.PlannedAmount = receiptDetail.PlannedAmount / receiptDetail.ReceivedQty.Value * huReceiptDetail.ReceivedQty.Value; } #endregion #region ��� IList<InventoryTransaction> inventoryTransactionList = this.locationMgr.InventoryIn(huReceiptDetail, user, receiptDetail.PutAwayBinCode); log.Debug("Inventory in successful."); #endregion #region �Ƿ���� if (orderDetail.NeedInspection && orderHead.NeedInspection && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML && huReceiptDetail.ReceivedQty.HasValue && huReceiptDetail.ReceivedQty > 0) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Location.Code != BusinessConstants.SYSTEM_LOCATION_REJECT) { LocationLotDetail locationLotDetail = this.locationLotDetailMgr.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = inventoryTransaction.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } } #endregion } } #endregion #region ����ʣ����ͷ���� if (oddQty > 0) { log.Debug("Start handle odd qty."); ReceiptDetail oddReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, oddReceiptDetail); oddReceiptDetail.ReceivedQty = oddQty; oddReceiptDetail.RejectedQty = 0; oddReceiptDetail.ScrapQty = 0; #region ��ͷ��� oddReceiptDetail.Receipt = receipt; IList<InventoryTransaction> inventoryTransactionList = this.locationMgr.InventoryIn(oddReceiptDetail, user, receiptDetail.PutAwayBinCode); #endregion #region ��ͷ�����ջ���ϸ this.receiptDetailMgr.CreateReceiptDetail(oddReceiptDetail); receipt.AddReceiptDetail(oddReceiptDetail); #endregion #region ����HuOdd LocationLotDetail locationLotDetail = locationLotDetailMgr.LoadLocationLotDetail(inventoryTransactionList[0].LocationLotDetailId); this.huOddMgr.CreateHuOdd(oddReceiptDetail, locationLotDetail, user); #endregion log.Debug("End handle odd qty."); } #endregion #endregion } else { #region �ջ�ʱ������Hu log.Debug("Create receipt detail with no generate barcode."); #region ����Hu�ϵ�OrderNo��ReceiptNo��AntiResloveHu if (receiptDetail.HuId != null && receiptDetail.HuId.Trim() != string.Empty) { Hu hu = this.huMgr.LoadHu(receiptDetail.HuId); bool isUpdated = false; if (hu.OrderNo == null || hu.ReceiptNo == null) { if (hu.OrderNo == null) { log.Debug("Update hu OrderNo " + orderHead.OrderNo + "."); hu.OrderNo = orderHead.OrderNo; } if (hu.ReceiptNo == null) { log.Debug("Update hu ReceiptNo " + receipt.ReceiptNo + "."); hu.ReceiptNo = receipt.ReceiptNo; } isUpdated = true; } if (hu.AntiResolveHu == null && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PROCUREMENT) { hu.AntiResolveHu = orderHead.AntiResolveHu; isUpdated = true; } if (isUpdated) { this.huMgr.UpdateHu(hu); } } #endregion IList<ReceiptDetail> noCreateHuReceiptDetailList = new List<ReceiptDetail>(); #region ƥ��ReceiptDetail��InProcessLocationDetail��Copy�����Ϣ log.Debug("Start match ReceiptDetail and InProcessLocationDetail."); if (orderHead.Type != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && orderHead.SubType != BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_ADJ) //�ջ������Ѿ�ƥ���InProcessLocationDetail������Ҫ��ƥ�� { IList<InProcessLocationDetail> matchInProcessLocationDetailList = OrderHelper.FindMatchInProcessLocationDetail(receiptDetail, inProcessLocationDetailList); log.Debug("Find matched InProcessLocationDetailList, count = " + matchInProcessLocationDetailList != null ? matchInProcessLocationDetailList.Count : 0); if (matchInProcessLocationDetailList != null && matchInProcessLocationDetailList.Count == 1) { //һ���ջ���Ӧһ�η����� log.Debug("one ipdet vs one receiptdet."); receiptDetail.PlannedBill = matchInProcessLocationDetailList[0].PlannedBill; receiptDetail.IsConsignment = matchInProcessLocationDetailList[0].IsConsignment; if (matchInProcessLocationDetailList[0].InProcessLocation.Type == BusinessConstants.CODE_MASTER_INPROCESS_LOCATION_TYPE_VALUE_GAP) { receiptDetail.ShippedQty = 0 - matchInProcessLocationDetailList[0].Qty; } else { receiptDetail.ShippedQty = matchInProcessLocationDetailList[0].Qty; } receiptDetail.ReceivedInProcessLocationDetail = matchInProcessLocationDetailList[0]; noCreateHuReceiptDetailList.Add(receiptDetail); } else if (matchInProcessLocationDetailList != null && matchInProcessLocationDetailList.Count > 1) { //һ���ջ���Ӧ��η����� //�磺���������룬�ջ��������� log.Debug("multi ipdet vs one receiptdet."); decimal totalRecQty = receiptDetail.ReceivedQty.Value; InProcessLocationDetail lastInProcessLocationDetail = null; log.Debug("Start Fetch matched InProcessLocationDetailList."); foreach (InProcessLocationDetail inProcessLocationDetail in matchInProcessLocationDetailList) { lastInProcessLocationDetail = inProcessLocationDetail; //��¼���һ�η������û�ж�Ӧ�������ջ���ʹ�� if (inProcessLocationDetail.ReceivedQty.HasValue && Math.Abs(inProcessLocationDetail.ReceivedQty.Value) >= Math.Abs(inProcessLocationDetail.Qty)) { continue; } if (Math.Abs(totalRecQty) > 0) { log.Debug("Start cloned ReceiptDetail."); ReceiptDetail clonedReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, clonedReceiptDetail); log.Debug("End cloned ReceiptDetail."); clonedReceiptDetail.PlannedBill = inProcessLocationDetail.PlannedBill; clonedReceiptDetail.IsConsignment = inProcessLocationDetail.IsConsignment; #region if (matchInProcessLocationDetailList[0].InProcessLocation.Type == BusinessConstants.CODE_MASTER_INPROCESS_LOCATION_TYPE_VALUE_GAP) { inProcessLocationDetail.Qty = 0 - inProcessLocationDetail.Qty; } #endregion if (Math.Abs(totalRecQty) > Math.Abs(inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero))) { clonedReceiptDetail.ReceivedQty = inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero); clonedReceiptDetail.ShippedQty = inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero); totalRecQty -= inProcessLocationDetail.Qty - (inProcessLocationDetail.ReceivedQty.HasValue ? inProcessLocationDetail.ReceivedQty.Value : decimal.Zero); } else { clonedReceiptDetail.ReceivedQty = totalRecQty; clonedReceiptDetail.ShippedQty = totalRecQty; totalRecQty = 0; } //��Ϊȥ������������¼�Ѿ�ƥ��ķ����������촦���ʱ��ƥ��������������졣 clonedReceiptDetail.ReceivedInProcessLocationDetail = inProcessLocationDetail; noCreateHuReceiptDetailList.Add(clonedReceiptDetail); } else { break; } } log.Debug("End Fetch matched InProcessLocationDetailList."); //���գ�û���ҵ���Ӧ�ķ����ֻ��¼�ջ�������������0 if (Math.Abs(totalRecQty) > 0) { ReceiptDetail clonedReceiptDetail = new ReceiptDetail(); CloneHelper.CopyProperty(receiptDetail, clonedReceiptDetail); clonedReceiptDetail.ShippedQty = 0; clonedReceiptDetail.ReceivedQty = totalRecQty; clonedReceiptDetail.ReceivedInProcessLocationDetail = lastInProcessLocationDetail; noCreateHuReceiptDetailList.Add(clonedReceiptDetail); } } else { noCreateHuReceiptDetailList.Add(receiptDetail); } } else { noCreateHuReceiptDetailList.Add(receiptDetail); } log.Debug("End match ReceiptDetail and InProcessLocationDetail."); #endregion foreach (ReceiptDetail noCreateHuReceiptDetail in noCreateHuReceiptDetailList) { noCreateHuReceiptDetail.Receipt = receipt; if (noCreateHuReceiptDetail.ReceivedQty != 0) { #region ��� log.Debug("Start Inventory In."); IList<InventoryTransaction> inventoryTransactionList = this.locationMgr.InventoryIn(noCreateHuReceiptDetail, user, noCreateHuReceiptDetail.PutAwayBinCode); log.Debug("End Inventory In."); #endregion #region �Ƿ���� if (orderDetail.NeedInspection && orderHead.NeedInspection && inventoryTransactionList != null && inventoryTransactionList.Count > 0 && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Location.Code != BusinessConstants.SYSTEM_LOCATION_REJECT) { LocationLotDetail locationLotDetail = this.locationLotDetailMgr.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = inventoryTransaction.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } } #endregion } #region �����ջ���ϸ log.Debug("Start Create Receipt Detail."); this.receiptDetailMgr.CreateReceiptDetail(noCreateHuReceiptDetail); receipt.AddReceiptDetail(noCreateHuReceiptDetail); log.Debug("End Create Receipt Detail."); #endregion } #endregion } } #endregion #region ���� if (inspectLocationLotDetailList.Count > 0) { //����û��Hu�ģ�����ջ�ʱ�Ѿ��س��˸�����棬Ҳ���ǿ�������ʹ�����������һ�¿��ܻ������� //����ipno��receiptno��isseperated�ֶ� this.inspectOrderMgr.CreateInspectOrder(inspectLocationLotDetailList, user, receipt.InProcessLocations[0].IpNo, receipt.ReceiptNo, false); } #endregion //#region ƥ���ջ���������Ҳ��� //IList<InProcessLocationDetail> gapInProcessLocationDetailList = new List<InProcessLocationDetail>(); //#region �����ƥ�� //foreach (InProcessLocationDetail inProcessLocationDetail in inProcessLocationDetailList) //{ // if (inProcessLocationDetail.OrderLocationTransaction.OrderDetail.OrderHead.Type // != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) //������ʱ��֧�ֲ��� // { // decimal receivedQty = 0; //��������ۼ��ջ��� // //һ����������ܶ�Ӧ�����ջ��� // foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) // { // //ƥ���ջ���ͷ����� // if (receiptDetail.ReceivedInProcessLocationDetail != null) // { // //�����Ѿ�ƥ��ģ�ֱ�Ӱ�������ƥ�� // if (receiptDetail.ReceivedInProcessLocationDetail.Id == inProcessLocationDetail.Id) // { // if (receiptDetail.ReceivedQty.HasValue) // { // receivedQty += receiptDetail.ReceivedQty.Value; // } // } // } // else if (OrderHelper.IsInProcessLocationDetailMatchReceiptDetail( // inProcessLocationDetail, receiptDetail)) // { // if (receiptDetail.ReceivedQty.HasValue) // { // receivedQty += receiptDetail.ReceivedQty.Value; // } // } // } // if (receivedQty != inProcessLocationDetail.Qty) // { // #region �ջ������ͷ���������ƥ�䣬��¼���� // InProcessLocationDetail gapInProcessLocationDetail = new InProcessLocationDetail(); // gapInProcessLocationDetail.Qty = receivedQty - inProcessLocationDetail.Qty; // gapInProcessLocationDetail.OrderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; // //gapInProcessLocationDetail.HuId = inProcessLocationDetail.HuId; // gapInProcessLocationDetail.LotNo = inProcessLocationDetail.LotNo; // gapInProcessLocationDetail.IsConsignment = inProcessLocationDetail.IsConsignment; // gapInProcessLocationDetail.PlannedBill = inProcessLocationDetail.PlannedBill; // gapInProcessLocationDetailList.Add(gapInProcessLocationDetail); // #endregion // } // } //} //#endregion //#region �ջ��ƥ�� //foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) //{ // if (receiptDetail.OrderLocationTransaction.OrderDetail.OrderHead.Type // != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION) //������ʱ��֧�ֲ��� // { // IList<InProcessLocationDetail> matchInProcessLocationDetailList = OrderHelper.FindMatchInProcessLocationDetail(receiptDetail, inProcessLocationDetailList); // if (matchInProcessLocationDetailList == null || matchInProcessLocationDetailList.Count == 0) // { // OrderLocationTransaction outOrderLocationTransaction = // this.orderLocationTransactionMgr.GetOrderLocationTransaction(receiptDetail.OrderLocationTransaction.OrderDetail, BusinessConstants.IO_TYPE_OUT)[0]; // #region û���ҵ����ջ����Ӧ�ķ����� // InProcessLocationDetail gapInProcessLocationDetail = new InProcessLocationDetail(); // gapInProcessLocationDetail.Qty = receiptDetail.ReceivedQty.Value; // gapInProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; // //gapInProcessLocationDetail.HuId = receiptDetail.HuId; // gapInProcessLocationDetail.LotNo = receiptDetail.LotNo; // gapInProcessLocationDetail.IsConsignment = receiptDetail.IsConsignment; // gapInProcessLocationDetail.PlannedBill = receiptDetail.PlannedBill; // gapInProcessLocationDetailList.Add(gapInProcessLocationDetail); // #endregion // } // } //} //#endregion //#endregion #region �ر�InProcessLocation if (receipt.InProcessLocations != null && receipt.InProcessLocations.Count > 0) { foreach (InProcessLocation inProcessLocation in receipt.InProcessLocations) { if (inProcessLocation.IsAsnUniqueReceipt) { //��֧�ֶ���ջ�ֱ�ӹر� this.inProcessLocationMgr.CloseInProcessLocation(inProcessLocation, user); } else { this.inProcessLocationMgr.TryCloseInProcessLocation(inProcessLocation, user); } //transportationOrderMgr.TryCompleteTransportationOrder(inProcessLocation, user); } } #endregion }
public Receipt ReceiveOrder(IList<ReceiptDetail> receiptDetailList, string userCode, InProcessLocation inProcessLocation) { if (receiptDetailList != null && receiptDetailList.Count > 0) { Receipt receipt = new Receipt(); if (inProcessLocation != null) { receipt.AddInProcessLocation(inProcessLocation); } foreach (ReceiptDetail receiptDetail in receiptDetailList) { receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } return ReceiveOrder(receipt, this.userMgrE.CheckAndLoadUser(userCode), null, true, true); } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } }
public string AdjustInProcessLocationTo() { try { InProcessLocation ip = TheInProcessLocationMgr.LoadInProcessLocation(this.IpNo, true); Receipt receipt = new Receipt(); InProcessLocation nmlIp = CloneHelper.DeepClone(ip); IList<InProcessLocationDetail> nmlReceiptDetailList = new List<InProcessLocationDetail>(); foreach (InProcessLocationDetail ipdet in ip.InProcessLocationDetails) { #region 对应的ipdet InProcessLocationDetail nmlInProcessLocationDetail = new InProcessLocationDetail(); nmlInProcessLocationDetail.Qty = 0 - ipdet.Qty; nmlInProcessLocationDetail.OrderLocationTransaction = TheOrderLocationTransactionMgr.GetOrderLocationTransaction(ipdet.OrderLocationTransaction.OrderDetail, BusinessConstants.IO_TYPE_IN)[0]; nmlInProcessLocationDetail.IsConsignment = ipdet.IsConsignment; nmlInProcessLocationDetail.PlannedBill = ipdet.PlannedBill; nmlReceiptDetailList.Add(nmlInProcessLocationDetail); #endregion #region 收货单明细 ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.Receipt = receipt; receiptDetail.ReceivedQty = nmlInProcessLocationDetail.Qty; receiptDetail.ShippedQty = nmlInProcessLocationDetail.Qty; receiptDetail.OrderLocationTransaction = nmlInProcessLocationDetail.OrderLocationTransaction; receiptDetail.IsConsignment = ipdet.IsConsignment; nmlInProcessLocationDetail.PlannedBill = ipdet.PlannedBill; OrderDetail orderDetail = receiptDetail.OrderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PROCUREMENT) { PriceListDetail priceListDetail = ThePriceListDetailMgr.GetLastestPriceListDetail(orderDetail.DefaultPriceList, orderDetail.Item, DateTime.Now, orderDetail.OrderHead.Currency); if (priceListDetail == null) { throw new BusinessErrorException("Order.Error.NoPriceListReceipt", new string[] { orderDetail.Item.Code }); } receiptDetail.PlannedAmount = priceListDetail.UnitPrice * (decimal)receiptDetail.ReceivedQty; } else if (orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION) { PriceListDetail priceListDetail = ThePriceListDetailMgr.GetLastestPriceListDetail(orderDetail.DefaultPriceList, orderDetail.Item, DateTime.Now, orderDetail.OrderHead.Currency); if (priceListDetail == null) { throw new BusinessErrorException("Order.Error.NoPriceListReceipt", new string[] { orderDetail.Item.Code }); } receiptDetail.PlannedAmount = priceListDetail.UnitPrice * (decimal)receiptDetail.ReceivedQty; } receipt.AddReceiptDetail(receiptDetail); #endregion } nmlIp.InProcessLocationDetails = nmlReceiptDetailList; if (receipt.InProcessLocations == null) { receipt.InProcessLocations = new List<InProcessLocation>(); } receipt.InProcessLocations.Add(nmlIp); TheReceiptMgr.CreateReceipt(receipt, this.CurrentUser); return receipt.ReceiptNo; } catch (BusinessErrorException ex) { throw (ex); } }
public Receipt ReceiveOrder(IList<ReceiptDetail> receiptDetailList, string userCode, InProcessLocation inProcessLocation, string externalReceiptNo, IList<WorkingHours> workingHoursList, bool createIp) { if (receiptDetailList != null && receiptDetailList.Count > 0) { Receipt receipt = new Receipt(); if (inProcessLocation != null) { receipt.AddInProcessLocation(inProcessLocation); } receipt.ExternalReceiptNo = externalReceiptNo; foreach (ReceiptDetail receiptDetail in receiptDetailList) { receiptDetail.Receipt = receipt; receipt.AddReceiptDetail(receiptDetail); } return ReceiveOrder(receipt, this.userMgrE.CheckAndLoadUser(userCode), workingHoursList, createIp, true); } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } }
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 DoReceiveOrder(string huId, OrderDetail orderDetail, decimal qty) { #region 创建外包装条码 log.Info("Insert hu " + huId + " into database."); Hu hu = ResolveAndCreateHu(huId, orderDetail, qty); #endregion #region 工单收货 orderDetail.HuId = hu.HuId; Receipt receipt = new Receipt(); ReceiptDetail receiptDetail = new ReceiptDetail(); receiptDetail.HuId = hu.HuId; receiptDetail.ReceivedQty = qty; receiptDetail.Receipt = receipt; #region 找Out的OrderLocTrans,填充MaterialFulshBack IList<OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id); foreach (OrderLocationTransaction orderLocTrans in orderLocTransList) { if (orderLocTrans.IOType == BusinessConstants.IO_TYPE_OUT) { MaterialFlushBack material = new MaterialFlushBack(); material.OrderLocationTransaction = orderLocTrans; if (orderLocTrans.UnitQty != 0) { material.Qty = qty; } receiptDetail.AddMaterialFlushBack(material); } else { receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0]; } } #endregion receipt.AddReceiptDetail(receiptDetail); this.orderManager.ReceiveOrder(receipt, this.userMgrE.GetMonitorUser()); #endregion }