|
|
@@ -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>
|