#include "report.h" #include #include #include #include #include #include #include #include QString g_bookmark_volume[MAX_COMPARTMENT_NUM] = {BOOKMARK_VOLUME_1,BOOKMARK_VOLUME_2,BOOKMARK_VOLUME_3, BOOKMARK_VOLUME_4}; QString g_bookmark_systest_startpressure[MAX_COMPARTMENT_NUM] = {BOOKMARK_SYSTEST_STARTPRESSURE_1,BOOKMARK_SYSTEST_STARTPRESSURE_2,BOOKMARK_SYSTEST_STARTPRESSURE_3, BOOKMARK_SYSTEST_STARTPRESSURE_4}; QString g_bookmark_systest_endpressure[MAX_COMPARTMENT_NUM] = {BOOKMARK_SYSTEST_ENDPRESSURE_1,BOOKMARK_SYSTEST_ENDPRESSURE_2,BOOKMARK_SYSTEST_ENDPRESSURE_3, BOOKMARK_SYSTEST_ENDPRESSURE_4}; QString g_bookmark_systest_deltapressure[MAX_COMPARTMENT_NUM] = {BOOKMARK_SYSTEST_DELTAPRESSURE_1,BOOKMARK_SYSTEST_DELTAPRESSURE_2,BOOKMARK_SYSTEST_DELTAPRESSURE_3, BOOKMARK_SYSTEST_DELTAPRESSURE_4}; QString g_bookmark_systest_threshold[MAX_COMPARTMENT_NUM] = {BOOKMARK_SYSTEST_THRESHOLD_1,BOOKMARK_SYSTEST_THRESHOLD_2,BOOKMARK_SYSTEST_THRESHOLD_3, BOOKMARK_SYSTEST_THRESHOLD_4}; QString g_bookmark_valvetest_startpressure[MAX_COMPARTMENT_NUM] = {BOOKMARK_VALVETEST_STARTPRESSURE_1,BOOKMARK_VALVETEST_STARTPRESSURE_2,BOOKMARK_VALVETEST_STARTPRESSURE_3, BOOKMARK_VALVETEST_STARTPRESSURE_4}; QString g_bookmark_valvetest_endpressure[MAX_COMPARTMENT_NUM] = {BOOKMARK_VALVETEST_ENDPRESSURE_1,BOOKMARK_VALVETEST_ENDPRESSURE_2,BOOKMARK_VALVETEST_ENDPRESSURE_3, BOOKMARK_VALVETEST_ENDPRESSURE_4}; QString g_bookmark_valvetest_deltapressure[MAX_COMPARTMENT_NUM] = {BOOKMARK_VALVETEST_DELTAPRESSURE_1,BOOKMARK_VALVETEST_DELTAPRESSURE_2,BOOKMARK_VALVETEST_DELTAPRESSURE_3, BOOKMARK_VALVETEST_DELTAPRESSURE_4}; QString g_bookmark_valvetest_threshold[MAX_COMPARTMENT_NUM] = {BOOKMARK_VALVETEST_THRESHOLD_1,BOOKMARK_VALVETEST_THRESHOLD_2,BOOKMARK_VALVETEST_THRESHOLD_3, BOOKMARK_VALVETEST_THRESHOLD_4}; QString g_bookmark_test_picture[MAX_COMPARTMENT_NUM] = {BOOKMARK_TEST_PICTURE_1,BOOKMARK_TEST_PICTURE_2,BOOKMARK_TEST_PICTURE_3, BOOKMARK_TEST_PICTURE_4}; QString g_bookmark_systest_picture[MAX_COMPARTMENT_NUM] = {BOOKMARK_SYSTEST_PICTURE_1,BOOKMARK_SYSTEST_PICTURE_2,BOOKMARK_SYSTEST_PICTURE_3, BOOKMARK_SYSTEST_PICTURE_4}; QString g_bookmark_valvetest_picture[MAX_COMPARTMENT_NUM] = {BOOKMARK_VALVETEST_PICTURE_1,BOOKMARK_VALVETEST_PICTURE_2,BOOKMARK_VALVETEST_PICTURE_3, BOOKMARK_VALVETEST_PICTURE_4}; QString g_bookmark_vrs_check[VRS_VISUAL_INSPECTION_ITEMS_NUM][3]={ {BOOKMARK_VRS_CHECK_ITEMS_1_0, BOOKMARK_VRS_CHECK_ITEMS_1_1, BOOKMARK_VRS_CHECK_ITEMS_1_2}, {BOOKMARK_VRS_CHECK_ITEMS_2_0, BOOKMARK_VRS_CHECK_ITEMS_2_1, BOOKMARK_VRS_CHECK_ITEMS_2_2}, {BOOKMARK_VRS_CHECK_ITEMS_3_0, BOOKMARK_VRS_CHECK_ITEMS_3_1, BOOKMARK_VRS_CHECK_ITEMS_3_2}, {BOOKMARK_VRS_CHECK_ITEMS_4_0, BOOKMARK_VRS_CHECK_ITEMS_4_1, BOOKMARK_VRS_CHECK_ITEMS_4_2}, {BOOKMARK_VRS_CHECK_ITEMS_5_0, BOOKMARK_VRS_CHECK_ITEMS_5_1, BOOKMARK_VRS_CHECK_ITEMS_5_2}, {BOOKMARK_VRS_CHECK_ITEMS_6_0, BOOKMARK_VRS_CHECK_ITEMS_6_1, BOOKMARK_VRS_CHECK_ITEMS_6_2}, {BOOKMARK_VRS_CHECK_ITEMS_7_0, BOOKMARK_VRS_CHECK_ITEMS_7_1, BOOKMARK_VRS_CHECK_ITEMS_7_2}, {BOOKMARK_VRS_CHECK_ITEMS_8_0, BOOKMARK_VRS_CHECK_ITEMS_8_1, BOOKMARK_VRS_CHECK_ITEMS_8_2} }; QString g_bookmark_bls_check[BLS_VISUAL_INSPECTION_ITEMS_NUM][3]={ {BOOKMARK_BLS_CHECK_ITEMS_1_0, BOOKMARK_BLS_CHECK_ITEMS_1_1, BOOKMARK_BLS_CHECK_ITEMS_1_2}, {BOOKMARK_BLS_CHECK_ITEMS_2_0, BOOKMARK_BLS_CHECK_ITEMS_2_1, BOOKMARK_BLS_CHECK_ITEMS_2_2}, {BOOKMARK_BLS_CHECK_ITEMS_3_0, BOOKMARK_BLS_CHECK_ITEMS_3_1, BOOKMARK_BLS_CHECK_ITEMS_3_2}, {BOOKMARK_BLS_CHECK_ITEMS_4_0, BOOKMARK_BLS_CHECK_ITEMS_4_1, BOOKMARK_BLS_CHECK_ITEMS_4_2}, {BOOKMARK_BLS_CHECK_ITEMS_5_0, BOOKMARK_BLS_CHECK_ITEMS_5_1, BOOKMARK_BLS_CHECK_ITEMS_5_2} }; #define REPORT_TEMPLATES_PATH "D:/VaporRecoverySystemTest/Templates/" #define REPORT_TEMPLATES_NAME "report_v2.dotx" ReportWoker::ReportWoker() { qRegisterMetaType("Tanker&"); qRegisterMetaType("QString&"); } ReportWoker::~ReportWoker() { } void ReportWoker::makeReport(Tanker& tanker, QString& word_path, QString& pic_dir) { make_report(tanker, word_path, pic_dir); } bool ReportWoker::make_report(Tanker& tanker, QString word_path, QString pic_dir) { QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QString text_progress1 = codec->toUnicode("正在生成Word报告,请耐心等待"); QString text_progress2 = codec->toUnicode("正在保存中..."); QString text_progress3 = codec->toUnicode("报告已完成"); QString text_progress4 = codec->toUnicode("打开word失败"); QString text_progress5 = codec->toUnicode("报告模板无法使用"); //新建一个word应用程序 QAxWidget *word = new QAxWidget("Word.Application",0,Qt::MSWindowsOwnDC); if(word->isNull()){ emit onProgress(text_progress4); return false; } //并设置为不可见 word->setProperty("Visible",false); //获取所有的工作文档 QAxObject *documents = word->querySubObject("Documents"); //以test2.dot为模板新建一个文档 documents->dynamicCall("Add(QString)",QString(REPORT_TEMPLATES_PATH)+QString(REPORT_TEMPLATES_NAME)); //documents->dynamicCall("Add(QString)",QString::fromLocal8Bit("D:\Code\QTapps\build-valve_testing-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\test1.dotx")); //获取当前激活的文档 QAxObject *document = word->querySubObject("ActiveDocument"); if(document->isNull()){ emit onProgress(text_progress5); return false; } emit onProgress(text_progress1); QThread::msleep(1000); //填写全局信息 //使用单位 QAxObject *bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_COMPANYNAME); if(!bookmark->isNull()) { //QChar cc = 0x2611; QString str = tanker.companyname_str; //str.insert(0, cc); QString sText=codec->toUnicode(str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //车牌 bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_CARPLATE); if(!bookmark->isNull()) { QString sText=codec->toUnicode(tanker.licenseplate_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //仓数 bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_COMPARTMENT_NUM); if(!bookmark->isNull()) { QString sText=codec->toUnicode(QString::number(tanker.compartment_num).toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //外观检查项 for(int i=0; i 2 ) check_value = 2; if(check_value < 0 ) check_value = 0; //qDebug()<querySubObject("Bookmarks(QVariant)",g_bookmark_vrs_check[i][check_value]); if(!bookmark->isNull()) { QChar cc = 0x2611; QString sText; sText.insert(0, cc); //int volume = m_tank.m_comparts[i].m_volume; //QString sText=codec->toUnicode(QString::number(comp.m_volume).toStdString().c_str()); //此处为替换内容 //qDebug()<<"sText"; bookmark->dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } } for(int i=0; i 2 ) check_value = 2; if(check_value < 0 ) check_value = 0; //qDebug()<querySubObject("Bookmarks(QVariant)",g_bookmark_bls_check[i][check_value]); if(!bookmark->isNull()) { QChar cc = 0x2611; QString sText; sText.insert(0, cc); //int volume = m_tank.m_comparts[i].m_volume; //QString sText=codec->toUnicode(QString::number(comp.m_volume).toStdString().c_str()); //此处为替换内容 //qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } } //填写每仓容量 for(int i=0; i< tanker.compartment_num; i++){ Compartment& comp = tanker.get_compartment(i); bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_volume[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString sText=codec->toUnicode(QString::number(comp.m_volume).toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } if(comp.m_result.sys_test_finished){ //完成了系统密闭性检测 //密闭性检测的初始表压 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_systest_startpressure[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_result.sysstart_pressure, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //5 min之后的表压 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_systest_endpressure[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_result.sysend_pressure, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //压力变化值 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_systest_deltapressure[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_result.delta_sys_pressure, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //压力变化限值 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_systest_threshold[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_standarditem.system_threshold, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } } if(comp.m_result.valve_test_finished){ //完成了阀门密闭性检测 //密闭性检测的初始表压 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_valvetest_startpressure[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_result.valvestart_pressure, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //5 min之后的表压 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_valvetest_endpressure[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_result.valveend_pressure, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //压力变化值 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_valvetest_deltapressure[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_result.delta_valve_pressure, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //压力变化限值 bookmark = document->querySubObject("Bookmarks(QVariant)",g_bookmark_valvetest_threshold[i]); if(!bookmark->isNull()) { //int volume = m_tank.m_comparts[i].m_volume; QString pressure_str = QString("%1").arg(comp.m_standarditem.valve_threshold, 4,'f',2,QLatin1Char('0')); QString sText=codec->toUnicode(pressure_str.toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } } if(comp.m_testfinished){ // 获取文档中名字为pic的标签 QAxObject*bookmark_pic=document->querySubObject("Bookmarks(QVariant)",g_bookmark_test_picture[i]); // 选中标签,将图片插入到标签位置 if(!bookmark_pic->isNull()) { QString pic_path_str = pic_dir+tanker.licenseplate_str+"_"+QString::number(i+1)+"_all.jpg"; qDebug()<dynamicCall("Select(void)"); QAxObject *range; range = bookmark_pic->querySubObject("Range"); QVariant tmp = range->asVariant(); QListqList; qList<querySubObject("InlineShapes"); Inlineshapes->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)",qList); } } bookmark_pic=document->querySubObject("Bookmarks(QVariant)",g_bookmark_systest_picture[i]); // 选中标签,将图片插入到标签位置 if(!bookmark_pic->isNull()) { QString pic_path_str = pic_dir+tanker.licenseplate_str+"_"+QString::number(i+1)+"_sys.jpg"; qDebug()<dynamicCall("Select(void)"); QAxObject *range; range = bookmark_pic->querySubObject("Range"); QVariant tmp = range->asVariant(); QListqList; qList<querySubObject("InlineShapes"); Inlineshapes->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)",qList); } } bookmark_pic=document->querySubObject("Bookmarks(QVariant)",g_bookmark_valvetest_picture[i]); // 选中标签,将图片插入到标签位置 if(!bookmark_pic->isNull()) { QString pic_path_str = pic_dir+tanker.licenseplate_str+"_"+QString::number(i+1)+"_valve.jpg"; qDebug()<dynamicCall("Select(void)"); QAxObject *range; range = bookmark_pic->querySubObject("Range"); QVariant tmp = range->asVariant(); QListqList; qList<querySubObject("InlineShapes"); Inlineshapes->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)",qList); } } } } //检测结果 bool systest_pass = true; bool valvetest_pass = true; int nosys_testcount = 0; int novalve_testcount =0; for(int i=0; iquerySubObject("Bookmarks(QVariant)",BOOKMARK_SYSTEST_PASS); if(!bookmark->isNull()) { bookmark->dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } }else{ bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_SYSTEST_EXCEEDED); if(!bookmark->isNull()) { bookmark->dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } } } if(novalve_testcount != tanker.compartment_num){ //阀门检测结果 QChar cc = 0x2611; QString sText; sText.insert(0, cc); if(valvetest_pass){ bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_VALVETEST_PASS); if(!bookmark->isNull()) { bookmark->dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } }else{ bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_VALVETEST_EXCEEDED); if(!bookmark->isNull()) { bookmark->dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } } } //检测日期 QDate date(QDate::currentDate()); bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_DATE_YEAR); if(!bookmark->isNull()) { QString sText=codec->toUnicode(QString::number(date.year()).toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_DATE_MONTH); if(!bookmark->isNull()) { QString sText=codec->toUnicode(QString::number(date.month()).toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } bookmark = document->querySubObject("Bookmarks(QVariant)",BOOKMARK_DATE_DAY); if(!bookmark->isNull()) { QString sText=codec->toUnicode(QString::number(date.day()).toStdString().c_str()); //此处为替换内容 qDebug()<dynamicCall("Select(void)"); //选中要选中的区域 bookmark->querySubObject("Range")->setProperty("Text",sText); //进行替换操作 } //将文件保存为PDF, emit onProgress(text_progress2); QThread::msleep(1000); if(word_path.contains(".pdf")){ qDebug()<<"start save PDF file "; QVariant OutputFileName(word_path); QVariant ExportFormat(17); //17是pdf QVariant OpenAfterExport(false); //保存后是否自动打开 document->querySubObject("ExportAsFixedFormat(const QVariant&,const QVariant&,const QVariant&)", OutputFileName, ExportFormat, OpenAfterExport); }else { qDebug()<<"start save Word file "; document->dynamicCall("SaveAs(const QString&))",QDir::toNativeSeparators(word_path)); } document->dynamicCall("Close (boolean)",false); word->dynamicCall("Quit()"); emit onProgress(text_progress3); QThread::msleep(1000); emit onProgress("close"); return true; } Report::Report() { qRegisterMetaType("Tanker&"); qRegisterMetaType("QString&"); ReportWoker *worker = new ReportWoker; worker->moveToThread(&workerThread); connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater); connect(this, &Report::operate, worker, &ReportWoker::makeReport); connect(worker, &ReportWoker::onProgress, this, &Report::recvProgress); workerThread.start(); } Report::~Report() { workerThread.quit(); workerThread.wait(); } void Report::recvProgress(const QString& qstr) { emit onProgress(qstr); } void Report::makeReport(Tanker& tanker, QString word_path, QString pic_dir) { emit operate(tanker, word_path, pic_dir); }