public void FeedKitOrder(string orderNo, string kitOrderNo, bool isForceFeed, DateTime effectiveDate)
        {
            #region 查询订单
            IList<OrderMaster> orderMasterList = this.genericMgr.FindAll<OrderMaster>("from OrderMaster where OrderNo in (?, ?)",
                new object[] { orderNo, kitOrderNo });
            #endregion

            #region 检查
            OrderMaster productOrder = orderMasterList.Where(o => o.OrderNo == orderNo).Single();
            OrderMaster kitOrder = orderMasterList.Where(o => o.OrderNo == kitOrderNo).Single();

            if (productOrder.Type != CodeMaster.OrderType.Production
                || productOrder.Type == CodeMaster.OrderType.SubContract)
            {
                throw new TechnicalException("ProductOrder type is not correct.");
            }

            if (kitOrder.OrderStrategy != CodeMaster.FlowStrategy.KIT)
            {
                throw new TechnicalException("KitOrder strategy is not correct.");
            }

            if (productOrder.Status != CodeMaster.OrderStatus.InProcess
                && productOrder.Status != CodeMaster.OrderStatus.Complete)
            {
                throw new BusinessException("生产单{0}的状态为{1},不能投料。", productOrder.OrderNo,
                    systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.OrderStatus, ((int)productOrder.Status).ToString()));
            }

            if (kitOrder.Status != CodeMaster.OrderStatus.Close
                && kitOrder.Status != CodeMaster.OrderStatus.Complete)
            {
                throw new BusinessException("KIT单{0}没有收货,不能投料。", kitOrder.OrderNo);
            }

            if (!isForceFeed && productOrder.TraceCode != kitOrder.TraceCode)
            {
                throw new BusinessException("KIT单{0}的VAN号{1}和生产单的VAN号{2}不一致。", kitOrder.OrderNo, kitOrder.TraceCode, productOrder.TraceCode);
            }

            #region 查询Kit单是否已经投料
            if (this.genericMgr.FindAll<long>("select count(*) as counter from ProductFeed where FeedOrder = ?", kitOrder.OrderNo)[0] > 0)
            {
                throw new BusinessException("KIT单{0}已经投料。", kitOrder.OrderNo);
            }
            #endregion
            #endregion

            #region 根据工位找工序
            OrderOperation orderOperation = this.genericMgr.FindAll<OrderOperation>("from OrderOperation where OrderNo = ? and OpReference = ?",
                new object[] { productOrder.OrderNo, kitOrder.LocationTo }).FirstOrDefault();
            #endregion

            #region 查询Kit收货单明细
            //循环查找kit单的绑定订单,要全部投料至生产线上。
            IList<string> childKitOrderNoList = NestGetChildKitOrderNo(kitOrder.OrderNo);
            string selectKitReceiptStatement = NativeSqlStatement.SELECT_KIT_RECEIPT_STATEMENT;
            IList<object> selectKitReceiptParm = new List<object>();
            selectKitReceiptParm.Add(kitOrder.OrderNo);
            if (childKitOrderNoList != null && childKitOrderNoList.Count > 0)
            {
                foreach (string childKitOrderNo in childKitOrderNoList)
                {
                    selectKitReceiptStatement += ",?";
                    selectKitReceiptParm.Add(childKitOrderNo);
                }
            }
            selectKitReceiptStatement += ")";
            IList<ReceiptLocationDetail> receiptLocationDetailList = this.genericMgr.FindEntityWithNativeSql<ReceiptLocationDetail>(selectKitReceiptStatement, selectKitReceiptParm.ToArray());
            IList<Item> itemList = this.itemMgr.GetItems(receiptLocationDetailList.Select(det => det.Item).Distinct().ToList());
            //查找订单明细,需要取Kit单的预留号、行号、SAP生产单号、批号、移动类型
            IList<OrderDetail> orderDetailList = this.LoadOrderDetails(receiptLocationDetailList.Select(r => r.OrderDetailId.Value).Distinct().ToArray());

            IList<FeedInput> feedInputList = (from det in receiptLocationDetailList
                                              group det by new
                                              {
                                                  Item = det.Item,
                                                  QualityType = det.QualityType,
                                                  HuId = det.HuId,
                                                  ReserveNo = orderDetailList.Where(od => od.Id == det.OrderDetailId).Single().ReserveNo,
                                                  ReserveLine = orderDetailList.Where(od => od.Id == det.OrderDetailId).Single().ReserveLine,
                                                  AUFNR = orderDetailList.Where(od => od.Id == det.OrderDetailId).Single().AUFNR,
                                                  ICHARG = orderDetailList.Where(od => od.Id == det.OrderDetailId).Single().ICHARG,
                                                  BWART = orderDetailList.Where(od => od.Id == det.OrderDetailId).Single().BWART,
                                              } into result
                                              select new FeedInput
                                              {
                                                  Item = result.Key.Item,
                                                  QualityType = result.Key.QualityType,
                                                  HuId = result.Key.HuId,
                                                  LocationFrom = kitOrder.LocationTo,  //投料的扣料库位为Kit单的目的库位
                                                  Uom = itemList.Where(i => i.Code == result.Key.Item).Single().Uom,
                                                  ReserveNo = result.Key.ReserveNo,
                                                  ReserveLine = result.Key.ReserveLine,
                                                  AUFNR = result.Key.AUFNR,
                                                  ICHARG = result.Key.ICHARG,
                                                  BWART = result.Key.BWART,
                                                  Qty = result.Sum(det => det.Qty)
                                              }).ToList();

            #region FeedInput的ITEM赋基本单位
            SetUom4FeedInput(feedInputList);
            #endregion
            #endregion

            #region 记录Kit单投料
            ProductFeed productFeed = new ProductFeed();
            productFeed.TraceCode = productOrder.TraceCode;
            productFeed.FeedOrder = kitOrderNo;
            productFeed.ProductOrder = orderNo;

            this.genericMgr.Create(productFeed);
            #endregion

            #region 投料
            FeedRawMaterial(orderNo, feedInputList, true, effectiveDate);
            #endregion
        }
