StatisticsViewModel.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using AutoMapper;
  2. using BizService;
  3. using LiveCharts;
  4. using LiveCharts.Defaults;
  5. using LiveCharts.Wpf;
  6. using Microsoft.Extensions.Logging;
  7. using Model.Dto;
  8. using Model.Entities;
  9. using Prism.Commands;
  10. using Prism.Mvvm;
  11. using Prism.Services.Dialogs;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Collections.ObjectModel;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. namespace BlankApp1.ViewModels
  19. {
  20. public class StatisticsViewModel:BindableBase
  21. {
  22. private readonly IDialogService _dialog;
  23. private readonly IOptionConfigService _optionConfigService;
  24. private readonly IBasicPlcTestSchemeService _basicPlcTestSchemeService;
  25. private readonly IBasicPlcTestSchemeDtlService _basicPlcTestSchemeDtlService;
  26. private readonly IBizTestRecordDtlService _iBizTestRecordDtlService;
  27. private readonly IBasicDeviceService _iBasicDeviceService;
  28. private readonly IBasicDeviceKindService _iBasicDeviceKindService;
  29. private readonly IBasicProjectService _iBasicProjectService;
  30. private readonly IBizTestRecordService _iBizTestRecordService;
  31. private readonly IBasicPlcTestSchemeDtlService _iBasicPlcTestSchemeDtlService;
  32. private readonly ILogger _logger;
  33. private readonly IMapper _mapper;
  34. private List<DeviceDtlWithResultModel> allDeviceList = new List<DeviceDtlWithResultModel>();//所有方案
  35. private List<DeviceDtlWithResultModel> conditionDevices = new List<DeviceDtlWithResultModel>();//符合条件的方案
  36. private int allSchCount = 0; //所有测试项
  37. public StatisticsViewModel(IDialogService dialog, IMenuService menuService, IOptionConfigService optionConfigService, IBasicPlcTestSchemeService basicPlcTestSchemeService, IBasicPlcTestSchemeDtlService basicPlcTestSchemeDtlService, IBizTestRecordDtlService iBizTestRecordDtlService, IBasicDeviceKindService iBasicDeviceKindService, IBasicProjectService iBasicProjectService, IBizTestRecordService iBizTestRecordService, IBasicPlcTestSchemeDtlService iBasicPlcTestSchemeDtlService, IBasicDeviceService iBasicDeviceService,IMapper mapper, ILogger logger)
  38. {
  39. _dialog = dialog;
  40. _optionConfigService = optionConfigService;
  41. _basicPlcTestSchemeService = basicPlcTestSchemeService;
  42. _basicPlcTestSchemeDtlService = basicPlcTestSchemeDtlService;
  43. _iBizTestRecordDtlService = iBizTestRecordDtlService;
  44. _iBasicDeviceKindService= iBasicDeviceKindService;
  45. _iBasicProjectService = iBasicProjectService;
  46. _iBizTestRecordService = iBizTestRecordService;
  47. _iBasicPlcTestSchemeDtlService = iBasicPlcTestSchemeDtlService;
  48. _iBasicDeviceService = iBasicDeviceService;
  49. _logger = logger;
  50. _mapper = mapper;
  51. PieSeriesCollectionDone = new SeriesCollection();
  52. PieSeriesCollectionFail= new SeriesCollection();
  53. PieSeriesCollectionEveryday = new SeriesCollection();
  54. PieSeriesCollectionPLC = new SeriesCollection();
  55. OnLoadCommand = new DelegateCommand(OnLoad);
  56. }
  57. private void OnLoad()
  58. {
  59. GetProjectConfig();
  60. GetPieSeriesDone();
  61. GetPieSeriesPLC();
  62. GetPieSeriesEveryDay();
  63. GetPieSeriesFail();
  64. }
  65. /// <summary>
  66. /// 获取所有项目
  67. /// </summary>
  68. private void GetProjectConfig()
  69. {
  70. allDeviceList.Clear();
  71. conditionDevices.Clear();
  72. //所有测试方案
  73. var schlist = _basicPlcTestSchemeService.QueryList();
  74. var schDtoList = _mapper.Map<List<bas_plc_test_scheme>, List<BasicPlcTestSchemeDto>>(schlist);
  75. //测试记录中的所有设备
  76. var deviceIds = _iBizTestRecordService.QueryList().Select(X => X.device_id).Distinct();
  77. foreach (var deviceId in deviceIds)
  78. {
  79. var deviceMsg = _iBasicDeviceService.Find(((int)deviceId));
  80. if (deviceMsg != null)
  81. {
  82. //查找哦记录有的方案
  83. var recordMsgs = _iBizTestRecordService.FindRecordByDeviceId(deviceId);
  84. foreach (var sch in recordMsgs)
  85. {
  86. string deviceKindName = _iBasicDeviceKindService.Find((int)deviceMsg.device_kind_id)?.devicekind_name;
  87. string projectName = _iBasicProjectService.Find((int)deviceMsg.project_id)?.project_name;
  88. long schId = (long)_basicPlcTestSchemeService.FindByNameAndType(sch.scheme_name, deviceKindName)?.scheme_id;
  89. //计算测试结果
  90. string testResult = string.Empty;
  91. int countResult = 0;
  92. var records = _iBizTestRecordDtlService.FindRecordDetailByRecordID(sch.record_id);
  93. //
  94. var schDtls = _iBasicPlcTestSchemeDtlService.FindAllBySchId(schId);
  95. //循环所有测试项,有一个不合格,则整个测试方案不合格
  96. foreach (var dtl in schDtls)
  97. {
  98. //选取开始时间最大的一个数据,查看测试结果
  99. long schDtId = dtl.scheme_dtl_id;
  100. var findRecords = records.FindAll(x => x.scheme_dtl_id == schDtId).OrderByDescending(x => x.start_test_time).ToArray();
  101. if (findRecords.Length > 0)
  102. {
  103. int result = (int)findRecords[0]?.test_result.Value;
  104. if (result == 0)
  105. {
  106. testResult = "不通过";
  107. break;
  108. }
  109. else
  110. {
  111. countResult++;
  112. }
  113. }
  114. }
  115. //测试结果
  116. if (countResult == schDtls.Count)
  117. {
  118. testResult = "通过";
  119. }
  120. allDeviceList.Add(new DeviceDtlWithResultModel()
  121. {
  122. RecordId = sch.record_id,
  123. DeviceId = deviceMsg.device_id,
  124. DeviceNo = deviceMsg.device_no,
  125. DeviceName = deviceMsg.device_name,
  126. DeviceKindName = deviceKindName,
  127. ProjectName = projectName,
  128. SchemeName = sch.scheme_name,
  129. SchemeId = schId,
  130. StartTestTime = sch.start_test_time.Value,
  131. TestResult = testResult
  132. });
  133. conditionDevices.Add(new DeviceDtlWithResultModel()
  134. {
  135. RecordId = sch.record_id,
  136. DeviceId = deviceMsg.device_id,
  137. DeviceNo = deviceMsg.device_no,
  138. DeviceName = deviceMsg.device_name,
  139. DeviceKindName = deviceKindName,
  140. ProjectName = projectName,
  141. SchemeName = sch.scheme_name,
  142. SchemeId = schId,
  143. StartTestTime = sch.start_test_time.Value,
  144. TestResult = testResult
  145. });
  146. }
  147. }
  148. }
  149. conditionDevices = conditionDevices.OrderBy(x => x.DeviceId).ToList();
  150. Getpage();
  151. }
  152. /// <summary>
  153. /// 获取页面
  154. /// </summary>
  155. private void Getpage()
  156. {
  157. CurrentPage = 1;
  158. TotalCount = conditionDevices.Count;
  159. CurrentPageChanged();
  160. }
  161. /// <summary>
  162. /// 页面变化
  163. /// </summary>
  164. private void CurrentPageChanged()
  165. {
  166. DeviceResultItemList.Clear();
  167. foreach (var i in conditionDevices.Skip((CurrentPage - 1) * CountPerPage).Take(CountPerPage))
  168. {
  169. DeviceResultItemList.Add(i);
  170. }
  171. }
  172. private void GetPieSeriesDone()
  173. {
  174. PieSeriesCollectionDone.Clear();
  175. int tesNoDone = allSchCount-TotalCount;
  176. ChartValues<int> chartvalue = new ChartValues<int>();
  177. chartvalue.Add(TotalCount);
  178. ChartValues<int> noChartvalue = new ChartValues<int>();
  179. noChartvalue.Add(tesNoDone);
  180. PieSeries series = new PieSeries();
  181. series.DataLabels = true;
  182. series.Title = "已测试";
  183. series.Values = chartvalue;
  184. PieSeries series2 = new PieSeries();
  185. series2.DataLabels = true;
  186. series2.Title = "未测试";
  187. series2.Values = noChartvalue;
  188. PieSeriesCollectionDone.Add(series);
  189. PieSeriesCollectionDone.Add(series2);
  190. }
  191. private void GetPieSeriesPLC()
  192. {
  193. PieSeriesCollectionPLC.Clear();
  194. int succTest = allDeviceList.FindAll(x => x.TestResult == "通过").Count;
  195. int noSuccTest = allDeviceList.FindAll(x => x.TestResult == "不通过").Count;
  196. ChartValues<int> chartvalue = new ChartValues<int>();
  197. chartvalue.Add(succTest);
  198. ChartValues<int> nochartvalue = new ChartValues<int>();
  199. nochartvalue.Add(noSuccTest);
  200. PieSeries series = new PieSeries();
  201. series.DataLabels = true;
  202. series.Title = "通过率";
  203. series.Values = chartvalue;
  204. PieSeries series2 = new PieSeries();
  205. series2.DataLabels = true;
  206. series2.Title = "不通过率";
  207. series2.Values = nochartvalue;
  208. PieSeriesCollectionPLC.Add(series);
  209. PieSeriesCollectionPLC.Add(series2);
  210. }
  211. private void GetPieSeriesFail()
  212. {
  213. PieSeriesCollectionFail.Clear();
  214. int succTest = allDeviceList.FindAll(x => x.TestResult == "通过").Count;
  215. int noSuccTest = allDeviceList.FindAll(x => x.TestResult == "不通过").Count;
  216. ChartValues<int> chartvalue = new ChartValues<int>();
  217. chartvalue.Add(succTest);
  218. ChartValues<int> noChartvalue = new ChartValues<int>();
  219. noChartvalue.Add(noSuccTest);
  220. PieSeries series = new PieSeries();
  221. series.DataLabels = true;
  222. series.Title = "通过";
  223. series.Values = chartvalue;
  224. PieSeries series2 = new PieSeries();
  225. series2.DataLabels = true;
  226. series2.Title = "不通过";
  227. series2.Values = noChartvalue;
  228. PieSeriesCollectionFail.Add(series);
  229. PieSeriesCollectionFail.Add(series2);
  230. }
  231. private void GetPieSeriesEveryDay()
  232. {
  233. PieSeriesCollectionEveryday.Clear();
  234. int dayTest = allDeviceList.FindAll(x => x.StartTestTime.Date == DateTime.Now.Date).Count;
  235. ChartValues<int> chartvalue = new ChartValues<int>();
  236. chartvalue.Add(dayTest);
  237. PieSeries series = new PieSeries();
  238. series.DataLabels = true;
  239. series.Title = "测试数量";
  240. series.Values = chartvalue;
  241. PieSeriesCollectionEveryday.Add(series);
  242. }
  243. #region 数据绑定
  244. /// <summary>
  245. /// 图标数据
  246. /// </summary>
  247. private SeriesCollection pieSeriesCollectionDone;
  248. public SeriesCollection PieSeriesCollectionDone
  249. {
  250. get { return pieSeriesCollectionDone; }
  251. set { pieSeriesCollectionDone = value; RaisePropertyChanged(); }
  252. }
  253. private SeriesCollection pieSeriesCollectionPLC;
  254. public SeriesCollection PieSeriesCollectionPLC
  255. {
  256. get { return pieSeriesCollectionPLC; }
  257. set { pieSeriesCollectionPLC = value; RaisePropertyChanged(); }
  258. }
  259. private SeriesCollection pieSeriesCollectionEveryday;
  260. public SeriesCollection PieSeriesCollectionEveryday
  261. {
  262. get { return pieSeriesCollectionEveryday; }
  263. set { pieSeriesCollectionEveryday = value; RaisePropertyChanged(); }
  264. }
  265. private SeriesCollection pieSeriesCollectionFail;
  266. public SeriesCollection PieSeriesCollectionFail
  267. {
  268. get { return pieSeriesCollectionFail; }
  269. set { pieSeriesCollectionFail = value; RaisePropertyChanged(); }
  270. }
  271. /// <summary>
  272. /// 总条数
  273. /// </summary>
  274. private int totalCount;
  275. public int TotalCount
  276. {
  277. get { return totalCount; }
  278. set { totalCount = value; RaisePropertyChanged(); CurrentPageChanged(); }
  279. }
  280. /// <summary>
  281. /// 每页数量
  282. /// </summary>
  283. private int countPerPage = 15;
  284. public int CountPerPage
  285. {
  286. get { return countPerPage; }
  287. set { countPerPage = value; RaisePropertyChanged(); CurrentPageChanged(); }
  288. }
  289. /// <summary>
  290. /// 单前页
  291. /// </summary>
  292. private int currentPage = 1;
  293. public int CurrentPage
  294. {
  295. get { return currentPage; }
  296. set { currentPage = value; RaisePropertyChanged(); CurrentPageChanged(); }
  297. }
  298. private ObservableCollection<DeviceDtlWithResultModel> deviceResultItemList = new ObservableCollection<DeviceDtlWithResultModel>();
  299. public ObservableCollection<DeviceDtlWithResultModel> DeviceResultItemList
  300. {
  301. get { return deviceResultItemList; }
  302. set { deviceResultItemList = value; RaisePropertyChanged(); }
  303. }
  304. #endregion
  305. #region 命令绑定
  306. public DelegateCommand OnLoadCommand { set; get; }
  307. #endregion
  308. }
  309. }