VSMAppService.cs 108 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300
  1. using Azure;
  2. using Business.Core.Enum;
  3. using Business.Core.Utilities;
  4. using Business.Domain;
  5. using Business.Dto;
  6. using Business.EntityFrameworkCore;
  7. using Business.EntityFrameworkCore.SqlRepositories;
  8. using Business.ResourceExamineManagement;
  9. using Business.ResourceExamineManagement.Dto;
  10. using Business.StructuredDB.MES;
  11. using Business.StructuredDB.MES.IC;
  12. using Business.StructuredDB.SaleFcst;
  13. using Business.StructuredDB.WMS;
  14. using Business.VSM;
  15. using EFCore.BulkExtensions;
  16. using MathNet.Numerics.LinearAlgebra.Factorization;
  17. using Microsoft.EntityFrameworkCore;
  18. using Microsoft.EntityFrameworkCore.Metadata.Internal;
  19. using Microsoft.Extensions.Configuration;
  20. using MongoDB.Driver.Linq;
  21. using NetTopologySuite.Mathematics;
  22. using Newtonsoft.Json;
  23. using NLog;
  24. using System;
  25. using System.Collections;
  26. using System.Collections.Generic;
  27. using System.Data;
  28. using System.Diagnostics.Metrics;
  29. using System.Linq;
  30. using System.Text;
  31. using System.Threading;
  32. using System.Threading.Tasks;
  33. using System.Xml.Linq;
  34. using Volo.Abp.Application.Services;
  35. using Volo.Abp.Domain.Repositories;
  36. using Volo.Abp.MultiTenancy;
  37. using WkHtmlToPdfDotNet;
  38. using ZstdSharp.Unsafe;
  39. using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
  40. namespace Business.VSMManagement
  41. {
  42. public class VSMAppService : ApplicationService,IVSMAppService
  43. {
  44. private readonly ISqlRepository<ItemMaster> _itemMaster;
  45. private readonly ISqlRepository<InvTransHist> _invTransHist;
  46. private readonly IRepository<srm_purchase> _srm_purchase;
  47. private readonly IRepository<ic_item> _ic_item;
  48. private readonly ISqlRepository<LocationDetail> _LocationDetail;
  49. private readonly ISqlRepository<InvTransHistDay> _InvTransHistDay;
  50. private readonly IExtRASqlRepository<DMS_IN_PODETAIL> _DMS_IN_PODETAIL;
  51. private readonly IExtRASqlRepository<DMS_IN_LOCDETAIL> _DMS_IN_LOCDETAIL;
  52. private readonly IExtRASqlRepository<DMS_IN_ITEMMAPPING> _DMS_IN_ITEMMAPPING;
  53. private readonly IExtRASqlRepository<DMS_IN_SHIPPINGDETAIL> _DMS_IN_SHIPPINGDETAIL;
  54. private readonly ISqlRepository<SAPInv> _SAPInv;
  55. private readonly IRepository<MonthlyShipmentPlan> _monthlyShipmentPlan;
  56. private readonly ISqlRepository<ASNBOLShipperDetail> _aSNBOLShipperDetail;
  57. private readonly BusinessDbContext _businessDbContext;
  58. private readonly BusinessExtRADbContext _businessExtRADbContext;
  59. public VSMAppService(
  60. ISqlRepository<ItemMaster> itemMaster,
  61. ISqlRepository<InvTransHist> invTransHist,
  62. IRepository<srm_purchase> srm_purchase,
  63. IRepository<ic_item> ic_item,
  64. ISqlRepository<LocationDetail> locationDetail,
  65. ISqlRepository<InvTransHistDay> invTransHistDay,
  66. IExtRASqlRepository<DMS_IN_PODETAIL> dms_IN_PODETAIL,
  67. IExtRASqlRepository<DMS_IN_LOCDETAIL> dms_IN_LOCDETAIL,
  68. IExtRASqlRepository<DMS_IN_ITEMMAPPING> dms_IN_ITEMMAPPING,
  69. IExtRASqlRepository<DMS_IN_SHIPPINGDETAIL> dms_IN_SHIPPINGDETAIL,
  70. ISqlRepository<SAPInv> SAPInv,
  71. IRepository<MonthlyShipmentPlan> monthlyShipmentPlan,
  72. ISqlRepository<ASNBOLShipperDetail> aSNBOLShipperDetail,
  73. BusinessDbContext businessDbContext,
  74. BusinessExtRADbContext businessExtRADbContext
  75. )
  76. {
  77. _itemMaster = itemMaster;
  78. _invTransHist = invTransHist;
  79. _srm_purchase = srm_purchase;
  80. _ic_item = ic_item;
  81. _LocationDetail=locationDetail;
  82. _InvTransHistDay = invTransHistDay;
  83. _DMS_IN_PODETAIL = dms_IN_PODETAIL;
  84. _DMS_IN_LOCDETAIL= dms_IN_LOCDETAIL;
  85. _DMS_IN_ITEMMAPPING= dms_IN_ITEMMAPPING;
  86. _DMS_IN_SHIPPINGDETAIL = dms_IN_SHIPPINGDETAIL;
  87. _SAPInv =SAPInv;
  88. _monthlyShipmentPlan=monthlyShipmentPlan;
  89. _aSNBOLShipperDetail = aSNBOLShipperDetail;
  90. _businessDbContext = businessDbContext;
  91. _businessExtRADbContext = businessExtRADbContext;
  92. }
  93. public string ValueFrequency(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency)
  94. {
  95. try
  96. {
  97. DateTime beginDate = Convert.ToDateTime(BeginDate);
  98. DateTime endDate = Convert.ToDateTime(EndDate);
  99. string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='8010' and createTime>='{beginDate}' and createTime<='{endDate}' group by ItemNum";
  100. var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
  101. var itemList = InvTransHistDto.Select(a => a.ItemNum).Distinct().ToList();
  102. ValueFrequencyDto dto = new ValueFrequencyDto();
  103. List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
  104. var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
  105. var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b=>b.Id).ToList().Contains(a.icitem_id)).Result;
  106. string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  107. var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  108. var InvTransHistDayDto = _InvTransHistDay.Select(a => a.HistDayTime >= beginDate.Date && a.HistDayTime <= endDate);
  109. itemList.ForEach(item =>
  110. {
  111. if(icitems.Any(a=>a.number==item))
  112. {
  113. ValueFrequencyKanBanDto itemKanBanDto = new ValueFrequencyKanBanDto();
  114. itemKanBanDto.ItemNumber = item;
  115. itemKanBanDto.ItemId = icitems.Find(a => a.number == item).Id;
  116. itemKanBanDto.Model = icitems.Find(a => a.number == item).model;
  117. itemKanBanDto.ItemName = icitems.Find(a => a.number == item).name;
  118. itemKanBanDto.PLT = 14;
  119. //供应提前期取货源清单最大值,没有默认14天
  120. if (srm_purchases.Any(a => a.icitem_id == itemKanBanDto.ItemId && a.quota_rate.GetValueOrDefault() > 0))
  121. {
  122. itemKanBanDto.PLT = srm_purchases.Where(a => a.number == item && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  123. }
  124. var entry = dzdList.FirstOrDefault(p => p.ItemNum == item);
  125. if (entry != null)
  126. {
  127. itemKanBanDto.NETPR = entry.NETPR;
  128. }
  129. else
  130. {
  131. itemKanBanDto.NETPR = 1 * 10;
  132. }
  133. //出库总数
  134. itemKanBanDto.OutStockQty = InvTransHistDayDto.Where(a => a.ItemNum == item).Sum(b => b.QtyChangeOut);
  135. //库存数据取进出存期末数据
  136. itemKanBanDto.Amount = InvTransHistDayDto.Where(a => a.ItemNum == item).OrderByDescending(a => a.HistDayTime).First().BalanceNum * itemKanBanDto.NETPR;
  137. itemKanBanDto.MoveCount = InvTransHistDayDto.Where(a => a.ItemNum == item && a.QtyChangeOut > 0).Count();
  138. int days = endDate.Subtract(beginDate).Days;
  139. //同一天算1天
  140. if (days == 0)
  141. days = 1;
  142. itemKanBanDto.ADU = itemKanBanDto.OutStockQty / days;
  143. itemKanBanDto.Kanban = itemKanBanDto.ADU * itemKanBanDto.PLT;
  144. kanBanDtos.Add(itemKanBanDto);
  145. }
  146. });
  147. decimal totalmoveCount = kanBanDtos.Sum(a=>a.MoveCount);
  148. decimal totalAmount = kanBanDtos.Sum(a => a.Amount);
  149. decimal avgmoveCount = kanBanDtos.Average(a => a.MoveCount);
  150. kanBanDtos=kanBanDtos.OrderByDescending(a => a.Amount).ToList();
  151. for (int i=0;i< kanBanDtos.Count;i++)
  152. {
  153. if (kanBanDtos[i].MoveCount > avgmoveCount)
  154. {
  155. kanBanDtos[i].FMR = "F";
  156. }
  157. else if(kanBanDtos[i].MoveCount < avgmoveCount / 2)
  158. {
  159. kanBanDtos[i].FMR = "R";
  160. }else
  161. {
  162. kanBanDtos[i].FMR = "M";
  163. }
  164. if(i<=kanBanDtos.Count*0.7)
  165. {
  166. kanBanDtos[i].ABC = "A";
  167. }else if(i>=kanBanDtos.Count*0.9)
  168. {
  169. kanBanDtos[i].ABC = "C";
  170. }else
  171. {
  172. kanBanDtos[i].ABC = "B";
  173. }
  174. kanBanDtos[i].AmountTotal = totalAmount;
  175. kanBanDtos[i].MovePencent = totalmoveCount == 0 ? 0 : kanBanDtos[i].MoveCount * 100 / totalmoveCount;
  176. }
  177. int totalCount = kanBanDtos.Count();
  178. dto.jzpc1 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  179. dto.jzpc2 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  180. dto.jzpc3 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  181. dto.jzpc4 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  182. dto.jzpc5 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  183. dto.jzpc6 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  184. dto.jzpc7 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  185. dto.jzpc8 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  186. dto.jzpc9 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  187. return JsonConvert.SerializeObject(dto);
  188. }
  189. catch (Exception ex)
  190. {
  191. return ex.Message;
  192. }
  193. }
  194. public string ValueFrequencyDetail(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency, string JZ, string PC)
  195. {
  196. try
  197. {
  198. List<ValueFrequencyDetailDto> dtos = new List<ValueFrequencyDetailDto>();
  199. try
  200. {
  201. DateTime beginDate = Convert.ToDateTime(BeginDate);
  202. DateTime endDate = Convert.ToDateTime(EndDate);
  203. string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='8010' and createTime>='{beginDate}' and createTime<='{endDate}' group by ItemNum";
  204. var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
  205. var itemList = InvTransHistDto.Select(a => a.ItemNum).Distinct().ToList();
  206. ValueFrequencyDto dto = new ValueFrequencyDto();
  207. List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
  208. var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
  209. var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b => b.Id).ToList().Contains(a.icitem_id)).Result;
  210. string sqldzd = @"select MATNR AS ItemNum,Max(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  211. var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  212. var InvTransHistDayDto = _InvTransHistDay.Select(a=>a.HistDayTime>= beginDate.Date && a.HistDayTime<= endDate);
  213. itemList.ForEach(item =>
  214. {
  215. if (icitems.Any(a => a.number == item))
  216. {
  217. ValueFrequencyKanBanDto itemKanBanDto = new ValueFrequencyKanBanDto();
  218. itemKanBanDto.ItemNumber = item;
  219. itemKanBanDto.ItemId = icitems.Find(a => a.number == item).Id;
  220. itemKanBanDto.Model = icitems.Find(a => a.number == item).model;
  221. itemKanBanDto.ItemName = icitems.Find(a => a.number == item).name;
  222. itemKanBanDto.PLT = 14;
  223. //供应提前期取货源清单最大值,没有默认14天
  224. if (srm_purchases.Any(a => a.icitem_id == itemKanBanDto.ItemId && a.quota_rate.GetValueOrDefault() > 0))
  225. {
  226. itemKanBanDto.PLT = srm_purchases.Where(a => a.number == item && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  227. }
  228. var entry = dzdList.FirstOrDefault(p => p.ItemNum == item);
  229. if (entry != null)
  230. {
  231. itemKanBanDto.NETPR = entry.NETPR;
  232. }
  233. else
  234. {
  235. itemKanBanDto.NETPR = 1 * 10;
  236. }
  237. //出库总数
  238. itemKanBanDto.OutStockQty = InvTransHistDayDto.Where(a=>a.ItemNum==item).Sum(b=>b.QtyChangeOut);
  239. //库存数据取进出存期末数据
  240. itemKanBanDto.Amount = InvTransHistDayDto.Where(a => a.ItemNum == item).OrderByDescending(a=>a.HistDayTime).First().BalanceNum * itemKanBanDto.NETPR;
  241. itemKanBanDto.MoveCount = InvTransHistDayDto.Where(a => a.ItemNum == item && a.QtyChangeOut>0).Count();
  242. int days = endDate.Subtract(beginDate).Days;
  243. //同一天算1天
  244. if (days == 0)
  245. days = 1;
  246. itemKanBanDto.ADU = itemKanBanDto.OutStockQty / days;
  247. itemKanBanDto.Kanban = itemKanBanDto.ADU * itemKanBanDto.PLT;
  248. kanBanDtos.Add(itemKanBanDto);
  249. }
  250. });
  251. decimal totalmoveCount = kanBanDtos.Sum(a => a.MoveCount);
  252. decimal totalAmount = kanBanDtos.Sum(a => a.Amount);
  253. decimal avgmoveCount = kanBanDtos.Average(a => a.MoveCount);
  254. kanBanDtos = kanBanDtos.OrderByDescending(a => a.Amount).ToList();
  255. for (int i = 0; i < kanBanDtos.Count; i++)
  256. {
  257. if (kanBanDtos[i].MoveCount > avgmoveCount)
  258. {
  259. kanBanDtos[i].FMR = "F";
  260. }
  261. else if (kanBanDtos[i].MoveCount < avgmoveCount / 2)
  262. {
  263. kanBanDtos[i].FMR = "R";
  264. }
  265. else
  266. {
  267. kanBanDtos[i].FMR = "M";
  268. }
  269. if (i <= kanBanDtos.Count * 0.7)
  270. {
  271. kanBanDtos[i].ABC = "A";
  272. }
  273. else if (i >= kanBanDtos.Count * 0.9)
  274. {
  275. kanBanDtos[i].ABC = "C";
  276. }
  277. else
  278. {
  279. kanBanDtos[i].ABC = "B";
  280. }
  281. kanBanDtos[i].AmountTotal = totalAmount;
  282. kanBanDtos[i].MovePencent = totalmoveCount == 0 ? 0 : kanBanDtos[i].MoveCount * 100 / totalmoveCount;
  283. }
  284. kanBanDtos=kanBanDtos.Where(a=>a.ABC==JZ&&a.FMR==PC && a.Kanban > Convert.ToDecimal(KanBan) && a.MovePencent*100 > Convert.ToDecimal(Frequency)).OrderByDescending(a=>a.Amount).ToList();
  285. for (int i=0;i< kanBanDtos.Count(); i++)
  286. {
  287. ValueFrequencyDetailDto detailDto = new ValueFrequencyDetailDto();
  288. detailDto.RowSeq =i+1;
  289. detailDto.ItemNum = kanBanDtos[i].ItemNumber;
  290. detailDto.ItemName = kanBanDtos[i].ItemName;
  291. detailDto.Model = kanBanDtos[i].Model;
  292. detailDto.ItemABC = kanBanDtos[i].ABC;
  293. detailDto.ItemFMR = kanBanDtos[i].FMR;
  294. detailDto.Amount = kanBanDtos[i].Amount;
  295. detailDto.AmountFix = Convert.ToDecimal(KanBan) * kanBanDtos[i].NETPR;
  296. detailDto.AmountDiff = detailDto.Amount- detailDto.AmountFix;
  297. dtos.Add(detailDto);
  298. }
  299. return JsonConvert.SerializeObject(dtos);
  300. }
  301. catch (Exception ex)
  302. {
  303. return ex.Message;
  304. }
  305. }
  306. catch (Exception ex)
  307. {
  308. return ex.Message;
  309. }
  310. }
  311. public string ChartLineOption(string Loc, string BeginDate, string EndDate, string ItemNum,string TurnOver,string KanBan)
  312. {
  313. try
  314. {
  315. DateTime beginDate = Convert.ToDateTime(BeginDate);
  316. DateTime endDate = Convert.ToDateTime(EndDate);
  317. var srm_purchases = _srm_purchase.GetListAsync(a =>a.number==ItemNum).Result;
  318. decimal chartPLT = 14;
  319. decimal chartKanBan = Convert.ToDecimal(KanBan);
  320. //供应提前期取货源清单最大值,没有默认14天
  321. if (srm_purchases.Any(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0))
  322. {
  323. chartPLT = srm_purchases.Where(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  324. }
  325. var InvTransHistDayDto = _InvTransHistDay.Select(a => a.ItemNum== ItemNum && a.HistDayTime >= beginDate.Date && a.HistDayTime <= endDate);
  326. int tranDays = (endDate-beginDate).Days;
  327. List<ValueFrequencyChartDto> chartDtos = new List<ValueFrequencyChartDto>();
  328. for(int i = 0; i < tranDays; i++)
  329. {
  330. ValueFrequencyChartDto dtoChart = new ValueFrequencyChartDto();
  331. dtoChart.Date = beginDate.AddDays(i).ToString("yyyy-MM-dd");
  332. var itemDays = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date == a.HistDayTime.Date).ToList();
  333. if(itemDays.Count>0)
  334. {
  335. dtoChart.InStockQty = itemDays[0].QtyChangeAdvance;
  336. dtoChart.OutStockQty = itemDays[0].QtyChangeOut;
  337. dtoChart.StockQty = itemDays[0].BalanceNum;
  338. dtoChart.SuggestQty = chartKanBan * chartPLT;
  339. }else
  340. {
  341. dtoChart.InStockQty = 0;
  342. dtoChart.OutStockQty = 0;
  343. dtoChart.StockQty = 0;
  344. dtoChart.SuggestQty = 0;
  345. }
  346. chartDtos.Add(dtoChart);
  347. }
  348. chartDtos = chartDtos.Where(a => string.Compare(a.Date, BeginDate) >= 0 && string.Compare(a.Date, EndDate) <= 0).ToList();
  349. StringBuilder sb = new StringBuilder();
  350. StringBuilder sbDays = new StringBuilder();
  351. StringBuilder sbDaysStock = new StringBuilder();
  352. StringBuilder sbDaysInStock = new StringBuilder();
  353. StringBuilder sbDaysOutStock = new StringBuilder();
  354. StringBuilder sbDaysSuggest = new StringBuilder();
  355. sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量','推荐日库存数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
  356. chartDtos.ForEach(a =>
  357. {
  358. sbDays.Append(string.Format("'{0}',",a.Date));
  359. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  360. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  361. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  362. sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  363. });
  364. sb.Append(sbDays.ToString().TrimEnd(',')).
  365. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',stack: 'Total',data:[").
  366. Append(sbDaysStock.ToString().TrimEnd(',')).
  367. Append("]},{name:'日出库数量',type:'line',stack:'Total',data:[").
  368. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  369. Append("]},{name:'日入库数量',type:'line',stack:'Total',data:[").
  370. Append(sbDaysInStock.ToString().TrimEnd(',')).
  371. Append("]},{name:'推荐日库存数量',type:'line',stack:'Total',data:[").
  372. Append(sbDaysSuggest.ToString().TrimEnd(',')).
  373. Append("]}]}");
  374. return sb.ToString();
  375. }
  376. catch (Exception ex)
  377. {
  378. return ex.Message;
  379. }
  380. }
  381. public string ChartLineSupplierPLTOption()
  382. {
  383. return "{title:{text: '供应商PLT占比(%)',left:'center',},tooltip:{trigger: 'axis'},toolbox: {show: true,feature:{saveAsImage: {}}},xAxis: {type: 'category',data: ['1', '2', '3', '4', '5', '6', '7']},yAxis: {type: 'value',axisLabel: {formatter: '{value} %'},axisPointer: {snap: true} },series: [{data: [2, 5, 18, 55, 12, 5, 3],type: 'line',smooth: true}]}";
  384. }
  385. public string ChartLinePLTOption(string PLT)
  386. {
  387. if(PLT=="25")
  388. {
  389. string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,0.0 AS SuggestQty from [dbo].[25PLT] t";
  390. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  391. StringBuilder sb = new StringBuilder();
  392. StringBuilder sbDays = new StringBuilder();
  393. StringBuilder sbDaysStock = new StringBuilder();
  394. StringBuilder sbDaysInStock = new StringBuilder();
  395. StringBuilder sbDaysOutStock = new StringBuilder();
  396. sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
  397. chartDtosTest.ForEach(a =>
  398. {
  399. sbDays.Append(string.Format("'{0}',", a.Date));
  400. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  401. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  402. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  403. });
  404. sb.Append(sbDays.ToString().TrimEnd(',')).
  405. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  406. Append(sbDaysStock.ToString().TrimEnd(',')).
  407. Append("]},{name:'日出库数量',type:'line',data:[").
  408. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  409. Append("]},{name:'日入库数量',type:'line',data:[").
  410. Append(sbDaysInStock.ToString().TrimEnd(',')).
  411. Append("]}").Append("]}");
  412. return sb.ToString();
  413. }else
  414. {
  415. string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,0.0 AS SuggestQty from [dbo].[15PLT] t";
  416. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  417. StringBuilder sb = new StringBuilder();
  418. StringBuilder sbDays = new StringBuilder();
  419. StringBuilder sbDaysStock = new StringBuilder();
  420. StringBuilder sbDaysInStock = new StringBuilder();
  421. StringBuilder sbDaysOutStock = new StringBuilder();
  422. sb.Append("{tooltip:{trigger:'axis'},legend:{data: ['日库存数量','日出库数量','日入库数量']},grid:{left:'3%',right:'4%',bottom:'3%',containLabel:true},toolbox:{feature:{saveAsImage: {}}},xAxis: {type:'category',boundaryGap: false,data:[");
  423. chartDtosTest.ForEach(a =>
  424. {
  425. sbDays.Append(string.Format("'{0}',", a.Date));
  426. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  427. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  428. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  429. });
  430. sb.Append(sbDays.ToString().TrimEnd(',')).
  431. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  432. Append(sbDaysStock.ToString().TrimEnd(',')).
  433. Append("]},{name:'日出库数量',type:'line',data:[").
  434. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  435. Append("]},{name:'日入库数量',type:'line',data:[").
  436. Append(sbDaysInStock.ToString().TrimEnd(',')).
  437. Append("]}").Append("]}");
  438. return sb.ToString();
  439. }
  440. }
  441. public string ChartLineModelOption(string factory_id, string model,string avgHW, string avgGK, string avgT1, string avgTotal)
  442. {
  443. var loclist = _DMS_IN_LOCDETAIL.Select(a => a.UPN == model);
  444. var lotList=loclist.Select(a => a.LOT).Distinct().ToList();
  445. decimal? hw = 0;
  446. decimal? gk = 0;
  447. decimal? t1 = 0;
  448. decimal? total = 0;
  449. lotList.ForEach(a =>
  450. {
  451. var itemHW = loclist.Where(x => x.LOT == a && x.DealerLevel == "LP" && x.DealerCode == "RQ000002").ToList();
  452. if(itemHW.Count>0)
  453. {
  454. hw += itemHW.OrderByDescending(y => y.InventoryDate).First().Qty;
  455. }
  456. var itemGK = loclist.Where(x => x.LOT == a && x.DealerLevel == "LP" && x.DealerCode == "RQ000005").ToList();
  457. if (itemGK.Count > 0)
  458. {
  459. gk += itemGK.OrderByDescending(y => y.InventoryDate).First().Qty;
  460. }
  461. var itemT1 = loclist.Where(x => x.LOT == a && (x.DealerLevel == "T1" || x.DealerLevel == "LS")).ToList();
  462. if (itemT1.Count > 0)
  463. {
  464. t1 += itemT1.OrderByDescending(y => y.InventoryDate).First().Qty;
  465. }
  466. });
  467. total=hw+gk+t1;
  468. if(avgHW!="0")
  469. {
  470. string numDecimalStr = (hw.Value / decimal.Parse(avgHW)).ToString("#0.00");
  471. hw = decimal.Parse(numDecimalStr);
  472. }else
  473. {
  474. hw = 0;
  475. }
  476. if (avgGK != "0")
  477. {
  478. string numDecimalStr = (hw.Value / decimal.Parse(avgGK)).ToString("#0.00");
  479. gk = decimal.Parse(numDecimalStr);
  480. }
  481. else
  482. {
  483. gk = 0;
  484. }
  485. if (avgT1 != "0")
  486. {
  487. string numDecimalStr = (hw.Value / decimal.Parse(avgT1)).ToString("#0.00");
  488. t1 = decimal.Parse(numDecimalStr);
  489. }
  490. else
  491. {
  492. t1 = 0;
  493. }
  494. if (avgTotal != "0")
  495. {
  496. string numDecimalStr = (hw.Value / decimal.Parse(avgTotal)).ToString("#0.00");
  497. total = decimal.Parse(numDecimalStr);
  498. }
  499. else
  500. {
  501. total = 0;
  502. }
  503. StringBuilder sb = new StringBuilder();
  504. sb.Append("{title: {text:'库存可供应周期(月)',left: 'center'},xAxis:{type:'category',data:['海王库存','国科库存','T1','Total']},yAxis:{type:'value'},series:[{data:[" + hw+","+gk+","+t1+","+total+"],type:'bar',label:{show:true,position:'top'},itemStyle:{normal:{color:function(params){if(params.value<4){return 'red';}else{return '#5470c6';}}}}}]}");
  505. return sb.ToString();
  506. }
  507. public string ChartLineOutStockOption(string factory_id, string model)
  508. {
  509. DateOnly dateOnly = DateOnly.FromDateTime(DateTime.Now.AddMonths(-14));
  510. var polist=_DMS_IN_PODETAIL.Select(a => a.UPN == model && a.OrderStatus != "Revoked" && a.OrderStatus != "Rejected" && a.SubmitDate>=dateOnly);
  511. StringBuilder sbDate = new StringBuilder();
  512. StringBuilder sbHWOutStock = new StringBuilder();
  513. StringBuilder sbGKOutStock = new StringBuilder();
  514. StringBuilder sbT1OutStock = new StringBuilder();
  515. StringBuilder sbTotalOutStock = new StringBuilder();
  516. for (int i=-14;i<1;i++)
  517. {
  518. sbDate.Append(string.Format("'{0}',",DateTime.Now.AddMonths(i).Date.ToString("yyyy-MM-dd")));
  519. var hw = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(i)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(i + 1)) && a.DealerCode== "RQ000002" && a.DealerLevel=="LP").Sum(a => a.RequiredQty);
  520. var gk = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(i)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(i + 1)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty);
  521. var t1 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(i)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(i + 1)) &&(a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty);
  522. var total = hw + gk + t1;
  523. sbHWOutStock.Append(string.Format("{0},", hw));
  524. sbGKOutStock.Append(string.Format("{0},", gk));
  525. sbT1OutStock.Append(string.Format("{0},", t1));
  526. sbTotalOutStock.Append(string.Format("{0},", total));
  527. }
  528. StringBuilder sb = new StringBuilder();
  529. sb.Append("{title: {text:'");
  530. sb.Append(model+"出货趋势',");
  531. sb.Append("left: 'center',},tooltip: {trigger: 'axis'},legend: {data:['海王', '国科', 'T1','Total'],bottom:-5,orient: 'horizontal'},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis:{type: 'category',boundaryGap: false,data:[");
  532. sb.Append(sbDate.ToString().TrimEnd(',')).
  533. Append("]},yAxis:{type:'value',},series:[{name:'海王',type:'line',stack: 'Total',data:[").
  534. Append(sbHWOutStock.ToString().TrimEnd(',')).
  535. Append("]},{name:'国科',type:'line',stack:'Total',data:[").
  536. Append(sbGKOutStock.ToString().TrimEnd(',')).
  537. Append("]},{name:'T1',type:'line',stack:'Total',data:[").
  538. Append(sbT1OutStock.ToString().TrimEnd(',')).
  539. Append("]},{name:'Total',type:'line',stack:'Total',data:[").
  540. Append(sbTotalOutStock.ToString().TrimEnd(',')).
  541. Append("]}]}");
  542. return sb.ToString();
  543. }
  544. public string ChartLineOutStock(string factory_id, string model)
  545. {
  546. DateOnly dateOnly = DateOnly.FromDateTime(DateTime.Now.AddMonths(-14));
  547. var polist = _DMS_IN_PODETAIL.Select(a => a.UPN == model && a.OrderStatus != "Revoked" && a.OrderStatus != "Rejected" && a.SubmitDate >= dateOnly);
  548. List<ModelMonthOutkDto> modelMonthOuts=new List<ModelMonthOutkDto>();
  549. ModelMonthOutkDto stockDto1 = new ModelMonthOutkDto();
  550. stockDto1.Month0 = "海王";
  551. stockDto1.Month1 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-14)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-13)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  552. stockDto1.Month2 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-13)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-12)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  553. stockDto1.Month3 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-12)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-11)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  554. stockDto1.Month4 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-11)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-10)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  555. stockDto1.Month5 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-10)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-9)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  556. stockDto1.Month6 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-9)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-8)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  557. stockDto1.Month7 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-8)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-7)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  558. stockDto1.Month8 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-7)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-6)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  559. stockDto1.Month9 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-6)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-5)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  560. stockDto1.Month10 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-5)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-4)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  561. stockDto1.Month11 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-4)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-3)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  562. stockDto1.Month12 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-3)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-2)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  563. stockDto1.Month13 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-2)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-1)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  564. stockDto1.Month14 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-1)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(0)) && a.DealerCode == "RQ000002" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  565. modelMonthOuts.Add(stockDto1);
  566. ModelMonthOutkDto stockDto2 = new ModelMonthOutkDto();
  567. stockDto2.Month0 = "国科";
  568. stockDto2.Month1 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-14)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-13)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value);
  569. stockDto2.Month2 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-13)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-12)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  570. stockDto2.Month3 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-12)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-11)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  571. stockDto2.Month4 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-11)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-10)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  572. stockDto2.Month5 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-10)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-9)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  573. stockDto2.Month6 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-9)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-8)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  574. stockDto2.Month7 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-8)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-7)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  575. stockDto2.Month8 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-7)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-6)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  576. stockDto2.Month9 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-6)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-5)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  577. stockDto2.Month10 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-5)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-4)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  578. stockDto2.Month11 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-4)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-3)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  579. stockDto2.Month12 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-3)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-2)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  580. stockDto2.Month13 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-2)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-1)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  581. stockDto2.Month14 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-1)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(0)) && a.DealerCode == "RQ000005" && a.DealerLevel == "LP").Sum(a => a.RequiredQty.Value); ;
  582. modelMonthOuts.Add(stockDto2);
  583. ModelMonthOutkDto stockDto3 = new ModelMonthOutkDto();
  584. stockDto3.Month0 = "T1";
  585. stockDto3.Month1 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-14)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-13)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value);
  586. stockDto3.Month2 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-13)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-12)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  587. stockDto3.Month3 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-12)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-11)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  588. stockDto3.Month4 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-11)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-10)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  589. stockDto3.Month5 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-10)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-9)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  590. stockDto3.Month6 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-9)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-8)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  591. stockDto3.Month7 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-8)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-7)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  592. stockDto3.Month8 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-7)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-6)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  593. stockDto3.Month9 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-6)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-5)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  594. stockDto3.Month10 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-5)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-4)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  595. stockDto3.Month11 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-4)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-3)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  596. stockDto3.Month12 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-3)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-2)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  597. stockDto3.Month13 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-2)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(-1)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  598. stockDto3.Month14 = polist.Where(a => a.SubmitDate >= DateOnly.FromDateTime(DateTime.Now.AddMonths(-1)) && a.SubmitDate < DateOnly.FromDateTime(DateTime.Now.AddMonths(0)) && (a.DealerLevel == "LP" || a.DealerLevel == "LS")).Sum(a => a.RequiredQty.Value); ;
  599. modelMonthOuts.Add(stockDto3);
  600. ModelMonthOutkDto stockDto4 = new ModelMonthOutkDto();
  601. stockDto4.Month0 = "Total";
  602. stockDto4.Month1 =stockDto1.Month1+stockDto2.Month1+stockDto3.Month1;
  603. stockDto4.Month2 = stockDto1.Month2 + stockDto2.Month2 + stockDto3.Month2;
  604. stockDto4.Month3 = stockDto1.Month3 + stockDto2.Month3 + stockDto3.Month3;
  605. stockDto4.Month4 = stockDto1.Month4 + stockDto2.Month4 + stockDto3.Month4;
  606. stockDto4.Month5 = stockDto1.Month5 + stockDto2.Month5 + stockDto3.Month5;
  607. stockDto4.Month6 = stockDto1.Month6 + stockDto2.Month6 + stockDto3.Month6;
  608. stockDto4.Month7 = stockDto1.Month7 + stockDto2.Month7 + stockDto3.Month7;
  609. stockDto4.Month8 = stockDto1.Month8 + stockDto2.Month8 + stockDto3.Month8;
  610. stockDto4.Month9 = stockDto1.Month9 + stockDto2.Month9 + stockDto3.Month9;
  611. stockDto4.Month10 = stockDto1.Month10 + stockDto2.Month10 + stockDto3.Month10;
  612. stockDto4.Month11 = stockDto1.Month11 + stockDto2.Month11 + stockDto3.Month11;
  613. stockDto4.Month12 = stockDto1.Month12 + stockDto2.Month12 + stockDto3.Month12;
  614. stockDto4.Month13 = stockDto1.Month13 + stockDto2.Month13 + stockDto3.Month13;
  615. stockDto4.Month14 = stockDto1.Month14 + stockDto2.Month14 + stockDto3.Month14;
  616. modelMonthOuts.Add(stockDto4);
  617. ModelMonthOutkDto stockDto5 = new ModelMonthOutkDto();
  618. stockDto5.Month0 = "海王均值";
  619. stockDto5.Month1 = decimal.Ceiling((stockDto1.Month12+stockDto1.Month13+stockDto1.Month14)/3);
  620. stockDto5.Month2 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  621. stockDto5.Month3 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  622. stockDto5.Month4 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  623. stockDto5.Month5 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  624. stockDto5.Month6 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  625. stockDto5.Month7 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  626. stockDto5.Month8 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  627. stockDto5.Month9 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  628. stockDto5.Month10 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  629. stockDto5.Month11 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  630. stockDto5.Month12 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  631. stockDto5.Month13 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  632. stockDto5.Month14 = decimal.Ceiling((stockDto1.Month12 + stockDto1.Month13 + stockDto1.Month14) / 3);
  633. modelMonthOuts.Add(stockDto5);
  634. ModelMonthOutkDto stockDto6 = new ModelMonthOutkDto();
  635. stockDto6.Month0 = "国科均值";
  636. stockDto6.Month1 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  637. stockDto6.Month2 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  638. stockDto6.Month3 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  639. stockDto6.Month4 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  640. stockDto6.Month5 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  641. stockDto6.Month6 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  642. stockDto6.Month7 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  643. stockDto6.Month8 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  644. stockDto6.Month9 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  645. stockDto6.Month10 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  646. stockDto6.Month11 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  647. stockDto6.Month12 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  648. stockDto6.Month13 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  649. stockDto6.Month14 = decimal.Ceiling((stockDto2.Month12 + stockDto2.Month13 + stockDto2.Month14) / 3);
  650. modelMonthOuts.Add(stockDto6);
  651. ModelMonthOutkDto stockDto7 = new ModelMonthOutkDto();
  652. stockDto7.Month0 = "T1均值";
  653. stockDto7.Month1 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  654. stockDto7.Month2 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  655. stockDto7.Month3 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  656. stockDto7.Month4 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  657. stockDto7.Month5 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  658. stockDto7.Month6 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  659. stockDto7.Month7 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  660. stockDto7.Month8 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  661. stockDto7.Month9 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  662. stockDto7.Month10 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  663. stockDto7.Month11 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  664. stockDto7.Month12 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  665. stockDto7.Month13 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  666. stockDto7.Month14 = decimal.Ceiling((stockDto3.Month12 + stockDto3.Month13 + stockDto3.Month14) / 3);
  667. modelMonthOuts.Add(stockDto7);
  668. ModelMonthOutkDto stockDto8 = new ModelMonthOutkDto();
  669. stockDto8.Month0 = "Total均值";
  670. stockDto8.Month1 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  671. stockDto8.Month2 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  672. stockDto8.Month3 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  673. stockDto8.Month4 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  674. stockDto8.Month5 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  675. stockDto8.Month6 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  676. stockDto8.Month7 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  677. stockDto8.Month8 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  678. stockDto8.Month9 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  679. stockDto8.Month10 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  680. stockDto8.Month11 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  681. stockDto8.Month12 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  682. stockDto8.Month13 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  683. stockDto8.Month14 = decimal.Ceiling((stockDto4.Month12 + stockDto4.Month13 + stockDto4.Month14) / 3);
  684. modelMonthOuts.Add(stockDto8);
  685. return JsonConvert.SerializeObject(modelMonthOuts);
  686. }
  687. /// <summary>
  688. ///
  689. /// </summary>
  690. /// <param name="factory_id"></param>
  691. /// <param name="isItemNum">统计维度:M物料、S系列</param>
  692. /// <param name="itemNumRange">统计范围:F工厂、G国科、H海王、A工厂+平台</param>
  693. /// <param name="itemNum">物料编码</param>
  694. /// <param name="groupBy">系列</param>
  695. /// <returns></returns>
  696. public string ForecastActual(string factory_id, string isItemNum, string itemNumRange, string itemNum, string groupBy)
  697. {
  698. string sql = $"exec [dbo].[pr_DOP_InventoryMonitoring]";
  699. var InventoryDto = _businessDbContext.InventoryDto.FromSqlRaw(sql).ToList();
  700. DateOnly dateOnly = DateOnly.FromDateTime(DateTime.Now.AddMonths(-2));
  701. var polist = _DMS_IN_PODETAIL.Select(a =>a.SubmitDate >= dateOnly && a.OrderStatus != "Revoked" && a.OrderStatus != "Rejected");
  702. var rqShip = _aSNBOLShipperDetail.Select(a => a.CreateTime >= DateTime.Now.AddMonths(-2) && a.Domain == factory_id);
  703. List<ForecastActualDto> modelMonthOuts = new List<ForecastActualDto>();
  704. string strMonth1 = DateTime.Now.AddMonths(-1).ToString("yyyy-MM");
  705. string strMonth2 = DateTime.Now.ToString("yyyy-MM");
  706. //按照物料统计
  707. if (isItemNum == "M")
  708. {
  709. switch (itemNumRange)
  710. {
  711. case "F":
  712. if(!string.IsNullOrEmpty(itemNum))
  713. {
  714. var shipPlan=_monthlyShipmentPlan.GetListAsync(a => a.SAPItemNumber == itemNum && (a.PlanMonth== strMonth1 || a.PlanMonth == strMonth2)
  715. && a.DistributionChannel == "瑞奇").Result;
  716. var itemDto = InventoryDto.Find(a => a.ItemNumber == itemNum);
  717. if(itemDto!=null)
  718. {
  719. ForecastActualDto forecastActualDto = new ForecastActualDto();
  720. forecastActualDto.ItemNum = itemNum;
  721. forecastActualDto.GroupBy = itemDto.Series;
  722. forecastActualDto.StockTurnOver = itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand==0?0:decimal.Ceiling((itemDto.GKInv+ itemDto.HWInv)/(itemDto.GKMonthlyDemand+ itemDto.HWMonthlyDemand));
  723. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  724. forecastActualDto.M1Plan = 0;
  725. forecastActualDto.M2Plan = 0;
  726. if (shipPlan.Any(a=> a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  727. {
  728. forecastActualDto.M1Plan = shipPlan.Find(a=>a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  729. }
  730. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  731. {
  732. forecastActualDto.M2Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  733. }
  734. forecastActualDto.M1Real = rqShip.Where(a=>a.ContainerItem==itemNum && a.CreateTime>=DateTime.Now.AddMonths(-2) && a.CreateTime < DateTime.Now.AddMonths(-1)).Sum(b=>b.QtyToShip.Value);
  735. forecastActualDto.M2Real = rqShip.Where(a => a.ContainerItem == itemNum && a.CreateTime >= DateTime.Now.AddMonths(-1) && a.CreateTime < DateTime.Now).Sum(b => b.QtyToShip.Value);
  736. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  737. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  738. modelMonthOuts.Add(forecastActualDto);
  739. }
  740. }else
  741. {
  742. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)
  743. && a.DistributionChannel == "瑞奇").Result;
  744. var itemList = _itemMaster.Select(a =>a.ItemType == "RS50" && a.Domain==factory_id).Select(a=>a.ItemNum).Distinct().ToList();
  745. var shipItemList = shipPlan.Select(a => a.SAPItemNumber).Distinct().ToList();
  746. var intersection = itemList.Intersect(shipItemList).ToList();
  747. intersection.ForEach(x=>
  748. {
  749. var itemDto = InventoryDto.Find(a => a.ItemNumber == x);
  750. if (itemDto != null)
  751. {
  752. ForecastActualDto forecastActualDto = new ForecastActualDto();
  753. forecastActualDto.ItemNum = x;
  754. forecastActualDto.GroupBy = itemDto.Series;
  755. forecastActualDto.StockTurnOver = itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand == 0 ? 0 : decimal.Ceiling((itemDto.GKInv + itemDto.HWInv) / (itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand));
  756. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  757. forecastActualDto.M1Plan = 0;
  758. forecastActualDto.M2Plan = 0;
  759. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  760. {
  761. forecastActualDto.M1Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  762. }
  763. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  764. {
  765. forecastActualDto.M2Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  766. }
  767. forecastActualDto.M1Real = rqShip.Where(a => a.ContainerItem == itemNum && a.CreateTime >= DateTime.Now.AddMonths(-2) && a.CreateTime < DateTime.Now.AddMonths(-1)).Sum(b => b.QtyToShip.Value);
  768. forecastActualDto.M2Real = rqShip.Where(a => a.ContainerItem == itemNum && a.CreateTime >= DateTime.Now.AddMonths(-1) && a.CreateTime < DateTime.Now).Sum(b => b.QtyToShip.Value);
  769. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  770. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  771. modelMonthOuts.Add(forecastActualDto);
  772. }
  773. });
  774. }
  775. break;
  776. case "G":
  777. case "H":
  778. string gkhw = itemNumRange == "G" ? "国科" : "海王";
  779. string gkhwcode = itemNumRange == "G" ? "RQ000005" : "RQ000002";
  780. if (!string.IsNullOrEmpty(itemNum))
  781. {
  782. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => a.SAPItemNumber == itemNum && (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2) && a.DistributionChannel == gkhw).Result;
  783. var item = _DMS_IN_ITEMMAPPING.Select(a => a.CfnERPCode == itemNum);
  784. if (item != null && item.Count>0)
  785. {
  786. var itemDto = InventoryDto.Find(a => a.ItemNumber == itemNum);
  787. if (itemDto != null)
  788. {
  789. //表没有主键索引,用仓储查询很慢,改用这种方式
  790. string month1 = $"select '{itemNum}' AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] where UPN='{item[0].CfnCode}' and DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by UPN";
  791. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  792. string month2 = $"select '{itemNum}' AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] where UPN='{item[0].CfnCode}' and DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by UPN";
  793. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  794. ForecastActualDto forecastActualDto = new ForecastActualDto();
  795. forecastActualDto.ItemNum = itemNum;
  796. forecastActualDto.GroupBy = itemDto.Series;
  797. forecastActualDto.StockTurnOver = itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand == 0 ? 0 : decimal.Ceiling((itemDto.GKInv + itemDto.HWInv) / (itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand));
  798. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  799. forecastActualDto.M1Plan = 0;
  800. forecastActualDto.M2Plan = 0;
  801. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  802. {
  803. forecastActualDto.M1Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  804. }
  805. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  806. {
  807. forecastActualDto.M2Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  808. }
  809. forecastActualDto.M1Real = month1Qty.Sum(a => a.Qty);
  810. forecastActualDto.M2Real = month2Qty.Sum(a => a.Qty);
  811. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  812. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  813. modelMonthOuts.Add(forecastActualDto);
  814. }
  815. }
  816. }
  817. else
  818. {
  819. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2) && a.DistributionChannel == gkhw).Result;
  820. var itemList = _itemMaster.Select(a => a.ItemType == "RS50" && a.Domain == factory_id).Select(a => a.ItemNum).Distinct().ToList();
  821. string month1 = $"Select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  822. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  823. string month2 = $"Select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  824. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  825. var shipItemList = shipPlan.Select(a => a.SAPItemNumber).Distinct().ToList();
  826. var intersection = itemList.Intersect(shipItemList).ToList();
  827. intersection.ForEach(x =>
  828. {
  829. var itemDto = InventoryDto.Find(a => a.ItemNumber == x);
  830. if (itemDto != null)
  831. {
  832. ForecastActualDto forecastActualDto = new ForecastActualDto();
  833. forecastActualDto.ItemNum = x;
  834. forecastActualDto.GroupBy = itemDto.Series;
  835. forecastActualDto.StockTurnOver = itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand == 0 ? 0 : decimal.Ceiling((itemDto.GKInv + itemDto.HWInv) / (itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand));
  836. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  837. forecastActualDto.M1Plan = 0;
  838. forecastActualDto.M2Plan = 0;
  839. if (shipPlan.Any(a => a.SAPItemNumber==x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  840. {
  841. forecastActualDto.M1Plan = shipPlan.Find(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  842. }
  843. if (shipPlan.Any(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  844. {
  845. forecastActualDto.M2Plan = shipPlan.Find(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  846. }
  847. forecastActualDto.M1Real = month1Qty.Where(a => a.ItemNum == x).Sum(a => a.Qty);
  848. forecastActualDto.M2Real = month2Qty.Where(a => a.ItemNum == x).Sum(a => a.Qty);
  849. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  850. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  851. modelMonthOuts.Add(forecastActualDto);
  852. }
  853. });
  854. }
  855. break;
  856. case "A":
  857. if (!string.IsNullOrEmpty(itemNum))
  858. {
  859. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => a.SAPItemNumber == itemNum && (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)).Result;
  860. var item = _DMS_IN_ITEMMAPPING.Select(a => a.CfnERPCode == itemNum);
  861. if (item != null && item.Count>0)
  862. {
  863. var itemDto = InventoryDto.Find(a => a.ItemNumber == itemNum);
  864. if (itemDto != null)
  865. {
  866. //表没有主键索引,用仓储查询很慢,改用这种方式
  867. string month1 = $"select '{itemNum}' AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] where UPN='{item[0].CfnCode}' and ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by UPN";
  868. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  869. string month2 = $"select '{itemNum}' AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] where UPN='{item[0].CfnCode}' and ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by UPN";
  870. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  871. ForecastActualDto forecastActualDto = new ForecastActualDto();
  872. forecastActualDto.ItemNum = itemNum;
  873. forecastActualDto.GroupBy = itemDto.Series;
  874. forecastActualDto.StockTurnOver = itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand == 0 ? 0 : decimal.Ceiling((itemDto.GKInv + itemDto.HWInv) / (itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand));
  875. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  876. forecastActualDto.M1Plan = 0;
  877. forecastActualDto.M2Plan = 0;
  878. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  879. {
  880. forecastActualDto.M1Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  881. }
  882. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  883. {
  884. forecastActualDto.M2Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  885. }
  886. forecastActualDto.M1Real = month1Qty.Sum(a => a.Qty);
  887. forecastActualDto.M2Real = month2Qty.Sum(a => a.Qty);
  888. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  889. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  890. modelMonthOuts.Add(forecastActualDto);
  891. }
  892. }
  893. }
  894. else
  895. {
  896. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)).Result;
  897. var itemList = _itemMaster.Select(a => a.ItemType == "RS50" && a.Domain == factory_id).Select(a => a.ItemNum).Distinct().ToList();
  898. string month1 = $"Select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  899. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  900. string month2 = $"Select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  901. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  902. var shipItemList = shipPlan.Select(a => a.SAPItemNumber).Distinct().ToList();
  903. var intersection = itemList.Intersect(shipItemList).ToList();
  904. intersection.ForEach(x =>
  905. {
  906. var itemDto = InventoryDto.Find(a => a.ItemNumber == x);
  907. if (itemDto != null)
  908. {
  909. ForecastActualDto forecastActualDto = new ForecastActualDto();
  910. forecastActualDto.ItemNum = x;
  911. forecastActualDto.GroupBy = itemDto.Series;
  912. forecastActualDto.StockTurnOver = itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand == 0 ? 0 : decimal.Ceiling((itemDto.GKInv + itemDto.HWInv) / (itemDto.GKMonthlyDemand + itemDto.HWMonthlyDemand));
  913. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  914. forecastActualDto.M1Plan = 0;
  915. forecastActualDto.M2Plan = 0;
  916. if (shipPlan.Any(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  917. {
  918. forecastActualDto.M1Plan = shipPlan.Find(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  919. }
  920. if (shipPlan.Any(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  921. {
  922. forecastActualDto.M2Plan = shipPlan.Find(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  923. }
  924. forecastActualDto.M1Real = month1Qty.Where(a => a.ItemNum == x).Sum(a => a.Qty);
  925. forecastActualDto.M2Real = month2Qty.Where(a => a.ItemNum == x).Sum(a => a.Qty);
  926. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  927. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  928. modelMonthOuts.Add(forecastActualDto);
  929. }
  930. });
  931. }
  932. break;
  933. default:
  934. break;
  935. }
  936. }else
  937. {
  938. switch (itemNumRange)
  939. {
  940. case "F":
  941. if (!string.IsNullOrEmpty(groupBy))
  942. {
  943. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => a.ProdRange == groupBy && (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2) && a.DistributionChannel == "瑞奇").Result;
  944. var itemList=_itemMaster.Select(a => a.Series == groupBy && a.ItemType == "RS50").Select(b => b.ItemNum).Distinct().ToList();
  945. var itemDto = InventoryDto.Where(a => a.Series == groupBy && itemList.Contains(a.ItemNumber)).ToList();
  946. if (itemDto != null && itemDto.Count>0)
  947. {
  948. ForecastActualDto forecastActualDto = new ForecastActualDto();
  949. forecastActualDto.GroupBy =groupBy;
  950. decimal sumDemand = itemDto.Sum(a => a.GKMonthlyDemand + a.HWMonthlyDemand);
  951. decimal sumInv = itemDto.Sum(a => a.GKInv + a.HWInv);
  952. forecastActualDto.StockTurnOver = sumDemand == 0 ? 0 : decimal.Ceiling(sumInv / sumDemand);
  953. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  954. forecastActualDto.M1Plan = 0;
  955. forecastActualDto.M2Plan = 0;
  956. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM") && itemList.Contains(a.SAPItemNumber)))
  957. {
  958. forecastActualDto.M1Plan = shipPlan.Where(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM") && itemList.Contains(a.SAPItemNumber)).Sum(x=>x.Qty);
  959. }
  960. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  961. {
  962. forecastActualDto.M2Plan = shipPlan.Where(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM") && itemList.Contains(a.SAPItemNumber)).Sum(x=>x.Qty);
  963. }
  964. forecastActualDto.M1Real = rqShip.Where(a => itemList.Contains(a.ContainerItem) && a.CreateTime >= DateTime.Now.AddMonths(-2) && a.CreateTime < DateTime.Now.AddMonths(-1)).Sum(b => b.QtyToShip.Value);
  965. forecastActualDto.M2Real = rqShip.Where(a => itemList.ToList().Contains(a.ContainerItem) && a.CreateTime >= DateTime.Now.AddMonths(-1) && a.CreateTime < DateTime.Now).Sum(b => b.QtyToShip.Value);
  966. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  967. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  968. modelMonthOuts.Add(forecastActualDto);
  969. }
  970. }
  971. else
  972. {
  973. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)&& a.DistributionChannel == "瑞奇").Result;
  974. var itemSeriesList = _itemMaster.Select(a =>a.ItemType == "RS50");
  975. var shipSeriesList = shipPlan.Select(a => a.ProdRange).Distinct().ToList();
  976. var ItemSeriesList = itemSeriesList.Select(a => a.Series).Distinct().ToList();
  977. var intersection = ItemSeriesList.Intersect(shipSeriesList).ToList();
  978. intersection.ForEach(x =>
  979. {
  980. var itemDto = InventoryDto.Where(a => a.Series == x).ToList();
  981. var itemNumList= itemSeriesList.Where(a=>a.Series==x).Select(a=>a.ItemNum).Distinct().ToList();
  982. if (itemDto != null && itemDto.Count > 0)
  983. {
  984. ForecastActualDto forecastActualDto = new ForecastActualDto();
  985. forecastActualDto.GroupBy =x;
  986. decimal sumDemand = itemDto.Sum(a => a.GKMonthlyDemand + a.HWMonthlyDemand);
  987. decimal sumInv = itemDto.Sum(a => a.GKInv + a.HWInv);
  988. forecastActualDto.StockTurnOver = sumDemand == 0 ? 0 : decimal.Ceiling(sumInv / sumDemand);
  989. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  990. forecastActualDto.M1Plan = 0;
  991. forecastActualDto.M2Plan = 0;
  992. if (shipPlan.Any(a => itemNumList.Contains(a.SAPItemNumber) && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  993. {
  994. forecastActualDto.M1Plan = shipPlan.Find(a => itemNumList.Contains(a.SAPItemNumber) && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  995. }
  996. if (shipPlan.Any(a => itemNumList.Contains(a.SAPItemNumber) && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  997. {
  998. forecastActualDto.M2Plan = shipPlan.Find(a => itemNumList.Contains(a.SAPItemNumber) && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  999. }
  1000. forecastActualDto.M1Real = rqShip.Where(a => itemNumList.Contains(a.ContainerItem) && a.CreateTime >= DateTime.Now.AddMonths(-2) && a.CreateTime < DateTime.Now.AddMonths(-1)).Sum(b => b.QtyToShip.Value);
  1001. forecastActualDto.M2Real = rqShip.Where(a => itemNumList.Contains(a.ContainerItem) && a.CreateTime >= DateTime.Now.AddMonths(-1) && a.CreateTime < DateTime.Now).Sum(b => b.QtyToShip.Value);
  1002. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  1003. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  1004. modelMonthOuts.Add(forecastActualDto);
  1005. }
  1006. });
  1007. }
  1008. break;
  1009. case "G":
  1010. case "H":
  1011. string gkhw = itemNumRange == "G" ? "国科" : "海王";
  1012. string gkhwcode = itemNumRange == "G" ? "RQ000005" : "RQ000002";
  1013. if (!string.IsNullOrEmpty(groupBy))
  1014. {
  1015. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => a.ProdRange == groupBy && (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2) && a.DistributionChannel == gkhw).Result;
  1016. var itemList = _itemMaster.Select(a => a.Series == groupBy && a.ItemType == "RS50").Distinct().ToList();
  1017. var item = _DMS_IN_ITEMMAPPING.Select(a => itemList.Select(a => a.ItemNum).ToList().Contains(a.CfnERPCode));
  1018. string result = string.Join("','", item.Select(a=>a.CfnCode).Distinct().ToList());
  1019. if (item != null)
  1020. {
  1021. var itemDto = InventoryDto.Where(a =>a.Series==groupBy).ToList();
  1022. if (itemDto != null && itemDto.Count > 0)
  1023. {
  1024. //表没有主键索引,用仓储查询很慢,改用这种方式
  1025. string month1 = $"select B.CfnERPCode AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode and UPN in('{result}') and DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1026. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  1027. string month2 = $"select B.CfnERPCode AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode and UPN in('{result}') and DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1028. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  1029. ForecastActualDto forecastActualDto = new ForecastActualDto();
  1030. forecastActualDto.GroupBy = groupBy;
  1031. decimal sumDemand = itemDto.Sum(a => a.GKMonthlyDemand + a.HWMonthlyDemand);
  1032. decimal sumInv = itemDto.Sum(a => a.GKInv + a.HWInv);
  1033. forecastActualDto.StockTurnOver = sumDemand == 0 ? 0 : decimal.Ceiling(sumInv / sumDemand);
  1034. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  1035. forecastActualDto.M1Plan = 0;
  1036. forecastActualDto.M2Plan = 0;
  1037. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  1038. {
  1039. forecastActualDto.M1Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  1040. }
  1041. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  1042. {
  1043. forecastActualDto.M2Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  1044. }
  1045. forecastActualDto.M1Real = month1Qty.Sum(a => a.Qty);
  1046. forecastActualDto.M2Real = month2Qty.Sum(a => a.Qty);
  1047. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  1048. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  1049. modelMonthOuts.Add(forecastActualDto);
  1050. }
  1051. }
  1052. }
  1053. else
  1054. {
  1055. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)&& a.DistributionChannel == gkhw).Result;
  1056. string month1 = $"select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1057. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  1058. string month2 = $"select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where DealerLevel='T2' and ParentDealerCode='{gkhwcode}' and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1059. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  1060. var itemList = _itemMaster.Select(a =>a.ItemType == "RS50").Distinct().ToList();
  1061. var item = _DMS_IN_ITEMMAPPING.Select(a => itemList.Select(a => a.ItemNum).ToList().Contains(a.CfnERPCode));
  1062. string result = string.Join("','", item.Select(a => a.CfnCode).Distinct().ToList());
  1063. var seriesList=itemList.Select(a => a.Series).Distinct().ToList();
  1064. seriesList.ForEach(x =>
  1065. {
  1066. var itemDto = InventoryDto.Where(a => a.Series == x).ToList();
  1067. if (itemDto != null && itemDto.Count > 0)
  1068. {
  1069. ForecastActualDto forecastActualDto = new ForecastActualDto();
  1070. forecastActualDto.GroupBy = x;
  1071. decimal sumDemand = itemDto.Sum(a => a.GKMonthlyDemand + a.HWMonthlyDemand);
  1072. decimal sumInv = itemDto.Sum(a => a.GKInv + a.HWInv);
  1073. forecastActualDto.StockTurnOver = sumDemand == 0 ? 0 : decimal.Ceiling(sumInv / sumDemand);
  1074. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  1075. forecastActualDto.M1Plan = 0;
  1076. forecastActualDto.M2Plan = 0;
  1077. if (shipPlan.Any(a => a.ProdRange == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  1078. {
  1079. forecastActualDto.M1Plan = shipPlan.Where(a => a.ProdRange == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Sum(q=>q.Qty);
  1080. }
  1081. if (shipPlan.Any(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  1082. {
  1083. forecastActualDto.M2Plan = shipPlan.Where(a => a.ProdRange == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Sum(q => q.Qty);
  1084. }
  1085. List<string> seriesItemnum = new List<string>();
  1086. seriesItemnum.AddRange(itemList.Where(a => a.Series == x).Select(a => a.ItemNum).Distinct());
  1087. forecastActualDto.M1Real = month1Qty.Where(a => seriesItemnum.Contains(a.ItemNum)).Sum(a => a.Qty);
  1088. forecastActualDto.M2Real = month2Qty.Where(a => seriesItemnum.Contains(a.ItemNum)).Sum(a => a.Qty);
  1089. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  1090. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  1091. modelMonthOuts.Add(forecastActualDto);
  1092. }
  1093. });
  1094. }
  1095. break;
  1096. case "A":
  1097. if (!string.IsNullOrEmpty(groupBy))
  1098. {
  1099. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => a.ProdRange == groupBy && (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)).Result;
  1100. var itemList = _itemMaster.Select(a => a.Series == groupBy && a.ItemType == "RS50").Distinct().ToList();
  1101. var item = _DMS_IN_ITEMMAPPING.Select(a => itemList.Select(a => a.ItemNum).ToList().Contains(a.CfnERPCode));
  1102. string result = string.Join("','", item.Select(a => a.CfnCode).Distinct().ToList());
  1103. if (item != null)
  1104. {
  1105. var itemDto = InventoryDto.Where(a => a.Series == groupBy).ToList();
  1106. if (itemDto != null && itemDto.Count > 0)
  1107. {
  1108. //表没有主键索引,用仓储查询很慢,改用这种方式
  1109. string month1 = $"select B.CfnERPCode AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode and UPN='{item[0].CfnCode}' and ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1110. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  1111. string month2 = $"select B.CfnERPCode AS ItemNum,UPN,SUM(Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode and UPN='{item[0].CfnCode}' and ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1112. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  1113. ForecastActualDto forecastActualDto = new ForecastActualDto();
  1114. forecastActualDto.GroupBy = groupBy;
  1115. decimal sumDemand = itemDto.Sum(a => a.GKMonthlyDemand + a.HWMonthlyDemand);
  1116. decimal sumInv = itemDto.Sum(a => a.GKInv + a.HWInv);
  1117. forecastActualDto.StockTurnOver = sumDemand == 0 ? 0 : decimal.Ceiling(sumInv / sumDemand);
  1118. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  1119. forecastActualDto.M1Plan = 0;
  1120. forecastActualDto.M2Plan = 0;
  1121. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  1122. {
  1123. forecastActualDto.M1Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Qty;
  1124. }
  1125. if (shipPlan.Any(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  1126. {
  1127. forecastActualDto.M2Plan = shipPlan.Find(a => a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Qty;
  1128. }
  1129. forecastActualDto.M1Real = month1Qty.Sum(a => a.Qty);
  1130. forecastActualDto.M2Real = month2Qty.Sum(a => a.Qty);
  1131. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  1132. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  1133. modelMonthOuts.Add(forecastActualDto);
  1134. }
  1135. }
  1136. }
  1137. else
  1138. {
  1139. var shipPlan = _monthlyShipmentPlan.GetListAsync(a => (a.PlanMonth == strMonth1 || a.PlanMonth == strMonth2)).Result;
  1140. string month1 = $"select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-2).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1141. var month1Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month1).ToList();
  1142. string month2 = $"select B.CfnERPCode AS ItemNum,A.UPN,SUM(A.Qty) AS Qty from [dbo].[DMS_IN_SHIPPINGDETAIL] A Inner join [dbo].[DMS_IN_ITEMMAPPING] B on A.UPN=B.CfnCode where ((DealerLevel='T2' and (ParentDealerCode='RQ000005' or ParentDealerCode='RQ000002')) or (DealerLevel='T1' or DealerLevel='LS')) and Status !='Revoked' and Status !='Rejected' and ShipmentDate>='{DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd")}' and ShipmentDate<'{DateTime.Now.ToString("yyyy-MM-dd")}' group by B.CfnERPCode,UPN";
  1143. var month2Qty = _businessExtRADbContext.DMSShippingDetailDto.FromSqlRaw(month2).ToList();
  1144. var itemList = _itemMaster.Select(a =>a.ItemType == "RS50").Distinct().ToList();
  1145. var item = _DMS_IN_ITEMMAPPING.Select(a => itemList.Select(a => a.ItemNum).ToList().Contains(a.CfnERPCode));
  1146. string result = string.Join("','", item.Select(a => a.CfnCode).Distinct().ToList());
  1147. var seriesList = itemList.Select(a => a.Series).Distinct().ToList();
  1148. seriesList.ForEach(x =>
  1149. {
  1150. var itemDto = InventoryDto.Where(a => a.Series == x).ToList();
  1151. if (itemDto != null && itemDto.Count > 0)
  1152. {
  1153. ForecastActualDto forecastActualDto = new ForecastActualDto();
  1154. forecastActualDto.GroupBy = x;
  1155. decimal sumDemand = itemDto.Sum(a => a.GKMonthlyDemand + a.HWMonthlyDemand);
  1156. decimal sumInv = itemDto.Sum(a => a.GKInv + a.HWInv);
  1157. forecastActualDto.StockTurnOver = sumDemand == 0 ? 0 : decimal.Ceiling(sumInv / sumDemand);
  1158. //月度发货计划找不到可以去月度发货计划历史表按照版本号找,暂不处理
  1159. forecastActualDto.M1Plan = 0;
  1160. forecastActualDto.M2Plan = 0;
  1161. if (shipPlan.Any(a => a.ProdRange == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")))
  1162. {
  1163. forecastActualDto.M1Plan = shipPlan.Where(a => a.ProdRange == x && a.PlanMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM")).Sum(q => q.Qty);
  1164. }
  1165. if (shipPlan.Any(a => a.SAPItemNumber == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")))
  1166. {
  1167. forecastActualDto.M2Plan = shipPlan.Where(a => a.ProdRange == x && a.PlanMonth == DateTime.Now.ToString("yyyy-MM")).Sum(q => q.Qty);
  1168. }
  1169. List<string> seriesItemnum = new List<string>();
  1170. seriesItemnum.AddRange(itemList.Where(a => a.Series == x).Select(a => a.ItemNum).Distinct());
  1171. forecastActualDto.M1Real = month1Qty.Where(a => seriesItemnum.Contains(a.ItemNum)).Sum(a => a.Qty);
  1172. forecastActualDto.M2Real = month2Qty.Where(a => seriesItemnum.Contains(a.ItemNum)).Sum(a => a.Qty);
  1173. forecastActualDto.M1Diff = (forecastActualDto.M1Plan == 0 || forecastActualDto.M1Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M1Real / forecastActualDto.M1Plan)}%";
  1174. forecastActualDto.M2Diff = (forecastActualDto.M2Plan == 0 || forecastActualDto.M2Real == 0) ? "100%" : $"{decimal.Ceiling(forecastActualDto.M2Real / forecastActualDto.M2Plan)}%";
  1175. modelMonthOuts.Add(forecastActualDto);
  1176. }
  1177. });
  1178. }
  1179. break;
  1180. default:
  1181. break;
  1182. }
  1183. }
  1184. return JsonConvert.SerializeObject(modelMonthOuts);
  1185. }
  1186. /// <summary>
  1187. /// 从当前日期往前倒推进出存,最小默认取到2024-01-01,定时任务建议选择每天晚上9点-12点之间
  1188. /// </summary>
  1189. /// <param name="domain"></param>
  1190. /// <returns></returns>
  1191. public string CalcInvDayHist(string domain)
  1192. {
  1193. //取物料已计算进出存的最新日期
  1194. string sqlMaxHistDayTime = $"select t1.* from InvTransHistDay t1 inner join (SELECT max(HistDayTime) as HistDayTime, ItemNum FROM InvTransHistDay where Domain='{domain}' group by ItemNum) t2 on t1.HistDayTime=t2.HistDayTime and t1.ItemNum=t2.ItemNum and t1.Domain='{domain}'";
  1195. var HistMaxTimeDayDto = _businessDbContext.InvTransHistDay.FromSqlRaw(sqlMaxHistDayTime).ToList();
  1196. string sqlHistDetail = $"select A.ItemNum,Loc,LotSerial,BeginBalance,case when a.QtyChange>0 then a.QtyChange else 0 end as QtyChangeAdvance,case when a.QtyChange<0 then abs(a.QtyChange) else 0 end as QtyChangeOut,BeginBalance+QtyChange as BalanceNum,createTime from InvTransHist A where Domain='{domain}' and CreateTime>='2024-01-01'";
  1197. if (HistMaxTimeDayDto.Count>0)
  1198. {
  1199. sqlHistDetail = $"select A.ItemNum,Loc,LotSerial,BeginBalance,case when a.QtyChange>0 then a.QtyChange else 0 end as QtyChangeAdvance,case when a.QtyChange<0 then abs(a.QtyChange) else 0 end as QtyChangeOut,BeginBalance+QtyChange as BalanceNum,createTime from InvTransHist A where Domain='{domain}' and CreateTime>='{HistMaxTimeDayDto[0].HistDayTime}'";
  1200. }
  1201. //取物料进出存明细
  1202. var HistDetailDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(sqlHistDetail).ToList();
  1203. //取物料实时库存
  1204. string sql = $"exec [dbo].[pr_WMS_GetMissedLocationQty]";
  1205. var LocationQtyDto = _businessDbContext.LocationQtyDto.FromSqlRaw(sql).ToList();
  1206. ////取出物料库位批次的最新一条记录用于计算期末库存(由于可能出现最大进出存时间一模一样的两笔业务,需要汇总)
  1207. //string lastDetail = $"select a.ItemNum,a.Loc,a.LotSerial,0.00000 AS BeginBalance,Sum(case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,Sum(case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,Sum(BeginBalance+QtyChange) as BalanceNum,GETDATE() AS CreateTime from InvTransHist a inner join(select ItemNum,Loc,LotSerial,MAX(CreateTime) AS CreateTime from InvTransHist group by ItemNum,Loc,LotSerial) b on a.ItemNum=b.ItemNum and a.Loc=b.Loc and a.LotSerial=b.LotSerial and a.CreateTime=b.CreateTime and a.Domain='{domain}' group by a.ItemNum,a.Loc,a.LotSerial order by a.ItemNum,a.Loc,a.LotSerial";
  1208. //var lastDetailDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(lastDetail).ToList();
  1209. //取出所有有进出存记录的物料
  1210. string sqlItemList = $"select distinct ItemNum from InvTransHist where Domain='{domain}' and CreateTime>='2024-01-01' group by ItemNum";
  1211. var QtyChangeDto = _businessDbContext.QtyChangeDto.FromSqlRaw(sqlItemList).ToList();
  1212. List<InvTransHistDay> daysHist = new List<InvTransHistDay>();
  1213. QtyChangeDto?.ForEach(x =>
  1214. {
  1215. DateTime dtMin = new DateTime(2024, 1, 1);
  1216. if (HistMaxTimeDayDto.Any(a => a.ItemNum == x.ItemNum))
  1217. {
  1218. dtMin = HistMaxTimeDayDto.Find(a => a.ItemNum == x.ItemNum).HistDayTime;
  1219. }
  1220. //物料期末总库存
  1221. var xBalanceNum = LocationQtyDto.Where(a => a.ItemNum == x.ItemNum).Sum(a => a.AvailStatusQty);
  1222. var xMaxDay = DateTime.Now;
  1223. int day = 0;
  1224. while (true)
  1225. {
  1226. if (xMaxDay.AddDays(day).Date < dtMin)
  1227. break;
  1228. InvTransHistDay invTransHistDay = new InvTransHistDay();
  1229. invTransHistDay.Domain = domain;
  1230. invTransHistDay.ItemNum = x.ItemNum;
  1231. invTransHistDay.HistDayTime = xMaxDay.AddDays(day).Date;
  1232. var xQtyChangeAdvance = HistDetailDto.Where(a => a.ItemNum == x.ItemNum && a.CreateTime.Date == xMaxDay.AddDays(day).Date).Sum(a => a.QtyChangeAdvance);
  1233. var xQtyChangeOut = HistDetailDto.Where(a => a.ItemNum == x.ItemNum && a.CreateTime.Date == xMaxDay.AddDays(day).Date).Sum(a => a.QtyChangeOut);
  1234. invTransHistDay.QtyChangeAdvance = xQtyChangeAdvance;
  1235. invTransHistDay.QtyChangeOut = xQtyChangeOut;
  1236. if (day == 0)
  1237. {
  1238. invTransHistDay.BalanceNum = xBalanceNum;
  1239. invTransHistDay.BeginBalance = xBalanceNum + xQtyChangeOut - xQtyChangeAdvance;
  1240. }
  1241. else
  1242. {
  1243. var nextDayQty = daysHist.Find(a => a.HistDayTime == xMaxDay.AddDays(day + 1).Date && a.ItemNum == x.ItemNum);
  1244. //倒推期初数
  1245. invTransHistDay.BalanceNum = nextDayQty.BeginBalance;
  1246. invTransHistDay.BeginBalance = nextDayQty.BeginBalance + xQtyChangeOut - xQtyChangeAdvance;
  1247. }
  1248. daysHist.Add(invTransHistDay);
  1249. day--;
  1250. }
  1251. });
  1252. _businessDbContext.BulkInsert(daysHist);
  1253. return "ok";
  1254. }
  1255. }
  1256. }