示例#1
0
        public void AddMaterialFlushBack(MaterialFlushBack materialFlushBack)
        {
            if (this._materialFlushBack == null)
            {
                this._materialFlushBack = new List <MaterialFlushBack>();
            }

            this._materialFlushBack.Add(materialFlushBack);
        }
示例#2
0
        public IList <MaterialFlushBack> AssignMaterialFlushBack(MaterialFlushBack sourceMaterialFlushBack, IList <OrderDetail> orderDetailList)
        {
            if (orderDetailList != null && orderDetailList.Count > 0)
            {
                IList <OrderLocationTransaction> targetInOrderLocationTransactionList = new List <OrderLocationTransaction>();

                foreach (OrderDetail orderDetail in orderDetailList)
                {
                    IList <OrderLocationTransaction> inOrderLocationTransactionList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN);

                    //入库(in)的OrderLocationTransaction只可能有一个
                    inOrderLocationTransactionList[0].CurrentReceiveQty = orderDetail.CurrentReceiveQty;
                    inOrderLocationTransactionList[0].CurrentRejectQty  = orderDetail.CurrentRejectQty;
                    inOrderLocationTransactionList[0].CurrentScrapQty   = orderDetail.CurrentScrapQty;

                    targetInOrderLocationTransactionList.Add(inOrderLocationTransactionList[0]);
                }

                return(AssignMaterialFlushBack(sourceMaterialFlushBack, targetInOrderLocationTransactionList));
            }

            return(null);
        }
        private Receipt BuildReceipt(OrderLocationTransaction orderLocationTransaction, IList <DssImportHistory> dssImportHistoryList)
        {
            if (orderLocationTransaction == null || dssImportHistoryList == null || dssImportHistoryList.Count == 0)
            {
                return(null);
            }

            Receipt receipt = new Receipt();
            IList <OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderLocationTransaction.OrderDetail.Id, BusinessConstants.IO_TYPE_OUT);

            foreach (var dssImportHistory in dssImportHistoryList)
            {
                ReceiptDetail receiptDetail = new ReceiptDetail();
                receiptDetail.Receipt = receipt;
                receiptDetail.OrderLocationTransaction = orderLocationTransaction;
                receiptDetail.HuId        = dssImportHistory.HuId;
                receiptDetail.ReceivedQty = dssImportHistory.Qty;

                #region 找Out的OrderLocTrans,填充MaterialFlushBack
                foreach (OrderLocationTransaction orderLocTrans in orderLocTransList)
                {
                    MaterialFlushBack material = new MaterialFlushBack();
                    material.OrderLocationTransaction = orderLocTrans;
                    if (orderLocTrans.UnitQty != 0)
                    {
                        material.Qty = dssImportHistory.Qty;
                    }
                    receiptDetail.AddMaterialFlushBack(material);
                }
                #endregion

                receipt.AddReceiptDetail(receiptDetail);
            }

            return(receipt);
        }
        public virtual void ProcessSingleFile(string inboundDirectoryName, string inboundFileName)
        {
            log.Info("Start inbound file " + inboundFileName);
            FlatFileReader reader = new FlatFileReader(inboundFileName, Encoding.ASCII, "\t");

            try
            {
                OrderHead   orderHead   = null;
                OrderDetail orderDetail = null;
                string      shiftCode   = string.Empty;
                Hu          hu          = null;

                string[] fields = reader.ReadLine();
                while (fields != null)
                {
                    string  prodLine     = fields[0];
                    string  itemCode     = fields[1];
                    string  huId         = fields[2];
                    decimal qty          = decimal.Parse(fields[3]);
                    string  itemHuId     = fields[4];
                    string  onlineDate   = fields[5];
                    string  onlineTime   = fields[6];
                    string  offlineDate  = fields[7];
                    string  offlineTime  = fields[8];
                    string  customerCode = fields[9];
                    string  customerLoc  = fields[10];

                    if (orderHead == null)
                    {
                        #region 查找工单
                        shiftCode = BarcodeHelper.GetShiftCode(huId);

                        DetachedCriteria criteria = DetachedCriteria.For <OrderHead>();
                        criteria.CreateAlias("Flow", "f");
                        //criteria.CreateAlias("Shift", "s");

                        criteria.Add(Expression.Like("f.Code", prodLine, MatchMode.End));
                        criteria.Add(Expression.Eq("s.Code", shiftCode));
                        criteria.Add(Expression.Eq("Status", BusinessConstants.CODE_MASTER_STATUS_VALUE_INPROCESS));

                        criteria.AddOrder(Order.Asc("StartTime"));

                        IList <OrderHead> orderHeadList = this.criteriaMgr.FindAll <OrderHead>(criteria);
                        #endregion

                        if (orderHeadList != null && orderHeadList.Count > 0)
                        {
                            foreach (OrderHead targetOrderHead in orderHeadList)
                            {
                                orderHead = targetOrderHead;

                                #region 查找工单明细
                                IList <OrderDetail> orderDetailList = orderHead.OrderDetails;
                                foreach (OrderDetail targetOrderDetail in orderDetailList)
                                {
                                    if (targetOrderDetail.Item.Code == itemCode)
                                    {
                                        log.Info("Find match wo " + orderHead.OrderNo);
                                        orderDetail = targetOrderDetail;
                                        orderDetail.CurrentReceiveQty = qty;
                                        break;
                                    }
                                }
                                #endregion

                                if (orderDetail != null)
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            throw new BusinessErrorException("No active wo find for prodline + " + prodLine + ", shift " + shiftCode);
                        }

                        if (orderDetail != null)
                        {
                            #region 创建外包装条码
                            if (this.huMgr.LoadHu(huId) == null)
                            {
                                log.Info("Insert hu " + huId + " into database.");
                                hu = ResolveAndCreateHu(huId, orderDetail, qty);
                                orderDetail.HuId = hu.HuId;

                                Receipt       receipt       = new Receipt();
                                ReceiptDetail receiptDetail = new ReceiptDetail();
                                receiptDetail.OrderLocationTransaction = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_IN)[0];
                                receiptDetail.HuId        = hu.HuId;
                                receiptDetail.ReceivedQty = qty;
                                receiptDetail.Receipt     = receipt;
                                receiptDetail.LotNo       = hu.LotNo;

                                #region 找Out的OrderLocTrans,填充MaterialFulshBack
                                IList <OrderLocationTransaction> orderLocTransList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(orderDetail.Id, BusinessConstants.IO_TYPE_OUT);
                                foreach (OrderLocationTransaction orderLocTrans in orderLocTransList)
                                {
                                    MaterialFlushBack material = new MaterialFlushBack();
                                    material.OrderLocationTransaction = orderLocTrans;
                                    if (orderLocTrans.UnitQty != 0)
                                    {
                                        material.Qty = qty;
                                    }
                                    receiptDetail.AddMaterialFlushBack(material);
                                }
                                #endregion
                                receipt.AddReceiptDetail(receiptDetail);

                                this.orderManager.ReceiveOrder(receipt, this.userMgr.GetMonitorUser());
                            }
                            else
                            {
                                throw new BusinessErrorException("Hu " + huId + " already exist in database.");
                            }
                            #endregion
                        }
                        else
                        {
                            throw new BusinessErrorException("No item found for item code " + itemCode + " for prodline + " + prodLine + ", shift " + shiftCode);
                        }
                    }

                    #region 创建内包装条码
                    if (this.huMgr.LoadHu(itemHuId) == null)
                    {
                        log.Info("Insert hu " + itemHuId + " into database.");
                        CreateItemHu(itemHuId, orderDetail, hu.LotNo, hu.ManufactureDate);
                    }
                    else
                    {
                        throw new BusinessErrorException("Hu " + itemHuId + " already exist in database.");
                    }
                    #endregion

                    fields = reader.ReadLine();
                }
            }
            finally
            {
                reader.Dispose();
            }
        }
    private void ReceiveRender(object sender, EventArgs e)
    {
        bool isOddCreateHu = (bool)sender;

        IList <ReceiptDetail> receiptDetailList = this.ucDetailList.PopulateReceiptDetailList();
        bool isReceiptOneItem = bool.Parse(TheEntityPreferenceMgr.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_IS_RECEIPT_ONE_ITEM).Value);

        if (this.ModuleType == BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION && this.ModuleSubType == BusinessConstants.CODE_MASTER_ORDER_SUB_TYPE_VALUE_ADJ && isReceiptOneItem && receiptDetailList.Count > 1)
        {
            ShowErrorMessage("MasterData.Receipt.One.Item");
            return;
        }
        IList <OrderLocationTransaction> inLocTransList = new List <OrderLocationTransaction>();

        foreach (ReceiptDetail receiptDetail in receiptDetailList)
        {
            OrderLocationTransaction ol = receiptDetail.OrderLocationTransaction;
            ol.CurrentReceiveQty = ol.UnitQty * (receiptDetail.ReceivedQty.HasValue ? (decimal)receiptDetail.ReceivedQty : 0);
            ol.CurrentRejectQty  = ol.UnitQty * (receiptDetail.RejectedQty.HasValue ? (decimal)receiptDetail.RejectedQty : 0);
            ol.CurrentScrapQty   = ol.UnitQty * (receiptDetail.ScrapQty.HasValue ? (decimal)receiptDetail.ScrapQty : 0);
            inLocTransList.Add(ol);
        }

        IList <OrderLocationTransaction> orderLocTransList = this.ucInLocTransList.InLocTransList;  //投入原材料List
        IList <OrderLocationTransaction> outLocTransList   = new List <OrderLocationTransaction>(); //非零原材料List
        IList <OrderLocationTransaction> rwoLocTransList   = new List <OrderLocationTransaction>(); //返工成品List


        foreach (OrderLocationTransaction inLocTrans in this.ucInLocTransList.InLocTransList)
        {
            if (inLocTrans.BomDetail == null)
            {
                rwoLocTransList.Add(inLocTrans);
            }
            else if (inLocTrans.CurrentReceiveQty != 0)
            {
                outLocTransList.Add(inLocTrans);
            }
        }

        try
        {
            #region 正常生产收货
            if (outLocTransList.Count > 0)
            {
                foreach (ReceiptDetail receiptDetail in receiptDetailList)
                {
                    foreach (OrderLocationTransaction orderLocationTransaction in outLocTransList)
                    {
                        MaterialFlushBack materialFlushBack = new MaterialFlushBack();
                        materialFlushBack.RawMaterial = orderLocationTransaction.Item;
                        materialFlushBack.Uom         = orderLocationTransaction.OrderDetail.Uom;
                        materialFlushBack.Operation   = orderLocationTransaction.Operation;
                        materialFlushBack.Qty         = orderLocationTransaction.CurrentReceiveQty;
                        IList <MaterialFlushBack> materialFlushBackList = TheMaterialFlushBackMgr.AssignMaterialFlushBack(materialFlushBack, inLocTransList);
                        foreach (MaterialFlushBack m in materialFlushBackList)
                        {
                            if (m.OrderLocationTransaction.OrderDetail.Id == receiptDetail.OrderLocationTransaction.OrderDetail.Id)
                            {
                                if (m.OrderLocationTransaction.UnitQty != 0)
                                {
                                    m.Qty = m.Qty / m.OrderLocationTransaction.UnitQty;
                                }
                                materialFlushBack = m;
                                receiptDetail.AddMaterialFlushBack(materialFlushBack);
                                break;
                            }
                        }
                    }
                }
            }
            #endregion


            #region 新品收货
            if (this.IsNewItem)
            {
                IList <TransformerDetail> transformerDetailList = this.ucNewItemInLocTransList.NewItemInLocTransList; //新品原材料List
                if (transformerDetailList.Count > 0)
                {
                    foreach (ReceiptDetail receiptDetail in receiptDetailList)
                    {
                        foreach (TransformerDetail transformerDetail in transformerDetailList)
                        {
                            MaterialFlushBack materialFlushBack        = new MaterialFlushBack();
                            LocationLotDetail newItemLocationLotDetail = TheLocationLotDetailMgr.LoadLocationLotDetail(transformerDetail.LocationLotDetId);
                            materialFlushBack.RawMaterial = newItemLocationLotDetail.Item;
                            materialFlushBack.Uom         = newItemLocationLotDetail.Hu.Uom;
                            materialFlushBack.Qty         = newItemLocationLotDetail.Qty;
                            materialFlushBack.HuId        = newItemLocationLotDetail.Hu.HuId;

                            IList <MaterialFlushBack> materialFlushBackList = TheMaterialFlushBackMgr.AssignMaterialFlushBack(materialFlushBack, inLocTransList);
                            foreach (MaterialFlushBack m in materialFlushBackList)
                            {
                                if (m.OrderLocationTransaction.OrderDetail.Id == receiptDetail.OrderLocationTransaction.OrderDetail.Id)
                                {
                                    if (m.OrderLocationTransaction.UnitQty != 0)
                                    {
                                        m.Qty = m.Qty / m.OrderLocationTransaction.UnitQty;
                                    }
                                    materialFlushBack = m;
                                    receiptDetail.AddMaterialFlushBack(materialFlushBack);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            #endregion

            #region 返工收货
            if (rwoLocTransList.Count > 0)
            {
                foreach (OrderLocationTransaction rwoOrderLocTran in rwoLocTransList)
                {
                    foreach (ReceiptDetail receiptDetail in receiptDetailList)
                    {
                        if (receiptDetail.OrderLocationTransaction.Item.Code == rwoOrderLocTran.Item.Code)
                        {
                            MaterialFlushBack materialFlushBack = new MaterialFlushBack();
                            materialFlushBack.RawMaterial = rwoOrderLocTran.Item;
                            materialFlushBack.Uom         = rwoOrderLocTran.OrderDetail.Uom;
                            materialFlushBack.Operation   = rwoOrderLocTran.Operation;
                            materialFlushBack.Qty         = rwoOrderLocTran.CurrentReceiveQty;
                            IList <MaterialFlushBack> materialFlushBackList = TheMaterialFlushBackMgr.AssignMaterialFlushBack(materialFlushBack, inLocTransList);
                            foreach (MaterialFlushBack m in materialFlushBackList)
                            {
                                if (m.OrderLocationTransaction.OrderDetail.Id == receiptDetail.OrderLocationTransaction.OrderDetail.Id)
                                {
                                    if (m.OrderLocationTransaction.UnitQty != 0)
                                    {
                                        m.Qty = m.Qty / m.OrderLocationTransaction.UnitQty;
                                    }
                                    materialFlushBack = m;
                                    receiptDetail.AddMaterialFlushBack(materialFlushBack);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            #endregion


            Receipt   receipt   = TheOrderMgr.ReceiveOrder(receiptDetailList, this.CurrentUser, null, null, null, true, isOddCreateHu);
            OrderHead orderHead = TheOrderHeadMgr.LoadOrderHead(this.OrderNo);

            if (RefreshListEvent != null)
            {
                this.RefreshListEvent(new object[] { receipt.ReceiptNo, orderHead.NeedPrintReceipt }, e);
            }
        }
        catch (BusinessErrorException ex)
        {
            this.ShowErrorMessage(ex);
        }
    }
示例#6
0
        public IList <MaterialFlushBack> AssignMaterialFlushBack(MaterialFlushBack sourceMaterialFlushBack, IList <OrderLocationTransaction> inOrderLocationTransactionList)
        {
            Hu hu = null;

            if (sourceMaterialFlushBack.HuId != null && sourceMaterialFlushBack.HuId.Trim() != string.Empty)
            {
                hu = this.huMgr.CheckAndLoadHu(sourceMaterialFlushBack.HuId);
            }

            IList <MaterialFlushBack> materialFlushBackList = new List <MaterialFlushBack>();
            decimal theoryTotalQty = 0;  //理论消耗量

            if (inOrderLocationTransactionList != null && inOrderLocationTransactionList.Count > 0)
            {
                foreach (OrderLocationTransaction inOrderLocationTransaction in inOrderLocationTransactionList)
                {
                    IList <OrderLocationTransaction> orderLocationTransactionList = this.orderLocationTransactionMgr.GetOrderLocationTransaction(inOrderLocationTransaction.OrderDetail.Id, BusinessConstants.IO_TYPE_OUT);
                    if (orderLocationTransactionList != null && orderLocationTransactionList.Count > 0)
                    {
                        foreach (OrderLocationTransaction orderLocationTransaction in orderLocationTransactionList)
                        {
                            if (orderLocationTransaction.Item.Code == sourceMaterialFlushBack.RawMaterial.Code)
                            {
                                if (sourceMaterialFlushBack.Operation == 0 ||
                                    orderLocationTransaction.Operation == sourceMaterialFlushBack.Operation)
                                {
                                    if ((hu == null) ||                                                                                                                //按数量分配
                                        (hu != null && (hu.Version == null || hu.Version.Trim() == string.Empty)) || //按条码分配
                                        (hu != null && hu.Version != null && hu.Version.Trim() != string.Empty && hu.Version == orderLocationTransaction.ItemVersion)) //按条码和工程状态分配
                                    {
                                        MaterialFlushBack materialFlushBack = new MaterialFlushBack();
                                        materialFlushBack.OrderDetail = inOrderLocationTransaction.OrderDetail;
                                        materialFlushBack.OrderLocationTransaction = orderLocationTransaction;
                                        materialFlushBack.Operation   = orderLocationTransaction.Operation;
                                        materialFlushBack.RawMaterial = orderLocationTransaction.Item;
                                        materialFlushBack.Uom         = orderLocationTransaction.OrderDetail.Uom;
                                        materialFlushBack.HuId        = sourceMaterialFlushBack.HuId;
                                        if (inOrderLocationTransaction.OrderDetail.OrderHead.Type != BusinessConstants.CODE_MASTER_ORDER_TYPE_VALUE_PRODUCTION)
                                        {
                                            materialFlushBack.Qty = inOrderLocationTransaction.CurrentReceiveQty * orderLocationTransaction.UnitQty;
                                        }
                                        else
                                        {
                                            //生产,废品和次品都消耗原材料
                                            materialFlushBack.Qty =
                                                (inOrderLocationTransaction.CurrentReceiveQty + inOrderLocationTransaction.CurrentRejectQty + inOrderLocationTransaction.CurrentScrapQty)
                                                * orderLocationTransaction.UnitQty;
                                        }
                                        theoryTotalQty += materialFlushBack.Qty;

                                        materialFlushBackList.Add(materialFlushBack);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            int FlushBackListCount = materialFlushBackList.Count;

            if (FlushBackListCount == 0)
            {
                throw new BusinessErrorException("Order.Error.ReceiveOrder.AssignMaterial", sourceMaterialFlushBack.RawMaterial.Code);
            }

            EntityPreference entityPreference = entityPreferenceMgr.LoadEntityPreference(BusinessConstants.ENTITY_PREFERENCE_CODE_AMOUNT_DECIMAL_LENGTH);
            int decimalLength = int.Parse(entityPreference.Value);

            decimal remainFlushBack = sourceMaterialFlushBack.Qty;

            for (int i = 0; i < FlushBackListCount; i++)
            {
                //分配的消耗量等于实际的总消耗量 / 理论总消耗量 * 单个物料的消耗量,最后一条用减法处理
                if (i < FlushBackListCount - 1)
                {
                    materialFlushBackList[i].Qty = Math.Round(sourceMaterialFlushBack.Qty / theoryTotalQty * materialFlushBackList[i].Qty, decimalLength, MidpointRounding.AwayFromZero);;
                    remainFlushBack = remainFlushBack - materialFlushBackList[i].Qty;
                }
                else
                {
                    materialFlushBackList[i].Qty = remainFlushBack;
                }
            }
            //foreach(MaterialFlushBack materialFlushBack in materialFlushBackList)
            //{



            //    materialFlushBack.Qty = sourceMaterialFlushBack.Qty / theoryTotalQty * materialFlushBack.Qty;
            //}

            return(materialFlushBackList);
        }