public void CreateInProcessLocationDetail(InProcessLocation inProcessLocation, OrderLocationTransaction outOrderLocationTransaction, IList<InventoryTransaction> inventoryTransactionList) { if (inventoryTransactionList != null && inventoryTransactionList.Count > 0) { InProcessLocationDetail mergedInProcessLocationDetail = null; foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Hu == null && !inventoryTransaction.IsConsignment) { #region �ϲ��������� //û��HU && �Ǽ��۲ſ��Ժϲ� if (mergedInProcessLocationDetail == null) { mergedInProcessLocationDetail = new InProcessLocationDetail(); mergedInProcessLocationDetail.InProcessLocation = inProcessLocation; mergedInProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; } mergedInProcessLocationDetail.Qty += (0 - inventoryTransaction.Qty) / outOrderLocationTransaction.UnitQty; #endregion } else { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; if (inventoryTransaction.Hu != null) { inProcessLocationDetail.HuId = inventoryTransaction.Hu.HuId; inProcessLocationDetail.LotNo = inventoryTransaction.Hu.LotNo; } inProcessLocationDetail.IsConsignment = inventoryTransaction.IsConsignment; inProcessLocationDetail.PlannedBill = inventoryTransaction.PlannedBill; inProcessLocationDetail.Qty = (0 - inventoryTransaction.Qty) / outOrderLocationTransaction.UnitQty; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); this.CreateInProcessLocationDetail(inProcessLocationDetail); } } if (mergedInProcessLocationDetail != null) { inProcessLocation.AddInProcessLocationDetail(mergedInProcessLocationDetail); this.CreateInProcessLocationDetail(mergedInProcessLocationDetail); } } }
public void CreateInProcessLocationDetail(InProcessLocation inProcessLocation, OrderLocationTransaction outOrderLocationTransaction, IList<Hu> huList) { if (huList != null && huList.Count > 0) { foreach (Hu hu in huList) { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; inProcessLocationDetail.HuId = hu.HuId; inProcessLocationDetail.LotNo = hu.LotNo; inProcessLocationDetail.Qty = hu.Qty * hu.UnitQty / outOrderLocationTransaction.UnitQty; //�ȳ�Hu.UnitQtyתΪ������λ���ڳ�outOrderLocationTransaction.UnitQtyתΪ������λ�� inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); this.CreateInProcessLocationDetail(inProcessLocationDetail); } } }
public InProcessLocation ConvertOrderLocTransToInProcessLocation(IList<OrderLocationTransaction> orderLocTransList) { InProcessLocation inProcessLocation = new InProcessLocation(); if (orderLocTransList != null && orderLocTransList.Count > 0) { inProcessLocation = inProcessLocationMgrE.GenerateInProcessLocation(orderLocTransList[0].OrderDetail.OrderHead); foreach (OrderLocationTransaction orderLocTrans in orderLocTransList) { if (orderLocTrans.OrderDetail.RemainShippedQty > 0) { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.OrderLocationTransaction = orderLocTrans; inProcessLocationDetail.QtyToShip = orderLocTrans.OrderDetail.RemainShippedQty; inProcessLocationDetail.Qty = inProcessLocationDetail.QtyToShip; inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); } } } return inProcessLocation; }
public void CreateInProcessLocationDetail(InProcessLocation inProcessLocation, OrderLocationTransaction outOrderLocationTransaction, IList<InventoryTransaction> inventoryTransactionList) { if (inventoryTransactionList != null && inventoryTransactionList.Count > 0) { InProcessLocationDetail mergedInProcessLocationDetail = null; foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Hu == null && !inventoryTransaction.IsConsignment) { #region 合并发货数量 //没有HU && 非寄售才可以合并 if (mergedInProcessLocationDetail == null) { mergedInProcessLocationDetail = new InProcessLocationDetail(); mergedInProcessLocationDetail.InProcessLocation = inProcessLocation; mergedInProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; mergedInProcessLocationDetail.Item = outOrderLocationTransaction.OrderDetail.Item; mergedInProcessLocationDetail.ReferenceItemCode = outOrderLocationTransaction.OrderDetail.ReferenceItemCode; mergedInProcessLocationDetail.CustomerItemCode = outOrderLocationTransaction.OrderDetail.CustomerItemCode; mergedInProcessLocationDetail.Uom = outOrderLocationTransaction.OrderDetail.Uom; mergedInProcessLocationDetail.UnitCount = outOrderLocationTransaction.OrderDetail.UnitCount; mergedInProcessLocationDetail.LocationFrom = outOrderLocationTransaction.OrderDetail.LocationFrom; mergedInProcessLocationDetail.LocationTo = outOrderLocationTransaction.OrderDetail.LocationTo; } mergedInProcessLocationDetail.Qty += (0 - inventoryTransaction.Qty) / outOrderLocationTransaction.UnitQty; #endregion } else { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocationDetail.OrderLocationTransaction = outOrderLocationTransaction; if (inventoryTransaction.Hu != null) { inProcessLocationDetail.HuId = inventoryTransaction.Hu.HuId; inProcessLocationDetail.LotNo = inventoryTransaction.Hu.LotNo; } inProcessLocationDetail.IsConsignment = inventoryTransaction.IsConsignment; inProcessLocationDetail.PlannedBill = inventoryTransaction.PlannedBill; inProcessLocationDetail.Qty = (0 - inventoryTransaction.Qty) / outOrderLocationTransaction.UnitQty; inProcessLocationDetail.Item = outOrderLocationTransaction.OrderDetail.Item; inProcessLocationDetail.ReferenceItemCode = outOrderLocationTransaction.OrderDetail.ReferenceItemCode; inProcessLocationDetail.CustomerItemCode = outOrderLocationTransaction.OrderDetail.CustomerItemCode; inProcessLocationDetail.Uom = outOrderLocationTransaction.OrderDetail.Uom; inProcessLocationDetail.UnitCount = outOrderLocationTransaction.OrderDetail.UnitCount; inProcessLocationDetail.LocationFrom = outOrderLocationTransaction.OrderDetail.LocationFrom; inProcessLocationDetail.LocationTo = outOrderLocationTransaction.OrderDetail.LocationTo; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); this.CreateInProcessLocationDetail(inProcessLocationDetail); } } if (mergedInProcessLocationDetail != null) { inProcessLocation.AddInProcessLocationDetail(mergedInProcessLocationDetail); this.CreateInProcessLocationDetail(mergedInProcessLocationDetail); } } }
public Receipt ReceiveOrder(Receipt receipt, User user, IList<WorkingHours> workingHoursList, bool createIp, bool isOddCreateHu) { #region 变量定义 IDictionary<string, OrderHead> cachedOrderHead = new Dictionary<string, OrderHead>(); //缓存用到的OrderHead DateTime dateTimeNow = DateTime.Now; #endregion #region 判断全0收货 if (receipt != null && receipt.ReceiptDetails != null && receipt.ReceiptDetails.Count > 0) { //判断全0收货 IList<ReceiptDetail> nonZeroReceiptDetailList = new List<ReceiptDetail>(); foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) { if (!receiptDetail.ReceivedQty.HasValue) { receiptDetail.ReceivedQty = 0; } if (!receiptDetail.RejectedQty.HasValue) { receiptDetail.RejectedQty = 0; } if (!receiptDetail.ScrapQty.HasValue) { receiptDetail.ScrapQty = 0; } if (receiptDetail.ReceivedQty.Value != 0 || receiptDetail.RejectedQty.Value != 0 || receiptDetail.ScrapQty.Value != 0) { nonZeroReceiptDetailList.Add(receiptDetail); } } if (nonZeroReceiptDetailList.Count == 0) { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } receipt.ReceiptDetails = nonZeroReceiptDetailList; } else { throw new BusinessErrorException("OrderDetail.Error.OrderDetailReceiveEmpty"); } #endregion #region 为未发货就收货创建ASN if ((receipt.InProcessLocations == null || receipt.InProcessLocations.Count == 0) && createIp) { InProcessLocation inProcessLocation = new InProcessLocation(); #region 循环收货列表,并添加到发货列表中 foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) { OrderLocationTransaction orderLocationTransaction = receiptDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (receiptDetail.MaterialFlushBack != null && receiptDetail.MaterialFlushBack.Count > 0) { #region 根据物料回冲创建ASN,只适应生产,其它情况没有测试 foreach (MaterialFlushBack materialFlushBack in receiptDetail.MaterialFlushBack) { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.LoadOrderLocationTransaction(materialFlushBack.OrderLocationTransaction.Id); inProcessLocationDetail.HuId = materialFlushBack.HuId; inProcessLocationDetail.LotNo = materialFlushBack.LotNo; inProcessLocationDetail.Qty = materialFlushBack.Qty; inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); } #endregion } else { #region 根据out的OrderLocationTransaction自动创建ASN IList<OrderLocationTransaction> orderLocationTransactionList = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_OUT); foreach (OrderLocationTransaction orderLocTrans in orderLocationTransactionList) { #region 直接Copy收货项至发货项 InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); if (orderHead.IsShipScanHu) { //只有发货扫描条码才复制条码信息 inProcessLocationDetail.HuId = receiptDetail.HuId; inProcessLocationDetail.LotNo = receiptDetail.LotNo; } inProcessLocationDetail.OrderLocationTransaction = orderLocTrans; inProcessLocationDetail.Qty = receiptDetail.ReceivedQty.Value + receiptDetail.RejectedQty.Value + receiptDetail.ScrapQty.Value; inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); #endregion } #endregion } } #endregion #region 发货 DoShipOrder(inProcessLocation, user, true); receipt.AddInProcessLocation(inProcessLocation); #endregion } #endregion #region 更新订单信息 EntityPreference entityPreference = this.entityPreferenceMgrE.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_NO_PRICE_LIST_RECEIPT); string taxCode = entityPreferenceMgrE.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_TAX_RATE).Value; foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) { OrderLocationTransaction orderLocationTransaction = this.orderLocationTransactionMgrE.LoadOrderLocationTransaction(receiptDetail.OrderLocationTransaction.Id); receiptDetail.OrderLocationTransaction = orderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; #region 判断OrderHead状态并缓存 if (!cachedOrderHead.ContainsKey(orderHead.OrderNo)) { //检查权限 //if (!OrderHelper.CheckOrderOperationAuthrize(orderHead, user, BusinessConstants.ORDER_OPERATION_RECEIVE_ORDER)) //{ // throw new BusinessErrorException("Order.Error.NoReceivePermission", orderHead.OrderNo); //} //判断OrderHead状态,只要有ASN就都可以收货 if (!(orderHead.Status == BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS || orderHead.Status == BusinessConstants.CODE_MASTER_STATUS_VALUE_COMPLETE || orderHead.Status == BusinessConstants.CODE_MASTER_STATUS_VALUE_CLOSE)) { throw new BusinessErrorException("Order.Error.StatusErrorWhenReceive", orderHead.Status, orderHead.OrderNo); } //缓存OrderHead cachedOrderHead.Add(orderHead.OrderNo, orderHead); } #endregion #region 整包装收货判断,快速的不考虑 if (orderHead.FulfillUnitCount && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML && !(orderHead.IsAutoRelease && orderHead.IsAutoStart)) { if (receiptDetail.ReceivedQty % orderDetail.UnitCount != 0) { //不是整包装 throw new BusinessErrorException("Order.Error.NotFulfillUnitCountGrGi", orderDetail.Item.Code); } } #endregion #region 是否过量收货判断 if (orderDetail.OrderHead.SubType != BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_ADJ) { EntityPreference allowExceedentityPreference = this.entityPreferenceMgrE.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_ALLOW_EXCEED_GI_GR); bool allowExceedGiGR = bool.Parse(allowExceedentityPreference.Value); //企业属性,允许过量发货和收货 //检查Received(已收数)不能大于等于OrderedQty(订单数) //if (!(orderHead.AllowExceed && allowExceedGiGR) && orderDetail.ReceivedQty.HasValue) //{ // if ((orderDetail.OrderedQty > 0 && orderDetail.ReceivedQty.Value >= orderDetail.OrderedQty) // || (orderDetail.OrderedQty < 0 && orderDetail.ReceivedQty.Value <= orderDetail.OrderedQty)) // { // throw new BusinessErrorException("Order.Error.ReceiveExcceed", orderHead.OrderNo, orderDetail.Item.Code); // } //} if (!(orderHead.AllowExceed && allowExceedGiGR)) //不允许过量收货 { //检查AccumulateQty(已收数) + CurrentReceiveQty(本次收货数)不能大于OrderedQty(订单数) orderDetail.ReceivedQty = orderDetail.ReceivedQty.HasValue ? orderDetail.ReceivedQty.Value : 0; if ((orderDetail.OrderedQty > 0 && orderDetail.ReceivedQty + receiptDetail.ReceivedQty > orderDetail.OrderedQty) || (orderDetail.OrderedQty < 0 && orderDetail.ReceivedQty + receiptDetail.ReceivedQty < orderDetail.OrderedQty)) { throw new BusinessErrorException("Order.Error.ReceiveExcceed", orderHead.OrderNo, orderDetail.Item.Code); } } } #endregion #region 采购收货是否有价格单判断 if ((orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PROCUREMENT || orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_SUBCONCTRACTING) && !bool.Parse(entityPreference.Value)) { if (orderDetail.UnitPrice == Decimal.Zero) { //重新查找一次价格 PriceListDetail priceListDetail = priceListDetailMgrE.GetLastestPriceListDetail( orderDetail.DefaultPriceList, orderDetail.Item, orderHead.StartTime, orderHead.Currency, orderDetail.Uom); if (priceListDetail != null) { orderDetail.UnitPrice = priceListDetail.UnitPrice; orderDetail.IsProvisionalEstimate = priceListDetail.IsProvisionalEstimate; orderDetail.IsIncludeTax = priceListDetail.IsIncludeTax; orderDetail.TaxCode = taxCode; //priceListDetail.TaxCode; } else { throw new BusinessErrorException("Order.Error.NoPriceListReceipt", orderDetail.Item.Code); } } } #endregion #region 计算PlannedAmount,用ReceiptDetail缓存本次收货产生的PlannedAmount金额,在创建PlannedBill时使用 if (!orderDetail.ReceivedQty.HasValue) { orderDetail.ReceivedQty = 0; } if (orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PROCUREMENT || orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_SUBCONCTRACTING || orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION) { CalculatePlannedAmount(orderDetail, receiptDetail, orderDetail.IncludeTaxTotalPrice); } #endregion #region 记录OrderDetail的累计收货量 orderDetail.ReceivedQty += receiptDetail.ReceivedQty.Value; orderDetail.RejectedQty = receiptDetail.RejectedQty.Value + (orderDetail.RejectedQty == null ? 0 : orderDetail.RejectedQty); orderDetail.ScrapQty = receiptDetail.ScrapQty.Value + (orderDetail.ScrapQty == null ? 0 : orderDetail.ScrapQty); this.orderDetailMgrE.UpdateOrderDetail(orderDetail); #endregion #region 记录OrderLocationTransaction的累计收货量 #region 成品 if (!orderLocationTransaction.AccumulateQty.HasValue) { orderLocationTransaction.AccumulateQty = 0; } orderLocationTransaction.AccumulateQty += receiptDetail.ReceivedQty.Value * orderLocationTransaction.UnitQty; #endregion #region 次品 if (!orderLocationTransaction.AccumulateRejectQty.HasValue) { orderLocationTransaction.AccumulateRejectQty = 0; } orderLocationTransaction.AccumulateRejectQty += receiptDetail.RejectedQty.Value * orderLocationTransaction.UnitQty; #endregion #region 废品 if (!orderLocationTransaction.AccumulateScrapQty.HasValue) { orderLocationTransaction.AccumulateScrapQty = 0; } orderLocationTransaction.AccumulateScrapQty += receiptDetail.ScrapQty.Value * orderLocationTransaction.UnitQty; #endregion this.orderLocationTransactionMgrE.UpdateOrderLocationTransaction(orderLocationTransaction); #endregion } #endregion #region 创建收货单 this.receiptMgrE.CreateReceipt(receipt, user, isOddCreateHu); #endregion #region 记录工时 if (workingHoursList != null) { foreach (WorkingHours workingHours in workingHoursList) { workingHours.Receipt = receipt; workingHours.LastModifyDate = DateTime.Now; workingHours.LastModifyUser = user; this.workingHoursMgrE.CreateWorkingHours(workingHours); } } #endregion #region 更新订单头信息 foreach (OrderHead orderHead in cachedOrderHead.Values) { orderHead.LastModifyUser = user; orderHead.LastModifyDate = dateTimeNow; this.orderHeadMgrE.UpdateOrderHead(orderHead); if (!orderHead.AllowRepeatlyExceed) { TryCompleteOrder(orderHead, user); } } #endregion #region 处理委外加工 foreach (ReceiptDetail receiptDetail in receipt.ReceiptDetails) { OrderLocationTransaction orderLocationTransaction = receiptDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; Flow flow = this.flowMgrE.LoadFlow(orderHead.Flow); if (orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_SUBCONCTRACTING) { Flow productionFlow = this.flowMgrE.LoadFlow(flow.ReferenceFlow, true); OrderHead productionOrderHead = this.TransferFlow2Order(productionFlow, false); foreach (FlowDetail productionFlowDetail in productionFlow.FlowDetails) { if (productionFlowDetail.DefaultLocationTo != null && receiptDetail.OrderLocationTransaction.Location.Code //目的库位相同 == productionFlowDetail.DefaultLocationTo.Code && receiptDetail.OrderLocationTransaction.Item.Code == productionFlowDetail.Item.Code) { OrderDetail productionOrderDetail = this.orderDetailMgrE.TransferFlowDetail2OrderDetail(productionFlowDetail); #region 合并相同的productionOrderDetail bool findMatch = false; if (productionOrderHead.OrderDetails != null && productionOrderHead.OrderDetails.Count > 0) { foreach (OrderDetail addProductionOrderDetail in productionOrderHead.OrderDetails) { if (productionOrderDetail.Item.Code == addProductionOrderDetail.Item.Code && productionOrderDetail.Uom.Code == addProductionOrderDetail.Uom.Code && productionOrderDetail.UnitCount == addProductionOrderDetail.UnitCount && LocationHelper.IsLocationEqual(productionOrderDetail.DefaultLocationFrom, addProductionOrderDetail.DefaultLocationFrom) && LocationHelper.IsLocationEqual(productionOrderDetail.DefaultLocationTo, addProductionOrderDetail.DefaultLocationTo)) { decimal addQty = receiptDetail.ReceivedQty.Value; if (addProductionOrderDetail.Uom.Code != orderDetail.Uom.Code) { addProductionOrderDetail.OrderedQty += this.uomConversionMgrE.ConvertUomQty(addProductionOrderDetail.Item, orderDetail.Uom, addQty, productionOrderDetail.Uom); } else { addProductionOrderDetail.OrderedQty += addQty; } findMatch = true; } } } #endregion if (!findMatch) { productionOrderDetail.OrderHead = productionOrderHead; productionOrderDetail.OrderedQty = receiptDetail.ReceivedQty.Value; if (productionOrderDetail.Uom.Code != orderDetail.Uom.Code) { productionOrderDetail.OrderedQty = this.uomConversionMgrE.ConvertUomQty(productionOrderDetail.Item, orderDetail.Uom, receiptDetail.ReceivedQty.Value, productionOrderDetail.Uom); } productionOrderHead.AddOrderDetail(productionOrderDetail); } } } if (productionOrderHead.OrderDetails != null && productionOrderHead.OrderDetails.Count > 0) { productionOrderHead.IsAutoRelease = true; productionOrderHead.IsAutoStart = true; productionOrderHead.IsAutoShip = true; productionOrderHead.IsAutoReceive = true; productionOrderHead.StartLatency = 0; productionOrderHead.CompleteLatency = 0; productionOrderHead.StartTime = orderHead.StartTime; productionOrderHead.WindowTime = orderHead.WindowTime; productionOrderHead.ReferenceOrderNo = orderHead.OrderNo; productionOrderHead.Priority = BusinessConstants.CODE_MASTER_ORDER_PRIORITY_VALUE_NORMAL; productionOrderHead.IsSubcontract = true; this.CreateOrder(productionOrderHead, user); } } } #endregion #region 处理路线绑定 foreach (OrderHead orderHead in cachedOrderHead.Values) { this.CreateBindingOrder(orderHead, user, BusinessConstants.CODE_MASTER_BINDING_TYPE_VALUE_RECEIVE_ASYN, BusinessConstants.CODE_MASTER_BINDING_TYPE_VALUE_RECEIVE_SYN); } #endregion return receipt; }
public InProcessLocation ShipOrder(string pickListNo, User user) { PickList pickList = this.pickListMgrE.CheckAndLoadPickList(pickListNo); //订单关闭后,拣货单也应该能够发货 if (pickList.Status != BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS && pickList.Status != BusinessConstants.CODE_MASTER_STATUS_VALUE_COMPLETE && pickList.Status != BusinessConstants.CODE_MASTER_STATUS_VALUE_CLOSE) { throw new BusinessErrorException("Order.Error.PickUp.StatusErrorWhenShip", pickList.Status, pickList.PickListNo); } PickListHelper.CheckAuthrize(pickList, user); InProcessLocation inProcessLocation = new InProcessLocation(); foreach (PickListDetail pickListDetail in pickList.PickListDetails) { OrderLocationTransaction orderLocationTransaction = pickListDetail.OrderLocationTransaction; foreach (PickListResult pickListResult in pickListDetail.PickListResults) { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.HuId = pickListResult.LocationLotDetail.Hu.HuId; inProcessLocationDetail.LotNo = pickListResult.LocationLotDetail.LotNo; inProcessLocationDetail.OrderLocationTransaction = orderLocationTransaction; inProcessLocationDetail.Qty = pickListResult.Qty / orderLocationTransaction.UnitQty; //订单单位 inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); } } inProcessLocation = ShipOrder(inProcessLocation, user, false); #region 关闭捡货单 pickList.LastModifyDate = DateTime.Now; pickList.LastModifyUser = user; pickList.Status = BusinessConstants.CODE_MASTER_STATUS_VALUE_CLOSE; this.pickListMgrE.UpdatePickList(pickList); #endregion return inProcessLocation; }
public InProcessLocation ShipOrder(IList<OrderDetail> orderDetailList, User user) { InProcessLocation inProcessLocation = new InProcessLocation(); foreach (OrderDetail orderDetail in orderDetailList) { InProcessLocationDetail inProcessLocationDetail = new InProcessLocationDetail(); inProcessLocationDetail.OrderLocationTransaction = this.orderLocationTransactionMgrE.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_OUT)[0]; inProcessLocationDetail.Qty = orderDetail.CurrentShipQty; inProcessLocationDetail.InProcessLocation = inProcessLocation; inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); } return ShipOrder(inProcessLocation, user); }
public void CreateInProcessLocation(InProcessLocation inProcessLocation, User user, string type) { if (inProcessLocation.InProcessLocationDetails == null || inProcessLocation.InProcessLocationDetails.Count == 0) { throw new BusinessErrorException("InProcessLocation.Error.InProcessLocationDetailsEmpty"); } IList<InProcessLocationDetail> targetInProcessLocationDetailList = new List<InProcessLocationDetail>(); string orderType = null; Routing routing = null; Party partyFrom = null; Party partyTo = null; ShipAddress shipFrom = null; ShipAddress shipTo = null; string dockDescription = null; bool? isShipScanHu = null; bool isAllShipCreateHu = true; bool hasShipCreateHu = false; bool? isReceiptScanHu = null; string createHuOption = null; bool? isAutoReceive = null; decimal? completeLatency = null; string grGapTo = null; string asnTemplate = null; string receiptTemplate = null; string huTemplate = null; bool? needPrintAsn = null; bool? needPrintReceipt = null; bool? isAsnUniqueReceipt = null; bool? isGoodsReceiveFIFO = null; bool isEmergency = false; string flow = null; #region �ж�OrderHead��Type��PartyFrom, PartyTo, ShipFrom, ShipTo, DockDescription��Routing, IsReceiptScanHu, CreateHuOption��IsAutoReceipt��CompleteLatency��GrGapTo��AsnTemplate��ReceiptTemplate,HuTemplate�Ƿ�һ�� foreach (InProcessLocationDetail inProcessLocationDetail in inProcessLocation.InProcessLocationDetails) { if (inProcessLocationDetail.OrderLocationTransaction.BackFlushMethod != BusinessConstants.CODE_MASTER_BACKFLUSH_METHOD_VALUE_BATCH_FEED) //���˵�Ͷ�ϻس��Ͷ�� { targetInProcessLocationDetailList.Add(inProcessLocationDetail); } OrderLocationTransaction orderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (orderHead.Priority == BusinessConstants.CODE_MASTER_ORDER_PRIORITY_VALUE_URGENT) { isEmergency = true; } //�ж�OrderHead��Type�Ƿ�һ�� if (orderType == null) { orderType = orderHead.Type; } else if (orderHead.Type != orderType) { throw new BusinessErrorException("Order.Error.ShipOrder.OrderTypeNotEqual"); } //�ж�OrderHead��PartyFrom�Ƿ�һ�� if (partyFrom == null) { partyFrom = orderHead.PartyFrom; } else if (orderHead.PartyFrom.Code != partyFrom.Code) { throw new BusinessErrorException("Order.Error.ShipOrder.PartyFromNotEqual"); } //�ж�OrderHead��PartyFrom�Ƿ�һ�� if (partyTo == null) { partyTo = orderHead.PartyTo; } else if (orderHead.PartyTo.Code != partyTo.Code) { throw new BusinessErrorException("Order.Error.ShipOrder.PartyToNotEqual"); } //�ж�OrderHead��ShipFrom�Ƿ�һ�� if (shipFrom == null) { shipFrom = orderHead.ShipFrom; } else if (!AddressHelper.IsAddressEqual(orderHead.ShipFrom, shipFrom)) { throw new BusinessErrorException("Order.Error.ShipOrder.ShipFromNotEqual"); } //�ж�OrderHead��ShipTo�Ƿ�һ�� if (shipTo == null) { shipTo = orderHead.ShipTo; } else if (!AddressHelper.IsAddressEqual(orderHead.ShipTo, shipTo)) { throw new BusinessErrorException("Order.Error.ShipOrder.ShipToNotEqual"); } //�ж�OrderHead��DockDescription�Ƿ�һ�� if (dockDescription == null) { dockDescription = orderHead.DockDescription; } else if (orderHead.DockDescription != dockDescription) { throw new BusinessErrorException("Order.Error.ShipOrder.DockDescriptionNotEqual"); } //�ж�OrderHead��Routing�Ƿ�һ�� if (routing == null) { routing = orderHead.Routing; } else { if (!RoutingHelper.IsRoutingEqual(orderHead.Routing, routing)) { throw new BusinessErrorException("Order.Error.ShipOrder.RoutingNotEqual"); } } //�ж�OrderHead��IsShipScanHu�Ƿ�һ�� if (isShipScanHu == null) { isShipScanHu = orderHead.IsShipScanHu; } else if (orderHead.IsShipScanHu != isShipScanHu) { throw new BusinessErrorException("Order.Error.ShipOrder.IsShipScanHuNotEqual"); } if (!isShipScanHu.Value) { if (orderHead.CreateHuOption != BusinessConstants.CODE_MASTER_CREATE_HU_OPTION_VALUE_GI) { isAllShipCreateHu = false; } else { hasShipCreateHu = true; } } //�ж�OrderHead��IsReceiptScanHu�Ƿ�һ�� if (isReceiptScanHu == null) { isReceiptScanHu = orderHead.IsReceiptScanHu; } else if (orderHead.IsReceiptScanHu != isReceiptScanHu) { throw new BusinessErrorException("Order.Error.ShipOrder.IsReceiptScanHuNotEqual"); } //�ж�OrderHead��CreateHuOption�Ƿ�һ�� if (createHuOption == null) { createHuOption = orderHead.CreateHuOption; } else { if (orderHead.CreateHuOption != createHuOption) { throw new BusinessErrorException("Order.Error.ShipOrder.CreateHuOptionNotEqual"); } } //�ж�OrderHead��IsAutoReceipt�Ƿ�һ�� if (isAutoReceive == null) { isAutoReceive = orderHead.IsAutoReceive; } else if (orderHead.IsAutoReceive != isAutoReceive) { throw new BusinessErrorException("Order.Error.ShipOrder.IsAutoReceiveNotEqual"); } //�ж�OrderHead��NeedPrintAsn�Ƿ�һ�� if (needPrintAsn == null) { needPrintAsn = orderHead.NeedPrintAsn; } else if (orderHead.NeedPrintAsn != needPrintAsn) { throw new BusinessErrorException("Order.Error.ShipOrder.NeedPrintAsnNotEqual"); } //�ж�OrderHead��NeedPrintReceipt�Ƿ�һ�� if (needPrintReceipt == null) { needPrintReceipt = orderHead.NeedPrintReceipt; } else if (orderHead.NeedPrintReceipt != needPrintReceipt) { throw new BusinessErrorException("Order.Error.ShipOrder.NeedPrintReceiptNotEqual"); } //�ж�OrderHead��CompleteLatency�Ƿ�һ�� if (completeLatency == null) { completeLatency = orderHead.CompleteLatency; } else { if (orderHead.CompleteLatency.HasValue && orderHead.CompleteLatency != completeLatency) { throw new BusinessErrorException("Order.Error.ShipOrder.CompleteLatencyNotEqual"); } } //�ж�OrderHead��GoodsReceiptGapTo�Ƿ�һ�� if (grGapTo == null) { grGapTo = orderHead.GoodsReceiptGapTo; } else { if (orderHead.GoodsReceiptGapTo != null && orderHead.GoodsReceiptGapTo != grGapTo) { throw new BusinessErrorException("Order.Error.ShipOrder.GoodsReceiptGapToNotEqual"); } } //�ж�OrderHead��AsnTemplate�Ƿ�һ�� if (asnTemplate == null) { asnTemplate = orderHead.AsnTemplate; } else { if (orderHead.AsnTemplate != null && orderHead.AsnTemplate != asnTemplate) { throw new BusinessErrorException("Order.Error.ShipOrder.AsnTemplateNotEqual"); } } //�ж�OrderHead��ReceiptTemplate�Ƿ�һ�� if (receiptTemplate == null) { receiptTemplate = orderHead.ReceiptTemplate; } else { if (orderHead.ReceiptTemplate != null && orderHead.ReceiptTemplate != receiptTemplate) { throw new BusinessErrorException("Order.Error.ShipOrder.ReceiptTemplateNotEqual"); } } //�ж�OrderHead��HuTemplate�Ƿ�һ�� if (huTemplate == null) { huTemplate = orderHead.HuTemplate; } else { if (orderHead.HuTemplate != null && orderHead.HuTemplate != huTemplate) { throw new BusinessErrorException("Order.Error.ShipOrder.HuTemplateNotEqual"); } } //�ж�OrderHead��IsAsnUniqueReceipt�Ƿ�һ�� if (isAsnUniqueReceipt == null) { isAsnUniqueReceipt = orderHead.IsAsnUniqueReceipt; } else if (orderHead.IsAsnUniqueReceipt != isAsnUniqueReceipt) { throw new BusinessErrorException("Order.Error.ShipOrder.IsAsnUniqueReceiptNotEqual"); } //�ж�OrderHead��PartyFrom�Ƿ�һ�� if (isGoodsReceiveFIFO == null) { isGoodsReceiveFIFO = orderHead.IsGoodsReceiveFIFO; } else if (isGoodsReceiveFIFO != orderHead.IsGoodsReceiveFIFO) { throw new BusinessErrorException("Order.Error.ShipOrder.IsGoodsReceiveFIFONotEqual"); } //����flow flow = orderHead.Flow; } if (isShipScanHu.HasValue && !isShipScanHu.Value && !isAllShipCreateHu && hasShipCreateHu) { throw new BusinessErrorException("Order.Error.ShipOrder.NotAllShipCreateHu"); } #endregion #region ����ASNͷ DateTime dateTimeNow = DateTime.Now; inProcessLocation.IpNo = numberControlMgr.GenerateNumber(BusinessConstants.CODE_PREFIX_ASN); inProcessLocation.OrderType = orderType; // inProcessLocation.Type = type; inProcessLocation.Status = BusinessConstants.CODE_MASTER_STATUS_VALUE_CREATE; inProcessLocation.PartyFrom = partyFrom; inProcessLocation.PartyTo = partyTo; inProcessLocation.ShipFrom = shipFrom; inProcessLocation.ShipTo = shipTo; inProcessLocation.DockDescription = dockDescription; inProcessLocation.IsShipScanHu = isShipScanHu.HasValue ? isShipScanHu.Value : false; inProcessLocation.IsDetailContainHu = (isShipScanHu.HasValue ? isShipScanHu.Value : false) || isAllShipCreateHu; inProcessLocation.IsReceiptScanHu = isReceiptScanHu.HasValue ? isReceiptScanHu.Value : false; inProcessLocation.IsAutoReceive = isAutoReceive.HasValue ? isAutoReceive.Value : false; inProcessLocation.CompleteLatency = completeLatency; inProcessLocation.GoodsReceiptGapTo = grGapTo; inProcessLocation.AsnTemplate = asnTemplate; inProcessLocation.ReceiptTemplate = receiptTemplate; inProcessLocation.NeedPrintAsn = needPrintAsn.HasValue ? needPrintAsn.Value : false; inProcessLocation.NeedPrintReceipt = needPrintReceipt.HasValue ? needPrintReceipt.Value : false; inProcessLocation.IsAsnUniqueReceipt = isAsnUniqueReceipt.HasValue ? isAsnUniqueReceipt.Value : false; inProcessLocation.DepartTime = dateTimeNow; inProcessLocation.Flow = flowMgr.LoadFlow(flow); if (isEmergency) { inProcessLocation.ArriveTime = inProcessLocation.DepartTime.AddHours(Convert.ToDouble(inProcessLocation.Flow.EmTime.HasValue ? inProcessLocation.Flow.EmTime.Value : 0)); } else { inProcessLocation.ArriveTime = inProcessLocation.DepartTime.AddHours(Convert.ToDouble(inProcessLocation.Flow.LeadTime.HasValue ? inProcessLocation.Flow.LeadTime.Value : 0)); } inProcessLocation.CreateUser = user; inProcessLocation.CreateDate = dateTimeNow; inProcessLocation.LastModifyUser = user; inProcessLocation.LastModifyDate = dateTimeNow; this.CreateInProcessLocation(inProcessLocation); #endregion inProcessLocation.InProcessLocationDetails = null; //���Asn��ϸ���Ժ���� IList<InventoryTransaction> allInventoryTransactionList = new List<InventoryTransaction>(); //����InventoryTransaction��������FIFOʹ�� if (targetInProcessLocationDetailList != null && targetInProcessLocationDetailList.Count > 0) { #region HU����/����/����ASN��ϸ if (type == BusinessConstants.CODE_MASTER_INPROCESS_LOCATION_TYPE_VALUE_NORMAL) { IList<LocationLotDetail> inspectLocationLotDetailList = new List<LocationLotDetail>(); foreach (InProcessLocationDetail inProcessLocationDetail in targetInProcessLocationDetailList) { OrderLocationTransaction orderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML && orderHead.CreateHuOption == BusinessConstants.CODE_MASTER_CREATE_HU_OPTION_VALUE_GI && inProcessLocationDetail.HuId == null) //�����������Ϊ����ʱ����Hu�����Ƿ���ʱ�Ѿ�ɨ���Hu�ˣ�����ɨ�账�� { #region ����ʱ����Hu if (orderLocationTransaction.Location != null) { //�������� IList<InventoryTransaction> inventoryTransactionList = this.locationMgr.InventoryOut(inProcessLocationDetail, user); IListHelper.AddRange<InventoryTransaction>(allInventoryTransactionList, inventoryTransactionList); } //����Hu IList<Hu> huList = this.huMgr.CreateHu(inProcessLocationDetail, user); //����Hu����ASN��ϸ this.inProcessLocationDetailMgr.CreateInProcessLocationDetail(inProcessLocation, orderLocationTransaction, huList); #endregion } else { #region ����ʱ������Hu #region ����Hu�ϵ�OrderNo if (inProcessLocationDetail.HuId != null && inProcessLocationDetail.HuId != string.Empty) { Hu hu = this.huMgr.LoadHu(inProcessLocationDetail.HuId); if (hu.OrderNo == null) { hu.OrderNo = orderHead.OrderNo; this.huMgr.UpdateHu(hu); } } #endregion if (orderLocationTransaction.Location != null) { #region ����Դ��λ //�������� IList<InventoryTransaction> inventoryTransactionList = this.locationMgr.InventoryOut(inProcessLocationDetail, user); IListHelper.AddRange<InventoryTransaction>(allInventoryTransactionList, inventoryTransactionList); //��������ϸ����ASN��ϸ inProcessLocationDetailMgr.CreateInProcessLocationDetail(inProcessLocation, orderLocationTransaction, inventoryTransactionList); //�����˻�����, �Ƿ���� if (orderDetail.NeedInspection && orderHead.NeedInspection && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_RTN) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Qty > 0) { if (inventoryTransaction.Location.Code != BusinessConstants.SYSTEM_LOCATION_REJECT) { LocationLotDetail locationLotDetail = this.locationLotDetailMgr.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = inventoryTransaction.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } } } #endregion } else { #region û����Դ��λ //���ݷ�����ϸ����ASN��ϸ inProcessLocationDetail.InProcessLocation = inProcessLocation; this.inProcessLocationDetailMgr.CreateInProcessLocationDetail(inProcessLocationDetail); inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); #endregion } #endregion } } #region ���� if (inspectLocationLotDetailList.Count > 0) { //����û��Hu�ģ�����ջ�ʱ�Ѿ��س��˸�����棬Ҳ���ǿ�������ʹ�����������һ�¿��ܻ������� this.inspectOrderMgr.CreateInspectOrder(inspectLocationLotDetailList, user); } #endregion } else { #region Ϊ���콨����ϸ foreach (InProcessLocationDetail inProcessLocationDetail in targetInProcessLocationDetailList) { inProcessLocationDetail.InProcessLocation = inProcessLocation; this.inProcessLocationDetailMgr.CreateInProcessLocationDetail(inProcessLocationDetail); inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); } #endregion } #endregion } #region ���鷢��FIFO����ʱ�����Ǽ����ռ�ÿ�� if (isGoodsReceiveFIFO.HasValue && isGoodsReceiveFIFO.Value && allInventoryTransactionList.Count > 0) { //allInventoryTransactionList var query = from a in allInventoryTransactionList where a.Hu != null group a by new { LocationCode = a.Location.Code, ItemCode = a.Item.Code } into g select new { LocationCode = g.Key.LocationCode, ItemCode = g.Key.ItemCode, list = g.ToList() }; if (query != null && query.Count() > 0) { foreach (var q in query) { InventoryTransaction inventoryTransaction = q.list.OrderByDescending(i => i.Hu.ManufactureDate).FirstOrDefault(); IList<string> huIdList = q.list.Where(i => i.Hu.ManufactureDate < inventoryTransaction.Hu.ManufactureDate).Select(i => i.Hu.HuId).ToList(); if (!this.locationLotDetailMgr.CheckGoodsIssueFIFO(inventoryTransaction.Location.Code, inventoryTransaction.Item.Code, inventoryTransaction.Hu.ManufactureDate, huIdList)) { throw new BusinessErrorException("MasterData.InventoryOut.LotNoIsOld", inventoryTransaction.Item.Code, inventoryTransaction.Hu.HuId, inventoryTransaction.Hu.LotNo, inventoryTransaction.Location.Code); } } } } #endregion #region ����ASN�� if (orderType != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && routing != null) { IList<InProcessLocationTrack> inProcessLocationTrackList = this.inProcessLocationTrackMgr.CreateIInProcessLocationTrack(inProcessLocation, routing); #region ����Ĭ�Ͻ����һ��Activity if (inProcessLocationTrackList != null && inProcessLocationTrackList.Count > 0) { IListHelper.Sort<InProcessLocationTrack>(inProcessLocationTrackList, "Operation"); inProcessLocation.CurrentOperation = inProcessLocationTrackList[0].Operation; inProcessLocation.CurrentActivity = inProcessLocationTrackList[0].Activity; this.UpdateInProcessLocation(inProcessLocation); } #endregion } #endregion }
public void CreateInProcessLocation(InProcessLocation inProcessLocation, User user, string type) { if (inProcessLocation.InProcessLocationDetails == null || inProcessLocation.InProcessLocationDetails.Count == 0) { throw new BusinessErrorException("InProcessLocation.Error.InProcessLocationDetailsEmpty"); } IList<InProcessLocationDetail> targetInProcessLocationDetailList = new List<InProcessLocationDetail>(); string orderType = null; Routing routing = null; Party partyFrom = null; Party partyTo = null; ShipAddress shipFrom = null; ShipAddress shipTo = null; string dockDescription = null; bool? isShipScanHu = null; bool isAllShipCreateHu = true; bool hasShipCreateHu = false; bool? isReceiptScanHu = null; string createHuOption = null; bool? isAutoReceive = null; decimal? completeLatency = null; string grGapTo = null; string asnTemplate = null; string receiptTemplate = null; string huTemplate = null; bool? needPrintAsn = null; bool? isAsnUniqueReceipt = null; bool? isGoodsReceiveFIFO = null; BillAddress billFrom = null; BillAddress billTo = null; #region 判断OrderHead的Type、PartyFrom, PartyTo, ShipFrom, ShipTo, DockDescription、Routing, IsReceiptScanHu, CreateHuOption、IsAutoReceipt、CompleteLatency、GrGapTo、AsnTemplate、ReceiptTemplate,HuTemplate是否一致 foreach (InProcessLocationDetail inProcessLocationDetail in inProcessLocation.InProcessLocationDetails) { if (inProcessLocationDetail.OrderLocationTransaction.BackFlushMethod != BusinessConstants.CODE_MASTER_BACKFLUSH_METHOD_VALUE_BATCH_FEED) //过滤掉投料回冲的投入 { targetInProcessLocationDetailList.Add(inProcessLocationDetail); } OrderLocationTransaction orderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; //判断OrderHead的Type是否一致 if (orderType == null) { orderType = orderHead.Type; } else if (orderHead.Type != orderType) { throw new BusinessErrorException("Order.Error.ShipOrder.OrderTypeNotEqual"); } //判断OrderHead的PartyFrom是否一致 if (partyFrom == null) { partyFrom = orderHead.PartyFrom; } else if (orderHead.PartyFrom.Code != partyFrom.Code) { throw new BusinessErrorException("Order.Error.ShipOrder.PartyFromNotEqual"); } //判断OrderHead的PartyFrom是否一致 if (partyTo == null) { partyTo = orderHead.PartyTo; } else if (orderHead.PartyTo.Code != partyTo.Code) { throw new BusinessErrorException("Order.Error.ShipOrder.PartyToNotEqual"); } //判断OrderHead的BillFrom是否一致 if (billFrom == null) { billFrom = orderHead.BillFrom; } else if (orderHead.BillFrom == null || orderHead.BillFrom.Code != billFrom.Code) { throw new BusinessErrorException("Order.Error.ShipOrder.BillFromNotEqual"); } //判断OrderHead的BillTo是否一致 if (billTo == null) { billTo = orderHead.BillTo; } else if (orderHead.BillTo == null || orderHead.BillTo.Code != billTo.Code) { throw new BusinessErrorException("Order.Error.ShipOrder.BillToNotEqual"); } //判断OrderHead的ShipFrom是否一致 if (shipFrom == null) { shipFrom = orderHead.ShipFrom; } else if (!AddressHelper.IsAddressEqual(orderHead.ShipFrom, shipFrom)) { throw new BusinessErrorException("Order.Error.ShipOrder.ShipFromNotEqual"); } //判断OrderHead的ShipTo是否一致 if (shipTo == null) { shipTo = orderHead.ShipTo; } else if (!AddressHelper.IsAddressEqual(orderHead.ShipTo, shipTo)) { throw new BusinessErrorException("Order.Error.ShipOrder.ShipToNotEqual"); } //判断OrderHead的DockDescription是否一致 if (dockDescription == null) { dockDescription = orderHead.DockDescription; } else if (orderHead.DockDescription != dockDescription) { throw new BusinessErrorException("Order.Error.ShipOrder.DockDescriptionNotEqual"); } //判断OrderHead的Routing是否一致 if (routing == null) { routing = orderHead.Routing; } else { if (!RoutingHelper.IsRoutingEqual(orderHead.Routing, routing)) { throw new BusinessErrorException("Order.Error.ShipOrder.RoutingNotEqual"); } } //判断OrderHead的IsShipScanHu是否一致 if (isShipScanHu == null) { isShipScanHu = orderHead.IsShipScanHu; } else if (orderHead.IsShipScanHu != isShipScanHu) { throw new BusinessErrorException("Order.Error.ShipOrder.IsShipScanHuNotEqual"); } if (!isShipScanHu.Value) { if (orderHead.CreateHuOption != BusinessConstants.CODE_MASTER_CREATE_HU_OPTION_VALUE_GI) { isAllShipCreateHu = false; } else { hasShipCreateHu = true; } } //判断OrderHead的IsReceiptScanHu是否一致 if (isReceiptScanHu == null) { isReceiptScanHu = orderHead.IsReceiptScanHu; } else if (orderHead.IsReceiptScanHu != isReceiptScanHu) { throw new BusinessErrorException("Order.Error.ShipOrder.IsReceiptScanHuNotEqual"); } //判断OrderHead的CreateHuOption是否一致 if (createHuOption == null) { createHuOption = orderHead.CreateHuOption; } else { if (orderHead.CreateHuOption != createHuOption) { throw new BusinessErrorException("Order.Error.ShipOrder.CreateHuOptionNotEqual"); } } //判断OrderHead的IsAutoReceipt是否一致 if (isAutoReceive == null) { isAutoReceive = orderHead.IsAutoReceive; } else if (orderHead.IsAutoReceive != isAutoReceive) { throw new BusinessErrorException("Order.Error.ShipOrder.IsAutoReceiveNotEqual"); } //判断OrderHead的NeedPrintAsn是否一致 if (needPrintAsn == null) { needPrintAsn = orderHead.NeedPrintAsn; } else if (orderHead.NeedPrintAsn != needPrintAsn) { throw new BusinessErrorException("Order.Error.ShipOrder.NeedPrintAsnNotEqual"); } //判断OrderHead的CompleteLatency是否一致 if (completeLatency == null) { completeLatency = orderHead.CompleteLatency; } else { if (orderHead.CompleteLatency.HasValue && orderHead.CompleteLatency != completeLatency) { throw new BusinessErrorException("Order.Error.ShipOrder.CompleteLatencyNotEqual"); } } //判断OrderHead的GoodsReceiptGapTo是否一致 if (grGapTo == null) { grGapTo = orderHead.GoodsReceiptGapTo; } else { if (orderHead.GoodsReceiptGapTo != null && orderHead.GoodsReceiptGapTo != grGapTo) { throw new BusinessErrorException("Order.Error.ShipOrder.GoodsReceiptGapToNotEqual"); } } //判断OrderHead的AsnTemplate是否一致 if (asnTemplate == null) { asnTemplate = orderHead.AsnTemplate; } else { if (orderHead.AsnTemplate != null && orderHead.AsnTemplate != asnTemplate) { throw new BusinessErrorException("Order.Error.ShipOrder.AsnTemplateNotEqual"); } } //判断OrderHead的ReceiptTemplate是否一致 if (receiptTemplate == null) { receiptTemplate = orderHead.ReceiptTemplate; } else { if (orderHead.ReceiptTemplate != null && orderHead.ReceiptTemplate != receiptTemplate) { throw new BusinessErrorException("Order.Error.ShipOrder.ReceiptTemplateNotEqual"); } } //判断OrderHead的HuTemplate是否一致 if (huTemplate == null) { huTemplate = orderHead.HuTemplate; } else { if (orderHead.HuTemplate != null && orderHead.HuTemplate != huTemplate) { throw new BusinessErrorException("Order.Error.ShipOrder.HuTemplateNotEqual"); } } //判断OrderHead的IsAsnUniqueReceipt是否一致 if (isAsnUniqueReceipt == null) { isAsnUniqueReceipt = orderHead.IsAsnUniqueReceipt; } else if (orderHead.IsAsnUniqueReceipt != isAsnUniqueReceipt) { throw new BusinessErrorException("Order.Error.ShipOrder.IsAsnUniqueReceiptNotEqual"); } //判断OrderHead的PartyFrom是否一致 if (isGoodsReceiveFIFO == null) { isGoodsReceiveFIFO = orderHead.IsGoodsReceiveFIFO; } else if (isGoodsReceiveFIFO != orderHead.IsGoodsReceiveFIFO) { throw new BusinessErrorException("Order.Error.ShipOrder.IsGoodsReceiveFIFONotEqual"); } } if (isShipScanHu.HasValue && !isShipScanHu.Value && !isAllShipCreateHu && hasShipCreateHu) { throw new BusinessErrorException("Order.Error.ShipOrder.NotAllShipCreateHu"); } #endregion #region 创建ASN头 DateTime dateTimeNow = DateTime.Now; if (orderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION || orderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_TRANSFER) { inProcessLocation.IpNo = numberControlMgrE.GenerateNumber(BusinessConstants.CODE_PREFIX_ASN); } else { inProcessLocation.IpNo = numberControlMgrE.GenerateNumber(BusinessConstants.CODE_PREFIX_ASN_ELSE); } inProcessLocation.OrderType = orderType; // inProcessLocation.Type = type; inProcessLocation.Status = BusinessConstants.CODE_MASTER_STATUS_VALUE_CREATE; inProcessLocation.PartyFrom = partyFrom; inProcessLocation.PartyTo = partyTo; inProcessLocation.ShipFrom = shipFrom; inProcessLocation.ShipTo = shipTo; inProcessLocation.DockDescription = dockDescription; inProcessLocation.IsShipScanHu = isShipScanHu.HasValue ? isShipScanHu.Value : false; inProcessLocation.IsDetailContainHu = (isShipScanHu.HasValue ? isShipScanHu.Value : false) || isAllShipCreateHu; inProcessLocation.IsReceiptScanHu = isReceiptScanHu.HasValue ? isReceiptScanHu.Value : false; inProcessLocation.IsAutoReceive = isAutoReceive.HasValue ? isAutoReceive.Value : false; inProcessLocation.CompleteLatency = completeLatency; inProcessLocation.GoodsReceiptGapTo = grGapTo; inProcessLocation.AsnTemplate = asnTemplate; inProcessLocation.ReceiptTemplate = receiptTemplate; inProcessLocation.NeedPrintAsn = needPrintAsn.HasValue ? needPrintAsn.Value : false; inProcessLocation.IsAsnUniqueReceipt = isAsnUniqueReceipt.HasValue ? isAsnUniqueReceipt.Value : false; inProcessLocation.BillFrom = billFrom; inProcessLocation.BillTo = billTo; if (orderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION || orderType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_TRANSFER) { inProcessLocation.ApprovalStatus = BusinessConstants.CODE_MASTER_APPROVALSTATUS_PENDING; } inProcessLocation.CreateUser = user; inProcessLocation.CreateDate = dateTimeNow; inProcessLocation.LastModifyUser = user; inProcessLocation.LastModifyDate = dateTimeNow; this.CreateInProcessLocation(inProcessLocation); #endregion inProcessLocation.InProcessLocationDetails = null; //清空Asn明细,稍后填充 IList<InventoryTransaction> allInventoryTransactionList = new List<InventoryTransaction>(); //缓存InventoryTransaction,供出库FIFO使用 if (targetInProcessLocationDetailList != null && targetInProcessLocationDetailList.Count > 0) { #region HU处理/出库/创建ASN明细 if (type == BusinessConstants.CODE_MASTER_INPROCESS_LOCATION_TYPE_VALUE_NORMAL) { IList<LocationLotDetail> inspectLocationLotDetailList = new List<LocationLotDetail>(); foreach (InProcessLocationDetail inProcessLocationDetail in targetInProcessLocationDetailList) { OrderLocationTransaction orderLocationTransaction = inProcessLocationDetail.OrderLocationTransaction; OrderDetail orderDetail = orderLocationTransaction.OrderDetail; OrderHead orderHead = orderDetail.OrderHead; if (orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_NML && orderHead.CreateHuOption == BusinessConstants.CODE_MASTER_CREATE_HU_OPTION_VALUE_GI && inProcessLocationDetail.HuId == null) //如果订单设置为发货时创建Hu,但是发货时已经扫描过Hu了,按已扫描处理 { #region 发货时创建Hu if (orderLocationTransaction.Location != null) { //发货出库 IList<InventoryTransaction> inventoryTransactionList = this.locationMgrE.InventoryOut(inProcessLocationDetail, user); IListHelper.AddRange<InventoryTransaction>(allInventoryTransactionList, inventoryTransactionList); } //创建Hu IList<Hu> huList = this.huMgrE.CreateHu(inProcessLocationDetail, user); //按照Hu创建ASN明细 this.inProcessLocationDetailMgrE.CreateInProcessLocationDetail(inProcessLocation, orderLocationTransaction, huList); #endregion } else { #region 发货时不创建Hu #region 更新Hu上的OrderNo if (inProcessLocationDetail.HuId != null && inProcessLocationDetail.HuId != string.Empty) { Hu hu = this.huMgrE.LoadHu(inProcessLocationDetail.HuId); if (hu.OrderNo == null) { hu.OrderNo = orderHead.OrderNo; this.huMgrE.UpdateHu(hu); } } #endregion if (orderLocationTransaction.Location != null) { #region 有来源库位 //发货出库 IList<InventoryTransaction> inventoryTransactionList = this.locationMgrE.InventoryOut(inProcessLocationDetail, user); IListHelper.AddRange<InventoryTransaction>(allInventoryTransactionList, inventoryTransactionList); //按出库明细创建ASN明细 inProcessLocationDetailMgrE.CreateInProcessLocationDetail(inProcessLocation, orderLocationTransaction, inventoryTransactionList); //销售退货报验, 是否检验 if (orderDetail.NeedInspection && orderHead.NeedInspection && orderHead.Type == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_DISTRIBUTION && orderHead.SubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_RTN) { foreach (InventoryTransaction inventoryTransaction in inventoryTransactionList) { if (inventoryTransaction.Qty > 0) { if (inventoryTransaction.Location.Code != BusinessConstants.SYSTEM_LOCATION_REJECT) { LocationLotDetail locationLotDetail = this.locationLotDetailMgrE.LoadLocationLotDetail(inventoryTransaction.LocationLotDetailId); locationLotDetail.CurrentInspectQty = inventoryTransaction.Qty; inspectLocationLotDetailList.Add(locationLotDetail); } } } } #endregion } else { #region 没有来源库位 //根据发货明细创建ASN明细 inProcessLocationDetail.InProcessLocation = inProcessLocation; this.inProcessLocationDetailMgrE.CreateInProcessLocationDetail(inProcessLocationDetail); inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); #endregion } #endregion } } #region 检验 if (inspectLocationLotDetailList.Count > 0) { //对于没有Hu的,如果收货时已经回冲了负数库存,也就是库存数量和待检验数量不一致可能会有问题 this.inspectOrderMgrE.CreateInspectOrder(inspectLocationLotDetailList, user); } #endregion } else { #region 为差异建立明细 foreach (InProcessLocationDetail inProcessLocationDetail in targetInProcessLocationDetailList) { inProcessLocationDetail.InProcessLocation = inProcessLocation; this.inProcessLocationDetailMgrE.CreateInProcessLocationDetail(inProcessLocationDetail); inProcessLocation.AddInProcessLocationDetail(inProcessLocationDetail); } #endregion } #endregion } #region 检验发货FIFO,暂时不考虑拣货单占用库存 if (isGoodsReceiveFIFO.HasValue && isGoodsReceiveFIFO.Value && allInventoryTransactionList.Count > 0) { //allInventoryTransactionList var query = from a in allInventoryTransactionList where a.Hu != null group a by new { LocationCode = a.Location.Code, ItemCode = a.Item.Code } into g select new { LocationCode = g.Key.LocationCode, ItemCode = g.Key.ItemCode, list = g.ToList() }; if (query != null && query.Count() > 0) { foreach (var q in query) { InventoryTransaction inventoryTransaction = q.list.OrderByDescending(i => i.Hu.ManufactureDate).FirstOrDefault(); IList<string> huIdList = q.list.Where(i => i.Hu.ManufactureDate < inventoryTransaction.Hu.ManufactureDate).Select(i => i.Hu.HuId).ToList(); if (!this.locationLotDetailMgrE.CheckGoodsIssueFIFO(inventoryTransaction.Location.Code, inventoryTransaction.Item.Code, inventoryTransaction.Hu.ManufactureDate, huIdList)) { throw new BusinessErrorException("MasterData.InventoryOut.LotNoIsOld", inventoryTransaction.Item.Code, inventoryTransaction.Hu.HuId, inventoryTransaction.Hu.LotNo, inventoryTransaction.Location.Code); } } } } #endregion #region 创建ASN追踪 if (orderType != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && routing != null) { IList<InProcessLocationTrack> inProcessLocationTrackList = this.inProcessLocationTrackMgrE.CreateIInProcessLocationTrack(inProcessLocation, routing); #region 设置默认进入第一个Activity if (inProcessLocationTrackList != null && inProcessLocationTrackList.Count > 0) { IListHelper.Sort<InProcessLocationTrack>(inProcessLocationTrackList, "Operation"); inProcessLocation.CurrentOperation = inProcessLocationTrackList[0].Operation; inProcessLocation.CurrentActivity = inProcessLocationTrackList[0].Activity; this.UpdateInProcessLocation(inProcessLocation); } #endregion } #endregion }