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);
}
}
}
}