示例#2
0
        public void KitOrderOffline(IList<OrderDetail> orderDetailList, IList<string> feedKitOrderNoList, bool isForceFeed, DateTime effectiveDate)
        {
            #region 获取下线Kit单号
            if (orderDetailList.Select(det => det.OrderNo).Distinct().Count() > 1)
            {
                throw new BusinessException("分装生产单不能合并下线。");
            }
            string kitOrderNo = orderDetailList.Select(det => det.OrderNo).Distinct().Single();
            #endregion

            #region 查询Kit单和投料的Kit单
            List<string> orderNoList = new List<string>();
            orderNoList.Add(kitOrderNo);
            if (feedKitOrderNoList != null && feedKitOrderNoList.Count > 0)
            {
                orderNoList.AddRange(feedKitOrderNoList);
            }
            IList<OrderMaster> orderMasterList = this.LoadOrderMasters(orderNoList.ToArray());
            #endregion

            #region 检查
            OrderMaster kitOrder = orderMasterList.Where(o => o.OrderNo == kitOrderNo).Single();
            IList<OrderMaster> feedKitOrderList = orderMasterList.Where(o => o.OrderNo != kitOrderNo).ToList();

            if (kitOrder.OrderStrategy != CodeMaster.FlowStrategy.KIT)
            {
                throw new BusinessException("订单{0}的类型不是分装生产单。", kitOrder.OrderNo);
            }

            if (kitOrder.Status != CodeMaster.OrderStatus.Submit
                && kitOrder.Status != CodeMaster.OrderStatus.InProcess)
            {
                throw new BusinessException("分装生产单{0}的状态为{1}不能下线。", kitOrder.OrderNo,
                    systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.OrderStatus, ((int)kitOrder.Status).ToString()));
            }

            if (feedKitOrderList != null && feedKitOrderList.Count > 0)
            {
                foreach (OrderMaster feedKitOrder in feedKitOrderList)
                {
                    if (feedKitOrder.OrderStrategy != CodeMaster.FlowStrategy.KIT)
                    {
                        throw new TechnicalException("Childe KitOrder strategy is not correct.");
                    }

                    if (feedKitOrder.Status != CodeMaster.OrderStatus.Close)
                    {
                        throw new BusinessException("子生产单{0}没有收货,不能投料。", feedKitOrder.OrderNo);
                    }

                    if (!isForceFeed && feedKitOrder.TraceCode != feedKitOrder.TraceCode)
                    {
                        throw new BusinessException("子生产单{0}的VAN号{1}和分装生产单的VAN号{2}不一致。", feedKitOrder.OrderNo, feedKitOrder.TraceCode, kitOrder.TraceCode);
                    }

                    if (this.genericMgr.FindAll<long>("select count(*) as counter from ProductFeed where FeedOrder = ?", feedKitOrder.OrderNo)[0] > 0)
                    {
                        throw new BusinessException("子生产单{0}已经投料。", feedKitOrder.OrderNo);
                    }
                }
            }
            #endregion

            #region 记录Kit单投料
            if (feedKitOrderList != null && feedKitOrderList.Count > 0)
            {
                foreach (OrderMaster feedKitOrder in feedKitOrderList)
                {
                    ProductFeed productFeed = new ProductFeed();
                    productFeed.TraceCode = feedKitOrder.TraceCode;
                    productFeed.FeedOrder = feedKitOrder.OrderNo;
                    productFeed.ProductOrder = kitOrderNo;

                    this.genericMgr.Create(productFeed);
                }
            }
            #endregion

            #region Kit收货
            this.ReceiveOrder(orderDetailList, effectiveDate);
            #endregion
        }
        public void FeedProductOrder(string orderNo, string feedOrderNo, bool isForceFeed, DateTime effectiveDate)
        {
            #region 查询订单
            IList<OrderMaster> orderMasterList = this.genericMgr.FindAll<OrderMaster>("from OrderMaster where OrderNo in (?, ?)",
                new object[] { orderNo, feedOrderNo });

            #endregion

            #region 检查
            OrderMaster productOrder = orderMasterList.Where(o => o.OrderNo == orderNo).Single();
            OrderMaster feedProductOrder = orderMasterList.Where(o => o.OrderNo == feedOrderNo).Single();

            if (productOrder.Type != CodeMaster.OrderType.Production
                || productOrder.Type == CodeMaster.OrderType.SubContract)
            {
                throw new TechnicalException("ProductOrder type is not correct.");
            }

            if (feedProductOrder.Type != CodeMaster.OrderType.Production
                || feedProductOrder.Type == CodeMaster.OrderType.SubContract)
            {
                throw new TechnicalException("FeedProductOrder type is not correct.");
            }

            if (productOrder.Status != CodeMaster.OrderStatus.InProcess
                && productOrder.Status != CodeMaster.OrderStatus.Complete)
            {
                throw new BusinessException("父生产单{0}的状态为{1},不能投料。", productOrder.OrderNo,
                    systemMgr.GetCodeDetailDescription(com.Sconit.CodeMaster.CodeMaster.OrderStatus, ((int)productOrder.Status).ToString()));
            }

            if (feedProductOrder.Status != CodeMaster.OrderStatus.Complete && feedProductOrder.Status != CodeMaster.OrderStatus.Close)
            {
                throw new BusinessException("子生产单{0}没有完工,不能投料。", feedProductOrder.OrderNo);
            }

            if (!isForceFeed && productOrder.TraceCode != feedProductOrder.TraceCode)
            {
                throw new BusinessException("子生产单{0}的VAN号{1}和父生产单的VAN号{2}不一致。", feedProductOrder.OrderNo, feedProductOrder.TraceCode, productOrder.TraceCode);
            }

            #region 查询生产单是否已经投料
            if (this.genericMgr.FindAll<long>("select count(*) as counter from ProductFeed where FeedOrder = ?", feedProductOrder.OrderNo)[0] > 0)
            {
                throw new BusinessException("子生产单{0}已经投料。", feedProductOrder.OrderNo);
            }
            #endregion
            #endregion

            #region 根据工位找工序
            OrderOperation orderOperation = this.genericMgr.FindAll<OrderOperation>("from OrderOperation where OrderNo = ? and OpReference = ?",
                new object[] { productOrder.OrderNo, feedProductOrder.LocationTo }).FirstOrDefault();
            #endregion

            #region 查找投料工单的收货记录
            string selectFeedOrderReceiptStatement = "from ReceiptLocationDetail where OrderDetailId in (select Id from OrderDetail where OrderNo = ?))";
            IList<ReceiptLocationDetail> receiptLocationDetailList = this.genericMgr.FindAll<ReceiptLocationDetail>(selectFeedOrderReceiptStatement, feedProductOrder.OrderNo);
            IList<Item> itemList = this.itemMgr.GetItems(receiptLocationDetailList.Select(det => det.Item).Distinct().ToList());

            IList<FeedInput> feedInputList = (from det in receiptLocationDetailList
                                              group det by new { Item = det.Item, QualityType = det.QualityType, HuId = det.HuId } into result
                                              select new FeedInput
                                              {
                                                  Item = result.Key.Item,
                                                  QualityType = result.Key.QualityType,
                                                  HuId = result.Key.HuId,
                                                  LocationFrom = feedProductOrder.LocationTo,  //投料的扣料库位为Kit单的目的库位
                                                  Uom = itemList.Where(i => i.Code == result.Key.Item).Single().Uom,
                                                  Qty = result.Sum(det => det.Qty),
                                                  NotReport = true,                         //过滤掉驾驶室和底盘总成,不需要传给SAP
                                              }).ToList();

            #region FeedInput的ITEM赋基本单位
            SetUom4FeedInput(feedInputList);
            #endregion
            #endregion

            #region 记录生产单投料
            ProductFeed productFeed = new ProductFeed();
            productFeed.TraceCode = productOrder.TraceCode;
            productFeed.FeedOrder = feedOrderNo;
            productFeed.ProductOrder = orderNo;

            this.genericMgr.Create(productFeed);
            #endregion

            #region 投料
            //投子工单一定是强制投料,因为父工单的Bom不包含子工单的成品
            FeedRawMaterial(orderNo, feedInputList, true, effectiveDate);
            #endregion
        }