callm 21 часов назад
Родитель
Сommit
6cbcd39cd7

+ 6 - 3
UAS_MES_YDCY/.workbuddy/memory/2026-09-10.md

@@ -32,10 +32,13 @@
 
 `sncode_KeyDown` Enter 分支(保留「SN 非空 + 工序类型已选」两个限制)之后:
 
-1. `select ms_id,ms_craftcode,ms_prodcode from makeserial where ms_sncode='<SN>'` → 取 `msId` / `craftCode` / `prodCode`。
+1. `select ms_id,ms_craftcode,ms_prodcode,ms_nextstepcode from makeserial where ms_sncode='<SN>'` → 取 `msId` / `craftCode` / `prodCode` / `nextStepCode`。
 2. `select cd_stepcode from craft left join craftdetail on cd_crid=cr_id where cr_code='<craftCode>' and cr_prodcode='<prodCode>' and CD_STEPTYPE='<STP_CODE>' order by cd_detno` → 第一行即 `cd_detno` 最小的 `cd_stepcode`。
-3. 回写:`update makeserial set ms_nextstepcode='<cdStepCode>' where ms_id='<msId>'`(`ExecuteSql(..., "update")`,与仓库 `Make_ColorBoxWeigh` 等既有写法一致)。
-4. 结果存入字段 `cdStepCode` 并输出到 OperateResult。
+3. **中间工序未完成校验**:查 `craftdetail a`,`cd_crid` 取工艺头,`a.cd_detno` 落在 `ms_nextstepcode` 的 cd_detno 与本次 `cd_stepcode` 的 cd_detno 之间,且 `nvl(a.cd_ifjump,0)=0`(必须完成、不可跳站);命中则不更新,提示 `中间工序未完成,下一工序是<ms_nextstepcode>(<st_name>)`(工序名称同样取自 `step` 表)。
+4. 关联 `step` 表取工序名称:`select st_name from step where st_code='<cdStepCode>'`(`step.st_code` ↔ `craftdetail.cd_stepcode`);查不到时名称为空串,不阻断流程。
+5. 回写:`update makeserial set ms_nextstepcode='<cdStepCode>' where ms_id='<msId>'`(`ExecuteSql(..., "update")`,与仓库 `Make_ColorBoxWeigh` 等既有写法一致)。
+6. 结果存入字段 `cdStepCode` 并输出到 OperateResult,提示形如 `<<SN001执行测试工序,下一工序为OP20(测试)`。
+7. `cd_ifjump` 是本仓库无既有引用的字段(用户定义):`nvl(cd_ifjump,0)=0` 即不可跳站。取比较基准 cd_detno 的子查询加了 `and rownum=1`,避免同一 `cd_crid` 下工序编号重复导致 ORA-01427;查询不使用 `rownum` 做外层过滤,保证多行校验有效。
 
 关联关系已确认:`craftdetail.cd_crid = craft.cr_id`;`craft.cr_code = makeserial.ms_craftcode and craft.cr_prodcode = makeserial.ms_prodcode`(与 `LogicHandler.cs:716` 现有写法一致)。
 

+ 32 - 5
UAS_MES_YDCY/FunctionCode/Make/Make_StepType.cs

@@ -19,10 +19,11 @@ namespace UAS_MES_NEW.Make
         //查询结果:craftdetail 中 cd_detno 最小的 cd_stepcode
         string cdStepCode = "";
 
-        //查询结果:makeserial 中的主键、工艺编号与产品编号
+        //查询结果:makeserial 中的主键、工艺编号、产品编号与当前下一工序
         string msId = "";
         string craftCode = "";
         string prodCode = "";
