QueryViewModel.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. using AutoMapper;
  2. using BizService;
  3. using Microsoft.Extensions.Logging;
  4. using MiniExcelLibs;
  5. using Model.Dto;
  6. using Model.Entities;
  7. using NetTaste;
  8. using Newtonsoft.Json;
  9. using PLCTool.Pdf;
  10. using Prism.Commands;
  11. using Prism.Mvvm;
  12. using Prism.Services.Dialogs;
  13. using QuestPDF;
  14. using QuestPDF.Fluent;
  15. using QuestPDF.Helpers;
  16. using QuestPDF.Infrastructure;
  17. using QuestPDF.Previewer;
  18. using SqlSugar;
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Collections.ObjectModel;
  22. using System.Linq;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using System.Windows;
  26. using WPFDevelopers.Controls.Runtimes.Shell32;
  27. using static System.Windows.Forms.VisualStyles.VisualStyleElement.ListView;
  28. namespace PLCTool.ViewModels.BusinessManageViewModel
  29. {
  30. internal class QueryViewModel : BindableBase
  31. {
  32. private readonly IDialogService _dialog;
  33. private readonly IOptionConfigService _optionConfigService;
  34. private readonly IBasicPlcTestSchemeService _basicPlcTestSchemeService;
  35. private readonly IBasicPlcTestSchemeDtlService _basicPlcTestSchemeDtlService;
  36. private readonly IBizTestRecordDtlService _iBizTestRecordDtlService;
  37. private readonly ILogger _logger;
  38. private readonly IMapper _mapper;
  39. private readonly IMenuService _menuService;
  40. private List<SchDtlWithResultModel> allConfigList = new List<SchDtlWithResultModel>();//所有方案
  41. private List<SchDtlWithResultModel> conditionConfig = new List<SchDtlWithResultModel>();//符合条件的方案
  42. private const int PageCount = 1; //每一页显示个数
  43. public QueryViewModel(IDialogService dialog, IMenuService menuService, IOptionConfigService optionConfigService, IBasicPlcTestSchemeService basicPlcTestSchemeService, IBasicPlcTestSchemeDtlService basicPlcTestSchemeDtlService, IBizTestRecordDtlService iBizTestRecordDtlService,IMapper mapper, ILogger logger)
  44. {
  45. _dialog = dialog;
  46. _optionConfigService = optionConfigService;
  47. _basicPlcTestSchemeService = basicPlcTestSchemeService;
  48. _basicPlcTestSchemeDtlService = basicPlcTestSchemeDtlService;
  49. _iBizTestRecordDtlService = iBizTestRecordDtlService;
  50. _logger = logger;
  51. _mapper = mapper;
  52. _menuService = menuService;
  53. QueryCommand = new DelegateCommand<object>(Query);
  54. ResetCommand = new DelegateCommand<object>(Reset);
  55. ExportCommand = new DelegateCommand<string>(Export);
  56. OnLoadCommand = new DelegateCommand(OnLoad);
  57. CheckDetailCommand = new DelegateCommand<object>(CheckDetail);
  58. PdfReportCommand = new DelegateCommand<object>(CreatePdf);
  59. GetConfigOption();
  60. }
  61. #region 私有方法
  62. private InvoiceModel GetReportPLCInfo(int schDtlId)
  63. {
  64. //测试方案明细主键ID
  65. InvoiceModel invoiceModel = new InvoiceModel();
  66. invoiceModel.ReportPLCModels = new List<ReportPLCModel>();
  67. //根据 测试方案明细主键ID 查找测试方案id 及方案名和设备名
  68. var findEntity = _basicPlcTestSchemeDtlService.Find(schDtlId);
  69. var findresult = _mapper.Map<bas_plc_test_scheme_dtl, BasicPlcTestSchemeDtlDto>(findEntity);
  70. if (findresult != null)
  71. {
  72. //根据方案id 在方案表中查找方案名 设备名
  73. int schID = Convert.ToInt32(findresult.SchemeId);
  74. var findSch = _basicPlcTestSchemeService.Find(schID);
  75. if (findSch != null)
  76. {
  77. invoiceModel.SchemeName = findSch.scheme_name;
  78. invoiceModel.DeviceName = findSch.device_name;
  79. }
  80. //此测试方案下的所有测试项
  81. var allResult = allConfigList.FindAll(X => X.SchemeName == findSch.scheme_name);
  82. foreach (var each in allResult)
  83. {
  84. long schDetailId = each.SchemeId;
  85. //根据测试方案明细id查找结果
  86. var recordDetail = _iBizTestRecordDtlService.FindRecordDetailBySchDtlID(schDetailId);
  87. if (recordDetail != null)
  88. { //前置项结果解析
  89. string preconStr = recordDetail.precondition_final?.ToString();
  90. if (!string.IsNullOrEmpty(preconStr))
  91. {
  92. JsonModel preconditionModel = JsonConvert.DeserializeObject<JsonModel>(preconStr);
  93. foreach (var detail in preconditionModel.DetailInfo)
  94. {
  95. invoiceModel.ReportPLCModels.Add(new ReportPLCModel()
  96. {
  97. ItemName = each.ItemName,
  98. ItemType = each.ItemType,
  99. Type = "前置项",
  100. JudgeType = preconditionModel.ItemType,
  101. SelectLogic = preconditionModel.ItemLogical,
  102. Detail = preconditionModel.Description,
  103. Id = detail.Id,
  104. PlcAddress = detail.PlcAddress,
  105. PlcItem = detail.PlcItem,
  106. PlcValue = detail.PlcValue,
  107. Remark = detail.Remark,
  108. TestTime = detail.TestTime,
  109. RealValue = detail.RealValue,
  110. TestResult = detail.TestResult,
  111. });
  112. }
  113. }
  114. //输入项解析
  115. string inStr = recordDetail.action_final?.ToString();
  116. if (!string.IsNullOrEmpty(inStr))
  117. {
  118. JsonModel inModel = JsonConvert.DeserializeObject<JsonModel>(inStr);
  119. foreach (var detail in inModel.DetailInfo)
  120. {
  121. invoiceModel.ReportPLCModels.Add(new ReportPLCModel()
  122. {
  123. ItemName = each.ItemName,
  124. ItemType = each.ItemType,
  125. Type = "输入项",
  126. JudgeType = inModel.ItemType,
  127. SelectLogic = inModel.ItemLogical,
  128. Detail = inModel.Description,
  129. Id = detail.Id,
  130. PlcAddress = detail.PlcAddress,
  131. PlcItem = detail.PlcItem,
  132. PlcValue = detail.PlcValue,
  133. Remark = detail.Remark,
  134. TestTime = detail.TestTime,
  135. RealValue = detail.RealValue,
  136. TestResult = detail.TestResult,
  137. });
  138. }
  139. }
  140. //输出项解析
  141. string outStr = recordDetail.judgement_result_final?.ToString();
  142. if (!string.IsNullOrEmpty(outStr))
  143. {
  144. JsonModel outModel = JsonConvert.DeserializeObject<JsonModel>(outStr);
  145. foreach (var detail in outModel.DetailInfo)
  146. {
  147. invoiceModel.ReportPLCModels.Add(new ReportPLCModel()
  148. {
  149. ItemName = each.ItemName,
  150. ItemType = each.ItemType,
  151. Type = "结果项",
  152. JudgeType = outModel.ItemType,
  153. SelectLogic = outModel.ItemLogical,
  154. Detail = outModel.Description,
  155. Id = detail.Id,
  156. PlcAddress = detail.PlcAddress,
  157. PlcItem = detail.PlcItem,
  158. PlcValue = detail.PlcValue,
  159. Remark = detail.Remark,
  160. TestTime = detail.TestTime,
  161. RealValue = detail.RealValue,
  162. TestResult = detail.TestResult,
  163. });
  164. }
  165. }
  166. }
  167. }
  168. //判断方案结果是否通过
  169. var testCount = allConfigList.FindAll(X => X.SchemeName == findSch.scheme_name&&X.TestResult=="通过")?.Count;
  170. if(testCount== allResult.Count)
  171. {
  172. invoiceModel.FinalReuslt = "通过";
  173. }
  174. else
  175. {
  176. invoiceModel.FinalReuslt = "不通过";
  177. }
  178. }
  179. return invoiceModel;
  180. }
  181. /// <summary>
  182. /// 生成pdf
  183. /// </summary>
  184. /// <param name="obj"></param>
  185. public void CreatePdf(object obj)
  186. {
  187. int id = Convert.ToInt32(obj);
  188. try
  189. {
  190. Settings.License = LicenseType.Community;
  191. var model = GetReportPLCInfo(id);
  192. var document = new InvoiceDocument(model);
  193. //pdf名称为轴编号+时间
  194. string strDt = "报表" + string.Format("{0:yyyyMMddHHmm}", DateTime.Now)+ ".pdf"; ;
  195. string pathToPDF = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "PDF", strDt);
  196. //输出文件
  197. document.GeneratePdf(pathToPDF);
  198. MessageBox.Show("生成PDF报告成功!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
  199. }
  200. catch(Exception ex)
  201. {
  202. _logger.LogError(ex.ToString());
  203. }
  204. //using (System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog()
  205. //{
  206. // //设置文件类型
  207. // //书写规则例如:txt files(*.txt)|*.txt
  208. // Filter = "pdf文|*.pdf",
  209. // //设置默认文件名(可以不设置)
  210. // FileName = "报表" + string.Format("{0:yyyyMMddHHmm}", DateTime.Now),
  211. // //获取或设置一个值,该值指示如果用户省略扩展名,文件对话框是否自动在文件名中添加扩展名。(可以不设置)
  212. // AddExtension = true,
  213. // //保存对话框是否记忆上次打开的目录
  214. // RestoreDirectory = true
  215. //})
  216. //{
  217. // //点了保存按钮进入
  218. // if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  219. // {
  220. // try
  221. // {
  222. // //获得文件路径
  223. // string localFilePath = saveFileDialog.FileName.ToString();
  224. // document.GeneratePdf(localFilePath);
  225. // }
  226. // catch (Exception ex)
  227. // {
  228. // }
  229. // }
  230. //}
  231. }
  232. private void CheckDetail(object obj)
  233. {
  234. //测试方案明细主键ID
  235. long id = Convert.ToInt64(obj);
  236. DialogParameters parm = new DialogParameters();
  237. parm.Add("Key", id);
  238. //弹出详情对话框
  239. //弹出详情对话框
  240. _dialog.ShowDialog("TestResultDetailView", parm, async callback =>
  241. {
  242. if (callback.Result == ButtonResult.OK)
  243. {
  244. //更新表格,重新获取
  245. GetContent();
  246. }
  247. });
  248. }
  249. /// <summary>
  250. /// 每次进入页面加载
  251. /// </summary>
  252. private void OnLoad()
  253. {
  254. GetContent();
  255. }
  256. private void Reset(object obj)
  257. {
  258. ScheduleName = string.Empty;
  259. DeviceName = string.Empty;
  260. TestName = string.Empty;
  261. SelectTest = string.Empty;
  262. }
  263. private void Query(object obj)
  264. {
  265. if (StartTime > EndTime)
  266. {
  267. MessageBox.Show("起始时间大于结束时间,请重新输入", "确认", MessageBoxButton.OK, MessageBoxImage.Warning);
  268. return;
  269. }
  270. conditionConfig = (from a in allConfigList
  271. where (EndTime == DateTime.MinValue ? true : (a.CreateTime < Convert.ToDateTime(EndTime)) && (Convert.ToDateTime(StartTime) < a.CreateTime))
  272. && (string.IsNullOrEmpty(ScheduleName) ? true : (a.SchemeName == ScheduleName))
  273. && (string.IsNullOrEmpty(TestName) ? true : (a.ItemName == TestName))
  274. && (string.IsNullOrEmpty(DeviceName) ? true : (a.DeviceName == DeviceName))
  275. && (string.IsNullOrEmpty(SelectTest) ? true : (a.ItemType == SelectTest))
  276. select a).ToList();
  277. //默认显示的第一页
  278. Getpage();
  279. //BaseConfigList = new ObservableCollection<BasicPlcTestSchemeDto>(conditionConfig);
  280. }
  281. /// <summary>
  282. /// 获取配置
  283. /// </summary>
  284. private void GetConfigOption()
  285. {
  286. var configList = _optionConfigService.QueryList();
  287. var _optionConfigs = _mapper.Map<List<OptionConfig>, List<OptionConfigDto>>(configList);
  288. var tests = _optionConfigs.FindAll(x => x.TypeID == 1);
  289. TestKinds = new List<string>();
  290. foreach (var test in tests)
  291. {
  292. TestKinds.Add(test.ContentOption);
  293. }
  294. }
  295. /// <summary>
  296. /// excel导出
  297. /// </summary>
  298. /// <param name="obj"></param>
  299. private void Export(object obj)
  300. {
  301. using (System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog()
  302. {
  303. //设置文件类型
  304. //书写规则例如:txt files(*.txt)|*.txt
  305. Filter = "Excel files(*.xlsx)|*.xlsx|All files(*.*)|*.*",
  306. //设置默认文件名(可以不设置)
  307. FileName = "配置导出",
  308. //获取或设置一个值,该值指示如果用户省略扩展名,文件对话框是否自动在文件名中添加扩展名。(可以不设置)
  309. AddExtension = true,
  310. //保存对话框是否记忆上次打开的目录
  311. RestoreDirectory = true
  312. })
  313. {
  314. // Show save file dialog box
  315. //点了保存按钮进入
  316. if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  317. {
  318. try
  319. {
  320. //获得文件路径
  321. string localFilePath = saveFileDialog.FileName.ToString();
  322. //string filePathWithName = localFilePath + ".xlsx";
  323. //获取文件内容
  324. MiniExcel.SaveAs(localFilePath, BaseConfigList);
  325. }
  326. catch (Exception ex)
  327. {
  328. }
  329. }
  330. }
  331. }
  332. /// <summary>
  333. /// 获取解决方案
  334. /// </summary>
  335. private void GetContent()
  336. {
  337. //所有测试方案
  338. var schlist = _basicPlcTestSchemeService.QueryList();
  339. var configList = _mapper.Map<List<bas_plc_test_scheme>, List<BasicPlcTestSchemeDto>>(schlist);
  340. //清空集合
  341. BaseConfigList.Clear();
  342. allConfigList.Clear();
  343. conditionConfig.Clear();
  344. //查找测试项名称
  345. foreach (var sch in configList)
  346. {
  347. long schId = sch.SchemeId;
  348. //在解决方案详细表中查找所有的测试项
  349. var items = _basicPlcTestSchemeDtlService.FindAllBySchId(schId);
  350. foreach (var item in items)
  351. {
  352. //上面是测试方案明细
  353. SchDtlWithResultModel basicPlcTestSchemeDto = new SchDtlWithResultModel();
  354. basicPlcTestSchemeDto.SchemeId = item.scheme_dtl_id;
  355. basicPlcTestSchemeDto.SchemeName = sch.SchemeName;
  356. basicPlcTestSchemeDto.DeviceName = sch.DeviceName;
  357. switch (item.item_type)
  358. {
  359. case 0:
  360. basicPlcTestSchemeDto.ItemType = "前置项";
  361. break;
  362. case 1:
  363. basicPlcTestSchemeDto.ItemType = "PLC点位测试项";
  364. break;
  365. case 2:
  366. basicPlcTestSchemeDto.ItemType = "Robot动作测试";
  367. break;
  368. }
  369. basicPlcTestSchemeDto.ItemName = item.item_name;
  370. basicPlcTestSchemeDto.CreateBy = sch.CreateBy;
  371. basicPlcTestSchemeDto.CreateTime = sch.CreateTime;
  372. //这里是测试项 结果和 测试记录明细状态
  373. var recordDetail=_iBizTestRecordDtlService.FindRecordDetailBySchDtlID(item.scheme_dtl_id);
  374. if(recordDetail != null)
  375. {
  376. basicPlcTestSchemeDto.StartTestTime = recordDetail.start_test_time.Value;
  377. basicPlcTestSchemeDto.FinishTestTime = recordDetail.finish_test_time.Value;
  378. basicPlcTestSchemeDto.TestMode= recordDetail.test_mode;
  379. switch (recordDetail.test_result)
  380. {
  381. case 0:
  382. basicPlcTestSchemeDto.TestResult = "不通过";
  383. break;
  384. case 1:
  385. basicPlcTestSchemeDto.TestResult = "通过";
  386. break;
  387. }
  388. switch (recordDetail.status)
  389. {
  390. case 0:
  391. basicPlcTestSchemeDto.TestStatus = "未测试";
  392. break;
  393. case 99:
  394. basicPlcTestSchemeDto.TestStatus = "已测试";
  395. break;
  396. }
  397. //只显示已测试的项
  398. allConfigList.Add(basicPlcTestSchemeDto);
  399. conditionConfig.Add(basicPlcTestSchemeDto);
  400. }
  401. }
  402. //默认显示的第一页
  403. Getpage();
  404. }
  405. }
  406. /// <summary>
  407. /// 获取页面
  408. /// </summary>
  409. private void Getpage()
  410. {
  411. CurrentPage = 1;
  412. TotalCount = conditionConfig.Count;
  413. CurrentPageChanged();
  414. }
  415. /// <summary>
  416. /// 页面变化
  417. /// </summary>
  418. private void CurrentPageChanged()
  419. {
  420. BaseConfigList.Clear();
  421. foreach (var i in conditionConfig.Skip((CurrentPage - 1) * CountPerPage).Take(CountPerPage))
  422. {
  423. BaseConfigList.Add(i);
  424. }
  425. }
  426. #endregion
  427. #region 命令绑定
  428. public DelegateCommand<object> QueryCommand { set; get; }
  429. public DelegateCommand<object> ResetCommand { set; get; }
  430. public DelegateCommand<string> ExportCommand { set; get; }
  431. public DelegateCommand OnLoadCommand { set; get; }
  432. public DelegateCommand<object> PdfReportCommand { set; get; }
  433. public DelegateCommand<object> CheckDetailCommand { set; get; }
  434. #endregion
  435. #region 数据绑定
  436. /// <summary>
  437. /// 测试方案编码
  438. /// </summary>
  439. private string scheduleName;
  440. public string ScheduleName
  441. {
  442. get { return scheduleName; }
  443. set { scheduleName = value; RaisePropertyChanged(); }
  444. }
  445. /// <summary>
  446. /// 设备名称
  447. /// </summary>
  448. private string deviceName;
  449. public string DeviceName
  450. {
  451. get { return deviceName; }
  452. set { deviceName = value; RaisePropertyChanged(); }
  453. }
  454. /// <summary>
  455. /// 测试项名称
  456. /// </summary>
  457. private string testName;
  458. public string TestName
  459. {
  460. get { return testName; }
  461. set { testName = value; RaisePropertyChanged(); }
  462. }
  463. /// <summary>
  464. /// 测试项类型
  465. /// </summary>
  466. private List<string> testKinds = new List<string>();
  467. public List<string> TestKinds
  468. {
  469. get { return testKinds; }
  470. set { testKinds = value; RaisePropertyChanged(); }
  471. }
  472. /// <summary>
  473. ///
  474. /// </summary>
  475. private string selectTest;
  476. public string SelectTest
  477. {
  478. get { return selectTest; }
  479. set { selectTest = value; RaisePropertyChanged(); }
  480. }
  481. private DateTime startTime = DateTime.Now;
  482. public DateTime StartTime
  483. {
  484. get { return startTime; }
  485. set { startTime = value; RaisePropertyChanged(); }
  486. }
  487. private DateTime endTime = DateTime.Now;
  488. public DateTime EndTime
  489. {
  490. get { return endTime; }
  491. set { endTime = value; RaisePropertyChanged(); }
  492. }
  493. /// <summary>
  494. /// 总条数
  495. /// </summary>
  496. private int totalCount;
  497. public int TotalCount
  498. {
  499. get { return totalCount; }
  500. set { totalCount = value; RaisePropertyChanged(); CurrentPageChanged(); }
  501. }
  502. /// <summary>
  503. /// 每页数量
  504. /// </summary>
  505. private int countPerPage = 10;
  506. public int CountPerPage
  507. {
  508. get { return countPerPage; }
  509. set { countPerPage = value; RaisePropertyChanged(); CurrentPageChanged(); }
  510. }
  511. /// <summary>
  512. /// 单前页
  513. /// </summary>
  514. private int currentPage = 1;
  515. public int CurrentPage
  516. {
  517. get { return currentPage; }
  518. set { currentPage = value; RaisePropertyChanged(); CurrentPageChanged(); }
  519. }
  520. private ObservableCollection<SchDtlWithResultModel> baseConfigList = new ObservableCollection<SchDtlWithResultModel>();
  521. public ObservableCollection<SchDtlWithResultModel> BaseConfigList
  522. {
  523. get { return baseConfigList; }
  524. set { SetProperty(ref baseConfigList, value); }
  525. }
  526. #endregion
  527. }
  528. }