Ejemplo n.º 1
0
        /// <summary>
        /// 更改单
        /// </summary>
        /// <param name="pullOrdersInfo"></param>
        public string TransitionBreakpoint(PullOrdersInfo pullOrdersInfo, string loginUser)
        {
            if (pullOrdersInfo.ChangeFlag == (int)ChangeFlagConstants.Replaced)
            {
                return(string.Empty);
            }
            ///根据生产订单号获取其物料清单,作为后续匹配更改单的源数据
            List <PullOrderBomInfo> pullOrderBomInfos = new PullOrderBomDAL().GetList("and [ORDERFID]='" + pullOrdersInfo.Fid + "'", string.Empty);

            if (pullOrderBomInfos.Count == 0)
            {
                return(string.Empty);
            }
            ///根据生产订单对应的工厂、生产版本(生产线)获取状态为20.已发布且更改类型为20.过渡断点的更改单
            ///TT_BPM_BOM_CHANGE_ORDER 还需要校验过渡开始时间小于等于当前时间
            List <BomChangeOrderInfo> bomChangeOrderInfos = new BomChangeOrderDAL().GetList("" +
                                                                                            " and [PLANT]=N'" + pullOrdersInfo.Werk + "'" +
                                                                                            " and [ASSEMBLY_LINE]=N'" + pullOrdersInfo.AssemblyLine + "' " +
                                                                                            " and [STATUS]=" + (int)BasicDataStatusConstants.Enable + "" +
                                                                                            " and [ORDER_TYPE]=" + (int)BreakPointOrderTypeConstants.TransitionBreakpoint + "" +
                                                                                            " and [TRANSITION_START_TIME] <=GETDATE()", string.Empty);

            if (bomChangeOrderInfos.Count == 0)
            {
                return(string.Empty);
            }
            ///过滤其中旧物料库存数量大于等于旧物料已消耗数量的物料数据
            List <BomChangeOrderDetailInfo> bomChangeOrderDetailInfos = new BomChangeOrderDetailDAL().GetList("" +
                                                                                                              "and [ORDER_FID] in ('" + string.Join("','", bomChangeOrderInfos.Select(d => d.Fid).ToArray()) + "')", string.Empty);

            if (bomChangeOrderDetailInfos.Count == 0)
            {
                return(string.Empty);
            }
            bomChangeOrderDetailInfos = bomChangeOrderDetailInfos.Where(d => d.OldPartStockQty >= d.OldPartConsumedQty).ToList();
            if (bomChangeOrderDetailInfos.Count == 0)
            {
                return(string.Empty);
            }
            ///将物料清单与过渡更改单物料根据新物料号、工位过滤数据
            var replacedParts = (from p in pullOrderBomInfos
                                 join b in bomChangeOrderDetailInfos
                                 on new { PartNo = p.Zcomno, Location = p.Zloc } equals new { PartNo = b.NewPartNo, b.Location }
                                 select new
            {
                p.Id,
                p.SupplierNum,
                b.NewPartNo,
                b.OldPartNo,
                b.NewPartQty,
                b.Location,
                OldPartQty = 1                     //b.OldPartQty TODO:旧物料
            }).ToList();

            ///在更新生产订单物料清单信息(新换旧)
            if (replacedParts.Count == 0)
            {
                return(string.Empty);
            }
            StringBuilder @string = new StringBuilder();

            foreach (var parts in replacedParts)
            {
                @string.AppendFormat("update [LES].[TT_BAS_PULL_ORDER_BOM] set " +
                                     "[ZCOMNO]=N'" + parts.OldPartNo + "'," +
                                     "[ZQTY]=" + parts.OldPartQty + "," +
                                     "[MODIFY_DATE] = GETDATE()," +
                                     "[MODIFY_USER] = N'" + loginUser + "'" +
                                     "where [ID]=" + parts.Id + "");
                ///同时生成物料替换记录
                PorderBomRepleaceRecordInfo porderBomRepleaceRecordInfo = new PorderBomRepleaceRecordInfo();
                ///FID
                porderBomRepleaceRecordInfo.Fid = Guid.NewGuid();
                ///VALID_FLAG
                porderBomRepleaceRecordInfo.ValidFlag = true;
                ///CREATE_DATE
                porderBomRepleaceRecordInfo.CreateDate = DateTime.Now;
                ///CREATE_USER
                porderBomRepleaceRecordInfo.CreateUser = loginUser;
                ///生产订单号
                porderBomRepleaceRecordInfo.OrderNo = pullOrdersInfo.OrderNo;
                ///旧物料号
                porderBomRepleaceRecordInfo.OldPartNo = parts.OldPartNo;
                ///新物料号
                porderBomRepleaceRecordInfo.NewPartNo = parts.NewPartNo;
                ///旧供应商
                porderBomRepleaceRecordInfo.OldSupplierNum = parts.SupplierNum;
                ///新供应商
                porderBomRepleaceRecordInfo.NewSupplierNum = parts.SupplierNum;
                ///旧工位
                porderBomRepleaceRecordInfo.OldLocation = parts.Location;
                ///新工位
                porderBomRepleaceRecordInfo.NewLocation = parts.Location;
                ///旧物料用量
                porderBomRepleaceRecordInfo.OldPartQty = parts.OldPartQty;
                ///新物料用量
                porderBomRepleaceRecordInfo.NewPartQty = parts.NewPartQty;
                ///替换时间
                porderBomRepleaceRecordInfo.RepleaceTime = DateTime.Now;
                ///状态 TODO:暂时没有想好干嘛的
                porderBomRepleaceRecordInfo.Status = 10;
                ///同时生成物料替换记录
                @string.AppendFormat(PorderBomRepleaceRecordDAL.GetInsertSql(porderBomRepleaceRecordInfo));
            }
            if (@string.Length > 0)
            {
                ///在本更改单所有物料替换完成时还需生成一条状态为逆处理的生产订单中间表记录
                SapProductOrderInfo sapProductOrderInfo = SapProductOrderDAL.CreateSapProductOrderInfo(loginUser);
                ///订单号
                sapProductOrderInfo.Aufnr = pullOrdersInfo.OrderNo;
                ///处理状态
                sapProductOrderInfo.ProcessFlag = (int)ProcessFlagConstants.ConverseProgress;
                ///版本号
                sapProductOrderInfo.Verid = pullOrdersInfo.Version.ToString();
                @string.AppendFormat(SapProductOrderDAL.GetInsertSql(sapProductOrderInfo));
            }
            return(@string.ToString());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 在线替换
        /// </summary>
        /// <param name="bomRepleaceConditionInfos"></param>
        /// <param name="loginUser"></param>
        public void OnlineReplacement(List <BomRepleaceConditionInfo> bomRepleaceConditionInfos, string loginUser)
        {
            if (bomRepleaceConditionInfos.Count == 0)
            {
                return;
            }
            ///生产订单
            List <PullOrdersInfo> pullOrdersInfos = new PullOrdersDAL().GetList("" +
                                                                                " and [CHANGE_FLAG]=" + (int)ChangeFlagConstants.NotReplaced + "", string.Empty);

            if (pullOrdersInfos.Count == 0)
            {
                return;
            }
            ///车辆状态点信息集合
            List <VehiclePointStatusInfo> vehiclePointStatusInfos = new VehiclePointStatusDAL().GetList("" +
                                                                                                        "and [ORDER_NO] in ('" + string.Join("','", bomRepleaceConditionInfos.Select(d => d.StartPorderCode).ToArray()) + "')", string.Empty);

            if (vehiclePointStatusInfos.Count == 0)
            {
                return;
            }
            ///状态点集合
            List <StatusPointInfo> statusPointInfos = new StatusPointDAL().GetList("" +
                                                                                   "[STATUS_POINT_CODE] in ('" + string.Join("','", vehiclePointStatusInfos.Select(d => d.StatusPointCode).ToArray()) + "')", string.Empty);

            if (statusPointInfos.Count == 0)
            {
                return;
            }
            ///时间窗(过点累计方式)零件类
            List <TwdPartBoxInfo> twdPartBoxInfos = new TwdPartBoxDAL().GetList("" +
                                                                                " and [STATUS] =" + (int)BasicDataStatusConstants.Enable + " " +
                                                                                " and [REQUIREMENT_ACCUMULATE_MODE]=" + (int)RequirementAccumulateModeConstants.PassSpot + "" +
                                                                                " and [STATUS_POINT_CODE] in ('" + string.Join("','", statusPointInfos.Select(d => d.StatusPointCode).ToArray()) + "')", string.Empty);
            ///排序拉动方式 零件类
            List <JisPartBoxInfo> jisPartBoxInfos = new JisPartBoxDAL().GetList("" +
                                                                                " and [STATUS] =" + (int)BasicDataStatusConstants.Enable + "" +
                                                                                " and [STATUS_POINT_CODE] in ('" + string.Join("','", statusPointInfos.Select(d => d.StatusPointCode).ToArray()) + "')", string.Empty);
            ///相应的物料拉动信息
            List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandardInfos = new MaintainInhouseLogisticStandardDAL().GetList("" +
                                                                                                                                               " and [STATUS] =" + (int)BasicDataStatusConstants.Enable + "" +
                                                                                                                                               " (and [INHOUSE_PART_CLASS] in ('" + string.Join("','", twdPartBoxInfos.Select(d => d.PartBoxCode).ToArray()) + "')" +
                                                                                                                                               " or [INHOUSE_PART_CLASS] in ('" + string.Join("','", jisPartBoxInfos.Select(d => d.PartBoxCode).ToArray()) + "'))", string.Empty);

            if (maintainInhouseLogisticStandardInfos.Count == 0)
            {
                return;
            }
            foreach (BomRepleaceConditionInfo bomRepleaceConditionInfo in bomRepleaceConditionInfos)
            {
                ///有效时间内
                if (!(bomRepleaceConditionInfo.ExecuteStartTime <= DateTime.Now) || !(DateTime.Now <= bomRepleaceConditionInfo.ExecuteEndTime))
                {
                    continue;
                }
                ///根据起始生产订单号,获取车辆状态点信息判断其是否在线,若未上线则不执行以下逻辑
                PullOrdersInfo pullOrdersInfo = pullOrdersInfos.FirstOrDefault(d => d.OrderNo == bomRepleaceConditionInfo.StartPorderCode);
                if (pullOrdersInfo == null || pullOrdersInfo.OrderStatus != (int)OrderStatusConstants.AlreadOnline)
                {
                    continue;
                }
                ///若已上线或已下线则需要根据其获取顺序号之后的所有在线生产订单,依次循环进行逻辑处理    TODO:已下线的逻辑?
                ///同一起始生产订单号可能出现在多条生产线的状态点上,以下为单生产订单处理逻辑            TODO:多条生产线的逻辑?
                ///已上线的生产订单:
                ///本生产订单对应的车辆状态点信息
                List <VehiclePointStatusInfo> vehiclePointStatuss = vehiclePointStatusInfos.Where(d => d.OrderNo == pullOrdersInfo.OrderNo).ToList();
                if (vehiclePointStatuss.Count == 0)
                {
                    continue;
                }
                ///当前车辆最大状态点信息
                VehiclePointStatusInfo vehiclePointStatusInfo = vehiclePointStatuss.Where(d => d.OrderNo == pullOrdersInfo.OrderNo).OrderByDescending(d => d.PassTime).FirstOrDefault();
                if (vehiclePointStatusInfo == null)
                {
                    continue;
                }
                ///当前顺序号之后的所有的车辆状态点信息
                List <VehiclePointStatusInfo> vehiclePoints = vehiclePointStatusInfos.Where(d => d.SeqNo >= vehiclePointStatusInfo.SeqNo).ToList();
                ///当前顺序号之后的所有在线生产订单
                pullOrdersInfos = (from p in pullOrdersInfos
                                   join v in vehiclePoints
                                   on p.OrderNo equals v.OrderNo
                                   select p).Distinct().ToList();
                ///依次循环进行逻辑处理
                foreach (PullOrdersInfo pullOrder in pullOrdersInfos)
                {
                    ///根据生产订单号获取其物料清单,作为后续匹配更改单的源数据
                    List <PullOrderBomInfo> pullOrderBomInfos = new PullOrderBomDAL().GetList("" +
                                                                                              "and [ORDERFID]='" + pullOrdersInfo.Fid + "'", string.Empty);
                    if (pullOrderBomInfos.Count == 0)
                    {
                        continue;
                    }
                    ///本生产订单对应的车辆状态点信息
                    List <VehiclePointStatusInfo> vehicles = vehiclePointStatusInfos.Where(d => d.OrderNo == pullOrdersInfo.OrderNo).ToList();
                    if (vehicles.Count == 0)
                    {
                        continue;
                    }
                    ///本产生订单对应的所有状态点信息
                    List <StatusPointInfo> statusPoints = statusPointInfos.Where(d => vehicles.Select(v => v.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                    if (statusPoints.Count == 0)
                    {
                        continue;
                    }
                    ///已在线的生产订单在此时,需要根据所在状态点位置
                    VehiclePointStatusInfo vehiclePointStatus = vehiclePointStatusInfos.Where(d => d.OrderNo == pullOrder.OrderNo).OrderByDescending(d => d.PassTime).FirstOrDefault();
                    if (vehiclePointStatus == null)
                    {
                        continue;
                    }
                    StatusPointInfo statusPointInfo = statusPointInfos.FirstOrDefault(d => d.StatusPointCode == vehiclePointStatus.StatusPointCode);
                    if (statusPointInfo == null)
                    {
                        continue;
                    }
                    ///将物料拉动的结果集分为三个部分,其一为未累计、其二为已累计未拉动、其三为已拉动
                    ///该生产订单对应的其后状态点
                    List <StatusPointInfo> notStatusPoints = statusPoints.Where(d => d.StatusPointSeq > statusPointInfo.StatusPointSeq).ToList();
                    ///该生产订单对应的状态点及之前的状态点
                    List <StatusPointInfo> yesStatusPoints = statusPoints.Where(d => d.StatusPointSeq <= statusPointInfo.StatusPointSeq).ToList();
                    ///其后的状态点
                    if (notStatusPoints.Count > 0)
                    {
                        ///其一为当前状态点位置之后的状态点对应的时间窗(过点累计方式)、排序拉动方式相应的物料拉动信息物料、供应商、工位
                        ///该逻辑获取的数据在此不做后续处理,但此逻辑请事先在程序中实现,将会到离队归队时使用
                        List <TwdPartBoxInfo> twdPartBoxs = twdPartBoxInfos.Where(d => notStatusPoints.Select(s => s.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                        List <JisPartBoxInfo> jisPartBoxs = jisPartBoxInfos.Where(d => notStatusPoints.Select(s => s.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                        ///零件类对应的物料拉动信息
                        if (twdPartBoxs.Count != 0 || jisPartBoxs.Count != 0)
                        {
                            ///生产订单的产线下的物料拉动信息
                            List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = maintainInhouseLogisticStandardInfos.
                                                                                                          Where(d => d.AssemblyLine == pullOrder.AssemblyLine).Where(d =>
                                                                                                                                                                     (twdPartBoxs.Select(t => t.PartBoxCode).Contains(d.InhousePartClass)) ||
                                                                                                                                                                     (jisPartBoxs.Select(j => j.PartBoxCode).Contains(d.InhousePartClass))).ToList();
                            if (maintainInhouseLogisticStandards.Count != 0)
                            {
                                ///拉动信息对应的Bom清单
                                List <PullOrderBomInfo> pullOrderBoms = pullOrderBomInfos.Where(d =>
                                                                                                maintainInhouseLogisticStandards.Select(m => m.PartNo).Contains(d.Zcomno) &&
                                                                                                maintainInhouseLogisticStandards.Select(m => m.SupplierNum).Contains(d.SupplierNum)).ToList();
                            }
                        }
                    }
                    ///其二、其三目前没有较理想的方式区分开,暂时以已拉动处理、当前状态点位置之前包括该状态点位置对应的拉动方式相关物料拉动信息
                    if (yesStatusPoints.Count > 0)
                    {
                        List <TwdPartBoxInfo> twdPartBoxs = twdPartBoxInfos.Where(d => yesStatusPoints.Select(s => s.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                        List <JisPartBoxInfo> jisPartBoxs = jisPartBoxInfos.Where(d => yesStatusPoints.Select(s => s.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                        ///零件类对应的物料拉动信息
                        if (twdPartBoxs.Count != 0 || jisPartBoxs.Count != 0)
                        {
                            ///生产订单的产线下的物料拉动信息
                            List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = maintainInhouseLogisticStandardInfos.
                                                                                                          Where(d => d.AssemblyLine == pullOrder.AssemblyLine).Where(d =>
                                                                                                                                                                     (twdPartBoxs.Select(t => t.PartBoxCode).Contains(d.InhousePartClass)) ||
                                                                                                                                                                     (jisPartBoxs.Select(j => j.PartBoxCode).Contains(d.InhousePartClass))).ToList();
                            maintainInhouseLogisticStandards = maintainInhouseLogisticStandards.Where(d => d.PartNo == bomRepleaceConditionInfo.OldPartNo).ToList();
                            ///根据已拉动的物料拉动信息,与替换条件中的旧物料号对比
                            ///若不存在于已拉动物料中,则只需要执行生产订单物料清单替换逻辑即可
                            ///否则需要进行新物料号的自动紧急拉动且生成旧物料号的余料退库单(退库地点为物料拉动信息中的来源库存地点)
                            ///同时也需要执行生产订单物料清单替换逻辑
                            if (maintainInhouseLogisticStandards.Count > 0)
                            {
                                ///拉动信息对应的Bom清单
                                List <PullOrderBomInfo> pullOrderBoms = pullOrderBomInfos.Where(d =>
                                                                                                maintainInhouseLogisticStandards.Select(m => m.PartNo).Contains(d.Zcomno) &&
                                                                                                maintainInhouseLogisticStandards.Select(m => m.SupplierNum).Contains(d.SupplierNum)).ToList();
                                foreach (PullOrderBomInfo pullOrderBom in pullOrderBoms)
                                {
                                    MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo = maintainInhouseLogisticStandards.FirstOrDefault(d =>
                                                                                                                                                              d.PartNo == pullOrderBom.Zcomno && d.SupplierNum == pullOrderBom.SupplierNum);
                                    if (maintainInhouseLogisticStandardInfo == null)
                                    {
                                        continue;
                                    }
                                    ///进行新物料号的自动紧急拉动

                                    ///生成旧物料号的余料退库单(退库地点为物料拉动信息中的来源库存地点)
                                }
                            }
                            new BomRepleaceConditionBLL().ReplacementCriteria(pullOrder, loginUser);
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 替换条件
        /// </summary>
        /// <param name="pullOrdersInfo"></param>
        /// <param name="loginUser"></param>
        /// <returns></returns>
        public string ReplacementCriteria(PullOrdersInfo pullOrdersInfo, string loginUser)
        {
            ///车辆过点时根据替换条件更新物料清单中的物料号、供应商、工位、用量信息,同时产生替换记录
            if (pullOrdersInfo.ChangeFlag == (int)ChangeFlagConstants.Replaced)
            {
                return(string.Empty);
            }
            ///根据生产订单号获取其物料清单,作为后续匹配更改单的源数据
            List <PullOrderBomInfo> pullOrderBomInfos = new PullOrderBomDAL().GetList("" +
                                                                                      "and [ORDERFID]='" + pullOrdersInfo.Fid + "'", string.Empty);

            if (pullOrderBomInfos.Count == 0)
            {
                return(string.Empty);
            }
            ///TT_BPM_BOM_REPLEACE_CONDITION 替换条件信息
            List <BomRepleaceConditionInfo> bomRepleaceConditionInfos = new BomRepleaceConditionDAL().GetList("" +
                                                                                                              " and [STATUS] = " + (int)BasicDataStatusConstants.Enable + "" +
                                                                                                              " and [OLD_PART_NO] in ('" + string.Join("','", pullOrderBomInfos.Select(d => d.Zcomno).ToArray()) + "')" +
                                                                                                              " and GETDATE() between [EXECUTE_START_TIME] and [EXECUTE_END_TIME]", string.Empty);

            if (bomRepleaceConditionInfos.Count == 0)
            {
                return(string.Empty);
            }

            ///车型信息 TT_BPM_BOM_REPLEACE_CONDITION_VEHICLE
            List <BomRepleaceConditionVehicleInfo> bomRepleaceConditionVehicleInfos = new BomRepleaceConditionVehicleBLL().GetList("" +
                                                                                                                                   " and [STATUS] = " + (int)BasicDataStatusConstants.Enable + "" +
                                                                                                                                   " and [CONDITION_FID] in ('" + string.Join("','", bomRepleaceConditionInfos.Select(d => d.Fid).ToArray()) + "')" +
                                                                                                                                   " and [PART_NO]=N'" + pullOrdersInfo.PartNo + "'" +
                                                                                                                                   " and [MODEL_YEAR]=N'" + pullOrdersInfo.ModelYear + "'" +
                                                                                                                                   " and [FARBAU]=N'" + pullOrdersInfo.Farbau + "'" +
                                                                                                                                   " and [PNR_STRING]=N'" + pullOrdersInfo.PnrString + "'" +
                                                                                                                                   " and [ZCOLORI]=N'" + pullOrdersInfo.Zcolori + "'", string.Empty);
            StringBuilder @string = new StringBuilder();

            foreach (BomRepleaceConditionInfo bomRepleaceConditionInfo in bomRepleaceConditionInfos)
            {
                ///物料号
                List <PullOrderBomInfo> pullOrderBoms = pullOrderBomInfos.Where(d => d.Zcomno == bomRepleaceConditionInfo.OldPartNo).ToList();
                if (pullOrderBoms.Count == 0)
                {
                    continue;
                }
                ///工位
                if (!string.IsNullOrEmpty(bomRepleaceConditionInfo.OldLocation))
                {
                    pullOrderBoms = pullOrderBoms.Where(d => d.Zloc == bomRepleaceConditionInfo.OldLocation).ToList();
                }
                ///供应商
                if (!string.IsNullOrEmpty(bomRepleaceConditionInfo.OldSupplierNum))
                {
                    pullOrderBoms = pullOrderBoms.Where(d => d.SupplierNum == bomRepleaceConditionInfo.OldSupplierNum).ToList();
                }
                if (pullOrderBoms.Count == 0)
                {
                    continue;
                }
                ///车型
                BomRepleaceConditionVehicleInfo bomRepleaceConditionVehicleInfo = bomRepleaceConditionVehicleInfos.FirstOrDefault(d => d.ConditionFid == bomRepleaceConditionInfo.Fid);
                foreach (PullOrderBomInfo pullOrderBom in pullOrderBoms)
                {
                    ///更新物料清单
                    @string.AppendFormat("update [LES].[TT_BAS_PULL_ORDER_BOM] set " +
                                         "[ZCOMNO]=N'" + bomRepleaceConditionInfo.NewPartNo + "',");
                    if (bomRepleaceConditionInfo.OldPartQty.GetValueOrDefault() != 0)
                    {
                        @string.AppendFormat("[ZQTY]=" + bomRepleaceConditionInfo.NewPartQty.GetValueOrDefault() + ",");
                    }
                    if (!string.IsNullOrEmpty(bomRepleaceConditionInfo.OldLocation))
                    {
                        @string.AppendFormat("[ZLOC]=N'" + bomRepleaceConditionInfo.NewLocation + "',");
                    }
                    if (!string.IsNullOrEmpty(bomRepleaceConditionInfo.OldSupplierNum))
                    {
                        @string.AppendFormat("[SUPPLIER_NUM]=N'" + bomRepleaceConditionInfo.NewSupplierNum + "',");
                    }
                    @string.AppendFormat("[MODIFY_DATE] = GETDATE()," +
                                         "[MODIFY_USER] = N'" + loginUser + "'" +
                                         "where [ID]=" + pullOrderBom.Id + "");
                    ///旧物料多的情况
                    if (pullOrderBom.Zqty > bomRepleaceConditionInfo.NewPartQty)
                    {
                        PullOrderBomInfo info = new PullOrderBomInfo();
                        ///FID,
                        info.Fid = Guid.NewGuid();
                        ///ORDERFID,订单外键
                        info.Orderfid = pullOrdersInfo.Fid;
                        ///ZORDNO,订单号
                        info.Zordno = pullOrdersInfo.OrderNo;
                        ///ZKWERK,工厂
                        info.Zkwerk = pullOrderBom.Zkwerk;
                        ///ZBOMID,MBOM项目号
                        info.Zbomid = pullOrderBom.Zbomid;
                        ///ZCOMNO,零件号
                        info.Zcomno = bomRepleaceConditionInfo.NewPartNo;
                        ///ZCOMDS,零件描述
                        info.Zcomds = pullOrderBom.Zcomds;
                        ///ZVIN,ZVIN
                        info.Zvin = pullOrderBom.Zvin;
                        ///ZQTY,数量
                        info.Zqty = pullOrderBom.Zqty.GetValueOrDefault() - Convert.ToInt32(bomRepleaceConditionInfo.NewPartQty.GetValueOrDefault());
                        ///ZDATE,计划下线日期
                        info.Zdate = pullOrderBom.Zdate;
                        ///ZLOC,工位
                        info.Zloc = bomRepleaceConditionInfo.OldLocation == null ? pullOrderBom.Zloc : bomRepleaceConditionInfo.NewLocation;
                        ///ZST,操作状态
                        info.Zst = pullOrderBom.Zst;
                        ///ZMEMO,备注
                        info.Zmemo = pullOrderBom.Zmemo;
                        ///ZMEINS,单位
                        info.Zmeins = pullOrderBom.Zmeins;
                        ///SUPPLIER_NUM,供应商
                        info.SupplierNum = bomRepleaceConditionInfo.OldSupplierNum == null ? pullOrderBom.SupplierNum : bomRepleaceConditionInfo.NewSupplierNum;
                        ///PLATFORM,平台
                        info.Platform = pullOrderBom.Platform;
                        ///VALID_FLAG,
                        info.ValidFlag = true;
                        ///CREATE_USER,COMMON_CREATE_USER
                        info.CreateUser = loginUser;
                        ///CREATE_DATE,COMMON_CREATE_DATE
                        info.CreateDate = DateTime.Now;
                        ///MODIFY_USER,COMMON_UPDATE_USER
                        info.ModifyUser = null;
                        ///MODIFY_DATE,COMMON_UPDATE_DATE
                        info.ModifyDate = null;
                        @string.AppendFormat(PullOrderBomDAL.GetInsertSql(info));
                    }
                    ///同时生成物料替换记录
                    PorderBomRepleaceRecordInfo porderBomRepleaceRecordInfo = new PorderBomRepleaceRecordInfo();
                    ///FID
                    porderBomRepleaceRecordInfo.Fid = Guid.NewGuid();
                    ///VALID_FLAG
                    porderBomRepleaceRecordInfo.ValidFlag = true;
                    ///CREATE_DATE
                    porderBomRepleaceRecordInfo.CreateDate = DateTime.Now;
                    ///CREATE_USER
                    porderBomRepleaceRecordInfo.CreateUser = loginUser;
                    ///生产订单号
                    porderBomRepleaceRecordInfo.OrderNo = pullOrdersInfo.OrderNo;
                    ///旧物料号
                    porderBomRepleaceRecordInfo.OldPartNo = bomRepleaceConditionInfo.OldPartNo;
                    ///新物料号
                    porderBomRepleaceRecordInfo.NewPartNo = bomRepleaceConditionInfo.NewPartNo;
                    ///旧供应商
                    porderBomRepleaceRecordInfo.OldSupplierNum = bomRepleaceConditionInfo.OldSupplierNum;
                    ///新供应商
                    porderBomRepleaceRecordInfo.NewSupplierNum = bomRepleaceConditionInfo.NewSupplierNum;
                    ///旧工位
                    porderBomRepleaceRecordInfo.OldLocation = bomRepleaceConditionInfo.OldLocation;
                    ///新工位
                    porderBomRepleaceRecordInfo.NewLocation = bomRepleaceConditionInfo.NewLocation;
                    ///旧物料版本
                    porderBomRepleaceRecordInfo.OldPartVersion = bomRepleaceConditionInfo.OldPartVersion;
                    ///新物料版本
                    porderBomRepleaceRecordInfo.NewPartVersion = bomRepleaceConditionInfo.NewPartVersion;
                    ///旧物料用量
                    porderBomRepleaceRecordInfo.OldPartQty = bomRepleaceConditionInfo.OldPartQty;
                    ///新物料用量
                    porderBomRepleaceRecordInfo.NewPartQty = bomRepleaceConditionInfo.NewPartQty;
                    ///替换时间
                    porderBomRepleaceRecordInfo.RepleaceTime = DateTime.Now;
                    ///状态 TODO:暂时没有想好干嘛的
                    porderBomRepleaceRecordInfo.Status = 10;
                    ///同时生成物料替换记录
                    @string.AppendFormat(PorderBomRepleaceRecordDAL.GetInsertSql(porderBomRepleaceRecordInfo));
                }
                //车型不为空
                if (bomRepleaceConditionVehicleInfo != null && @string.Length > 0)
                {
                    @string.AppendFormat("update [LES].[TT_BPM_BOM_REPLEACE_CONDITION_VEHICLE] set " +
                                         "[REPLEACED_VEHICLE_QTY]=isnull([REPLEACED_VEHICLE_QTY],0)+" + pullOrderBoms.Count + "," +
                                         "[MODIFY_DATE] = GETDATE()," +
                                         "[MODIFY_USER] = N'" + loginUser + "'" +
                                         "where [ID]=" + bomRepleaceConditionVehicleInfo.Id + "");
                }
            }
            if (@string.Length > 0 && bomRepleaceConditionInfos.Where(d => d.NewPartNo != d.OldPartNo || d.OldSupplierNum != d.NewSupplierNum || d.NewPartQty != d.OldPartQty).ToList().Count > 0)
            {
                ///在本更改单所有物料替换完成时还需生成一条状态为逆处理的生产订单中间表记录
                SapProductOrderInfo sapProductOrderInfo = SapProductOrderDAL.CreateSapProductOrderInfo(loginUser);
                ///订单号
                sapProductOrderInfo.Aufnr = pullOrdersInfo.OrderNo;
                ///处理状态
                sapProductOrderInfo.ProcessFlag = (int)ProcessFlagConstants.ConverseProgress;
                ///版本号
                sapProductOrderInfo.Verid = pullOrdersInfo.Version.ToString();
                @string.AppendFormat(SapProductOrderDAL.GetInsertSql(sapProductOrderInfo));
            }
            return(@string.ToString());
        }