public void Notify(params object[] args)
        {
            if (args == null || args.Length == 0 || !(args[0] is UFSoft.UBF.Business.EntityEvent))
            {
                return;
            }
            if (args == null || args.Length == 0 || !(args[0] is UFSoft.UBF.Business.EntityEvent))
            {
                return;
            }
            BusinessEntity.EntityKey key = ((UFSoft.UBF.Business.EntityEvent)args[0]).EntityKey;
            if (key == null)
            {
                return;
            }
            UFIDA.U9.CBO.SCM.Item.ItemMaster holder = key.GetEntity() as UFIDA.U9.CBO.SCM.Item.ItemMaster;
            if (holder == null)
            {
                return;
            }
            ItemSubTable itemSub = ItemSubTable.Finder.Find("ItemMaster=" + holder.ID + "");

            if (itemSub != null)
            {
                using (ISession session = Session.Open())
                {
                    itemSub.Remove();
                    session.Commit();
                }
            }
        }
Exemplo n.º 2
0
        private List <ShipPlanIDDTO> CreatShipPlanList(CreatShipPlan bpObj)
        {
            List <ShipPlanIDDTO> listShip = new List <ShipPlanIDDTO>();

            using (ISession session = Session.Open())
            {
                ShipPlanDetailBE.ShipPlanDetailHead shipPlan = ShipPlanDetailBE.ShipPlanDetailHead.Create();
                ShipDetailTypeBE.ShipDetailType     formType = ShipDetailTypeBE.ShipDetailType.Finder.Find("IsCreatedByPush=1");
                if (formType == null)
                {
                    throw new Exception("未设置出运明细单生单的单据类型,请设置出运明细单单据类型为“上游单据推出”");
                }
                shipPlan.DocumnetType       = formType;
                shipPlan.SourceDocumnetType = AllEnumBE.SourceTypeEnum.SoOrder;
                shipPlan.Status             = AllEnumBE.DocumnetSate.OpenState;        //单据状态
                shipPlan.ShipPlanState      = AllEnumBE.ShipPlanStateEnum.NotShipPlan; //出运状态
                shipPlan.BusinessDate       = DateTime.Now;
                //设置默认行号
                GetProfileValueProxy lineNo = new GetProfileValueProxy();
                lineNo.ProfileCode = "SysLineNo";
                PVDTOData pVTDOData = lineNo.Do();
                string    row       = pVTDOData.ProfileValue;

                //财务费率
                decimal fiFeeRate           = 0;
                GetProfileValueProxy bpObj1 = new GetProfileValueProxy();
                bpObj1.ProfileCode = "FTFIFee";
                bpObj1.ProfileOrg  = Base.Context.LoginOrg.ID;
                PVDTOData pVDTOData = bpObj1.Do();
                if (pVDTOData != null && pVDTOData.ProfileValue != null)
                {
                    fiFeeRate = decimal.Parse(pVDTOData.ProfileValue);
                }

                string docNo = "", shipplingType = "", soLine = "";
                long   customer = 0, currenty = 0;
                int    count = 1;


                foreach (SOLineIDDTO lineDto in bpObj.SOLineIDDTO)
                {
                    UFIDA.U9.SM.SO.SOLine line = SM.SO.SOLine.Finder.FindByID(lineDto.SOLine);
                    if (line == null)
                    {
                        continue;
                    }
                    //不同的客户、币种、装箱方式不允许拉式生成同一个出运明细单
                    if (count > 1)
                    {
                        if (customer != 0 && customer != line.SO.OrderBy.Customer.ID)
                        {
                            throw new Exception("销售订单" + line.SO.DocNo + "的客户与单号" + docNo + "的客户不一致,不能生成同一个出运明细单");
                        }
                        if (currenty != 0 && currenty != line.SO.TC.ID)
                        {
                            throw new Exception("销售订单" + line.SO.DocNo + "的币种与单号" + docNo + "的币种不一致,不能生成同一个出运明细单");
                        }
                        if (shipplingType != "" && shipplingType != line.DescFlexField.PubDescSeg11)
                        {
                            throw new Exception("销售订单" + line.SO.DocNo + "行号" + line.DocLineNo + "的装箱方式与单号" + docNo + "行号" + soLine + "装箱方式不一致,不能生成同一个出运明细单");
                        }
                    }
                    docNo         = line.SO.DocNo;
                    customer      = line.SO.OrderBy.Customer.ID;
                    currenty      = line.SO.TC.ID;
                    shipplingType = line.DescFlexField.PubDescSeg11;
                    soLine        = line.DocLineNo.ToString();

                    //赋值表头信息
                    shipPlan.SaleMan = line.SO.Seller;           //业务员
                    shipPlan.Client  = line.SO.OrderBy.Customer; //客户
                    if (line.SO.OrderBy.Customer != null)
                    {
                        // shipPlan.Consignee = line.SO.OrderBy.Customer.a
                        //提箱港区	地区档案	从销售订单带出,从客户带出
                        if (line.SO.OrderBy.Customer.Territory != null)
                        {
                            shipPlan.CargoPort = line.SO.OrderBy.Customer.Territory;//
                        }
                    }
                    if (line.SO.ShipToSite != null && line.SO.ShipToSite.CustomerSite != null)//收货位置
                    {
                        //shipPlan.
                    }
                    shipPlan.Department = line.SO.SaleDepartment; //部门
                    shipPlan.Currency   = line.SO.TC;             //币种
                    shipPlan.DealMode   = line.SO.BargainMode;    //成交方式
                    //贸易国别	国家\地区档案	从销售订单带出
                    //shipPlan.Country = line.SO.
                    shipPlan.Transportation = line.SO.TransMode;
                    //
                    if (line.SO.DescFlexField.PrivateDescSeg14 != "")
                    {
                        Base.Organization.Organization org = Base.Organization.Organization.FindByCode(line.SO.DescFlexField.PrivateDescSeg14);
                        if (org != null)
                        {
                            shipPlan.GetOrderOrg = org;
                        }
                        else
                        {
                            throw new Exception("销售订单" + line.SO.DocNo + "接单组织为空,不能生成出运明细单");
                        }
                    }
                    else
                    {
                        throw new Exception("销售订单" + line.SO.DocNo + "接单组织为空,不能生成出运明细单");
                    }

                    //出口口岸	港口档案	从销售订单带出
                    shipPlan.ExportPort = line.SO.ShippingPort;
                    //进港区	地区档案	从销售订单带出
                    //shipPlan.IntoPort
                    //目的口岸	港口档案	从销售订单带出
                    shipPlan.DestinationPort = line.SO.AimPort;
                    //运输方式
                    shipPlan.Transportation = line.SO.TransMode;
                    //贸易方式
                    shipPlan.TradeMode = line.SO.TradeMode;
                    //收汇天数,从销售订单公共扩展字段1带出
                    if (line.SO.OrderBy.CustomerKey.GetEntity().DescFlexField.PubDescSeg1 == "")
                    {
                        shipPlan.NumberDay = 0;
                    }
                    else
                    {
                        shipPlan.NumberDay = Convert.ToInt32(line.SO.OrderBy.CustomerKey.GetEntity().DescFlexField.PubDescSeg1);
                    }

                    //赋值表体信息
                    ShipPlanDetailBE.ShipPlanDetailLine shipLine = ShipPlanDetailBE.ShipPlanDetailLine.Create(shipPlan);
                    //包装工厂	值集值	从销售订单行带出
                    //Base.FlexField.ValueSet.DefineValue flexField = Base.FlexField.ValueSet.DefineValue.Finder.Find("Code='Z022'");
                    if (line.DescFlexField.PrivateDescSeg18 != "")
                    {
                        Base.FlexField.ValueSet.DefineValue flexField = Base.FlexField.ValueSet.DefineValue.Finder.Find("ValueSetDef.Code='Z002' and Code='" + line.DescFlexField.PrivateDescSeg18 + "'");
                        // flexField.ValueSetDef.CodeAttribute
                        shipLine.PackingHouse = flexField;
                    }

                    if (line.DescFlexField.PrivateDescSeg12 != "") //验货方式直接
                    {
                        Base.FlexField.ValueSet.DefineValue flexField = Base.FlexField.ValueSet.DefineValue.Finder.Find("ValueSetDef.Code='Z009' and Code='" + line.DescFlexField.PrivateDescSeg12 + "'");
                        shipLine.ExamineCargoMode = flexField;
                        //shipLine.ExamineCargoMode = AllEnumBE.ExamineCargoModeEnum.GetFromValue(line.DescFlexField.PrivateDescSeg12);
                    }
                    //else
                    //    shipLine.ExamineCargoMode = AllEnumBE.ExamineCargoModeEnum.Empty;
                    shipLine.RowNo     = Convert.ToInt32(row);
                    shipLine.SrcSO     = line.SO;
                    shipLine.SrcDocNo  = line.SO.DocNo;
                    shipLine.SrcLineID = line.ID;
                    shipLine.SrcLineNo = line.DocLineNo.ToString();
                    //shipLine.SrcSOKey  = line.
                    if (line.ItemInfo == null || line.ItemInfo.ItemID == null)
                    {
                        throw new Exception("销售订单" + line.SO.DocNo + "行" + line.DocLineNo + "找不见对应料品信息,不能生成出运明细单");
                    }
                    shipLine.Item       = line.ItemInfo.ItemID;
                    shipLine.Standard   = line.ItemInfo.ItemID.SPECS;
                    shipLine.NumberUom  = line.TU;
                    shipLine.Ultimately = line.FinallyPriceTC;//最终价
                    //外销价	十进制	销售订单带出
                    if (line.DescFlexField.PrivateDescSeg5 != "")
                    {
                        shipLine.ExportSales = decimal.Parse(line.DescFlexField.PrivateDescSeg5);//外销价
                    }
                    shipLine.Qty            = lineDto.ShipQty;
                    shipPlan.FinancialCost += shipPlan.FinancialCost + (shipLine.ExportSales * shipLine.Qty * fiFeeRate / 100);
                    //反写销售订单已出运数量
                    //if (line.DescFlexField.PrivateDescSeg8 != "")
                    //{
                    //    line.DescFlexField.PrivateDescSeg8 = (decimal.Parse(line.DescFlexField.PrivateDescSeg8) + lineDto.ShipQty).ToString();//反写销售订单行的已出运数量
                    //}
                    //else
                    //    line.DescFlexField.PrivateDescSeg8 = lineDto.ShipQty.ToString();

                    //验货方式销售订单行私有字段12

                    //带出料品的总箱数、内箱数、外箱数、毛重、净重、体积、长、宽、高,体积、总体积
                    //料品的字表字段
                    ItemSubTable itemsub = ItemSubTable.Finder.Find("ItemMaster=" + line.ItemInfo.ItemID.ID);
                    if (itemsub != null)
                    {
                        //string sumBoxNumber = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg3;//料品的扩展字段;箱数
                        //string inBoxNumber = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg27;//料品的扩展字段;内箱数
                        //string outerBoxNumber = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg28;//料品的扩展字段;外箱数
                        //string grossWeight = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg2;//料品的扩展字段:毛重
                        ////string netWeight = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg3;//料品的扩展字段:净重
                        //string length = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg8;//料品的扩展字段:长
                        //string weith = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg9;//料品的扩展字段:宽
                        //string hight = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg10;//料品的扩展字段:高

                        //string sumBoxNumber = itemsub.BoxNumber; ;//料品的扩展字段;箱数
                        //string inBoxNumber = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg27;//料品的扩展字段;内箱数
                        //string outerBoxNumber = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg28;//料品的扩展字段;外箱数
                        //string grossWeight = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg2;//料品的扩展字段:毛重
                        ////string netWeight = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg3;//料品的扩展字段:净重
                        //string length = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg8;//料品的扩展字段:长
                        //string weith = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg9;//料品的扩展字段:宽
                        //string hight = line.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg10;//料品的扩展字段:高

                        shipLine.SumBoxNumber   = itemsub.BoxNumber;
                        shipLine.InBoxNumber    = itemsub.InnerBoxNumber;
                        shipLine.OuterBoxNumber = itemsub.OutBoxNumber;
                        shipLine.GrossWeight    = itemsub.GrossWeight;                 //毛重
                        shipLine.NetWeight      = itemsub.NetWeight;                   //净重
                        shipLine.SumGross       = shipLine.GrossWeight * shipLine.Qty; //总毛重
                        shipLine.Length         = itemsub.BoxLong;
                        shipLine.Weith          = itemsub.BoxWidth;
                        shipLine.Higth          = itemsub.BoxHight;
                        shipLine.Bulks          = shipLine.Length * shipLine.Weith * shipLine.Higth; //体积
                        shipLine.SumBulk        = shipLine.Bulks * shipLine.Qty;                     //总体积
                    }

                    #region 产生佣金表,放到BE里生成
                    //if (line.DescFlexField.PrivateDescSeg6.ToLower() == "true")
                    //{
                    //    OrderLineBrokerage.EntityList brokerage = OrderLineBrokerage.Finder.FindAll("OrderLineID='" + line.ID + "'");
                    //    if (brokerage != null && brokerage.Count > 0)
                    //    {
                    //        OrderLineBrokerage shipLineBroke = null;
                    //        foreach (OrderLineBrokerage orderBrokerage in brokerage)
                    //        {
                    //            shipLineBroke = OrderLineBrokerage.Create();
                    //            shipLineBroke.SourceType = AllEnumBE.SourceTypeEnum.ShipPlanDoc;
                    //            shipLineBroke.ShipPlanLine = shipLine;
                    //            shipLineBroke.ShipPlanRowNo = int.Parse(row);
                    //            shipLineBroke.Client = orderBrokerage.Client;
                    //            shipLineBroke.Product = orderBrokerage.Product;
                    //            shipLineBroke.BrokerageRatio = orderBrokerage.BrokerageRatio;
                    //            shipLineBroke.Payee = orderBrokerage.Payee;
                    //            shipLineBroke.PayAmount = orderBrokerage.PayAmount;
                    //            shipLineBroke.PayCurrency = orderBrokerage.PayCurrency;
                    //            shipLineBroke.OutPayment = orderBrokerage.OutPayment;
                    //            shipLineBroke.OrderCurrency = orderBrokerage.OrderCurrency;
                    //            shipLineBroke.Rate = orderBrokerage.Rate;
                    //        }
                    //    }
                    //}
                    #endregion

                    row = (int.Parse(row) + int.Parse(pVTDOData.ProfileValue)).ToString();
                    count++;
                }
                session.Commit();
                ShipPlanIDDTO shipID = new ShipPlanIDDTO();
                shipID.DocNo    = shipPlan.DocNo;
                shipID.ShipPlan = shipPlan.ID;
                listShip.Add(shipID);
            }
            return(listShip);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 为实体Dto赋值
        /// </summary>
        /// <param name="SO">销售订单集合</param>
        /// <param name="SoLine">销售订单行集合与销售订单集合互斥</param>
        /// <param name="dotList">成本预测实体DTo</param>
        private List <CostForecastBE.CostForecastDTO> SetCostDto(List <SM.SO.SO.EntityKey> SO, List <SM.SO.SOLine.EntityKey> SoLine)
        {
            List <CostForecastBE.CostForecastDTO> dtoList = new List <CostForecastBE.CostForecastDTO>();//订单成本预测实体集合

            #region 参数声明
            CostForecastBE.CostForecastDTO dto    = null; //订单成本预测实体dto
            CostForecastBE.CostForecastDTO dtoOne = null; //成品成本预测实体dto
            //获取所需预置参数
            CalculateDtoFieldExtend.GetPresetParameter();
            #endregion

            //整单成本预测
            if (SO != null && SO.Count > 0)
            {
                //从UI得到的销售订单应该是已经按照销售订单过滤了的
                SM.SO.SO soEntity = null;
                using (ISession session = Session.Open())
                {
                    foreach (SM.SO.SO.EntityKey soKey in SO)                        //遍历销售订单集合
                    {
                        //得到对应销售订单
                        soEntity = soKey.GetEntity();
                        if (soEntity == null)
                        {
                            throw new Exception("请确认查询方式是否设置为整单成本预测");
                            //continue;
                        }
                        dto              = new CostForecastBE.CostForecastDTO();
                        dto.SONo         = soEntity;                                       //赋值销售订单
                        dto.ForecastType = AllEnumBE.CostForecastTypeEnum.AllCostForecast; //预测类型整单成本预测
                        if (soEntity.DescFlexField.PrivateDescSeg6 != "")
                        {
                            dto.OceanFreight = decimal.Parse(soEntity.DescFlexField.PrivateDescSeg6);//国际费用
                        }
                        if (soEntity.DescFlexField.PrivateDescSeg8 != "")
                        {
                            dto.OtherFee = decimal.Parse(soEntity.DescFlexField.PrivateDescSeg8);//其他国外费用
                        }
                        if (soEntity.DescFlexField.PrivateDescSeg5 != "")
                        {
                            dto.DomesticFee = decimal.Parse(soEntity.DescFlexField.PrivateDescSeg5);//国内运费
                        }
                        if (soEntity.DescFlexField.PrivateDescSeg7 != "")
                        {
                            dto.OtherDomesticFee = decimal.Parse(soEntity.DescFlexField.PrivateDescSeg7);//其他国内费用
                        }
                        #region 计算整单体积
                        decimal allVolume = 0;
                        foreach (SM.SO.SOLine soLineEntity in soEntity.SOLines)    //遍历销售订单行集合计算整单体积
                        {
                            //bool isCalculateFreight = 0;//
                            //单行的体积=单行的箱数*料品.体积
                            //单行的箱数=订单数量/料品.装箱数量
                            //判断料品的装箱数量与装箱体积是否为空
                            UFIDA.U9.Cust.GS.FT.ItemSubTableBE.ItemSubTable itemSub = UFIDA.U9.Cust.GS.FT.ItemSubTableBE.ItemSubTable.Finder.Find("ItemMaster=" + soLineEntity.ItemInfo.ItemID.ID + "");
                            //if (itemSub == null)
                            //{
                            //    throw new Exception("请录入" + soLineEntity.SO.DocNo + "行" + soLineEntity.DocLineNo + "对应料品的装箱数量");
                            //}
                            //if(itemSub.BoxNumber ==0)
                            //{
                            //    throw new Exception("请录入" + soLineEntity.SO.DocNo + "行" + soLineEntity.DocLineNo + "对应料品的装箱数量");
                            //}
                            //if (itemSub.GrossWeight == 0)
                            //{
                            //    throw new Exception("请录入" + soLineEntity.SO.DocNo + "行" + soLineEntity.DocLineNo + "对应料品的毛重");
                            //}
                            //if (itemSub.BoxLong == 0)
                            //{
                            //    throw new Exception("请录入" + soLineEntity.SO.DocNo + "行" + soLineEntity.DocLineNo + "对应料品的装箱长度");
                            //}
                            //if (itemSub.BoxWidth == 0)
                            //{
                            //    throw new Exception("请录入" + soLineEntity.SO.DocNo + "行" + soLineEntity.DocLineNo + "对应料品的装箱宽度");
                            //}
                            //if (itemSub.BoxHight == 0)
                            //{
                            //    throw new Exception("请录入" + soLineEntity.SO.DocNo + "行" + soLineEntity.DocLineNo + "对应料品的装箱高度");
                            //}
                            //decimal itemQty = decimal.Parse(soLineEntity.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg3);//料品装箱数量
                            //decimal itemRough = decimal.Parse(soLineEntity.ItemInfo.ItemIDKey.GetEntity().DescFlexField.PrivateDescSeg2);//料品毛重
                            if (itemSub != null)
                            {
                                decimal itemVolume = itemSub.BoxLong * itemSub.BoxWidth * itemSub.BoxHight;//料品体积
                                if (itemSub.BoxNumber == 0)
                                {
                                    allVolume += soLineEntity.OrderByQtyTU * itemVolume;//整单体积
                                }
                                else
                                {
                                    allVolume += (soLineEntity.OrderByQtyTU / itemSub.BoxNumber) * itemVolume;//整单体积
                                }
                            }
                        }
                        #endregion

                        #region 遍历得到销售订单行
                        string dtoDemo = "";
                        foreach (SM.SO.SOLine soLineEntity in soEntity.SOLines)    //遍历销售订单行集合
                        {
                            string dtoOneDemo = "";
                            UFIDA.U9.Cust.GS.FT.ItemSubTableBE.ItemSubTable itemSub = UFIDA.U9.Cust.GS.FT.ItemSubTableBE.ItemSubTable.Finder.Find("ItemMaster=" + soLineEntity.ItemInfo.ItemID.ID + "");
                            //计算共用值
                            decimal itemQty    = 0; //料品装箱数量
                            decimal itemRough  = 0; //料品毛重
                            decimal itemVolume = 0; //料品体积
                            if (itemSub != null)
                            {
                                itemQty    = itemSub.BoxNumber;                                     //料品装箱数量
                                itemRough  = itemSub.GrossWeight;                                   //料品毛重
                                itemVolume = itemSub.BoxLong * itemSub.BoxWidth * itemSub.BoxHight; //料品体积
                            }
                            decimal rmbCost    = 0;                                                 //工具人民币采购成本
                            decimal dollorCost = 0;                                                 //工具美元采购成本
                            decimal allFee     = 0;                                                 //成品各项费用

                            dtoOne = new CostForecastBE.CostForecastDTO();
                            dtoOne.ForecastType = AllEnumBE.CostForecastTypeEnum.OneCostForecast;     //预测类型
                            dtoOne.SONo         = soEntity;                                           //销售订单
                            dtoOne.SOLine       = soLineEntity;                                       //销售订单行
                            dtoOne.Brokerage    = CalculateDtoFieldExtend.GetBrokerage(soLineEntity); //佣金
                            dtoOne.Discount     = CalculateDtoFieldExtend.GetDiscount(soLineEntity);  //折扣
                            if (itemQty == 0 || itemRough == 0 || itemVolume == 0)
                            {
                                dtoOne.OceanFreight = 0;
                                dtoOne.DomesticFee  = 0;
                            }
                            else
                            {
                                dtoOne.OceanFreight = CalculateDtoFieldExtend.GetOceanFreight(itemQty, itemRough, itemVolume, soLineEntity);           //海运费
                                dtoOne.DomesticFee  = CalculateDtoFieldExtend.GetDomesticFee(itemQty, itemRough, itemVolume, allVolume, soLineEntity); //国内运费
                            }
                            dtoOne.OtherFee         = CalculateDtoFieldExtend.GetOtherOceanFreight(soLineEntity);                                      //其他国外费
                            dtoOne.OtherDomesticFee = CalculateDtoFieldExtend.GetOtherOceanFreight(soLineEntity);                                      //其他国内费

                            //随单BOM
                            OrderBomBE.OrderBomHead.EntityList orderBom = OrderBomBE.OrderBomHead.Finder.FindAll("OrderLine=@SOLine", new OqlParam(soLineEntity.ID));
                            dtoOne.TaxCredits        = CalculateDtoFieldExtend.GetTaxCredits(soLineEntity, orderBom);                               //退税额
                            dtoOne.ProcurementCost   = CalculateDtoFieldExtend.GetProcurementCost(soLineEntity, orderBom);                          //包装采购成本
                            dtoOne.LabourCharges     = CalculateDtoFieldExtend.GetLabourCharges(soLineEntity);                                      //包装人工费用
                            dtoOne.ProductCost       = CalculateDtoFieldExtend.GetProductCost(soLineEntity, ref rmbCost, ref dollorCost, orderBom); //产品采购成本
                            dtoOne.RMBProductCost    = rmbCost;                                                                                     //工具人民币采购成本
                            dtoOne.DollorProductCost = dollorCost;                                                                                  //工具美元采购成本
                            dtoOne.AdministrativeFee = CalculateDtoFieldExtend.GetAdministrativeFee(soLineEntity);                                  //管理费
                            dtoOne.Interest          = CalculateDtoFieldExtend.GetInterest(soLineEntity);                                           //利息
                            dtoOne.MouldFee          = CalculateDtoFieldExtend.GetMouldFee(soLineEntity);                                           //模具费‘
                            dtoOne.Labelling         = CalculateDtoFieldExtend.GetLabelling(soLineEntity, orderBom);                                //防盗标签费
                            dtoOne.CreditInsurance   = CalculateDtoFieldExtend.GetCreditInsurance(soLineEntity);                                    //信用保险费
                            dtoOne.BankCharge        = CalculateDtoFieldExtend.GetBankCharge(soLineEntity);                                         //银行费用

                            //dtoOne.OrderBomHead = orderBom;//随单Bom
                            dtoOne.ForecastTime = DateTime.Now;
                            dtoOne.ForecastMan  = UFIDA.U9.Base.Context.LoginUser;

                            //成品预测利润:各中类成品外销额-成品各项费用+成品退税额
                            allFee = dtoOne.Brokerage + dtoOne.Discount + dtoOne.OceanFreight + dtoOne.OtherFee + dtoOne.DomesticFee + dtoOne.OtherDomesticFee +
                                     dtoOne.ProcurementCost + dtoOne.LabourCharges + dtoOne.ProductCost + dtoOne.AdministrativeFee + dtoOne.Interest + dtoOne.MouldFee +
                                     dto.Labelling + dtoOne.CreditInsurance + dtoOne.BankCharge;
                            dtoOne.ProductForecastRate = soLineEntity.TotalMoneyTC - allFee + dto.TaxCredits;
                            dtoOne.ProductRate         = dto.ProductForecastRate / soLineEntity.TotalMoneyTC;
                            //备注
                            dtoOne.Demo = dtoOneDemo;
                            dtoList.Add(dtoOne);

                            #region 汇总到整单成本预测
                            dto.Brokerage         += dtoOne.Brokerage;
                            dto.Discount          += dtoOne.Discount;
                            dto.OceanFreight      += dtoOne.OceanFreight;//海运费
                            dto.TaxCredits        += dtoOne.TaxCredits;
                            dto.ProcurementCost   += dtoOne.ProcurementCost;
                            dto.LabourCharges     += dtoOne.LabourCharges;
                            dto.ProductCost       += dtoOne.ProductCost;
                            dto.RMBProductCost    += dtoOne.RMBProductCost;
                            dto.DollorProductCost += dtoOne.DollorProductCost;
                            dto.AdministrativeFee += dtoOne.AdministrativeFee;
                            dto.Interest          += dtoOne.Interest;
                            dto.MouldFee          += dtoOne.MouldFee;
                            dto.Labelling         += dtoOne.Labelling;
                            dto.CreditInsurance   += dtoOne.CreditInsurance;
                            dto.BankCharge        += dtoOne.BankCharge;
                            dto.ListForecastRate  += dto.ProductForecastRate;
                            //备注
                            dto.Demo = "";
                            //dto.SOLine = soLineEntity;
                            //随单BOM


                            #endregion
                            //得到销售订单行soLineEntity
                            #region 计算成本预测字段值
                            //根据销售订单行得到随单Bom表
                            OrderBomHead bomHead = OrderBomHead.Finder.Find("");
                            #endregion
                        }
                        dto.ListRate     = dto.ProductForecastRate / soEntity.TotalMoneyAC; //整单利润率
                        dto.ForecastTime = DateTime.Now;                                    //预测时间
                        dto.ForecastMan  = UFIDA.U9.Base.Context.LoginUser;                 //预测人

                        dtoList.Add(dto);

                        //soEntity.DescFlexField.PrivateDescSeg7 = dto.OceanFreight.ToString();
                        #endregion
                    }
                    session.Commit();
                }
            }
            else if (SoLine != null && SoLine.Count > 0)
            {
                using (Session seesion = Session.Open())
                {
                    //成品成本预测
                    //从UI得到的销售订单行应该是已经按照销售订单行过滤了的
                    foreach (SM.SO.SOLine.EntityKey soLineKey in SoLine)          //遍历销售订单行集合
                    {
                        //得到销售订单行
                        //SM.SO.SOLine soLineEntity = soLineKey.GetEntity();
                        SM.SO.SOLine line = SM.SO.SOLine.Finder.FindByID(soLineKey.ID);
                        if (line == null)
                        {
                            throw new Exception("请确认查询方案设置为成品成本预测");
                        }
                        SM.SO.SOLine soLineEntity = line;

                        #region 计算整单体积
                        decimal allVolume = 0;
                        foreach (SM.SO.SOLine soLine in soLineEntity.SO.SOLines)    //遍历销售订单行集合计算整单体积
                        {
                            //单行的体积=单行的箱数*料品.体积
                            //单行的箱数=订单数量/料品.装箱数量
                            //判断料品的装箱数量与装箱体积是否为空

                            ItemSubTable itemsub = ItemSubTable.Finder.Find("ItemMaster=" + soLine.ItemInfo.ItemID.ID);
                            //if(itemsub == null)
                            //    throw new Exception("请维护" + soLine.SO.DocNo + "行" + soLine.DocLineNo + "对应料品子表装箱长度、装箱宽度、装箱高度、装箱数量、毛重字段");
                            //if(itemsub.BoxNumber == 0)
                            //{
                            //    throw new Exception("请录入" + soLine.SO.DocNo + "行" + soLine.DocLineNo + "对应料品的装箱数量");
                            //}
                            //if (itemsub.GrossWeight ==0 )
                            //{
                            //    throw new Exception("请录入" + soLine.SO.DocNo + "行" + soLine.DocLineNo + "对应料品的毛重");
                            //}
                            //if (itemsub.BoxLong == 0)
                            //{
                            //    throw new Exception("请录入" + soLine.SO.DocNo + "行" + soLine.DocLineNo + "对应料品的装箱长度");
                            //}
                            //if (itemsub.BoxWidth == 0)
                            //{
                            //    throw new Exception("请录入" + soLine.SO.DocNo + "行" + soLine.DocLineNo + "对应料品的装箱宽度");
                            //}
                            //if (itemsub.BoxHight == 0)
                            //{
                            //    throw new Exception("请录入" + soLine.SO.DocNo + "行" + soLine.DocLineNo + "对应料品的装箱高度");
                            //}
                            if (itemsub != null)
                            {
                                decimal itemQty    = itemsub.BoxNumber;                                     //料品装箱数量
                                decimal itemRough  = itemsub.GrossWeight;                                   //料品毛重
                                decimal itemVolume = itemsub.BoxLong * itemsub.BoxWidth * itemsub.BoxHight; //料品体积
                                allVolume += (soLine.OrderByQtyTU / itemQty) * itemVolume;                  //整单体积
                            }
                        }
                        #endregion

                        #region 计算成本预测字段值
                        //根据销售订单行得到随单Bom表
                        //计算共用值
                        ItemSubTable itemsub1    = ItemSubTable.Finder.Find("ItemMaster=" + soLineEntity.ItemInfo.ItemID.ID);
                        int          itemQty1    = 0; //料品装箱数量
                        decimal      itemRough1  = 0; //料品毛重
                        decimal      itemVolume1 = 0; //料品体积
                        if (itemsub1 != null)
                        {
                            itemQty1    = itemsub1.OutBoxNumber;                             //料品装箱数量
                            itemRough1  = itemsub1.GrossWeight;                              //料品毛重
                            itemVolume1 = itemsub1.Length * itemsub1.Width * itemsub1.Hight; //料品体积
                        }
                        decimal rmbCost    = 0;                                              //工具人民币采购成本
                        decimal dollorCost = 0;                                              //工具美元采购成本
                        decimal allFee     = 0;                                              //成品各项费用

                        dtoOne = new CostForecastBE.CostForecastDTO();
                        dtoOne.ForecastType = AllEnumBE.CostForecastTypeEnum.OneCostForecast;     //预测类型
                        dtoOne.SONo         = soLineEntity.SO;                                    //销售订单
                        dtoOne.SOLine       = soLineEntity;                                       //销售订单行
                        dtoOne.Brokerage    = CalculateDtoFieldExtend.GetBrokerage(soLineEntity); //佣金
                        dtoOne.Discount     = CalculateDtoFieldExtend.GetDiscount(soLineEntity);  //折扣
                        if (itemQty1 == 0 || itemRough1 == 0 || itemVolume1 == 0)
                        {
                            dtoOne.OceanFreight = 0;
                            dtoOne.DomesticFee  = 0;
                        }
                        else
                        {
                            dtoOne.OceanFreight = CalculateDtoFieldExtend.GetOceanFreight(itemQty1, itemRough1, itemVolume1, soLineEntity);           //海运费
                            dtoOne.DomesticFee  = CalculateDtoFieldExtend.GetDomesticFee(itemQty1, itemRough1, itemVolume1, allVolume, soLineEntity); //国内运费
                        }
                        dtoOne.OtherFee         = CalculateDtoFieldExtend.GetOtherOceanFreight(soLineEntity);                                         //其他国外费
                        dtoOne.OtherDomesticFee = CalculateDtoFieldExtend.GetOtherOceanFreight(soLineEntity);                                         //其他国内费
                        //随单BOM
                        OrderBomBE.OrderBomHead.EntityList orderBom = OrderBomBE.OrderBomHead.Finder.FindAll("OrderLine=@BomMaster", new OqlParam(soLineEntity.ID));
                        dtoOne.TaxCredits        = CalculateDtoFieldExtend.GetTaxCredits(soLineEntity, orderBom);                               //退税额
                        dtoOne.ProcurementCost   = CalculateDtoFieldExtend.GetProcurementCost(soLineEntity, orderBom);                          //包装采购成本
                        dtoOne.LabourCharges     = CalculateDtoFieldExtend.GetLabourCharges(soLineEntity);                                      //包装人工费用
                        dtoOne.ProductCost       = CalculateDtoFieldExtend.GetProductCost(soLineEntity, ref rmbCost, ref dollorCost, orderBom); //产品采购成本
                        dtoOne.RMBProductCost    = rmbCost;                                                                                     //工具人民币采购成本
                        dtoOne.DollorProductCost = dollorCost;                                                                                  //工具美元采购成本
                        dtoOne.AdministrativeFee = CalculateDtoFieldExtend.GetAdministrativeFee(soLineEntity);                                  //管理费
                        dtoOne.Interest          = CalculateDtoFieldExtend.GetInterest(soLineEntity);                                           //利息
                        dtoOne.MouldFee          = CalculateDtoFieldExtend.GetMouldFee(soLineEntity);                                           //模具费‘
                        dtoOne.Labelling         = CalculateDtoFieldExtend.GetLabelling(soLineEntity, orderBom);                                //防盗标签费
                        dtoOne.CreditInsurance   = CalculateDtoFieldExtend.GetCreditInsurance(soLineEntity);                                    //信用保险费
                        dtoOne.BankCharge        = CalculateDtoFieldExtend.GetBankCharge(soLineEntity);                                         //银行费用

                        //dtoOne.OrderBomHead = orderBom;//随单Bom
                        dtoOne.ForecastTime = DateTime.Now;
                        dtoOne.ForecastMan  = UFIDA.U9.Base.Context.LoginUser;

                        //成品预测利润:各中类成品外销额-成品各项费用+成品退税额
                        allFee = dtoOne.Brokerage + dtoOne.Discount + dtoOne.OceanFreight + dtoOne.OtherFee + dtoOne.DomesticFee + dtoOne.OtherDomesticFee +
                                 dtoOne.ProcurementCost + dtoOne.LabourCharges + dtoOne.ProductCost + dtoOne.AdministrativeFee + dtoOne.Interest + dtoOne.MouldFee +
                                 dtoOne.Labelling + dtoOne.CreditInsurance + dtoOne.BankCharge;
                        dtoOne.ProductForecastRate = soLineEntity.TotalMoneyTC - allFee + dtoOne.TaxCredits;
                        dtoOne.ProductRate         = dtoOne.ProductForecastRate / soLineEntity.TotalMoneyTC;

                        //反写销售订单行预测状态
                        if (soLineEntity.DescFlexField.PrivateDescSeg18 == "")
                        {
                            soLineEntity.DescFlexField.PrivateDescSeg18 = "Y";
                        }
                        //else if (soLineEntity.DescFlexField.PrivateDescSeg18 == "N")
                        //{
                        //    soLineEntity.DescFlexField.PrivateDescSeg18 = "M";
                        //}
                        dtoList.Add(dtoOne);
                        #endregion
                    }
                    seesion.Commit();
                }
            }
            else
            {
                throw new Exception("未选择任何需要预测的订单");
            }
            return(dtoList);
            //CreatEntity(dtoList);
        }