VSMAppService.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  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.IC;
  11. using Business.VSM;
  12. using EFCore.BulkExtensions;
  13. using Microsoft.EntityFrameworkCore;
  14. using Microsoft.Extensions.Configuration;
  15. using MongoDB.Driver.Linq;
  16. using Newtonsoft.Json;
  17. using NLog;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Data;
  21. using System.Diagnostics.Metrics;
  22. using System.Linq;
  23. using System.Text;
  24. using System.Threading;
  25. using System.Threading.Tasks;
  26. using Volo.Abp.Application.Services;
  27. using Volo.Abp.Domain.Repositories;
  28. using Volo.Abp.MultiTenancy;
  29. using WkHtmlToPdfDotNet;
  30. using ZstdSharp.Unsafe;
  31. namespace Business.VSMManagement
  32. {
  33. public class VSMAppService : ApplicationService,IVSMAppService
  34. {
  35. private readonly ISqlRepository<ItemMaster> _itemMaster;
  36. private readonly ISqlRepository<InvTransHist> _invTransHist;
  37. private readonly IRepository<srm_purchase> _srm_purchase;
  38. private readonly IRepository<ic_item> _ic_item;
  39. private readonly ISqlRepository<LocationDetail> _LocationDetail;
  40. private readonly BusinessDbContext _businessDbContext;
  41. public VSMAppService(
  42. ISqlRepository<ItemMaster> itemMaster,
  43. ISqlRepository<InvTransHist> invTransHist,
  44. IRepository<srm_purchase> srm_purchase,
  45. IRepository<ic_item> ic_item,
  46. ISqlRepository<LocationDetail> locationDetail,
  47. BusinessDbContext businessDbContext
  48. )
  49. {
  50. _itemMaster = itemMaster;
  51. _invTransHist = invTransHist;
  52. _srm_purchase = srm_purchase;
  53. _ic_item = ic_item;
  54. _LocationDetail=locationDetail;
  55. _businessDbContext = businessDbContext;
  56. }
  57. public string ValueFrequency(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency)
  58. {
  59. try
  60. {
  61. var itemLoc = _LocationDetail.Select(a => a.Location == Loc && a.Domain == "8010");
  62. var itemList = itemLoc.Select(a => a.ItemNum).Distinct().ToList();
  63. ValueFrequencyDto dto = new ValueFrequencyDto();
  64. DateTime beginDate = Convert.ToDateTime(BeginDate);
  65. DateTime endDate = Convert.ToDateTime(EndDate);
  66. var itemTranList=_invTransHist.Select(a => a.Loc == Loc && a.CreateTime >= beginDate && a.CreateTime < endDate && itemList.Contains(a.ItemNum));
  67. List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
  68. var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
  69. var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b=>b.Id).ToList().Contains(a.icitem_id)).Result;
  70. string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  71. var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  72. string sql = @"select a.Loc as Loc,BeginBalance,BeginBalance+QtyChange as BalanceNum,a.ItemNum,
  73. (case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,
  74. (case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,
  75. a.LotSerial,a.createTime from InvTransHist a inner join (select itemnum,LotSerial,Max(CreateTime) AS CreateTime from
  76. InvTransHist where loc='1001' and domain='8010' group by itemnum,LotSerial) b on a.ItemNum=b.ItemNum
  77. and a.CreateTime=b.CreateTime and a.Loc='1001' and a.Domain='8010' and a.LotSerial=b.LotSerial";
  78. var InvTransHistDto = _businessDbContext.InvTransHistDto.FromSqlRaw(sql).ToList();
  79. itemList.ForEach(item =>
  80. {
  81. if(icitems.Any(a=>a.number==item))
  82. {
  83. ValueFrequencyKanBanDto itemKanBanDto = new ValueFrequencyKanBanDto();
  84. itemKanBanDto.ItemNumber = item;
  85. itemKanBanDto.ItemId = icitems.Find(a => a.number == item).Id;
  86. itemKanBanDto.Model = icitems.Find(a => a.number == item).model;
  87. itemKanBanDto.ItemName = icitems.Find(a => a.number == item).name;
  88. itemKanBanDto.PLT = 14;
  89. //供应提前期取货源清单最大值,没有默认14天
  90. if (srm_purchases.Any(a => a.icitem_id == itemKanBanDto.ItemId && a.quota_rate.GetValueOrDefault() > 0))
  91. {
  92. itemKanBanDto.PLT = srm_purchases.Where(a => a.number == item && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  93. }
  94. var entry = dzdList.FirstOrDefault(p => p.ItemNum == item);
  95. if (entry != null)
  96. {
  97. itemKanBanDto.NETPR = entry.NETPR;
  98. }
  99. else
  100. {
  101. itemKanBanDto.NETPR = 1 * 10;
  102. }
  103. //出库总数
  104. var outstock = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).ToList();
  105. itemKanBanDto.OutStockQty = Math.Abs(outstock.Sum(a => a.QtyChange).Value);
  106. //库存数据取进出存期末数据
  107. if(InvTransHistDto.Any(a=>a.ItemNum==item))
  108. {
  109. itemKanBanDto.Amount = InvTransHistDto.Where(a=>a.ItemNum==item).Sum(a=>a.BalanceNum)* itemKanBanDto.NETPR;
  110. }
  111. itemKanBanDto.MoveCount = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).Count();
  112. int days = endDate.Subtract(beginDate).Days;
  113. //同一天算1天
  114. if (days == 0)
  115. days = 1;
  116. itemKanBanDto.ADU = itemKanBanDto.OutStockQty / days;
  117. itemKanBanDto.Kanban = itemKanBanDto.ADU * itemKanBanDto.PLT;
  118. kanBanDtos.Add(itemKanBanDto);
  119. }
  120. });
  121. decimal totalmoveCount = kanBanDtos.Sum(a=>a.MoveCount);
  122. decimal totalAmount = kanBanDtos.Sum(a => a.Amount);
  123. decimal avgmoveCount = kanBanDtos.Average(a => a.MoveCount);
  124. kanBanDtos=kanBanDtos.OrderByDescending(a => a.Amount).ToList();
  125. for (int i=0;i< kanBanDtos.Count;i++)
  126. {
  127. if (kanBanDtos[i].MoveCount > avgmoveCount)
  128. {
  129. kanBanDtos[i].FMR = "F";
  130. }
  131. else if(kanBanDtos[i].MoveCount < avgmoveCount / 2)
  132. {
  133. kanBanDtos[i].FMR = "R";
  134. }else
  135. {
  136. kanBanDtos[i].FMR = "M";
  137. }
  138. if(i<=kanBanDtos.Count*0.7)
  139. {
  140. kanBanDtos[i].ABC = "A";
  141. }else if(i>=kanBanDtos.Count*0.9)
  142. {
  143. kanBanDtos[i].ABC = "C";
  144. }else
  145. {
  146. kanBanDtos[i].ABC = "B";
  147. }
  148. kanBanDtos[i].AmountTotal = totalAmount;
  149. kanBanDtos[i].MovePencent = totalmoveCount == 0 ? 0 : kanBanDtos[i].MoveCount * 100 / totalmoveCount;
  150. }
  151. int totalCount = kanBanDtos.Count();
  152. dto.jzpc1 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  153. dto.jzpc2 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  154. dto.jzpc3 = $"{kanBanDtos.Where(a => a.ABC == "A" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  155. dto.jzpc4 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  156. dto.jzpc5 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  157. dto.jzpc6 = $"{kanBanDtos.Where(a => a.ABC == "B" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  158. dto.jzpc7 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "R").Count()}/{kanBanDtos.Count}";
  159. dto.jzpc8 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "M").Count()}/{kanBanDtos.Count}";
  160. dto.jzpc9 = $"{kanBanDtos.Where(a => a.ABC == "C" && a.FMR == "F").Count()}/{kanBanDtos.Count}";
  161. return JsonConvert.SerializeObject(dto);
  162. }
  163. catch (Exception ex)
  164. {
  165. return ex.Message;
  166. }
  167. }
  168. public string ValueFrequencyDetail(string Loc, string BeginDate, string EndDate, string KanBan, string Frequency, string JZ, string PC)
  169. {
  170. try
  171. {
  172. List<ValueFrequencyDetailDto> dtos = new List<ValueFrequencyDetailDto>();
  173. try
  174. {
  175. var itemLoc = _LocationDetail.Select(a => a.Location == Loc && a.Domain == "8010");
  176. var itemList = itemLoc.Select(a => a.ItemNum).Distinct().ToList();
  177. ValueFrequencyDto dto = new ValueFrequencyDto();
  178. DateTime beginDate = Convert.ToDateTime(BeginDate);
  179. DateTime endDate = Convert.ToDateTime(EndDate);
  180. var itemTranList = _invTransHist.Select(a => a.Loc == Loc && a.CreateTime >= beginDate && a.CreateTime < endDate && itemList.Contains(a.ItemNum));
  181. List<ValueFrequencyKanBanDto> kanBanDtos = new List<ValueFrequencyKanBanDto>();
  182. var icitems = _ic_item.GetListAsync(a => itemList.Contains(a.number)).Result;
  183. var srm_purchases = _srm_purchase.GetListAsync(a => icitems.Select(b => b.Id).ToList().Contains(a.icitem_id)).Result;
  184. string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  185. var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  186. string sql = @"select a.Loc as Loc,BeginBalance,BeginBalance+QtyChange as BalanceNum,a.ItemNum,
  187. (case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,
  188. (case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,
  189. a.LotSerial,a.createTime from InvTransHist a inner join (select itemnum,LotSerial,Max(CreateTime) AS CreateTime from
  190. InvTransHist where loc='1001' and domain='8010' group by itemnum,LotSerial) b on a.ItemNum=b.ItemNum
  191. and a.CreateTime=b.CreateTime and a.Loc='1001' and a.Domain='8010' and a.LotSerial=b.LotSerial";
  192. var InvTransHistDto = _businessDbContext.InvTransHistDto.FromSqlRaw(sql).ToList();
  193. itemList.ForEach(item =>
  194. {
  195. if (icitems.Any(a => a.number == item))
  196. {
  197. ValueFrequencyKanBanDto itemKanBanDto = new ValueFrequencyKanBanDto();
  198. itemKanBanDto.ItemNumber = item;
  199. itemKanBanDto.ItemId = icitems.Find(a => a.number == item).Id;
  200. itemKanBanDto.Model = icitems.Find(a => a.number == item).model;
  201. itemKanBanDto.ItemName = icitems.Find(a => a.number == item).name;
  202. itemKanBanDto.PLT = 14;
  203. //供应提前期取货源清单最大值,没有默认14天
  204. if (srm_purchases.Any(a => a.icitem_id == itemKanBanDto.ItemId && a.quota_rate.GetValueOrDefault() > 0))
  205. {
  206. itemKanBanDto.PLT = srm_purchases.Where(a => a.number == item && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  207. }
  208. var entry = dzdList.FirstOrDefault(p => p.ItemNum == item);
  209. if (entry != null)
  210. {
  211. itemKanBanDto.NETPR = entry.NETPR;
  212. }
  213. else
  214. {
  215. itemKanBanDto.NETPR = 1 * 10;
  216. }
  217. //出库总数
  218. var outstock = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).ToList();
  219. itemKanBanDto.OutStockQty = Math.Abs(outstock.Sum(a => a.QtyChange).Value);
  220. //库存数据取进出存期末数据
  221. if (InvTransHistDto.Any(a => a.ItemNum == item))
  222. {
  223. itemKanBanDto.Amount = InvTransHistDto.Where(a => a.ItemNum == item).Sum(a => a.BalanceNum) * itemKanBanDto.NETPR;
  224. }
  225. itemKanBanDto.MoveCount = itemTranList.Where(a => a.ItemNum == item && a.QtyChange < 0).Count();
  226. int days = endDate.Subtract(beginDate).Days;
  227. //同一天算1天
  228. if (days == 0)
  229. days = 1;
  230. itemKanBanDto.ADU = itemKanBanDto.OutStockQty / days;
  231. itemKanBanDto.Kanban = itemKanBanDto.ADU * itemKanBanDto.PLT;
  232. kanBanDtos.Add(itemKanBanDto);
  233. }
  234. });
  235. decimal totalmoveCount = kanBanDtos.Sum(a => a.MoveCount);
  236. decimal totalAmount = kanBanDtos.Sum(a => a.Amount);
  237. decimal avgmoveCount = kanBanDtos.Average(a => a.MoveCount);
  238. kanBanDtos = kanBanDtos.OrderByDescending(a => a.Amount).ToList();
  239. for (int i = 0; i < kanBanDtos.Count; i++)
  240. {
  241. if (kanBanDtos[i].MoveCount > avgmoveCount)
  242. {
  243. kanBanDtos[i].FMR = "F";
  244. }
  245. else if (kanBanDtos[i].MoveCount < avgmoveCount / 2)
  246. {
  247. kanBanDtos[i].FMR = "R";
  248. }
  249. else
  250. {
  251. kanBanDtos[i].FMR = "M";
  252. }
  253. if (i <= kanBanDtos.Count * 0.7)
  254. {
  255. kanBanDtos[i].ABC = "A";
  256. }
  257. else if (i >= kanBanDtos.Count * 0.9)
  258. {
  259. kanBanDtos[i].ABC = "C";
  260. }
  261. else
  262. {
  263. kanBanDtos[i].ABC = "B";
  264. }
  265. kanBanDtos[i].AmountTotal = totalAmount;
  266. kanBanDtos[i].MovePencent = totalmoveCount == 0 ? 0 : kanBanDtos[i].MoveCount * 100 / totalmoveCount;
  267. }
  268. 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();
  269. for(int i=0;i< kanBanDtos.Count(); i++)
  270. {
  271. ValueFrequencyDetailDto detailDto = new ValueFrequencyDetailDto();
  272. detailDto.RowSeq =i+1;
  273. detailDto.ItemNum = kanBanDtos[i].ItemNumber;
  274. detailDto.ItemName = kanBanDtos[i].ItemName;
  275. detailDto.Model = kanBanDtos[i].Model;
  276. detailDto.ItemABC = kanBanDtos[i].ABC;
  277. detailDto.ItemFMR = kanBanDtos[i].FMR;
  278. detailDto.Amount = kanBanDtos[i].Amount;
  279. detailDto.AmountFix = Convert.ToDecimal(KanBan) * kanBanDtos[i].NETPR;
  280. detailDto.AmountDiff = detailDto.Amount- detailDto.AmountFix;
  281. dtos.Add(detailDto);
  282. }
  283. return JsonConvert.SerializeObject(dtos);
  284. }
  285. catch (Exception ex)
  286. {
  287. return ex.Message;
  288. }
  289. }
  290. catch (Exception ex)
  291. {
  292. return ex.Message;
  293. }
  294. }
  295. public string ChartLineOption(string Loc, string BeginDate, string EndDate, string ItemNum,string TurnOver,string KanBan)
  296. {
  297. if(KanBan=="3")
  298. {
  299. 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";
  300. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  301. StringBuilder sb = new StringBuilder();
  302. StringBuilder sbDays = new StringBuilder();
  303. StringBuilder sbDaysStock = new StringBuilder();
  304. StringBuilder sbDaysInStock = new StringBuilder();
  305. StringBuilder sbDaysOutStock = new StringBuilder();
  306. StringBuilder sbDaysSuggest = new StringBuilder();
  307. 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:[");
  308. chartDtosTest.ForEach(a =>
  309. {
  310. sbDays.Append(string.Format("'{0}',", a.Date));
  311. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  312. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  313. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  314. sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  315. });
  316. sb.Append(sbDays.ToString().TrimEnd(',')).
  317. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  318. Append(sbDaysStock.ToString().TrimEnd(',')).
  319. Append("]},{name:'日出库数量',type:'line',data:[").
  320. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  321. Append("]},{name:'日入库数量',type:'line',data:[").
  322. Append(sbDaysInStock.ToString().TrimEnd(',')).
  323. Append("]},{name:'推荐日库存数量',type:'line',data:[").
  324. Append(sbDaysSuggest.ToString().TrimEnd(',')).
  325. Append("]}]}");
  326. return sb.ToString();
  327. }
  328. else if(KanBan=="2")
  329. {
  330. 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";
  331. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  332. StringBuilder sb = new StringBuilder();
  333. StringBuilder sbDays = new StringBuilder();
  334. StringBuilder sbDaysStock = new StringBuilder();
  335. StringBuilder sbDaysInStock = new StringBuilder();
  336. StringBuilder sbDaysOutStock = new StringBuilder();
  337. StringBuilder sbDaysSuggest = new StringBuilder();
  338. 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:[");
  339. chartDtosTest.ForEach(a =>
  340. {
  341. sbDays.Append(string.Format("'{0}',", a.Date));
  342. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  343. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  344. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  345. sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  346. });
  347. sb.Append(sbDays.ToString().TrimEnd(',')).
  348. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  349. Append(sbDaysStock.ToString().TrimEnd(',')).
  350. Append("]},{name:'日出库数量',type:'line',data:[").
  351. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  352. Append("]},{name:'日入库数量',type:'line',data:[").
  353. Append(sbDaysInStock.ToString().TrimEnd(',')).
  354. Append("]},{name:'推荐日库存数量',type:'line',data:[").
  355. Append(sbDaysSuggest.ToString().TrimEnd(',')).
  356. Append("]}]}");
  357. return sb.ToString();
  358. }
  359. try
  360. {
  361. DateTime beginDate = Convert.ToDateTime(BeginDate);
  362. DateTime endDate = Convert.ToDateTime(EndDate);
  363. var srm_purchases = _srm_purchase.GetListAsync(a =>a.number==ItemNum).Result;
  364. decimal chartPLT = 14;
  365. decimal chartKanBan = Convert.ToDecimal(KanBan);
  366. //供应提前期取货源清单最大值,没有默认14天
  367. if (srm_purchases.Any(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0))
  368. {
  369. chartPLT = srm_purchases.Where(a => a.number == ItemNum && a.quota_rate.GetValueOrDefault() > 0).Max(a => a.lead_time).Value;
  370. }
  371. //string sqldzd = @"select MATNR AS ItemNum,MAx(NETPR)*10 AS NETPR from SupplierStatement group by MATNR";
  372. //var dzdList = _businessDbContext.SupplierStatementDto.FromSqlRaw(sqldzd).ToList();
  373. string sql = string.Format(@"select a.ItemNum,a.Loc,a.LotSerial,BeginBalance,a.QtyChange,(case when a.QtyChange>0 then a.QtyChange else 0 end) as QtyChangeAdvance,
  374. (case when a.QtyChange<0 then abs(a.QtyChange) else 0 end) as QtyChangeOut,BeginBalance+QtyChange as BalanceNum,
  375. a.CreateTime from InvTransHist a where loc='{0}' and domain='8010' and itemnum='{1}' order by CreateTime", Loc,ItemNum);
  376. var InvTransHistDto = _businessDbContext.InvTransHistDetailDto.FromSqlRaw(sql).ToList();
  377. DateTime minTime = InvTransHistDto.Min(a => a.CreateTime);
  378. DateTime maxTime = InvTransHistDto.Max(a => a.CreateTime);
  379. if(beginDate<minTime)
  380. {
  381. minTime = beginDate;
  382. }
  383. if(endDate>maxTime)
  384. {
  385. maxTime = endDate;
  386. }
  387. int tranDays = (maxTime - minTime).Days;
  388. List<ValueFrequencyChartDto> chartDtos = new List<ValueFrequencyChartDto>();
  389. for(int i = 0; i < tranDays; i++)
  390. {
  391. ValueFrequencyChartDto dtoChart = new ValueFrequencyChartDto();
  392. dtoChart.Date = minTime.AddDays(i).ToString("yyyy-MM-dd");
  393. dtoChart.InStockQty = InvTransHistDto.Where(a => minTime.AddDays(i).Date==a.CreateTime.Date).Sum(a => a.QtyChangeAdvance);
  394. dtoChart.OutStockQty = InvTransHistDto.Where(a => minTime.AddDays(i).Date == a.CreateTime.Date).Sum(a => a.QtyChangeOut);
  395. if(i>0)
  396. {
  397. dtoChart.StockQty = chartDtos[i-1].StockQty + InvTransHistDto.Where(a => minTime.AddDays(i).Date == a.CreateTime.Date).Sum(a => a.QtyChange);
  398. }else
  399. {
  400. dtoChart.StockQty = InvTransHistDto.Where(a => minTime.AddDays(i).Date == a.CreateTime.Date).Sum(a => a.QtyChange);
  401. }
  402. dtoChart.SuggestQty =chartKanBan*chartPLT;
  403. chartDtos.Add(dtoChart);
  404. }
  405. chartDtos = chartDtos.Where(a => string.Compare(a.Date, BeginDate) >= 0 && string.Compare(a.Date, EndDate) <= 0).ToList();
  406. StringBuilder sb = new StringBuilder();
  407. StringBuilder sbDays = new StringBuilder();
  408. StringBuilder sbDaysStock = new StringBuilder();
  409. StringBuilder sbDaysInStock = new StringBuilder();
  410. StringBuilder sbDaysOutStock = new StringBuilder();
  411. StringBuilder sbDaysSuggest = new StringBuilder();
  412. 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:[");
  413. chartDtos.ForEach(a =>
  414. {
  415. sbDays.Append(string.Format("'{0}',",a.Date));
  416. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  417. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  418. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  419. sbDaysSuggest.Append(string.Format("{0},", a.SuggestQty));
  420. });
  421. sb.Append(sbDays.ToString().TrimEnd(',')).
  422. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',stack: 'Total',data:[").
  423. Append(sbDaysStock.ToString().TrimEnd(',')).
  424. Append("]},{name:'日出库数量',type:'line',stack:'Total',data:[").
  425. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  426. Append("]},{name:'日入库数量',type:'line',stack:'Total',data:[").
  427. Append(sbDaysInStock.ToString().TrimEnd(',')).
  428. Append("]},{name:'推荐日库存数量',type:'line',stack:'Total',data:[").
  429. Append(sbDaysSuggest.ToString().TrimEnd(',')).
  430. Append("]}]}");
  431. return sb.ToString();
  432. }
  433. catch (Exception ex)
  434. {
  435. return ex.Message;
  436. }
  437. }
  438. public string ChartLineSupplierPLTOption()
  439. {
  440. 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}]}";
  441. }
  442. public string ChartLinePLTOption(string PLT)
  443. {
  444. if(PLT=="25")
  445. {
  446. 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";
  447. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  448. StringBuilder sb = new StringBuilder();
  449. StringBuilder sbDays = new StringBuilder();
  450. StringBuilder sbDaysStock = new StringBuilder();
  451. StringBuilder sbDaysInStock = new StringBuilder();
  452. StringBuilder sbDaysOutStock = new StringBuilder();
  453. 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:[");
  454. chartDtosTest.ForEach(a =>
  455. {
  456. sbDays.Append(string.Format("'{0}',", a.Date));
  457. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  458. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  459. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  460. });
  461. sb.Append(sbDays.ToString().TrimEnd(',')).
  462. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  463. Append(sbDaysStock.ToString().TrimEnd(',')).
  464. Append("]},{name:'日出库数量',type:'line',data:[").
  465. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  466. Append("]},{name:'日入库数量',type:'line',data:[").
  467. Append(sbDaysInStock.ToString().TrimEnd(',')).
  468. Append("]}").Append("]}");
  469. return sb.ToString();
  470. }else
  471. {
  472. 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";
  473. var chartDtosTest = _businessDbContext.ValueFrequencyChartDto.FromSqlRaw(sql).ToList();
  474. StringBuilder sb = new StringBuilder();
  475. StringBuilder sbDays = new StringBuilder();
  476. StringBuilder sbDaysStock = new StringBuilder();
  477. StringBuilder sbDaysInStock = new StringBuilder();
  478. StringBuilder sbDaysOutStock = new StringBuilder();
  479. 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:[");
  480. chartDtosTest.ForEach(a =>
  481. {
  482. sbDays.Append(string.Format("'{0}',", a.Date));
  483. sbDaysStock.Append(string.Format("{0},", a.StockQty));
  484. sbDaysOutStock.Append(string.Format("{0},", a.OutStockQty));
  485. sbDaysInStock.Append(string.Format("{0},", a.InStockQty));
  486. });
  487. sb.Append(sbDays.ToString().TrimEnd(',')).
  488. Append("]},yAxis:{type:'value',},series:[{name:'日库存数量',type:'line',data:[").
  489. Append(sbDaysStock.ToString().TrimEnd(',')).
  490. Append("]},{name:'日出库数量',type:'line',data:[").
  491. Append(sbDaysOutStock.ToString().TrimEnd(',')).
  492. Append("]},{name:'日入库数量',type:'line',data:[").
  493. Append(sbDaysInStock.ToString().TrimEnd(',')).
  494. Append("]}").Append("]}");
  495. return sb.ToString();
  496. }
  497. }
  498. }
  499. }