ListProblemsViewModel.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. using IronXL;
  2. using NPOI.XWPF.UserModel;
  3. using RKISPATTERN.Command;
  4. using RKISPATTERN.Helpers;
  5. using RKISPATTERN.Models;
  6. using RKISPATTERN.View;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Collections.ObjectModel;
  10. using System.ComponentModel;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Runtime.CompilerServices;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using System.Windows;
  17. namespace RKISPATTERN.ViewModels
  18. {
  19. class ProblemsInfo
  20. {
  21. public int ID { get; set; }
  22. public string Name { get; set; }
  23. public string Description { get; set; }
  24. public DateTime date { get; set; }
  25. public string Status { get; set; }
  26. public string CustomerName { get; set; }
  27. public string WorkerName { get; set; }
  28. public string LoginCreator { get; set; }
  29. public ProblemsInfo(int iD, string name, string description, DateTime date,string status,int idCustomer,int? idWorker)
  30. {
  31. ID = iD;
  32. Name = name;
  33. Description = description;
  34. this.date = date;
  35. Status = status;
  36. using(DBContext db = new DBContext())
  37. {
  38. User customer = db.User.FirstOrDefault(u => db.Customer.FirstOrDefault(c => c.Id == idCustomer).Id == u.Id);
  39. CustomerName = $"{customer.FirstName} {customer.MiddleName} {customer.LastName}";
  40. LoginCreator = customer.Login;
  41. User worker = db.User.FirstOrDefault(u => db.Worker.FirstOrDefault(w => w.Id == idWorker).Id == u.Id);
  42. if(worker != null)
  43. WorkerName = $"{worker.FirstName} {worker.MiddleName} {worker.LastName}";
  44. }
  45. }
  46. }
  47. class ListProblemsViewModel : INotifyPropertyChanged
  48. {
  49. List<ProblemsInfo> problemsInfos = new List<ProblemsInfo>();
  50. public event PropertyChangedEventHandler? PropertyChanged;
  51. public void OnPropertyChanged([CallerMemberName] string prop = "")
  52. {
  53. if (PropertyChanged != null)
  54. PropertyChanged(this, new PropertyChangedEventArgs(prop));
  55. }
  56. private List<ProblemsInfo> _problems;
  57. public List<ProblemsInfo> Problems
  58. {
  59. get => _problems;
  60. set
  61. {
  62. _problems = value;
  63. OnPropertyChanged();
  64. }
  65. }
  66. string seacrhLogin;
  67. public string SearchLogin
  68. {
  69. get { return seacrhLogin; }
  70. set
  71. {
  72. seacrhLogin = value;
  73. OnPropertyChanged("SearchLogin");
  74. }
  75. }
  76. int changeProblem;
  77. public int ChangeProblem
  78. {
  79. get { return changeProblem; }
  80. set
  81. {
  82. changeProblem = value;
  83. OnPropertyChanged("ChangeProblem");
  84. }
  85. }
  86. int newStatus;
  87. public int NewStatus
  88. {
  89. get { return newStatus; }
  90. set
  91. {
  92. newStatus = value;
  93. OnPropertyChanged("NewStatus");
  94. }
  95. }
  96. int takenProblem;
  97. public int TakenProblem
  98. {
  99. get { return takenProblem; }
  100. set
  101. {
  102. takenProblem = value;
  103. OnPropertyChanged("TakenProblem");
  104. }
  105. }
  106. private RelayCommand searchProblemByLogin;
  107. public RelayCommand SearchProblemByLogin
  108. {
  109. get
  110. {
  111. return searchProblemByLogin ??
  112. (searchProblemByLogin = new RelayCommand(obj =>
  113. {
  114. Problems = _problems.Where(el => el.LoginCreator == SearchLogin).ToList<ProblemsInfo>();
  115. }));
  116. }
  117. }
  118. private RelayCommand sortDate;
  119. public RelayCommand SortDate
  120. {
  121. get
  122. {
  123. return sortDate ??
  124. (sortDate = new RelayCommand(obj =>
  125. {
  126. Problems = _problems.OrderBy(el => el.date).ToList<ProblemsInfo>();
  127. }));
  128. }
  129. }
  130. private RelayCommand historyProblems;
  131. public RelayCommand HistoryProblems
  132. {
  133. get
  134. {
  135. return historyProblems ??
  136. (historyProblems = new RelayCommand(obj =>
  137. {
  138. string Name = $"{MainWindowViewModel.CurrentUser.FirstName} {MainWindowViewModel.CurrentUser.MiddleName} {MainWindowViewModel.CurrentUser.LastName}";
  139. Problems = _problems.Where(el => el.WorkerName==Name).ToList<ProblemsInfo>();
  140. }));
  141. }
  142. }
  143. private RelayCommand сanTake;
  144. public RelayCommand CanTake
  145. {
  146. get
  147. {
  148. return сanTake ??
  149. (сanTake = new RelayCommand(obj =>
  150. {
  151. Problems = _problems.Where(el => el.WorkerName == null).ToList<ProblemsInfo>();
  152. }));
  153. }
  154. }
  155. public RelayCommand createReports;
  156. public RelayCommand CreateReports
  157. {
  158. get
  159. {
  160. return createReports ??= new RelayCommand(
  161. x =>
  162. {
  163. static void CreateWord(List<ProblemsInfo> problemsInfos)
  164. {
  165. var db = new DBContext();
  166. XWPFDocument doc = new XWPFDocument();
  167. XWPFTable table = doc.CreateTable(2 + db.Problem.Count(), 7);
  168. table.SetColumnWidth(0, 1200);
  169. table.SetColumnWidth(1, 1200);
  170. table.SetColumnWidth(2, 1200);
  171. table.SetColumnWidth(3, 1200);
  172. table.SetColumnWidth(4, 1200);
  173. table.SetColumnWidth(5, 1200);
  174. table.SetColumnWidth(6, 1200);
  175. table.GetRow(0).GetCell(0).SetText("ID");
  176. table.GetRow(0).GetCell(1).SetText("Название");
  177. table.GetRow(0).GetCell(2).SetText("Описание");
  178. table.GetRow(0).GetCell(3).SetText("Создатель");
  179. table.GetRow(0).GetCell(4).SetText("Исполнитель");
  180. table.GetRow(0).GetCell(5).SetText("Дата");
  181. table.GetRow(0).GetCell(6).SetText("Статус");
  182. int i = 1;
  183. foreach (var problem in problemsInfos)
  184. {
  185. table.GetRow(i).GetCell(0).SetText(problem.ID.ToString());
  186. table.GetRow(i).GetCell(1).SetText(problem.Name);
  187. table.GetRow(i).GetCell(2).SetText(problem.Description);
  188. table.GetRow(i).GetCell(3).SetText(problem.CustomerName);
  189. table.GetRow(i).GetCell(4).SetText(problem.WorkerName ?? "");
  190. table.GetRow(i).GetCell(5).SetText(problem.date.ToShortDateString());
  191. table.GetRow(i).GetCell(6).SetText(problem.Status);
  192. i++;
  193. }
  194. }
  195. CreateWord(problemsInfos);
  196. static void CreateExcel(List<ProblemsInfo> problemsInfos)
  197. {
  198. WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
  199. var table = workbook.CreateWorkSheet("example_sheet");
  200. table["A1"].Value = "ID";
  201. table["B1"].Value = "Название";
  202. table["C1"].Value = "Описание";
  203. table["D1"].Value = "Создатель";
  204. table["E1"].Value = "Исполнитель";
  205. table["F1"].Value = "Дата";
  206. table["G1"].Value = "Статус";
  207. uint i = 2;
  208. var ctx = new DBContext();
  209. foreach (var problem in problemsInfos)
  210. {
  211. table[$"A{i}"].Value = problem.ID.ToString();
  212. table[$"B{i}"].Value = problem.Name;
  213. table[$"C{i}"].Value = problem.Description;
  214. table[$"D{i}"].Value = problem.CustomerName;
  215. table[$"E{i}"].Value = problem.WorkerName??"";
  216. table[$"F{i}"].Value = problem.date.ToString();
  217. table[$"G{i}"].Value = problem.Status;
  218. table.Columns[0].Width = 4000;
  219. table.Columns[1].Width = 5000;
  220. table.Columns[2].Width = 5000;
  221. table.Columns[3].Width = 5000;
  222. table.Columns[4].Width = 5000;
  223. table.Columns[5].Width = 5000;
  224. table.Columns[6].Width = 5000;
  225. i++;
  226. }
  227. workbook.SaveAs("otchet.xlsx");
  228. }
  229. CreateExcel(problemsInfos);
  230. });
  231. }
  232. }
  233. private RelayCommand takeProblem;
  234. public RelayCommand TakeProblem
  235. {
  236. get
  237. {
  238. return takeProblem ??
  239. (takeProblem = new RelayCommand(obj =>
  240. {
  241. using (DBContext dbContext = new DBContext())
  242. {
  243. if (TakenProblem >= problemsInfos.Count())
  244. {
  245. MessageBox.Show("Неверный ввод!", "Ошибка", MessageBoxButton.YesNoCancel, MessageBoxImage.Asterisk);
  246. return;
  247. }
  248. int index = problemsInfos[TakenProblem].ID - 1;
  249. Problem problem = dbContext.Problem.FirstOrDefault(p => p.Id == index);
  250. if (problem == null || problem.worker != null)
  251. {
  252. MessageBox.Show("Неверный ввод!", "Ошибка", MessageBoxButton.YesNoCancel, MessageBoxImage.Asterisk);
  253. return;
  254. }
  255. dbContext.Problem.First(p => p.Id == index).workerId = MainWindowViewModel.CurrentUser.Id;
  256. dbContext.SaveChanges();
  257. }
  258. }));
  259. }
  260. }
  261. private RelayCommand backToMenu;
  262. public RelayCommand BackToMenu
  263. {
  264. get
  265. {
  266. return backToMenu ??
  267. (backToMenu = new RelayCommand(obj =>
  268. {
  269. MainMenu mainMenu = new MainMenu();
  270. mainMenu.Show();
  271. Helper.CloseWindow<ListProblem>();
  272. }));
  273. }
  274. }
  275. private RelayCommand changeStatus;
  276. public RelayCommand ChangeStatus
  277. {
  278. get
  279. {
  280. return changeStatus ??
  281. (changeStatus = new RelayCommand(obj =>
  282. {
  283. if (ChangeProblem >= problemsInfos.Count())
  284. {
  285. MessageBox.Show("Неверный ввод!", "Ошибка", MessageBoxButton.YesNoCancel, MessageBoxImage.Asterisk);
  286. return;
  287. }
  288. string Name = $"{MainWindowViewModel.CurrentUser.FirstName} {MainWindowViewModel.CurrentUser.MiddleName} {MainWindowViewModel.CurrentUser.LastName}";
  289. if (Name == problemsInfos[ChangeProblem -1].CustomerName)
  290. {
  291. if (NewStatus == 0)
  292. {
  293. using (DBContext dbContext = new DBContext())
  294. {
  295. int index = problemsInfos[ChangeProblem - 1].ID ;
  296. dbContext.Problem.First(p => p.Id == index).status = "Свободно";
  297. dbContext.SaveChanges();
  298. }
  299. }
  300. else if (NewStatus == 1)
  301. {
  302. using (DBContext dbContext = new DBContext())
  303. {
  304. int index = problemsInfos[ChangeProblem - 1].ID ;
  305. dbContext.Problem.First(p => p.Id == index).status = "В процессе";
  306. dbContext.SaveChanges();
  307. }
  308. }
  309. else if (NewStatus == 2)
  310. {
  311. using (DBContext dbContext = new DBContext())
  312. {
  313. int index = problemsInfos[ChangeProblem -1].ID;
  314. dbContext.Problem.First(p => p.Id == index).status = "Готово";
  315. dbContext.SaveChanges();
  316. }
  317. }
  318. }
  319. }));
  320. }
  321. }
  322. public ListProblemsViewModel()
  323. {
  324. using(DBContext dbContext = new DBContext())
  325. {
  326. foreach (var el in dbContext.Problem)
  327. {
  328. problemsInfos.Add(new ProblemsInfo(el.Id, el.Name, el.Decription, el.date,el.status, el.customerId, el.workerId));
  329. }
  330. _problems = new List<ProblemsInfo>(problemsInfos);
  331. }
  332. }
  333. }
  334. }