BICommonWay.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using DocumentFormat.OpenXml.Bibliography;
  2. using MathNet.Numerics.LinearAlgebra.Double;
  3. using NUnit.Framework;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace TEAMModelOS.SDK.Models.Service.BI
  10. {
  11. public static class BICommonWay
  12. {
  13. /// <summary>
  14. /// 字串类型分割成double类型数组,在指定位置赋值
  15. /// </summary>
  16. /// <param name="source">需要分割的字符</param>
  17. /// <param name="splitChar">分割字符</param>
  18. /// <param name="indexes">索引</param>
  19. /// <param name="num">需要加减数量</param>
  20. /// <returns></returns>
  21. public static string SplitStr(string source, char splitChar, int indexes, int num)
  22. {
  23. string str = null;
  24. if (source != null)
  25. {
  26. double[] temps = Array.ConvertAll<string, double>(source.Split(splitChar), s => double.Parse(s));
  27. temps[indexes] = temps[indexes] + num;
  28. str = string.Join(splitChar, temps);
  29. }
  30. if (str != null)
  31. return str;
  32. else
  33. return source;
  34. }
  35. /// <summary>
  36. /// 多个拼接in条件
  37. /// </summary>
  38. /// <param name="condName"></param>
  39. /// <param name="scIds"></param>
  40. /// <returns></returns>
  41. public static string ManyScSql(string condName, List<string> scIds, string addStr = null)
  42. {
  43. StringBuilder scSql = new();
  44. if (scIds.Count > 0)
  45. {
  46. scSql.Append($" {condName} in (");
  47. for (int i = 0; i < scIds.Count; i++)
  48. {
  49. if (i == scIds.Count - 1)
  50. {
  51. if (string.IsNullOrEmpty(addStr))
  52. scSql.Append($"'{scIds[i]}'");
  53. else
  54. scSql.Append($"'{addStr}{scIds[i]}'");
  55. }
  56. else
  57. {
  58. if (string.IsNullOrEmpty(addStr))
  59. scSql.Append($"'{scIds[i]}',");
  60. else
  61. scSql.Append($"'{addStr}{scIds[i]}',");
  62. }
  63. }
  64. scSql.Append($" )");
  65. }
  66. return scSql.ToString();
  67. }
  68. /// <summary>
  69. /// 每列合并 多个数组合并成一个数组 列合并
  70. /// </summary>
  71. /// <param name="doubles"></param>
  72. /// <returns></returns>
  73. public static List<double> ManyDoubleMerge(List<List<double>> doubles)
  74. {
  75. List<double> retDou = new();
  76. if (doubles.Count > 0)
  77. {
  78. var artYear = DenseMatrix.OfColumns(doubles);
  79. //var rc = artYear.RowCount;
  80. var cc = artYear.ColumnCount;
  81. for (int i = 0; i < artYear.RowCount; i++)
  82. {
  83. retDou.Add(artYear.SubMatrix(i, 1, 0, cc).ColumnSums().Sum());
  84. }
  85. }
  86. return retDou;
  87. }
  88. /// <summary>
  89. /// 计算一年中每周的数据
  90. /// </summary>
  91. /// <param name="doubles"></param>
  92. /// <param name="dateTime"></param>
  93. /// <returns></returns>
  94. public static List<double> weekDoubleMerge(List<List<double>> doubles, DateTimeOffset dateTime)
  95. {
  96. List<double> weekTrend = new();
  97. if (doubles.Count > 0)
  98. {
  99. int year = dateTime.Year;
  100. int dayOfweek = (int)DateTimeOffset.Parse($"{year}-1-1").DayOfWeek;
  101. int currentTime = dateTime.DayOfYear / 7 + 1;
  102. int currentTime1 = dateTime.DayOfYear / 7;
  103. int days = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 366 : days = 365;
  104. var bmatrix = DenseMatrix.OfColumns(doubles);
  105. //开学第一周周内开课
  106. if (dayOfweek == 0)
  107. {
  108. dayOfweek = 7;
  109. }
  110. //第一周多少天
  111. var dd = 7 - dayOfweek + 1;
  112. //一年有几周
  113. int sweeks = days / 7;
  114. //查询天数
  115. int dayYear = 0;
  116. if (currentTime > 0)
  117. {
  118. for (int i = 0; i < currentTime; i++)
  119. {
  120. if (i == 0)
  121. {
  122. var bsum = bmatrix.SubMatrix(dayYear, dd, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  123. dayYear += dd;
  124. //weeks.Add(i, bsum);
  125. weekTrend.Add(bsum);
  126. }
  127. else
  128. {
  129. var bsum = bmatrix.SubMatrix(dayYear, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  130. dayYear += 7;
  131. //weeks.Add(i, bsum);
  132. weekTrend.Add(bsum);
  133. }
  134. }
  135. }
  136. //最后一周是否有余
  137. int stary = days - dayYear;
  138. if (stary > 0 && stary < 7)
  139. {
  140. var bsum = bmatrix.SubMatrix(dayYear, stary - 1, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  141. //weeks.Add((sweeks + 1), bsum);
  142. weekTrend.Add(bsum);
  143. }
  144. }
  145. return weekTrend;
  146. }
  147. }
  148. }