VCarContainer/engine/CharacterConversionEngine/ContainerCharacterConversio...

1 line
10 KiB
C++
Raw Normal View History

#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);