Browse Source

优化机型绑定

callm 1 month ago
parent
commit
ff414a31c2
1 changed files with 124 additions and 29 deletions
  1. 124 29
      UAS_MES_ZKLH/FunctionCode/Query/Query_SOP.cs

+ 124 - 29
UAS_MES_ZKLH/FunctionCode/Query/Query_SOP.cs

@@ -80,39 +80,48 @@ namespace UAS_MES_NEW.Query
             //}
             if (JPG.Checked)
             {
-                ps_prodcode.Text = FilePath.Text.Substring(FilePath.Text.LastIndexOf(@"\") + 1).Replace(".xls", "").Replace(".xlsx", "");
+                ps_prodcode.Text = GetProdCodeFromFileName(FilePath.Text.Substring(FilePath.Text.LastIndexOf(@"\") + 1).Replace(".xls", "").Replace(".xlsx", ""));
+                OperatResult.AppendText("解析SOP编号: " + ps_prodcode.Text + "\n");
                 pr_code_Leave(new object(), new EventArgs());
+                Workbook workbook = new Workbook(FilePath.Text);
+                string pnTools = GetPnToolsFromExcel(workbook);
+                if (pnTools == "")
+                {
+                    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)
+                if (dt.Rows.Count > 0)
                 {
-                    string code = LogicHandler.GetPiInoutCode("ProductSOP", "1");
-                    ps_code.Text = code;
-                    if (VaildDate.Checked)
-                    {
-                        dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode,ps_vailddate,ps_prcode)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING',to_date('" + DateCode.Value.ToString("yyyy-MM-dd") + "','yyyy-mm-dd'),'" + pr_code.Text + "')", "insert");
-                    }
-                    else
+                    // 已存在相同SOP编号:先删除原明细和主表数据,后面重新插入
+                    for (int d = 0; d < dt.Rows.Count; d++)
                     {
-                        dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode,ps_prcode)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING','" + pr_code.Text + "')", "insert");
+                        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");
                     }
+                    OperatResult.AppendText("已删除原SOP编号【" + ps_prodcode.Text + "】的旧数据,重新插入\n");
+                }
+                string code = LogicHandler.GetPiInoutCode("ProductSOP", "1");
+                ps_code.Text = code;
+                if (VaildDate.Checked)
+                {
+                    dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode,ps_vailddate,ps_prcode)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING',to_date('" + DateCode.Value.ToString("yyyy-MM-dd") + "','yyyy-mm-dd'),'" + pnTools + "')", "insert");
                 }
                 else
                 {
-                    string ps_id = dt.Rows[0]["ps_id"].ToString();
-                    dh.ExecuteSql("delete from ProductSOPdetail where psd_psid='" + ps_id + "'", "delete");
-                    ps_prodcode.Text = dt.Rows[0]["ps_prodcode"].ToString();
+                    dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode,ps_prcode)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING','" + pnTools + "')", "insert");
                 }
-                Workbook workbook = new Workbook(FilePath.Text);
                 List<Worksheet> list = new List<Worksheet>();
                 List<string> filename = new List<string>();
 
                 if (VaildDate.Checked)
                 {
-                    dh.ExecuteSql("update ProductSOP set ps_attachsop='',ps_inman='" + User.UserName + "',ps_vailddate=to_date('" + DateCode.Value.ToString("yyyy-MM-dd") + "','yyyy-mm-dd') where ps_prodcode='" + ps_prodcode.Text + "'", "update");
+                    dh.ExecuteSql("update ProductSOP set ps_attachsop='',ps_inman='" + User.UserName + "',ps_prcode='" + pnTools + "',ps_vailddate=to_date('" + DateCode.Value.ToString("yyyy-MM-dd") + "','yyyy-mm-dd') where ps_prodcode='" + ps_prodcode.Text + "'", "update");
                 }
                 else
                 {
-                    dh.ExecuteSql("update ProductSOP set ps_attachsop='',ps_inman='" + User.UserName + "' where ps_prodcode='" + ps_prodcode.Text + "'", "update");
+                    dh.ExecuteSql("update ProductSOP set ps_attachsop='',ps_inman='" + User.UserName + "',ps_prcode='" + pnTools + "' where ps_prodcode='" + ps_prodcode.Text + "'", "update");
                 }
 
                 OperatResult.AppendText("一共Sheet: " + workbook.Worksheets.Count + "\n");
@@ -353,27 +362,30 @@ namespace UAS_MES_NEW.Query
             }
             else if (PDF.Checked)
             {
-                ps_prodcode.Text = FilePath.Text.Substring(FilePath.Text.LastIndexOf(@"\") + 1).Replace(".pdf", "");
+                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)
+                if (dt.Rows.Count > 0)
                 {
-                    string code = LogicHandler.GetPiInoutCode("ProductSOP", "1");
-                    ps_code.Text = code;
-                    if (VaildDate.Checked)
-                    {
-                        dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode,ps_vailddate)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING',to_date('" + DateCode.Value.ToString("yyyy-MM-dd") + "','yyyy-mm-dd'))", "insert");
-                    }
-                    else
+                    // 已存在相同SOP编号:先删除原明细和主表数据,后面重新插入
+                    for (int d = 0; d < dt.Rows.Count; d++)
                     {
-                        dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING')", "insert");
+                        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");
                     }
+                    OperatResult.AppendText("已删除原SOP编号【" + ps_prodcode.Text + "】的旧数据,重新插入\n");
+                }
+                string code = LogicHandler.GetPiInoutCode("ProductSOP", "1");
+                ps_code.Text = code;
+                if (VaildDate.Checked)
+                {
+                    dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode,ps_vailddate)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING',to_date('" + DateCode.Value.ToString("yyyy-MM-dd") + "','yyyy-mm-dd'))", "insert");
                 }
                 else
                 {
-                    string psid = dt.Rows[0]["ps_id"].ToString();
-                    dh.ExecuteSql("delete from ProductSOPdetail where psd_psid='" + psid + "'", "delete");
-                    ps_prodcode.Text = dt.Rows[0]["ps_prodcode"].ToString();
+                    dh.ExecuteSql("insert into productsop(ps_id,ps_code,ps_prodcode,ps_indate,ps_inman,ps_status,ps_statuscode)values(productsop_seq.nextval,'" + code + "','" + ps_prodcode.Text + "',sysdate,'" + User.UserName + "','在录入','ENTERING')", "insert");
                 }
                 if (VaildDate.Checked)
                 {
@@ -394,6 +406,89 @@ namespace UAS_MES_NEW.Query
             }
         }
 
