From 0026ea3b1a6588f3e40b8276162f54b2a22bc7ae Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期一, 19 一月 2026 14:32:27 +0800
Subject: [PATCH] 1.修复 : 多 PJ 支持仍是单槽实现:isProcessJobsEmpty/validate 仍只允许 1 个 PJ/CJ;Host 一次下多 PJ 或运行中追加 PJ 会被拒绝/无明确反馈。需要:协议上明示只支持 1,或补齐 ACK/NAK 与队列管理、PJobSpace 动态更新。

---
 SourceCode/Bond/Servo/ProcessJob.h   |    1 +
 SourceCode/Bond/Servo/ProcessJob.cpp |    9 +++++----
 SourceCode/Bond/Servo/Model.cpp      |   17 +++++++++++++++++
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/SourceCode/Bond/Servo/Model.cpp b/SourceCode/Bond/Servo/Model.cpp
index 61f3a80..6882783 100644
--- a/SourceCode/Bond/Servo/Model.cpp
+++ b/SourceCode/Bond/Servo/Model.cpp
@@ -354,6 +354,23 @@
 		for (auto p : pjs) {
 			LOGI("<Model>onPRJobMultiCreate %s %s", p->id().c_str(), p->recipeSpec().c_str());
 		}
+
+		auto rejectAll = [&](uint32_t code, const std::string& msg) -> int {
+			LOGW("<Model>onPRJobMultiCreate rejected: %s", msg.c_str());
+			for (auto p : pjs) {
+				if (p != nullptr) p->addIssue(code, msg);
+			}
+			return -1;
+		};
+
+		// 鍗� PJ 妯″紡锛氬彧鎺ュ彈 1 鏉′笖褰撳墠鏃犲湪鍒� PJ
+		if (pjs.size() != 1) {
+			return rejectAll(1200, "Only 1 ProcessJob supported (single-PJ mode)");
+		}
+		if (!m_master.isProcessJobsEmpty()) {
+			return rejectAll(1201, "ProcessJob exists, cannot create new in single-PJ mode");
+		}
+
 		int nRet = m_master.setProcessJobs(pjs);
 		auto processJobs = m_master.getProcessJobs();
 		std::vector<SERVO::CVariable> vars;
diff --git a/SourceCode/Bond/Servo/ProcessJob.cpp b/SourceCode/Bond/Servo/ProcessJob.cpp
index 184b298..eb92df5 100644
--- a/SourceCode/Bond/Servo/ProcessJob.cpp
+++ b/SourceCode/Bond/Servo/ProcessJob.cpp
@@ -75,6 +75,11 @@
         return m_issues;
     }
 
+    void CProcessJob::addIssue(uint32_t code, const std::string& msg)
+    {
+        m_issues.push_back({ code, msg });
+    }
+
     bool CProcessJob::validate(const IResourceView& rv)
     {
         m_issues.clear();
@@ -83,10 +88,6 @@
         auto add = [&](uint32_t code, std::string msg) {
             m_issues.push_back({ code, std::move(msg) });
         };
-
-        if (!rv.isProcessJobsEmpty()) {
-            add(1000, "ProcessJobs Conflict!");
-        }
 
         // —— 基本 / 标识 ——
         if (m_pjId.empty())            add(1001, "PJID empty");
diff --git a/SourceCode/Bond/Servo/ProcessJob.h b/SourceCode/Bond/Servo/ProcessJob.h
index bbc8926..576b30a 100644
--- a/SourceCode/Bond/Servo/ProcessJob.h
+++ b/SourceCode/Bond/Servo/ProcessJob.h
@@ -133,6 +133,7 @@
         // 返回问题清单(空=通过)
         bool validate(const IResourceView& rv);
         const std::vector<ValidationIssue>& issues() const;
+        void addIssue(uint32_t code, const std::string& msg);
 
         // —— 状态机(带守卫)——
         bool queue();           // NoState -> Queued

--
Gitblit v1.9.3