LAPTOP-SNT8I5JK\Boounion
2025-08-29 9e25e06d7ec9d7cd1c31a9d30a8a018e2af63e3a
SourceCode/Bond/Servo/CMaster.cpp
@@ -1417,6 +1417,7 @@
               if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
                  CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
                  pGlass->complete();
                  this->saveState();
                  bool bMoved = glassFromInPorcessToComplete(pGlass);
                  if (bMoved) {
                     LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.",
@@ -1433,10 +1434,22 @@
                  // 检查PJ是否已经完成
                  CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext());
                  if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
                     this->saveState();
                     LOGE("<Master>ProcessJob(%s)完成.",
                        pJob->id().c_str());
                     if (m_listener.onPjEnd != nullptr) {
                        m_listener.onPjEnd(this, pJob);
                     }
                     // 检查CJ是否已经完成
                     ASSERT(m_pControlJob);
                     if (checkAndUpdateCjComplete(m_pControlJob)) {
                        this->saveState();
                        LOGE("<Master>ControlJob(%s)完成.",
                           m_pControlJob->id().c_str());
                        if (m_listener.onCjEnd != nullptr) {
                           m_listener.onCjEnd(this, pJob);
                        }
                     }
                  }
               }
@@ -1754,6 +1767,7 @@
            CGlass* pGlass = m_queueGlasses.front();
            pGlass->start();
            glassFromQueueToInPorcess(pGlass);
            this->saveState();
            // 这里上报Panel Start事件
            if (m_listener.onPanelStart != nullptr) {
@@ -1767,6 +1781,7 @@
            CGlass* pGlass = m_inProcesGlasses.front();
            pGlass->complete();
            glassFromInPorcessToComplete(pGlass);
            this->saveState();
            // 这里上报Panel End事件
            if (m_listener.onPanelEnd != nullptr) {
@@ -1775,10 +1790,23 @@
            CProcessJob* pJob = getGlassProcessJob(pGlass);
            if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
               processJobFromInPorcessToComplete(pJob);
               this->saveState();
               LOGE("<Master>ProcessJob(%s)完成.",
                  pJob->id().c_str());
               if (m_listener.onPjEnd != nullptr) {
                  m_listener.onPjEnd(this, pJob);
               }
               // 检查CJ是否已经完成
               ASSERT(m_pControlJob);
               if (checkAndUpdateCjComplete(m_pControlJob)) {
                  this->saveState();
                  LOGE("<Master>ControlJob(%s)完成.",
                     m_pControlJob->id().c_str());
                  if (m_listener.onCjEnd != nullptr) {
                     m_listener.onCjEnd(this, pJob);
                  }
               }
            }
         }
@@ -2483,8 +2511,8 @@
      for (const auto pj : pjs) {
         if (pj->state() == PJState::Queued) {
            pj->start();
            return pj;
         }
         return pj;
      }
@@ -2558,6 +2586,17 @@
      return false;
   }
   bool CMaster::processJobFromInPorcessToComplete(CProcessJob* pProcessJob)
   {
      auto it = std::find(m_inProcesJobs.begin(), m_inProcesJobs.end(), pProcessJob);
      if (it != m_inProcesJobs.end()) {
         m_completeProcessJobs.push_back(*it);
         m_inProcesJobs.erase(it);
         return true;
      }
      return false;
   }
   bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob)
   {
      ASSERT(pJob);
@@ -2566,10 +2605,26 @@
      for (auto c : pJob->carriers()) {
         for (auto g : c.contexts) {
            CGlass* pGlass = (CGlass*)g;
            if (pGlass->state() != GlsState::Aborted
               && pGlass->state() != GlsState::Completed
               && pGlass->state() != GlsState::Failed) return false;
            auto state = ((CGlass*)g)->state();
            if (state != GlsState::Aborted && state != GlsState::Completed
               && state != GlsState::Failed) return false;
         }
      }
      return pJob->complete();
   }
   bool CMaster::checkAndUpdateCjComplete(CControlJob* pJob)
   {
      ASSERT(pJob);
      auto state = pJob->state();
      if (state != CJState::Executing && state != CJState::Paused) return false;
      for (auto pj : pJob->getPjs()) {
         auto state = pj->state();
         if (state != PJState::Aborted && state != PJState::Completed
            && state != PJState::Failed) {
            return false;
         }
      }