| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- 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() {
- }
- /// <summary>
- /// BOM预处理
- /// </summary>
- /// <param name="orderid"></param>
- /// <param name="BomId"></param>
- /// <param name="Quantity"></param>
- public List<BomChildExamineDto> BomPretreatment(long? BomId, List<mo_ic_bom> bomlist, List<mo_ic_bom_child> bomchildlist, List<mo_ic_item> icitemlist)
- {
- if (BomId == null)
- {
- //throw new bu
- }
- List<BomChildExamineDto> returnlist = new List<BomChildExamineDto>();
- 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;
- }
- /// <summary>
- /// BOM预处理层级组装
- /// </summary>
- /// <param name="bomlist"></param>
- /// <param name="bomchildlist"></param>
- /// <param name="icitemlist"></param>
- /// <param name="dto"></param>
- /// <param name="returnlist"></param>
- public void GetBomList(List<mo_ic_bom> bomlist, List<mo_ic_bom_child> bomchildlist, List<mo_ic_item> icitemlist, BomChildExamineDto dto, List<BomChildExamineDto> 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;
- //var bdto = ObjectMapper.Map<ic_bom,BomChildExamineDto>(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.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++;
- }
- }
- /// <summary>
- /// BOM替代关系预处理
- /// </summary>
- /// <param name="returnlist"></param>
- /// <param name="bomlist"></param>
- /// <param name="bomchildlist"></param>
- /// <param name="icitemlist"></param>
- /// <param name="sublist"></param>
- /// <param name="suballlist"></param>
- /// <param name="subdtllist"></param>
- public void BomSubstitute(List<BomChildExamineDto> returnlist, List<mo_ic_bom> bomlist, List<mo_ic_bom_child> bomchildlist, List<mo_ic_item> icitemlist, List<mo_ic_substitute> sublist, List<mo_ic_substitute_group> suballlist, List<mo_ic_substitute_group_detail> subdtllist)
- {
- List<long> childidList = new List<long>();
- int type = 1;
- List<BomChildExamineDto> addlist = new List<BomChildExamineDto>();
- //除顶级外,其他层级关系全带出来。生成平铺
- 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);
- }
- /// <summary>
- /// 替代关系递归组装出来
- /// </summary>
- /// <param name="sal"></param>
- /// <param name="dtl"></param>
- /// <param name="toDto"></param>
- /// <param name="returnlist"></param>
- /// <param name="icitemlist"></param>
- /// <param name="bomlist"></param>
- /// <param name="bomchildlist"></param>
- public void SubstitutePretreatment(mo_ic_substitute sl, mo_ic_substitute_group sal, mo_ic_substitute_group_detail dtl, BomChildExamineDto toDto, List<BomChildExamineDto> returnlist, List<mo_ic_item> icitemlist, List<mo_ic_bom> bomlist, List<mo_ic_bom_child> bomchildlist, int type)
- {
- //如果dtl对应的icitem是BOM,还需要向下继续展开。
- //List<BomChildExamineDto> returnlist = new List<BomChildExamineDto>();
- 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;
- GetBomList(bomlist, bomchildlist, icitemlist, dto, returnlist, type, (int)dto.num_order);
- }
- else
- {
- dto.bom_id = null;
- dto.isbom = 0;
- returnlist.Add(dto);
- }
- }
- }
- }
|