using DevExpress.Entity.Model.Metadata; using DevExpress.Internal; using DevExpress.XtraEditors.Mask; using Newtonsoft.Json; using Sunny.UI; using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using 口罩泄露定制款; using 口罩泄露定制款.Form; using static DevExpress.XtraPrinting.Export.Pdf.PdfSignature; namespace 口罩泄露测试仪控制系统_定制款.窗体 { public partial class frm_AddNewExperiment : UIForm { // 本底浓度采集列表 List benDiList = new List() { }; short index = 0; ExperData experData = new ExperData(); private const string MaskConfigFilePath = "MaskTypeConfig.json"; // 面罩类型配置文件路径 private const string ParticleConfigFilePath = "ParticleTypeConfig.json"; // 颗粒物类型配置文件路径 frm_Main main = new frm_Main(); private MaskTypeConfig maskTypeConfig; private ParticleTypeConfig particleTypeConfig; private ParticleThresholdConfig particleThresholdConfig; public frm_AddNewExperiment() { InitializeComponent(); InitComboTreeViewData(); InitComboTreeViewData2(); //uiRadioButtonGroup1.SelectedIndex = 0; //tb_benDi.Text = experData.BenDiNongDu.ToString("F3"); } public frm_AddNewExperiment(frm_Main mainForm) { InitializeComponent(); InitComboTreeViewData(); InitComboTreeViewData2(); //uiRadioButtonGroup1.SelectedIndex = 0; //tb_benDi.Text = experData.BenDiNongDu.ToString("F3"); main = mainForm; // 赋值主窗体引用 //tb_ShiYanBianHao.Text = IDGenerator.GenerateID(); //tb_benDi.Text = experData.BenDiNongDu.ToString("F3"); dp_ShiYanRiQi.Text = DateTime.Now.ToString("yyyy-MM-dd"); } private void frm_AddNewExperiment_Load(object sender, EventArgs e) { string maskType = cbb_面罩类型.Text; maskTypeConfig = new MaskTypeConfig(); // 初始化面罩配置 LoadMaskTypes(); // 加载面罩类型 particleTypeConfig = new ParticleTypeConfig(); // 初始化颗粒物配置 particleThresholdConfig = new ParticleThresholdConfig(); LoadParticleTypes(); // 加载颗粒物类型 LoadUserData(); if (maskType.Contains("KN90") || maskType.Contains("KP90")) { uiTextBox1.Text = "10.0"; uiTextBox1.Enabled = false; } else if (maskType.Contains("KN95") || maskType.Contains("KP95")) { uiTextBox1.Text = "8.0"; uiTextBox1.Enabled = false; } else if (maskType.Contains("KN100") || maskType.Contains("KP100")) { uiTextBox1.Text = "2.0"; uiTextBox1.Enabled = false; } else { uiTextBox1.Enabled = true; } uiComboBox1.Items.Add("篇一"); uiComboBox1.Items.Add("篇二"); uiComboBox1.Items.Add("篇三"); uiComboBox1.Items.Add("自定义"); } // 初始化树形下拉框的节点数据 private void InitComboTreeViewData() { cbb_面罩类型.Nodes.Clear(); // 预设面罩类型 TreeNode root1 = new TreeNode("随弃式面罩TIL"); root1.Nodes.Add(new TreeNode("KN90")); root1.Nodes.Add(new TreeNode("KN95")); root1.Nodes.Add(new TreeNode("KN100")); root1.Nodes.Add(new TreeNode("KP90")); root1.Nodes.Add(new TreeNode("KP95")); root1.Nodes.Add(new TreeNode("KP100")); TreeNode root2 = new TreeNode("可更换式半面罩IL"); root2.Nodes.Add(new TreeNode("硅胶半面罩")); root2.Nodes.Add(new TreeNode("橡胶半面罩")); root2.Nodes.Add(new TreeNode("其他材质半面罩")); TreeNode root3 = new TreeNode("全面罩IL"); root3.Nodes.Add(new TreeNode("防毒全面罩")); root3.Nodes.Add(new TreeNode("防尘全面罩")); TreeNode root4 = new TreeNode("自定义"); cbb_面罩类型.Nodes.Add(root1); cbb_面罩类型.Nodes.Add(root2); cbb_面罩类型.Nodes.Add(root3); cbb_面罩类型.Nodes.Add(root4); if (cbb_面罩类型.Nodes.Count > 0) { cbb_面罩类型.Nodes[0].Expand(); if (cbb_面罩类型.Nodes[0].Nodes.Count > 0) { cbb_面罩类型.SelectedNode = cbb_面罩类型.Nodes[0].Nodes[0]; } else { cbb_面罩类型.SelectedNode = cbb_面罩类型.Nodes[0]; } } } // 初始化树形下拉框的节点数据 private void InitComboTreeViewData2() { cbb_Yangpin.Nodes.Clear(); // 根节点:颗粒物 TreeNode root = new TreeNode("样品分类"); // NaCl TreeNode nodeNaCl = new TreeNode("NaCl"); nodeNaCl.Nodes.Add(new TreeNode("NaCl浓度")); nodeNaCl.Nodes.Add(new TreeNode("NaCl粒径")); // 油类 TreeNode nodeOil = new TreeNode("油类"); // 油类-DOP TreeNode nodeDOP = new TreeNode("DOP"); nodeDOP.Nodes.Add(new TreeNode("油类DOP浓度")); nodeDOP.Nodes.Add(new TreeNode("油类DOP粒径")); // 油类-自定义 TreeNode nodeOilCustom = new TreeNode("自定义"); nodeOilCustom.Nodes.Add(new TreeNode("油类自定义浓度")); nodeOilCustom.Nodes.Add(new TreeNode("油类自定义粒径")); nodeOil.Nodes.Add(nodeDOP); nodeOil.Nodes.Add(nodeOilCustom); // 顶层自定义 TreeNode nodeCustom = new TreeNode("自定义"); nodeCustom.Nodes.Add(new TreeNode("自定义浓度")); nodeCustom.Nodes.Add(new TreeNode("自定义粒径")); // 组装 root.Nodes.Add(nodeNaCl); root.Nodes.Add(nodeOil); root.Nodes.Add(nodeCustom); cbb_Yangpin.Nodes.Add(root); // 默认展开 root.Expand(); if (root.Nodes.Count > 0 && root.Nodes[0].Nodes.Count > 0) { cbb_Yangpin.SelectedNode = root.Nodes[0].Nodes[0]; } else { cbb_Yangpin.SelectedNode = root; } } private void LoadMaskTypes() { if (File.Exists(MaskConfigFilePath)) { string json = File.ReadAllText(MaskConfigFilePath); maskTypeConfig = JsonConvert.DeserializeObject(json); foreach (var maskType in maskTypeConfig.MaskTypes) { TreeNode customNode = new TreeNode(maskType); cbb_面罩类型.Nodes[3].Nodes.Add(customNode); // 添加到自定义节点 } } } private void LoadParticleTypes() { if (File.Exists(ParticleConfigFilePath)) { string json = File.ReadAllText(ParticleConfigFilePath); particleTypeConfig = JsonConvert.DeserializeObject(json); // 遍历树,找到所有自定义节点 List customNodes = new List(); FindAllCustomNodes(cbb_Yangpin.Nodes, customNodes); foreach (var customNode in customNodes) { foreach (var particleType in particleTypeConfig.ParticleTypes) { bool exists = false; foreach (TreeNode node in customNode.Nodes) { if (node.Text == particleType) { exists = true; break; } } if (!exists) { customNode.Nodes.Add(new TreeNode(particleType)); } } customNode.Expand(); } } } private void FindAllCustomNodes(TreeNodeCollection nodes, List result) { foreach (TreeNode node in nodes) { if (node.Text == "自定义") { result.Add(node); } if (node.Nodes.Count > 0) { FindAllCustomNodes(node.Nodes, result); } } } private void SaveMaskTypes() { if (maskTypeConfig != null) { string json = JsonConvert.SerializeObject(maskTypeConfig, Formatting.Indented); File.WriteAllText(MaskConfigFilePath, json); } } private void SaveParticleTypes() { if (particleTypeConfig != null) { string json = JsonConvert.SerializeObject(particleTypeConfig, Formatting.Indented); File.WriteAllText(ParticleConfigFilePath, json); } } private void btn_AddMaskType_Click(object sender, EventArgs e) { string newMaskType = uiTextBoxMaskType.Text.Trim(); if (!string.IsNullOrEmpty(newMaskType)) { TreeNode newNode = new TreeNode(newMaskType); cbb_面罩类型.Nodes[3].Nodes.Add(newNode); // 添加到自定义节点 maskTypeConfig.MaskTypes.Add(newMaskType); // 更新配置 SaveMaskTypes(); // 保存到文件 uiTextBoxMaskType.Clear(); // 清空输入框 MessageBox.Show("添加成功!"); } else { MessageBox.Show("请输入有效的面罩类型!"); } } private void btn_DeleteMaskType_Click(object sender, EventArgs e) { TreeNode selectedNode = cbb_面罩类型.SelectedNode; if (selectedNode != null && selectedNode.Parent != null && selectedNode.Parent.Index == 3) // 判断是否为自定义节点 { // 从树形控件中删除选中的节点 cbb_面罩类型.Nodes[3].Nodes.Remove(selectedNode); // 从配置中删除该面罩类型 maskTypeConfig.MaskTypes.Remove(selectedNode.Text); // 保存更新后的配置 SaveMaskTypes(); InitComboTreeViewData(); // 重新加载树形控件的数据 LoadMaskTypes(); MessageBox.Show("删除成功!"); } else { MessageBox.Show("请选择一个有效的自定义面罩类型进行删除!"); } } private void btn_AddParticleType_Click(object sender, EventArgs e) { string newParticleType = uiTextBoxParticleType.Text.Trim(); if (!string.IsNullOrEmpty(newParticleType)) { TreeNode selectedNode = cbb_Yangpin.SelectedNode; if (selectedNode == null) { MessageBox.Show("请先选择一个自定义节点!"); return; } TreeNode customNode = selectedNode; while (customNode != null && customNode.Text != "自定义") { customNode = customNode.Parent; } if (customNode != null && customNode.Text == "自定义") { TreeNode newNode = new TreeNode(newParticleType); customNode.Nodes.Add(newNode); customNode.Expand(); if (!particleTypeConfig.ParticleTypes.Contains(newParticleType)) particleTypeConfig.ParticleTypes.Add(newParticleType); SaveParticleTypes(); uiTextBoxParticleType.Clear(); MessageBox.Show("添加成功!"); } else { MessageBox.Show("请选择一个自定义节点进行添加!"); } } else { MessageBox.Show("请输入有效的颗粒物类型!"); } } private void btn_DeleteParticleType_Click(object sender, EventArgs e) { TreeNode selectedNode = cbb_Yangpin.SelectedNode; if (selectedNode != null && selectedNode.Parent != null && selectedNode.Parent.Text == "自定义") { // 从树形控件中删除选中的节点 selectedNode.Parent.Nodes.Remove(selectedNode); // 从配置中删除该颗粒物类型(如有需要可区分不同自定义节点,这里简单移除) particleTypeConfig.ParticleTypes.Remove(selectedNode.Text); // 保存更新后的配置 SaveParticleTypes(); InitComboTreeViewData2(); LoadParticleTypes(); MessageBox.Show("删除成功!"); } else { MessageBox.Show("请选择一个有效的自定义颗粒物类型进行删除!"); } } private void btn_Jiaozhun_Click(object sender, EventArgs e) { benDiList.Clear(); index = 0; btn_Jiaozhun.Text = "采集中"; lb_time.Visible = true; if (!timer_CaiJi.Enabled) { main.master?.WriteSingleCoil(1, 15, true); timer_CaiJi.Start(); } else MessageBox.Show("请先停止采集!"); } private void timer_CaiJi_Tick(object sender, EventArgs e) { benDiList.Add(experData.Mask_TSINongDu); index++; if (index >= 120) { float sumAll = 0; btn_Jiaozhun.Text = "校准本底浓度"; for (int i = 20; i < 120; i++) { sumAll += benDiList[i]; } float agv = sumAll / 100; tb_benDi.Text = agv.ToString("F3"); lb_time.Text = "采集完成"; main.master?.WriteSingleCoil(1, 15, false); timer_CaiJi.Stop(); } else { lb_time.Text = "采集中" + index.ToString(); } } private void btn_Save_Click(object sender, EventArgs e) { experData.ExperName = tb_shiYanYuan.Text; experData.ExperDate = dp_ShiYanRiQi.Text; experData.ExperNum = tb_ShiYanBianHao.Text; experData.BenDiNongDu = tb_benDi.Text.ToFloat(); experData.ExperType = cbb_Yangpin.Text; experData.MaskType = cbb_面罩类型.Text; experData.ExperMaskType = uiTextBox1.Text.ToFloat(); experData.BenDiNongDu = tb_benDi.Text.ToFloat(); //if (uiRadioButtonGroup1.SelectedIndex == 0) //{ // experData.YangPinXiShu = 1.0f; //} //else if (uiRadioButtonGroup1.SelectedIndex == 1) //{ // experData.YangPinXiShu = 1.7f; //} SaveUserData(); MessageBox.Show("保存成功!"); this.Close(); // 保存后调用主窗体的刷新方法 main.RefreshMainData(); // 新增的刷新方法 } Random rd = new Random(); private void timer1_Tick(object sender, EventArgs e) { experData.BenDiNongDu = rd.Next(); } private void uiComboTreeView_面罩类型_SelectedNodeChanged(object sender, TreeNode node) { TreeNode selectedNode = cbb_面罩类型.SelectedNode; if (selectedNode == null) return; TreeNode rootNode = selectedNode; while (rootNode.Parent != null) { rootNode = rootNode.Parent; } //if (maskType.Contains("KN90") || maskType.Contains("KP90")) //{ // return (13.0f, 10.0f); //} //else if (maskType.Contains("KN95") || maskType.Contains("KP95")) //{ // return (11.0f, 8.0f); //} //else if (maskType.Contains("KN100") || maskType.Contains("KP100")) //{ // return (5.0f, 2.0f); //} string maskType = selectedNode.Text; if (maskType.Contains("KN90") || maskType.Contains("KP90")) { uiTextBox1.Text = "10.0"; //uiLabel9.Visible = false; //uiTextBox1.Visible = false; //uiLabel7.Visible = false; uiTextBox1.Enabled = false; } else if (maskType.Contains("KN95") || maskType.Contains("KP95")) { uiTextBox1.Text = "8.0"; uiTextBox1.Enabled = false; } else if (maskType.Contains("KN100") || maskType.Contains("KP100")) { uiTextBox1.Text = "2.0"; uiTextBox1.Enabled = false; } else { uiTextBox1.Enabled = true; } } private const string UserDataFilePath = "UserData.json"; // JSON 文件路径 private void SaveUserData() { UserData userData; if (File.Exists(UserDataFilePath)) { string json = File.ReadAllText(UserDataFilePath); userData = JsonConvert.DeserializeObject(json) ?? new UserData(); } else { userData = new UserData(); } // 基本信息赋值 userData.High = highTxt.Text; userData.Weight = weightTxt.Text; userData.FaceWidth = faceWidthTxt.Text; userData.FaceLength = faceLongTxt.Text; userData.EyesDistance = eyesDistanceTxt.Text; userData.Customer = customerTxt.Text; userData.IsNeedRun = needrun_chk.Checked; userData.MaskType = cbb_面罩类型.Text; TreeNode selectedNode = cbb_面罩类型.SelectedNode; if (selectedNode != null) { userData.FullMaskType = selectedNode.Parent.Text + "-" + cbb_面罩类型.Text; } userData.Category = cbb_Yangpin.Text; userData.Threshold = uiTextBox1.Text; userData.Concentration = uiTextBox2.Text; userData.ParticleSize = uiTextBox3.Text; userData.ContentString = uiComboBox1.Text; userData.Name = uiTextBox9.Text; userData.Sex = uiTextBox7.Text; userData.Age = uiTextBox5.Text; userData.IdNumber = uiTextBox8.Text; userData.Company = uiTextBox6.Text; userData.CompanyAge = uiTextBox4.Text; userData.No = tb_ShiYanBianHao.Text; if (string.IsNullOrEmpty(tb_benDi.Text)) { userData.BenDiNongdu = 0; } else { userData.BenDiNongdu = float.Parse(tb_benDi.Text); } if (uiComboBox1.Text == "自定义") { userData.CustomScreenValue = uiRichTextBox1.Text; } else { userData.ScreenValue = uiRichTextBox1.Text; } string jsonOut = JsonConvert.SerializeObject(userData, Formatting.Indented); File.WriteAllText(UserDataFilePath, jsonOut); } private void LoadUserData() { if (File.Exists(UserDataFilePath)) { string json = File.ReadAllText(UserDataFilePath); var userData = JsonConvert.DeserializeObject(json); highTxt.Text = userData.High; weightTxt.Text = userData.Weight; faceWidthTxt.Text = userData.FaceWidth; faceLongTxt.Text = userData.FaceLength; eyesDistanceTxt.Text = userData.EyesDistance; customerTxt.Text = userData.Customer; needrun_chk.Checked = userData.IsNeedRun; cbb_面罩类型.Text = userData.MaskType; cbb_Yangpin.Text = userData.Category; uiTextBox1.Text = userData.Threshold; uiTextBox2.Text = userData.Concentration; uiTextBox3.Text = userData.ParticleSize; uiComboBox1.Text = userData.ContentString; uiRichTextBox1.Text = userData.ScreenValue; uiTextBox9.Text = userData.Name; uiTextBox7.Text = userData.Sex; uiTextBox5.Text = userData.Age; uiTextBox8.Text = userData.IdNumber; uiTextBox6.Text = userData.Company; uiTextBox4.Text = userData.CompanyAge; tb_benDi.Text = userData.BenDiNongdu.ToString("F3"); if (userData.ContentString == "自定义") { uiRichTextBox1.Text = userData.CustomScreenValue ?? ""; uiRichTextBox1.ReadOnly = false; } else { uiRichTextBox1.Text = userData.ScreenValue ?? ""; uiRichTextBox1.ReadOnly = true; } } string value = cbb_Yangpin.Text; if (value != null && value.Contains("浓度")) { uiLabel16.Visible = true; if (value.Contains("NaCl")) { uiLabel16.Text = "NaCl浓度"; } else if (value.Contains("油类")) { uiLabel16.Text = "油类浓度"; } else { uiLabel16.Text = "浓度"; } uiTextBox2.Visible = true; uiLabel14.Visible = true; //uiLabel19.Visible = true; //uiTextBox3.Visible = true; //uiLabel18.Visible = true; } else if (value.Contains("粒径")) { uiLabel16.Visible = true; if (value.Contains("NaCl")) { uiLabel16.Text = "盐类粒径"; } else if (value.Contains("油类")) { uiLabel16.Text = "油类粒径"; } else { uiLabel16.Text = "粒径"; } uiTextBox2.Visible = true; uiLabel14.Visible = true; //uiLabel19.Visible = false; //uiTextBox3.Visible = false; //uiLabel18.Visible = false; } else { uiLabel16.Visible = false; uiTextBox2.Visible = false; uiLabel14.Visible = false; } } private void cbb_Yangpin_NodeSelected(object sender, TreeNode node) { TreeNode selectedNode = cbb_Yangpin.SelectedNode; if (selectedNode == null) return; TreeNode rootNode = selectedNode; while (rootNode.Parent != null) { rootNode = rootNode.Parent; } string value = cbb_Yangpin.Text; if (value != null && (value.Contains("浓度"))) { if (value.Contains("NaCl")) { uiLabel16.Text = "NaCl浓度"; } else if (value.Contains("油类")) { uiLabel16.Text = "油类浓度"; } else { uiLabel16.Text = "浓度"; } uiLabel16.Visible = true; uiTextBox2.Visible = true; uiLabel14.Visible = true; //uiLabel19.Visible = true; //uiTextBox3.Visible = true; //uiLabel18.Visible = true; } else if (value.Contains("粒径")) { uiLabel16.Visible = true; if (value.Contains("NaCl")) { uiLabel16.Text = "盐类粒径"; } else if (value.Contains("油类")) { uiLabel16.Text = "油类粒径"; } else { uiLabel16.Text = "粒径"; } uiTextBox2.Visible = true; uiLabel14.Visible = true; //uiLabel19.Visible = false; //uiTextBox3.Visible = false; //uiLabel18.Visible = false; } else { uiLabel16.Visible = false; uiTextBox2.Visible = false; uiLabel14.Visible = false; } } private void uiLabel14_Click(object sender, EventArgs e) { } private void uiComboBox1_SelectedIndexChanged(object sender, EventArgs e) { string selectedItem = uiComboBox1.SelectedItem?.ToString(); if (selectedItem != "自定义") { if (particleThresholdConfig.predefinedContent.ContainsKey(selectedItem)) { uiRichTextBox1.Text = particleThresholdConfig.predefinedContent[selectedItem]; } else { uiRichTextBox1.Text = ""; } uiRichTextBox1.ReadOnly = true; } else { // 只加载自定义内容 if (File.Exists(UserDataFilePath)) { string json = File.ReadAllText(UserDataFilePath); var userData = JsonConvert.DeserializeObject(json); uiRichTextBox1.Text = userData?.CustomScreenValue ?? ""; } else { uiRichTextBox1.Text = ""; } uiRichTextBox1.ReadOnly = false; } } } public class UserData { /// /// 身高 /// public string High { get; set; } /// /// 体重 /// public string Weight { get; set; } /// /// 面宽 /// public string FaceWidth { get; set; } /// /// 面长 /// public string FaceLength { get; set; } /// /// 瞳距 /// public string EyesDistance { get; set; } /// /// 自定义 /// public string Customer { get; set; } /// /// 是否需要运行 /// public bool IsNeedRun { get; set; } /// 口罩类型 /// public string MaskType { get; set; } /// /// 样品分类 /// public string Category { get; set; } /// /// 泄露判定阈值 /// public string Threshold { get; set; } /// /// 浓度 /// public string Concentration { get; set; } /// /// 粒径 /// public string ParticleSize { get; set; } /// /// 朗读内容类型(篇一篇二等) /// public string ContentString { get; set; } /// /// 朗读内容文本 /// public string ScreenValue { get; set; } /// /// 朗读内容文本 /// public string CustomScreenValue { get; set; } public string Name { get; set; } public string Sex { get; set; } public string Age { get; set; } public string IdNumber { get; set; } public string Company { get; set; } public string CompanyAge { get; set; } public string No { get; set; } /// 口罩类型 /// public string FullMaskType { get; set; } public float BenDiNongdu { get; set; } } }