/// <summary> /// TwdCounterInfo -> TwdCounterLogInfo /// </summary> /// <param name="twdCounterInfo"></param> /// <param name="info"></param> public static void GetTwdCounterLogInfo(TwdCounterInfo twdCounterInfo, ref TwdCounterLogInfo info) { if (twdCounterInfo == null) { return; } ///COUNTER_FID,计数器外键 info.CounterFid = twdCounterInfo.Fid; ///REQUIREMENT_ACCUMULATE_MODE,需求累计方式 info.RequirementAccumulateMode = twdCounterInfo.RequirementAccumulateMode; ///PART_NO,物料号 info.PartNo = twdCounterInfo.PartNo; ///PART_CNAME,物料中文描述 info.PartCname = twdCounterInfo.PartCname; ///SUPPLIER_NUM,供应商 info.SupplierNum = twdCounterInfo.SupplierNum; ///PLANT,工厂 info.Plant = twdCounterInfo.Plant; ///PLANT_ZONE,区域 info.PlantZone = twdCounterInfo.PlantZone; ///WORKSHOP,车间 info.Workshop = twdCounterInfo.Workshop; ///ASSEMBLY_LINE,生产线 info.AssemblyLine = twdCounterInfo.AssemblyLine; ///WORKSHOP_SECTION,工段 info.WorkshopSection = twdCounterInfo.WorkshopSection; ///LOCATION,工位 info.Location = twdCounterInfo.Location; ///PACKAGE,箱内数量 info.Package = twdCounterInfo.Package; ///PACKAGE_MODEL,包装容器 info.PackageModel = twdCounterInfo.PackageModel; }
/// <summary> /// TwdPartBoxInfo -> TwdCounterInfo /// </summary> /// <param name="twdPartBoxInfo"></param> /// <param name="twdCounterInfo"></param> public static void GetTwdCounterInfo(TwdPartBoxInfo twdPartBoxInfo, ref TwdCounterInfo twdCounterInfo) { if (twdPartBoxInfo == null) { return; } twdCounterInfo.RequirementAccumulateMode = twdPartBoxInfo.RequirementAccumulateMode; twdCounterInfo.RoundnessMode = twdPartBoxInfo.RoundnessMode; }
/// <summary> /// 创建 TwdCounterInfo /// </summary> /// <returns></returns> public static TwdCounterInfo CreateTwdCounterInfo(string loginUser) { TwdCounterInfo twdCounterInfo = new TwdCounterInfo(); twdCounterInfo.Fid = Guid.NewGuid(); twdCounterInfo.PartVersion = string.Empty;///TODO:物料版本 twdCounterInfo.CurrentQty = null; twdCounterInfo.Status = (int)BasicDataStatusConstants.Enable; twdCounterInfo.Comments = string.Empty; twdCounterInfo.ValidFlag = true; twdCounterInfo.CreateDate = DateTime.Now; twdCounterInfo.CreateUser = loginUser; return(twdCounterInfo); }
/// <summary> /// TWD /// </summary> /// <param name="vehiclePointStatusInfo"></param> /// <param name="twdCounterInfos"></param> /// <param name="twdMaintainInhouseLogisticStandardInfos"></param> /// <returns></returns> private string TwdCounterDeal(VehiclePointStatusInfo vehiclePointStatusInfo, List <TwdPartBoxInfo> twdPartBoxInfos, List <MaintainInhouseLogisticStandardInfo> twdMaintainInhouseLogisticStandardInfos) { /// StringBuilder stringBuilder = new StringBuilder(); ///根据车辆状态信息中的生产订单号①获取到对应的生产订单物料清单、此处为了保障执行效率,需要根据已获取的计数器的物料号⑩过滤获取物料清单 ///ZORDNO = 生产订单号 ///ZCOMNO = 物料图号 List <PullOrderBomInfo> pullOrderBomInfos = new PullOrderBomBLL().GetList("" + "[ZORDNO] = N'" + vehiclePointStatusInfo.OrderNo + "' and " + "[ZCOMNO] in ('" + string.Join("','", twdMaintainInhouseLogisticStandardInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty); if (pullOrderBomInfos.Count == 0) { return(string.Empty); } /// foreach (TwdPartBoxInfo twdPartBoxInfo in twdPartBoxInfos) { ///不是这个信息点的零件类忽略 if (vehiclePointStatusInfo.StatusPointCode != twdPartBoxInfo.StatusPointCode) { continue; } ///本零件类对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = twdMaintainInhouseLogisticStandardInfos.Where(d => d.InhousePartClass == twdPartBoxInfo.PartBoxCode).ToList(); ///若本零件类无物料拉动信息则返回 if (twdMaintainInhouseLogisticStandardInfos.Count == 0) { continue; } ///零件类过滤后的物料拉动信息对应的物料清单 List <PullOrderBomInfo> pullOrderBoms = pullOrderBomInfos.Where(d => maintainInhouseLogisticStandards.Select(m => m.PartNo).Contains(d.Zcomno)).ToList(); ///循环过滤后的物料清单 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; } ///根据物料拉动信息外键获取计数器,未能成功获取时需要创建 TwdCounterInfo twdCounterInfo = TwdCounterBLL.GetInfoByPartPullFid(maintainInhouseLogisticStandard.Fid); if (twdCounterInfo == null) { ///创建计数器 twdCounterInfo = TwdCounterBLL.CreateTwdCounterInfo(loginUser); ///以物料拉动信息填充计数器 TwdCounterBLL.GetTwdCounterInfo(maintainInhouseLogisticStandard, ref twdCounterInfo); ///以零件类信息填充计数器 TwdCounterBLL.GetTwdCounterInfo(twdPartBoxInfo, ref twdCounterInfo); /// twdCounterInfo.Id = new TwdCounterBLL().InsertInfo(twdCounterInfo); if (twdCounterInfo.Id == 0) { throw new Exception("MC:0x00000453");///时间窗计数器创建失败 } } ///计数器状态未处于启用 if (twdCounterInfo.Status != (int)BasicDataStatusConstants.Enable) { continue; } stringBuilder.AppendLine(TwdCounterBLL.UpdateTwdCounter(maintainInhouseLogisticStandard, twdPartBoxInfo, pullOrderBom.Zqty.GetValueOrDefault(), twdCounterInfo.Id, loginUser)); ///创建计数器日志 TwdCounterLogInfo twdCounterLogInfo = TwdCounterLogBLL.CreateTwdCounterLogInfo(twdCounterInfo.Fid.GetValueOrDefault(), loginUser); ///以车辆过点信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(vehiclePointStatusInfo, ref twdCounterLogInfo); ///以物料拉动信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(maintainInhouseLogisticStandard, ref twdCounterLogInfo); ///以零件类信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(twdPartBoxInfo, ref twdCounterLogInfo); ///PART_QTY twdCounterLogInfo.PartQty = pullOrderBom.Zqty.GetValueOrDefault(); /// stringBuilder.AppendLine(TwdCounterLogDAL.GetInsertSql(twdCounterLogInfo)); ///触发层级拉动 stringBuilder.AppendLine(TwdCounterBLL.LevelPullRequirementCounter( maintainInhouseLogisticStandard, pullOrderBom.Zqty.GetValueOrDefault(), loginUser, twdCounterInfo.Fid.GetValueOrDefault(), twdCounterInfo.PartBoxCode)); } } return(stringBuilder.ToString()); }
/// <summary> /// InsertInfo /// </summary> /// <param name="info"></param> /// <returns></returns> public long InsertInfo(TwdCounterInfo info) { return(dal.Add(info)); }
/// <summary> /// MaintainInhouseLogisticStandardInfo -> TwdCounterInfo /// </summary> /// <param name="maintainInhouseLogisticStandardInfo"></param> /// <param name="twdCounterInfo"></param> public static void GetTwdCounterInfo(MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo, ref TwdCounterInfo twdCounterInfo) { if (maintainInhouseLogisticStandardInfo == null) { return; } twdCounterInfo.PartPullFid = maintainInhouseLogisticStandardInfo.Fid; twdCounterInfo.PartBoxCode = maintainInhouseLogisticStandardInfo.InhousePartClass; twdCounterInfo.Plant = maintainInhouseLogisticStandardInfo.Plant; twdCounterInfo.PlantZone = maintainInhouseLogisticStandardInfo.PlantZone; twdCounterInfo.Workshop = maintainInhouseLogisticStandardInfo.Workshop; twdCounterInfo.AssemblyLine = maintainInhouseLogisticStandardInfo.AssemblyLine; twdCounterInfo.SupplierNum = maintainInhouseLogisticStandardInfo.SupplierNum; twdCounterInfo.PartNo = maintainInhouseLogisticStandardInfo.PartNo; twdCounterInfo.PartCname = maintainInhouseLogisticStandardInfo.PartCname; twdCounterInfo.WorkshopSection = maintainInhouseLogisticStandardInfo.WorkshopSection; twdCounterInfo.Location = maintainInhouseLogisticStandardInfo.Location; twdCounterInfo.Package = maintainInhouseLogisticStandardInfo.InboundPackage; twdCounterInfo.PackageModel = maintainInhouseLogisticStandardInfo.InboundPackageModel; }
/// <summary> /// 执行导入EXCEL数据 /// </summary> /// <param name="dataTable"></param> /// <param name="fieldNames"></param> /// <returns></returns> public bool ImportDataByExcel(DataTable dataTable, Dictionary <string, string> fieldNames, string loginUser) { List <TwdCounterInfo> twdCounterExcelInfos = CommonDAL.DatatableConvertToList <TwdCounterInfo>(dataTable).ToList(); if (twdCounterExcelInfos.Count == 0) { throw new Exception("MC:1x00000043");///数据格式不符合导入规范 } List <TwdCounterInfo> twdCounterInfos = dal.GetList("" + "[PART_BOX_CODE] in ('" + string.Join("','", twdCounterExcelInfos.Select(d => d.PartBoxCode).ToArray()) + "') and " + "[PART_NO] in ('" + string.Join("','", twdCounterExcelInfos.Select(d => d.PartNo).ToArray()) + "') and " + "[PACKAGE_MODEL] in ('" + string.Join("','", twdCounterExcelInfos.Select(d => d.PackageModel).ToArray()) + "')", string.Empty); List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandardInfos = new MaintainInhouseLogisticStandardDAL().GetList("" + "[INHOUSE_SYSTEM_MODE] = N'" + (int)PullModeConstants.Twd + "' and " + "[INHOUSE_PART_CLASS] in ('" + string.Join("','", twdCounterExcelInfos.Select(d => d.PartBoxCode).ToArray()) + "') and " + "[PART_NO] in ('" + string.Join("','", twdCounterExcelInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty); ///获取零件类信息 List <TwdPartBoxInfo> twdPartBoxInfos = new TwdPartBoxDAL().GetList("" + "[PART_BOX_CODE] in ('" + string.Join("','", twdCounterExcelInfos.Select(d => d.PartBoxCode).ToArray()) + "')", string.Empty); StringBuilder @string = new StringBuilder(); foreach (TwdCounterInfo twdCounterExcelInfo in twdCounterExcelInfos) { /// 零件类代码②、工厂③车间⑤生产线⑥工段⑬工位⑭、物料号⑩、物料版本⑫、包装容器⑰为联合主键,差异数量DiffQty作为累加当前计数⑮的依据,备注直接更新 TwdCounterInfo twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel && d.Plant == twdCounterExcelInfo.Plant && d.Workshop == twdCounterExcelInfo.Workshop && d.AssemblyLine == twdCounterExcelInfo.AssemblyLine && d.WorkshopSection == twdCounterExcelInfo.WorkshopSection && d.Location == twdCounterExcelInfo.Location && d.PartVersion == twdCounterExcelInfo.PartVersion); #region 逐步减低维度处理 if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel && d.Plant == twdCounterExcelInfo.Plant && d.Workshop == twdCounterExcelInfo.Workshop && d.AssemblyLine == twdCounterExcelInfo.AssemblyLine && d.WorkshopSection == twdCounterExcelInfo.WorkshopSection && d.Location == twdCounterExcelInfo.Location); } if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel && d.Plant == twdCounterExcelInfo.Plant && d.Workshop == twdCounterExcelInfo.Workshop && d.AssemblyLine == twdCounterExcelInfo.AssemblyLine && d.WorkshopSection == twdCounterExcelInfo.WorkshopSection); } if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel && d.Plant == twdCounterExcelInfo.Plant && d.Workshop == twdCounterExcelInfo.Workshop && d.AssemblyLine == twdCounterExcelInfo.AssemblyLine); } if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel && d.Plant == twdCounterExcelInfo.Plant && d.Workshop == twdCounterExcelInfo.Workshop); } if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel && d.Plant == twdCounterExcelInfo.Plant); } if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo && d.PackageModel == twdCounterExcelInfo.PackageModel); } if (twdCounterInfo == null) { twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartBoxCode == twdCounterExcelInfo.PartBoxCode && d.PartNo == twdCounterExcelInfo.PartNo); } if (twdCounterInfo == null) { throw new Exception("MC:0x00000255");///数据格式不符合导入规范 } #endregion if (twdCounterInfo.Status.GetValueOrDefault() == (int)BasicDataStatusConstants.Disabled) { throw new Exception("MC:0x00000455");///计数器已作废不能修改数量 } @string.AppendLine("update [LES].[TT_MPM_TWD_COUNTER] set " + "[CURRENT_QTY] = isnull([CURRENT_QTY],0) + " + twdCounterExcelInfo.DiffQty + "," + "[MODIFY_USER] = N'" + loginUser + "'," + "[MODIFY_DATE] = GETDATE() where " + "[ID] = " + twdCounterInfo.Id + ";"); ///根据计数器的物料拉动信息外键获取物料拉动信息 MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo = maintainInhouseLogisticStandardInfos.FirstOrDefault(d => d.Fid == twdCounterInfo.PartPullFid.GetValueOrDefault()); if (maintainInhouseLogisticStandardInfo == null) { throw new Exception("MC:0x00000213");///物料拉动信息数据错误 } if (maintainInhouseLogisticStandardInfo.Status.GetValueOrDefault() != (int)BasicDataStatusConstants.Enable) { throw new Exception("MC:0x00000233");///没有已启用的物料拉动信息 } ///获取零件类信息 TwdPartBoxInfo twdPartBoxInfo = twdPartBoxInfos.FirstOrDefault(d => d.PartBoxCode == maintainInhouseLogisticStandardInfo.InhousePartClass); ///未能成功获取零件类信息 if (twdPartBoxInfo == null) { throw new Exception("MC:0x00000225");///拉动零件类数据错误 } ///零件类未启用 if (twdPartBoxInfo.Status.GetValueOrDefault() != (int)BasicDataStatusConstants.Enable) { throw new Exception("MC:0x00000456");///零件类未启用 } ///创建计数器日志 TwdCounterLogInfo twdCounterLogInfo = TwdCounterLogBLL.CreateTwdCounterLogInfo(twdCounterInfo.Fid.GetValueOrDefault(), loginUser); ///以物料拉动信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(maintainInhouseLogisticStandardInfo, ref twdCounterLogInfo); ///以零件类信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(twdPartBoxInfo, ref twdCounterLogInfo); ///PART_QTY twdCounterLogInfo.PartQty = twdCounterExcelInfo.DiffQty; ///SOURCE_DATA_FID twdCounterLogInfo.SourceDataFid = twdCounterInfo.Fid; ///SOURCE_DATA_TYPE twdCounterLogInfo.SourceDataType = (int)TwdCounterSourceDataTypeConstants.Manual; ///SOURCE_DATA twdCounterLogInfo.SourceData = twdCounterInfo.PartBoxCode; ///Comments twdCounterLogInfo.Comments = twdCounterExcelInfo.Comments; /// @string.AppendLine(TwdCounterLogDAL.GetInsertSql(twdCounterLogInfo)); ///触发层级拉动 @string.AppendLine(LevelPullRequirementCounter( maintainInhouseLogisticStandardInfo, twdCounterExcelInfo.DiffQty, loginUser, twdCounterInfo.Fid.GetValueOrDefault(), twdCounterInfo.PartBoxCode)); } ///执行 using (var trans = new TransactionScope()) { if (@string.Length == 0) { throw new Exception("MC:0x00000283");///没有可导入更新的数据 } CommonDAL.ExecuteNonQueryBySql(@string.ToString()); trans.Complete(); } /// return(true); }
/// <summary> /// 对于MPM-036逻辑进行函数封装 /// </summary> /// <param name="emergencyPullingCartInfos"></param> /// <param name="loginUser"></param> public static string Handler(List <EmergencyPullingCartInfo> emergencyPullingCartInfos, string loginUser) { ///执行语句 StringBuilder @string = new StringBuilder(); ///获取系统配置是否允许过量提前拉动 string allowedFlag = new ConfigDAL().GetValueByCode("ENABLE_EXCEED_COUNTER_QTY_WHEN_ADVANCE_PULL"); ///接收紧急拉动购物车对象集合进行处理 if (emergencyPullingCartInfos.Count == 0) { throw new Exception("MC:0x00000084");///数据错误 } ///对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandardInfos = new MaintainInhouseLogisticStandardBLL().GetList("" + " and [STATUS] =" + (int)BasicDataStatusConstants.Enable + "" + " and [FID] in ('" + string.Join("','", emergencyPullingCartInfos.Select(d => d.LogisticStandardFid).ToArray()) + "')", string.Empty); if (maintainInhouseLogisticStandardInfos.Count == 0) { throw new Exception("MC:0x00000213");///物料拉动信息数据错误 } ///首先需要将其按照拉动方式、零件类进行分组,每个分组产生一张紧急拉动单 var cartGroups = emergencyPullingCartInfos.GroupBy(d => new { d.PullMode, d.PartBoxCode }).ToList(); #region 手工拉动 PLAN var planCartGroups = cartGroups.Where(d => d.Key.PullMode == (int)PullModeConstants.Plan).ToList(); ///计划拉动零件类 List <PlanPartBoxInfo> planPartBoxInfos = new PlanPartBoxBLL().GetList("" + " and [STATUS] = " + (int)BasicDataStatusConstants.Enable + "" + " and [PART_BOX_CODE] in ('" + string.Join("','", planCartGroups.Select(d => d.Key.PartBoxCode).ToArray()) + "')", string.Empty); foreach (var planCartGroup in planCartGroups) { ///从参数集合从提取对应的紧急拉动购物车集合 List <EmergencyPullingCartInfo> pullingCartInfos = emergencyPullingCartInfos.Where(d => d.PullMode == planCartGroup.Key.PullMode && d.PartBoxCode == planCartGroup.Key.PartBoxCode).ToList(); if (pullingCartInfos.Count == 0) { continue; } ///计划零件类 PlanPartBoxInfo planPartBoxInfo = planPartBoxInfos.FirstOrDefault(d => d.PartBoxCode == planCartGroup.Key.PartBoxCode); if (planPartBoxInfo == null) { continue; } ///计划拉动-->仓储衔接主表 MaterialPullingOrderInfo materialPulling = MaterialPullingCommonBLL.CreateMaterialPullingOrderInfo(); ///计划拉动单主表 PlanPullOrderInfo planPullOrderInfo = PlanPullOrderBLL.CreatePlanPullOrder(loginUser); ///OrderType 拉动单类型 planPullOrderInfo.OrderType = (int)PullOrderTypeConstants.Emergency; ///PlanPartBoxInfo-->PlanPullOrderInfo PlanPullOrderBLL.GetPlanPullOrder(planPartBoxInfo, ref planPullOrderInfo); ///计划拉动单主表sql @string.AppendLine(PlanPullOrderDAL.GetInsertSql(planPullOrderInfo)); ///PlanPullOrderInfo -> MaterialPullingOrderInfo MaterialPullingCommonBLL.GetMaterialPlanPullingOrderInfo(planPullOrderInfo, ref materialPulling); foreach (EmergencyPullingCartInfo planCartInfo in pullingCartInfos) { ///物料拉动信息 MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo = maintainInhouseLogisticStandardInfos.FirstOrDefault(d => d.Fid == planCartInfo.LogisticStandardFid); if (maintainInhouseLogisticStandardInfo == null) { continue; } ///物料包装数量在此需要根据单包装数量以及物料需求数量进行向上圆整计算 ///REQUIRED_BOX_QTY:物料包装数量 PULL_PACKAGE_QTY:单包装数量 REQUIRED_PART_QTY:物料需求数量 if (planCartInfo.PullPackageQty.GetValueOrDefault() == 0) { continue; ///O不能做被除数 } planCartInfo.RequiredBoxQty = Convert.ToInt32(Math.Ceiling(planCartInfo.RequiredPartQty.GetValueOrDefault() / planCartInfo.PullPackageQty.GetValueOrDefault())); ///仓储衔接明细表 MaterialPullingOrderDetailInfo detailInfo = MaterialPullingCommonBLL.CreateMaterialPullingOrderDetailInfo(); ///计划拉动单明细 PlanPullOrderDetailInfo planPullOrderDetailInfo = PlanPullOrderDetailBLL.CreatePlanPullOrderDetail(loginUser); ///MaintainInhouseLogisticStandardInfo -> PlanPullOrderDetailInfo PlanPullOrderDetailBLL.GetPlanPullOrderDetail(maintainInhouseLogisticStandardInfo, ref planPullOrderDetailInfo); ///TwdPullOrderInfo -> TwdPullOrderDetailInfo PlanPullOrderDetailBLL.GetPlanPullOrderDetailInfo(planPullOrderInfo, ref planPullOrderDetailInfo); ///RequiredPackageQty planPullOrderDetailInfo.RequiredPackageQty = planCartInfo.RequiredBoxQty.GetValueOrDefault(); ///RequiredPartQty planPullOrderDetailInfo.RequiredPartQty = planCartInfo.RequiredPartQty.GetValueOrDefault(); ///计划拉动明细sql @string.AppendLine(PlanPullOrderDetailDAL.GetInsertSql(planPullOrderDetailInfo)); ///PlanPullOrderDetailInfo -> MaterialPullingOrderDetailInfo MaterialPullingCommonBLL.GetMaterialPullingOrderDetail(planPullOrderDetailInfo, ref detailInfo); ///仓储明细集合Add materialPulling.MaterialPullingOrderDetailInfos.Add(detailInfo); } ///拉动单生成后需要调用拉动仓储衔接函数获取语句 @string.AppendLine(MaterialPullingCommonBLL.Handler(materialPulling, loginUser)); } #endregion #region 提前拉动 TWD var twdCartGroups = cartGroups.Where(d => d.Key.PullMode == (int)PullModeConstants.Pcs || d.Key.PullMode == (int)PullModeConstants.Twd).ToList(); ///TWD计数器 List <TwdCounterInfo> twdCounterInfos = new TwdCounterBLL().GetList("" + "[STATUS] =" + (int)BasicDataStatusConstants.Enable + " and " + "[PART_PULL_FID] in ('" + string.Join("','", maintainInhouseLogisticStandardInfos.Select(d => d.Fid).ToArray()) + "') and " + "isnull([CURRENT_QTY],0) > 0", string.Empty); ///TWD零件类 List <TwdPartBoxInfo> twdPartBoxInfos = new TwdPartBoxBLL().GetList("" + "[STATUS] =" + (int)BasicDataStatusConstants.Enable + " and " + "[PART_BOX_CODE] in ('" + string.Join("','", twdCartGroups.Select(d => d.Key.PartBoxCode).ToArray()) + "')", string.Empty); foreach (var twdCartGroup in twdCartGroups) { ///从参数集合从提取对应的紧急拉动购物车集合 List <EmergencyPullingCartInfo> pullingCartInfos = emergencyPullingCartInfos.Where(d => d.PullMode == twdCartGroup.Key.PullMode && d.PartBoxCode == twdCartGroup.Key.PartBoxCode).ToList(); if (pullingCartInfos.Count == 0) { continue; } ///TWD零件类 TwdPartBoxInfo twdPartBoxInfo = twdPartBoxInfos.FirstOrDefault(d => d.PartBoxCode == twdCartGroup.Key.PartBoxCode); if (twdPartBoxInfo == null) { continue; } ///触发层级拉动的集合 List <EmergencyPullingCartInfo> pullingLevelCartInfos = pullingCartInfos.Where(d => d.TriggerPullFlag == true).ToList(); foreach (EmergencyPullingCartInfo pullingLevelCartInfo in pullingLevelCartInfos) { ///需要根据其物料拉动信息外键获取对应的计数器数据(状态必须为已启用) TwdCounterInfo twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartPullFid == pullingLevelCartInfo.LogisticStandardFid.GetValueOrDefault() && d.Status == (int)BasicDataStatusConstants.Enable); if (twdCounterInfo == null) { continue; } ///在此之前需要根据物料图号、供应商、层级仓库、层级存储区在物料拉动信息中获取匹配的目标仓库、目标存储区数据 MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo = maintainInhouseLogisticStandardInfos.FirstOrDefault(d => d.PartNo == pullingLevelCartInfo.PartNo && d.SupplierNum == pullingLevelCartInfo.SupplierNum && d.WmNo == pullingLevelCartInfo.TriggerWmNo && d.ZoneNo == pullingLevelCartInfo.TriggerZoneNo); ///触发层级拉动 @string.AppendFormat(TwdCounterBLL.LevelPullCounter(maintainInhouseLogisticStandardInfo, pullingLevelCartInfo.RequiredPartQty.GetValueOrDefault(), loginUser, twdCounterInfo.Fid.GetValueOrDefault(), twdPartBoxInfo)); } ///提前拉动的集合 List <EmergencyPullingCartInfo> advancePullCartInfos = pullingCartInfos.Where(d => d.TriggerPullFlag == false && d.EmergencyPullMode == (int)EmergencyPullModeConstants.AdvancePull).ToList(); if (advancePullCartInfos.Count == 0) { continue; } ///仓储衔接主表 MaterialPullingOrderInfo materialPulling = MaterialPullingCommonBLL.CreateMaterialPullingOrderInfo(); ///TWD拉动单主表 TwdPullOrderInfo twdPullOrderInfo = TwdPullOrderBLL.CreateTwdPullOrderInfo(loginUser); ///TwdPartBoxInfo -> TwdPullOrderInfo TwdPullOrderBLL.GetTwdPullOrderInfo(twdPartBoxInfo, ref twdPullOrderInfo); ///TWD拉动单主表sql @string.AppendLine(TwdPullOrderDAL.GetInsertSql(twdPullOrderInfo)); ///TwdPullOrderInfo-->MaterialPullingOrderInfo MaterialPullingCommonBLL.GetMaterialPullingOrderInfo(twdPullOrderInfo, ref materialPulling); int rowNo = 0; ///行号 ///逐条循环每个购物车 foreach (EmergencyPullingCartInfo advancePullCartInfo in advancePullCartInfos) { ///需要根据其物料拉动信息外键获取对应的计数器数据(状态必须为已启用) ///TT_MPM_TWD_COUNTER TWD计数器 TwdCounterInfo twdCounterInfo = twdCounterInfos.FirstOrDefault(d => d.PartPullFid == advancePullCartInfo.LogisticStandardFid.GetValueOrDefault() && d.Status == (int)BasicDataStatusConstants.Enable); if (twdCounterInfo == null) { continue; } ///物料拉动信息 MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandardInfo = maintainInhouseLogisticStandardInfos.FirstOrDefault(d => d.Fid == advancePullCartInfo.LogisticStandardFid); if (maintainInhouseLogisticStandardInfo == null) { continue; } ///物料包装数量在此需要根据单包装数量以及物料需求数量进行向上圆整计算 ///REQUIRED_BOX_QTY:物料包装数量 PULL_PACKAGE_QTY:单包装数量 REQUIRED_PART_QTY:物料需求数量 if (advancePullCartInfo.PullPackageQty.GetValueOrDefault() == 0) { continue; ///O不能做被除数 } advancePullCartInfo.RequiredBoxQty = Convert.ToInt32(Math.Ceiling(advancePullCartInfo.RequiredPartQty.GetValueOrDefault() / advancePullCartInfo.PullPackageQty.GetValueOrDefault())); ///若该系统配置标记为false时、计数器当前累计数量不允许小于购物车物料需求数量, if (allowedFlag.ToLower() == "false" && twdCounterInfo.CurrentQty.GetValueOrDefault() < advancePullCartInfo.RequiredPartQty.GetValueOrDefault()) { continue; } ///仓储衔接明细表 MaterialPullingOrderDetailInfo detailInfo = MaterialPullingCommonBLL.CreateMaterialPullingOrderDetailInfo(); ///TWD明细表 TwdPullOrderDetailInfo pullOrderDetailInfo = TwdPullOrderDetailBLL.CreateTwdPullOrderDetailInfo(loginUser); ///MaintainInhouseLogisticStandardInfo -> TwdPullOrderDetailInfo TwdPullOrderDetailBLL.GetTwdPullOrderDetailInfo(maintainInhouseLogisticStandardInfo, ref pullOrderDetailInfo); ///TwdPullOrderInfo -> TwdPullOrderDetailInfo TwdPullOrderDetailBLL.GetTwdPullOrderDetailInfo(twdPullOrderInfo, ref pullOrderDetailInfo); ///ROW_NO,行号 pullOrderDetailInfo.RowNo = ++rowNo; ///REQUIRED_PACKAGE_QTY,需求包装数 pullOrderDetailInfo.RequiredPackageQty = advancePullCartInfo.RequiredBoxQty.GetValueOrDefault(); ///REQUIRED_PART_QTY,需求物料数量 pullOrderDetailInfo.RequiredPartQty = advancePullCartInfo.RequiredPartQty.GetValueOrDefault(); ///TWD明细表sql @string.AppendLine(TwdPullOrderDetailDAL.GetInsertSql(pullOrderDetailInfo)); ///TwdPullOrderDetailInfo -> MaterialPullingOrderDetailInfo MaterialPullingCommonBLL.GetMaterialPullingOrderDetailInfo(pullOrderDetailInfo, ref detailInfo); ///仓储衔接集合Add materialPulling.MaterialPullingOrderDetailInfos.Add(detailInfo); ///否则直接对计数器的当前累计数量按购物车物料需求数量进行扣减 @string.AppendLine("update [LES].[TT_MPM_TWD_COUNTER] " + "set [CURRENT_QTY] = isnull([CURRENT_QTY],0) - " + advancePullCartInfo.RequiredPartQty.GetValueOrDefault() + "," + "[MODIFY_DATE] = GETDATE()," + "[MODIFY_USER] = N'" + loginUser + "' " + "where [ID]= " + twdCounterInfo.Id + ";"); ///同时记录计数器日志并标记其类型为提前拉动 TwdCounterLogInfo twdCounterLogInfo = TwdCounterLogBLL.CreateTwdCounterLogInfo(twdCounterInfo.Fid.GetValueOrDefault(), loginUser); ///TwdCounterInfo -> TwdCounterLogInfo TwdCounterLogBLL.GetTwdCounterLogInfo(twdCounterInfo, ref twdCounterLogInfo); ///PART_QTY,物料数量 twdCounterLogInfo.PartQty = 0 - advancePullCartInfo.RequiredPartQty.GetValueOrDefault(); ///SOURCE_DATA,目视来源数据 twdCounterLogInfo.SourceData = twdPullOrderInfo.OrderCode; ///SOURCE_DATA_FID,数据来源外键 twdCounterLogInfo.SourceDataFid = twdPullOrderInfo.Fid; ///SOURCE_DATA_TYPE,数据来源类型 twdCounterLogInfo.SourceDataType = (int)TwdCounterSourceDataTypeConstants.AdvancePull; ///计数器日志sql @string.AppendLine(TwdCounterLogDAL.GetInsertSql(twdCounterLogInfo)); } ///拉动单生成后需要调用拉动仓储衔接函数获取语句 @string.AppendLine(MaterialPullingCommonBLL.Handler(materialPulling, loginUser)); } #endregion return(@string.ToString()); }
/// <summary> /// 主函数 /// </summary> public void Handler() { ///获取需求累计方式㉒为库存当量的零件类TM_MPM_TWD_PART_BOX List <TwdPartBoxInfo> twdPartBoxInfos = new TwdPartBoxBLL().GetList("" + "[REQUIREMENT_ACCUMULATE_MODE] = " + (int)RequirementAccumulateModeConstants.InventoryEquivalent + " and " + "[STATUS] = " + (int)BasicDataStatusConstants.Enable + "", string.Empty); if (twdPartBoxInfos.Count == 0) { return; } ///同时获取对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandardInfos = new MaintainInhouseLogisticStandardBLL().GetList("" + "[STATUS] = " + (int)BasicDataStatusConstants.Enable + " and " + "[INHOUSE_SYSTEM_MODE] = N'" + (int)PullModeConstants.Twd + "' and " + "[INHOUSE_PART_CLASS] in ('" + string.Join("','", twdPartBoxInfos.Select(d => d.PartBoxCode).ToArray()) + "')", string.Empty); if (maintainInhouseLogisticStandardInfos.Count == 0) { return; } ///根据物料拉动信息中的工厂③目标仓库⑩存储区⑪和物料号获取库存数据 List <StocksInfo> stocksInfos = new StocksBLL().GetList("" + "[PLANT] in ('" + string.Join("','", maintainInhouseLogisticStandardInfos.Select(d => d.Plant).ToArray()) + "') and " + "[WM_NO] in ('" + string.Join("','", maintainInhouseLogisticStandardInfos.Select(d => d.TWmNo).ToArray()) + "') and " + "[ZONE_NO] in ('" + string.Join("','", maintainInhouseLogisticStandardInfos.Select(d => d.TZoneNo).ToArray()) + "') and " + "[PART_NO] in ('" + string.Join("','", maintainInhouseLogisticStandardInfos.Select(d => d.PartNo).ToArray()) + "')", string.Empty); StringBuilder stringBuilder = new StringBuilder(); ///以零件类进行循环 foreach (TwdPartBoxInfo twdPartBoxInfo in twdPartBoxInfos) { ///获取零件类对应的物料拉动信息 List <MaintainInhouseLogisticStandardInfo> maintainInhouseLogisticStandards = maintainInhouseLogisticStandardInfos.Where(d => d.InhousePartClass == twdPartBoxInfo.PartBoxCode).ToList(); if (maintainInhouseLogisticStandards.Count == 0) { continue; } ///物料拉动信息 foreach (MaintainInhouseLogisticStandardInfo maintainInhouseLogisticStandard in maintainInhouseLogisticStandards) { ///当系统配置中库存供应商维度标记 = true时,在过滤库存数据时需要考虑供应商 ///若物料拉动信息中未维护供应商信息则不考虑,因为两个标记同时符合时才会考虑 string supplierNum = string.Empty; if (supplier_stocks_dimension.ToLower() == "true" && !string.IsNullOrEmpty(maintainInhouseLogisticStandard.SupplierNum)) { supplierNum = maintainInhouseLogisticStandard.SupplierNum; } ///将工厂③目标仓库⑩存储区⑪物料号或增加供应商维度的过滤完成的库存数据集合中的可用数量进行汇总 ///当前库存 decimal avaibleQty = new StocksBLL().GetAvailbleQty( maintainInhouseLogisticStandard.PartNo, maintainInhouseLogisticStandard.TWmNo, maintainInhouseLogisticStandard.TZoneNo, supplierNum); ///根据获得的物料拉动信息外键获取计数器 TwdCounterInfo twdCounterInfo = TwdCounterBLL.GetInfoByPartPullFid(maintainInhouseLogisticStandard.Fid); if (twdCounterInfo == null) { ///创建计数器 twdCounterInfo = TwdCounterBLL.CreateTwdCounterInfo(loginUser); ///以物料拉动信息填充计数器 TwdCounterBLL.GetTwdCounterInfo(maintainInhouseLogisticStandard, ref twdCounterInfo); ///以零件类信息填充计数器 TwdCounterBLL.GetTwdCounterInfo(twdPartBoxInfo, ref twdCounterInfo); /// twdCounterInfo.Id = new TwdCounterBLL().InsertInfo(twdCounterInfo); if (twdCounterInfo.Id == 0) { throw new Exception("MC:0x00000453");///时间窗计数器创建失败 } } ///计数器状态未处于启用 if (twdCounterInfo.Status != (int)BasicDataStatusConstants.Enable) { continue; } ///在途库存,已累积 + 已生成未完成TODO: decimal onroadQty = twdCounterInfo.CurrentQty.GetValueOrDefault(); ///当可用数量小于等于物料拉动信息中的拉动最小值时,将拉动最大值减去汇总数量得到的则为本次需求数量 if (avaibleQty + onroadQty > maintainInhouseLogisticStandard.Min.GetValueOrDefault()) { continue; } ///本次需求数量 decimal requireQty = maintainInhouseLogisticStandard.Max.GetValueOrDefault() - avaibleQty - onroadQty; /// stringBuilder.AppendLine(TwdCounterBLL.UpdateTwdCounter(maintainInhouseLogisticStandard, twdPartBoxInfo, requireQty, twdCounterInfo.Id, loginUser)); ///创建计数器日志 TwdCounterLogInfo twdCounterLogInfo = TwdCounterLogBLL.CreateTwdCounterLogInfo(twdCounterInfo.Fid.GetValueOrDefault(), loginUser); ///以物料拉动信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(maintainInhouseLogisticStandard, ref twdCounterLogInfo); ///以零件类信息填充计数器日志 TwdCounterLogBLL.GetTwdCounterLogInfo(twdPartBoxInfo, ref twdCounterLogInfo); ///PART_QTY twdCounterLogInfo.PartQty = requireQty; ///SOURCE_DATA_FID twdCounterLogInfo.SourceDataFid = Guid.Empty; ///SOURCE_DATA_TYPE twdCounterLogInfo.SourceDataType = (int)TwdCounterSourceDataTypeConstants.Inventory; ///SOURCE_DATA ,供应商|当前可用|在途数量 twdCounterLogInfo.SourceData = supplierNum + "|" + avaibleQty + "|" + onroadQty; /// stringBuilder.AppendLine(TwdCounterLogDAL.GetInsertSql(twdCounterLogInfo)); ///触发层级拉动 stringBuilder.AppendLine(TwdCounterBLL.LevelPullRequirementCounter( maintainInhouseLogisticStandard, requireQty, loginUser, twdCounterInfo.Fid.GetValueOrDefault(), twdCounterInfo.PartBoxCode)); } ///数据库执行 using (TransactionScope trans = new TransactionScope()) { if (stringBuilder.Length > 0) { BLL.LES.CommonBLL.ExecuteNonQueryBySql(stringBuilder.ToString()); } trans.Complete(); } stringBuilder.Clear(); } }