+        /// <summary>
+        /// 从文件名中截取中间的SOP编号
+        /// 例如:(R1)WI-LC-31-544 冷端热端铜柱焊接组件检漏作业指导书x  →  WI-LC-31-544
+        /// 匹配不到编号时返回原文件名
+        /// </summary>
+        private string GetProdCodeFromFileName(string fileName)
+        {
+            if (string.IsNullOrEmpty(fileName))
+            {
+                return "";
+            }
+            fileName = fileName.Trim();
+            System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(
+                fileName, "[A-Za-z0-9]+(?:-[A-Za-z0-9]+)+");
+            if (m.Success)
+            {
+                return m.Value;
+            }
+            return fileName;
+        }
+
+        /// <summary>
+        /// 从Excel中查找标题为PN/TOOLS的列,收集该列标题下方所有非空内容,去重后用逗号拼接返回
+        /// </summary>
+        private string GetPnToolsFromExcel(Workbook workbook)
+        {
+            List<string> values = new List<string>();
+            for (int i = 0; i < workbook.Worksheets.Count; i++)
+            {
+                Worksheet she = workbook.Worksheets[i];
+                Cells cells = she.Cells;
+                int maxRow = cells.MaxDataRow;
+                int maxCol = cells.MaxDataColumn;
+                int headerCol = -1;
+                int headerRow = -1;
+                // 1. 先在单元格中查找PN/TOOLS标题
+                for (int r = 0; r <= maxRow && headerCol < 0; r++)
+                {
+                    for (int c = 0; c <= maxCol; c++)
+                    {
+                        object val = cells[r, c].Value;
+                        if (val == null) continue;
+                        string text = val.ToString().Trim().ToUpper();
+                        if (text.Contains("PN/TOOLS") || text.Contains("PN/TOOLS"))
+                        {
+                            headerCol = c;
+                            headerRow = r;
+                            break;
+                        }
+                    }
+                }
+                // 2. 单元格中没找到时,尝试从形状(文本框)标题中定位列
+                if (headerCol < 0)
+                {
+                    for (int s = 0; s < she.Shapes.Count; s++)
+                    {
+                        string shapeText;
+                        try { shapeText = she.Shapes[s].Text; }
+                        catch { continue; }
+                        if (shapeText != null && shapeText.Trim().ToUpper().Contains("PN/TOOLS"))
+                        {
+                            headerCol = she.Shapes[s].UpperLeftColumn;
+                            headerRow = she.Shapes[s].UpperLeftRow;
+                            break;
+                        }
+                    }
+                }
+                if (headerCol < 0) continue;
+                // 3. 收集标题下方该列所有非空内容,去重(保持顺序)
+                for (int r = headerRow + 1; r <= Math.Max(maxRow, cells.MaxDataRow); r++)
+                {
+                    object val = cells[r, headerCol].Value;
+                    if (val == null) continue;
+                    string text = val.ToString().Trim();
+                    if (text != "" && !values.Contains(text))
+                    {
+                        values.Add(text);
+                    }
+                }
+            }
+            return string.Join(",", values.ToArray());
+        }
+
         /// <summary>
         /// 请求上传图片到阿里云
         /// </summary>