Ver código fonte

不允许站点回退

callm 20 horas atrás
pai
commit
1f1156577c

+ 4 - 1
UAS_MES_YDCY/.workbuddy/memory/2026-09-10.md

@@ -34,7 +34,10 @@
 
 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. **中间工序未完成校验**:查 `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` 表)。
+3. **工序顺序校验**(`ms_nextstepcode` 非空时执行,两道,命中即不更新):
+   - 三-1 **回退拦截**:本次 `cd_stepcode` 的 `cd_detno` < `ms_nextstepcode` 的 `cd_detno`(想跳回已过的工序)→ 提示 `下一工序是<ms_nextstepcode>(<st_name>)`。
+   - 三-2 **中间工序未完成**:`craftdetail a` 的 `cd_detno` 落在两者之间且 `nvl(a.cd_ifjump,0)=0`(必须完成、不可跳站)→ 提示 `中间工序未完成,下一工序是<ms_nextstepcode>(<st_name>)`。
+   - 两道提示的工序名称都取自 `step` 表 `st_code=ms_nextstepcode`。
 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(测试)`。

+ 17 - 2
UAS_MES_YDCY/FunctionCode/Make/Make_StepType.cs

@@ -118,10 +118,25 @@ namespace UAS_MES_NEW.Make
             }
             cdStepCode = dtStep.Rows[0]["cd_stepcode"].ToString();
 
-            //三、检查 makeserial.ms_nextstepcode 到本次查到的工序之间是否存在未跳站的中间工序
-            //    cd_detno 落在两者之间 nvl(cd_ifjump,0)=0 的记录即为必须完成却未完成的工序
+            //三、工序顺序校验:本次工序不得回退到 ms_nextstepcode 之前,且两者之间不得夹有未完成的非跳站工序
             if (nextStepCode != "")
             {
+                //三-1、本次工序的 cd_detno 若小于 ms_nextstepcode 对应的 cd_detno(即想跳回已过的工序),不允许更新
+                DataTable dtBack = (DataTable)dh.ExecuteSql("select 1 from craftdetail a where cd_crid=(select cr_id from craft where cr_code='" + craftCode + "' and cr_prodcode='" + prodCode + "')"
+                    + " and cd_stepcode='" + cdStepCode + "' and rownum=1"
+                    + " and cd_detno<(select b.cd_detno from craftdetail b where b.cd_crid=a.cd_crid and b.cd_stepcode='" + nextStepCode + "' and rownum=1)", "select");
+                if (dtBack.Rows.Count > 0)
+                {
+                    DataTable dtNextNameBack = (DataTable)dh.ExecuteSql("select st_name from step where st_code='" + nextStepCode + "'", "select");
+                    string nextStepNameBack = dtNextNameBack.Rows.Count > 0 ? dtNextNameBack.Rows[0]["st_name"].ToString() : "";
+                    OperateResult.AppendText("<<" + sn + "下一工序是" + nextStepCode + "(" + nextStepNameBack + ")\n", Color.Red, sncode);
+                    sncode.Clear();
+                    sncode.Focus();
+                    return;
+                }
+
+                //三-2、检查 makeserial.ms_nextstepcode 到本次查到的工序之间是否存在未跳站的中间工序
+                //    cd_detno 落在两者之间 nvl(cd_ifjump,0)=0 的记录即为必须完成却未完成的工序
                 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)"