Browse Source

优化版本号读取

callm 4 weeks ago
parent
commit
4328d31feb
1 changed files with 54 additions and 19 deletions
  1. 54 19
      UAS_MES_ZKLH/FunctionCode/Query/Query_SOP.cs

+ 54 - 19
UAS_MES_ZKLH/FunctionCode/Query/Query_SOP.cs

@@ -90,17 +90,17 @@ namespace UAS_MES_NEW.Query
                     pnTools = pr_code.Text;
                 }
                 OperatResult.AppendText("解析PN/TOOLS: " + pnTools + "\n");
-                DataTable dt = (DataTable)dh.ExecuteSql("select * from productsop where ps_prodcode='" + ps_prodcode.Text + "' ", "select");
-                if (dt.Rows.Count > 0)
+                // 匹配已存在的旧数据:新旧版本号不同(如(R0)/(R1))、或历史数据存的是完整文件名,都按中间不变的SOP编号(如WI-LC-31-544)来匹配
+                List<string> oldIds = FindDuplicatedSopIds(ps_prodcode.Text);
+                if (oldIds.Count > 0)
                 {
                     // 已存在相同SOP编号:先删除原明细和主表数据,后面重新插入
-                    for (int d = 0; d < dt.Rows.Count; d++)
+                    for (int d = 0; d < oldIds.Count; d++)
                     {
-                        string oldps_id = dt.Rows[d]["ps_id"].ToString();
-                        dh.ExecuteSql("delete from ProductSOPdetail where psd_psid='" + oldps_id + "'", "delete");
-                        dh.ExecuteSql("delete from productsop where ps_id='" + oldps_id + "'", "delete");
+                        dh.ExecuteSql("delete from ProductSOPdetail where psd_psid='" + oldIds[d] + "'", "delete");
+                        dh.ExecuteSql("delete from productsop where ps_id='" + oldIds[d] + "'", "delete");
                     }
-                    OperatResult.AppendText("已删除原SOP编号【" + ps_prodcode.Text + "】的旧数据,重新插入\n");
+                    OperatResult.AppendText("已删除原SOP编号【" + ps_prodcode.Text + "】的旧数据(" + oldIds.Count + "条),重新插入\n");
                 }
                 string code = LogicHandler.GetPiInoutCode("ProductSOP", "1");
                 ps_code.Text = code;
