using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //подключение библиотек using Emgu.CV; using Emgu.CV.Structure; using Emgu.CV.Face; using Emgu.CV.CvEnum; using System.IO; using System.Threading; using System.Xml; using System.Drawing.Imaging; using System.Data.SqlClient; using DirectShowLib; using Emgu.CV.Util; using System.Runtime.CompilerServices; using Timer = System.Windows.Forms.Timer; using ZedGraph; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; using Excel = Microsoft.Office.Interop.Excel; namespace ImpulseVision { public partial class FormMain : Form { #region <Переменные> public event PropertyChangedEventHandler PropertyChanged; private VideoCapture Capture; private CascadeClassifier HaarCascade; private Image BgrFrame = null; private Image DetectedFace = null; private List FaceList = new List(); private VectorOfMat ImageList = new VectorOfMat(); private List NameList = new List(); private VectorOfInt LabelList = new VectorOfInt(); private EigenFaceRecognizer recognizer; private Timer CaptureTimer; #region FaceName private string UserName = string.Empty; private string faceName; public string FaceName { get { return faceName; } set { faceName = value.ToUpper(); UserName = faceName; //PbxFaces.Invoke(DispatcherPriority.Normal, new Action(() => { lblFaceName.Content = faceName; })); NotifyPropertyChanged(); } } #endregion #region CameraCaptureImage private Bitmap cameraCapture; public Bitmap CameraCapture { get { return cameraCapture; } set { cameraCapture = value; //imgCamera.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { imgCamera.Source = BitmapToImageSource(cameraCapture); })); PbxEther.Image = cameraCapture; //PbxFaces.Image = BitmapToImageSource(cameraCapture); NotifyPropertyChanged(); } } #endregion #region CameraCaptureFaceImage private Bitmap cameraCaptureFace; public Bitmap CameraCaptureFace { get { return cameraCaptureFace; } set { cameraCaptureFace = value; PbxEther.Image = cameraCapture; NotifyPropertyChanged(); } } #endregion int SelectedCameraID = -1; //доступные видеокамеры private DsDevice[] WebCams = null; int CountCams = -1; //множество для хранения списка камер HashSet HtBefore = new HashSet(); //включена ли на данный момент камера bool IsWorking = false; public static string TxtCon = $@"Data Source=213.155.192.79,3002;Initial Catalog=ImpulseVisionApp;Persist Security Info=True;User ID=u20teresh;Password=bfg2"; /// /// текущий выбранный пользователь из списка /// UserItem CurrentUser = null; /// /// выбранная плитка в окне "посещения" /// TileOvals CurrentOvals = null; /// /// выбранная плитка в окне "журнал отклонённых" /// CardJournal CurrentCard = null; SqlConnection SCon = new SqlConnection(Properties.Settings.Default.ImpulseVisionAppConnectionString); //список с пользователями системы List LstUsers = new List(); //ID пользователя, который был только что добавлен string AddingUserID = string.Empty; //список, в котором хранятся пути изображений пользователей List LstPathImage = new List(); //уведомление о том, что сохранение выполнено bool Saving = false; /// /// отображение пользователей 1 - обычный пользователь, 0- сотрудник охраны /// int ViewUserByType = 1; #endregion //пути доступа к изображениям пользователей List LstUserPictures = new List(); struct Pictures { public string UserID, PicturePath; } struct Users { public string FIO, PassportSeria, PassportNum, UserID; } public FormMain() { InitializeComponent(); } private void CaptureTimer_Tick(object sender, EventArgs e) { ProcessFrame(); } /// /// получение данных с камеры и обработка изображений /// private void ProcessFrame() { if (BgrFrame == null) return; BgrFrame = Capture.QueryFrame().ToImage().Flip(FlipType.Horizontal); if (BgrFrame != null) { try { Image grayframe = BgrFrame.Convert(); Rectangle[] Faces = HaarCascade.DetectMultiScale(grayframe, 1.2, 10, new System.Drawing.Size(50, 50), new System.Drawing.Size(200, 200)); FaceName = "Лицо не обнаружено"; foreach (var face in Faces) { BgrFrame.Draw(face, new Bgr(53, 23, 247), 2); DetectedFace = BgrFrame.Copy(face).Convert(); FaceRecognition(); break; } CameraCapture = BgrFrame.ToBitmap(); } catch (Exception ex) { } } } /// /// получение данных об изображениях /// public void GetFacesList() { if (!File.Exists(Config.HaarCascadePath)) { string text = "Файл каскада Хаара не обнаружен:\n\n"; text += Config.HaarCascadePath; DialogResult result = MessageBox.Show(text, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } HaarCascade = new CascadeClassifier(Config.HaarCascadePath); FaceList.Clear(); // Создать директорию, если она отсутствовала if (!Directory.Exists(Config.FacePhotosPath)) { Directory.CreateDirectory(Config.FacePhotosPath); } // Тренировать изображения if (ImageList.Size > 0) { recognizer = new EigenFaceRecognizer(ImageList.Size); recognizer.Train(ImageList, LabelList); } } /// /// распознавание лица /// private void FaceRecognition() { if (ImageList.Size != 0) { FaceRecognizer.PredictionResult result = recognizer.Predict(DetectedFace.Resize(100, 100, Inter.Cubic)); FaceName = NameList[result.Label]; CameraCaptureFace = DetectedFace.ToBitmap(); } else { FaceName = "Пожалуйста добавьте лицо"; } } protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } private void FormMain_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'impulseVisionAppDataSet1.Staffs' table. You can move, or remove it, as needed. this.staffsTableAdapter.Fill(this.impulseVisionAppDataSet1.Staffs); HideAdding(); ApplyFormParameters(); //скрытие заголовков вкладок в TabControl TabPages.Appearance = TabAppearance.FlatButtons; TabPages.ItemSize = new Size(0, 1); TabPages.SizeMode = TabSizeMode.Fixed; this.Show(); GetCams(); CmbCams.Visible = false; TslSelCamText.Visible = false; LblAdminID.Hide(); CmbSortDate.SelectedIndex = 0; DtpFiniteDate.Value = DateTime.Now.Date; ViewUserByType = 1; GetUsersFromDB(ViewUserByType); } /// /// применение параметров формы /// private void ApplyFormParameters() { ApplicationParameters application = new ApplicationParameters(); SwAutoRun.Checked = application.AutoRun; Point FormPoint = new Point(); FormPoint = application.Points; if (FormPoint.X != -1 || FormPoint.Y != -1) { this.Location = FormPoint; SwPositionWindow.Checked = true; } Size Sz = new Size(); Sz = application.Sizes; if (Sz.Width != -1 || Sz.Height != -1) { this.Size = application.Sizes; SwSaveSizeWindow.Checked = true; } NumCountDaySaveLogFiles.Value = application.CountDay; } /// /// получение списка доступных камер /// private void GetCams() { WebCams = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); CountCams = WebCams.Length; CmbCams.Items.Clear(); for (int i = 0; i < CountCams; i++) { CmbCams.Items.Add(WebCams[i].Name); HtBefore.Add(WebCams[i].Name); } if (CountCams > 0) { CmbCams.SelectedIndex = 0; SelectedCameraID = 0; } else { MessageBox.Show("Видеоустройства не обнаружены!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); } } /// /// удаление пользователя из системы /// private void BtnDelUser_Click(object sender, EventArgs e) { string NameUserType = "Users"; if (ViewUserByType == 0) { NameUserType = "Staffs"; } string IdUser = string.Empty; IdUser = CurrentUser.UserID; DialogResult Res = MessageBox.Show("Подтверждение данной операции приведёт к безвозвратному удалению пользователя из системы.\r\nПодтвердить удаление?", "ImpulseVision", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); if (Res == DialogResult.No) return; if(ViewUserByType == 1) { SCon.Open(); string QueryDelUser = $@"delete from FaceImages where UserID = '{IdUser}'"; SqlCommand Cmd = new SqlCommand(QueryDelUser, SCon); Cmd.ExecuteNonQuery(); QueryDelUser = $@"delete from UserTraffic where UserID = '{IdUser}'"; Cmd = new SqlCommand(QueryDelUser, SCon); Cmd.ExecuteNonQuery(); QueryDelUser = $@"delete from Users where ID = '{IdUser}'"; Cmd = new SqlCommand(QueryDelUser, SCon); Cmd.ExecuteNonQuery(); SCon.Close(); } else { SCon.Open(); string QueryDelUser = $@"delete from HistoryLogin where StaffsID = '{IdUser}'"; SqlCommand Cmd = new SqlCommand(QueryDelUser, SCon); Cmd.ExecuteNonQuery(); QueryDelUser = $@"delete from {NameUserType} where ID = '{IdUser}'"; Cmd = new SqlCommand(QueryDelUser, SCon); Cmd.ExecuteNonQuery(); SCon.Close(); } if (ViewUserByType == 1) { string PhotoName = string.Empty; for (int i = 0; i < LstUsers.Count; i++) { if (LstUsers[i].UserID == IdUser) { PhotoName = LstUsers[i].FIO.Split(' ')[1] + LstUsers[i].PassportSeria + LstUsers[i].PassportNum; } } try { File.Delete(Application.StartupPath + "\\" + Config.FacePhotosPath + $"{PhotoName}.bmp"); } catch { MessageBox.Show("Фотографии пользователя не найдены!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } } GetUsersFromDB(ViewUserByType); MessageBox.Show("Пользователь безвозвратно удалён из системы!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Information); } /// /// показ окна добавления /// private void ShowAdding() { this.TableLayoutWorks.BeginInvoke((MethodInvoker)(() => this.TableLayoutWorks.ColumnStyles[0].Width = 250)); this.TableLayoutWorks.BeginInvoke((MethodInvoker)(() => this.TableLayoutWorks.BackColor = Color.White)); } /// /// скрытие окна добавления /// private void HideAdding() { TableLayoutWorks.ColumnStyles[0].Width = 0; TableLayoutWorks.BackColor = Color.Black; } private void PbxEther_Click(object sender, EventArgs e) { HideAdding(); } /// /// добавление нового пользоввателя /// private void BtnAddUser_Click(object sender, EventArgs e) { if (ViewUserByType == 0) { FormEditingGuard Fg = new FormEditingGuard(true, CurrentUser.UserID.ToString()); ; if (Fg.ShowDialog() == DialogResult.OK) { GetUsersFromDB(ViewUserByType); } } else { CmbCams.Visible = true; TslSelCamText.Visible = true; BtnEditUser.Visible = false; BtnDelUser.Visible = false; TbxLastname.Text = ""; TbxFirstname.Text = ""; TbxPatronymic.Text = ""; TbxPasportSeria.Text = ""; TbxPasportNum.Text = ""; TabPages.SelectTab(1); PbxEther.Image = Properties.Resources.loading_7; CaptureTimer = new Timer() { Interval = Config.TimerResponseValue }; CaptureTimer.Tick += CaptureTimer_Tick; if (IsWorking) return; TableLayoutWorks.BackColor = Color.Black; IsWorking = true;//камера включена GetFacesList(); Capture = new VideoCapture(Config.ActiveCameraIndex); Capture.SetCaptureProperty(CapProp.Fps, 30); Capture.SetCaptureProperty(CapProp.FrameHeight, 450); Capture.SetCaptureProperty(CapProp.FrameWidth, 370); CaptureTimer.Start(); ShowAdding(); } } /// /// выключение распознавания /// private void RecogniseOff() { HideAdding(); if (BgrFrame != null) { BgrFrame = null; Capture.Dispose(); CaptureTimer.Tick -= CaptureTimer_Tick; } PbxEther.Image = Properties.Resources._9110852_video_no_icon; TableLayoutWorks.BackColor = Color.Gray; IsWorking = false; } /// /// сохранение информации для нового пользователя /// private void BtnSave_Click(object sender, EventArgs e) { if (DetectedFace == null) { MessageBox.Show("Лица не обнаружены!\r\nУбедитесь что лицо находится в кадре и обведено красным прямоугольником.", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } string PhotoPath = string.Empty; ProgressOperation.Value = 10; TslStatus.Text = "Добавление нового пользователя..."; bool Flag = TbxLastname.Text.Trim() == "" || TbxFirstname.Text.Trim() == "" || TbxPasportSeria.Text.Trim() == "" || TbxPasportNum.Text.Trim() == "" || TbxPhone.Text.Trim() == ""; if (Flag) { MessageBox.Show("Заполните все поля и повторите попытку!", "Ошибка добавления!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if (TbxPasportSeria.Text.Trim().Length < 4) { MessageBox.Show("Серия паспорта не может быть короче 4-х чисел!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if (TbxPasportNum.Text.Trim().Length < 6) { MessageBox.Show("Номер паспорта не может быть короче 6-ти чисел!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if (TbxPhone.Text.Trim().Length < 10) { MessageBox.Show("Номер телефона не может быть короче 10-ти чисел!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } SCon.Open(); string QueryCheckPassport = $@"select PassportSeria,PassportNum from Users where PassportSeria = '{TbxPasportSeria.Text.Trim()}' and PassportNum = '{TbxPasportNum.Text.Trim()}'"; SqlCommand CmdCheck = new SqlCommand(QueryCheckPassport, SCon); SqlDataReader Res = CmdCheck.ExecuteReader(); if(Res.HasRows) { MessageBox.Show("Данные паспорта указаны неверно!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Error); SCon.Close(); ProgressOperation.Value = 0; return; } SCon.Close(); SCon.Open(); string QueryAdd = $@"insert into Users (Lastname,Firstname, Patronymic, PassportSeria, PassportNum,Phone, IDUserType) values (@last,@first,@patr,@seria,@number,@phone,3)"; SqlCommand Cmd = new SqlCommand(QueryAdd, SCon); Cmd.Parameters.AddWithValue("@last", TbxLastname.Text.Trim()); Cmd.Parameters.AddWithValue("@first", TbxFirstname.Text.Trim()); Cmd.Parameters.AddWithValue("@patr", TbxPatronymic.Text.Trim()); Cmd.Parameters.AddWithValue("@seria", TbxPasportSeria.Text.Trim()); Cmd.Parameters.AddWithValue("@number", TbxPasportNum.Text.Trim()); Cmd.Parameters.AddWithValue("@phone", TbxPhone.Text.Trim()); Cmd.ExecuteNonQuery(); SCon.Close(); SCon.Open(); string QueryAddingUserID = $@"select MAX(ID) as LastID from Users"; Cmd = new SqlCommand(QueryAddingUserID, SCon); SqlDataReader ResID = Cmd.ExecuteReader(); if(ResID.HasRows) { ResID.Read(); AddingUserID = ResID["LastID"].ToString(); } SCon.Close(); DetectedFace = DetectedFace.Resize(100, 100, Inter.Cubic); DetectedFace.Save(Config.FacePhotosPath + $"{TbxFirstname.Text.Trim()}{TbxPasportSeria.Text.Trim()}{TbxPasportNum.Text.Trim()}" + Config.ImageFileExtension); PhotoPath = Config.FacePhotosPath + $"{TbxFirstname.Text.Trim()}{TbxPasportSeria.Text.Trim()}{TbxPasportNum.Text.Trim()}" + Config.ImageFileExtension; TslStatus.Text = "Сохранение данных о пользователе..."; ProgressOperation.Value = 50; TslStatus.Text = "Добавление нового пользователя..."; SCon.Open(); string QueryAddPathImage = $@"insert into FaceImages (UserID,Picture) values ({AddingUserID},'{PhotoPath}')"; Cmd = new SqlCommand(QueryAddPathImage, SCon); Cmd.ExecuteNonQuery(); SCon.Close(); MessageBox.Show("Успешно сохранено!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Information); TimerSaving.Enabled = true; TimerSaving.Start(); TslStatus.Text = "Готов"; ProgressOperation.Value = 100; } private void CmbCams_SelectedIndexChanged(object sender, EventArgs e) { try { if (BgrFrame != null) { BgrFrame = null; Capture.Dispose(); CaptureTimer.Tick -= CaptureTimer_Tick; } } catch (Exception ex) { MessageBox.Show(ex.Message, "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } if (TabPages.SelectedIndex == 1) { SelectedCameraID = CmbCams.SelectedIndex; Capture = new VideoCapture(SelectedCameraID); //настройка кадров Capture.SetCaptureProperty(CapProp.Fps, 30); Capture.SetCaptureProperty(CapProp.FrameHeight, 450); Capture.SetCaptureProperty(CapProp.FrameWidth, 370); CaptureTimer.Tick += CaptureTimer_Tick; CaptureTimer.Start(); } } private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { SetApplicationParameter(); } private void TimerNewCam_Tick(object sender, EventArgs e) { DsDevice[] Cams = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); int Count = Cams.Length; //если количество подключённых камер изменилось if(Count != CountCams) { if (Count > CountCams) { StatusAddNewDevice(Cams); } else if(Count < CountCams) { StatusOffDevice(Cams); } GetCams(); } } /// /// уведомление об отключении web-камеры /// /// массив с доступными камерами async void StatusOffDevice(DsDevice[] cams) { HashSet HtAfter = new HashSet(); foreach(DsDevice device in cams) { HtAfter.Add(device.Name); } HtBefore.Except(HtAfter); ProgressOperation.Value = 0; TslStatus.Text = $"Устройство: {string.Join(" ",HtBefore)} - отключено"; await Task.Delay(1000); ProgressOperation.Value = 100; TslStatus.Text = "Готов"; } /// /// уведомление о подключении нового устройствва /// /// массив с доступными web-камерами async void StatusAddNewDevice(DsDevice[] Cams) { TslStatus.Text = "Добавление нового устройства.."; ProgressOperation.Value = 0; while(ProgressOperation.Value < 100) { ProgressOperation.Value += 5; await Task.Delay(50); } TslStatus.Text = "Добавлено новое устройство"; await Task.Delay(1000); TslStatus.Text = $"{Cams[Cams.Length-1].Name}"; await Task.Delay(1000); ProgressOperation.Value = 100; TslStatus.Text = "Готов"; } private void STools_Click(object sender, EventArgs e) { BtnEditUser.Visible = false; BtnDelUser.Visible = false; BtnAddUser.Visible = true; TabPages.SelectTab(2); RecogniseOff(); } /// /// получить список пользователй системы /// private void SUsers_Click(object sender, EventArgs e) { } /// /// получение пользователей из БД /// private void GetUsersFromDB(int userType) { SCon.Open(); string NameUserType = string.Empty; if(userType == 1) { NameUserType = "Users"; } else { NameUserType = "Staffs"; } string QueryForGetUser = $@"select ID, Lastname + ' ' + Firstname + ' ' + Patronymic as FIO, PassportSeria, PassportNum from {NameUserType}"; SqlCommand Cmd = new SqlCommand(QueryForGetUser, SCon); SqlDataReader Res = Cmd.ExecuteReader(); LstUsers.Clear(); while (Res.Read()) { Users user = new Users(); user.FIO = Res["FIO"].ToString(); user.UserID = Res["ID"].ToString(); user.PassportSeria = Res["PassportSeria"].ToString(); user.PassportNum = Res["PassportNum"].ToString(); LstUsers.Add(user); } SCon.Close(); TabPages.SelectTab(0); TableUsers.Controls.Clear(); for (int i = 0; i < LstUsers.Count; i++) { UserItem Item = new UserItem(); Item.UserID = LstUsers[i].UserID; Item.LblNameUser.Text = LstUsers[i].FIO; Item.Click += User_Click; Item.LblNameUser.Click += Object_Click; TableUsers.Controls.Add(Item); if (TableUsers.Controls.Count == 1) { CurrentUser = Item; CurrentUser.BackColor = ColorTranslator.FromHtml("#C3EB78"); } } } /// /// выбор пользователя из списка /// private void Object_Click(object sender, EventArgs e) { CurrentUser.BackColor = Color.FromArgb(((int)(((byte)(184)))), ((int)(((byte)(184)))), ((int)(((byte)(255))))); CurrentUser = (sender as Control).Parent as UserItem; CurrentUser.BackColor = ColorTranslator.FromHtml("#C3EB78"); } private void User_Click(object sender, EventArgs e) { CurrentUser.BackColor = Color.FromArgb(((int)(((byte)(184)))), ((int)(((byte)(184)))), ((int)(((byte)(255))))); CurrentUser = sender as UserItem; CurrentUser.BackColor = ColorTranslator.FromHtml("#C3EB78"); } private void MExit_Click(object sender, EventArgs e) { Close(); } private void MMain_Click(object sender, EventArgs e) { CmbCams.Visible = false; TslSelCamText.Visible = false; RecogniseOff(); GetUsersFromDB(ViewUserByType); TabPages.SelectTab(0); BtnEditUser.Visible = true; BtnDelUser.Visible = true; BtnAddUser.Visible = true; BtnInfoTraffic.Visible = true; TslStatus.Text = "Готов"; ProgressOperation.Value = 100; } private void BtnEditUser_Click(object sender, EventArgs e) { if (ViewUserByType == 0) { FormEditingGuard Fg = new FormEditingGuard(false, CurrentUser.UserID.ToString()); if (Fg.ShowDialog() == DialogResult.OK) { GetUsersFromDB(ViewUserByType); } } else { FormEditUser FEdit = new FormEditUser(); FEdit.LblSelectUserID.Text = CurrentUser.UserID.ToString(); if (FEdit.ShowDialog() == DialogResult.OK) { GetUsersFromDB(ViewUserByType); } } } private void TimerSaving_Tick(object sender, EventArgs e) { if (Saving) { MMain_Click(sender, e); ViewUserByType = 1; GetUsersFromDB(ViewUserByType); TimerSaving.Stop(); TimerSaving.Enabled = false; } } private void BtnInfoTraffic_Click(object sender, EventArgs e) { BtnAddUser.Visible = false; BtnEditUser.Visible = false; BtnDelUser.Visible = false; TslSelCamText.Visible = false; CmbCams.Visible = false; CbxFilterDate.Checked = false; TabPages.SelectTab(3); GetJournalVisits(); } /// /// получение из БД списка посещений /// private void GetJournalVisits() { TslStatus.Text = "Загрузка данных..."; ProgressOperation.Value = 10; SCon.Open(); string QueryGetVisits = $@"set dateformat dmy select Users.ID,Users.Lastname +' '+ Users.Firstname + ' '+Users.Patronymic as FIO,TimeEntrance,TimeExit, [Date],Identification from UserTraffic ut join Users on ut.UserID = Users.ID "; if (CbxFilterDate.Checked) { if (DtpFiniteDate.Visible) { QueryGetVisits += $" where [Date] = '{DtpFiniteDate.Value.Date}'"; } else { QueryGetVisits += $" where [Date] between '{DtpDateStart.Value.Date}' and '{DtpDateEnd.Value.Date}'"; } QueryGetVisits += $@" and Users.Lastname +' '+ Users.Firstname + ' '+Users.Patronymic like '%{TbxFindUser.Text.Trim()}%'"; } else QueryGetVisits += $@" where Users.Lastname +' '+ Users.Firstname + ' '+Users.Patronymic like '%{TbxFindUser.Text.Trim()}%'"; if(!CbxIsAuthentification.Checked) { QueryGetVisits += " and Identification = 1"; } SqlCommand Cmd = new SqlCommand(QueryGetVisits, SCon); SqlDataReader Res = Cmd.ExecuteReader(); TslStatus.Text = "Загрузка данных..."; ProgressOperation.Value = 30; TabJournal.Controls.Clear(); if (Res.HasRows) { while (Res.Read()) { TileOvals Ovals = new TileOvals(); Ovals.UserID = Res["ID"].ToString(); Ovals.LblNameUser.Text = Res["FIO"].ToString(); Ovals.LblTimeEntrance.Text = Res["TimeEntrance"].ToString(); Ovals.LblTimeExit.Text = Res["TimeExit"].ToString(); Ovals.IsIdentification = Res["Identification"].ToString(); Ovals.LblDate.Text = DateTime.Parse(Res["Date"].ToString()).ToString("dd.MM.yyyy"); if (Ovals.IsIdentification.ToLower() == "false") { Ovals.RPanelDate.BackColor = ColorTranslator.FromHtml("#f71735"); Ovals.RPanelName.BackColor = ColorTranslator.FromHtml("#f71735"); Ovals.RPanelTimeEntrance.BackColor = ColorTranslator.FromHtml("#f71735"); Ovals.RPanelTimeExit.BackColor = ColorTranslator.FromHtml("#f71735"); } else { Ovals.RPanelDate.BackColor = Color.FromArgb(184, 184, 255); Ovals.RPanelName.BackColor = Color.FromArgb(184, 184, 255); Ovals.RPanelTimeEntrance.BackColor = Color.FromArgb(184, 184, 255); Ovals.RPanelTimeExit.BackColor = Color.FromArgb(184, 184, 255); } Ovals.Click += Ovals_Click; Ovals.LblDate.Click += OvalsObject_Click; Ovals.LblNameUser.Click += OvalsObject_Click; Ovals.LblTimeEntrance.Click += OvalsObject_Click; Ovals.LblTimeExit.Click += OvalsObject_Click; Ovals.RPanelName.Click += OvalsObject_Click; Ovals.RPanelTimeEntrance.Click += OvalsObject_Click; Ovals.RPanelTimeExit.Click += OvalsObject_Click; Ovals.RPanelDate.Click += OvalsObject_Click; TabJournal.Controls.Add(Ovals); if (TabJournal.Controls.Count == 1) { CurrentOvals = Ovals; CurrentOvals.RPanelDate.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelName.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelTimeEntrance.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelTimeExit.BackColor = ColorTranslator.FromHtml("#C3EB78"); } } TslStatus.Text = "Готов"; ProgressOperation.Value = 100; } else { TslStatus.Text = "При выбранных параметрах сортировки, результаты отсутствуют"; ProgressOperation.Value = 0; } SCon.Close(); } private void OvalsObject_Click(object sender, EventArgs e) { if (CurrentOvals.IsIdentification.ToLower() == "false") { CurrentOvals.RPanelDate.BackColor = ColorTranslator.FromHtml("#f71735"); CurrentOvals.RPanelName.BackColor = ColorTranslator.FromHtml("#f71735"); CurrentOvals.RPanelTimeEntrance.BackColor = ColorTranslator.FromHtml("#f71735"); CurrentOvals.RPanelTimeExit.BackColor = ColorTranslator.FromHtml("#f71735"); } else { CurrentOvals.RPanelDate.BackColor = Color.FromArgb(184, 184, 255); CurrentOvals.RPanelName.BackColor = Color.FromArgb(184, 184, 255); CurrentOvals.RPanelTimeEntrance.BackColor = Color.FromArgb(184, 184, 255); CurrentOvals.RPanelTimeExit.BackColor = Color.FromArgb(184, 184, 255); } CurrentOvals = ((sender as Control).Parent as RPanel).Parent as TileOvals; CurrentOvals.RPanelDate.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelName.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelTimeEntrance.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelTimeExit.BackColor = ColorTranslator.FromHtml("#C3EB78"); } private void Ovals_Click(object sender, EventArgs e) { if (CurrentOvals.IsIdentification.ToLower() == "false") { CurrentOvals.RPanelDate.BackColor = ColorTranslator.FromHtml("#f71735"); CurrentOvals.RPanelName.BackColor = ColorTranslator.FromHtml("#f71735"); CurrentOvals.RPanelTimeEntrance.BackColor = ColorTranslator.FromHtml("#f71735"); CurrentOvals.RPanelTimeExit.BackColor = ColorTranslator.FromHtml("#f71735"); } else { CurrentOvals.RPanelDate.BackColor = Color.FromArgb(184, 184, 255); CurrentOvals.RPanelName.BackColor = Color.FromArgb(184, 184, 255); CurrentOvals.RPanelTimeEntrance.BackColor = Color.FromArgb(184, 184, 255); CurrentOvals.RPanelTimeExit.BackColor = Color.FromArgb(184, 184, 255); } CurrentOvals = sender as TileOvals; CurrentOvals.RPanelDate.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelName.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelTimeEntrance.BackColor = ColorTranslator.FromHtml("#C3EB78"); CurrentOvals.RPanelTimeExit.BackColor = ColorTranslator.FromHtml("#C3EB78"); } private void CmbSortDate_SelectedIndexChanged(object sender, EventArgs e) { PanelPeriod.Visible = CmbSortDate.SelectedIndex == 1; DtpFiniteDate.Visible = CmbSortDate.SelectedIndex == 0; } private void DtpFiniteDate_ValueChanged(object sender, EventArgs e) { if (TabPages.SelectedIndex == 3) { GetJournalVisits(); } } private void DtpDateStart_ValueChanged(object sender, EventArgs e) { if (TabPages.SelectedIndex == 3) { GetJournalVisits(); } } private void DtpDateEnd_ValueChanged(object sender, EventArgs e) { if (TabPages.SelectedIndex == 3) { GetJournalVisits(); } } private void TbxFindUser_TextChanged(object sender, EventArgs e) { GetJournalVisits(); } private void SJournal_Click(object sender, EventArgs e) { BtnAddUser.Visible = true; BtnEditUser.Visible = false; BtnDelUser.Visible = false; TslSelCamText.Visible = false; CmbCams.Visible = false; TabPages.SelectTab(4); GetUserListJournal(); } /// /// получение и вывод списка пользователей, которые не прошли опознание /// private void GetUserListJournal() { TabCard.Controls.Clear(); if (!Directory.Exists(Application.StartupPath + "\\Source\\log\\")) { Directory.CreateDirectory(Application.StartupPath + "\\Source\\log\\"); } DirectoryInfo Dir = new DirectoryInfo(Application.StartupPath + "\\Source\\log\\"); FileInfo[] Files = Dir.GetFiles(); if(Files.Length == 0) { MessageBox.Show("Файлы журнала отсутствуют!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } Dictionary Keys = new Dictionary(); List LstID = new List(); foreach (var t in Files) { string[] Parts = t.ToString().Split('_'); //добавить ID очередного пользователя в список LstID.Add(Parts[1]); } try { SCon.Open(); string QueryGetUserName = $@"select ID, Lastname + ' '+Firstname + ' ' + Patronymic as FIO from Users where ID in ({string.Join(", ", LstID)}) "; SqlCommand Cmd = new SqlCommand(QueryGetUserName, SCon); SqlDataReader Res = Cmd.ExecuteReader(); if (Res.HasRows) { while (Res.Read()) { Keys[Res["ID"].ToString()] = Res["FIO"].ToString(); } } SCon.Close(); } catch { MessageBox.Show("В данный момент журнал пуст!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); SCon.Close(); return; } foreach (var t in Files) { CardJournal card = new CardJournal(); try { card.PbxImage.Image = Image.FromFile(Application.StartupPath + "\\Source\\log\\" + t); } catch { card.PbxImage.Image = Properties.Resources.Frame_1; } string[] Parts = t.ToString().Split('_'); string Name = ""; try { Name = Keys[Parts[1]]; } catch { Name = "Неизвестно"; } card.LblUserName.Text = Name; card.LblCheckTime.Text = $"{Parts[2].ToString().Substring(0, 2)}:{Parts[2].ToString().Substring(2, 2)}" + " " + Parts[3]; card.Click += Card_Click; card.LblUserName.Click += Card_ObjectClick; card.LblCheckTime.Click += Card_ObjectClick; card.PbxImage.Click += OpenFullView; card.label1.Click += Card_ObjectClick; card.label3.Click += Card_ObjectClick; TabCard.Controls.Add(card); if (TabCard.Controls.Count == 1) { CurrentCard = card; CurrentCard.BackColor = Color.FromArgb(195, 235, 120); } } } private void OpenFullView(object sender, EventArgs e) { FormViewPhoto Fv = new FormViewPhoto(); Fv.PbxImage.Image = (sender as PictureBox).Image; Fv.ShowDialog(); } private void Card_ObjectClick(object sender, EventArgs e) { CurrentCard.BackColor = Color.FromArgb(184, 184, 255); CurrentCard = (sender as Control).Parent as CardJournal; CurrentCard.BackColor = Color.FromArgb(195, 235, 120); } private void Card_Click(object sender, EventArgs e) { CurrentCard.BackColor = Color.FromArgb(184, 184, 255); CurrentCard = sender as CardJournal; CurrentCard.BackColor = Color.FromArgb(195, 235, 120); } private void CbxFilterDate_CheckedChanged(object sender, EventArgs e) { CmbSortDate.Enabled = CbxFilterDate.Checked; DtpFiniteDate.Enabled = CbxFilterDate.Checked; DtpDateStart.Enabled = CbxFilterDate.Checked; DtpDateEnd.Enabled = CbxFilterDate.Checked; GetJournalVisits(); } private void CbxIsAuthentification_CheckedChanged(object sender, EventArgs e) { GetJournalVisits(); } private void BtnEditSystemParameters_Click(object sender, EventArgs e) { SetApplicationParameter(); } /// /// задание параметров системы /// private void SetApplicationParameter() { ApplicationParameters application = new ApplicationParameters(); application.AutoRun = SwAutoRun.Checked; if (SwPositionWindow.Checked) { application.Points = this.Location; } if (!SwPositionWindow.Checked) { application.Points = new Point(-1, -1); } if (SwSaveSizeWindow.Checked) { application.Sizes = this.Size; } if (!SwSaveSizeWindow.Checked) { application.Sizes = new Size(-1, -1); } application.CountDay = int.Parse(NumCountDaySaveLogFiles.Value.ToString()); } private void BtnEditUserParameters_Click(object sender, EventArgs e) { if(TbxOldPass.Text.Trim() != GetOldPass(TbxLogin.Text.Trim())) { MessageBox.Show("Введённый пароль не совпадает со старым!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if(TbxNewPass.Text.Trim().Length < 4) { MessageBox.Show("Длина пароля должна быть не менее 4-х символов!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if(TbxNewPass.Text.Trim() != TbxConfirmNewPass.Text.Trim()) { MessageBox.Show("Подтвердите новый пароль и повторите попытку!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } ChangePassword(TbxNewPass.Text.Trim()); MessageBox.Show("Ваш пароль успешно изменён. Для продолжения работы с приложением необходима повторная авторизация.", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Information); Application.Restart(); } /// /// изменение пароля /// /// пароль в виде строки текста private void ChangePassword(string password) { SCon.Open(); string QueryChangePass = $@"update Staffs set [Password] = '{password}' where ID = '{LblAdminID.Text.Trim()}'"; SqlCommand Cmd = new SqlCommand(QueryChangePass, SCon); Cmd.ExecuteNonQuery(); SCon.Close(); } private string GetOldPass(string login) { string Pass = "**"; SCon.Open(); string QueryGetPass = $@"select [Password] from Staffs where [Login] = '{login}'"; SqlCommand Cmd = new SqlCommand(QueryGetPass, SCon); SqlDataReader Res = Cmd.ExecuteReader(); if(Res.HasRows) { Res.Read(); Pass = Res["Password"].ToString(); } SCon.Close(); return Pass; } private void TbxPasportSeria_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; if (char.IsDigit(e.KeyChar)) e.Handled = false; if (e.KeyChar == (char)Keys.Back) { e.Handled = false; } } private void TbxPasportSeria_Validated(object sender, EventArgs e) { if (TbxPasportSeria.Text.Trim().Length > 4) { TbxPasportSeria.Text = TbxPasportSeria.Text.Trim().Substring(0, 4); } } private void TbxPasportNum_Validated(object sender, EventArgs e) { if (TbxPasportNum.Text.Trim().Length > 6) { TbxPasportNum.Text = TbxPasportNum.Text.Trim().Substring(0, 6); } } private void TbxLogin_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; } private void SViewGuard_Click(object sender, EventArgs e) { LblTitleUserType.Text = "<Сотрудники охраны>"; ViewUserByType = 0; MMain_Click(sender, e); } private void SViewPlainUser_Click(object sender, EventArgs e) { LblTitleUserType.Text = "<Пользователи>"; ViewUserByType = 1; MMain_Click(sender, e); } private void MSettings_Click(object sender, EventArgs e) { } private void BtnExport_Click(object sender, EventArgs e) { ExportToExcel(); } /// /// экспорт информации о посещениях в Excel /// private void ExportToExcel() { Excel.Application App = new Excel.Application(); App.Visible = true; App.Workbooks.Open(Application.StartupPath + "\\Source\\Report.xlsx", Type.Missing, true); Excel.Worksheet List1 = App.Worksheets.get_Item(1); bool NoDetected = false; try { for (int i = 0; i < TabJournal.Controls.Count; i++) { NoDetected = false; TileOvals Tile = TabJournal.Controls[i] as TileOvals; List1.get_Range($"A{i + 4}").Value = i + 1; List1.get_Range($"B{i + 4}").Value = Tile.LblNameUser.Text.Trim(); List1.get_Range($"C{i + 4}").Value = Tile.LblTimeEntrance.Text.Trim(); if (Tile.LblTimeExit.Text.Trim() == string.Empty) { List1.get_Range($"D{i + 4}").Value = ""; NoDetected = true; } else { List1.get_Range($"D{i + 4}").Value = Tile.LblTimeExit.Text.Trim(); } List1.get_Range($"E{i + 4}").Value = Tile.LblDate.Text.Trim(); if (!NoDetected) { DateTime Tm1 = DateTime.Parse(Tile.LblTimeEntrance.Text.Trim()); DateTime Tm2 = DateTime.Parse(Tile.LblTimeExit.Text.Trim()); TimeSpan Dif = Tm2 - Tm1; DateTime TimeOnPlace = DateTime.Parse(Dif.ToString()); ; List1.get_Range($"F{i + 4}").Value = TimeOnPlace.ToString("HH часов mm минут").ToString(); } if (NoDetected) { List1.get_Range($"A{i + 4}:F{i + 4}").Interior.Color = Color.Red; } List1.get_Range($"A{i + 4}:F{i + 4}").Borders.LineStyle = Excel.XlLineStyle.xlContinuous; } } catch (Exception ex) { MessageBox.Show(ex.Message + " При создании отчёта в Microsoft Excel произошла неизвестная ошибка!", "ImpulseVision", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } } }