/// <summary>
 /// -> WmsVmiProductOrderInfo
 /// </summary>
 /// <param name="wmsVmiProductOrderInfo"></param>
 public static void GetWmsVmiProductOrderInfo(PullOrdersInfo pullOrdersInfo, ref WmsVmiProductOrderInfo info)
 {
     if (pullOrdersInfo == null)
     {
         return;
     }
     ///ORDER_NO,订单编号
     info.OrderNo = pullOrdersInfo.OrderNo;
     ///PART_NO,物料编号
     info.PartNo = pullOrdersInfo.PartNo;
     ///ORDER_DATE,订单日期
     info.OrderDate = pullOrdersInfo.OrderDate;
     ///ASSEMBLY_LINE,生产线
     info.AssemblyLine = pullOrdersInfo.AssemblyLine;
     ///QTY,数量
     info.Qty = 1;
     ///MODEL_YEAR,整车颜色
     info.ModelYear = pullOrdersInfo.ModelYear;
     ///SEQ,顺序
     info.Seq = Convert.ToInt32(pullOrdersInfo.VehicleOrder);
     ///WERKS,工厂代码
     info.Werks = pullOrdersInfo.Werk;
 }
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>
        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());
        }
 public static void GetPullOrdersInfo(ref PullOrdersInfo pullOrdersInfo)
 {
 }
 /// <summary>
 /// SapProductOrderInfo -> PullOrdersInfo
 /// </summary>
 /// <param name="sapProductOrderInfo"></param>
 /// <param name="pullOrdersInfo"></param>
 public static void GetPullOrdersInfo(SapProductOrderInfo sapProductOrderInfo, ref PullOrdersInfo info)
 {
     if (sapProductOrderInfo == null)
     {
         return;
     }
     ///ORDER_NO,订单号
     info.OrderNo = sapProductOrderInfo.Aufnr;
     ///MODEL_YEAR,车型颜色代码
     info.ModelYear = sapProductOrderInfo.CarColor;
     ///VEHICLE_ORDER,车辆顺序
     info.VehicleOrder = sapProductOrderInfo.OnlineSeq;
     ///PART_NO,物料号
     info.PartNo = sapProductOrderInfo.Matnr;
 }
        /// <summary>
        /// Create PullOrdersInfo
        /// </summary>
        /// <param name="loginUser"></param>
        /// <returns>PullOrdersInfo</returns>
        public static PullOrdersInfo CreatePullOrdersInfo(string loginUser)
        {
            PullOrdersInfo info = new PullOrdersInfo();

            ///FID,
            info.Fid = Guid.NewGuid();
            ///VALID_FLAG,
            info.ValidFlag = true;
            ///CREATE_USER,COMMON_CREATE_USER
            info.CreateUser = loginUser;
            ///CREATE_DATE,COMMON_CREATE_DATE
            info.CreateDate = DateTime.Now;
            ///VERSION,版本号
            info.Version = 1;

            ///MODEL,车型颜色代码描述
            info.Model = null;
            ///VIN,VIN
            info.Vin = null;
            ///VORSERIE,接口_VORSERIE
            info.Vorserie = null;
            ///SPJ,接口_SPJ
            info.Spj = null;
            ///KNR,接口_车辆识别号
            info.Knr = null;
            ///FARBAU,特征包代码
            info.Farbau = null;
            ///FARBIN,特征包代码描述
            info.Farbin = null;
            ///PNR_STRING,选项包代码
            info.PnrString = null;
            ///PNR_STRING_COMPUTE,选项包代码描述
            info.PnrStringCompute = null;
            ///DEAL_FLAG,处理标志
            info.DealFlag = null;
            ///STATUS_FLAG,状态标志
            info.StatusFlag = null;
            ///SIGNATURE,订单签名
            info.Signature = null;
            ///ORDER_FILE_NAME,订单文件名
            info.OrderFileName = null;
            ///ORDER_TYPE,订单类型
            info.OrderType = null;
            ///RECALCULATE_FLAG,重算标志
            info.RecalculateFlag = null;
            ///CHANGE_FLAG,变更标志
            info.ChangeFlag = null;
            ///PROCESS_LINE_SN,工艺路线编号
            info.ProcessLineSn = null;
            ///INIT_STSTUS,A00订单分解状态
            info.InitStstus = null;
            ///ORDER_STATUS,单据状态
            info.OrderStatus = null;
            ///QTY,物料数量
            info.Qty = null;
            ///MEASURING_UNIT,计量单位
            info.MeasuringUnit = null;
            ///ZCOLORI,内饰颜色代码
            info.Zcolori = null;
            ///ZCOLORI_D,内饰颜色描述
            info.ZcoloriD = null;
            ///PLAN_FLAG,计划标记
            info.PlanFlag = null;

            ///COMMENTS,COMMON_备注
            info.Comments = null;

            ///MODIFY_USER,COMMON_UPDATE_USER
            info.ModifyUser = null;
            ///MODIFY_DATE,COMMON_UPDATE_DATE
            info.ModifyDate = null;
            return(info);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Jis拉动
        /// </summary>
        /// <param name="jisPartBoxInfo"></param>
        /// <param name="jisCounterInfo"></param>
        /// <param name="jisCounterLogs"></param>
        /// <param name="maintainInhouseLogistics"></param>
        /// <param name="JisPullGuid"></param>
        /// <param name="orderCode"></param>
        /// <param name="pullOrdersInfos"></param>
        /// <param name="isJis"></param>
        /// <returns></returns>
        public string JisPull(JisPartBoxInfo jisPartBoxInfo, JisCounterInfo jisCounterInfo, List <JisCounterLogInfo> jisCounterLogs, List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogistics, List <PullOrdersInfo> pullOrdersInfos, bool isJis)
        {
            StringBuilder stringBuilder = new StringBuilder();
            ///拉动单Guid
            Guid JisPullGuid = Guid.NewGuid();
            ///拉动单号
            string orderCode = new SeqDefineBLL().GetCurrentCode("JIS_PULL_ORDER_CODE");
            ///单据衔接
            MaterialPullingOrderInfo materialPullingOrderInfo = MaterialPullingCommonBLL.CreateMaterialPullingOrderInfo();

            ///jisPartBoxInfo -> MaterialPullingOrderInfo
            MaterialPullingCommonBLL.GetJisMaterialPullingOrderInfo(jisPartBoxInfo, ref materialPullingOrderInfo);
            ///orderCode -> MaterialPullingOrderInfo
            MaterialPullingCommonBLL.GetorderCodeMaterialPullingOrderInfo(orderCode, ref materialPullingOrderInfo);
            foreach (JisCounterLogInfo jisCounterLog in jisCounterLogs)
            {
                ///物料拉动信息
                MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo = maintainInhouseLogistics.Where(d => d.PartNo == jisCounterLog.PartNo).FirstOrDefault();
                if (maintainInhouseLogisticStandardInfo == null)
                {
                    continue;
                }
                ///生产订单信息
                PullOrdersInfo pullOrdersInfo = pullOrdersInfos.FirstOrDefault(d => d.OrderNo == jisCounterLog.SourceData);
                if (pullOrdersInfo == null)
                {
                    continue;
                }
                ///仓储衔接明细表
                MaterialPullingOrderDetailInfo detailInfo = MaterialPullingCommonBLL.CreateMaterialPullingOrderDetailInfo();
                ///maintainInhouseLogisticStandardInfo -> MaterialPullingOrderDetailInfo
                MaterialPullingCommonBLL.GetMainMaterialPullingOrderDetailInfo(maintainInhouseLogisticStandardInfo, jisCounterLog.PartQty.GetValueOrDefault(), ref detailInfo);
                ///jisPartBoxInfo-> MaterialPullingOrderDetailInfo
                MaterialPullingCommonBLL.GetJisMaterialPullingOrderDetailInfo(jisPartBoxInfo, ref detailInfo);
                ///orderCode-> MaterialPullingOrderDetailInfo
                MaterialPullingCommonBLL.GetOrderCodeMaterialPullingOrderDetailInfo(orderCode, ref detailInfo);
                ///pullOrdersInfo-> MaterialPullingOrderDetailInfo
                MaterialPullingCommonBLL.GetPullOrderMaterialPullingOrderDetailInfo(pullOrdersInfo, ref detailInfo);
                ///Add
                materialPullingOrderInfo.MaterialPullingOrderDetailInfos.Add(detailInfo);
                if (isJis)
                {
                    ///排序拉动明细
                    stringBuilder.AppendFormat(CreateJisPullOrderDetailSql(JisPullGuid, materialPullingOrderInfo.MaterialPullingOrderDetailInfos));
                }
                else
                {
                    ///物料成套拉动明细
                    stringBuilder.AppendFormat(CreateCompletePullOrderDetailSql(JisPullGuid, materialPullingOrderInfo.MaterialPullingOrderDetailInfos));
                }
                if (stringBuilder.Length == 0)
                {
                    continue;
                }
            }
            if (isJis)
            {
                ///开始车号
                materialPullingOrderInfo.StartVehicheNo = materialPullingOrderInfo.MaterialPullingOrderDetailInfos.Min(d => d.DayVehicheSeqNo.GetValueOrDefault());
                ///结束车号
                materialPullingOrderInfo.EndVehicheNo = materialPullingOrderInfo.MaterialPullingOrderDetailInfos.Max(d => d.DayVehicheSeqNo.GetValueOrDefault());
                ///排序拉动主表
                stringBuilder.AppendFormat(CreateJisPullOrderSql(JisPullGuid, materialPullingOrderInfo));
            }
            else
            {
                ///车辆编号
                materialPullingOrderInfo.VehicheModelNo = materialPullingOrderInfo.MaterialPullingOrderDetailInfos.Select(d => d.VehicheModelNo).FirstOrDefault();
                ///生产订单号
                materialPullingOrderInfo.OrderNo = materialPullingOrderInfo.MaterialPullingOrderDetailInfos.Select(d => d.OrderNo).FirstOrDefault();
                ///物料成套拉动主表
                stringBuilder.AppendFormat(CreateCompletePullOrderSql(JisPullGuid, materialPullingOrderInfo));
            }
            ///仓储衔接
            stringBuilder.AppendFormat(MaterialPullingCommonBLL.Handler(materialPullingOrderInfo, loginUser));
            return(stringBuilder.ToString());
        }
Ejemplo n.º 8
0
        public void Handler()
        {
            ///获取获取车辆过点扫描数据中状态为10.待处理的数据
            List <MesVehiclePointScanInfo> mesVehiclePointScanInfos = new MesVehiclePointScanBLL().GetList("[PROCESS_FLAG]=" + (int)ProcessFlagConstants.Untreated + "", string.Empty);

            if (mesVehiclePointScanInfos.Count == 0)
            {
                return;
            }
            ///MES工厂集合
            List <PlantInfo> plantInfos = new PlantBLL().GetList("and [SAP_PLANT_CODE] in ('" + string.Join("','", mesVehiclePointScanInfos.Select(d => d.Enterprise).ToArray()) + "')", string.Empty);
            ///扫描点数据集合
            List <ScanPointInfo> scanPointInfos = new ScanPointBLL().GetList("and [PLANT] in ('" + string.Join("','", plantInfos.Select(d => d.Plant).ToArray()) + "')"
                                                                             + " and [MES_SCAN_POINT_CODE] in ('" + string.Join("','", mesVehiclePointScanInfos.Select(d => d.UnitNo).ToArray()) + "')", string.Empty);

            if (scanPointInfos.Count == 0)
            {
                return;
            }
            ///状态点集合
            List <StatusPointInfo> statusPointInfos = new StatusPointBLL().GetList(string.Empty, string.Empty);

            if (statusPointInfos.Count == 0)
            {
                return;
            }
            ///生产订单集合
            List <PullOrdersInfo> pullOrdersInfos = new PullOrdersBLL().GetList("and [ORDER_NO] in ('" + string.Join("','", mesVehiclePointScanInfos.Select(d => d.DmsNo).ToArray()) + "')", string.Empty);

            if (pullOrdersInfos.Count == 0)
            {
                return;
            }
            ///在系统配置中增加LES_VEHICLE_SEQ_STEP,默认为100,需要根据可在线车辆数量计算出这个值进行设定,在100%保障的情况下该值应被设定为最大可同时在线车辆数量
            string lesVehicleSeqStep = new ConfigBLL().GetValueByCode("LES_VEHICLE_SEQ_STEP");

            if (!int.TryParse(lesVehicleSeqStep, out int intLesVehicleSeqStep))
            {
                intLesVehicleSeqStep = 100;
            }
            ///逐条进行处理
            foreach (MesVehiclePointScanInfo mesVehiclePointScanInfo in mesVehiclePointScanInfos.OrderBy(d => d.Id).ToList())
            {
                ///sql语句
                StringBuilder stringBuilder = new StringBuilder();
                ///生产订单
                PullOrdersInfo pullOrdersInfo = pullOrdersInfos.Where(d => d.OrderNo == mesVehiclePointScanInfo.DmsNo).FirstOrDefault();
                if (pullOrdersInfo == null)
                {
                    continue;
                }
                ///逐条处理车辆过点信息
                stringBuilder.AppendFormat(VehicleCrossingScanSql(mesVehiclePointScanInfo, scanPointInfos, statusPointInfos, intLesVehicleSeqStep, pullOrdersInfo, plantInfos));
                ///执行
                if (stringBuilder.Length > 0)
                {
                    stringBuilder.AppendFormat(@"update [LES].[TI_IFM_MES_VEHICLE_POINT_SCAN] set [PROCESS_FLAG]=" + (int)ProcessFlagConstants.Processed + ",[PROCESS_TIME]=GETDATE(),[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE()");
                    using (TransactionScope trans = new TransactionScope())
                    {
                        BLL.LES.CommonBLL.ExecuteNonQueryBySql(stringBuilder.ToString());
                        trans.Complete();
                    }
                }
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 车辆过点信息处理
        /// </summary>
        /// <param name="mesVehiclePointScanInfo"></param>
        /// <param name="scanPointInfos"></param>
        /// <param name="statusPointInfos"></param>
        /// <param name="intLesVehicleSeqStep"></param>
        /// <returns></returns>
        public string VehicleCrossingScanSql(MesVehiclePointScanInfo mesVehiclePointScanInfo, List <ScanPointInfo> scanPointInfos, List <StatusPointInfo> statusPointInfos, int intLesVehicleSeqStep, PullOrdersInfo pullOrdersInfo, List <PlantInfo> plantInfos)
        {
            ///sql
            StringBuilder stringBuilder = new StringBuilder();
            ///根据采集点编号④ = MES扫描点③获取到唯一的扫描点代码①,此处需要匹配工厂编号① = 工厂④
            PlantInfo     plantInfo     = plantInfos.Where(d => d.SapPlantCode == mesVehiclePointScanInfo.Enterprise).First();
            ScanPointInfo scanPointInfo = scanPointInfos.Where(d => d.MesScanPointCode == mesVehiclePointScanInfo.UnitNo && d.Plant == plantInfo.Plant).FirstOrDefault();

            if (scanPointInfo == null)
            {
                return(string.Empty);
            }
            ///并根据唯一的扫描点代码①=④从状态点表中获取对应的状态点集合
            List <StatusPointInfo> statusPointByscanPointInfos = statusPointInfos.Where(d => d.ScanPointCode == scanPointInfo.ScanPointCode).ToList();

            if (statusPointByscanPointInfos.Count == 0)
            {
                return(string.Empty);
            }
            ///处理状态点集合
            foreach (StatusPointInfo statusPointInfo in statusPointByscanPointInfos)
            {
                ///当状态点数据中是否匹配生产线⑪=true时、需要根据计划订单号匹配生产订单⑥中对应的生产线、若是否匹配生产线⑪=false则无需进行匹配
                string assemblyLine = statusPointInfo.AssemblyLineFixedFlag.GetValueOrDefault() ? statusPointInfo.AssemblyLine : string.Empty;
                ///车辆状态点信息
                List <VehiclePointStatusInfo> vehiclePointStatusInfos = new VehiclePointStatusBLL().GetList("" +
                                                                                                            "[PLANT] = N'" + statusPointInfo.Plant + "' and " +
                                                                                                            "[WORKSHOP] = N'" + statusPointInfo.Workshop + "' and " +
                                                                                                            (string.IsNullOrEmpty(assemblyLine) ? string.Empty : "[ASSEMBLY_LINE] = N'" + assemblyLine + "' and ") +
                                                                                                            "[ORDER_NO] = N'" + mesVehiclePointScanInfo.DmsNo + "'", string.Empty);
                ///扫描点基础数据
                List <StatusPointInfo> statusPoints = new StatusPointBLL().GetList("" +
                                                                                   "[PLANT] = N'" + statusPointInfo.Plant + "' and " +
                                                                                   (string.IsNullOrEmpty(assemblyLine) ? string.Empty : "[ASSEMBLY_LINE] = N'" + assemblyLine + "' and ") +
                                                                                   "[WORKSHOP] = N'" + statusPointInfo.Workshop + "'", string.Empty);
                ///若没有数据则需要根据该维度获取状态点基础数据中对应的数据集合
                ///并以此集合为基础将信息匹配完成后批量写入车辆状态点信息
                long currentSeqNo = 0;

                #region 横向维度
                if (vehiclePointStatusInfos.Count == 0)
                {
                    ///首次批量插入一个生产订单在工厂⑨车间⑧或工厂⑨车间⑧生产线⑦维度范围内数据时
                    foreach (var statusPoint in statusPoints.OrderBy(d => d.StatusPointSeq.GetValueOrDefault()).ToList())
                    {
                        ///StatusPointInfo ->VehiclePointStatusInfo
                        VehiclePointStatusInfo pointStatusInfo = new VehiclePointStatusInfo();
                        ///ORDER_NO,生产订单号
                        pointStatusInfo.OrderNo = mesVehiclePointScanInfo.DmsNo;
                        ///STATUS_POINT_CODE,状态点代码
                        pointStatusInfo.StatusPointCode = statusPoint.StatusPointCode;
                        ///PLANT
                        pointStatusInfo.Plant = statusPoint.Plant;
                        ///Workshop
                        pointStatusInfo.Workshop = statusPoint.Workshop;
                        ///ASSEMBLY_LINE
                        pointStatusInfo.AssemblyLine = statusPoint.AssemblyLine;
                        ///SPJ
                        pointStatusInfo.Spj = pullOrdersInfo.Spj;
                        ///KNR
                        pointStatusInfo.Knr = pullOrdersInfo.Knr;
                        ///Schicht
                        pointStatusInfo.Schicht = null;
                        ///Shift
                        pointStatusInfo.Shift = null;
                        ///Vin
                        pointStatusInfo.Vin = pullOrdersInfo.Vin;
                        ///RunningNo
                        pointStatusInfo.RunningNo = mesVehiclePointScanInfo.DmsSeq.ToString();
                        ///PassTime,过点时间
                        pointStatusInfo.PassTime = null;
                        ///VehicleStatus,初始化
                        pointStatusInfo.VehicleStatus = (int)VehicleStatusTypeConstants.Initializtion;
                        ///ProcessFlag
                        pointStatusInfo.ProcessFlag = (int)ProcessFlagConstants.Untreated;
                        ///SeqNo,LES序号
                        pointStatusInfo.SeqNo = GetcurrentSeqNo(statusPoints, statusPointInfo, intLesVehicleSeqStep);
                        stringBuilder.AppendLine(VehiclePointStatusDAL.GetInsertSql(pointStatusInfo));
                    }
                    ///LES排序号
                    currentSeqNo = GetcurrentSeqNo(statusPoints, statusPointInfo, intLesVehicleSeqStep);
                    ///更新生产订单状态为已上线
                    stringBuilder.AppendFormat("update [LES].[TT_BAS_PULL_ORDERS] set " +
                                               "[ORDER_STATUS]=" + (int)OrderStatusConstants.AlreadOnline + "" +
                                               ",[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE() " +
                                               "where [ID] = " + pullOrdersInfo.Id + ";");
                }
                ///若已存在数据则首先需要将本采集点编号④对应的状态点代码②数据的过点时间⑦=⑦、车辆状态⑨更新
                ///车辆状态的更新目前已知的类型有初始化、正常过点、校验补入、车辆离队、车辆归队,需要枚举项VEHICLE_STATUS_TYPE支持
                else
                {
                    VehiclePointStatusInfo pointStatusInfo = vehiclePointStatusInfos.FirstOrDefault(d => d.StatusPointCode == statusPointInfo.StatusPointCode);
                    if (pointStatusInfo == null)
                    {
                        continue;
                    }
                    ///当车辆离队时,更新LES排序号⑬为零,车辆归队时重新计算车辆所在位置对应的LES排序号⑬,规则依照之前逻辑
                    ///离队标记
                    bool leaveFlag = false;
                    if (leaveFlag)
                    {
                        List <StatusPointInfo>        statuses = statusPoints.Where(d => d.StatusPointSeq.GetValueOrDefault() >= statusPointInfo.StatusPointSeq.GetValueOrDefault()).ToList();
                        List <VehiclePointStatusInfo> infos    = vehiclePointStatusInfos.Where(d => statuses.Select(s => s.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                        foreach (var info in infos)
                        {
                            stringBuilder.AppendLine("update [LES].[TT_BAS_VEHICLE_POINT_STATUS] " +
                                                     "set [VEHICLE_STATUS] = " + (int)VehicleStatusTypeConstants.VehicleLeave + ",[SEQ_NO] = 0,[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE() " +
                                                     "where [ID] = " + info.Id + ";");
                        }
                        ///更新生产订单状态为已离队
                        stringBuilder.AppendFormat("update [LES].[TT_BAS_PULL_ORDERS] set " +
                                                   "[ORDER_STATUS]=" + (int)OrderStatusConstants.Bryan + "" +
                                                   ",[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE() " +
                                                   "where [ID] = " + pullOrdersInfo.Id + ";");
                        continue;
                    }
                    ///车辆归队
                    if (pointStatusInfo.VehicleStatus == (int)VehicleStatusTypeConstants.VehicleLeave)
                    {
                        stringBuilder.AppendLine("update [LES].[TT_BAS_VEHICLE_POINT_STATUS] " +
                                                 "set [PASS_TIME] = N'" + mesVehiclePointScanInfo.SendTime.GetValueOrDefault() + "'," +
                                                 "[VEHICLE_STATUS] = " + (int)VehicleStatusTypeConstants.VehicleReturn + " ," +
                                                 "[SEQ_NO] = " + GetcurrentSeqNo(statusPoints, statusPointInfo, intLesVehicleSeqStep) + ",[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE()" +
                                                 "where [ID] = " + pointStatusInfo.Id + ";");
                        List <StatusPointInfo>        statuses = statusPoints.Where(d => d.StatusPointSeq.GetValueOrDefault() > statusPointInfo.StatusPointSeq.GetValueOrDefault()).ToList();
                        List <VehiclePointStatusInfo> infos    = vehiclePointStatusInfos.Where(d => statuses.Select(s => s.StatusPointCode).Contains(d.StatusPointCode)).ToList();
                        foreach (var info in infos)
                        {
                            stringBuilder.AppendLine("update [LES].[TT_BAS_VEHICLE_POINT_STATUS] " +
                                                     "set [VEHICLE_STATUS] = " + (int)VehicleStatusTypeConstants.Initializtion + " ," +
                                                     "[SEQ_NO] = " + GetcurrentSeqNo(statuses, statusPointInfo, intLesVehicleSeqStep) + " ,[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE()" +
                                                     "where [ID] = " + info.Id + ";");
                        }
                        ///更新生产订单状态为已归队
                        stringBuilder.AppendFormat("update [LES].[TT_BAS_PULL_ORDERS] set " +
                                                   "[ORDER_STATUS]=" + (int)OrderStatusConstants.ComeBack + "" +
                                                   ",[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE() " +
                                                   "where [ID] = " + pullOrdersInfo.Id + ";");
                    }
                    ///LES序号
                    currentSeqNo = pointStatusInfo.SeqNo.GetValueOrDefault();
                    DateTime currentTime = mesVehiclePointScanInfo.SendTime.GetValueOrDefault();
                    stringBuilder.AppendLine("update [LES].[TT_BAS_VEHICLE_POINT_STATUS] " +
                                             "set [PASS_TIME] = N'" + currentTime + "',[VEHICLE_STATUS] = " + (int)VehicleStatusTypeConstants.NormalPoint + " ,[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE()" +
                                             "where [ID] = " + pointStatusInfo.Id + ";");
                    ///对于状态点顺序在本次更新的车辆状态点信息之前的且车辆状态为初始化的数据需要更新其过点时间⑦、车辆状态⑨为校验补入
                    ///过点时间根据获取最近一条有过点时间⑦到本条车辆状态数据过点时间⑦的时间差按车辆状态⑨初始化的状态点数量平均分配计算赋值
                    List <VehiclePointStatusInfo> vehiclePointStatuses = vehiclePointStatusInfos.
                                                                         Where(d => d.VehicleStatus == (int)VehicleStatusTypeConstants.VehicleLeave && d.StatusPointCode != statusPointInfo.StatusPointCode).
                                                                         OrderByDescending(d => d.Id).
                                                                         ToList();
                    if (vehiclePointStatuses.Count == 0)
                    {
                        continue;
                    }
                    DateTime?lastTime = new VehiclePointStatusDAL().GetLastTime(
                        statusPointInfo.Plant,
                        statusPointInfo.Workshop,
                        statusPointInfo.StatusPointCode,
                        statusPointInfo.AssemblyLine);
                    TimeSpan timeSpan            = mesVehiclePointScanInfo.SendTime.GetValueOrDefault() - lastTime.GetValueOrDefault();
                    int      deductionSecondsPer = Convert.ToInt32(timeSpan.TotalSeconds) / (vehiclePointStatuses.Count - 1);
                    foreach (var vehiclePointStatuse in vehiclePointStatuses)
                    {
                        currentTime = currentTime.AddSeconds(0 - deductionSecondsPer);
                        stringBuilder.AppendLine("update [LES].[TT_BAS_VEHICLE_POINT_STATUS] set " +
                                                 "[PASS_TIME] = N'" + currentTime + "'," +
                                                 "[VEHICLE_STATUS] = " + (int)VehicleStatusTypeConstants.CheckAndFill + ",[MODIFY_USER]='" + loginUser + "',[MODIFY_DATE]=GETDATE() " +
                                                 "where [ID] = " + vehiclePointStatuse.Id + ";");
                    }
                    ///TODO:
                    ///当前过点类型为正常过点、车辆离队时触发以上逻辑
                    ///过点类型目前接口中未体现,后期需要增加,预先考虑逻辑放置位置,类型为车辆归队时只需更新本条记录即可
                    ///若接口中车辆归队与正常过点无法区分,则需要在车辆离队时将其状态标记在生产订单上,以便区别正常过点与车辆归队
                }
                ///以上为横向维度(同生产订单号)的处理逻辑
                #endregion

                ///以下为纵向维度(同状态点)的处理逻辑
                stringBuilder.AppendFormat(LongitudinalDimension(statusPoints, statusPointInfo, mesVehiclePointScanInfo, assemblyLine, currentSeqNo));
            }
            return(stringBuilder.ToString());
        }
Ejemplo n.º 10
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());
        }