@@ -365,17 +365,17 @@ namespace UAS_MES_NEW.Query
                 ps_prodcode.Text = GetProdCodeFromFileName(FilePath.Text.Substring(FilePath.Text.LastIndexOf(@"\") + 1).Replace(".pdf", ""));
                 OperatResult.AppendText("解析SOP编号: " + ps_prodcode.Text + "\n");
                 pr_code_Leave(new object(), new EventArgs());
-                DataTable dt = (DataTable)dh.ExecuteSql("select * from productsop where ps_prodcode='" + ps_prodcode.Text + "' ", "select");
-                if (dt.Rows.Count > 0)
+                // 匹配已存在的旧数据:新旧版本号不同(如(R0)/(R1))、或历史数据存的是完整文件名,都按中间不变的SOP编号(如WI-LC-31-544)来匹配
+                List<string> oldIds = FindDuplicatedSopIds(ps_prodcode.Text);
+                if (oldIds.Count > 0)
                 {
                     // 已存在相同SOP编号:先删除原明细和主表数据,后面重新插入
-                    for (int d = 0; d < dt.Rows.Count; d++)
+                    for (int d = 0; d < oldIds.Count; d++)
                     {
-                        string oldps_id = dt.Rows[d]["ps_id"].ToString();
-                        dh.ExecuteSql("delete from ProductSOPdetail where psd_psid='" + oldps_id + "'", "delete");
-                        dh.ExecuteSql("delete from productsop where ps_id='" + oldps_id + "'", "delete");
+                        dh.ExecuteSql("delete from ProductSOPdetail where psd_psid='" + oldIds[d] + "'", "delete");
+                        dh.ExecuteSql("delete from productsop where ps_id='" + oldIds[d] + "'", "delete");
                     }
-                    OperatResult.AppendText("已删除原SOP编号【" + ps_prodcode.Text + "】的旧数据,重新插入\n");
+                    OperatResult.AppendText("已删除原SOP编号【" + ps_prodcode.Text + "】的旧数据(" + oldIds.Count + "条),重新插入\n");
                 }
                 string code = LogicHandler.GetPiInoutCode("ProductSOP", "1");
                 ps_code.Text = code;
@@ -407,8 +407,10 @@ namespace UAS_MES_NEW.Query
         }
 
         /// <summary>
-        /// 从文件名中截取中间的SOP编号
-        /// 例如:(R1)WI-LC-31-544 冷端热端铜柱焊接组件检漏作业指导书x  →  WI-LC-31-544
+        /// 从文件名中截取中间不变的SOP编号(忽略版本号)
+        /// 新版本:(R1)WI-LC-31-544 冷端热端铜柱焊接组件检漏作业指导书x
+        /// 旧版本:(R0)WI-LC-31-544 冷端热端铜柱焊接组件检漏作业指导书x
+        /// 两者都取到同一个编号:WI-LC-31-544,按它来匹配是否重复
         /// 匹配不到编号时返回原文件名
         /// </summary>
         private string GetProdCodeFromFileName(string fileName)
@@ -417,14 +419,47 @@ namespace UAS_MES_NEW.Query
             {
                 return "";
             }
-            fileName = fileName.Trim();
+            string name = fileName.Trim();
+            // 1. 去掉版本号,如 (R1)、(R0)、(R1)、(Rev.1),以及开头的 R1- / R0_ 这类写法
+            name = System.Text.RegularExpressions.Regex.Replace(name, @"[((]\s*[Rr](?:[Ee][Vv]?)?\.?\s*\d+\s*[))]", " ");
+            name = System.Text.RegularExpressions.Regex.Replace(name, @"^\s*[Rr](?:[Ee][Vv]?)?\.?\s*\d+\s*[-_\s]+", "");
+            // 2. 取编号形式的字符串:由字母数字和短横线组成,如 WI-LC-31-544
             System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(
-                fileName, "[A-Za-z0-9]+(?:-[A-Za-z0-9]+)+");
+                name, "[A-Za-z0-9]+(?:-[A-Za-z0-9]+)+");
             if (m.Success)
             {
                 return m.Value;
             }
-            return fileName;
+            return name.Trim();
+        }
+
+        /// <summary>
+        /// 按SOP编号查找productsop中已存在的重复数据(返回ps_id列表)
+        /// 兼容两种情况:
+        /// 1. 历史数据存的是完整文件名,如 (R0)WI-LC-31-544 冷端热端铜柱焊接组件检漏作业指导书x
+        /// 2. 已按编号存储的数据,如 WI-LC-31-544
+        /// 只要去掉版本号后中间那段编号与目标编号一致,就视为同一条SOP
+        /// </summary>
+        private List<string> FindDuplicatedSopIds(string prodcode)
+        {
+            List<string> ids = new List<string>();
+            if (string.IsNullOrEmpty(prodcode))
+            {
+                return ids;
+            }
+            // 先用like把可能命中的记录捞出来,再在程序里按编号精确比对,避免 WI-LC-31-5441 这类误匹配
+            DataTable dt = (DataTable)dh.ExecuteSql(
+                "select ps_id,ps_prodcode from productsop where ps_prodcode like '%" + prodcode + "%'", "select");
+            for (int i = 0; i < dt.Rows.Count; i++)
+            {
+                string dbValue = dt.Rows[i]["ps_prodcode"].ToString();
+                if (dbValue.Trim().Equals(prodcode, StringComparison.OrdinalIgnoreCase)
+                    || GetProdCodeFromFileName(dbValue).Equals(prodcode, StringComparison.OrdinalIgnoreCase))
+                {
+                    ids.Add(dt.Rows[i]["ps_id"].ToString());
+                }
+            }
+            return ids;
         }
 
         /// <summary>