From 5a7f68bf4dbbdca1abbb939bd43e1fb695bc7c0b Mon Sep 17 00:00:00 2001
From: lu <123456>
Date: 星期六, 23 八月 2025 15:39:04 +0800
Subject: [PATCH] 数据过滤

---
 DevApp/Gs.WeightLine/Form1.cs                           |  356 +++++
 DevApp/Gs.WeightLine/Properties/AssemblyInfo.cs         |   32 
 DevApp/Gs.WeightLine/UcLookWorkline.resx                |  120 +
 DevApp/Gs.WeightLine/packages.config                    |    6 
 DevApp/Gs.WeightIqc/Form1.resx                          |  120 +
 DevApp/Gs.WeightIqc/Properties/AssemblyInfo.cs          |   33 
 DevApp/Gs.WeightLine/ToolBox/LogHelper.cs               |   53 
 DevApp/Gs.WeightLine/App.config                         |   26 
 DevApp/Gs.WeightLine/Form1.Designer.cs                  |  563 +++++++++
 DevApp/Gs.WeightLine/ToolBox/PageQueryModel.cs          |   73 +
 DevApp/Gs.DevApp/DevFrm/Warehouse/Frm_ArrivalBarcode.cs |    6 
 DevApp/Gs.WeightIqc/Properties/Settings.Designer.cs     |   30 
 DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl.cs            |    6 
 DevApp/Gs.WeightLine/Form1.resx                         |  120 +
 DevApp/GsDevSolution.sln                                |   12 
 DevApp/Gs.WeightLine/Program.cs                         |   24 
 DevApp/Gs.WeightLine/ToolBox/ReturnModel.cs             |   64 +
 DevApp/Gs.WeightLine/Properties/Settings.settings       |    7 
 DevApp/Gs.WeightIqc/Form1.cs                            |  275 ++++
 DevApp/Gs.DevApp/XtraForm2.resx                         |  120 +
 DevApp/Gs.DevApp/XtraForm2.cs                           |   21 
 DevApp/Gs.WeightIqc/Form1.Designer.cs                   |  199 +++
 DevApp/Gs.WeightIqc/ToolBox/ReturnModel.cs              |   61 
 DevApp/Gs.WeightIqc/Properties/Resources.Designer.cs    |   71 +
 DevApp/Gs.WeightIqc/App.config                          |   11 
 DevApp/Gs.WeightIqc/packages.config                     |    6 
 DevApp/Gs.WeightIqc/Properties/Settings.settings        |    7 
 DevApp/Gs.WeightLine/UcLookWorkline.cs                  |   99 +
 DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrk.cs           |    6 
 DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl_RK.cs         |    6 
 DevApp/Gs.WeightLine/Properties/licenses.licx           |    2 
 DevApp/Gs.WeightIqc/ToolBox/LogHelper.cs                |   53 
 DevApp/Gs.WeightLine/UcLookWorkline.Designer.cs         |  121 +
 DevApp/Gs.DevApp/XtraForm2.Designer.cs                  |  107 +
 DevApp/Gs.WeightIqc/Gs.WeightIqc.csproj                 |   97 +
 DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemIns.cs         |    6 
 DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrkDj.cs         |    6 
 DevApp/Gs.WeightIqc/Properties/Resources.resx           |  117 +
 DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemArn.cs         |    6 
 DevApp/Gs.WeightIqc/ToolBox/UtilityHelper.cs            |  104 +
 DevApp/Gs.WeightLine/Gs.WeightLine.csproj               |  122 +
 DevApp/Gs.WeightLine/Properties/Settings.Designer.cs    |   30 
 DevApp/Gs.WeightIqc/Program.cs                          |   22 
 DevApp/Gs.WeightLine/Properties/Resources.resx          |  117 +
 DevApp/Gs.WeightLine/ToolBox/UtilityHelper.cs           |  151 ++
 DevApp/Gs.WeightLine/Properties/Resources.Designer.cs   |   71 +
 46 files changed, 3,658 insertions(+), 7 deletions(-)

diff --git a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemArn.cs b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemArn.cs
index 8ee8dbf..24aeadc 100644
--- a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemArn.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemArn.cs
@@ -437,7 +437,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null; var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.ReceiveOrgId in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             var pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "create_date",
                 "asc", "", _sbSqlWhere.ToString());
             var json = JsonConvert.SerializeObject(pgq);
diff --git a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemIns.cs b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemIns.cs
index 216d718..b94876f 100644
--- a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemIns.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesInvItemIns.cs
@@ -144,7 +144,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null;var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.receiveOrgId in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             PageQueryModel pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "create_date", "asc", "", _sbSqlWhere.ToString());
             string json = JsonConvert.SerializeObject(pgq);
             try
diff --git a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrk.cs b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrk.cs
index a472296..095e293 100644
--- a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrk.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrk.cs
@@ -503,7 +503,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null; var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.qt022 in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             PageQueryModel pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "qt001", "asc", "", _sbSqlWhere.ToString());
             string json = JsonConvert.SerializeObject(pgq);
             try
diff --git a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrkDj.cs b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrkDj.cs
index c1f9da0..aca9861 100644
--- a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrkDj.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemQtrkDj.cs
@@ -143,7 +143,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null;var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.receiveOrgId in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             PageQueryModel pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "create_date", "asc", "", _sbSqlWhere.ToString());
             string json = JsonConvert.SerializeObject(pgq);
             try
diff --git a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl.cs b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl.cs
index 2116979..d938a71 100644
--- a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl.cs
@@ -531,7 +531,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null; var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.tbl023 in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             PageQueryModel pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "create_date", "asc", "", _sbSqlWhere.ToString());
             string json = JsonConvert.SerializeObject(pgq);
             try
diff --git a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl_RK.cs b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl_RK.cs
index d604f42..0c99202 100644
--- a/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl_RK.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Rk/Frm_MesItemTbl_RK.cs
@@ -142,7 +142,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null;var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.receiveOrgId in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             PageQueryModel pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "create_date", "asc", "", _sbSqlWhere.ToString());
             string json = JsonConvert.SerializeObject(pgq);
             try
