فهرست منبع

优化标签打印功能

callm 4 روز پیش
والد
کامیت
08595ec5f7
2فایلهای تغییر یافته به همراه89 افزوده شده و 32 حذف شده
  1. 9 0
      UAS_MES_YDCY/.workbuddy/memory/2026-10-29.md
  2. 80 32
      UAS_MES_YDCY/PublicMethod/Print.cs

+ 9 - 0
UAS_MES_YDCY/.workbuddy/memory/2026-10-29.md

@@ -22,3 +22,12 @@
 - 取消备品**不要求点选明细料号行**(与采集不同),不需要 PDID;已出库拦截沿用外层公共判断。
 - `serBtn_Click` 的 spareBtn 提示按 `cancel.Checked` 区分:取消模式提示「请扫描需取消的备品序列号」。
 - 自检:括号平衡 209/209、925/925、272/272 ✅。
+
+## Print.cs 标签参数赋值性能优化
+- 原代码:`for 行(≤1000) × for 变量` 双层循环,每对 (j,k) 都跨 COM/interop 取一次变量 Name 再 `ToUpper()` 比较 → 10 万次级跨进程调用。
+- 优化:行值先一次性取到 `string[] paramValues`,再**只遍历一遍变量**,变量名按后缀反查行号:
+  - 名 == `lp_name`(忽略大小写)→ paramValues[0](原 j==0 分支);
+  - 名以 lp_name 开头且后缀是数字(排除前导 0,保持原「lp_name+(j+1)」永不匹配 X01 的行为)→ `int.TryParse` 后 1..LoopTime 内 → paramValues[行号-1]。
+- 复杂度 O(行×变量) → O(变量+行)。
+- Print.cs 里同一模式有 4 份拷贝(2 处 BarTender 用 `format.SubStrings`、2 处 CodeSoft 用 `doc.Variables.FormVariables.Item(k+1)`),已全部替换(+80/-32)。
+- 自检:括号平衡 90/90、254/254、68/68 ✅;旧循环 `j == 0 &` 残留 0。

+ 80 - 32
UAS_MES_YDCY/PublicMethod/Print.cs

@@ -82,18 +82,30 @@ namespace UAS_MES_NEW.PublicMethod
                     if (Param.Rows.Count > 0)
                     {
                         int LoopTime = Param.Rows.Count > 1000 ? 1000 : Param.Rows.Count;
+                        //优化:原双层循环是 行数×变量数 次跨进程取 Name 再做大小写比较,数据行多时很慢;
+                        //改为先把行值一次性取出,再只遍历一遍变量,按变量名后缀编号反查行号赋值
+                        string lpNameUpper = dt.Rows[i]["lp_name"].ToString().ToUpper();
+                        string[] paramValues = new string[LoopTime];
                         for (int j = 0; j < LoopTime; j++)
                         {
-                            for (int k = 0; k < doc.Variables.FormVariables.Count; k++)
+                            paramValues[j] = Param.Rows[j][0].ToString();
+                        }
+                        for (int k = 0; k < doc.Variables.FormVariables.Count; k++)
+                        {
+                            string subNameUpper = doc.Variables.FormVariables.Item(k + 1).Name.ToUpper();
+                            //无编号参数:取第一行
+                            if (subNameUpper == lpNameUpper)
                             {
-                                if (j == 0 & doc.Variables.FormVariables.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper())
-                                {
-                                    doc.Variables.FormVariables.Item(k + 1).Value = Param.Rows[0][0].ToString();
-                                }
-                                //使用SN开头的参数赋值SN1,SN2,SN3等参数
-                                if (doc.Variables.FormVariables.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j + 1))
+                                doc.Variables.FormVariables.Item(k + 1).Value = paramValues[0];
+                            }
+                            //使用SN开头的参数赋值SN1,SN2,SN3等参数:变量名后缀是行号+1
+                            else if (subNameUpper.Length > lpNameUpper.Length && subNameUpper.StartsWith(lpNameUpper)
+                                && subNameUpper[lpNameUpper.Length] != '0')
+                            {
+                                int rowNo;
+                                if (int.TryParse(subNameUpper.Substring(lpNameUpper.Length), out rowNo) && rowNo >= 1 && rowNo <= LoopTime)
                                 {
-                                    doc.Variables.FormVariables.Item(k + 1).Value = Param.Rows[j][0].ToString();
+                                    doc.Variables.FormVariables.Item(k + 1).Value = paramValues[rowNo - 1];
                                 }
                             }
                         }
