StatisticsreportService.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using WMS.BZModels;
  7. using WMS.Info;
  8. using wms.sqlsugar.model.cp;
  9. using WMS.BZSqlSugar;
  10. using WMS.BZModels.Dto.CP.ReportDtos;
  11. using System.Reflection;
  12. using WMS.BZModels.Dto;
  13. using WMS.Util;
  14. namespace WMS.BZServices.CP
  15. {
  16. public class StatisticsreportService
  17. {
  18. private readonly Repository<BillInvflow> _flowrepository;
  19. private readonly Repository<WCS_TaskOld> _taskoldrepository;
  20. public StatisticsreportService(Repository<BillInvflow> flowrepository, Repository<WCS_TaskOld> taskoldrepository)
  21. {
  22. _flowrepository = flowrepository;
  23. _taskoldrepository = taskoldrepository;
  24. }
  25. public PagedInfo<StatisticsDto> GetPageList(Pagination pagination, StatisticsQueryDto statisticsQueryDto)
  26. {
  27. //if (pagination.sord.ToUpper() != "ASC")
  28. //{
  29. // pagination.sidx = pagination.sidx + " DESC";
  30. //}
  31. //if (pagination.sidx.IsEmpty())
  32. //{
  33. // pagination.sidx = "AddTime DESC";
  34. //}
  35. //var predicate = Expressionable.Create<BillInvflow, WCS_TaskOld>();
  36. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.KeyWord), (flow, taskold) => flow.MatCode.Contains(statisticsQueryDto.KeyWord) || taskold.Floor.ToString() == statisticsQueryDto.KeyWord
  37. //|| taskold.Tunnel.Contains(statisticsQueryDto.KeyWord) || taskold.Device.Contains(statisticsQueryDto.KeyWord) || taskold.AddrTo.Contains(statisticsQueryDto.KeyWord) || taskold.AddrFrom.Contains(statisticsQueryDto.KeyWord));
  38. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.MatCode), (flow, taskold) => flow.MatCode.Contains(statisticsQueryDto.MatCode));
  39. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.Tunnel), (flow, taskold) => taskold.Tunnel.Contains(statisticsQueryDto.Tunnel));
  40. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.Floor), (flow, taskold) => taskold.Floor.ToString() == statisticsQueryDto.Floor);
  41. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.Device), (flow, taskold) => taskold.Device.Contains(statisticsQueryDto.Device));
  42. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.AddrFrom), (flow, taskold) => taskold.AddrFrom.Contains(statisticsQueryDto.AddrFrom));
  43. //predicate = predicate.AndIF(!string.IsNullOrEmpty(statisticsQueryDto?.AddrTo), (flow, taskold) => taskold.AddrTo.Contains(statisticsQueryDto.AddrTo));
  44. var list = GetQueryable(statisticsQueryDto).ToPage(pagination);
  45. return list;
  46. }
  47. public IList<StatisticsDto> GetList(StatisticsQueryDto statisticsQueryDto)
  48. {
  49. ISugarQueryable<StatisticsDto> sugarQueryable = GetQueryable(statisticsQueryDto);
  50. var list = sugarQueryable.ToList();
  51. return list;
  52. }
  53. private ISugarQueryable<StatisticsDto> GetQueryable(StatisticsQueryDto statisticsQueryDto)
  54. {
  55. var sugarQueryable = _taskoldrepository.Context.Queryable<WCS_TaskOld>().SplitTable(p => p.Take(10))
  56. .LeftJoin<BaseMatinfo>((taskold, mater) => taskold.MaterialCode == mater.Code)
  57. .WhereIF(statisticsQueryDto != null && !string.IsNullOrWhiteSpace(statisticsQueryDto.Status), (taskold, mater) => taskold.Status.Equals(statisticsQueryDto.Status))
  58. .WhereIF(statisticsQueryDto != null && !string.IsNullOrWhiteSpace(statisticsQueryDto.KeyWord), (taskold, mater) => mater.Code.Contains(statisticsQueryDto.KeyWord) || mater.Name.Contains(statisticsQueryDto.KeyWord))
  59. .WhereIF(statisticsQueryDto != null && !string.IsNullOrWhiteSpace(statisticsQueryDto.MatCode), (taskold, mater) => mater.Code.Contains(statisticsQueryDto.MatCode))
  60. .WhereIF(statisticsQueryDto != null && !string.IsNullOrWhiteSpace(statisticsQueryDto.MatName), (taskold, mater) => mater.Name.Contains(statisticsQueryDto.MatName))
  61. .WhereIF(statisticsQueryDto != null && statisticsQueryDto.AddTimeFrom != null && statisticsQueryDto.AddTimeFrom.HasValue, (taskold, mater) => taskold.AddTime >= statisticsQueryDto.AddTimeFrom)
  62. .WhereIF(statisticsQueryDto != null && statisticsQueryDto.AddTimeTo != null && statisticsQueryDto.AddTimeTo.HasValue, (taskold, mater) => taskold.AddTime <= statisticsQueryDto.AddTimeTo)
  63. .WhereIF(statisticsQueryDto != null && statisticsQueryDto.StartTimeBegin.HasValue, (taskold, mater) => taskold.StartTime >= statisticsQueryDto.StartTimeBegin)
  64. .WhereIF(statisticsQueryDto != null && statisticsQueryDto.StartTimeEnd.HasValue, (taskold, mater) => taskold.StartTime <= statisticsQueryDto.StartTimeEnd)
  65. .WhereIF(statisticsQueryDto != null && statisticsQueryDto.EndTimeBegin.HasValue, (taskold, mater) => taskold.EndTime >= statisticsQueryDto.EndTimeBegin)
  66. .WhereIF(statisticsQueryDto != null && statisticsQueryDto.EndTimeEnd.HasValue, (taskold, mater) => taskold.EndTime <= statisticsQueryDto.EndTimeEnd)
  67. .GroupBy((taskold, mater) => new { mater.Code, mater.Name, taskold.Floor, taskold.Type })
  68. .Select((taskold, mater) => new StatisticsDto
  69. {
  70. MatCode = mater.Code,
  71. MatName = mater.Name,
  72. Floor = taskold.Floor,
  73. Type = taskold.Type,
  74. Count = SqlFunc.AggregateDistinctCount(taskold.ID)
  75. }).MergeTable();
  76. return sugarQueryable;
  77. }
  78. /// <summary>
  79. /// 24小时内任务动态
  80. /// </summary>
  81. /// <param name="start"></param>
  82. /// <param name="end"></param>
  83. /// <returns></returns>
  84. public PagedInfo<HourTaskDto> GetHourTask(Pagination pagination, HourTaskQueryDto hourTaskQueryDto)
  85. {
  86. if (!hourTaskQueryDto.EndTimeBegin.HasValue)
  87. {
  88. hourTaskQueryDto.EndTimeBegin = DateTime.Now.Date;
  89. }
  90. if (!hourTaskQueryDto.EndTimeEnd.HasValue)
  91. {
  92. hourTaskQueryDto.EndTimeEnd = DateTime.Now.AddHours(1);
  93. }
  94. if ((hourTaskQueryDto.EndTimeEnd.Value - hourTaskQueryDto.EndTimeBegin.Value).Days > 60)
  95. {
  96. throw BZSysExCore.ThrowFailException("查询日期范围不能超过60天!");
  97. }
  98. var predicate = Expressionable.Create<WCS_TaskOld>();
  99. predicate = predicate.And(m => m.Status == (int)BZModels.TaskStatus.Finish);
  100. predicate = predicate.AndIF(!string.IsNullOrEmpty(hourTaskQueryDto.WarehouseCode), m => hourTaskQueryDto.WarehouseCode.Equals(m.WarehouseCode));
  101. predicate = predicate.AndIF(hourTaskQueryDto.EndTimeBegin.HasValue, m => m.EndTime >= hourTaskQueryDto.EndTimeBegin.Value);
  102. predicate = predicate.AndIF(hourTaskQueryDto.EndTimeEnd.HasValue, m => m.EndTime <= hourTaskQueryDto.EndTimeEnd.Value);
  103. predicate = predicate.AndIF(!string.IsNullOrEmpty(hourTaskQueryDto.TaskType) && (new string[] { "1", "2", "3", "5" }.Any(o => o.Equals(hourTaskQueryDto.TaskType))), m => m.Type.Equals(hourTaskQueryDto.TaskType));
  104. predicate = predicate.AndIF(!string.IsNullOrEmpty(hourTaskQueryDto.BusType), m => m.BusType.Equals(hourTaskQueryDto.BusType));
  105. var sugarQueryable = _taskoldrepository.Queryable().Select(it => new TaskInOutDto { });
  106. if (!string.IsNullOrEmpty(hourTaskQueryDto.TaskType) && (hourTaskQueryDto.TaskType == "100" || hourTaskQueryDto.TaskType == "101"))
  107. {
  108. sugarQueryable = _taskoldrepository.Queryable().Where(predicate.ToExpression()).SplitTable(tabs => tabs.Take(3))
  109. .Select(it => new
  110. {
  111. EditTime = it.EndTime.Value.Date,
  112. Hour = it.EndTime.Value.Hour
  113. })
  114. .MergeTable()//将查询结果转成一个表
  115. .GroupBy(o => new { o.Hour, o.EditTime })
  116. .Select(it => new TaskInOutDto { Count = SqlFunc.AggregateCount(it.Hour), Hour = it.Hour, CreateTime = it.EditTime })
  117. .OrderBy(o => o.CreateTime);
  118. }
  119. else
  120. {
  121. sugarQueryable = _taskoldrepository.Queryable().Where(predicate.ToExpression()).SplitTable(tabs => tabs.Take(3))
  122. .Select(it => new
  123. {
  124. Type = it.Type,
  125. EditTime = it.EndTime.Value.Date,
  126. Hour = it.EndTime.Value.Hour
  127. })
  128. .MergeTable()//将查询结果转成一个表
  129. .GroupBy(o => new { o.Type, o.Hour, o.EditTime })
  130. .Select(it => new TaskInOutDto { Count = SqlFunc.AggregateCount(it.Type), Type = it.Type, Hour = it.Hour, CreateTime = it.EditTime })
  131. .OrderBy(o => o.CreateTime);
  132. }
  133. var lists = sugarQueryable.ToList();
  134. PagedInfo<HourTaskDto> HourTasks = new PagedInfo<HourTaskDto>()
  135. {
  136. Result = new List<HourTaskDto>()
  137. };
  138. //var plist = new List<PropertyInfo>(typeof(HourTaskDto).GetProperties());
  139. var plist = typeof(HourTaskDto);
  140. var types = lists.Select(o => o.Type).Distinct().OrderBy(o => o).ToList();
  141. var dates = lists.Select(o => o.CreateTime).Distinct().OrderBy(o => o).ToList();
  142. foreach (var p in dates)
  143. {
  144. if (!string.IsNullOrEmpty(hourTaskQueryDto.TaskType) && (hourTaskQueryDto.TaskType == "100" || hourTaskQueryDto.TaskType == "101"))
  145. {
  146. if (!lists.Any(o => o.CreateTime == p))
  147. {
  148. continue;
  149. }
  150. HourTaskDto s = Activator.CreateInstance<HourTaskDto>();
  151. var TaskDate = plist.GetProperty("TaskDate");
  152. if (TaskDate != null)
  153. TaskDate.SetValue(s, p.ToString("yyyy-MM-dd"), null);
  154. var TaskType = plist.GetProperty("TaskType");
  155. if (TaskType != null)
  156. TaskType.SetValue(s, -1, null);
  157. for (int i = 0; i < 24; i++)
  158. {
  159. PropertyInfo info = plist.GetProperty( "A" + i.ToString());
  160. if (info != null)
  161. {
  162. var first = lists.FirstOrDefault(o => o.CreateTime == p && o.Hour == i);
  163. if (first != null)
  164. {
  165. info.SetValue(s, first.Count, null);
  166. }
  167. }
  168. }
  169. HourTasks.Result.Add(s);
  170. }
  171. else
  172. {
  173. foreach (var t in types)
  174. {
  175. if (!lists.Any(o => o.CreateTime == p && o.Type == t))
  176. {
  177. continue;
  178. }
  179. HourTaskDto s = Activator.CreateInstance<HourTaskDto>();
  180. var TaskType = plist.GetProperty("TaskType");
  181. if (TaskType != null)
  182. TaskType.SetValue(s, (TaskType)t, null);
  183. var TaskDate = plist.GetProperty("TaskDate");
  184. if (TaskDate != null)
  185. TaskDate.SetValue(s, p.ToString("yyyy-MM-dd"), null);
  186. for (int i = 0; i < 24; i++)
  187. {
  188. PropertyInfo info = plist.GetProperty( "A" + i.ToString());
  189. if (info != null)
  190. {
  191. var first = lists.FirstOrDefault(o => o.Type == t && o.CreateTime == p && o.Hour == i);
  192. if (first != null)
  193. {
  194. info.SetValue(s, first.Count, null);
  195. }
  196. }
  197. }
  198. HourTasks.Result.Add(s);
  199. }
  200. }
  201. }
  202. if (!pagination.sidx.IsEmpty())
  203. {
  204. pagination.sidx = pagination.sidx.Replace("DESC", "").Replace("ASC", "");
  205. HourTasks.Result.Sort(
  206. delegate (HourTaskDto info1, HourTaskDto info2)
  207. {
  208. Type t = typeof(HourTaskDto);
  209. PropertyInfo pro = t.GetProperty(pagination.sidx);
  210. if (pagination.sidx == "TaskDate" || pagination.sidx == "TypeName")
  211. {
  212. return pagination.sord.ToLower().Contains("asc") ?
  213. pro.GetValue(info1, null).ToString().CompareTo(pro.GetValue(info2, null).ToString()) :
  214. pro.GetValue(info2, null).ToString().CompareTo(pro.GetValue(info1, null).ToString());
  215. }
  216. else
  217. return pagination.sord.ToLower().Contains("asc") ?
  218. pro.GetValue(info1, null).ToInt().CompareTo(pro.GetValue(info2, null).ToInt()) :
  219. pro.GetValue(info2, null).ToInt().CompareTo(pro.GetValue(info1, null).ToInt());
  220. });
  221. //typeof(HourTaskDto).GetProperty( pagination.sidx.Replace("DESC", "").Replace("ASC", ""))).ToList();
  222. }
  223. HourTasks.PageIndex = 1;
  224. HourTasks.PageSize = HourTasks.Result.Count;
  225. HourTasks.TotalNum = HourTasks.Result.Count;
  226. return HourTasks;
  227. }
  228. public PagedInfo<InOutReportDto> GetInOutReport(Pagination pagination, InOutReportQueryDto queryDto)
  229. {
  230. if (!queryDto.EndTimeBegin.HasValue)
  231. {
  232. queryDto.EndTimeBegin = DateTime.Now.Date;
  233. }
  234. if (!queryDto.EndTimeEnd.HasValue)
  235. {
  236. queryDto.EndTimeEnd = DateTime.Now.AddHours(1);
  237. }
  238. var predicate = Expressionable.Create<WCS_TaskOld>();
  239. predicate = predicate.And(m => m.Status == (int)BZModels.TaskStatus.Finish);
  240. predicate = predicate.And(m => new string[] { "1", "2", "3", "5" }.Contains(m.Type.ToString()));
  241. predicate = predicate.AndIF(queryDto.EndTimeBegin.HasValue, m => m.EndTime >= queryDto.EndTimeBegin.Value);
  242. predicate = predicate.AndIF(queryDto.EndTimeEnd.HasValue, m => m.EndTime <= queryDto.EndTimeEnd.Value);
  243. ISugarQueryable<InOutReportDto> sugarQueryable;
  244. if (queryDto.GroupName == "Hour")
  245. {
  246. sugarQueryable = _taskoldrepository.Queryable().With(SqlWith.NoLock).Where(predicate.ToExpression()).SplitTable(tabs => tabs.Take(3))
  247. .GroupBy(it => new { it.EndTime.Value.Year, it.EndTime.Value.Month, it.EndTime.Value.Day, it.EndTime.Value.Hour })
  248. .Select(it => new InOutReportDto
  249. {
  250. Year = it.EndTime.Value.Year.ToString(),
  251. Month = it.EndTime.Value.Month.ToString(),
  252. Day = it.EndTime.Value.Day.ToString(),
  253. Hour = it.EndTime.Value.Hour.ToString(),
  254. InQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 1).Return(1).End<int>()),
  255. OutQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 2).Return(1).End<int>()),
  256. RelocationQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 3).Return(1).End<int>()),
  257. TrayQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 5).Return(1).End<int>()),
  258. TotalQty = SqlFunc.AggregateCount(SqlFunc.IF(new string[] { "1", "2", "3", "5" }.Contains(it.Type.ToString())).Return(1).End<int>()),
  259. }).MergeTable();//.OrderBy(o => new { o.Year, o.Month, o.Day, o.Hour })
  260. }
  261. else
  262. {
  263. sugarQueryable = _taskoldrepository.Queryable().With(SqlWith.NoLock).Where(predicate.ToExpression()).SplitTable(tabs => tabs.Take(3))
  264. .GroupBy(it => new { it.EndTime.Value.Year, it.EndTime.Value.Month, it.EndTime.Value.Day })
  265. .Select(it => new InOutReportDto
  266. {
  267. Year = it.EndTime.Value.Year.ToString(),
  268. Month = it.EndTime.Value.Month.ToString(),
  269. Day = it.EndTime.Value.Day.ToString(),
  270. InQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 1).Return(1).End<int>()),
  271. OutQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 2).Return(1).End<int>()),
  272. RelocationQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 3).Return(1).End<int>()),
  273. TrayQty = SqlFunc.AggregateCount(SqlFunc.IF(it.Type == 5).Return(1).End<int>()),
  274. TotalQty = SqlFunc.AggregateCount(SqlFunc.IF(new string[] { "1", "2", "3", "5" }.Contains(it.Type.ToString())).Return(1).End<int>()),
  275. }).MergeTable(); //.OrderBy(o => new { o.Year, o.Month, o.Day })
  276. if (pagination.sidx == "Hour")
  277. pagination.sidx = "Day";
  278. }
  279. var lists = sugarQueryable.ToPage(pagination);
  280. lists.Result.Add(new InOutReportDto
  281. {
  282. Year = "合计:",
  283. InQty = lists.Result.Sum(o => o.InQty),
  284. OutQty = lists.Result.Sum(o => o.OutQty),
  285. RelocationQty = lists.Result.Sum(o => o.RelocationQty),
  286. TrayQty = lists.Result.Sum(o => o.TrayQty),
  287. TotalQty = lists.Result.Sum(o => o.TotalQty),
  288. });
  289. return lists;
  290. }
  291. }
  292. }