/// <summary> /// JisPartBoxInfo - > jisCounterInfo /// </summary> /// <param name="jisPartBoxInfo"></param> /// <param name="jisCounterInfo"></param> private JisCounterInfo CreateJisCounterInfo(JisPartBoxInfo jisPartBoxInfo) { ///创建计数器 JisCounterInfo jisCounterInfo = JisCounterBLL.CreateJisCounterInfo(loginUser); ///以物料拉动信息填充计数器 JisCounterBLL.GetJisCounterInfo(jisPartBoxInfo, ref jisCounterInfo); /// jisCounterInfo.Id = new JisCounterBLL().InsertInfo(jisCounterInfo); if (jisCounterInfo.Id == 0) { throw new Exception("MC:0x00000454");///排序计数器创建失败 } return(jisCounterInfo); }
/// <summary> /// JIS /// </summary> /// <param name="vehiclePointStatusInfo"></param> /// <param name="jisPartBoxInfos"></param> /// <param name="jisCounterInfos"></param> /// <param name="jisMaintainInhouseLogisticStandardInfos"></param> /// <returns></returns> private string JisCounterDeal(VehiclePointStatusInfo vehiclePointStatusInfo, List <JisPartBoxInfo> jisPartBoxInfos, List <MaintainInhouseLogisticStandardInfo> jisMaintainInhouseLogisticStandardInfos) { /// StringBuilder stringBuilder = new StringBuilder(); ///根据车辆状态信息中的生产订单号①获取到对应的生产订单物料清单、此处为了保障执行效率,需要根据已获取的物料拉动信息过滤获取物料清单 List <PullOrderBomInfo> pullOrderBomInfos = new PullOrderBomBLL().GetList("" + "[ZORDNO] = N'" + vehiclePointStatusInfo.OrderNo + "' and " + "[ZCOMNO] in ('" + string.Join("','", jisMaintainInhouseLogisticStandardInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty); if (pullOrderBomInfos.Count == 0) { return(string.Empty); } /// foreach (JisPartBoxInfo jisPartBoxInfo in jisPartBoxInfos) { ///不是这个信息点的零件类忽略 if (vehiclePointStatusInfo.StatusPointCode != jisPartBoxInfo.StatusPointCode) { continue; } ///根据物料拉动信息外键获取计数器,未能成功获取时需要创建 JisCounterInfo jisCounterInfo = new JisCounterBLL().GetInfoByPartBoxFid(jisPartBoxInfo.Fid.GetValueOrDefault()); if (jisCounterInfo == null) { jisCounterInfo = CreateJisCounterInfo(jisPartBoxInfo); } ///零件类对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = jisMaintainInhouseLogisticStandardInfos.Where(d => d.InhousePartClass == jisPartBoxInfo.PartBoxCode).ToList(); if (maintainInhouseLogisticStandards.Count == 0) { continue; } ///零件类过滤后的物料拉动信息对应的物料清单 List <PullOrderBomInfo> pullOrderBoms = pullOrderBomInfos.Where(d => maintainInhouseLogisticStandards.Select(m => m.PartNo).Contains(d.Zcomno)).ToList(); if (pullOrderBoms.Count == 0) { continue; } ///当排序计数器的累计方式⑧为按车辆累计时 if (jisPartBoxInfo.AccumulativeType.GetValueOrDefault() == (int)JisAccumulativeTypeConstants.VehicleAccumulative) { ///本次可累计车辆数量 decimal vehicleQty = jisCounterInfo.AccumulativeQty.GetValueOrDefault() - jisCounterInfo.CurrentQty.GetValueOrDefault(); int vehicleCounterStatus = (int)JisCounterStatusConstants.Accumulating; if (vehicleQty == 1) { vehicleCounterStatus = (int)JisCounterStatusConstants.AccumulativeCompletion; } /// stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, 1, vehicleCounterStatus)); } /// foreach (PullOrderBomInfo pullOrderBom in pullOrderBoms) { ///匹配物料拉动信息的最小维度是 物料图号+供应商+工位,依次降低维度来获取唯一的物料拉动信息 MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandard = maintainInhouseLogisticStandards.FirstOrDefault(d => d.PartNo == pullOrderBom.Zcomno && d.SupplierNum == pullOrderBom.SupplierNum && d.Location == pullOrderBom.Zloc); ///物料图号+供应商 if (maintainInhouseLogisticStandard == null) { maintainInhouseLogisticStandard = maintainInhouseLogisticStandards.FirstOrDefault(d => d.PartNo == pullOrderBom.Zcomno && d.SupplierNum == pullOrderBom.SupplierNum); } ///物料图号 if (maintainInhouseLogisticStandard == null) { maintainInhouseLogisticStandard = maintainInhouseLogisticStandards.FirstOrDefault(d => d.PartNo == pullOrderBom.Zcomno); } ///未能成功获取到正确的物料拉动信息 if (maintainInhouseLogisticStandard == null) { continue; } ///当排序计数器的累计方式⑧为按车辆累计时 if (jisPartBoxInfo.AccumulativeType.GetValueOrDefault() == (int)JisAccumulativeTypeConstants.VehicleAccumulative) { stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, vehiclePointStatusInfo, maintainInhouseLogisticStandard, pullOrderBom.Zqty.GetValueOrDefault())); } ///当排序计数器的累计方式⑧为按器具累计时 if (jisPartBoxInfo.AccumulativeType.GetValueOrDefault() == (int)JisAccumulativeTypeConstants.UtensilAccumulative) { ///物料需求数量 decimal requireQty = pullOrderBom.Zqty.GetValueOrDefault(); while (requireQty > 0) { int jisCounterStatus = (int)JisCounterStatusConstants.Accumulating; ///本次可累计数量 decimal currentQty = jisCounterInfo.AccumulativeQty.GetValueOrDefault() - jisCounterInfo.CurrentQty.GetValueOrDefault(); if (currentQty == 0) { break; } ///需求大于本次可累计 if (currentQty <= requireQty) { ///剩余需累计数量 requireQty -= currentQty; ///累计完成 jisCounterStatus = (int)JisCounterStatusConstants.AccumulativeCompletion; } else { ///将需求赋予本次 currentQty = requireQty; ///需求清空 requireQty = 0; } /// stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, currentQty, jisCounterStatus)); /// stringBuilder.AppendLine(UpdateJisCounter(jisPartBoxInfo, jisCounterInfo, vehiclePointStatusInfo, maintainInhouseLogisticStandard, currentQty)); ///当剩余需求数量大于零时,需要创建计数器 if (requireQty > 0) { jisCounterInfo = CreateJisCounterInfo(jisPartBoxInfo); } } } ///触发层级拉动 stringBuilder.AppendLine(TwdCounterBLL.LevelPullRequirementCounter( maintainInhouseLogisticStandard, pullOrderBom.Zqty.GetValueOrDefault(), loginUser, jisCounterInfo.Fid.GetValueOrDefault(), jisCounterInfo.PartBoxCode)); } } return(stringBuilder.ToString()); }
/// <summary> /// Handler /// </summary> public void Handler() { ///获取排序零件类中状态㉖为已启用的数据 List <JisPartBoxInfo> jisPartBoxInfos = new JisPartBoxBLL().GetList(" and [STATUS] =" + (int)BasicDataStatusConstants.Enable + "", string.Empty); if (jisPartBoxInfos.Count == 0) { return; } ///获取零件类对应的计数器 List <JisCounterInfo> jisCounterInfos = new JisCounterBLL().GetList("and [PART_BOX_FID] in ('" + string.Join("','", jisPartBoxInfos.Select(d => d.Fid).ToArray()) + "')", string.Empty); if (jisCounterInfos.Count == 0) { return; } ///对应的排序计数器日志 List <JisCounterLogInfo> jisCounterLogInfos = new JisCounterLogBLL().GetList("and [COUNTER_FID] in ('" + string.Join("','", jisCounterInfos.Select(d => d.Fid).ToArray()) + "')", string.Empty); if (jisCounterLogInfos.Count == 0) { return; } ///计数器日志对应的生产订单 List <PullOrdersInfo> pullOrdersInfos = new PullOrdersBLL().GetList("and [ORDER_NO] in ('" + string.Join("','", jisCounterLogInfos.Select(d => d.SourceData).ToArray()) + "')", string.Empty); if (pullOrdersInfos.Count == 0) { return; } ///对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandardInfos = new MaintainInhouseLogisticStandardBLL().GetList("and [STATUS] =" + (int)BasicDataStatusConstants.Enable + "" + " and [INHOUSE_PART_CLASS] in ('" + string.Join("','", jisPartBoxInfos.Select(d => d.PartBoxCode).ToArray()) + "')" + " and [PART_NO] in ('" + string.Join("','", jisCounterLogInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty); if (maintainInhouseLogisticStandardInfos.Count == 0) { return; } foreach (JisPartBoxInfo jisPartBoxInfo in jisPartBoxInfos) { ///零件类对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = maintainInhouseLogisticStandardInfos.Where(d => d.InhousePartClass == jisPartBoxInfo.PartBoxCode).ToList(); ///计数器 List <JisCounterInfo> jisCounters = new List <JisCounterInfo>(); ///获取状态为20.累计完成的排序计数器 jisCounters = jisCounterInfos.Where(d => d.Status == (int)JisCounterStatusConstants.AccumulativeCompletion && d.PartBoxFid == jisPartBoxInfo.Fid).ToList(); ///若此时未能成功获取到状态为20.累计完成的排序计数器时,需要获取状态为10.正在累计的排序计数器,判断其创建时间加上最大累积时间是否已超过当前时间 if (jisCounters.Count == 0) { jisCounters = jisCounterInfos.Where(d => d.Status == (int)JisCounterStatusConstants.Accumulating && d.PartBoxFid == jisPartBoxInfo.Fid && d.CreateDate.AddMinutes(jisPartBoxInfo.MaxAccumulativeTime.GetValueOrDefault()) > DateTime.Now).ToList(); } if (jisCounters.Count == 0) { continue; } ///若已超过则需要首先标记排序计数器状态为20.累计完成,之后的逻辑按部就班走 BLL.LES.CommonBLL.ExecuteNonQueryBySql(@"update[LES].[TT_MPM_JIS_COUNTER] set [STATUS]=" + (int)JisCounterStatusConstants.AccumulativeCompletion + ",[MODIFY_DATE] = getdate(),[MODIFY_USER] = '" + loginUser + "' where [ID] in (" + string.Join(",", jisCounters.Select(d => d.Id).ToArray()) + ");"); ///根据计数器生成拉动单 foreach (JisCounterInfo jisCounterInfo in jisCounters) { ///sql StringBuilder stringBuilder = new StringBuilder(); ///对应的排序计数器日志 List <JisCounterLogInfo> jisCounterLogs = jisCounterLogInfos.Where(d => d.CounterFid == jisCounterInfo.Fid).ToList(); if (jisCounterLogs.Count == 0) { continue; } ///计数器日志物料对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogistics = (from maintainInhouseLogisticStandard in maintainInhouseLogisticStandards join jisCounterLog in jisCounterLogs on maintainInhouseLogisticStandard.PartNo equals jisCounterLog.PartNo select maintainInhouseLogisticStandard).ToList(); if (maintainInhouseLogistics.Count == 0) { continue; } switch (jisPartBoxInfo.JisPullMode.GetValueOrDefault()) { ///排序拉动 case (int)JisPullModeConstants.JisPull: stringBuilder.AppendFormat(JisPull(jisPartBoxInfo, jisCounterInfo, jisCounterLogs, maintainInhouseLogistics, pullOrdersInfos, true)); break; ///物料成套拉动 case (int)JisPullModeConstants.CompletePull: stringBuilder.AppendFormat(JisPull(jisPartBoxInfo, jisCounterInfo, jisCounterLogs, maintainInhouseLogistics, pullOrdersInfos, false)); break; default: continue; } ///数据库执行语句 if (stringBuilder.Length > 0) { stringBuilder.AppendFormat(@"update[LES].[TT_MPM_JIS_COUNTER] set [STATUS]=" + (int)JisCounterStatusConstants.GeneratedDocuments + ",[MODIFY_DATE] = getdate(),[MODIFY_USER] = '" + loginUser + "' where [ID] = " + jisCounterInfo.Id + "; "); using (TransactionScope trans = new TransactionScope()) { BLL.LES.CommonBLL.ExecuteNonQueryBySql(stringBuilder.ToString()); trans.Complete(); } } } } }