diff --git a/DevApp/Gs.DevApp/DevFrm/Warehouse/Frm_ArrivalBarcode.cs b/DevApp/Gs.DevApp/DevFrm/Warehouse/Frm_ArrivalBarcode.cs
index 021522d..db352f3 100644
--- a/DevApp/Gs.DevApp/DevFrm/Warehouse/Frm_ArrivalBarcode.cs
+++ b/DevApp/Gs.DevApp/DevFrm/Warehouse/Frm_ArrivalBarcode.cs
@@ -218,7 +218,11 @@
         /// <param name="pageSize">姣忛〉鍑犳潯</param>
         private void getPageList(int curPage)
         {
-            gcMain1.DataSource = null; var _sbSqlWhere = UtilityHelper.GetSearchWhere(_filterList);
+            gcMain1.DataSource = null;
+            System.Text.StringBuilder _sbSqlWhere = new System.Text.StringBuilder();
+            _sbSqlWhere.Append(" and a.ReceiveOrgId in");
+            _sbSqlWhere.Append(ToolBox.UtilityHelper.GetOrgWhere());
+            _sbSqlWhere.Append(UtilityHelper.GetSearchWhere(_filterList));
             var pgq = new PageQueryModel(curPage, this.pageBar1.RowsCount, "create_date",
                 "asc", "", _sbSqlWhere.ToString());
             var json = JsonConvert.SerializeObject(pgq);
diff --git a/DevApp/Gs.DevApp/XtraForm2.Designer.cs b/DevApp/Gs.DevApp/XtraForm2.Designer.cs
new file mode 100644
index 0000000..7138c37
--- /dev/null
+++ b/DevApp/Gs.DevApp/XtraForm2.Designer.cs
@@ -0,0 +1,107 @@
+锘縩amespace Gs.DevApp
+{
+    partial class XtraForm2
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.accordionControl1 = new DevExpress.XtraBars.Navigation.AccordionControl();
+            this.accordionControlElement1 = new DevExpress.XtraBars.Navigation.AccordionControlElement();
+            this.accordionControlElement2 = new DevExpress.XtraBars.Navigation.AccordionControlElement();
+            this.accordionControlElement3 = new DevExpress.XtraBars.Navigation.AccordionControlElement();
+            this.accordionControlElement4 = new DevExpress.XtraBars.Navigation.AccordionControlElement();
+            ((System.ComponentModel.ISupportInitialize)(this.accordionControl1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // accordionControl1
+            // 
+            this.accordionControl1.AllowSmoothScrolling = false;
+            this.accordionControl1.Elements.AddRange(new DevExpress.XtraBars.Navigation.AccordionControlElement[] {
+            this.accordionControlElement1});
+            this.accordionControl1.Location = new System.Drawing.Point(115, 62);
+            this.accordionControl1.Name = "accordionControl1";
+            this.accordionControl1.ScrollBarMode = DevExpress.XtraBars.Navigation.ScrollBarMode.Hidden;
+            this.accordionControl1.Size = new System.Drawing.Size(247, 255);
+            this.accordionControl1.TabIndex = 0;
+            // 
+            // accordionControlElement1
+            // 
+            this.accordionControlElement1.Appearance.Normal.Font = new System.Drawing.Font("Tahoma", 20F);
+            this.accordionControlElement1.Appearance.Normal.Options.UseFont = true;
+            this.accordionControlElement1.Elements.AddRange(new DevExpress.XtraBars.Navigation.AccordionControlElement[] {
+            this.accordionControlElement2,
+            this.accordionControlElement3,
+            this.accordionControlElement4});
+            this.accordionControlElement1.Expanded = true;
+            this.accordionControlElement1.Name = "accordionControlElement1";
+            this.accordionControlElement1.Text = "瀹℃牳宸插畬鎴�";
+            // 
+            // accordionControlElement2
+            // 
+            this.accordionControlElement2.Appearance.Normal.Font = new System.Drawing.Font("Tahoma", 18F);
+            this.accordionControlElement2.Appearance.Normal.Options.UseFont = true;
+            this.accordionControlElement2.Name = "accordionControlElement2";
+            this.accordionControlElement2.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item;
+            this.accordionControlElement2.Text = "璐㈠姟宸插鏍�";
+            // 
+            // accordionControlElement3
+            // 
+            this.accordionControlElement3.Appearance.Normal.Font = new System.Drawing.Font("Tahoma", 18F);
+            this.accordionControlElement3.Appearance.Normal.Options.UseFont = true;
+            this.accordionControlElement3.Name = "accordionControlElement3";
+            this.accordionControlElement3.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item;
+            this.accordionControlElement3.Text = "閲囪喘宸插鏍�";
+            // 
+            // accordionControlElement4
+            // 
+            this.accordionControlElement4.Appearance.Normal.Font = new System.Drawing.Font("Tahoma", 18F);
+            this.accordionControlElement4.Appearance.Normal.Options.UseFont = true;
+            this.accordionControlElement4.Name = "accordionControlElement4";
+            this.accordionControlElement4.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item;
+            this.accordionControlElement4.Text = "閿�鍞凡瀹℃牳";
+            // 
+            // XtraForm2
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(658, 514);
+            this.Controls.Add(this.accordionControl1);
+            this.Name = "XtraForm2";
+            this.Text = "XtraForm2";
+            ((System.ComponentModel.ISupportInitialize)(this.accordionControl1)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DevExpress.XtraBars.Navigation.AccordionControl accordionControl1;
+        private DevExpress.XtraBars.Navigation.AccordionControlElement accordionControlElement1;
+        private DevExpress.XtraBars.Navigation.AccordionControlElement accordionControlElement2;
+        private DevExpress.XtraBars.Navigation.AccordionControlElement accordionControlElement3;
+        private DevExpress.XtraBars.Navigation.AccordionControlElement accordionControlElement4;
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.DevApp/XtraForm2.cs b/DevApp/Gs.DevApp/XtraForm2.cs
new file mode 100644
index 0000000..bee5936
--- /dev/null
+++ b/DevApp/Gs.DevApp/XtraForm2.cs
@@ -0,0 +1,21 @@
+锘縰sing DevExpress.XtraEditors;
+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;
+
+namespace Gs.DevApp
+{
+    public partial class XtraForm2 : DevExpress.XtraEditors.XtraForm
+    {
+        public XtraForm2()
+        {
+            InitializeComponent();
+        }
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.DevApp/XtraForm2.resx b/DevApp/Gs.DevApp/XtraForm2.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/DevApp/Gs.DevApp/XtraForm2.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightIqc/App.config b/DevApp/Gs.WeightIqc/App.config
new file mode 100644
index 0000000..7ee61e9
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/App.config
@@ -0,0 +1,11 @@
+锘�<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+	</startup>
+	<appSettings>
+		<add key="WebApiUrl" value="http://192.168.1.145:81/" />
+		<add key="TimingMailInterval" value="10000" />
+		<add key="LogPath" value="logs" />
+	</appSettings>
+</configuration>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightIqc/Form1.Designer.cs b/DevApp/Gs.WeightIqc/Form1.Designer.cs
new file mode 100644
index 0000000..d263b6f
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Form1.Designer.cs
@@ -0,0 +1,199 @@
+锘縰sing System.Drawing;
+using System.Windows.Forms;
+
+namespace Gs.WeightIqc
+{
+    partial class Form1
+    {
+        /// <summary>
+        ///  Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        ///  Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        ///  Required method for Designer support - do not modify
+        ///  the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.cmbBaudRate = new System.Windows.Forms.ComboBox();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtDt = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.txtNum = new System.Windows.Forms.TextBox();
+            this.button2 = new System.Windows.Forms.Button();
+            this.button1 = new System.Windows.Forms.Button();
+            this.label2 = new System.Windows.Forms.Label();
+            this.cmbSerialPortNum = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // cmbBaudRate
+            // 
+            this.cmbBaudRate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbBaudRate.FormattingEnabled = true;
+            this.cmbBaudRate.Items.AddRange(new object[] {
+            "14400",
+            "9600",
+            "4800",
+            "2400",
+            "1200"});
+            this.cmbBaudRate.Location = new System.Drawing.Point(98, 39);
+            this.cmbBaudRate.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.cmbBaudRate.Name = "cmbBaudRate";
+            this.cmbBaudRate.Size = new System.Drawing.Size(135, 23);
+            this.cmbBaudRate.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.txtDt);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.txtNum);
+            this.groupBox1.Controls.Add(this.button2);
+            this.groupBox1.Controls.Add(this.button1);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.cmbSerialPortNum);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Controls.Add(this.cmbBaudRate);
+            this.groupBox1.Location = new System.Drawing.Point(24, 32);
+            this.groupBox1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.groupBox1.Size = new System.Drawing.Size(510, 180);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            // 
+            // txtDt
+            // 
+            this.txtDt.Location = new System.Drawing.Point(361, 70);
+            this.txtDt.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.txtDt.Name = "txtDt";
+            this.txtDt.ReadOnly = true;
+            this.txtDt.Size = new System.Drawing.Size(128, 25);
+            this.txtDt.TabIndex = 9;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(288, 75);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(67, 15);
+            this.label4.TabIndex = 8;
+            this.label4.Text = "鑾峰彇鏃堕棿";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(288, 43);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(67, 15);
+            this.label3.TabIndex = 7;
+            this.label3.Text = "褰撳墠閲嶉噺";
+            // 
+            // txtNum
+            // 
+            this.txtNum.Location = new System.Drawing.Point(361, 38);
+            this.txtNum.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.txtNum.Name = "txtNum";
+            this.txtNum.ReadOnly = true;
+            this.txtNum.Size = new System.Drawing.Size(128, 25);
+            this.txtNum.TabIndex = 6;
+            // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(139, 120);
+            this.button2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(84, 37);
+            this.button2.TabIndex = 5;
+            this.button2.Text = "鍋滄";
+            this.button2.UseVisualStyleBackColor = true;
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(34, 120);
+            this.button1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(84, 37);
+            this.button1.TabIndex = 4;
+            this.button1.Text = "鍚姩";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(22, 75);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(52, 15);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "涓插彛鍙�";
+            // 
+            // cmbSerialPortNum
+            // 
+            this.cmbSerialPortNum.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbSerialPortNum.FormattingEnabled = true;
+            this.cmbSerialPortNum.Location = new System.Drawing.Point(98, 71);
+            this.cmbSerialPortNum.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.cmbSerialPortNum.Name = "cmbSerialPortNum";
+            this.cmbSerialPortNum.Size = new System.Drawing.Size(135, 23);
+            this.cmbSerialPortNum.TabIndex = 2;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(22, 43);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(52, 15);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "娉㈢壒鐜�";
+            // 
+            // Form1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(569, 238);
+            this.Controls.Add(this.groupBox1);
+            this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+            this.MaximizeBox = false;
+            this.Name = "Form1";
+            this.Text = "骞挎繁--IQC绉伴噸鏈嶅姟";
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private ComboBox cmbBaudRate;
+        private GroupBox groupBox1;
+        private Label label1;
+        private Label label2;
+        private ComboBox cmbSerialPortNum;
+        private Button button1;
+        private Label label3;
+        private TextBox txtNum;
+        private Button button2;
+        private TextBox txtDt;
+        private Label label4;
+    }
+}
+
diff --git a/DevApp/Gs.WeightIqc/Form1.cs b/DevApp/Gs.WeightIqc/Form1.cs
new file mode 100644
index 0000000..6586897
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Form1.cs
@@ -0,0 +1,275 @@
+锘縰sing Gs.WeightIqc.ToolBox;
+using Microsoft.Win32;
+using Newtonsoft.Json;
+using NModbus;
+using NModbus.Serial;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Configuration;
+using System.Data;
+using System.Drawing;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+
+namespace Gs.WeightIqc
+{
+    public partial class Form1 : Form
+    {
+        public System.IO.Ports.SerialPort Sp = new System.IO.Ports.SerialPort();
+        public delegate void HandleInterfaceUpdataDelegate(string text);
+        private Form1.HandleInterfaceUpdataDelegate interfaceUpdataHandle;
+        private Dictionary<string, Thread> dicThread = new Dictionary<string, Thread>();
+        private System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
+        public Form1()
+        {
+            InitializeComponent();
+            GetComList();
+            #region MyRegion
+            int int32 = 10000;
+            string _vanishingSeconds = ConfigurationManager.AppSettings["TimingMailInterval"];
+            if (!string.IsNullOrEmpty(_vanishingSeconds))
+                int32 = int.Parse(_vanishingSeconds);
+            this.timer1.Interval = int32;
+            this.button1.Enabled = true;
+            this.button2.Enabled = false;
+            this.cmbBaudRate.SelectedIndex = 1;
+            #endregion
+            this.timer1.Tick += (s, e) =>
+            {
+                if (this.dicThread.Keys.Contains<string>("GetWeight"))
+                    return;
+                Thread thread1 = new Thread(new ThreadStart(this.GetWeight));
+                thread1.Start();
+                this.dicThread.Add("GetWeight", thread1);
+            };
+            this.button1.Click += (s, e) =>
+            {
+                try
+                {
+                    ToolBox.LogHelper.Debug(this.ToString(), " 寮�濮嬮噰闆�");
+                    if (this.cmbBaudRate.Text.Trim() != "" && this.cmbSerialPortNum.Text != "")
+                    {
+                        ToolBox.LogHelper.Debug(this.ToString(), "閰嶇疆涓插彛閫氫俊");
+                        this.interfaceUpdataHandle = new Form1.HandleInterfaceUpdataDelegate(this.UpdateTextBox);
+                        this.Sp.PortName = this.cmbSerialPortNum.Text.Trim();
+                        this.Sp.BaudRate = Convert.ToInt32(this.cmbBaudRate.Text.Trim());
+                        this.Sp.Parity = Parity.None;
+                        this.Sp.StopBits = StopBits.One;
+                        ToolBox.LogHelper.Debug(this.ToString(), "鎵撳紑涓插彛鍚岄�氫俊");
+                        this.Sp.Open();
+                        this.button1.Enabled = false;
+                        this.button2.Enabled = true;
+                        this.timer1.Enabled = false;
+                        this.cmbBaudRate.Enabled = false;
+                        this.cmbSerialPortNum.Enabled = false;
+                        ToolBox.LogHelper.Debug(this.ToString(), "鍚姩鍒锋柊鏁版嵁瀹氭椂鍣�");
+                        this.timer1.Start();
+                    }
+                    else
+                    {
+                        ToolBox.LogHelper.Debug(this.ToString(), "璇疯緭鍏ユ纭殑涓插彛鍙峰拰娉㈢壒鐜�");
+                        int num = (int)MessageBox.Show("璇疯緭鍏ユ纭殑涓插彛鍙峰拰娉㈢壒鐜囷紒");
+                        this.cmbSerialPortNum.Focus();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    ToolBox.LogHelper.Debug(this.ToString(), ex.Message);
+                    int num = (int)MessageBox.Show($"涓插彛{this.cmbSerialPortNum.Text.Trim()}鎵撳紑澶辫触锛亄ex.Message}");
+                }
+            };
+            this.button2.Click += (s, e) =>
+            {
+                try
+                {
+                    if (this.dicThread.Keys.Contains<string>("GetWeight"))
+                    {
+                        Thread thread = this.dicThread["GetWeight"];
+                        if (thread.IsAlive)
+                            thread.Abort();
+                        this.dicThread.Remove("GetWeight");
+                    }
+                    this.button1.Enabled = true;
+                    this.button2.Enabled = false;
+                    this.cmbBaudRate.Enabled = true;
+                    this.cmbSerialPortNum.Enabled = true;
+                    this.timer1.Stop();
+                    this.Sp.Close();
+                }
+                catch (Exception ex)
+                {
+                    //int num = (int)MessageBox.Show(ex.Message);
+                    //Application.Exit();
+                    MessageBox.Show(ex.Message);
+                    ToolBox.LogHelper.Debug(this.ToString(), ex.Message);
+                }
+            };
+            this.FormClosing += (s, e) =>
+            {
+                if (Sp.IsOpen)
+                    Sp.Close();
+                if (timer1 != null)
+                {
+                    timer1.Stop();
+                    timer1.Dispose();
+                }
+                try
+                {
+                    if (this.dicThread.Keys.Contains<string>("GetWeight"))
+                    {
+                        Thread thread = this.dicThread["GetWeight"];
+                        if (thread.IsAlive)
+                            thread.Abort();
+                        this.dicThread.Remove("GetWeight");
+                    }
+                    this.timer1.Stop();
+                    this.Sp.Close();
+                }
+                catch (Exception ex)
+                {
+                    //int num = (int)MessageBox.Show(ex.Message);
+                    //Application.Exit();
+                    MessageBox.Show(ex.Message);
+                }
+            };
+        }
+
+
+
+        /// <summary>
+        /// 鑾峰彇閲嶉噺
+        /// </summary>
+        public void GetWeight()
+        {
+            ModbusFactory factory = new ModbusFactory();
+            ToolBox.LogHelper.Debug(this.ToString(), "GetWeight鍒涘缓modbus瀵硅薄");
+            IModbusMaster rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp);
+            bool flag = true;
+            while (true)
+            {
+                // addModel("1", "2");
+                //ToolBox.LogHelper.Debug(this.ToString(), "GetWeight鍒涘缓modbus瀵硅薄");
+                try
+                {
+                    if (!this.Sp.IsOpen)
+                    {
+                        ToolBox.LogHelper.Debug(this.ToString(), "GetWeight 閲嶆柊鎵撳紑涓插彛杩炴帴");
+                        this.Sp.Open();
+                        rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp);
+                    }
+                    if (rtuMaster == null)
+                    {
+                        ToolBox.LogHelper.Debug(this.ToString(), "GetWeight 閲嶆柊鍒涘缓modbus瀵硅薄2");
+                        rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp);
+                    }
+                    byte slaveAddress3 = byte.Parse("1");
+                    ushort startAddress3 = ushort.Parse("0002");
+                    ushort numberOfPoints1 = ushort.Parse("2");
+                    ushort[] numArray = rtuMaster.ReadHoldingRegisters(slaveAddress3, startAddress3, numberOfPoints1);
+                    float single = BitConverter.ToSingle(this.CombomBinaryArray(BitConverter.GetBytes(numArray[1]), BitConverter.GetBytes(numArray[0])), 0);
+                    this.Invoke((Delegate)this.interfaceUpdataHandle, (object)single.ToString());
+                    byte slaveAddress4 = byte.Parse("1");
+                    ushort startAddress4 = ushort.Parse("0001");
+                    ushort numberOfPoints2 = ushort.Parse("1");
+                    int int32 = Convert.ToInt32(rtuMaster.ReadHoldingRegisters(slaveAddress4, startAddress4, numberOfPoints2)[0].ToString());
+                    string str = Convert.ToString(int32, 2).PadLeft(16 /*0x10*/, '0');
+                    char ch1 = str[1];
+                    char ch2 = str[6];
+                    if (ch1 == '0' && ch2 == '0')
+                    {
+                        flag = true;
+                    }
+                    else if (flag)
+                    {
+                        flag = false;
+                    }
+                    addModel(single.ToString(), int32.ToString());
+                    ToolBox.LogHelper.Debug(this.ToString(), "single:" + single.ToString() + ",flag:" + flag.ToString() + ",int32:" + int32.ToString());
+                    Thread.Sleep(2000);
+                }
+                catch (Exception ex)
+                {
+                    Thread.Sleep(2000);
+                }
+            }
+        }
+        /// <summary>
+        /// 涓婁紶绉伴噸鏁版嵁
+        /// </summary>
+        /// <param name="_realWeight">鎴彇鍚庣殑鏁伴噺</param>
+        /// <param name="_realWeightTxt">鍘熷瓙涓�</param>
+        private void addModel(string _realWeight, string _realWeightTxt)
+        {
+            string _lineId = "0";
+            var _obj = new
+            {
+                lineId = _lineId,
+                realWeight = _realWeight.Trim(),
+                realWeightTxt = _realWeightTxt.Trim(),
+            };
+            try
+            {
+                string strJson = UtilityHelper.HttpPost("", "WorkWeight/EditModel", JsonConvert.SerializeObject(_obj));
+                ReturnModel<dynamic> _rtn = ToolBox.UtilityHelper.ReturnToDynamic(strJson);
+                if (_rtn.rtnCode <= 0)
+                {
+                    ToolBox.LogHelper.Debug(this.ToString(), "WorkWeight/EditModel:" + strJson);
+                }
+            }
+            catch (Exception ex)
+            {
+                ToolBox.LogHelper.Debug(this.ToString(), ex.Message);
+            }
+        }
+
+
+        /// <summary>
+        /// 鏇存柊UI
+        /// </summary>
+        /// <param name="text"></param>
+
+        private void UpdateTextBox(string text)
+        {
+            try
+            {
+                this.txtDt.Text = DateTime.Now.ToString();
+                if (this.txtNum.Text == text)
+                    return;
+                this.txtNum.Text = text;
+            }
+            catch (Exception ex)
+            {
+                ToolBox.LogHelper.Debug(this.ToString(), ex.Message);
+            }
+        }
+
+        private void GetComList()
+        {
+            this.cmbSerialPortNum.Items.Clear();
+            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
+            if (registryKey == null)
+                return;
+            foreach (string valueName in registryKey.GetValueNames())
+            {
+                string description = (string)registryKey.GetValue(valueName);
+                this.cmbSerialPortNum.Items.Add(description);
+            }
+            if (this.cmbSerialPortNum.Items.Count > 0)
+                this.cmbSerialPortNum.SelectedIndex = 0;
+        }
+
+        private byte[] CombomBinaryArray(byte[] srcArray1, byte[] srcArray2)
+        {
+            byte[] destinationArray = new byte[srcArray1.Length + srcArray2.Length];
+            Array.Copy((Array)srcArray1, 0, (Array)destinationArray, 0, srcArray1.Length);
+            Array.Copy((Array)srcArray2, 0, (Array)destinationArray, srcArray1.Length, srcArray2.Length);
+            return destinationArray;
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightIqc/Form1.resx b/DevApp/Gs.WeightIqc/Form1.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Form1.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightIqc/Gs.WeightIqc.csproj b/DevApp/Gs.WeightIqc/Gs.WeightIqc.csproj
new file mode 100644
index 0000000..1c03f16
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Gs.WeightIqc.csproj
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{31ED2821-04C4-4A4A-B794-E4972BBB4810}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>Gs.WeightIqc</RootNamespace>
+    <AssemblyName>Gs.WeightIqc</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="NModbus, Version=3.0.81.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\NModbus.3.0.81\lib\net46\NModbus.dll</HintPath>
+    </Reference>
+    <Reference Include="NModbus.Serial, Version=3.0.81.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\NModbus.Serial.3.0.81\lib\net46\NModbus.Serial.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ToolBox\LogHelper.cs" />
+    <Compile Include="ToolBox\ReturnModel.cs" />
+    <Compile Include="ToolBox\UtilityHelper.cs" />
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightIqc/Program.cs b/DevApp/Gs.WeightIqc/Program.cs
new file mode 100644
index 0000000..23a4028
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Program.cs
@@ -0,0 +1,22 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Gs.WeightIqc
+{
+    internal static class Program
+    {
+        /// <summary>
+        /// 搴旂敤绋嬪簭鐨勪富鍏ュ彛鐐广��
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightIqc/Properties/AssemblyInfo.cs b/DevApp/Gs.WeightIqc/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..431d4db
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�鑸俊鎭敱浠ヤ笅
+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("Gs.WeightIqc")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Gs.WeightIqc")]
+[assembly: AssemblyCopyright("Copyright 漏  2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("31ed2821-04c4-4a4a-b794-e4972bbb4810")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�肩粍鎴�: 
+//
+//      涓荤増鏈�
+//      娆$増鏈�
+//      鐢熸垚鍙�
+//      淇鍙�
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/DevApp/Gs.WeightIqc/Properties/Resources.Designer.cs b/DevApp/Gs.WeightIqc/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..a9651a4
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     姝や唬鐮佺敱宸ュ叿鐢熸垚銆�
+//     杩愯鏃剁増鏈�: 4.0.30319.42000
+//
+//     瀵规鏂囦欢鐨勬洿鏀瑰彲鑳藉鑷翠笉姝g‘鐨勮涓猴紝濡傛灉
+//     閲嶆柊鐢熸垚浠g爜锛屽垯鎵�鍋氭洿鏀瑰皢涓㈠け銆�
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Gs.WeightIqc.Properties
+{
+
+
+    /// <summary>
+    ///   寮虹被鍨嬭祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲瀛楃涓茬瓑銆�
+    /// </summary>
+    // 姝ょ被鏄敱 StronglyTypedResourceBuilder
+    // 绫婚�氳繃绫讳技浜� ResGen 鎴� Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆�
+    // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈� .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛� ResGen
+    // (浠� /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆�
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   杩斿洖姝ょ被浣跨敤鐨勭紦瀛� ResourceManager 瀹炰緥銆�
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Gs.WeightIqc.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   閲嶅啓褰撳墠绾跨▼鐨� CurrentUICulture 灞炴�э紝瀵�
+        ///   浣跨敤姝ゅ己绫诲瀷璧勬簮绫荤殑鎵�鏈夎祫婧愭煡鎵炬墽琛岄噸鍐欍��
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightIqc/Properties/Resources.resx b/DevApp/Gs.WeightIqc/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Properties/Resources.resx
@@ -0,0 +1,117 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightIqc/Properties/Settings.Designer.cs b/DevApp/Gs.WeightIqc/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..a843c05
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Gs.WeightIqc.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightIqc/Properties/Settings.settings b/DevApp/Gs.WeightIqc/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
diff --git a/DevApp/Gs.WeightIqc/ToolBox/LogHelper.cs b/DevApp/Gs.WeightIqc/ToolBox/LogHelper.cs
new file mode 100644
index 0000000..b790769
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/ToolBox/LogHelper.cs
@@ -0,0 +1,53 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Gs.WeightIqc.ToolBox
+{
+    public class LogHelper
+    {
+        //鍒涘缓鏃ュ織鐩綍
+        private static readonly string path = AppContext.BaseDirectory +
+                                              ConfigurationManager.AppSettings[
+                                                  "LogPath"];
+
+        /**
+         * 鍚戞棩蹇楁枃浠跺啓鍏ヨ皟璇曚俊鎭�
+         * @param className 绫诲悕
+         * @param content 鍐欏叆鍐呭
+         */
+        public static void Debug(string className, string content)
+        {
+            WriteLog("DEBUG", className, content);
+        }
+
+        /**
+         * 瀹為檯鐨勫啓鏃ュ織鎿嶄綔
+         * @param type 鏃ュ織璁板綍绫诲瀷
+         * @param className 绫诲悕
+         * @param content 鍐欏叆鍐呭
+         */
+        protected static void WriteLog(string type, string className,
+            string content)
+        {
+            if (!Directory.Exists(path)) //濡傛灉鏃ュ織鐩綍涓嶅瓨鍦ㄥ氨鍒涘缓
+                Directory.CreateDirectory(path);
+            var time =
+                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); //鑾峰彇褰撳墠绯荤粺鏃堕棿
+            var filename = path + "/" + DateTime.Now.ToString("yyyy-MM-dd") +
+                           ".log"; //鐢ㄦ棩鏈熷鏃ュ織鏂囦欢鍛藉悕
+            //鍒涘缓鎴栨墦寮�鏃ュ織鏂囦欢锛屽悜鏃ュ織鏂囦欢鏈熬杩藉姞璁板綍
+            var mySw = File.AppendText(filename);
+            //鍚戞棩蹇楁枃浠跺啓鍏ュ唴瀹�
+            var write_content =
+                time + " " + type + " " + className + ": " + content;
+            mySw.WriteLine(write_content);
+            //鍏抽棴鏃ュ織鏂囦欢
+            mySw.Close();
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightIqc/ToolBox/ReturnModel.cs b/DevApp/Gs.WeightIqc/ToolBox/ReturnModel.cs
new file mode 100644
index 0000000..9148691
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/ToolBox/ReturnModel.cs
@@ -0,0 +1,61 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Gs.WeightIqc.ToolBox
+{
+    /// <summary>
+    ///     杩斿洖鐨勫鍥寸粨鏋�
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class ReturnModel<T>
+    {
+        /// <summary>
+        ///     Default = -100榛樿, Unauthorized = -101闈炴硶璋冪敤, Exception = -102绯荤粺浠g爜寮傚父, Success
+        ///     = 1鎴愬姛
+        /// </summary>
+        public int rtnCode { set; get; }
+
+        public T rtnData { set; get; }
+        public string rtnMsg { get; set; }
+    }
+
+    /// <summary>
+    ///     杩斿洖鐨勫垎椤佃妭鐐�
+    /// </summary>
+    public class PageListModel
+    {
+        /// <summary>
+        ///     姣忛〉澶у皬
+        /// </summary>
+        public int everyPageSize;
+
+        /// <summary>
+        ///     鎵╁睍鐢紝鍒楄〃
+        /// </summary>
+        public List<dynamic> extendList;
+
+        /// <summary>
+        ///     鎵╁睍鐢紝鍗曟枃鏈紝姣斿閲戦鍚堣绛夊叾瀹冮」鐩�
+        /// </summary>
+        public string extendText;
+
+        /// <summary>
+        ///     鎬婚〉鏁�
+        /// </summary>
+        public int pages;
+
+        /// <summary>
+        ///     鎬昏褰曟暟
+        /// </summary>
+        public int total;
+
+        /// <summary>
+        ///     鍒楄〃
+        /// </summary>
+        public DataTable list { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.WeightIqc/ToolBox/UtilityHelper.cs b/DevApp/Gs.WeightIqc/ToolBox/UtilityHelper.cs
new file mode 100644
index 0000000..153f396
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/ToolBox/UtilityHelper.cs
@@ -0,0 +1,104 @@
+锘縰sing Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Cache;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Gs.WeightIqc.ToolBox
+{
+    public class UtilityHelper
+    {
+        private static readonly string WebApiUrl =
+          ConfigurationManager.AppSettings["WebApiUrl"];
+
+        /// <summary>
+        /// http璇锋眰
+        /// </summary>
+        /// <param name="url">api鏍瑰湴鍧�</param>
+        /// <param name="meth">鏂规硶鍚嶇О</param>
+        /// <param name="param">json鍙傛暟</param>
+        /// <param name="isLoading">鏄惁loading</param>
+        /// <returns></returns>
+        public static string HttpPost(string url, string meth, string param, bool isLoading = true)
+        {
+            HttpWebRequest request = null;
+            StreamWriter requestStream = null;
+            WebResponse response = null;
+            string responseStr = null;
+            try
+            {
+                if (string.IsNullOrEmpty(url))
+                    url = WebApiUrl;
+                url += meth;
+                request = (HttpWebRequest)WebRequest.Create(url);
+                request.Method = "POST";
+                request.ContentType = "application/json";
+                request.Headers.Add("token", GetBasicAuthTicket());
+                request.Accept = "*/*";
+                request.Timeout = 150000;
+                request.AllowAutoRedirect = false;
+                request.ServicePoint.Expect100Continue = false;
+                HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
+                request.CachePolicy = noCachePolicy;
+                requestStream = new StreamWriter(request.GetRequestStream());
+                requestStream.Write(param);
+                requestStream.Close();
+                response = request.GetResponse();
+                if (response != null)
+                {
+                    var reader = new StreamReader(response.GetResponseStream(),
+                        Encoding.UTF8);
+                    responseStr = reader.ReadToEnd();
+                    //File.WriteAllText(Server.MapPath("~/") + @"\test.txt", responseStr); 
+                    reader.Close();
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Debug(url, param + ":" + ex.Message);
+                throw ex;
+            }
+            finally
+            {
+                request = null;
+                requestStream = null;
+                response = null;
+            }
+            return responseStr;
+        }
+
+
+        /// <summary>
+        ///     鐢熸垚璁块棶鏈嶅姟鐨則oken
+        /// </summary>
+        /// <returns></returns>
+        public static string GetBasicAuthTicket()
+        {
+            var userGuid = "11111111-1111-1111-1111-111111111111";
+            var token = userGuid;
+            return token;
+        }
+
+        /// <summary>
+        ///     鏈嶅姟杩斿洖鐨刯son杩斿洖ReturnModel锛�
+        /// </summary>
+        /// <param name="strReturn"></param>
+        /// <returns></returns>
+        public static ReturnModel<dynamic> ReturnToDynamic(string strReturn)
+        {
+            var rto = new ReturnModel<dynamic>();
+            var json = JObject.Parse(strReturn);
+            rto.rtnCode = int.Parse(json["rtnCode"].ToString());
+            rto.rtnMsg = json["rtnMsg"].ToString();
+            rto.rtnData = json["rtnData"];
+            return rto;
+        }
+
+
+    }
+}
diff --git a/DevApp/Gs.WeightIqc/packages.config b/DevApp/Gs.WeightIqc/packages.config
new file mode 100644
index 0000000..6365bbc
--- /dev/null
+++ b/DevApp/Gs.WeightIqc/packages.config
@@ -0,0 +1,6 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
+  <package id="NModbus" version="3.0.81" targetFramework="net48" />
+  <package id="NModbus.Serial" version="3.0.81" targetFramework="net48" />
+</packages>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/App.config b/DevApp/Gs.WeightLine/App.config
new file mode 100644
index 0000000..d50b33f
--- /dev/null
+++ b/DevApp/Gs.WeightLine/App.config
@@ -0,0 +1,26 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <configSections>
+    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System">
+      <section name="DevExpress.LookAndFeel.Design.AppSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+    </sectionGroup>
+  </configSections>
+	<appSettings>
+		<add key="WebApiUrl" value="http://192.168.1.145:81/" />
+		<add key="TimingMailInterval" value="10000" />
+		<add key="LogPath" value="logs" />
+	</appSettings>
+  <applicationSettings>
+    <DevExpress.LookAndFeel.Design.AppSettings>
+      <setting name="DPIAwarenessMode" serializeAs="String">
+        <value>System</value>
+      </setting>
+      <setting name="RegisterBonusSkins" serializeAs="String">
+        <value>True</value>
+      </setting>
+    </DevExpress.LookAndFeel.Design.AppSettings>
+  </applicationSettings>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+  </startup>
+</configuration>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/Form1.Designer.cs b/DevApp/Gs.WeightLine/Form1.Designer.cs
new file mode 100644
index 0000000..157b868
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Form1.Designer.cs
@@ -0,0 +1,563 @@
+锘縰sing System.Windows.Forms;
+
+
+namespace Gs.WeightLine
+{
+    partial class Form1
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            DevExpress.XtraLayout.ColumnDefinition columnDefinition1 = new DevExpress.XtraLayout.ColumnDefinition();
+            DevExpress.XtraLayout.ColumnDefinition columnDefinition2 = new DevExpress.XtraLayout.ColumnDefinition();
+            DevExpress.XtraLayout.ColumnDefinition columnDefinition3 = new DevExpress.XtraLayout.ColumnDefinition();
+            DevExpress.XtraLayout.RowDefinition rowDefinition1 = new DevExpress.XtraLayout.RowDefinition();
+            DevExpress.XtraLayout.RowDefinition rowDefinition2 = new DevExpress.XtraLayout.RowDefinition();
+            DevExpress.XtraLayout.RowDefinition rowDefinition3 = new DevExpress.XtraLayout.RowDefinition();
+            this.split1 = new DevExpress.XtraEditors.SplitContainerControl();
+            this.layoutMx1 = new DevExpress.XtraDataLayout.DataLayoutControl();
+            this.comLine = new Gs.DevApp.UserControl.UcLookWorkline();
+            this.button1 = new DevExpress.XtraEditors.SimpleButton();
+            this.cmbSerialPortNum = new DevExpress.XtraEditors.ComboBoxEdit();
+            this.cmbBaudRate = new DevExpress.XtraEditors.ComboBoxEdit();
+            this.txtNum = new DevExpress.XtraEditors.TextEdit();
+            this.txtMsg = new DevExpress.XtraEditors.MemoEdit();
+            this.button2 = new DevExpress.XtraEditors.SimpleButton();
+            this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.cmbBaudRate1111 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.gcMx1 = new DevExpress.XtraGrid.GridControl();
+            this.gvMx1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            this.gridColumn1 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn2 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn3 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn4 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn5 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn6 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn8 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn9 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn10 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn11 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn12 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn13 = new DevExpress.XtraGrid.Columns.GridColumn();
+            ((System.ComponentModel.ISupportInitialize)(this.split1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.split1.Panel1)).BeginInit();
+            this.split1.Panel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.split1.Panel2)).BeginInit();
+            this.split1.Panel2.SuspendLayout();
+            this.split1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutMx1)).BeginInit();
+            this.layoutMx1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbSerialPortNum.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbBaudRate.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtNum.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtMsg.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbBaudRate1111)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem6)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem5)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.gcMx1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.gvMx1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // split1
+            // 
+            this.split1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.split1.Horizontal = false;
+            this.split1.Location = new System.Drawing.Point(0, 0);
+            this.split1.Name = "split1";
+            // 
+            // split1.Panel1
+            // 
+            this.split1.Panel1.Controls.Add(this.layoutMx1);
+            this.split1.Panel1.Text = "Panel1";
+            // 
+            // split1.Panel2
+            // 
+            this.split1.Panel2.Controls.Add(this.gcMx1);
+            this.split1.Panel2.Text = "Panel2";
+            this.split1.ShowSplitGlyph = DevExpress.Utils.DefaultBoolean.True;
+            this.split1.Size = new System.Drawing.Size(1040, 511);
+            this.split1.SplitterPosition = 113;
+            this.split1.TabIndex = 1;
+            // 
+            // layoutMx1
+            // 
+            this.layoutMx1.Controls.Add(this.comLine);
+            this.layoutMx1.Controls.Add(this.button1);
+            this.layoutMx1.Controls.Add(this.cmbSerialPortNum);
+            this.layoutMx1.Controls.Add(this.cmbBaudRate);
+            this.layoutMx1.Controls.Add(this.txtNum);
+            this.layoutMx1.Controls.Add(this.txtMsg);
+            this.layoutMx1.Controls.Add(this.button2);
+            this.layoutMx1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.layoutMx1.Location = new System.Drawing.Point(0, 0);
+            this.layoutMx1.Name = "layoutMx1";
+            this.layoutMx1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new System.Drawing.Rectangle(310, 455, 812, 500);
+            this.layoutMx1.Root = this.Root;
+            this.layoutMx1.Size = new System.Drawing.Size(1040, 113);
+            this.layoutMx1.TabIndex = 0;
+            this.layoutMx1.Text = "dataLayoutControl1";
+            // 
+            // comLine
+            // 
+            this.comLine.IsReadly = false;
+            this.comLine.Location = new System.Drawing.Point(94, 12);
+            this.comLine.Name = "comLine";
+            this.comLine.Size = new System.Drawing.Size(164, 24);
+            this.comLine.TabIndex = 14;
+            // 
+            // button1
+            // 
+            this.button1.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Question;
+            this.button1.Appearance.Options.UseBackColor = true;
+            this.button1.Appearance.Options.UseFont = true;
+            this.button1.Location = new System.Drawing.Point(262, 12);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(246, 27);
+            this.button1.StyleController = this.layoutMx1;
+            this.button1.TabIndex = 5;
+            this.button1.Text = "鍚姩";
+            // 
+            // cmbSerialPortNum
+            // 
+            this.cmbSerialPortNum.Location = new System.Drawing.Point(94, 43);
+            this.cmbSerialPortNum.Name = "cmbSerialPortNum";
+            this.cmbSerialPortNum.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
+            this.cmbSerialPortNum.Properties.NullText = "-璇烽�夋嫨-";
+            this.cmbSerialPortNum.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
+            this.cmbSerialPortNum.Size = new System.Drawing.Size(164, 24);
+            this.cmbSerialPortNum.StyleController = this.layoutMx1;
+            this.cmbSerialPortNum.TabIndex = 4;
+            // 
+            // cmbBaudRate
+            // 
+            this.cmbBaudRate.EditValue = "9600";
+            this.cmbBaudRate.Location = new System.Drawing.Point(94, 74);
+            this.cmbBaudRate.Name = "cmbBaudRate";
+            this.cmbBaudRate.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
+            this.cmbBaudRate.Properties.Items.AddRange(new object[] {
+            "14400",
+            "9600",
+            "4800",
+            "2400",
+            "1200"});
+            this.cmbBaudRate.Properties.NullText = "-璇烽�夋嫨-";
+            this.cmbBaudRate.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
+            this.cmbBaudRate.Size = new System.Drawing.Size(164, 24);
+            this.cmbBaudRate.StyleController = this.layoutMx1;
+            this.cmbBaudRate.TabIndex = 5;
+            // 
+            // txtNum
+            // 
+            this.txtNum.Location = new System.Drawing.Point(594, 22);
+            this.txtNum.Name = "txtNum";
+            this.txtNum.Properties.Appearance.Font = new System.Drawing.Font("Tahoma", 15F);
+            this.txtNum.Properties.Appearance.Options.UseFont = true;
+            this.txtNum.Properties.ReadOnly = true;
+            this.txtNum.Size = new System.Drawing.Size(434, 36);
+            this.txtNum.StyleController = this.layoutMx1;
+            this.txtNum.TabIndex = 8;
+            // 
+            // txtMsg
+            // 
+            this.txtMsg.Location = new System.Drawing.Point(512, 74);
+            this.txtMsg.Name = "txtMsg";
+            this.txtMsg.Properties.ReadOnly = true;
+            this.txtMsg.Size = new System.Drawing.Size(516, 27);
+            this.txtMsg.StyleController = this.layoutMx1;
+            this.txtMsg.TabIndex = 15;
+            // 
+            // button2
+            // 
+            this.button2.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Danger;
+            this.button2.Appearance.Options.UseBackColor = true;
+            this.button2.Location = new System.Drawing.Point(262, 43);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(246, 27);
+            this.button2.StyleController = this.layoutMx1;
+            this.button2.TabIndex = 16;
+            this.button2.Text = "鍋滄";
+            // 
+            // Root
+            // 
+            this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            this.Root.GroupBordersVisible = false;
+            this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem3,
+            this.layoutControlItem1,
+            this.cmbBaudRate1111,
+            this.layoutControlItem2,
+            this.layoutControlItem6,
+            this.layoutControlItem4,
+            this.layoutControlItem5});
+            this.Root.LayoutMode = DevExpress.XtraLayout.Utils.LayoutMode.Table;
+            this.Root.Name = "Root";
+            columnDefinition1.SizeType = System.Windows.Forms.SizeType.Absolute;
+            columnDefinition1.Width = 250D;
+            columnDefinition2.SizeType = System.Windows.Forms.SizeType.Absolute;
+            columnDefinition2.Width = 250D;
+            columnDefinition3.SizeType = System.Windows.Forms.SizeType.Percent;
+            columnDefinition3.Width = 100D;
+            this.Root.OptionsTableLayoutGroup.ColumnDefinitions.AddRange(new DevExpress.XtraLayout.ColumnDefinition[] {
+            columnDefinition1,
+            columnDefinition2,
+            columnDefinition3});
+            rowDefinition1.Height = 100D;
+            rowDefinition1.SizeType = System.Windows.Forms.SizeType.Percent;
+            rowDefinition2.Height = 100D;
+            rowDefinition2.SizeType = System.Windows.Forms.SizeType.Percent;
+            rowDefinition3.Height = 100D;
+            rowDefinition3.SizeType = System.Windows.Forms.SizeType.Percent;
+            this.Root.OptionsTableLayoutGroup.RowDefinitions.AddRange(new DevExpress.XtraLayout.RowDefinition[] {
+            rowDefinition1,
+            rowDefinition2,
+            rowDefinition3});
+            this.Root.Size = new System.Drawing.Size(1040, 113);
+            this.Root.TextVisible = false;
+            // 
+            // layoutControlItem3
+            // 
+            this.layoutControlItem3.Control = this.comLine;
+            this.layoutControlItem3.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem3.Name = "layoutControlItem3";
+            this.layoutControlItem3.Size = new System.Drawing.Size(250, 31);
+            this.layoutControlItem3.Text = "閫夌嚎浣�";
+            this.layoutControlItem3.TextSize = new System.Drawing.Size(70, 18);
+            // 
+            // layoutControlItem1
+            // 
+            this.layoutControlItem1.Control = this.cmbSerialPortNum;
+            this.layoutControlItem1.Location = new System.Drawing.Point(0, 31);
+            this.layoutControlItem1.Name = "layoutControlItem1";
+            this.layoutControlItem1.OptionsTableLayoutItem.RowIndex = 1;
+            this.layoutControlItem1.Size = new System.Drawing.Size(250, 31);
+            this.layoutControlItem1.Text = "涓插彛鍙�";
+            this.layoutControlItem1.TextSize = new System.Drawing.Size(70, 18);
+            // 
+            // cmbBaudRate1111
+            // 
+            this.cmbBaudRate1111.Control = this.cmbBaudRate;
+            this.cmbBaudRate1111.Location = new System.Drawing.Point(0, 62);
+            this.cmbBaudRate1111.Name = "cmbBaudRate1111";
+            this.cmbBaudRate1111.OptionsTableLayoutItem.RowIndex = 2;
+            this.cmbBaudRate1111.Size = new System.Drawing.Size(250, 31);
+            this.cmbBaudRate1111.Text = "娉㈢壒鐜�";
+            this.cmbBaudRate1111.TextSize = new System.Drawing.Size(70, 18);
+            // 
+            // layoutControlItem2
+            // 
+            this.layoutControlItem2.Control = this.button1;
+            this.layoutControlItem2.Location = new System.Drawing.Point(250, 0);
+            this.layoutControlItem2.MaxSize = new System.Drawing.Size(250, 31);
+            this.layoutControlItem2.MinSize = new System.Drawing.Size(41, 31);
+            this.layoutControlItem2.Name = "layoutControlItem2";
+            this.layoutControlItem2.OptionsTableLayoutItem.ColumnIndex = 1;
+            this.layoutControlItem2.Size = new System.Drawing.Size(250, 31);
+            this.layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem2.Text = "鍚姩";
+            this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem2.TextVisible = false;
+            // 
+            // layoutControlItem6
+            // 
+            this.layoutControlItem6.Control = this.button2;
+            this.layoutControlItem6.Location = new System.Drawing.Point(250, 31);
+            this.layoutControlItem6.Name = "layoutControlItem6";
+            this.layoutControlItem6.OptionsTableLayoutItem.ColumnIndex = 1;
+            this.layoutControlItem6.OptionsTableLayoutItem.RowIndex = 1;
+            this.layoutControlItem6.Size = new System.Drawing.Size(250, 31);
+            this.layoutControlItem6.Text = "鍋滄";
+            this.layoutControlItem6.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem6.TextVisible = false;
+            // 
+            // layoutControlItem4
+            // 
+            this.layoutControlItem4.AppearanceItemCaption.Font = new System.Drawing.Font("Tahoma", 20F, System.Drawing.FontStyle.Bold);
+            this.layoutControlItem4.AppearanceItemCaption.Options.UseFont = true;
+            this.layoutControlItem4.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
+            this.layoutControlItem4.Control = this.txtNum;
+            this.layoutControlItem4.Location = new System.Drawing.Point(500, 0);
+            this.layoutControlItem4.Name = "layoutControlItem4";
+            this.layoutControlItem4.OptionsTableLayoutItem.ColumnIndex = 2;
+            this.layoutControlItem4.OptionsTableLayoutItem.RowSpan = 2;
+            this.layoutControlItem4.Size = new System.Drawing.Size(520, 62);
+            this.layoutControlItem4.Text = "閲嶉噺";
+            this.layoutControlItem4.TextSize = new System.Drawing.Size(70, 41);
+            // 
+            // layoutControlItem5
+            // 
+            this.layoutControlItem5.Control = this.txtMsg;
+            this.layoutControlItem5.Location = new System.Drawing.Point(500, 62);
+            this.layoutControlItem5.Name = "layoutControlItem5";
+            this.layoutControlItem5.OptionsTableLayoutItem.ColumnIndex = 2;
+            this.layoutControlItem5.OptionsTableLayoutItem.RowIndex = 2;
+            this.layoutControlItem5.Size = new System.Drawing.Size(520, 31);
+            this.layoutControlItem5.Text = "鏀跺垪琛�";
+            this.layoutControlItem5.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem5.TextVisible = false;
+            // 
+            // gcMx1
+            // 
+            this.gcMx1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.gcMx1.Location = new System.Drawing.Point(0, 0);
+            this.gcMx1.MainView = this.gvMx1;
+            this.gcMx1.Name = "gcMx1";
+            this.gcMx1.Size = new System.Drawing.Size(1040, 386);
+            this.gcMx1.TabIndex = 0;
+            this.gcMx1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
+            this.gvMx1});
+            // 
+            // gvMx1
+            // 
+            this.gvMx1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] {
+            this.gridColumn1,
+            this.gridColumn2,
+            this.gridColumn3,
+            this.gridColumn4,
+            this.gridColumn5,
+            this.gridColumn6,
+            this.gridColumn8,
+            this.gridColumn9,
+            this.gridColumn10,
+            this.gridColumn11,
+            this.gridColumn12,
+            this.gridColumn13});
+            this.gvMx1.GridControl = this.gcMx1;
+            this.gvMx1.Name = "gvMx1";
+            // 
+            // gridColumn1
+            // 
+            this.gridColumn1.Caption = "鏉$爜";
+            this.gridColumn1.FieldName = "flowCode";
+            this.gridColumn1.MinWidth = 25;
+            this.gridColumn1.Name = "gridColumn1";
+            this.gridColumn1.OptionsColumn.ReadOnly = true;
+            this.gridColumn1.Visible = true;
+            this.gridColumn1.VisibleIndex = 0;
+            this.gridColumn1.Width = 94;
+            // 
+            // gridColumn2
+            // 
+            this.gridColumn2.Caption = "宸ュ崟";
+            this.gridColumn2.FieldName = "gdbh";
+            this.gridColumn2.MinWidth = 25;
+            this.gridColumn2.Name = "gridColumn2";
+            this.gridColumn2.OptionsColumn.ReadOnly = true;
+            this.gridColumn2.Visible = true;
+            this.gridColumn2.VisibleIndex = 1;
+            this.gridColumn2.Width = 94;
+            // 
+            // gridColumn3
+            // 
+            this.gridColumn3.Caption = "鐗╂枡缂栫爜";
+            this.gridColumn3.FieldName = "itemNo";
+            this.gridColumn3.MinWidth = 25;
+            this.gridColumn3.Name = "gridColumn3";
+            this.gridColumn3.OptionsColumn.ReadOnly = true;
+            this.gridColumn3.Visible = true;
+            this.gridColumn3.VisibleIndex = 2;
+            this.gridColumn3.Width = 94;
+            // 
+            // gridColumn4
+            // 
+            this.gridColumn4.Caption = "鐗╂枡鍚嶇О";
+            this.gridColumn4.FieldName = "itemName";
+            this.gridColumn4.MinWidth = 25;
+            this.gridColumn4.Name = "gridColumn4";
+            this.gridColumn4.OptionsColumn.ReadOnly = true;
+            this.gridColumn4.Visible = true;
+            this.gridColumn4.VisibleIndex = 3;
+            this.gridColumn4.Width = 94;
+            // 
+            // gridColumn5
+            // 
+            this.gridColumn5.Caption = "鐗╂枡瑙勬牸";
+            this.gridColumn5.FieldName = "itemModel";
+            this.gridColumn5.MinWidth = 25;
+            this.gridColumn5.Name = "gridColumn5";
+            this.gridColumn5.OptionsColumn.ReadOnly = true;
+            this.gridColumn5.Visible = true;
+            this.gridColumn5.VisibleIndex = 4;
+            this.gridColumn5.Width = 94;
+            // 
+            // gridColumn6
+            // 
+            this.gridColumn6.Caption = "宸ュ簭";
+            this.gridColumn6.FieldName = "processNo";
+            this.gridColumn6.MinWidth = 25;
+            this.gridColumn6.Name = "gridColumn6";
+            this.gridColumn6.OptionsColumn.ReadOnly = true;
+            this.gridColumn6.Visible = true;
+            this.gridColumn6.VisibleIndex = 5;
+            this.gridColumn6.Width = 94;
+            // 
+            // gridColumn8
+            // 
+            this.gridColumn8.Caption = "绾垮埆";
+            this.gridColumn8.FieldName = "lineName";
+            this.gridColumn8.MinWidth = 25;
+            this.gridColumn8.Name = "gridColumn8";
+            this.gridColumn8.OptionsColumn.ReadOnly = true;
+            this.gridColumn8.Visible = true;
+            this.gridColumn8.VisibleIndex = 6;
+            this.gridColumn8.Width = 94;
+            // 
+            // gridColumn9
+            // 
+            this.gridColumn9.Caption = "浣滀笟浜哄憳";
+            this.gridColumn9.FieldName = "createBy";
+            this.gridColumn9.MinWidth = 25;
+            this.gridColumn9.Name = "gridColumn9";
+            this.gridColumn9.OptionsColumn.ReadOnly = true;
+            this.gridColumn9.Visible = true;
+            this.gridColumn9.VisibleIndex = 7;
+            this.gridColumn9.Width = 94;
+            // 
+            // gridColumn10
+            // 
+            this.gridColumn10.Caption = "浣滀笟鏃堕棿";
+            this.gridColumn10.FieldName = "createDate";
+            this.gridColumn10.MinWidth = 25;
+            this.gridColumn10.Name = "gridColumn10";
+            this.gridColumn10.OptionsColumn.ReadOnly = true;
+            this.gridColumn10.Visible = true;
+            this.gridColumn10.VisibleIndex = 8;
+            this.gridColumn10.Width = 94;
+            // 
+            // gridColumn11
+            // 
+            this.gridColumn11.Caption = "瀹為檯閲嶉噺";
+            this.gridColumn11.FieldName = "sjWeight";
+            this.gridColumn11.MinWidth = 25;
+            this.gridColumn11.Name = "gridColumn11";
+            this.gridColumn11.OptionsColumn.ReadOnly = true;
+            this.gridColumn11.Visible = true;
+            this.gridColumn11.VisibleIndex = 9;
+            this.gridColumn11.Width = 94;
+            // 
+            // gridColumn12
+            // 
+            this.gridColumn12.Caption = "閲嶉噺涓婇檺";
+            this.gridColumn12.FieldName = "maxWeight";
+            this.gridColumn12.MinWidth = 25;
+            this.gridColumn12.Name = "gridColumn12";
+            this.gridColumn12.OptionsColumn.ReadOnly = true;
+            this.gridColumn12.Visible = true;
+            this.gridColumn12.VisibleIndex = 10;
+            this.gridColumn12.Width = 94;
+            // 
+            // gridColumn13
+            // 
+            this.gridColumn13.Caption = "閲嶉噺涓嬮檺";
+            this.gridColumn13.FieldName = "minWeight";
+            this.gridColumn13.MinWidth = 25;
+            this.gridColumn13.Name = "gridColumn13";
+            this.gridColumn13.OptionsColumn.ReadOnly = true;
+            this.gridColumn13.Visible = true;
+            this.gridColumn13.VisibleIndex = 11;
+            this.gridColumn13.Width = 94;
+            // 
+            // Frm_Work09
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1040, 511);
+            this.Controls.Add(this.split1);
+            this.Name = "Frm_Work09";
+            this.Text = "绉伴噸閲囬泦";
+            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+            ((System.ComponentModel.ISupportInitialize)(this.split1.Panel1)).EndInit();
+            this.split1.Panel1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.split1.Panel2)).EndInit();
+            this.split1.Panel2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.split1)).EndInit();
+            this.split1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.layoutMx1)).EndInit();
+            this.layoutMx1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.cmbSerialPortNum.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbBaudRate.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtNum.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtMsg.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbBaudRate1111)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem6)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem5)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.gcMx1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.gvMx1)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private DevExpress.XtraEditors.SplitContainerControl split1;
+        private DevExpress.XtraDataLayout.DataLayoutControl layoutMx1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraEditors.ComboBoxEdit cmbSerialPortNum;
+        private DevExpress.XtraEditors.ComboBoxEdit cmbBaudRate;
+        private DevExpress.XtraEditors.TextEdit txtNum;
+        private DevExpress.XtraEditors.SimpleButton button1;
+        private DevExpress.XtraGrid.GridControl gcMx1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gvMx1;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn1;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn2;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn3;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn4;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn5;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn6;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn8;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn9;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn10;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn11;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn12;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn13;
+        private DevApp.UserControl.UcLookWorkline comLine;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraEditors.MemoEdit txtMsg;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem cmbBaudRate1111;
+        private DevExpress.XtraEditors.SimpleButton button2;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem6;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem5;
+    }
+}
diff --git a/DevApp/Gs.WeightLine/Form1.cs b/DevApp/Gs.WeightLine/Form1.cs
new file mode 100644
index 0000000..4acabbe
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Form1.cs
@@ -0,0 +1,356 @@
+锘縰sing Gs.WeightIqc.ToolBox;
+using Microsoft.Win32;
+using Newtonsoft.Json;
+using NModbus;
+using NModbus.Serial;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Configuration;
+using System.Data;
+using System.Drawing;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+
+namespace Gs.WeightLine
+{
+    public partial class Form1 : DevExpress.XtraEditors.XtraForm
+    {
+        string _webServiceName = "WorkWeight/";
+        public System.IO.Ports.SerialPort Sp = new System.IO.Ports.SerialPort();
+        public delegate void HandleInterfaceUpdataDelegate(string text);
+        private Form1.HandleInterfaceUpdataDelegate interfaceUpdataHandle;
+        private Dictionary<string, Thread> dicThread = new Dictionary<string, Thread>();
+        private System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
+
+        System.Timers.Timer timerGridview = new System.Timers.Timer(10000);
+        public Form1()
+        {
+            InitializeComponent();
+            GetComList();
+            comLine.getSuppler("");
+            #region MyRegion
+            int int32 = 10000;
+            string _vanishingSeconds = ConfigurationManager.AppSettings["TimingMailInterval"];
+            if (!string.IsNullOrEmpty(_vanishingSeconds))
+                int32 = int.Parse(_vanishingSeconds);
+            this.timer1.Interval = int32;
+            this.button1.Enabled = true;
+            this.button2.Enabled = false;
+            this.comLine.IsReadly = false;
+            this.cmbSerialPortNum.Enabled = true;
+            this.cmbBaudRate.Enabled = true;
+            this.cmbBaudRate.SelectedIndex = 1;
+            #endregion
+            this.timer1.Tick += (s, e) =>
+            {
+                if (this.dicThread.Keys.Contains<string>("GetWeight"))
+                    return;
+                Thread thread1 = new Thread(new ThreadStart(this.GetWeight));
+                thread1.Start();
+                this.dicThread.Add("GetWeight", thread1);
+            };
+            this.button1.Click += (s, e) =>
+            {
+                string _comLine = comLine.GetId();
+                if (string.IsNullOrEmpty(_comLine))
+                {
+                    MessageBox.Show("璇烽�夋嫨绾夸綋");
+                    this.comLine.Focus();
+                    return;
+                }
+                try
+                {
+                    LogHelper.Debug(this.ToString(), " 寮�濮嬮噰闆�");
+                    if (this.cmbBaudRate.Text.Trim() != "" && this.cmbSerialPortNum.Text != "")
+                    {
+                        LogHelper.Debug(this.ToString(), "閰嶇疆涓插彛閫氫俊");
+                        this.interfaceUpdataHandle = new Form1.HandleInterfaceUpdataDelegate(this.UpdateTextBox);
+                        this.Sp.PortName = this.cmbSerialPortNum.Text.Trim();
+                        this.Sp.BaudRate = Convert.ToInt32(this.cmbBaudRate.Text.Trim());
+                        this.Sp.Parity = Parity.None;
+                        this.Sp.StopBits = StopBits.One;
+                        LogHelper.Debug(this.ToString(), "鎵撳紑涓插彛鍚岄�氫俊");
+                        this.Sp.Open();
+                        this.button1.Enabled = false;
+                        this.button2.Enabled = true;
+                        this.timer1.Enabled = false;
+                        this.comLine.IsReadly = true;
+                        this.cmbSerialPortNum.Enabled = false;
+                        this.cmbBaudRate.Enabled = false;
+                        LogHelper.Debug(this.ToString(), "鍚姩鍒锋柊鏁版嵁瀹氭椂鍣�");
+                        this.timer1.Start();
+                    }
+                    else
+                    {
+                        LogHelper.Debug(this.ToString(), "璇疯緭鍏ユ纭殑涓插彛鍙峰拰娉㈢壒鐜�");
+                        int num = (int)MessageBox.Show("璇疯緭鍏ユ纭殑涓插彛鍙峰拰娉㈢壒鐜囷紒");
+                        this.cmbSerialPortNum.Focus();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.Debug(this.ToString(), ex.Message);
+                    int num = (int)MessageBox.Show($"涓插彛{this.cmbSerialPortNum.Text.Trim()}鎵撳紑澶辫触锛亄ex.Message}");
+                }
+            };
+            this.button2.Click += (s, e) =>
+            {
+                try
+                {
+                    if (this.dicThread.Keys.Contains<string>("GetWeight"))
+                    {
+                        Thread thread = this.dicThread["GetWeight"];
+                        if (thread.IsAlive)
+                            thread.Abort();
+                        this.dicThread.Remove("GetWeight");
+                    }
+                    this.button1.Enabled = true;
+                    this.button2.Enabled = false;
+                    this.comLine.IsReadly = false;
+                    this.cmbSerialPortNum.Enabled = true;
+                    this.cmbBaudRate.Enabled = true;
+                    this.timer1.Stop();
+                    this.Sp.Close();
+                }
+                catch (Exception ex)
+                {
+                    //int num = (int)MessageBox.Show(ex.Message);
+                    //Application.Exit();
+                    MessageBox.Show(ex.Message);
+                    LogHelper.Debug(this.ToString(), ex.Message);
+                }
+            };
+            this.FormClosing += (s, e) =>
+            {
+                if (Sp.IsOpen)
+                    Sp.Close();
+                if (timer1 != null)
+                {
+                    timer1.Stop();
+                    timer1.Dispose();
+                }
+                if (timerGridview != null)
+                {
+                    timerGridview.Stop();
+                    timerGridview.Dispose();
+                }
+                try
+                {
+                    if (this.dicThread.Keys.Contains<string>("GetWeight"))
+                    {
+                        Thread thread = this.dicThread["GetWeight"];
+                        if (thread.IsAlive)
+                            thread.Abort();
+                        this.dicThread.Remove("GetWeight");
+                    }
+                    this.timer1.Stop();
+                    this.Sp.Close();
+                }
+                catch (Exception ex)
+                {
+                    //int num = (int)MessageBox.Show(ex.Message);
+                    //Application.Exit();
+                    MessageBox.Show(ex.Message);
+                }
+            };
+            #region gridview璁剧疆
+            timerGridview.Elapsed += (s, e) =>
+            {
+                string _lineId = comLine.GetId();
+                if (string.IsNullOrEmpty(_lineId))
+                    return;
+                var _obj = new
+                {
+                    lineId = _lineId,
+                };
+                try
+                {
+                    var strReturn = UtilityHelper.HttpPost("", _webServiceName + "GetModelList", JsonConvert.SerializeObject(_obj), false);
+                    var dd = UtilityHelper.ReturnToList(strReturn);
+                    var dt = dd.rtnData;
+                    BeginInvoke(new Action(() =>
+                    {
+                        gcMx1.BindingContext = new BindingContext();
+                        gcMx1.DataSource = dt;
+                        gcMx1.ForceInitialize();
+                        gvMx1.BestFitColumns();
+                    }));
+                    BeginInvoke(new Action(() =>
+                    {
+                        this.txtMsg.Text = "鏈�杩戝埛鏂板垪琛ㄦ椂闂�:" + DateTime.Now.ToString();
+                    }));
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show("gvMx1:" + ex.Message);
+                }
+            };
+            timerGridview.AutoReset = true; // 璁剧疆涓簍rue琛ㄧず閲嶅鎵ц锛宖alse琛ㄧず鎵ц涓�娆″悗鍋滄
+            timerGridview.Enabled = true; // 寮�濮嬭鏃�
+            gvMx1.OptionsFind.ShowSearchNavButtons = false;
+            gvMx1.OptionsView.ShowAutoFilterRow = false;
+            gvMx1.OptionsView.ShowGroupPanel = false;
+            gvMx1.RowStyle += (s, e) =>
+            {
+                //榛樿閫変腑琛屼笉鍙樿壊
+                gvMx1.OptionsSelection.EnableAppearanceFocusedRow = false;
+                //榛樿閫変腑鍗曞厓鏍间笉鍙樿壊
+                gvMx1.OptionsSelection.EnableAppearanceFocusedCell = false;
+                if (e.RowHandle >= 0)
+                {
+                    DataRow row = gvMx1.GetDataRow(e.RowHandle);
+                    if (row == null)
+                        return;
+                    string colorString = row["bgColor"].ToString(); // 浣跨敤鍗佸叚杩涘埗琛ㄧず棰滆壊鐨凙RGB鍊�
+                    Color color = ColorTranslator.FromHtml(colorString);
+                    e.Appearance.BackColor = color;
+                }
+            };
+            gvMx1.IndicatorWidth = 60;
+            gvMx1.CustomDrawRowIndicator += (s, e) =>
+            {
+                if (e.Info.IsRowIndicator && e.RowHandle >= 0)
+                    e.Info.DisplayText = (e.RowHandle + 1).ToString();
+            };
+            #endregion
+        }
+
+        /// <summary>
+        /// 鑾峰彇閲嶉噺
+        /// </summary>
+        public void GetWeight()
+        {
+            ModbusFactory factory = new ModbusFactory();
+            LogHelper.Debug(this.ToString(), "GetWeight鍒涘缓modbus瀵硅薄");
+            IModbusMaster rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp);
+            bool flag = true;
+            while (true)
+            {
+                //addModel("1", "2");
+                //ToolBox.LogHelper.Debug(this.ToString(), "GetWeight鍒涘缓modbus瀵硅薄");
+                try
+                {
+                    if (!this.Sp.IsOpen)
+                    {
+                        LogHelper.Debug(this.ToString(), "GetWeight 閲嶆柊鎵撳紑涓插彛杩炴帴");
+                        this.Sp.Open();
+                        rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp);
+                    }
+                    if (rtuMaster == null)
+                    {
+                        LogHelper.Debug(this.ToString(), "GetWeight 閲嶆柊鍒涘缓modbus瀵硅薄2");
+                        rtuMaster = (IModbusMaster)factory.CreateRtuMaster(this.Sp);
+                    }
+                    byte slaveAddress3 = byte.Parse("1");
+                    ushort startAddress3 = ushort.Parse("0002");
+                    ushort numberOfPoints1 = ushort.Parse("2");
+                    ushort[] numArray = rtuMaster.ReadHoldingRegisters(slaveAddress3, startAddress3, numberOfPoints1);
+                    float single = BitConverter.ToSingle(this.CombomBinaryArray(BitConverter.GetBytes(numArray[1]), BitConverter.GetBytes(numArray[0])), 0);
+                    this.Invoke((Delegate)this.interfaceUpdataHandle, (object)single.ToString());
+                    byte slaveAddress4 = byte.Parse("1");
+                    ushort startAddress4 = ushort.Parse("0001");
+                    ushort numberOfPoints2 = ushort.Parse("1");
+                    int int32 = Convert.ToInt32(rtuMaster.ReadHoldingRegisters(slaveAddress4, startAddress4, numberOfPoints2)[0].ToString());
+                    string str = Convert.ToString(int32, 2).PadLeft(16 /*0x10*/, '0');
+                    char ch1 = str[1];
+                    char ch2 = str[6];
+                    if (ch1 == '0' && ch2 == '0')
+                    {
+                        flag = true;
+                    }
+                    else if (flag)
+                    {
+                        flag = false;
+                    }
+                    addModel(single.ToString(), int32.ToString());
+                    LogHelper.Debug(this.ToString(), "single:" + single.ToString() + ",flag:" + flag.ToString() + ",int32:" + int32.ToString());
+                    Thread.Sleep(2000);
+                }
+                catch (Exception ex)
+                {
+                    Thread.Sleep(2000);
+                }
+            }
+        }
+        /// <summary>
+        /// 涓婁紶绉伴噸鏁版嵁
+        /// </summary>
+        /// <param name="_realWeight">鎴彇鍚庣殑鏁伴噺</param>
+        /// <param name="_realWeightTxt">鍘熷瓙涓�</param>
+        private void addModel(string _realWeight, string _realWeightTxt)
+        {
+            string _lineId = comLine.GetId();
+            var _obj = new
+            {
+                lineId = _lineId,
+                realWeight = _realWeight.Trim(),
+                realWeightTxt = _realWeightTxt.Trim(),
+            };
+            try
+            {
+                string strJson = UtilityHelper.HttpPost("", "WorkWeight/EditModel", JsonConvert.SerializeObject(_obj));
+                ReturnModel<dynamic> _rtn = UtilityHelper.ReturnToDynamic(strJson);
+                if (_rtn.rtnCode <= 0)
+                {
+                    LogHelper.Debug(this.ToString(), "WorkWeight/EditModel:" + strJson);
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Debug(this.ToString(), ex.Message);
+            }
+        }
+
+
+        /// <summary>
+        /// 鏇存柊UI
+        /// </summary>
+        /// <param name="text"></param>
+
+        private void UpdateTextBox(string text)
+        {
+            try
+            {
+                this.txtMsg.Text = "鏈�杩戣幏鍙栫О閲嶆椂闂�:" + DateTime.Now.ToString();
+                if (this.txtNum.Text == text)
+                    return;
+                this.txtNum.Text = text;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Debug(this.ToString(), ex.Message);
+            }
+        }
+
+        private void GetComList()
+        {
+            this.cmbSerialPortNum.Clear();
+            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
+            if (registryKey == null)
+                return;
+            foreach (string valueName in registryKey.GetValueNames())
+            {
+                string description = (string)registryKey.GetValue(valueName);
+                cmbSerialPortNum.Properties.Items.Add(description);
+            }
+            if (this.cmbSerialPortNum.Properties.Items.Count > 0)
+                this.cmbSerialPortNum.SelectedIndex = 0;
+        }
+
+        private byte[] CombomBinaryArray(byte[] srcArray1, byte[] srcArray2)
+        {
+            byte[] destinationArray = new byte[srcArray1.Length + srcArray2.Length];
+            Array.Copy((Array)srcArray1, 0, (Array)destinationArray, 0, srcArray1.Length);
+            Array.Copy((Array)srcArray2, 0, (Array)destinationArray, srcArray1.Length, srcArray2.Length);
+            return destinationArray;
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/Form1.resx b/DevApp/Gs.WeightLine/Form1.resx
new file mode 100644
index 0000000..7fecd05
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Form1.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"></xsd:import>
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="type" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="mimetype" type="xsd:string"></xsd:attribute>
+              <xsd:attribute ref="xml:space"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="name" type="xsd:string"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"></xsd:attribute>
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"></xsd:attribute>
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"></xsd:attribute>
+              <xsd:attribute ref="xml:space"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/Gs.WeightLine.csproj b/DevApp/Gs.WeightLine/Gs.WeightLine.csproj
new file mode 100644
index 0000000..1f57b0c
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Gs.WeightLine.csproj
@@ -0,0 +1,122 @@
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9B6D4E64-C711-4856-BFA7-C746CEC2B0F8}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Gs.WeightLine</RootNamespace>
+    <AssemblyName>Gs.WeightLine</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="DevExpress.BonusSkins.v22.2" />
+    <Reference Include="DevExpress.Data.Desktop.v22.2" />
+    <Reference Include="DevExpress.Data.v22.2" />
+    <Reference Include="DevExpress.Utils.v22.2" />
+    <Reference Include="DevExpress.Sparkline.v22.2.Core" />
+    <Reference Include="DevExpress.XtraEditors.v22.2" />
+    <Reference Include="DevExpress.Printing.v22.2.Core" />
+    <Reference Include="DevExpress.Drawing.v22.2" />
+    <Reference Include="DevExpress.XtraGrid.v22.2, Version=22.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
+    <Reference Include="DevExpress.XtraLayout.v22.2, Version=22.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+    <Reference Include="DevExpress.XtraPrinting.v22.2, Version=22.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="NModbus, Version=3.0.81.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\NModbus.3.0.81\lib\net46\NModbus.dll</HintPath>
+    </Reference>
+    <Reference Include="NModbus.Serial, Version=3.0.81.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\NModbus.Serial.3.0.81\lib\net46\NModbus.Serial.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ToolBox\LogHelper.cs" />
+    <Compile Include="ToolBox\PageQueryModel.cs" />
+    <Compile Include="ToolBox\ReturnModel.cs" />
+    <Compile Include="ToolBox\UtilityHelper.cs" />
+    <Compile Include="UcLookWorkline.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UcLookWorkline.Designer.cs">
+      <DependentUpon>UcLookWorkline.cs</DependentUpon>
+    </Compile>
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\licenses.licx" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <EmbeddedResource Include="UcLookWorkline.resx">
+      <DependentUpon>UcLookWorkline.cs</DependentUpon>
+    </EmbeddedResource>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/Program.cs b/DevApp/Gs.WeightLine/Program.cs
new file mode 100644
index 0000000..aec47fe
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Program.cs
@@ -0,0 +1,24 @@
+锘縰sing DevExpress.LookAndFeel;
+using DevExpress.Skins;
+using DevExpress.UserSkins;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace Gs.WeightLine
+{
+    internal static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightLine/Properties/AssemblyInfo.cs b/DevApp/Gs.WeightLine/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..02b66e6
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Properties/AssemblyInfo.cs
@@ -0,0 +1,32 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Gs.WeightLine")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Gs.WeightLine")]
+[assembly: AssemblyCopyright("Copyright 漏  2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9006f149-aa49-4b8e-ba69-386d945fa738")]
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/DevApp/Gs.WeightLine/Properties/Resources.Designer.cs b/DevApp/Gs.WeightLine/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..1bcd93f
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18034
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Gs.WeightLine.Properties
+{
+
+
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Gs.WeightLine.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightLine/Properties/Resources.resx b/DevApp/Gs.WeightLine/Properties/Resources.resx
new file mode 100644
index 0000000..901f10d
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Properties/Resources.resx
@@ -0,0 +1,117 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="type" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="mimetype" type="xsd:string"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="name" type="xsd:string"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1"></xsd:attribute>
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"></xsd:attribute>
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/Properties/Settings.Designer.cs b/DevApp/Gs.WeightLine/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..a395bf1
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18034
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Gs.WeightLine.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightLine/Properties/Settings.settings b/DevApp/Gs.WeightLine/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘�<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
diff --git a/DevApp/Gs.WeightLine/Properties/licenses.licx b/DevApp/Gs.WeightLine/Properties/licenses.licx
new file mode 100644
index 0000000..a339441
--- /dev/null
+++ b/DevApp/Gs.WeightLine/Properties/licenses.licx
@@ -0,0 +1,2 @@
+DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v22.2, Version=22.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
+DevExpress.XtraEditors.SearchLookUpEdit, DevExpress.XtraGrid.v22.2, Version=22.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
diff --git a/DevApp/Gs.WeightLine/ToolBox/LogHelper.cs b/DevApp/Gs.WeightLine/ToolBox/LogHelper.cs
new file mode 100644
index 0000000..b790769
--- /dev/null
+++ b/DevApp/Gs.WeightLine/ToolBox/LogHelper.cs
@@ -0,0 +1,53 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Gs.WeightIqc.ToolBox
+{
+    public class LogHelper
+    {
+        //鍒涘缓鏃ュ織鐩綍
+        private static readonly string path = AppContext.BaseDirectory +
+                                              ConfigurationManager.AppSettings[
+                                                  "LogPath"];
+
+        /**
+         * 鍚戞棩蹇楁枃浠跺啓鍏ヨ皟璇曚俊鎭�
+         * @param className 绫诲悕
+         * @param content 鍐欏叆鍐呭
+         */
+        public static void Debug(string className, string content)
+        {
+            WriteLog("DEBUG", className, content);
+        }
+
+        /**
+         * 瀹為檯鐨勫啓鏃ュ織鎿嶄綔
+         * @param type 鏃ュ織璁板綍绫诲瀷
+         * @param className 绫诲悕
+         * @param content 鍐欏叆鍐呭
+         */
+        protected static void WriteLog(string type, string className,
+            string content)
+        {
+            if (!Directory.Exists(path)) //濡傛灉鏃ュ織鐩綍涓嶅瓨鍦ㄥ氨鍒涘缓
+                Directory.CreateDirectory(path);
+            var time =
+                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); //鑾峰彇褰撳墠绯荤粺鏃堕棿
+            var filename = path + "/" + DateTime.Now.ToString("yyyy-MM-dd") +
+                           ".log"; //鐢ㄦ棩鏈熷鏃ュ織鏂囦欢鍛藉悕
+            //鍒涘缓鎴栨墦寮�鏃ュ織鏂囦欢锛屽悜鏃ュ織鏂囦欢鏈熬杩藉姞璁板綍
+            var mySw = File.AppendText(filename);
+            //鍚戞棩蹇楁枃浠跺啓鍏ュ唴瀹�
+            var write_content =
+                time + " " + type + " " + className + ": " + content;
+            mySw.WriteLine(write_content);
+            //鍏抽棴鏃ュ織鏂囦欢
+            mySw.Close();
+        }
+    }
+}
diff --git a/DevApp/Gs.WeightLine/ToolBox/PageQueryModel.cs b/DevApp/Gs.WeightLine/ToolBox/PageQueryModel.cs
new file mode 100644
index 0000000..94d1b54
--- /dev/null
+++ b/DevApp/Gs.WeightLine/ToolBox/PageQueryModel.cs
@@ -0,0 +1,73 @@
+锘縩amespace Gs.WeightIqc.ToolBox
+{
+    /// <summary>
+    ///     鏌ヨ瀹炰綋
+    /// </summary>
+    public class PageQueryModel
+    {
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="_currentPage">褰撳墠椤�</param>
+        /// <param name="_everyPageSize">姣忛〉澶у皬</param>
+        /// <param name="_sortName">鎺掑簭鍚�</param>
+        /// <param name="_sortOrder">鎺掑簭鏂瑰紡</param>
+        /// <param name="_keyWord">鏌ヨ鍏抽敭瀛�</param>
+        /// <param name="_keyWhere">鏌ヨ琛ㄨ揪寮� and 寮�澶�</param>
+        /// <param name="_keyType">涓�涓緟鍔╃敤鐨勫叧閿瓧</param>
+        public PageQueryModel(int _currentPage, int _everyPageSize,
+            string _sortName = "create_date", string _sortOrder = "asc",
+            string _keyWord = "", string _keyWhere = "", string _keyType = "")
+        {
+            currentPage = _currentPage;
+            everyPageSize = _everyPageSize;
+            sortName = _sortName;
+            sortOrder = _sortOrder;
+            keyWord = _keyWord;
+            keyWhere = _keyWhere;
+            keyType = _keyType;
+        }
+
+        public PageQueryModel()
+        {
+        }
+
+
+        /// <summary>
+        ///     褰撳墠椤�
+        /// </summary>
+        public int currentPage { get; set; }
+
+        /// <summary>
+        ///     姣忛〉澶у皬
+        /// </summary>
+        public int everyPageSize { get; set; }
+
+        /// <summary>
+        ///     鎺掑簭鍚�
+        /// </summary>
+        public string sortName { get; set; }
+
+        /// <summary>
+        ///     鎺掑簭鏂瑰紡
+        /// </summary>
+        public string sortOrder { get; set; }
+
+        /// <summary>
+        ///     鏌ヨ鍏抽敭瀛�
+        /// </summary>
+        public string keyWord { get; set; }
+
+        /// <summary>
+        ///     鏌ヨ琛ㄨ揪寮�
+        /// </summary>
+        public string keyWhere { get; set; }
+
+
+        /// <summary>
+        /// 涓氬姟绫诲埆
+        /// </summary>
+        public string keyType { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/ToolBox/ReturnModel.cs b/DevApp/Gs.WeightLine/ToolBox/ReturnModel.cs
new file mode 100644
index 0000000..2c1b3c7
--- /dev/null
+++ b/DevApp/Gs.WeightLine/ToolBox/ReturnModel.cs
@@ -0,0 +1,64 @@
+锘縰sing Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Gs.WeightIqc.ToolBox
+{
+    /// <summary>
+    ///     杩斿洖鐨勫鍥寸粨鏋�
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class ReturnModel<T>
+    {
+        /// <summary>
+        ///     Default = -100榛樿, Unauthorized = -101闈炴硶璋冪敤, Exception = -102绯荤粺浠g爜寮傚父, Success
+        ///     = 1鎴愬姛
+        /// </summary>
+        public int rtnCode { set; get; }
+
+        public T rtnData { set; get; }
+        public string rtnMsg { get; set; }
+    }
+
+    /// <summary>
+    ///     杩斿洖鐨勫垎椤佃妭鐐�
+    /// </summary>
+    public class PageListModel
+    {
+        /// <summary>
+        ///     姣忛〉澶у皬
+        /// </summary>
+        public int everyPageSize;
+
+        /// <summary>
+        ///     鎵╁睍鐢紝鍒楄〃
+        /// </summary>
+        public List<dynamic> extendList;
+
+        /// <summary>
+        ///     鎵╁睍鐢紝鍗曟枃鏈紝姣斿閲戦鍚堣绛夊叾瀹冮」鐩�
+        /// </summary>
+        public string extendText;
+
+        /// <summary>
+        ///     鎬婚〉鏁�
+        /// </summary>
+        public int pages;
+
+        /// <summary>
+        ///     鎬昏褰曟暟
+        /// </summary>
+        public int total;
+
+        /// <summary>
+        ///     鍒楄〃
+        /// </summary>
+        public DataTable list { get; set; }
+ 
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/ToolBox/UtilityHelper.cs b/DevApp/Gs.WeightLine/ToolBox/UtilityHelper.cs
new file mode 100644
index 0000000..f7ecb42
--- /dev/null
+++ b/DevApp/Gs.WeightLine/ToolBox/UtilityHelper.cs
@@ -0,0 +1,151 @@
+锘縰sing Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Cache;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Gs.WeightIqc.ToolBox
+{
+    public class UtilityHelper
+    {
+        private static readonly string WebApiUrl =
+          ConfigurationManager.AppSettings["WebApiUrl"];
+
+        /// <summary>
+        /// http璇锋眰
+        /// </summary>
+        /// <param name="url">api鏍瑰湴鍧�</param>
+        /// <param name="meth">鏂规硶鍚嶇О</param>
+        /// <param name="param">json鍙傛暟</param>
+        /// <param name="isLoading">鏄惁loading</param>
+        /// <returns></returns>
+        public static string HttpPost(string url, string meth, string param, bool isLoading = true)
+        {
+            HttpWebRequest request = null;
+            StreamWriter requestStream = null;
+            WebResponse response = null;
+            string responseStr = null;
+            try
+            {
+                if (string.IsNullOrEmpty(url))
+                    url = WebApiUrl;
+                url += meth;
+                request = (HttpWebRequest)WebRequest.Create(url);
+                request.Method = "POST";
+                request.ContentType = "application/json";
+                request.Headers.Add("token", GetBasicAuthTicket());
+                request.Accept = "*/*";
+                request.Timeout = 150000;
+                request.AllowAutoRedirect = false;
+                request.ServicePoint.Expect100Continue = false;
+                HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
+                request.CachePolicy = noCachePolicy;
+                requestStream = new StreamWriter(request.GetRequestStream());
+                requestStream.Write(param);
+                requestStream.Close();
+                response = request.GetResponse();
+                if (response != null)
+                {
+                    var reader = new StreamReader(response.GetResponseStream(),
+                        Encoding.UTF8);
+                    responseStr = reader.ReadToEnd();
+                    //File.WriteAllText(Server.MapPath("~/") + @"\test.txt", responseStr); 
+                    reader.Close();
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Debug(url, param + ":" + ex.Message);
+                throw ex;
+            }
+            finally
+            {
+                request = null;
+                requestStream = null;
+                response = null;
+            }
+            return responseStr;
+        }
+
+
+        /// <summary>
+        ///     鐢熸垚璁块棶鏈嶅姟鐨則oken
+        /// </summary>
+        /// <returns></returns>
+        public static string GetBasicAuthTicket()
+        {
+            var userGuid = "11111111-1111-1111-1111-111111111111";
+            var token = userGuid;
+            return token;
+        }
+
+        /// <summary>
+        ///     鏈嶅姟杩斿洖鐨刯son杩斿洖ReturnModel锛�
+        /// </summary>
+        /// <param name="strReturn"></param>
+        /// <returns></returns>
+        public static ReturnModel<dynamic> ReturnToDynamic(string strReturn)
+        {
+            var rto = new ReturnModel<dynamic>();
+            var json = JObject.Parse(strReturn);
+            rto.rtnCode = int.Parse(json["rtnCode"].ToString());
+            rto.rtnMsg = json["rtnMsg"].ToString();
+            rto.rtnData = json["rtnData"];
+            return rto;
+        }
+        /// <summary>
+        ///     鏈嶅姟杩斿洖鐨刯son涓茶繑鍥濺eturnModel-->浠呬粎鏈塴ist,涓嶅垎椤碉紝
+        /// </summary>
+        /// <param name="strReturn"></param>
+        /// <returns></returns>
+        public static ReturnModel<DataTable> ReturnToList(string strReturn)
+        {
+            var rto = new ReturnModel<DataTable>();
+            var json = JObject.Parse(strReturn);
+            rto.rtnCode = int.Parse(json["rtnCode"].ToString());
+            rto.rtnMsg = json["rtnMsg"].ToString();
+            rto.rtnData = new DataTable();
+            var array = new JArray();
+            var d = json["rtnData"];
+            foreach (var a in d) array.Add(a);
+            //if (array.Count <=0)
+            //    return null;
+            var dt = JsonConvert.DeserializeObject<DataTable>(array.ToString());
+            rto.rtnData = dt;
+            return rto;
+        }
+        /// <summary>
+        ///     鏈嶅姟杩斿洖鐨刯son杞负ReturnModel-->鍖呭惈TablePage鍒嗛〉锛�
+        /// </summary>
+        /// <param name="strReturn"></param>
+        /// <returns></returns>
+        public static ReturnModel<PageListModel> ReturnToTablePage(
+            string strReturn)
+        {
+            var rto = new ReturnModel<PageListModel>();
+            var json = JObject.Parse(strReturn);
+            rto.rtnCode = int.Parse(json["rtnCode"].ToString());
+            rto.rtnMsg = json["rtnMsg"].ToString();
+            rto.rtnData = new PageListModel();
+            rto.rtnData.pages = int.Parse(json["rtnData"]["pages"].ToString());
+            rto.rtnData.total = int.Parse(json["rtnData"]["total"].ToString());
+            rto.rtnData.everyPageSize =
+                int.Parse(json["rtnData"]["everyPageSize"].ToString());
+            var array = new JArray();
+            var d = json["rtnData"]["list"];
+            foreach (var a in d) array.Add(a);
+            var dt = JsonConvert.DeserializeObject<DataTable>(array.ToString());
+            rto.rtnData.list = dt;
+            return rto;
+        }
+
+
+    }
+}
diff --git a/DevApp/Gs.WeightLine/UcLookWorkline.Designer.cs b/DevApp/Gs.WeightLine/UcLookWorkline.Designer.cs
new file mode 100644
index 0000000..097d534
--- /dev/null
+++ b/DevApp/Gs.WeightLine/UcLookWorkline.Designer.cs
@@ -0,0 +1,121 @@
+锘縩amespace Gs.DevApp.UserControl
+{
+    partial class UcLookWorkline
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.lookSearchSupplier = new DevExpress.XtraEditors.SearchLookUpEdit();
+            this.searchLookUpEdit1View = new DevExpress.XtraGrid.Views.Grid.GridView();
+            this.gridColumn1 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn2 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn3 = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.gridColumn4 = new DevExpress.XtraGrid.Columns.GridColumn();
+            ((System.ComponentModel.ISupportInitialize)(this.lookSearchSupplier.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.searchLookUpEdit1View)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // lookSearchSupplier
+            // 
+            this.lookSearchSupplier.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lookSearchSupplier.Location = new System.Drawing.Point(0, 0);
+            this.lookSearchSupplier.Name = "lookSearchSupplier";
+            this.lookSearchSupplier.Properties.Appearance.Options.UseFont = true;
+            this.lookSearchSupplier.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
+            this.lookSearchSupplier.Properties.PopupView = this.searchLookUpEdit1View;
+            this.lookSearchSupplier.Size = new System.Drawing.Size(278, 24);
+            this.lookSearchSupplier.TabIndex = 8;
+            // 
+            // searchLookUpEdit1View
+            // 
+            this.searchLookUpEdit1View.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] {
+            this.gridColumn1,
+            this.gridColumn2,
+            this.gridColumn3,
+            this.gridColumn4});
+            this.searchLookUpEdit1View.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
+            this.searchLookUpEdit1View.Name = "searchLookUpEdit1View";
+            this.searchLookUpEdit1View.OptionsSelection.EnableAppearanceFocusedCell = false;
+            this.searchLookUpEdit1View.OptionsView.ShowGroupPanel = false;
+            // 
+            // gridColumn1
+            // 
+            this.gridColumn1.Caption = "浜х嚎ID";
+            this.gridColumn1.FieldName = "id";
+            this.gridColumn1.Name = "gridColumn1";
+            this.gridColumn1.Visible = true;
+            this.gridColumn1.VisibleIndex = 0;
+            // 
+            // gridColumn2
+            // 
+            this.gridColumn2.Caption = "浜х嚎缂栧彿";
+            this.gridColumn2.FieldName = "lineNo";
+            this.gridColumn2.MinWidth = 80;
+            this.gridColumn2.Name = "gridColumn2";
+            this.gridColumn2.Visible = true;
+            this.gridColumn2.VisibleIndex = 1;
+            this.gridColumn2.Width = 80;
+            // 
+            // gridColumn3
+            // 
+            this.gridColumn3.Caption = "浜х嚎鍚嶇О";
+            this.gridColumn3.FieldName = "name";
+            this.gridColumn3.MinWidth = 100;
+            this.gridColumn3.Name = "gridColumn3";
+            this.gridColumn3.Visible = true;
+            this.gridColumn3.VisibleIndex = 2;
+            this.gridColumn3.Width = 100;
+            // 
+            // gridColumn4
+            // 
+            this.gridColumn4.Caption = "guid";
+            this.gridColumn4.FieldName = "guid";
+            this.gridColumn4.Name = "gridColumn4";
+            // 
+            // UcLookWorkline
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.lookSearchSupplier);
+            this.Name = "UcLookWorkline";
+            this.Size = new System.Drawing.Size(278, 27);
+            ((System.ComponentModel.ISupportInitialize)(this.lookSearchSupplier.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.searchLookUpEdit1View)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DevExpress.XtraEditors.SearchLookUpEdit lookSearchSupplier;
+        private DevExpress.XtraGrid.Views.Grid.GridView searchLookUpEdit1View;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn2;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn3;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn4;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn1;
+    }
+}
diff --git a/DevApp/Gs.WeightLine/UcLookWorkline.cs b/DevApp/Gs.WeightLine/UcLookWorkline.cs
new file mode 100644
index 0000000..88f3ba9
--- /dev/null
+++ b/DevApp/Gs.WeightLine/UcLookWorkline.cs
@@ -0,0 +1,99 @@
+锘�
+using Gs.WeightIqc.ToolBox;
+using Newtonsoft.Json;
+using System;
+using System.Data;
+
+namespace Gs.DevApp.UserControl
+{
+    public partial class UcLookWorkline : DevExpress.XtraEditors.XtraUserControl
+    {
+        public UcLookWorkline()
+        {
+            InitializeComponent();
+            lookSearchSupplier.Properties.NullText = "璇烽�夋嫨";
+            lookSearchSupplier.EditValueChanged += LookSearchSupplier_EditValueChanged;
+        }
+
+        private bool _rdy; public bool IsReadly { set { _rdy = value; this.lookSearchSupplier.ReadOnly = _rdy; } get { return _rdy; } }
+
+        /// <summary>
+        ///     鏀瑰彉浜嬩欢
+        /// </summary>
+        public event EventHandler EditChanged;
+
+        private void LookSearchSupplier_EditValueChanged(object sender,
+            EventArgs e)
+        {
+            if (EditChanged != null) EditChanged(this, e);
+        }
+        /// <summary>
+        /// 璇诲彇绾夸綋
+        /// </summary>
+        /// <param name="shopGuid"></param>
+        public void getSuppler(string shopGuid, string _dftVale = "")
+        {
+            lookSearchSupplier.EditValue = null;
+            string _sbSqlWhere = "";
+            if (!string.IsNullOrEmpty(shopGuid))
+                _sbSqlWhere = " and a.dpt_id=" + shopGuid;
+            var pgq = new PageQueryModel(1, 999999, "org.FNumber asc ,c.departmentcode asc,a.line_no",
+            "asc", "", _sbSqlWhere.ToString());
+            var json = JsonConvert.SerializeObject(pgq);
+            try
+            {
+                var strReturn = UtilityHelper.HttpPost("",
+                    "MesWorkshopLineManager/GetListPage", json);
+                var dd = UtilityHelper.ReturnToTablePage(strReturn);
+                DataTable dt = dd.rtnData.list;
+                lookSearchSupplier.Properties.DataSource = dt;
+                lookSearchSupplier.Properties.DisplayMember = "name";
+                lookSearchSupplier.Properties.ValueMember = "id";
+                lookSearchSupplier.Properties.BestFitMode = DevExpress.XtraEditors.Controls.BestFitMode.BestFitResizePopup;
+                if (!string.IsNullOrEmpty(_dftVale))
+                    SetIdOrCode(_dftVale);
+            }
+            catch (Exception ex)
+            {
+               // MsgHelper.Warning("鎻愮ず锛�" + ex.Message);
+            }
+        }
+
+        public string GetId()
+        {
+            var row = lookSearchSupplier.GetSelectedDataRow() as DataRowView;
+            if (row != null)
+            {
+                string id = row["id"].ToString();
+                return id;
+            }
+            return "";
+        }
+        public string GetCode()
+        {
+            var row = lookSearchSupplier.GetSelectedDataRow() as DataRowView;
+            if (row != null)
+            {
+                string id = row["lineNo"].ToString();
+                return id;
+            }
+            return "";
+        }
+        public string GetName()
+        {
+            var name = lookSearchSupplier.Text.Trim();
+            return name;
+        }
+
+        public void SetIdOrCode(string Code)
+        {
+            if (Code == "-1")
+            {
+                lookSearchSupplier.EditValue = null;
+                return;
+            }
+            if (!string.IsNullOrEmpty(Code))
+                lookSearchSupplier.EditValue = Int64.Parse(((Code.ToString().Trim())));
+        }
+    }
+}
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/UcLookWorkline.resx b/DevApp/Gs.WeightLine/UcLookWorkline.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/DevApp/Gs.WeightLine/UcLookWorkline.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/DevApp/Gs.WeightLine/packages.config b/DevApp/Gs.WeightLine/packages.config
new file mode 100644
index 0000000..6365bbc
--- /dev/null
+++ b/DevApp/Gs.WeightLine/packages.config
@@ -0,0 +1,6 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
+  <package id="NModbus" version="3.0.81" targetFramework="net48" />
+  <package id="NModbus.Serial" version="3.0.81" targetFramework="net48" />
+</packages>
\ No newline at end of file
diff --git a/DevApp/GsDevSolution.sln b/DevApp/GsDevSolution.sln
index d90da1b..14d4b61 100644
--- a/DevApp/GsDevSolution.sln
+++ b/DevApp/GsDevSolution.sln
@@ -5,6 +5,10 @@
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gs.DevApp", "Gs.DevApp\Gs.DevApp.csproj", "{A7EB5F78-699E-4514-8905-30842765E673}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gs.WeightIqc", "Gs.WeightIqc\Gs.WeightIqc.csproj", "{31ED2821-04C4-4A4A-B794-E4972BBB4810}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gs.WeightLine", "Gs.WeightLine\Gs.WeightLine.csproj", "{9B6D4E64-C711-4856-BFA7-C746CEC2B0F8}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -15,6 +19,14 @@
 		{A7EB5F78-699E-4514-8905-30842765E673}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A7EB5F78-699E-4514-8905-30842765E673}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{A7EB5F78-699E-4514-8905-30842765E673}.Release|Any CPU.Build.0 = Release|Any CPU
+		{31ED2821-04C4-4A4A-B794-E4972BBB4810}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{31ED2821-04C4-4A4A-B794-E4972BBB4810}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{31ED2821-04C4-4A4A-B794-E4972BBB4810}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{31ED2821-04C4-4A4A-B794-E4972BBB4810}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9B6D4E64-C711-4856-BFA7-C746CEC2B0F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9B6D4E64-C711-4856-BFA7-C746CEC2B0F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9B6D4E64-C711-4856-BFA7-C746CEC2B0F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9B6D4E64-C711-4856-BFA7-C746CEC2B0F8}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

--
Gitblit v1.9.3