PretreatmentAppService.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. using Business.Core.Utilities;
  2. using Business.Domain;
  3. using Business.ResourceExamineManagement.Dto;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using Volo.Abp.Application.Services;
  7. namespace Business.ResourceExamineManagement
  8. {
  9. public class PretreatmentAppService : ApplicationService
  10. {
  11. SnowFlake help = new SnowFlake();
  12. //构造函数
  13. public PretreatmentAppService() {
  14. }
  15. /// <summary>
  16. /// BOM预处理
  17. /// </summary>
  18. /// <param name="orderid"></param>
  19. /// <param name="BomId"></param>
  20. /// <param name="Quantity"></param>
  21. public List<BomChildExamineDto> BomPretreatment(long? BomId, List<mo_ic_bom> bomlist, List<mo_ic_bom_child> bomchildlist, List<mo_ic_item> icitemlist)
  22. {
  23. if (BomId == null)
  24. {
  25. //throw new bu
  26. }
  27. List<BomChildExamineDto> returnlist = new List<BomChildExamineDto>();
  28. var bom = bomlist.Find(s => s.mysql_id == BomId);
  29. if (bom == null)
  30. {
  31. return returnlist;
  32. }
  33. int orderNum = 1;
  34. var dto = new BomChildExamineDto();
  35. dto.item_id = bom.icitem_id;
  36. dto.bom_id = BomId.Value;
  37. dto.bom_number = bom.bom_number;
  38. dto.level = 1;
  39. dto.id = help.NextId();
  40. dto.fid= help.NextId();
  41. dto.qty = 1;
  42. dto.num = "1";
  43. dto.num_order = orderNum;
  44. dto.isbom = 1;
  45. dto.is_replace = 0;
  46. dto.haveicsubs = 0;
  47. dto.substitute_code = "";
  48. dto.icitem_ids = "";
  49. dto.Op = 0;
  50. int type = 0;
  51. GetBomList(bomlist, bomchildlist, icitemlist, dto, returnlist, type, orderNum);
  52. return returnlist;
  53. }
  54. /// <summary>
  55. /// BOM预处理层级组装
  56. /// </summary>
  57. /// <param name="bomlist"></param>
  58. /// <param name="bomchildlist"></param>
  59. /// <param name="icitemlist"></param>
  60. /// <param name="dto"></param>
  61. /// <param name="returnlist"></param>
  62. 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)
  63. {
  64. int level = dto.level + 1;//初始化定义level层级
  65. if (level > 10)
  66. return;
  67. var bom = bomlist.Where(s => s.mysql_id == dto.bom_id).FirstOrDefault();
  68. mo_ic_item item = new mo_ic_item();
  69. if (bom != null)
  70. {
  71. item = icitemlist.Where(a => a.mysql_id == bom.icitem_id).FirstOrDefault();
  72. }
  73. else
  74. {
  75. item = icitemlist.Where(a => a.mysql_id == dto.item_id).FirstOrDefault();
  76. }
  77. if (item == null)
  78. {
  79. return;
  80. }
  81. dto.item_id = item.mysql_id;
  82. dto.item_name = item.name;
  83. dto.item_number = item.number;
  84. dto.model = item.model;
  85. dto.unit = bom.unit;
  86. dto.erp_cls = item.erp_cls.GetValueOrDefault();
  87. dto.erp_cls_name = item.erp_cls_name;
  88. dto.type = type;
  89. dto.PurLT = item.PurLT;
  90. dto.BOMDesignTime = item.BOMDesignTime;
  91. dto.RoutingDesignTime = item.RoutingDesignTime;
  92. //var bdto = ObjectMapper.Map<ic_bom,BomChildExamineDto>(bom);
  93. returnlist.Add(dto);
  94. var childlist = bomchildlist.Where(a => a.bom_id == bom.mysql_id).OrderBy(s=>s.child_num).ToList();
  95. int idx = 1;
  96. foreach (var c in childlist)
  97. {
  98. orderNum += 1;
  99. string childNum = dto.num + "." + idx.ToString();
  100. //long order_num = long.Parse(dto.num_order.ToString() + (idx.ToString().PadLeft(3, '0')));
  101. var icitem = icitemlist.Where(a => a.mysql_id == c.icitem_id).FirstOrDefault();
  102. var childBom = bomlist.Where(a => a.icitem_id == c.icitem_id).FirstOrDefault();
  103. //如果此明细查的到BOM信息,则代表此child是一个子BOM。
  104. if (childBom != null)
  105. {
  106. var cdto = new BomChildExamineDto();
  107. cdto.id = help.NextId();
  108. cdto.fid= help.NextId();
  109. cdto.level = level;
  110. cdto.parent_id = dto.fid;
  111. cdto.bom_child_id = c.mysql_id;
  112. cdto.qty = c.qty.Value;
  113. cdto.backflush = c.backflush;
  114. cdto.num = childNum;
  115. cdto.num_order = orderNum;
  116. cdto.isbom = 1;
  117. cdto.is_replace = c.is_replace;
  118. cdto.haveicsubs = c.haveicsubs;
  119. cdto.substitute_code = c.substitute_code;
  120. cdto.icitem_ids = c.icitem_ids;
  121. cdto.unit = icitem == null ? "" : icitem.unit;
  122. cdto.type = type;
  123. cdto.item_id = childBom.icitem_id;
  124. cdto.bom_id = childBom.mysql_id;
  125. cdto.bom_number = childBom.bom_number;
  126. cdto.Op = c.Op;
  127. cdto.clean_leadtime = icitem.clean_leadtime;
  128. cdto.PurLT = icitem.PurLT;
  129. cdto.BOMDesignTime = icitem.BOMDesignTime;
  130. cdto.RoutingDesignTime = icitem.RoutingDesignTime;
  131. cdto.scrap = c.scrap.GetValueOrDefault();
  132. cdto.wastage = c.wastage.GetValueOrDefault();
  133. cdto.security_stock=icitem.secinv.GetValueOrDefault();
  134. //递归寻找子级
  135. GetBomList(bomlist, bomchildlist, icitemlist, cdto, returnlist, type, orderNum);
  136. }
  137. else
  138. {
  139. if (icitem != null)
  140. {
  141. var childDto = new BomChildExamineDto();
  142. childDto.level = level;
  143. childDto.bom_id = dto.bom_id;
  144. childDto.bom_child_id = c.mysql_id;
  145. childDto.id = help.NextId();
  146. childDto.fid= help.NextId();
  147. childDto.parent_id = dto.fid;
  148. childDto.item_id = icitem.mysql_id;
  149. childDto.item_name = icitem.name;
  150. childDto.item_number = icitem.number;
  151. childDto.num = childNum;
  152. childDto.num_order = orderNum;
  153. childDto.model = icitem.model;
  154. childDto.unit = c.unit;
  155. childDto.erp_cls = icitem.erp_cls.GetValueOrDefault();
  156. childDto.erp_cls_name = icitem.erp_cls_name;
  157. childDto.backflush = c.backflush;
  158. childDto.qty = c.qty.Value;
  159. childDto.isbom = 0;
  160. childDto.is_replace = c.is_replace;
  161. childDto.haveicsubs = c.haveicsubs;
  162. childDto.substitute_code = c.substitute_code;
  163. childDto.icitem_ids = c.icitem_ids;
  164. childDto.type = type;
  165. childDto.item_number = icitem.number;
  166. childDto.Op = c.Op;
  167. childDto.clean_leadtime = icitem.clean_leadtime;
  168. childDto.scrap = c.scrap.GetValueOrDefault();
  169. childDto.wastage = c.wastage.GetValueOrDefault();
  170. childDto.security_stock = icitem.secinv.GetValueOrDefault();
  171. returnlist.Add(childDto);
  172. }
  173. }
  174. idx++;
  175. }
  176. }
  177. /// <summary>
  178. /// BOM替代关系预处理
  179. /// </summary>
  180. /// <param name="returnlist"></param>
  181. /// <param name="bomlist"></param>
  182. /// <param name="bomchildlist"></param>
  183. /// <param name="icitemlist"></param>
  184. /// <param name="sublist"></param>
  185. /// <param name="suballlist"></param>
  186. /// <param name="subdtllist"></param>
  187. 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)
  188. {
  189. List<long> childidList = new List<long>();
  190. int type = 1;
  191. List<BomChildExamineDto> addlist = new List<BomChildExamineDto>();
  192. //除顶级外,其他层级关系全带出来。生成平铺
  193. foreach (var item in returnlist)
  194. {
  195. //最顶级、虚拟件、已计算过的群组、没有替代关系
  196. if (item.level == 1 || item.erp_cls == 4 || childidList.Contains(item.bom_child_id.GetValueOrDefault()) || item.haveicsubs != 1)
  197. {
  198. continue;
  199. }
  200. //找到当前物料的替代群组关系集
  201. var sl = sublist.Find(s => s.substitute_code == item.substitute_code);
  202. if (sl != null)
  203. {
  204. var sall = suballlist.Where(s => s.substitute_group_id == sl.mysql_id).ToList();
  205. //var bz = sall.Where(s => s.main_material.GetValueOrDefault() == 1).FirstOrDefault();
  206. foreach (var sal in sall)
  207. {
  208. var sadl = subdtllist.Where(s => s.substitute_group_id == sal.mysql_id).OrderBy(c => c.seq).ToList();
  209. foreach (var dtl in sadl)
  210. {
  211. if (sal.main_material.GetValueOrDefault() != 1)
  212. {
  213. //递归将替代关系组装出来。
  214. SubstitutePretreatment(sl, sal, dtl, item, addlist, icitemlist, bomlist, bomchildlist, type);
  215. }
  216. else
  217. {
  218. //通过替代群组代码,将替代群组物料进行绑定。
  219. childidList.AddRange(returnlist.Where(s => s.substitute_code == item.substitute_code).Select(d => d.bom_child_id.GetValueOrDefault()));
  220. //将主料赋值上属性
  221. var dtlitem = returnlist.Find(s => s.item_id == dtl.icitem_id && s.level == item.level);
  222. if (dtlitem != null)
  223. {
  224. dtlitem.substitute_all_num = sal.order_num;//群组优先级
  225. dtlitem.haveicsubs = 1;
  226. dtlitem.substitute_strategy = sl.substitute_strategy.GetValueOrDefault();
  227. dtlitem.substitute_mode = sl.substitute_mode.GetValueOrDefault();
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234. returnlist.AddRange(addlist);
  235. }
  236. /// <summary>
  237. /// 替代关系递归组装出来
  238. /// </summary>
  239. /// <param name="sal"></param>
  240. /// <param name="dtl"></param>
  241. /// <param name="toDto"></param>
  242. /// <param name="returnlist"></param>
  243. /// <param name="icitemlist"></param>
  244. /// <param name="bomlist"></param>
  245. /// <param name="bomchildlist"></param>
  246. 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)
  247. {
  248. //如果dtl对应的icitem是BOM,还需要向下继续展开。
  249. //List<BomChildExamineDto> returnlist = new List<BomChildExamineDto>();
  250. var dto = new BomChildExamineDto();
  251. var bom = bomlist.Where(s => s.icitem_id == dtl.icitem_id).FirstOrDefault();
  252. var icitem = icitemlist.Find(s => s.mysql_id == dtl.icitem_id);
  253. if (icitem == null)
  254. {
  255. return;
  256. }
  257. dto.id = help.NextId();
  258. dto.fid= help.NextId();
  259. dto.level = toDto.level;
  260. dto.parent_id = toDto.parent_id;
  261. dto.item_id = icitem.mysql_id;
  262. dto.item_name = icitem.name;
  263. dto.item_number = icitem.number;
  264. dto.num = toDto.num;
  265. dto.num_order = toDto.num_order;
  266. dto.model = icitem.model;
  267. dto.unit = icitem.unit;
  268. dto.erp_cls = icitem.erp_cls.GetValueOrDefault();
  269. dto.erp_cls_name = icitem.erp_cls_name;
  270. dto.backflush = toDto.backflush;
  271. //dto.qty = toDto.qty;
  272. //dto.replace_amount = dtl.replace_amount.Value;
  273. //dto.qty = dtl.replace_qty == null ? 1 : dtl.replace_qty.Value;
  274. dto.qty = toDto.qty;
  275. dto.is_replace = 0;
  276. dto.haveicsubs = 0;
  277. dto.substitute_code = sl.substitute_code;
  278. dto.icitem_ids = "";
  279. dto.substitute_strategy = sl.substitute_strategy == null ? 0 : sl.substitute_strategy.Value;//替代策略
  280. dto.substitute_mode = sl.substitute_mode == null ? 0 : sl.substitute_mode.Value;//替代方式
  281. dto.type = type;
  282. dto.substitute_all_num = sal.order_num;//群组优先级
  283. //先按标准料的工序给替代料赋值。
  284. dto.Op = toDto.Op;
  285. dto.clean_leadtime = icitem.clean_leadtime;
  286. if (bom != null)
  287. {
  288. dto.bom_id = bom.mysql_id;
  289. dto.qty = dtl.replace_qty == null ? 1 : dtl.replace_qty.Value;
  290. dto.isbom = 1;
  291. dto.is_replace = 0;
  292. dto.haveicsubs = 0;
  293. dto.substitute_code = "";
  294. dto.icitem_ids = "";
  295. dto.PurLT = icitem.PurLT;
  296. dto.BOMDesignTime = icitem.BOMDesignTime;
  297. dto.RoutingDesignTime = icitem.RoutingDesignTime;
  298. GetBomList(bomlist, bomchildlist, icitemlist, dto, returnlist, type, (int)dto.num_order);
  299. }
  300. else
  301. {
  302. dto.bom_id = null;
  303. dto.isbom = 0;
  304. returnlist.Add(dto);
  305. }
  306. }
  307. }
  308. }