#include "MergeEngine.h" using namespace ai_matrix; namespace { //按照x坐标排列 bool CompareX(const SingleData &a, const SingleData &b) { return a.fLTX < b.fLTX; } } MergeEngine::MergeEngine() {} MergeEngine::~MergeEngine() {} APP_ERROR MergeEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; this->baseConfig_ = Config::getins()->getBaseConfig(); this->identifyConfig_ = Config::getins()->getIdentifyConfig(); LogInfo << "MergeEngine Init ok"; return APP_ERR_OK; } APP_ERROR MergeEngine::DeInit() { LogInfo << "MergeEngine DeInit ok"; return APP_ERR_OK; } bool MergeEngine::isSameCarriage(std::shared_ptr pVTrain, const VTrainInfo &train_secondary) { bool isSame = false; for (const VContainer & container : pVTrain->vecContainer) { for (const VContainer & container_second : train_secondary.vecContainer) { if (container.strContainerNo == container_second.strContainerNo) isSame = true; } } if (pVTrain->strTNum == train_secondary.strTNum) isSame = true; return isSame; } void MergeEngine::supplementTrain(std::shared_ptr pVTrain, const VTrainInfo &train_secondary) { if (!this->isSameCarriage(pVTrain, train_secondary)) return; if (pVTrain->strTType.empty() && !train_secondary.strTType.empty()) { pVTrain->strTType = train_secondary.strTType; } if (pVTrain->strTNum.empty() && !train_secondary.strTNum.empty()) { pVTrain->strTNum = train_secondary.strTNum; pVTrain->strTNum_image = train_secondary.strTNum_image; } if (pVTrain->strTLoadWeight.empty() && !train_secondary.strTLoadWeight.empty()) { pVTrain->strTLoadWeight = train_secondary.strTLoadWeight; } if (pVTrain->strTTareWeight.empty() && !train_secondary.strTTareWeight.empty()) { pVTrain->strTTareWeight = train_secondary.strTTareWeight; } if (pVTrain->strTChangeLen.empty() && !train_secondary.strTChangeLen.empty()) { pVTrain->strTChangeLen = train_secondary.strTChangeLen; pVTrain->strTPro_image = train_secondary.strTPro_image; } if (pVTrain->vecContainer.size() == train_secondary.vecContainer.size()) { for (int i = 0; i < pVTrain->vecContainer.size(); ++i) { if (pVTrain->vecContainer[i].strContainerNo.empty() && !train_secondary.vecContainer[i].strContainerNo.empty()) { pVTrain->vecContainer[i].strContainerNo = train_secondary.vecContainer[i].strContainerNo; pVTrain->vecContainer[i].strImg = train_secondary.vecContainer[i].strImg; } } } std::string strContainer, strContainerImage; for (int i = 0; i < pVTrain->vecContainer.size(); i++) { strContainer += pVTrain->vecContainer[i].strContainerNo; strContainerImage += pVTrain->vecContainer[i].strImg; if (i < pVTrain->vecContainer.size() - 1) { strContainer += ","; strContainerImage += ","; } } LogInfo << "\n ===汇总结果=== \n" << "数据源: " << pVTrain->iDataSource << "\n" << "日期时间: " << pVTrain->strTrainDate << " " << pVTrain->strTrainTime << "\n" << "股道: " << pVTrain->strTrackName << "\n" << "行驶方向: " << pVTrain->iTDirection << "\n" << "车厢序号: " << pVTrain->iCarOrder << "\n" << "车型Id: " << pVTrain->iCategory << "\n" << "车型: " << pVTrain->strTType << "\n" << "车号: " << pVTrain->strTNum << "\n" << "载重: " << pVTrain->strTLoadWeight << "\n" << "自重: " << pVTrain->strTTareWeight << "\n" << "容积: " << pVTrain->strTVolume << "\n" << "换长: " << pVTrain->strTChangeLen << "\n" << "编号图片: " << pVTrain->strTNum_image << "\n" << "属性图片: " << pVTrain->strTPro_image << "\n" << "车节开始时间: " << pVTrain->strStartTime << "\n" << "车节结束时间: " << pVTrain->strEndTime << "\n" << "集装箱:" << strContainer << "\n" << "集装箱图片:" << strContainerImage << "\n" << " ---汇总结果 END--- "; } bool MergeEngine::isComplete(std::shared_ptr pVTrain) { if (pVTrain->strTNum.empty()) return false; if (pVTrain->strTType.empty()) return false; if (pVTrain->strTLoadWeight.empty()) return false; if (pVTrain->strTTareWeight.empty()) return false; if (pVTrain->strTChangeLen.empty()) return false; for (const auto & container : pVTrain->vecContainer) { if (container.strContainerNo.empty()) return false; } return true; } APP_ERROR MergeEngine::Process() { int iRet = APP_ERR_OK; while (!isStop_) { std::shared_ptr pVoidData0 = nullptr; inputQueMap_[strPort0_]->pop(pVoidData0); if (pVoidData0 == nullptr) { usleep(1000); continue; } std::shared_ptr pVTrainInfo = std::static_pointer_cast(pVoidData0); if (pVTrainInfo->iDataSource == 0) { this->mapTrain_[pVTrainInfo->iCarOrder] = *pVTrainInfo; if (!this->isComplete(pVTrainInfo)) { std::shared_ptr pMergeSecondaryData = std::make_shared(); pMergeSecondaryData->iCarOrder = pVTrainInfo->iCarOrder; LogInfo << " --- > 发送所需补全的车号:" << pVTrainInfo->iCarOrder; outputQueMap_[strPort1_]->push(std::static_pointer_cast(pMergeSecondaryData), true); // this->mapHavSecondary_[pVTrainInfo->iCarOrder] = false; this->queueHavSecondary_.push(pVTrainInfo->iCarOrder); } else { outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVTrainInfo)); this->mapTrain_.erase(pVTrainInfo->iCarOrder); } } if (pVTrainInfo->iDataSource == 1) { LogInfo << " === > 收到所需补全的车号:" << pVTrainInfo->iCarOrder; if (this->queueHavSecondary_.front() == pVTrainInfo->iCarOrder) { // this->mapHavSecondary_[pVTrainInfo->iCarOrder] = true; this->queueHavSecondary_.pop(); std::shared_ptr pVTrain = std::make_shared(); *pVTrain = this->mapTrain_[pVTrainInfo->iCarOrder]; this->supplementTrain(pVTrain, *pVTrainInfo); outputQueMap_[strPort0_]->push(std::static_pointer_cast(pVTrain)); this->mapTrain_.erase(pVTrainInfo->iCarOrder); } } if (pVTrainInfo->bIsTheLast && this->queueHavSecondary_.empty()) { std::shared_ptr pMergeSecondaryData = std::make_shared(); pMergeSecondaryData->bIsTheLast = pVTrainInfo->bIsTheLast; outputQueMap_[strPort1_]->push(std::static_pointer_cast(pMergeSecondaryData), true); LogInfo << " --- > 发送补全车号清空请求"; } } return APP_ERR_OK; }