using Business.Core.Utilities; using Business.Domain; using Business.ResourceExamineManagement.Dto; using System.Collections.Generic; using System.Linq; using Volo.Abp.Application.Services; namespace Business.ResourceExamineManagement { public class PretreatmentAppService : ApplicationService { SnowFlake help = new SnowFlake(); //构造函数 public PretreatmentAppService() { } /// /// BOM预处理 /// /// /// /// public List BomPretreatment(long? BomId, List bomlist, List bomchildlist, List icitemlist) { if (BomId == null) { //throw new bu } List returnlist = new List(); var bom = bomlist.Find(s => s.mysql_id == BomId); if (bom == null) { return returnlist; } int orderNum = 1; var dto = new BomChildExamineDto(); dto.item_id = bom.icitem_id; dto.bom_id = BomId.Value; dto.bom_number = bom.bom_number; dto.level = 1; dto.id = help.NextId(); dto.fid= help.NextId(); dto.qty = 1; dto.num = "1"; dto.num_order = orderNum; dto.isbom = 1; dto.is_replace = 0; dto.haveicsubs = 0; dto.substitute_code = ""; dto.icitem_ids = ""; dto.Op = 0; int type = 0; GetBomList(bomlist, bomchildlist, icitemlist, dto, returnlist, type, orderNum); return returnlist; } /// /// BOM预处理层级组装 /// /// /// /// /// /// public void GetBomList(List bomlist, List bomchildlist, List icitemlist, BomChildExamineDto dto, List returnlist, int type, int orderNum) { int level = dto.level + 1;//初始化定义level层级 if (level > 10) return; var bom = bomlist.Where(s => s.mysql_id == dto.bom_id).FirstOrDefault(); mo_ic_item item = new mo_ic_item(); if (bom != null) { item = icitemlist.Where(a => a.mysql_id == bom.icitem_id).FirstOrDefault(); } else { item = icitemlist.Where(a => a.mysql_id == dto.item_id).FirstOrDefault(); } if (item == null) { return; } dto.item_id = item.mysql_id; dto.item_name = item.name; dto.item_number = item.number; dto.model = item.model; dto.unit = bom.unit; dto.erp_cls = item.erp_cls.GetValueOrDefault(); dto.erp_cls_name = item.erp_cls_name; dto.type = type; dto.PurLT = item.PurLT; dto.BOMDesignTime = item.BOMDesignTime; dto.RoutingDesignTime = item.RoutingDesignTime; //var bdto = ObjectMapper.Map(bom); returnlist.Add(dto); var childlist = bomchildlist.Where(a => a.bom_id == bom.mysql_id).OrderBy(s=>s.child_num).ToList(); int idx = 1; foreach (var c in childlist) { orderNum += 1; string childNum = dto.num + "." + idx.ToString(); //long order_num = long.Parse(dto.num_order.ToString() + (idx.ToString().PadLeft(3, '0'))); var icitem = icitemlist.Where(a => a.mysql_id == c.icitem_id).FirstOrDefault(); var childBom = bomlist.Where(a => a.icitem_id == c.icitem_id).FirstOrDefault(); //如果此明细查的到BOM信息,则代表此child是一个子BOM。 if (childBom != null) { var cdto = new BomChildExamineDto(); cdto.id = help.NextId(); cdto.fid= help.NextId(); cdto.level = level; cdto.parent_id = dto.fid; cdto.bom_child_id = c.mysql_id; cdto.qty = c.qty.Value; cdto.backflush = c.backflush; cdto.num = childNum; cdto.num_order = orderNum; cdto.isbom = 1; cdto.is_replace = c.is_replace; cdto.haveicsubs = c.haveicsubs; cdto.substitute_code = c.substitute_code; cdto.icitem_ids = c.icitem_ids; cdto.unit = icitem == null ? "" : icitem.unit; cdto.type = type; cdto.item_id = childBom.icitem_id; cdto.bom_id = childBom.mysql_id; cdto.bom_number = childBom.bom_number; cdto.Op = c.Op; cdto.clean_leadtime = icitem.clean_leadtime; cdto.PurLT = icitem.PurLT; cdto.BOMDesignTime = icitem.BOMDesignTime; cdto.RoutingDesignTime = icitem.RoutingDesignTime; cdto.scrap = c.scrap.GetValueOrDefault(); cdto.wastage = c.wastage.GetValueOrDefault(); cdto.security_stock=icitem.secinv.GetValueOrDefault(); //递归寻找子级 GetBomList(bomlist, bomchildlist, icitemlist, cdto, returnlist, type, orderNum); } else { if (icitem != null) { var childDto = new BomChildExamineDto(); childDto.level = level; childDto.bom_id = dto.bom_id; childDto.bom_child_id = c.mysql_id; childDto.id = help.NextId(); childDto.fid= help.NextId(); childDto.parent_id = dto.fid; childDto.item_id = icitem.mysql_id; childDto.item_name = icitem.name; childDto.item_number = icitem.number; childDto.num = childNum; childDto.num_order = orderNum; childDto.model = icitem.model; childDto.unit = c.unit; childDto.erp_cls = icitem.erp_cls.GetValueOrDefault(); childDto.erp_cls_name = icitem.erp_cls_name; childDto.backflush = c.backflush; childDto.qty = c.qty.Value; childDto.isbom = 0; childDto.is_replace = c.is_replace; childDto.haveicsubs = c.haveicsubs; childDto.substitute_code = c.substitute_code; childDto.icitem_ids = c.icitem_ids; childDto.type = type; childDto.item_number = icitem.number; childDto.Op = c.Op; childDto.clean_leadtime = icitem.clean_leadtime; childDto.scrap = c.scrap.GetValueOrDefault(); childDto.wastage = c.wastage.GetValueOrDefault(); childDto.security_stock = icitem.secinv.GetValueOrDefault(); returnlist.Add(childDto); } } idx++; } } /// /// BOM替代关系预处理 /// /// /// /// /// /// /// /// public void BomSubstitute(List returnlist, List bomlist, List bomchildlist, List icitemlist, List sublist, List suballlist, List subdtllist) { List childidList = new List(); int type = 1; List addlist = new List(); //除顶级外,其他层级关系全带出来。生成平铺 foreach (var item in returnlist) { //最顶级、虚拟件、已计算过的群组、没有替代关系 if (item.level == 1 || item.erp_cls == 4 || childidList.Contains(item.bom_child_id.GetValueOrDefault()) || item.haveicsubs != 1) { continue; } //找到当前物料的替代群组关系集 var sl = sublist.Find(s => s.substitute_code == item.substitute_code); if (sl != null) { var sall = suballlist.Where(s => s.substitute_group_id == sl.mysql_id).ToList(); //var bz = sall.Where(s => s.main_material.GetValueOrDefault() == 1).FirstOrDefault(); foreach (var sal in sall) { var sadl = subdtllist.Where(s => s.substitute_group_id == sal.mysql_id).OrderBy(c => c.seq).ToList(); foreach (var dtl in sadl) { if (sal.main_material.GetValueOrDefault() != 1) { //递归将替代关系组装出来。 SubstitutePretreatment(sl, sal, dtl, item, addlist, icitemlist, bomlist, bomchildlist, type); } else { //通过替代群组代码,将替代群组物料进行绑定。 childidList.AddRange(returnlist.Where(s => s.substitute_code == item.substitute_code).Select(d => d.bom_child_id.GetValueOrDefault())); //将主料赋值上属性 var dtlitem = returnlist.Find(s => s.item_id == dtl.icitem_id && s.level == item.level); if (dtlitem != null) { dtlitem.substitute_all_num = sal.order_num;//群组优先级 dtlitem.haveicsubs = 1; dtlitem.substitute_strategy = sl.substitute_strategy.GetValueOrDefault(); dtlitem.substitute_mode = sl.substitute_mode.GetValueOrDefault(); } } } } } } returnlist.AddRange(addlist); } /// /// 替代关系递归组装出来 /// /// /// /// /// /// /// /// public void SubstitutePretreatment(mo_ic_substitute sl, mo_ic_substitute_group sal, mo_ic_substitute_group_detail dtl, BomChildExamineDto toDto, List returnlist, List icitemlist, List bomlist, List bomchildlist, int type) { //如果dtl对应的icitem是BOM,还需要向下继续展开。 //List returnlist = new List(); var dto = new BomChildExamineDto(); var bom = bomlist.Where(s => s.icitem_id == dtl.icitem_id).FirstOrDefault(); var icitem = icitemlist.Find(s => s.mysql_id == dtl.icitem_id); if (icitem == null) { return; } dto.id = help.NextId(); dto.fid= help.NextId(); dto.level = toDto.level; dto.parent_id = toDto.parent_id; dto.item_id = icitem.mysql_id; dto.item_name = icitem.name; dto.item_number = icitem.number; dto.num = toDto.num; dto.num_order = toDto.num_order; dto.model = icitem.model; dto.unit = icitem.unit; dto.erp_cls = icitem.erp_cls.GetValueOrDefault(); dto.erp_cls_name = icitem.erp_cls_name; dto.backflush = toDto.backflush; //dto.qty = toDto.qty; //dto.replace_amount = dtl.replace_amount.Value; //dto.qty = dtl.replace_qty == null ? 1 : dtl.replace_qty.Value; dto.qty = toDto.qty; dto.is_replace = 0; dto.haveicsubs = 0; dto.substitute_code = sl.substitute_code; dto.icitem_ids = ""; dto.substitute_strategy = sl.substitute_strategy == null ? 0 : sl.substitute_strategy.Value;//替代策略 dto.substitute_mode = sl.substitute_mode == null ? 0 : sl.substitute_mode.Value;//替代方式 dto.type = type; dto.substitute_all_num = sal.order_num;//群组优先级 //先按标准料的工序给替代料赋值。 dto.Op = toDto.Op; dto.clean_leadtime = icitem.clean_leadtime; if (bom != null) { dto.bom_id = bom.mysql_id; dto.qty = dtl.replace_qty == null ? 1 : dtl.replace_qty.Value; dto.isbom = 1; dto.is_replace = 0; dto.haveicsubs = 0; dto.substitute_code = ""; dto.icitem_ids = ""; dto.PurLT = icitem.PurLT; dto.BOMDesignTime = icitem.BOMDesignTime; dto.RoutingDesignTime = icitem.RoutingDesignTime; GetBomList(bomlist, bomchildlist, icitemlist, dto, returnlist, type, (int)dto.num_order); } else { dto.bom_id = null; dto.isbom = 0; returnlist.Add(dto); } } } }