SourceCode/Bond/Servo/ProcessJob.h
@@ -8,6 +8,16 @@
#include <chrono>
#include <optional>
struct PJWarp {
    BOOL addToCj;
    void* pj;
    int port;
    BOOL checkSlot[8];
    int material[8];
};
namespace SERVO {
    /// PJ 生命周期(贴近 E40 常见状态)
    enum class PJState : uint8_t {
@@ -49,8 +59,9 @@
    }
     */
    struct CarrierSlotInfo {
        std::string carrierId;              // CARRIERID
        std::vector<uint8_t> slots;        // SLOTID[]
        std::string carrierId;          // CARRIERID
        std::vector<uint8_t> slots;     // SLOTID[]
        std::vector<void*> contexts;    // Glass
    };
    /// 简单资源视图接口:供 Validate() 查询(由设备端实现者在外部提供)
@@ -85,14 +96,17 @@
    class CProcessJob {
    public:
        // —— 构造 / 基本设置 ——
        CProcessJob();
        explicit CProcessJob(std::string pjId);
        const std::string& id() const noexcept { return m_pjId; }
        void setId(std::string& id);
        const std::string& parentCjId() const noexcept { return m_parentCjId; }
        PJState state() const noexcept { return m_state; }
        StartPolicy startPolicy() const noexcept { return m_startPolicy; }
        RecipeMethod recipeMethod() const noexcept { return m_recipeMethod; }
        const std::string& recipeSpec() const noexcept { return m_recipeSpec; } // PPID 或 Spec
        std::string getStateText();
        // 绑定父 CJ
        void setParentCjId(std::string cjId);
@@ -118,7 +132,8 @@
        };
        // 返回问题清单(空=通过)
        bool validate(const IResourceView& rv);
        const std::vector<ValidationIssue>& issue();
        const std::vector<ValidationIssue>& issues() const;
        void addIssue(uint32_t code, const std::string& msg);
        // —— 状态机(带守卫)——
        bool queue();           // NoState -> Queued
@@ -127,7 +142,7 @@
        bool pause();           // InProcess -> Paused
        bool resume();          // Paused -> InProcess
        bool complete();        // InProcess -> Completed
        bool abort();           // Any (未终态) -> Aborted
        bool abort(std::string reason);           // Any (未终态) -> Aborted
        bool fail(std::string reason); // 任意态 -> Failed(记录失败原因)
        // —— 访问器(用于上报/查询)——
@@ -150,12 +165,26 @@
        // 追加一个载具
        void addCarrier(std::string carrierId, std::vector<uint8_t> slots);
        // 设置载具slots和contexts
        bool setCarrierSlotsAndContexts(std::string carrierId, std::vector<uint8_t> slots, std::vector<void*> contexts);
        bool setCarrierContexts(std::string carrierId, std::vector<void*> contexts);
        // 访问器
        const std::vector<CarrierSlotInfo>& carriers() const noexcept { return m_carriers; }
        CarrierSlotInfo* getCarrier(const std::string& strId);
        // 判定是否“按载具/卡位”方式
        bool usesCarrierSlots() const noexcept { return !m_carriers.empty(); }
    public:
        // ====== 版本头常量(建议保留,便于兼容)======
        static constexpr uint32_t PJ_FILE_MAGIC = 0x504A4A31; // "PJJ1"
        static constexpr uint16_t PJ_FILE_VERSION = 0x0001;
        // ====== 流式序列化接口 ======
        void serialize(std::ostream& os) const;
        static bool deserialize(std::istream& is, CProcessJob& out, std::string* err = nullptr);
    private:
        // 内部状态转移帮助
@@ -197,6 +226,22 @@
        // 错误列表
        std::vector<ValidationIssue> m_issues;
        // 新增
        std::string m_strLotId;
        std::string m_strProductId;
        std::string m_strOperationId;
        PJWarp m_pjWarp;
    public:
        void setLotId(std::string strLotId);
        std::string& getLotId();
        void setProductId(std::string strProductId);
        std::string& getProductId();
        void setOperationId(std::string strOperationId);
        std::string& getOperationId();
        void setPjWarp(PJWarp pjWarp);
        PJWarp& getPjWarp();
    };
}