+        string nextStepCode = "";
 
         public Make_StepType()
         {
@@ -91,8 +92,8 @@ namespace UAS_MES_NEW.Make
 
             string sn = sncode.Text.Trim();
 
-            //一、按序列号取 makeserial 的主键、工艺编号与产品编号
-            DataTable dtSn = (DataTable)dh.ExecuteSql("select ms_id,ms_craftcode,ms_prodcode from makeserial where ms_sncode='" + sn + "'", "select");
+            //一、按序列号取 makeserial 的主键、工艺编号、产品编号与当前下一工序
+            DataTable dtSn = (DataTable)dh.ExecuteSql("select ms_id,ms_craftcode,ms_prodcode,ms_nextstepcode from makeserial where ms_sncode='" + sn + "'", "select");
             if (dtSn.Rows.Count == 0)
             {
                 OperateResult.AppendText("<<" + sn + "不存在\n", Color.Red, sncode);
@@ -103,6 +104,7 @@ namespace UAS_MES_NEW.Make
             msId = dtSn.Rows[0]["ms_id"].ToString();
             craftCode = dtSn.Rows[0]["ms_craftcode"].ToString();
             prodCode = dtSn.Rows[0]["ms_prodcode"].ToString();
+            nextStepCode = dtSn.Rows[0]["ms_nextstepcode"].ToString();
 
             //二、按工艺编号+产品编号+工序类型取 craftdetail 明细,cd_detno 升序取第一条即最小的 cd_stepcode
             DataTable dtStep = (DataTable)dh.ExecuteSql("select cd_stepcode from craft left join craftdetail on cd_crid=cr_id where cr_code='" + craftCode + "' and cr_prodcode='" + prodCode + "' and CD_STEPTYPE='" + stepTypeCode + "' order by cd_detno", "select");
@@ -116,10 +118,35 @@ namespace UAS_MES_NEW.Make
             }
             cdStepCode = dtStep.Rows[0]["cd_stepcode"].ToString();
 
-            //三、把查到的工序编号回写到 makeserial 的下道工序字段(用主键 ms_id 更新)
+            //三、检查 makeserial.ms_nextstepcode 到本次查到的工序之间是否存在未跳站的中间工序
+            //    cd_detno 落在两者之间 nvl(cd_ifjump,0)=0 的记录即为必须完成却未完成的工序
+            if (nextStepCode != "")
+            {
+                DataTable dtJump = (DataTable)dh.ExecuteSql("select a.cd_detno,a.cd_stepcode from craftdetail a where a.cd_crid=(select cr_id from craft where cr_code='" + craftCode + "' and cr_prodcode='" + prodCode + "')"
+                    + " and a.cd_detno>(select b.cd_detno from craftdetail b where b.cd_crid=a.cd_crid and b.cd_stepcode='" + nextStepCode + "' and rownum=1)"
+                    + " and a.cd_detno<(select c.cd_detno from craftdetail c where c.cd_crid=a.cd_crid and c.cd_stepcode='" + cdStepCode + "' and rownum=1)"
+                    + " and nvl(a.cd_ifjump,0)=0"
+                    + " order by a.cd_detno", "select");
+                if (dtJump.Rows.Count > 0)
+                {
+                    //取 ms_nextstepcode 对应的工序名称一并在提示中给出
+                    DataTable dtNextName = (DataTable)dh.ExecuteSql("select st_name from step where st_code='" + nextStepCode + "'", "select");
+                    string nextStepName = dtNextName.Rows.Count > 0 ? dtNextName.Rows[0]["st_name"].ToString() : "";
+                    OperateResult.AppendText("<<" + sn + "中间工序未完成,下一工序是" + nextStepCode + "(" + nextStepName + ")\n", Color.Red, sncode);
+                    sncode.Clear();
+                    sncode.Focus();
+                    return;
+                }
+            }
+
+            //四、关联 step 表取下一工序名称
+            DataTable dtStepName = (DataTable)dh.ExecuteSql("select st_name from step where st_code='" + cdStepCode + "'", "select");
+            string stepName = dtStepName.Rows.Count > 0 ? dtStepName.Rows[0]["st_name"].ToString() : "";
+
+            //五、把查到的工序编号回写到 makeserial 的下道工序字段(用主键 ms_id 更新)
             dh.ExecuteSql("update makeserial set ms_nextstepcode='" + cdStepCode + "' where ms_id='" + msId + "'", "update");
 
-            OperateResult.AppendText("<<" + sn + "执行" + stepTypeName + ",下一工序为" + cdStepCode + "\n", Color.Green, sncode);
+            OperateResult.AppendText("<<" + sn + "执行" + stepTypeName + ",下一工序为" + cdStepCode + "(" + stepName + ")\n", Color.Green, sncode);
             sncode.Clear();
             sncode.Focus();
         }