2025-02-13 10:43:42 +00:00
|
|
|
|
#include "ContainerCharacterConversionEngine.h"
using namespace ai_matrix;
namespace
{
//按照x坐标排列
bool CompareX(const SingleData &v1, const SingleData &v2)
{
return (v1.fLTX < v2.fLTX);
}
//按照y坐标排列
bool CompareY(const SingleData &v1, const SingleData &v2)
{
return (v1.fLTY < v2.fLTY);
}
}
ContainerCharacterConversionEngine::ContainerCharacterConversionEngine() {}
ContainerCharacterConversionEngine::~ContainerCharacterConversionEngine() {}
APP_ERROR ContainerCharacterConversionEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort3_ = engineName_ + "_" + std::to_string(engineId_) + "_3";
this->modelConfig_ = Config::getins()->getModelByContainerStep2Config();
this->baseConfig_ = Config::getins()->getBaseConfig();
LogInfo << "ContainerCharacterConversionEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR ContainerCharacterConversionEngine::DeInit()
{
LogInfo << "ContainerCharacterConversionEngine DeInit ok";
return APP_ERR_OK;
}
/**
* 验证集装箱号是否满足规则(前10位依次与2^0 ~2^9相乘)/11 所得余数,即是校验位)
* inParam : std::string &strContainerNo 集装箱号信息
* outParam: N/A
* return : true(校验通过)/false(校验失败)
*/
bool ContainerCharacterConversionEngine::verifyContainerNo(std::string &strContainerNo)
{
bool bChkFlag = false;
if(strContainerNo.length() != 11)
{
return bChkFlag;
}
int iSum = 0;
for (int i = 0; i < strContainerNo.length()-1; ++i)
{
iSum += this->mapExchange_[strContainerNo.substr(i, 1)] * int(pow(2.0, i));
}
//当校验位等于10时要继续模运算,iSum % 11 % 10,保证最终结果为0~9之间的数
int iChkValue = iSum % 11 % 10;
if (iChkValue == atoi(strContainerNo.substr(strContainerNo.length()-1, 1).c_str()))
{
bChkFlag = true;
}
return bChkFlag;
}
void ContainerCharacterConversionEngine::transContainerType(Step2ResultData &step2ResultData, std::map<int, std::vector<SingleData>> &mapLine)
{
TransInfo info;
info.iLine = 1;
//集装箱型号(4位 字母或数字)
if (mapLine.find(3) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(3).size(); j++)
{
strTemp += vecClassNames_.at(mapLine.at(3).at(j).iClassId);
}
int nTypesize = strTemp.length();
nTypesize = nTypesize > 4 ? 4 : nTypesize;
info.strTmpResult = strTemp.substr(0, nTypesize);
}
if (info.strTmpResult.length() != 4)
{
info.bIsChkFlag = false;
}
// step2ResultData.transInfo = info;
}
/**
* 集装箱框内容转换
* inParam : std::map<int, std::vector<SingleData>> &mapLine
* outParam: TransSubData &transSubData
* return : N/A
*/
void ContainerCharacterConversionEngine::transContainerNum(Step2ResultData &step2ResultData, std::map<int, std::vector<SingleData>> &mapLine)
{
TransInfo info;
info.iLine = 0;
// 箱主代码+设备识别码(4位英文字母)
if (mapLine.find(0) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(0).size(); j++)
{
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(0).at(j).iClassId);
// 过滤非字母
if (strOne[0] < 'A' || strOne[0] > 'Z')
{
// LogDebug << strOne << " not A-Z in container";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(0).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(0).at(j).fScore;
}
info.strTmpResult += strTemp;
}
// 箱号(6位数字)
if (mapLine.find(1) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(1).size(); j++)
{
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(1).at(j).iClassId);
|