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 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 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, 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"); } }
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"); } }