From 2d6dfbb7b840f9bacb06e1bb07f2178e3f9a02f5 Mon Sep 17 00:00:00 2001 From: wanggang <76527413@qq.com> Date: Wed, 26 Feb 2020 16:56:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Former-commit-id: 15dc8a8ba27b418e9ef26b3488cab72e49d764bc --- labs/CameraCard/CameraCard/CameraCard.csproj | 1 + labs/CameraCard/CameraCard/Data/GroupData.cs | 15 ++ labs/CameraCard/CameraCard/Data/Student.cs | 10 +- .../CameraCard/MainForm.Designer.cs | 252 ++++++++++++++++-- labs/CameraCard/CameraCard/MainForm.cs | 202 ++++++++++++++ labs/CameraCard/CameraCard/ProgressForm.cs | 4 +- .../WebApi/Controllers/TestController.cs | 28 +- labs/CameraCard/WebApi/Models/Student.cs | 6 +- 8 files changed, 494 insertions(+), 24 deletions(-) create mode 100644 labs/CameraCard/CameraCard/Data/GroupData.cs diff --git a/labs/CameraCard/CameraCard/CameraCard.csproj b/labs/CameraCard/CameraCard/CameraCard.csproj index 0b1658c8..4cd24eb8 100644 --- a/labs/CameraCard/CameraCard/CameraCard.csproj +++ b/labs/CameraCard/CameraCard/CameraCard.csproj @@ -80,6 +80,7 @@ + diff --git a/labs/CameraCard/CameraCard/Data/GroupData.cs b/labs/CameraCard/CameraCard/Data/GroupData.cs new file mode 100644 index 00000000..60edf889 --- /dev/null +++ b/labs/CameraCard/CameraCard/Data/GroupData.cs @@ -0,0 +1,15 @@ +namespace CameraCard.Data +{ + public class GroupData + { + public string Class { get; set; } + public int Total { get; set; } + public int HasImage { get; set; } + public int NotHasImage { get; set; } + public int HasUpload { get; set; } + public int NotHasUpload { get; set; } + public int IsImageChecked { get; set; } + public int IsNotImageChecked { get; set; } + public float Progress { get; set; } + } +} \ No newline at end of file diff --git a/labs/CameraCard/CameraCard/Data/Student.cs b/labs/CameraCard/CameraCard/Data/Student.cs index d96ccdbd..42aa8b51 100644 --- a/labs/CameraCard/CameraCard/Data/Student.cs +++ b/labs/CameraCard/CameraCard/Data/Student.cs @@ -3,9 +3,15 @@ public class Student : Entity { public string Name { get; set; } + public string Sex { get; set; } + public string Nation { get; set; } public string IdCardNo { get; set; } + public string Class { get; set; } + public string Number { get; set; } public string Image { get; set; } - public bool HasUploaded { get; set; } - public bool IsChecked { get; set; } + public bool HasImage { get; set; } + public bool IsImageChecked { get; set; } + public bool HasUpload { get; set; } + public bool HasIdCardChecked { get; set; } } } \ No newline at end of file diff --git a/labs/CameraCard/CameraCard/MainForm.Designer.cs b/labs/CameraCard/CameraCard/MainForm.Designer.cs index fc4a0e6f..a69b834f 100644 --- a/labs/CameraCard/CameraCard/MainForm.Designer.cs +++ b/labs/CameraCard/CameraCard/MainForm.Designer.cs @@ -29,8 +29,11 @@ private void InitializeComponent() { System.Windows.Forms.TabPage tab1; + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle(); this.idcGroupBox = new System.Windows.Forms.GroupBox(); - this.idCard = new CameraCard.IdCard(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.photo = new System.Windows.Forms.PictureBox(); this.shotBtn = new System.Windows.Forms.Button(); @@ -42,7 +45,7 @@ this.numberLabel = new System.Windows.Forms.Label(); this.nameValue = new System.Windows.Forms.TextBox(); this.nameLabel = new System.Windows.Forms.Label(); - this.classSecletor = new System.Windows.Forms.ComboBox(); + this.classSecletor1 = new System.Windows.Forms.ComboBox(); this.classLabel = new System.Windows.Forms.Label(); this.cameraSelector = new System.Windows.Forms.ComboBox(); this.cameraRender = new System.Windows.Forms.PictureBox(); @@ -59,6 +62,21 @@ this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.versionLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.dataGrid = new System.Windows.Forms.DataGridView(); + this.groupGrid = new System.Windows.Forms.DataGridView(); + this.classSelector = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numberInput = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.nameInput = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.totalValue = new System.Windows.Forms.Label(); + this.pageSizeSelector = new System.Windows.Forms.ComboBox(); + this.idCard = new CameraCard.IdCard(); + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.pageIndexSelector = new System.Windows.Forms.ComboBox(); tab1 = new System.Windows.Forms.TabPage(); tab1.SuspendLayout(); this.idcGroupBox.SuspendLayout(); @@ -67,10 +85,14 @@ this.panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.cameraRender)).BeginInit(); this.tabControl1.SuspendLayout(); + this.tab2.SuspendLayout(); + this.tab3.SuspendLayout(); this.tab4.SuspendLayout(); this.tabControl2.SuspendLayout(); this.tabPage1.SuspendLayout(); this.statusStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGrid)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.groupGrid)).BeginInit(); this.SuspendLayout(); // // tab1 @@ -102,13 +124,6 @@ this.idcGroupBox.TabStop = false; this.idcGroupBox.Text = "身份证"; // - // idCard - // - this.idCard.Location = new System.Drawing.Point(-1, 16); - this.idCard.Name = "idCard"; - this.idCard.Size = new System.Drawing.Size(420, 200); - this.idCard.TabIndex = 8; - // // groupBox1 // this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) @@ -164,7 +179,7 @@ this.panel1.Controls.Add(this.numberLabel); this.panel1.Controls.Add(this.nameValue); this.panel1.Controls.Add(this.nameLabel); - this.panel1.Controls.Add(this.classSecletor); + this.panel1.Controls.Add(this.classSecletor1); this.panel1.Controls.Add(this.classLabel); this.panel1.Location = new System.Drawing.Point(7, 6); this.panel1.Name = "panel1"; @@ -221,13 +236,13 @@ this.nameLabel.TabIndex = 2; this.nameLabel.Text = "姓名:"; // - // classSecletor + // classSecletor1 // - this.classSecletor.FormattingEnabled = true; - this.classSecletor.Location = new System.Drawing.Point(55, 44); - this.classSecletor.Name = "classSecletor"; - this.classSecletor.Size = new System.Drawing.Size(100, 20); - this.classSecletor.TabIndex = 1; + this.classSecletor1.FormattingEnabled = true; + this.classSecletor1.Location = new System.Drawing.Point(55, 44); + this.classSecletor1.Name = "classSecletor1"; + this.classSecletor1.Size = new System.Drawing.Size(100, 20); + this.classSecletor1.TabIndex = 1; // // classLabel // @@ -273,9 +288,11 @@ this.tabControl1.Size = new System.Drawing.Size(1008, 729); this.tabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; this.tabControl1.TabIndex = 2; + this.tabControl1.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControl1_Selected); // // tab2 // + this.tab2.Controls.Add(this.groupGrid); this.tab2.Location = new System.Drawing.Point(4, 22); this.tab2.Name = "tab2"; this.tab2.Padding = new System.Windows.Forms.Padding(3); @@ -286,6 +303,19 @@ // // tab3 // + this.tab3.Controls.Add(this.pageIndexSelector); + this.tab3.Controls.Add(this.flowLayoutPanel1); + this.tab3.Controls.Add(this.pageSizeSelector); + this.tab3.Controls.Add(this.totalValue); + this.tab3.Controls.Add(this.label4); + this.tab3.Controls.Add(this.button1); + this.tab3.Controls.Add(this.nameInput); + this.tab3.Controls.Add(this.label3); + this.tab3.Controls.Add(this.numberInput); + this.tab3.Controls.Add(this.label2); + this.tab3.Controls.Add(this.label1); + this.tab3.Controls.Add(this.classSelector); + this.tab3.Controls.Add(this.dataGrid); this.tab3.Location = new System.Drawing.Point(4, 22); this.tab3.Name = "tab3"; this.tab3.Padding = new System.Windows.Forms.Padding(3); @@ -395,6 +425,175 @@ this.versionLabel.Size = new System.Drawing.Size(14, 17); this.versionLabel.Text = "v"; // + // dataGrid + // + this.dataGrid.AllowUserToAddRows = false; + this.dataGrid.AllowUserToDeleteRows = false; + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle5.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGrid.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle5; + this.dataGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle6.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle6.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle6.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGrid.DefaultCellStyle = dataGridViewCellStyle6; + this.dataGrid.Location = new System.Drawing.Point(-4, 53); + this.dataGrid.Name = "dataGrid"; + this.dataGrid.ReadOnly = true; + this.dataGrid.RowTemplate.Height = 23; + this.dataGrid.Size = new System.Drawing.Size(1008, 583); + this.dataGrid.TabIndex = 0; + this.dataGrid.VirtualMode = true; + // + // groupGrid + // + this.groupGrid.AllowUserToAddRows = false; + this.groupGrid.AllowUserToDeleteRows = false; + this.groupGrid.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle7.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle7.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle7.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle7.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.groupGrid.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7; + this.groupGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle8.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle8.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle8.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle8.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.groupGrid.DefaultCellStyle = dataGridViewCellStyle8; + this.groupGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupGrid.Location = new System.Drawing.Point(3, 3); + this.groupGrid.Name = "groupGrid"; + this.groupGrid.ReadOnly = true; + this.groupGrid.RowTemplate.Height = 23; + this.groupGrid.Size = new System.Drawing.Size(994, 697); + this.groupGrid.TabIndex = 0; + // + // classSelector + // + this.classSelector.DisplayMember = "Class"; + this.classSelector.FormattingEnabled = true; + this.classSelector.Location = new System.Drawing.Point(56, 21); + this.classSelector.Name = "classSelector"; + this.classSelector.Size = new System.Drawing.Size(121, 20); + this.classSelector.TabIndex = 1; + this.classSelector.ValueMember = "Class"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 24); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(41, 12); + this.label1.TabIndex = 2; + this.label1.Text = "班级:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(200, 24); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 12); + this.label2.TabIndex = 3; + this.label2.Text = "考籍号:"; + // + // numberInput + // + this.numberInput.Location = new System.Drawing.Point(252, 21); + this.numberInput.Name = "numberInput"; + this.numberInput.Size = new System.Drawing.Size(120, 21); + this.numberInput.TabIndex = 4; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(398, 24); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(41, 12); + this.label3.TabIndex = 5; + this.label3.Text = "姓名:"; + // + // nameInput + // + this.nameInput.Location = new System.Drawing.Point(457, 20); + this.nameInput.Name = "nameInput"; + this.nameInput.Size = new System.Drawing.Size(120, 21); + this.nameInput.TabIndex = 6; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(730, 18); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 7; + this.button1.Text = "检索"; + this.button1.UseVisualStyleBackColor = true; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(8, 659); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(29, 12); + this.label4.TabIndex = 8; + this.label4.Text = "共:"; + // + // totalValue + // + this.totalValue.AutoSize = true; + this.totalValue.Location = new System.Drawing.Point(43, 659); + this.totalValue.Name = "totalValue"; + this.totalValue.Size = new System.Drawing.Size(11, 12); + this.totalValue.TabIndex = 9; + this.totalValue.Text = "0"; + // + // pageSizeSelector + // + this.pageSizeSelector.DisplayMember = "Text"; + this.pageSizeSelector.FormattingEnabled = true; + this.pageSizeSelector.Location = new System.Drawing.Point(82, 655); + this.pageSizeSelector.Name = "pageSizeSelector"; + this.pageSizeSelector.Size = new System.Drawing.Size(74, 20); + this.pageSizeSelector.TabIndex = 10; + this.pageSizeSelector.ValueMember = "Value"; + // + // idCard + // + this.idCard.Location = new System.Drawing.Point(-1, 16); + this.idCard.Name = "idCard"; + this.idCard.Size = new System.Drawing.Size(420, 200); + this.idCard.TabIndex = 8; + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.Location = new System.Drawing.Point(177, 642); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(689, 40); + this.flowLayoutPanel1.TabIndex = 11; + // + // pageIndexSelector + // + this.pageIndexSelector.FormattingEnabled = true; + this.pageIndexSelector.Location = new System.Drawing.Point(883, 655); + this.pageIndexSelector.Name = "pageIndexSelector"; + this.pageIndexSelector.Size = new System.Drawing.Size(99, 20); + this.pageIndexSelector.TabIndex = 12; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); @@ -418,11 +617,16 @@ this.panel1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.cameraRender)).EndInit(); this.tabControl1.ResumeLayout(false); + this.tab2.ResumeLayout(false); + this.tab3.ResumeLayout(false); + this.tab3.PerformLayout(); this.tab4.ResumeLayout(false); this.tabControl2.ResumeLayout(false); this.tabPage1.ResumeLayout(false); this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGrid)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.groupGrid)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -440,7 +644,7 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TextBox nameValue; private System.Windows.Forms.Label nameLabel; - private System.Windows.Forms.ComboBox classSecletor; + private System.Windows.Forms.ComboBox classSecletor1; private System.Windows.Forms.Label classLabel; private System.Windows.Forms.Button shotBtn; private System.Windows.Forms.RichTextBox log; @@ -460,5 +664,19 @@ private System.Windows.Forms.ToolStripStatusLabel versionLabel; private System.Windows.Forms.ToolStripStatusLabel statusLabel; private IdCard idCard; + private System.Windows.Forms.DataGridView dataGrid; + private System.Windows.Forms.DataGridView groupGrid; + private System.Windows.Forms.ComboBox classSelector; + private System.Windows.Forms.TextBox nameInput; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox numberInput; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox pageSizeSelector; + private System.Windows.Forms.Label totalValue; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ComboBox pageIndexSelector; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; } } \ No newline at end of file diff --git a/labs/CameraCard/CameraCard/MainForm.cs b/labs/CameraCard/CameraCard/MainForm.cs index 43d8d3d1..c64bb023 100644 --- a/labs/CameraCard/CameraCard/MainForm.cs +++ b/labs/CameraCard/CameraCard/MainForm.cs @@ -1,7 +1,9 @@ using CameraCard.Data; using Mapster; using System; +using System.Collections.Generic; using System.Configuration; +using System.Data; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; @@ -10,6 +12,7 @@ using System.Linq; using System.Net.Http; using System.Reflection; using System.Text; +using System.Threading.Tasks; using System.Web.Script.Serialization; using System.Windows.Forms; @@ -26,6 +29,30 @@ namespace CameraCard InitializeComponent(); this.versionLabel.Alignment = ToolStripItemAlignment.Right; this.versionLabel.Text += Assembly.GetExecutingAssembly().GetName().Version.ToString(); + //var dataTable = new DataTable(); + //var student = new Student(); + //dataTable.Columns.Add("Id", typeof(string)); + //dataTable.Columns.Add("姓名", typeof(string)); + //dataTable.Columns.Add("性别", typeof(string)); + //dataTable.Columns.Add("民族", typeof(string)); + //dataTable.Columns.Add("身份证号", typeof(string)); + //dataTable.Columns.Add("班级", typeof(string)); + //dataTable.Columns.Add("考籍号", typeof(string)); + //dataTable.Columns.Add("图像", typeof(Image)); + //dataTable.Columns.Add("身份证验证", typeof(bool)); + //dataTable.Columns.Add("已采集", typeof(bool)); + //dataTable.Columns.Add("已上传", typeof(bool)); + //for (int i = 0; i < 20000; i++) + //{ + // var imageValue = "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"; + + // using (var ms = new MemoryStream(Convert.FromBase64String(imageValue))) + // { + // var image = Image.FromStream(ms); + // dataTable.Rows.Add(i.ToString(), i.ToString(), student.Sex, student.Nation, student.IdCardNo, student.Class, student.Number, image, student.HasIdCardChecked, student.HasImage, student.HasUploaded); + // } + //} + //this.grid.DataSource = dataTable; } private void MainFrom_Load(object sender, EventArgs e) @@ -131,6 +158,7 @@ namespace CameraCard private int _photoHeight; private Rectangle _rect; private Pen _pen; + private ProgressForm _progress; public static User User { get; set; } @@ -293,5 +321,179 @@ namespace CameraCard { Application.Exit(); } + + private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + //if (grid.Columns[e.ColumnIndex].Name.Equals("图像")) + //{ + // if (e.Value != null) + // { + // using (var ms = new MemoryStream(Convert.FromBase64String(e.Value as string))) + // { + // e.Value = Image.FromStream(ms); + // } + // } + //} + } + + private void tabControl1_Selected(object sender, TabControlEventArgs e) + { + if (e.TabPage.Text == "采集进度") + { + RefreshGroup(); + } + else if (e.TabPage.Text == "图像管理") + { + RefreshData(); + } + } + + private void RefreshGroup() + { + this._progress = new ProgressForm("加载中", "正在统计,请稍候", 0, 100, 320, null, false); + Task.Run(() => + { + this.Invoke(new Action(() => + { + using (var db = new MyDbContext()) + { + this._progress.SetProgress("开始统计数据", 0); + var list = db.Students.GroupBy(o => o.Class, (k, g) => new GroupData + { + Class = k, + Total = g.Count(), + HasImage = g.Sum(c => c.HasImage ? 1 : 0), + NotHasImage = g.Sum(c => c.HasImage ? 0 : 1), + HasUpload = g.Sum(c => c.HasUpload ? 1 : 0), + NotHasUpload = g.Sum(c => c.HasUpload ? 0 : 1), + IsImageChecked = g.Sum(c => c.IsImageChecked ? 1 : 0), + IsNotImageChecked = g.Sum(c => c.IsImageChecked ? 0 : 1), + Progress = g.Sum(c => c.IsImageChecked ? 1 : 0) / (g.Count() * 1.0f) + }) + .OrderBy(o => o.Class) + .ToList(); + this._progress.SetProgress("开始合计数据", 30); + var total = new GroupData + { + Class = "合计", + Total = list.Sum(o => o.Total), + HasImage = list.Sum(o => o.HasImage), + NotHasImage = list.Sum(o => o.NotHasImage), + HasUpload = list.Sum(o => o.HasUpload), + NotHasUpload = list.Sum(o => o.NotHasUpload), + IsImageChecked = list.Sum(o => o.IsImageChecked), + IsNotImageChecked = list.Sum(o => o.IsNotImageChecked), + Progress = list.Sum(o => o.IsImageChecked) / (list.Sum(o => o.Total) * 1.0f) + }; + list.Insert(0, total); + groupGrid.DataSource = list; + this._progress.SetProgress("开始设置表头", 60); + var headers = new string[] { "班级", "总人数", "已采集", "未采集", "已上传", "未上传", "合格通过", "不合格", "完成进度" }; + for (int i = 0; i < headers.Length; i++) + { + groupGrid.Columns[i].HeaderText = headers[i]; + if (headers[i] == "完成进度") + { + groupGrid.Columns[i].DefaultCellStyle.Format = "P0"; + } + } + this._progress.SetProgress("加载完毕", 100); + } + })); + this._progress.CloseProgress(); + }); + this._progress.ShowDialog(); + } + + private void RefreshData() + { + this._progress = new ProgressForm("加载中", "正在读取,请稍候", 0, 100, 320, null, false); + Task.Run(() => + { + this.Invoke(new Action(() => + { + using (var db = new MyDbContext()) + { + this._progress.SetProgress("开始读取数据", 0); + //pagesize + this.pageSizeSelector.DataSource = new List { + new { Value=20,Text="20条/页"}, + new { Value=50,Text="50条/页"}, + new { Value=100,Text="100条/页"} + }; + //class + var classList = db.Students.Select(o => new { o.Class }).Distinct().OrderBy(o => o.Class).ToList(); + classList.Insert(0, new { Class = "全部班级" }); + this.classSelector.DataSource = classList; + //this.classSelector.SelectedIndex = 0; + // + this.Search(db); + var headers = new string[] { "姓名", "性别", "民族", "身份证号", "班级", "考籍号", "相片", "已采集", "相片已审核", "已上传", "身份证已验证" }; + for (int i = 0; i < headers.Length; i++) + { + dataGrid.Columns[i].HeaderText = headers[i]; + //if (headers[i] == "Id") + //{ + // groupGrid.Columns[i].Visible = false; + //} + } + //var list = db.Students.GroupBy(o => o.Class, (k, g) => new GroupData + //{ + // Class = k, + // Total = g.Count(), + // HasImage = g.Sum(c => c.HasImage ? 1 : 0), + // NotHasImage = g.Sum(c => c.HasImage ? 0 : 1), + // HasUpload = g.Sum(c => c.HasUpload ? 1 : 0), + // NotHasUpload = g.Sum(c => c.HasUpload ? 0 : 1), + // IsImageChecked = g.Sum(c => c.IsImageChecked ? 1 : 0), + // IsNotImageChecked = g.Sum(c => c.IsImageChecked ? 0 : 1), + // Progress = g.Sum(c => c.IsImageChecked ? 1 : 0) / (g.Count() * 1.0f) + //}) + //.OrderBy(o => o.Class) + //.ToList(); + //this._progress.SetProgress("开始合计数据", 30); + //var total = new GroupData + //{ + // Class = "合计", + // Total = list.Sum(o => o.Total), + // HasImage = list.Sum(o => o.HasImage), + // NotHasImage = list.Sum(o => o.NotHasImage), + // HasUpload = list.Sum(o => o.HasUpload), + // NotHasUpload = list.Sum(o => o.NotHasUpload), + // IsImageChecked = list.Sum(o => o.IsImageChecked), + // IsNotImageChecked = list.Sum(o => o.IsNotImageChecked), + // Progress = list.Sum(o => o.IsImageChecked) / (list.Sum(o => o.Total) * 1.0f) + //}; + //list.Insert(0, total); + //groupGrid.DataSource = list; + //this._progress.SetProgress("开始设置表头", 60); + //var headers = new string[] { "班级", "总人数", "已采集", "未采集", "已上传", "未上传", "合格通过", "不合格", "完成进度" }; + //for (int i = 0; i < headers.Length; i++) + //{ + // groupGrid.Columns[i].HeaderText = headers[i]; + // if (headers[i] == "完成进度") + // { + // groupGrid.Columns[i].DefaultCellStyle.Format = "P0"; + // } + //} + this._progress.SetProgress("加载完毕", 100); + } + this._progress.CloseProgress(); + })); + }); + this._progress.ShowDialog(); + } + + private void Search(MyDbContext db) + { + var query = db.Set().AsQueryable(); + var className = this.classSelector.SelectedValue as string; + if (!string.IsNullOrEmpty(className) && className != "全部班级") + { + query = query.Where(o => o.Class == className); + } + this.totalValue.Text = query.Count().ToString(); + this.dataGrid.DataSource = query.ToList(); + } } } \ No newline at end of file diff --git a/labs/CameraCard/CameraCard/ProgressForm.cs b/labs/CameraCard/CameraCard/ProgressForm.cs index ee3f3c3c..e68712ad 100644 --- a/labs/CameraCard/CameraCard/ProgressForm.cs +++ b/labs/CameraCard/CameraCard/ProgressForm.cs @@ -7,7 +7,7 @@ namespace CameraCard { private readonly Action _closed; - public ProgressForm(string title, string status, int min, int max, int width = 0, Action action = null) + public ProgressForm(string title, string status, int min, int max, int width = 0, Action action = null, bool control = true) { InitializeComponent(); this.Width = width == 0 ? this.Width : width; @@ -16,7 +16,7 @@ namespace CameraCard this.progressBar.Minimum = min; this.progressBar.Maximum = max; this._closed = action; - //this.ControlBox = this._closed != null; + this.ControlBox = control; this.FormClosed += ProgressForm_FormClosed; } diff --git a/labs/CameraCard/WebApi/Controllers/TestController.cs b/labs/CameraCard/WebApi/Controllers/TestController.cs index a3a63155..5c81602a 100644 --- a/labs/CameraCard/WebApi/Controllers/TestController.cs +++ b/labs/CameraCard/WebApi/Controllers/TestController.cs @@ -41,7 +41,33 @@ namespace WebApi.Controllers { Code = 0, Data = new List { - new Student{ Id=Guid.NewGuid().ToString(),Name="小明"} + new Student{ + Id=Guid.NewGuid().ToString(), + Name="小明", + Class="1班", + Sex="男", + Nation="汉", + IdCardNo="012345678912345678", + Number="012345678912345678" + }, + new Student{ + Id=Guid.NewGuid().ToString(), + Name="小红", + Class="1班", + Sex="女", + Nation="汉", + IdCardNo="112345678912345678", + Number="012345678912345678" + }, + new Student{ + Id=Guid.NewGuid().ToString(), + Name="小丽", + Class="2班", + Sex="女", + Nation="汉", + IdCardNo="112345678912345678", + Number="012345678912345678" + } } }; } diff --git a/labs/CameraCard/WebApi/Models/Student.cs b/labs/CameraCard/WebApi/Models/Student.cs index 850cb70e..c032d62f 100644 --- a/labs/CameraCard/WebApi/Models/Student.cs +++ b/labs/CameraCard/WebApi/Models/Student.cs @@ -4,9 +4,11 @@ { public string Id { get; set; } public string Name { get; set; } + public string Sex { get; set; } + public string Nation { get; set; } public string IdCardNo { get; set; } + public string Class { get; set; } + public string Number { get; set; } public string Image { get; set; } - public bool HasUploaded { get; set; } - public bool IsChecked { get; set; } } } \ No newline at end of file