VSMAppService.cs 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  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.WMS;
  13. using Business.VSM;
  14. using EFCore.BulkExtensions;
  15. using MathNet.Numerics.LinearAlgebra.Factorization;
  16. using Microsoft.EntityFrameworkCore;
  17. using Microsoft.EntityFrameworkCore.Metadata.Internal;
  18. using Microsoft.Extensions.Configuration;
  19. using MongoDB.Driver.Linq;
  20. using Newtonsoft.Json;
  21. using NLog;
  22. using Org.BouncyCastle.Asn1.X509;
  23. using System;
  24. using System.Collections.Generic;
  25. using System.Data;
  26. using System.Diagnostics.Metrics;
  27. using System.Linq;
  28. using System.Text;
  29. using System.Threading;
  30. using System.Threading.Tasks;
  31. using System.Xml.Linq;
  32. using Volo.Abp.Application.Services;
  33. using Volo.Abp.Domain.Repositories;
  34. using Volo.Abp.MultiTenancy;
  35. using WkHtmlToPdfDotNet;
  36. using ZstdSharp.Unsafe;
  37. namespace Business.VSMManagement
  38. {
  39. public class VSMAppService : ApplicationService,IVSMAppService
  40. {
  41. private readonly ISqlRepository<ItemMaster> _itemMaster;
  42. private readonly ISqlRepository<InvTransHist> _invTransHist;
  43. private readonly IRepository<srm_purchase> _srm_purchase;
  44. private readonly IRepository<ic_item> _ic_item;
  45. private readonly ISqlRepository<LocationDetail> _LocationDetail;
  46. private readonly ISqlRepository<InvTransHistDay> _InvTransHistDay;
  47. private readonly IExtRASqlRepository<DMS_IN_PODETAIL> _DMS_IN_PODETAIL;
  48. private readonly IExtRASqlRepository<DMS_IN_LOCDETAIL> _DMS_IN_LOCDETAIL;
  49. private readonly IExtRASqlRepository<DMS_IN_ITEMMAPPING> _DMS_IN_ITEMMAPPING;
  50. private readonly ISqlRepository<SAPInv> _SAPInv;
  51. private readonly BusinessDbContext _businessDbContext;
  52. public VSMAppService(
  53. ISqlRepository<ItemMaster> itemMaster,
  54. ISqlRepository<InvTransHist> invTransHist,
  55. IRepository<srm_purchase> srm_purchase,
  56. IRepository<ic_item> ic_item,
  57. ISqlRepository<LocationDetail> locationDetail,
  58. ISqlRepository<InvTransHistDay> invTransHistDay,
  59. IExtRASqlRepository<DMS_IN_PODETAIL> dms_IN_PODETAIL,
  60. IExtRASqlRepository<DMS_IN_LOCDETAIL> dms_IN_LOCDETAIL,
  61. IExtRASqlRepository<DMS_IN_ITEMMAPPING> dms_IN_ITEMMAPPING,
  62. ISqlRepository<SAPInv> SAPInv,
  63. BusinessDbContext businessDbContext
  64. )
  65. {
  66. _itemMaster = itemMaster;
  67. _invTransHist = invTransHist;
  68. _srm_purchase = srm_purchase;
  69. _ic_item = ic_item;
  70. _LocationDetail=locationDetail;
  71. _InvTransHistDay = invTransHistDay;
  72. _DMS_IN_PODETAIL = dms_IN_PODETAIL;
  73. _DMS_IN_LOCDETAIL= dms_IN_LOCDETAIL;
  74. _DMS_IN_ITEMMAPPING= dms_IN_ITEMMAPPING;
  75. _SAPInv=SAPInv;
  76. _businessDbContext = businessDbContext;
  77. }
  78. public string ValueFrequency(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency)
  79. {
  80. try
  81. {
  82. DateTime beginDate = Convert.ToDateTime(BeginDate);
  83. DateTime endDate = Convert.ToDateTime(EndDate);
  84. string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='8010' and createTime>='{beginDate}' and createTime<='{endDate}' group by ItemNum";
  85. var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
  86. var itemList = InvTransHistDto.Select(a => a.ItemNum).Distinct().ToList();
  87. ValueFrequencyDto dto = new ValueFrequencyDto();
  88. List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
  89. var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
  90. var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b=>b.Id).ToList().Contains(a.icitem_id)).Result;
  91. string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  92. var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  93. var InvTransHistDayDto = _InvTransHistDay.Select(a => a.HistDayTime >= beginDate.Date && a.HistDayTime <= endDate);
  94. itemList.ForEach(item =>
  95. {
  96. if(icitems.Any(a=>a.number==item))
  97. {
  98. ValueFrequencyKanBanDto itemKanBanDto = new ValueFrequencyKanBanDto();
  99. itemKanBanDto.ItemNumber = item;
  100. itemKanBanDto.ItemId = icitems.Find(a => a.number == item).Id;
  101. itemKanBanDto.Model = icitems.Find(a => a.number == item).model;
  102. itemKanBanDto.ItemName = icitems.Find(a => a.number == item).name;
  103. itemKanBanDto.PLT = 14;
  104. //供应提前期取货源清单最大值,没有默认14天
  105. if (srm_purchases.Any(a => a.icitem_id == itemKanBanDto.ItemId && a.quota_rate.GetValueOrDefault() > 0))
  106. {
  107. itemKanBanDto.PLT = srm_purchases.Where(a => a.number == item && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  108. }
  109. var entry = dzdList.FirstOrDefault(p => p.ItemNum == item);
  110. if (entry != null)
  111. {
  112. itemKanBanDto.NETPR = entry.NETPR;
  113. }
  114. else
  115. {
  116. itemKanBanDto.NETPR = 1 * 10;
  117. }
  118. //出库总数
  119. itemKanBanDto.OutStockQty = InvTransHistDayDto.Where(a => a.ItemNum == item).Sum(b => b.QtyChangeOut);
  120. //库存数据取进出存期末数据
  121. itemKanBanDto.Amount = InvTransHistDayDto.Where(a => a.ItemNum == item).OrderByDescending(a => a.HistDayTime).First().BalanceNum * itemKanBanDto.NETPR;
  122. itemKanBanDto.MoveCount = InvTransHistDayDto.Where(a => a.ItemNum == item && a.QtyChangeOut > 0).Count();
  123. int days = endDate.Subtract(beginDate).Days;
  124. //同一天算1天
  125. if (days == 0)
  126. days = 1;
  127. itemKanBanDto.ADU = itemKanBanDto.OutStockQty / days;
  128. itemKanBanDto.Kanban = itemKanBanDto.ADU * itemKanBanDto.PLT;
  129. kanBanDtos.Add(itemKanBanDto);
  130. }
  131. });
  132. decimal totalmoveCount = kanBanDtos.Sum(a=>a.MoveCount);
  133. decimal totalAmount = kanBanDtos.Sum(a => a.Amount);
  134. decimal avgmoveCount = kanBanDtos.Average(a => a.MoveCount);
  135. kanBanDtos=kanBanDtos.OrderByDescending(a => a.Amount).ToList();
  136. for (int i=0;i< kanBanDtos.Count;i++)
  137. {
  138. if (kanBanDtos[i].MoveCount > avgmoveCount)
  139. {
  140. kanBanDtos[i].FMR = "F";
  141. }
  142. else if(kanBanDtos[i].MoveCount < avgmoveCount / 2)
  143. {
  144. kanBanDtos[i].FMR = "R";
  145. }else
  146. {
  147. kanBanDtos[i].FMR = "M";
  148. }
  149. if(i<=kanBanDtos.Count*0.7)
  150. {
  151. kanBanDtos[i].ABC = "A";
  152. }else if(i>=kanBanDtos.Count*0.9)
  153. {
  154. kanBanDtos[i].ABC = "C";
  155. }else
  156. {
  157. kanBanDtos[i].ABC = "B";
  158. }
  159. kanBanDtos[i].AmountTotal = totalAmount;
  160. kanBanDtos[i].MovePencent = totalmoveCount == 0 ? 0 : kanBanDtos[i].MoveCount * 100 / totalmoveCount;
  161. }
  162. int totalCount = kanBanDtos.Count();
  163. dto.jzpc1 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  164. dto.jzpc2 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  165. dto.jzpc3 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  166. dto.jzpc4 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  167. dto.jzpc5 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  168. dto.jzpc6 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  169. dto.jzpc7 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  170. dto.jzpc8 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  171. dto.jzpc9 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  172. return JsonConvert.SerializeObject(dto);
  173. }
  174. catch (Exception ex)
  175. {
  176. return ex.Message;
  177. }
  178. }
  179. public string ValueFrequencyDetail(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency, string JZ, string PC)
  180. {
  181. try
  182. {
  183. List<ValueFrequencyDetailDto> dtos = new List<ValueFrequencyDetailDto>();
  184. try
  185. {
  186. DateTime beginDate = Convert.ToDateTime(BeginDate);
  187. DateTime endDate = Convert.ToDateTime(EndDate);
  188. string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='8010' and createTime>='{beginDate}' and createTime<='{endDate}' group by ItemNum";
  189. var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
  190. var itemList = InvTransHistDto.Select(a => a.ItemNum).Distinct().ToList();
  191. ValueFrequencyDto dto = new ValueFrequencyDto();
  192. List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
  193. var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
  194. var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b => b.Id).ToList().Contains(a.icitem_id)).Result;
  195. string sqldzd = @"select MATNR AS ItemNum,Max(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  196. var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  197. var InvTransHistDayDto = _InvTransHistDay.Select(a=>a.HistDayTime>= beginDate.Date && a.HistDayTime<= endDate);
  198. itemList.ForEach(item =>
  199. {
  200. if (icitems.Any(a => a.number == item))
  201. {
  202. ValueFrequencyKanBanDto itemKanBanDto = new ValueFrequencyKanBanDto();
  203. itemKanBanDto.ItemNumber = item;
  204. itemKanBanDto.ItemId = icitems.Find(a => a.number == item).Id;
  205. itemKanBanDto.Model = icitems.Find(a => a.number == item).model;
  206. itemKanBanDto.ItemName = icitems.Find(a => a.number == item).name;
  207. itemKanBanDto.PLT = 14;
  208. //供应提前期取货源清单最大值,没有默认14天
  209. if (srm_purchases.Any(a => a.icitem_id == itemKanBanDto.ItemId && a.quota_rate.GetValueOrDefault() > 0))
  210. {
  211. itemKanBanDto.PLT = srm_purchases.Where(a => a.number == item && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  212. }
  213. var entry = dzdList.FirstOrDefault(p => p.ItemNum == item);
  214. if (entry != null)
  215. {
  216. itemKanBanDto.NETPR = entry.NETPR;
  217. }
  218. else
  219. {
  220. itemKanBanDto.NETPR = 1 * 10;
  221. }
  222. //出库总数
  223. itemKanBanDto.OutStockQty = InvTransHistDayDto.Where(a=>a.ItemNum==item).Sum(b=>b.QtyChangeOut);
  224. //库存数据取进出存期末数据
  225. itemKanBanDto.Amount = InvTransHistDayDto.Where(a => a.ItemNum == item).OrderByDescending(a=>a.HistDayTime).First().BalanceNum * itemKanBanDto.NETPR;
  226. itemKanBanDto.MoveCount = InvTransHistDayDto.Where(a => a.ItemNum == item && a.QtyChangeOut>0).Count();
  227. int days = endDate.Subtract(beginDate).Days;
  228. //同一天算1天
  229. if (days == 0)
  230. days = 1;
  231. itemKanBanDto.ADU = itemKanBanDto.OutStockQty / days;
  232. itemKanBanDto.Kanban = itemKanBanDto.ADU * itemKanBanDto.PLT;
  233. kanBanDtos.Add(itemKanBanDto);
  234. }
  235. });
  236. decimal totalmoveCount = kanBanDtos.Sum(a => a.MoveCount);
  237. decimal totalAmount = kanBanDtos.Sum(a => a.Amount);
  238. decimal avgmoveCount = kanBanDtos.Average(a => a.MoveCount);
  239. kanBanDtos = kanBanDtos.OrderByDescending(a => a.Amount).ToList();
  240. for (int i = 0; i < kanBanDtos.Count; i++)
  241. {
  242. if (kanBanDtos[i].MoveCount > avgmoveCount)
  243. {
  244. kanBanDtos[i].FMR = "F";
  245. }
  246. else if (kanBanDtos[i].MoveCount < avgmoveCount / 2)
  247. {
  248. kanBanDtos[i].FMR = "R";
  249. }
  250. else
  251. {
  252. kanBanDtos[i].FMR = "M";
  253. }
  254. if (i <= kanBanDtos.Count * 0.7)
  255. {
  256. kanBanDtos[i].ABC = "A";
  257. }
  258. else if (i >= kanBanDtos.Count * 0.9)
  259. {
  260. kanBanDtos[i].ABC = "C";
  261. }
  262. else
  263. {
  264. kanBanDtos[i].ABC = "B";
  265. }
  266. kanBanDtos[i].AmountTotal = totalAmount;
  267. kanBanDtos[i].MovePencent = totalmoveCount == 0 ? 0 : kanBanDtos[i].MoveCount * 100 / totalmoveCount;
  268. }
  269. kanBanDtos=kanBanDtos.Where(a=>a.ABC==JZ&&a.FMR==PC && a.Kanban > Convert.ToDecimal(KanBan) && a.MovePencent > Convert.ToDecimal(Frequency)).OrderByDescending(a=>a.Amount).ToList();
  270. for(int i=0;i< kanBanDtos.Count(); i++)
  271. {
  272. ValueFrequencyDetailDto detailDto = new ValueFrequencyDetailDto();
  273. detailDto.RowSeq =i+1;
  274. detailDto.ItemNum = kanBanDtos[i].ItemNumber;
  275. detailDto.ItemName = kanBanDtos[i].ItemName;
  276. detailDto.Model = kanBanDtos[i].Model;
  277. detailDto.ItemABC = kanBanDtos[i].ABC;
  278. detailDto.ItemFMR = kanBanDtos[i].FMR;
  279. detailDto.Amount = kanBanDtos[i].Amount;
  280. detailDto.AmountFix = Convert.ToDecimal(KanBan) * kanBanDtos[i].NETPR;
  281. detailDto.AmountDiff = detailDto.Amount- detailDto.AmountFix;
  282. dtos.Add(detailDto);
  283. }
  284. return JsonConvert.SerializeObject(dtos);
  285. }
  286. catch (Exception ex)
  287. {
  288. return ex.Message;
  289. }
  290. }
  291. catch (Exception ex)
  292. {
  293. return ex.Message;
  294. }
  295. }
  296. public string ChartLineOption(string Loc, string BeginDate, string EndDate, string ItemNum,string TurnOver,string KanBan)
  297. {
  298. //if(KanBan=="3")
  299. //{
  300. // string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,[SuggestStockQty] AS SuggestQty from [dbo].[3KanBan] t";
  301. // var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  302. // StringBuilder sb = new StringBuilder();
  303. // StringBuilder sbDays = new StringBuilder();
  304. // StringBuilder sbDaysStock = new StringBuilder();
  305. // StringBuilder sbDaysInStock = new StringBuilder();
  306. // StringBuilder sbDaysOutStock = new StringBuilder();
  307. // StringBuilder sbDaysSuggest = new StringBuilder();
  308. // 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:[");
  309. // chartDtosTest.ForEach(a =>
  310. // {
  311. // sbDays.Append(string.Format("'{0}',", a.Date));
  312. // sbDaysStock.Append(string.Format("{0},", a.StockQty));
  313. // sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  314. // sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  315. // sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  316. // });
  317. // sb.Append(sbDays.ToString().TrimEnd(',')).
  318. // Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  319. // Append(sbDaysStock.ToString().TrimEnd(',')).
  320. // Append("]},{name:'日出库数量',type:'line',data:[").
  321. // Append(sbDaysOutStock.ToString().TrimEnd(',')).
  322. // Append("]},{name:'日入库数量',type:'line',data:[").
  323. // Append(sbDaysInStock.ToString().TrimEnd(',')).
  324. // Append("]},{name:'推荐日库存数量',type:'line',data:[").
  325. // Append(sbDaysSuggest.ToString().TrimEnd(',')).
  326. // Append("]}]}");
  327. // return sb.ToString();
  328. //}
  329. //else if(KanBan=="2")
  330. //{
  331. // string sql = @"select t.[Date] AS [Date],t.DateStockQty AS StockQty,t.DateOutStockQty AS OutStockQty,t.DateInStockQty AS InStockQty,[SuggestStockQty] AS SuggestQty from [dbo].[2KanBan] t";
  332. // var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  333. // StringBuilder sb = new StringBuilder();
  334. // StringBuilder sbDays = new StringBuilder();
  335. // StringBuilder sbDaysStock = new StringBuilder();
  336. // StringBuilder sbDaysInStock = new StringBuilder();
  337. // StringBuilder sbDaysOutStock = new StringBuilder();
  338. // StringBuilder sbDaysSuggest = new StringBuilder();
  339. // 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:[");
  340. // chartDtosTest.ForEach(a =>
  341. // {
  342. // sbDays.Append(string.Format("'{0}',", a.Date));
  343. // sbDaysStock.Append(string.Format("{0},", a.StockQty));
  344. // sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  345. // sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  346. // sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  347. // });
  348. // sb.Append(sbDays.ToString().TrimEnd(',')).
  349. // Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  350. // Append(sbDaysStock.ToString().TrimEnd(',')).
  351. // Append("]},{name:'日出库数量',type:'line',data:[").
  352. // Append(sbDaysOutStock.ToString().TrimEnd(',')).
  353. // Append("]},{name:'日入库数量',type:'line',data:[").
  354. // Append(sbDaysInStock.ToString().TrimEnd(',')).
  355. // Append("]},{name:'推荐日库存数量',type:'line',data:[").
  356. // Append(sbDaysSuggest.ToString().TrimEnd(',')).
  357. // Append("]}]}");
  358. // return sb.ToString();
  359. //}
  360. try
  361. {
  362. DateTime beginDate = Convert.ToDateTime(BeginDate);
  363. DateTime endDate = Convert.ToDateTime(EndDate);
  364. var srm_purchases = _srm_purchase.GetListAsync(a =>a.number==ItemNum).Result;
  365. decimal chartPLT = 14;
  366. decimal chartKanBan = Convert.ToDecimal(KanBan);
  367. //供应提前期取货源清单最大值,没有默认14天
  368. if (srm_purchases.Any(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0))
  369. {
  370. chartPLT = srm_purchases.Where(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  371. }
  372. var InvTransHistDayDto = _InvTransHistDay.Select(a => a.ItemNum== ItemNum && a.HistDayTime >= beginDate.Date && a.HistDayTime <= endDate);
  373. int tranDays = (endDate-beginDate).Days;
  374. List<ValueFrequencyChartDto> chartDtos = new List<ValueFrequencyChartDto>();
  375. for(int i = 0; i < tranDays; i++)
  376. {
  377. ValueFrequencyChartDto dtoChart = new ValueFrequencyChartDto();
  378. dtoChart.Date = beginDate.AddDays(i).ToString("yyyy-MM-dd");
  379. dtoChart.InStockQty = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date== a.HistDayTime.Date).First().QtyChangeAdvance;
  380. dtoChart.OutStockQty = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date == a.HistDayTime.Date).First().QtyChangeOut;
  381. dtoChart.StockQty = InvTransHistDayDto.Where(a => beginDate.AddDays(i).Date == a.HistDayTime.Date).First().BalanceNum;
  382. dtoChart.SuggestQty =chartKanBan*chartPLT;
  383. chartDtos.Add(dtoChart);
  384. }
  385. chartDtos = chartDtos.Where(a => string.Compare(a.Date, BeginDate) >= 0 && string.Compare(a.Date, EndDate) <= 0).ToList();
  386. StringBuilder sb = new StringBuilder();
  387. StringBuilder sbDays = new StringBuilder();
  388. StringBuilder sbDaysStock = new StringBuilder();
  389. StringBuilder sbDaysInStock = new StringBuilder();
  390. StringBuilder sbDaysOutStock = new StringBuilder();
  391. StringBuilder sbDaysSuggest = new StringBuilder();
  392. 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:[");
  393. chartDtos.ForEach(a =>
  394. {
  395. sbDays.Append(string.Format("'{0}',",a.Date));
  396. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  397. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  398. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  399. sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  400. });
  401. sb.Append(sbDays.ToString().TrimEnd(',')).
  402. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',stack: 'Total',data:[").
  403. Append(sbDaysStock.ToString().TrimEnd(',')).
  404. Append("]},{name:'日出库数量',type:'line',stack:'Total',data:[").
  405. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  406. Append("]},{name:'日入库数量',type:'line',stack:'Total',data:[").
  407. Append(sbDaysInStock.ToString().TrimEnd(',')).
  408. Append("]},{name:'推荐日库存数量',type:'line',stack:'Total',data:[").
  409. Append(sbDaysSuggest.ToString().TrimEnd(',')).
  410. Append("]}]}");
  411. return sb.ToString();
  412. }
  413. catch (Exception ex)
  414. {
  415. return ex.Message;
  416. }
  417. }
  418. public string ChartLineSupplierPLTOption()
  419. {
  420. 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}]}";
  421. }
  422. public string ChartLinePLTOption(string PLT)
  423. {
  424. if(PLT=="25")
  425. {
  426. 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";
  427. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  428. StringBuilder sb = new StringBuilder();
  429. StringBuilder sbDays = new StringBuilder();
  430. StringBuilder sbDaysStock = new StringBuilder();
  431. StringBuilder sbDaysInStock = new StringBuilder();
  432. StringBuilder sbDaysOutStock = new StringBuilder();
  433. 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:[");
  434. chartDtosTest.ForEach(a =>
  435. {
  436. sbDays.Append(string.Format("'{0}',", a.Date));
  437. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  438. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  439. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  440. });
  441. sb.Append(sbDays.ToString().TrimEnd(',')).
  442. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  443. Append(sbDaysStock.ToString().TrimEnd(',')).
  444. Append("]},{name:'日出库数量',type:'line',data:[").
  445. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  446. Append("]},{name:'日入库数量',type:'line',data:[").
  447. Append(sbDaysInStock.ToString().TrimEnd(',')).
  448. Append("]}").Append("]}");
  449. return sb.ToString();
  450. }else
  451. {
  452. 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";
  453. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  454. StringBuilder sb = new StringBuilder();
  455. StringBuilder sbDays = new StringBuilder();
  456. StringBuilder sbDaysStock = new StringBuilder();
  457. StringBuilder sbDaysInStock = new StringBuilder();
  458. StringBuilder sbDaysOutStock = new StringBuilder();
  459. 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:[");
  460. chartDtosTest.ForEach(a =>
  461. {
  462. sbDays.Append(string.Format("'{0}',", a.Date));
  463. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  464. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  465. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  466. });
  467. sb.Append(sbDays.ToString().TrimEnd(',')).
  468. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  469. Append(sbDaysStock.ToString().TrimEnd(',')).
  470. Append("]},{name:'日出库数量',type:'line',data:[").
  471. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  472. Append("]},{name:'日入库数量',type:'line',data:[").
  473. Append(sbDaysInStock.ToString().TrimEnd(',')).
  474. Append("]}").Append("]}");
  475. return sb.ToString();
  476. }
  477. }
  478. public string ChartLineModelOption(string factory_id, string model,string avgHW, string avgGK, string avgT1, string avgTotal)
  479. {
  480. var loclist = _DMS_IN_LOCDETAIL.Select(a => a.UPN == model);
  481. var lotList=loclist.Select(a => a.LOT).Distinct().ToList();
  482. decimal? hw = 0;
  483. decimal? gk = 0;
  484. decimal? t1 = 0;
  485. decimal? total = 0;
  486. lotList.ForEach(a =>
  487. {
  488. var itemHW = loclist.Where(x => x.LOT == a && x.DealerLevel == "LP" && x.DealerCode == "RQ000002").ToList();
  489. if(itemHW.Count>0)
  490. {
  491. hw += itemHW.OrderByDescending(y => y.InventoryDate).First().Qty;
  492. }
  493. var itemGK = loclist.Where(x => x.LOT == a && x.DealerLevel == "LP" && x.DealerCode == "RQ000005").ToList();
  494. if (itemGK.Count > 0)
  495. {
  496. gk += itemGK.OrderByDescending(y => y.InventoryDate).First().Qty;
  497. }
  498. var itemT1 = loclist.Where(x => x.LOT == a && (x.DealerLevel == "T1" || x.DealerLevel == "LS")).ToList();
  499. if (itemT1.Count > 0)
  500. {
  501. t1 += itemT1.OrderByDescending(y => y.InventoryDate).First().Qty;
  502. }
  503. });
  504. total=hw+gk+t1;
  505. if(avgHW!="0")
  506. {
  507. string numDecimalStr = (hw.Value / decimal.Parse(avgHW)).ToString("#0.00");
  508. hw = decimal.Parse(numDecimalStr);
  509. }else
  510. {
  511. hw = 0;
  512. }
  513. if (avgGK != "0")
  514. {
  515. string numDecimalStr = (hw.Value / decimal.Parse(avgGK)).ToString("#0.00");
  516. gk = decimal.Parse(numDecimalStr);
  517. }
  518. else
  519. {
  520. gk = 0;
  521. }
  522. if (avgT1 != "0")
  523. {
  524. string numDecimalStr = (hw.Value / decimal.Parse(avgT1)).ToString("#0.00");
  525. t1 = decimal.Parse(numDecimalStr);
  526. }
  527. else
  528. {
  529. t1 = 0;
  530. }
  531. if (avgTotal != "0")
  532. {
  533. string numDecimalStr = (hw.Value / decimal.Parse(avgTotal)).ToString("#0.00");
  534. total = decimal.Parse(numDecimalStr);
  535. }
  536. else
  537. {
  538. total = 0;
  539. }
  540. StringBuilder sb = new StringBuilder();
  541. sb.Append("{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';}}}}}]}");
  542. return sb.ToString();
  543. }
  544. public string ChartLineOutStockOption(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. StringBuilder sbDate = new StringBuilder();
  549. StringBuilder sbHWOutStock = new StringBuilder();
  550. StringBuilder sbGKOutStock = new StringBuilder();
  551. StringBuilder sbT1OutStock = new StringBuilder();
  552. StringBuilder sbTotalOutStock = new StringBuilder();
  553. for (int i=-14;i<1;i++)
  554. {
  555. sbDate.Append(string.Format("'{0}',",DateTime.Now.AddMonths(i).Date.ToString("yyyy-MM-dd")));
  556. 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);
  557. 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);
  558. 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);
  559. var total = hw + gk + t1;
  560. sbHWOutStock.Append(string.Format("{0},", hw));
  561. sbGKOutStock.Append(string.Format("{0},", gk));
  562. sbT1OutStock.Append(string.Format("{0},", t1));
  563. sbTotalOutStock.Append(string.Format("{0},", total));
  564. }
  565. StringBuilder sb = new StringBuilder();
  566. sb.Append("{title: {text:'");
  567. sb.Append(model+"出货趋势',");
  568. sb.Append("left: 'center',},tooltip: {trigger: 'axis'},legend: {data:['海王', '国科', 'T1','Total'],bottom: '0',orient: 'horizontal'},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis:{type: 'category',boundaryGap: false,data:[");
  569. sb.Append(sbDate.ToString().TrimEnd(',')).
  570. Append("]},yAxis:{type:'value',},series:[{name:'海王',type:'line',stack: 'Total',data:[").
  571. Append(sbHWOutStock.ToString().TrimEnd(',')).
  572. Append("]},{name:'国科',type:'line',stack:'Total',data:[").
  573. Append(sbGKOutStock.ToString().TrimEnd(',')).
  574. Append("]},{name:'T1',type:'line',stack:'Total',data:[").
  575. Append(sbT1OutStock.ToString().TrimEnd(',')).
  576. Append("]},{name:'Total',type:'line',stack:'Total',data:[").
  577. Append(sbTotalOutStock.ToString().TrimEnd(',')).
  578. Append("]}]}");
  579. return sb.ToString();
  580. }
  581. public string CalcInvDayHist(string domain)
  582. {
  583. string sql = $"select distinct ItemNum,Min(CreateTime) AS HistMinTime from InvTransHist where Domain='{domain}' group by ItemNum";
  584. var InvTransHistDto = _businessDbContext.InvTransHistDayDto.FromSqlRaw(sql).ToList();
  585. string invHistTime = $"select A.ItemNum,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,CONVERT(varchar,a.createTime, 23) AS createTime from InvTransHist A where Domain='{domain}' group by ItemNum,CONVERT(varchar,a.createTime, 23)";
  586. var InvTransHistDetailDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(invHistTime).ToList();
  587. string sqlMaxTime = $"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}'";
  588. var InvTransHistMaxTimeDayDto = _businessDbContext.InvTransHistDay.FromSqlRaw(sqlMaxTime).ToList();
  589. string sqlQtyChange = $"select ItemNum,Sum(QtyChange) AS QtyChange from InvTransHist where Domain='{domain}' group by ItemNum";
  590. var QtyChangeDto = _businessDbContext.QtyChangeDto.FromSqlRaw(sqlQtyChange).ToList();
  591. string sqlBalanceNum = $"select a.ItemNum,Sum(BeginBalance)+Sum(QtyChange) AS BalanceNum from InvTransHist a inner join (select ItemNum,LotSerial,Max(CreateTime) AS CreateTime from InvTransHist group by ItemNum,LotSerial ) b on a.ItemNum=b.ItemNum and a.LotSerial=b.LotSerial and a.CreateTime=b.CreateTime and Domain='{domain}' group by a.ItemNum";
  592. var BalanceNumDto = _businessDbContext.BalanceNumDto.FromSqlRaw(sqlBalanceNum).ToList();
  593. List<InvTransHistDay> daysHist = new List<InvTransHistDay>();
  594. InvTransHistDto?.ForEach(x => {
  595. if(InvTransHistMaxTimeDayDto.Any(a=>a.ItemNum==x.ItemNum))
  596. {
  597. var xMaxDay = InvTransHistMaxTimeDayDto.Find(a => a.ItemNum == x.ItemNum).HistDayTime;
  598. int day = 1;
  599. while(true)
  600. {
  601. if(xMaxDay.AddDays(day).Date<=DateTime.Now.Date)
  602. {
  603. InvTransHistDay invTransHistDay = new InvTransHistDay();
  604. var daydetail = InvTransHistDetailDto.Find(a => a.ItemNum == x.ItemNum && a.CreateTime== xMaxDay.AddDays(day).Date.ToString("yyyy-MM-dd"));
  605. invTransHistDay.Domain = domain;
  606. invTransHistDay.ItemNum = x.ItemNum;
  607. if(day==1)
  608. {
  609. invTransHistDay.BeginBalance = InvTransHistMaxTimeDayDto.Find(a => a.ItemNum == x.ItemNum).BalanceNum;
  610. }else
  611. {
  612. invTransHistDay.BeginBalance = daysHist.Find(a => a.ItemNum == x.ItemNum && a.HistDayTime.Date == xMaxDay.AddDays(day - 1).Date).BalanceNum;
  613. }
  614. invTransHistDay.QtyChangeAdvance = daydetail == null ? 0 : daydetail.QtyChangeAdvance;
  615. invTransHistDay.QtyChangeOut = daydetail == null ? 0 : daydetail.QtyChangeOut;
  616. invTransHistDay.BalanceNum = invTransHistDay.BeginBalance + invTransHistDay.QtyChangeAdvance - invTransHistDay.QtyChangeOut;
  617. invTransHistDay.HistDayTime = xMaxDay.AddDays(day).Date;
  618. daysHist.Add(invTransHistDay);
  619. day++;
  620. }else
  621. {
  622. break;
  623. }
  624. }
  625. }else
  626. {
  627. var xMaxDay = InvTransHistDto.Find(a => a.ItemNum == x.ItemNum).HistMinTime.Value;
  628. int day = 0;
  629. while (true)
  630. {
  631. if (xMaxDay.AddDays(day).Date <= DateTime.Now.Date)
  632. {
  633. InvTransHistDay invTransHistDay = new InvTransHistDay();
  634. var daydetail = InvTransHistDetailDto.Find(a => a.ItemNum == x.ItemNum && a.CreateTime == xMaxDay.AddDays(day).Date.ToString("yyyy-MM-dd"));
  635. invTransHistDay.Domain = domain;
  636. invTransHistDay.ItemNum = x.ItemNum;
  637. if (day == 0)
  638. {
  639. var xBalanceNum = BalanceNumDto.Find(b => b.ItemNum == x.ItemNum);
  640. var xQtyChangeDto = QtyChangeDto.Find(b => b.ItemNum == x.ItemNum);
  641. if (xBalanceNum != null && xQtyChangeDto != null)
  642. {
  643. invTransHistDay.BeginBalance = xBalanceNum.BalanceNum + xQtyChangeDto.QtyChange;
  644. }
  645. else
  646. {
  647. invTransHistDay.BeginBalance = 0;
  648. }
  649. }
  650. else
  651. {
  652. var dayPredetail = daysHist.Find(a => a.ItemNum == x.ItemNum && a.HistDayTime.Date == xMaxDay.AddDays(day - 1).Date);
  653. invTransHistDay.BeginBalance = dayPredetail == null ? 0 : dayPredetail.BalanceNum;
  654. }
  655. invTransHistDay.QtyChangeAdvance = daydetail == null ? 0 : daydetail.QtyChangeAdvance;
  656. invTransHistDay.QtyChangeOut = daydetail == null ? 0 : daydetail.QtyChangeOut;
  657. invTransHistDay.BalanceNum = invTransHistDay.BeginBalance + invTransHistDay.QtyChangeAdvance - invTransHistDay.QtyChangeOut;
  658. invTransHistDay.HistDayTime = xMaxDay.AddDays(day).Date;
  659. daysHist.Add(invTransHistDay);
  660. day++;
  661. }
  662. else
  663. {
  664. break;
  665. }
  666. }
  667. }
  668. });
  669. _businessDbContext.BulkInsert(daysHist);
  670. return "ok";
  671. }
  672. }
  673. }