@@ -185,18 +197,30 @@ namespace UAS_MES_NEW.PublicMethod
                     if (Param.Rows.Count > 0)
                     {
                         int LoopTime = Param.Rows.Count > 1000 ? 1000 : Param.Rows.Count;
+                        //优化:原双层循环是 行数×变量数 次跨进程取 Name 再做大小写比较,数据行多时很慢;
+                        //改为先把行值一次性取出,再只遍历一遍变量,按变量名后缀编号反查行号赋值
+                        string lpNameUpper = dt.Rows[i]["lp_name"].ToString().ToUpper();
+                        string[] paramValues = new string[LoopTime];
                         for (int j = 0; j < LoopTime; j++)
                         {
-                            for (int k = 0; k < doc.Variables.FormVariables.Count; k++)
+                            paramValues[j] = Param.Rows[j][0].ToString();
+                        }
+                        for (int k = 0; k < doc.Variables.FormVariables.Count; k++)
+                        {
+                            string subNameUpper = doc.Variables.FormVariables.Item(k + 1).Name.ToUpper();
+                            //无编号参数:取第一行
+                            if (subNameUpper == lpNameUpper)
                             {
-                                if (j == 0 & doc.Variables.FormVariables.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper())
-                                {
-                                    doc.Variables.FormVariables.Item(k + 1).Value = Param.Rows[0][0].ToString();
-                                }
-                                //使用SN开头的参数赋值SN1,SN2,SN3等参数
-                                if (doc.Variables.FormVariables.Item(k + 1).Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j + 1))
+                                doc.Variables.FormVariables.Item(k + 1).Value = paramValues[0];
+                            }
+                            //使用SN开头的参数赋值SN1,SN2,SN3等参数:变量名后缀是行号+1
+                            else if (subNameUpper.Length > lpNameUpper.Length && subNameUpper.StartsWith(lpNameUpper)
+                                && subNameUpper[lpNameUpper.Length] != '0')
+                            {
+                                int rowNo;
+                                if (int.TryParse(subNameUpper.Substring(lpNameUpper.Length), out rowNo) && rowNo >= 1 && rowNo <= LoopTime)
                                 {
-                                    doc.Variables.FormVariables.Item(k + 1).Value = Param.Rows[j][0].ToString();
+                                    doc.Variables.FormVariables.Item(k + 1).Value = paramValues[rowNo - 1];
                                 }
                             }
                         }
@@ -314,18 +338,30 @@ namespace UAS_MES_NEW.PublicMethod
                             return false;
                         }
                         int LoopTime = Param.Rows.Count > 1000 ? 1000 : Param.Rows.Count;
+                        //优化:原双层循环是 行数×变量数 次跨进程取 Name 再做大小写比较,数据行多时很慢;
+                        //改为先把行值一次性取出,再只遍历一遍变量,按变量名后缀编号反查行号赋值
+                        string lpNameUpper = dt.Rows[i]["lp_name"].ToString().ToUpper();
+                        string[] paramValues = new string[LoopTime];
                         for (int j = 0; j < LoopTime; j++)
                         {
-                            for (int k = 0; k < format.SubStrings.Count; k++)
+                            paramValues[j] = Param.Rows[j][0].ToString();
+                        }
+                        for (int k = 0; k < format.SubStrings.Count; k++)
+                        {
+                            string subNameUpper = format.SubStrings[k].Name.ToUpper();
+                            //无编号参数:取第一行
+                            if (subNameUpper == lpNameUpper)
                             {
-                                if (j == 0 & format.SubStrings[k].Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper())
-                                {
-                                    format.SubStrings[k].Value = Param.Rows[0][0].ToString();
-                                }
-                                //使用SN开头的参数赋值SN1,SN2,SN3等参数
-                                if (format.SubStrings[k].Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j + 1))
+                                format.SubStrings[k].Value = paramValues[0];
+                            }
+                            //使用SN开头的参数赋值SN1,SN2,SN3等参数:变量名后缀是行号+1
+                            else if (subNameUpper.Length > lpNameUpper.Length && subNameUpper.StartsWith(lpNameUpper)
+                                && subNameUpper[lpNameUpper.Length] != '0')
+                            {
+                                int rowNo;
+                                if (int.TryParse(subNameUpper.Substring(lpNameUpper.Length), out rowNo) && rowNo >= 1 && rowNo <= LoopTime)
                                 {
-                                    format.SubStrings[k].Value = Param.Rows[j][0].ToString();
+                                    format.SubStrings[k].Value = paramValues[rowNo - 1];
                                 }
                             }
                         }
@@ -431,18 +467,30 @@ namespace UAS_MES_NEW.PublicMethod
                     if (Param.Rows.Count > 0)
                     {
                         int LoopTime = Param.Rows.Count > 1000 ? 1000 : Param.Rows.Count;
+                        //优化:原双层循环是 行数×变量数 次跨进程取 Name 再做大小写比较,数据行多时很慢;
+                        //改为先把行值一次性取出,再只遍历一遍变量,按变量名后缀编号反查行号赋值
+                        string lpNameUpper = dt.Rows[i]["lp_name"].ToString().ToUpper();
+                        string[] paramValues = new string[LoopTime];
                         for (int j = 0; j < LoopTime; j++)
                         {
-                            for (int k = 0; k < format.SubStrings.Count; k++)
+                            paramValues[j] = Param.Rows[j][0].ToString();
+                        }
+                        for (int k = 0; k < format.SubStrings.Count; k++)
+                        {
+                            string subNameUpper = format.SubStrings[k].Name.ToUpper();
+                            //无编号参数:取第一行
+                            if (subNameUpper == lpNameUpper)
                             {
-                                if (j == 0 & format.SubStrings[k].Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper())
-                                {
-                                    format.SubStrings[k].Value = Param.Rows[0][0].ToString();
-                                }
-                                //使用SN开头的参数赋值SN1,SN2,SN3等参数
-                                if (format.SubStrings[k].Name.ToUpper() == dt.Rows[i]["lp_name"].ToString().ToUpper() + (j + 1))
+                                format.SubStrings[k].Value = paramValues[0];
+                            }
+                            //使用SN开头的参数赋值SN1,SN2,SN3等参数:变量名后缀是行号+1
+                            else if (subNameUpper.Length > lpNameUpper.Length && subNameUpper.StartsWith(lpNameUpper)
+                                && subNameUpper[lpNameUpper.Length] != '0')
+                            {
+                                int rowNo;
+                                if (int.TryParse(subNameUpper.Substring(lpNameUpper.Length), out rowNo) && rowNo >= 1 && rowNo <= LoopTime)
                                 {
-                                    format.SubStrings[k].Value = Param.Rows[j][0].ToString();
+                                    format.SubStrings[k].Value = paramValues[rowNo - 1];
                                 }
                             }
                         }