1 line
7.3 KiB
C++
1 line
7.3 KiB
C++
#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<VTrainInfo> 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<VTrainInfo> 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<VTrainInfo> 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<void> pVoidData0 = nullptr;
|
|
inputQueMap_[strPort0_]->pop(pVoidData0);
|
|
if (pVoidData0 == nullptr)
|
|
{
|
|
usleep(1000);
|
|
continue;
|
|
}
|
|
|
|
std::shared_ptr<VTrainInfo> pVTrainInfo =
|
|
std::static_pointer_cast<VTrainInfo>(pVoidData0);
|
|
|
|
if (pVTrainInfo->iDataSource == 0)
|
|
{
|
|
this->mapTrain_[pVTrainInfo->iCarOrder] = *pVTrainInfo;
|
|
|
|
if (!this->isComplete(pVTrainInfo))
|
|
{
|
|
std::shared_ptr<MergeSecondaryData> pMergeSecondaryData = std::make_shared<MergeSecondaryData>();
|
|
pMergeSecondaryData->iCarOrder = pVTrainInfo->iCarOrder;
|
|
LogInfo << " --- > 发送所需补全的车号:" << pVTrainInfo->iCarOrder;
|
|
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pMergeSecondaryData), true);
|
|
// this->mapHavSecondary_[pVTrainInfo->iCarOrder] = false;
|
|
this->queueHavSecondary_.push(pVTrainInfo->iCarOrder);
|
|
}
|
|
else
|
|
{
|
|
outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(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<VTrainInfo> pVTrain = std::make_shared<VTrainInfo>();
|
|
*pVTrain = this->mapTrain_[pVTrainInfo->iCarOrder];
|
|
this->supplementTrain(pVTrain, *pVTrainInfo);
|
|
|
|
outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pVTrain));
|
|
this->mapTrain_.erase(pVTrainInfo->iCarOrder);
|
|
}
|
|
}
|
|
|
|
if (pVTrainInfo->bIsTheLast && this->queueHavSecondary_.empty())
|
|
{
|
|
std::shared_ptr<MergeSecondaryData> pMergeSecondaryData = std::make_shared<MergeSecondaryData>();
|
|
pMergeSecondaryData->bIsTheLast = pVTrainInfo->bIsTheLast;
|
|
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pMergeSecondaryData), true);
|
|
LogInfo << " --- > 发送补全车号清空请求";
|
|
}
|
|
}
|
|
return APP_ERR_OK;
|
|
}
|
|
|
|
|
|
|
|
|