Newer
Older
AutomaticVerification / softwareDirectory / AutoVerScheme / verifywindow.cpp
#include "verifywindow.h"
#include "ui_verifywindow.h"
#include <QMessageBox>
#include <QInputDialog>
#include "newverifymethod.h"

VerifyWindow::VerifyWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VerifyWindow)
{
    ui->setupUi(this);
    ui->tableWidgetMethod->verticalHeader()->setParent(nullptr); //隐藏行头
    for(int i=1;i<5;i++)
        ui->tableWidgetMethod->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch);
    ui->tableWidgetMethod->setColumnWidth(0, 60);
    ui->tableWidgetMethod->setColumnWidth(5, 100);
    ui->tableWidget_3->verticalHeader()->setParent(nullptr);
    for(int i=0;i<2;i++)
        ui->tableWidget_3->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch);
    ui->tableWidget_3->setSelectionBehavior(QAbstractItemView::SelectRows);
    getVerifyMethod();
}

VerifyWindow::~VerifyWindow()
{
    programList.clear();
    delete ui;
}

void VerifyWindow::getVerifyMethod()
{
    programList.clear();
    programList = BaseCommonApi::getCheckProgramManage();
    ui->tableWidgetMethod->clearContents();
    ui->tableWidgetMethod->setRowCount(0);
    int rowCount = 0;
    int row=0;
    QString sFilterName = ui->lineEdit_9->text();
    QString sFilterUser = ui->lineEdit_10->text();
    for(int i=programList.length()-1;i>=0;i--){
        bool bAdd=true;
        if(sFilterName!=""&&!programList[i].check_name.contains(sFilterName)){
            bAdd=false;
        }
        if(sFilterUser!=""&&!programList[i].create_name.contains(sFilterUser)){
            bAdd=false;
        }
        if(!bAdd){
            programList.removeAt(i);
        }
    }
    for (const CheckProgramManage& program : programList) {
         rowCount = ui->tableWidgetMethod->rowCount();

         ui->tableWidgetMethod->insertRow(rowCount);
         QTableWidgetItem* p_check = new QTableWidgetItem();
         p_check->setCheckState(Qt::Unchecked);        //设置首列为 CheckBox 控件
         ui->tableWidgetMethod->setItem(row,0,p_check);
         ui->tableWidgetMethod->setItem(row, 1, new QTableWidgetItem(program.check_name)); //设置数据
         ui->tableWidgetMethod->setItem(row, 2, new QTableWidgetItem(program.create_name)); //设置数据
         ui->tableWidgetMethod->setItem(row, 3, new QTableWidgetItem(program.create_time.toString("yyyy-MM-dd"))); //设置数据
         ui->tableWidgetMethod->setItem(row, 4, new QTableWidgetItem(program.remark)); //设置数据
         QPushButton *btn_1 = new QPushButton();
         btn_1->setText(tr("详情"));
         btn_1->setStyleSheet("QPushButton{"
                              "background-color:rgba(255,255,255,0);"
                              "color:rgba(0,0,255,100);"
                              "text-decoration:underline;"
                              "}");
         btn_1->setCursor(Qt::PointingHandCursor);
         connect(btn_1,SIGNAL(clicked()),this,SLOT(on_editButton_clicked()));

         btn_1->setIconSize(QSize(16,16));
         btn_1->setIcon(QIcon(":/image/Index/u2324.svg"));
         QWidget *tmp_widget = new QWidget();
         QHBoxLayout *tmp_layout = new QHBoxLayout(tmp_widget);
         tmp_layout->addWidget(btn_1);
         tmp_layout->setMargin(0);
         ui->tableWidgetMethod->setCellWidget(row,5,tmp_widget);
         row++;
    }
}

void VerifyWindow::showDevice()
{
    QString sId="";
    for(int i=0;i<ui->tableWidgetMethod->rowCount();i++){
        Qt::CheckState state = ui->tableWidgetMethod->item(i,0)->checkState();
        if(state == Qt::Checked){
            sId = programList[i].id;
            break;
        }
    }
    if(sId==""){
        QMessageBox::warning(this, "提示", "请选择检定程序!");
    }else{
        programInfo = BaseCommonApi::getCheckProgramManageById(sId);
        initDeviceInfo();
        ui->stackedWidget->setCurrentIndex(1);
    }
}

void VerifyWindow::initDeviceInfo()
{
    QString strStyle = QString("QLabel{image:url(%1);}").arg(programInfo.img_path);
    qDebug() << "strStyle:" << strStyle;
    ui->label_8->setStyleSheet(strStyle);

    ui->tableWidget_3->clearContents();
    ui->tableWidget_3->setRowCount(0);
    QStringList idList;
    int rowCount=0;
    int row=0;
    connectList.clear();
    if(programInfo.standard_device_id!="")
    {
        idList = programInfo.standard_device_id.split(",");
        for(const QString& id : idList)
        {
            ConnectInfo info;
            info.state="未连接";
            info.type = 1;
            QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(id);
            if(result.length()>0){
                info.deviceName = result[0].equipment_name;
            }
            result.clear();
            QList<VerificationProgramConfigInterface> addrList = BaseCommonApi::getVerificationProgramConfigInterface(id);
            if(addrList.length()>0){
                info.programInterface = addrList[0];
            }
            info.cmdList = BaseCommonApi::getInstructionLib(id);
            connectList.append(info);
            addrList.clear();
        }
        idList.clear();
    }

    if(programInfo.verification_documents_id!=""){
        idList = programInfo.verification_documents_id.split(",");
        for(const QString& id : idList)
        {
            ConnectInfo info;
            info.state="未连接";
            info.type = 0;
//            CheckAndTestedDevice result = BaseCommonApi::getCheckAndTestedDeviceById(id);

//            info.deviceName = result.equipment_name;

            QList<VerificationProgramConfigInterface> addrList = BaseCommonApi::getVerificationProgramConfigInterface(id);
            if(addrList.length()>0){
                info.programInterface = addrList[0];
            }
            info.cmdList = BaseCommonApi::getInstructionLib(id);
            connectList.append(info);
            addrList.clear();
        }
        idList.clear();
    }
     for(const ConnectInfo& info : connectList){
         rowCount = ui->tableWidget_3->rowCount();
         ui->tableWidget_3->insertRow(rowCount);
         ui->tableWidget_3->setItem(row, 0, new QTableWidgetItem(info.deviceName));
         ui->tableWidget_3->setItem(row, 1, new QTableWidgetItem(info.state)); //设置数据
         row++;
     }
     ui->tableWidget_3->selectRow(0);
}


void VerifyWindow::on_editButton_clicked()
{
    QPushButton *pushButton_ = dynamic_cast<QPushButton*>(this->sender());
    if(NULL == pushButton_)
    {
        return;
    }
    // 获取按钮的x坐标和y坐标
    int x = pushButton_->parentWidget()->frameGeometry().x();
    int y = pushButton_->parentWidget()->frameGeometry().y();
    // 根据按钮的x和y坐标来定位对应的单元格
    QModelIndex index = ui->tableWidgetMethod->indexAt(QPoint(x, y));
    // 获取该按钮所在表格的行号和列号
    int editIdx = index.row();
    //int column = index.column();
    QString sId =  programList[editIdx].id;
    NewVerifyMethod* checkWindow = new NewVerifyMethod(nullptr,sId,false);
    //checkWindow->verifyManageWnd=nullptr;
    checkWindow->setWindowState(Qt::WindowMaximized);
    checkWindow->setWindowModality(Qt::ApplicationModal);
    checkWindow->show();
}

void VerifyWindow::on_tableWidgetMethod_cellChanged(int row, int column)
{
    Qt::CheckState state = ui->tableWidgetMethod->item(row,0)->checkState();
    if(state == Qt::Checked)
    {
        for(int i=0;i<ui->tableWidgetMethod->rowCount();i++){
            if(i!=row)
            {
                ui->tableWidgetMethod->item(i,0)->setCheckState(Qt::Unchecked);
            }
        }
    }
}

void VerifyWindow::on_tableWidget_3_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
    if(currentRow>=0&&currentRow<connectList.length()){
        ConnectInfo info= connectList[currentRow];
        VerificationProgramConfigInterface addr = info.programInterface;
        if(addr.communication_type == "SerialPort")
            ui->radioButton_serial->setChecked(true);
        else
            ui->radioButton_visa->setChecked(true);
        ui->comboBox_visa->setCurrentText(addr.visa);
        if(addr.serial_port!=""){
            QStringList sList = addr.serial_port.split(";");
            if(sList.length()==5){
                ui->comboBox_port->setCurrentText(sList[0]);
                ui->comboBox_baurt->setCurrentText(sList[1]);
                ui->comboBox_check->setCurrentText(sList[2]);
                ui->comboBox_data->setCurrentText(sList[3]);
                ui->comboBox_stop->setCurrentText(sList[4]);
            }
        }
    }
}

void VerifyWindow::deleteItem(QLayout *layout)
{
    QLayoutItem *child;
    while ((child = layout->takeAt(0)) != nullptr)
    {
        //setParent为NULL,防止删除之后界面不消失
        if(child->widget())
        {
            child->widget()->setParent(nullptr);
            delete child->widget();
        }
        else if (child->layout())
        {
            deleteItem(child->layout());
            child->layout()->deleteLater();
        }
        delete child;
    }
}
void VerifyWindow::on_deviceButton_clicked(CatDeviceInfor info,int idx)
{
    for(int i=0;i<catDeviceList.length();i++){
        QLayoutItem *child = ui->horizontalLayout_14->itemAt(i);
        QPushButton *btn_1 = qobject_cast<QPushButton *>(child->widget());
        if(i==idx){
            btn_1->setStyleSheet("QPushButton{"
                                 "background-color:rgb(55,83,123);"
                                 "color:rgb(255,255,255);"
                                 "}");
        }else{
            btn_1->setStyleSheet("QPushButton{"
                                 "background-color:rgb(240,240,240);"
                                 "color:rgb(51,51,51);"
                                 "}");
        }
    }
    ui->label_21->setText(QString("设备名称: %1").arg(info.equipment_name));
    ui->label_22->setText(QString("型号规格: %1").arg(info.model));
    ui->label_23->setText(QString("出厂编号: %1").arg(info.manufacture_no));
    ui->label_24->setText(QString("生产厂家: %1").arg(info.manufacturer));
}

void VerifyWindow::on_pushButton_13_clicked()
{
    deleteItem(ui->horizontalLayout_14);
    int idx=0;
    catDeviceList.clear();
    QString standardId="";
    if(programInfo.standard_device_id!="")
    {
        QStringList idList = programInfo.standard_device_id.split(",");
        for(const QString& id : idList)
        {
            standardId = id;
            QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(id);
            if(result.length()>0){
                CatDeviceInfor info = result[0];
                catDeviceList.append(info);
                QPushButton *btn_1 = new QPushButton();
                btn_1->setText(info.equipment_name);
                btn_1->setStyleSheet("QPushButton{"
                                     "background-color:rgb(240,240,240);"
                                     "color:rgb(51,51,51);"
                                     "}");
                //btn_1->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
                QFont font;
                font.setPointSize(12);//字体大小
                font.setBold(true);
                btn_1->setFont(font);
                btn_1->setCursor(Qt::PointingHandCursor);
                connect(btn_1, &QPushButton::clicked, this, [this,info,idx]() {
                    on_deviceButton_clicked(info,idx);
                });
                ui->horizontalLayout_14->addWidget(btn_1);
                idx++;
            }
            result.clear();
        }
        idList.clear();
    }
    on_deviceButton_clicked(catDeviceList[0],0);
    ui->horizontalLayout_14->addStretch();

    if(catDeviceList.length()>0)
    {
        headList.clear();
        calibrationList.clear();
//        calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList);

        //tableWidgetItem
        ui->tableWidget_Point->clearContents();
        ui->tableWidget_Point->setRowCount(0);
        //循环数据
        int rowCount=0;
        int row=0;
        for (const QStringList& item : calibrationList)
        {
            //获取行号 并进行添加行
            rowCount = ui->tableWidget_Point->rowCount();
            ui->tableWidget_Point->insertRow(rowCount);
            QTableWidgetItem* p_check = new QTableWidgetItem();
            p_check->setCheckState(Qt::Unchecked);        //设置首列为 CheckBox 控件
            ui->tableWidget_Point->setItem(row,0,p_check);
            ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8]));
            ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1"));
            row++;
        }
    }

    ui->stackedWidget_2->setCurrentIndex(1);
}

void VerifyWindow::initCheckTable()
{
    ui->tableWidgetCheck->clearContents();
    ui->tableWidgetCheck->setRowCount(0);
    ui->tableWidgetCheck->setColumnCount(0);
    int rowCount = 0;
    int row=0;
    ui->tableWidgetCheck->setColumnCount(headList.count());
    ui->tableWidgetCheck->setHorizontalHeaderLabels(headList);
    for(int i=0;i<headList.count();i++)
    {
        ui->tableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch);
    }
    measureCalList.clear();
    for(int i=0;i<ui->tableWidget_Point->rowCount();i++){
        Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState();
        if(state == Qt::Checked){
            QStringList& item = calibrationList[i];
            int cnt = ui->tableWidget_Point->item(i,2)->text().toInt();
            for(int j=0;j<cnt;j++){
                rowCount = ui->tableWidgetCheck->rowCount();
                ui->tableWidgetCheck->insertRow(rowCount);
                ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1)));
                //循环读取值  headlist,count是列的数量
                for(int k=1;k<headList.count();k++)
                {
                    if(k<item.length())
                        ui->tableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k]));
                }
                StandCheckDataCalibrator measItem;
//                measItem.item_data_id = item[1];
//                measItem.maximum_error_formula = item[10];//最大允许误差(公式)
//                measItem.error_param_a = item[11];//误差参数a
//                measItem.error_param_b = item[12];//误差参数b
//                measItem.params = item[2];//参数
//                measItem.capacity=item[3];//量
//                measItem.unit=item[4];//单位
//                measItem.frequency=item[5];//频率
//                measItem.frequency_unit=item[6];//频率单位
//                measItem.range_range=item[7];//量程
//                measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段)
//                measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段)
//                measItem.maximum_error=item[10];//最大允许误差(值)
//                //measItem.absolute_error=item[11];//绝对误差
//                measItem.resolution=item[9];//分辨力
//                measItem.measure_indication_value=item[19];//被检表示值
                measureCalList.append(measItem);
                row++;
            }
        }
    }
    if(connectList.length()>0&&connectList[0].type==1)
        standardEngine.openDevice(connectList[0].programInterface.visa,"Visa");
    if(connectList.length()>1&&connectList[1].type==0)
        deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa");
}

InstructionLib* VerifyWindow::getCmdByCheckName(int idx,QString name)
{
    if(idx>=0&&idx<connectList.length()){
        for (InstructionLib& item : connectList[idx].cmdList) {
            if(item.belong_vername==name)
                return &item;
        }
    }
    return nullptr;
}

void VerifyWindow::Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < _Timer )
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

void VerifyWindow::on_pushButton_start_clicked()
{
    initCheckTable();
    for(int i=0;i<measureCalList.length();i++)
    {
        StandCheckDataCalibrator& item = measureCalList[i];
        QString sRet="";
        //标准器输出
        if(standardEngine.getState()){
            InstructionLib *instrcutLib = getCmdByCheckName(1,item.params);
            if(instrcutLib!=nullptr){
                QStringList sList = instrcutLib->instruct_config.split(";");
                if(sList.length()>0){
                    for (QString& sCmd : sList){
                        standardEngine.sendData(sCmd);
                    }
                }
            }
        }
        //被检设备读数
        if(deviceEngine.getState()){
            InstructionLib *instrcutLib = getCmdByCheckName(0,item.params);
            if(instrcutLib!=nullptr){
                QStringList sList = instrcutLib->instruct_config.split(";");
                if(sList.length()>0){
                    for (QString& sCmd : sList){
                        deviceEngine.sendData(sCmd);
                    }
                }
                Delay_MSec(2000);
                sRet = deviceEngine.queryData(instrcutLib->instruct_read);
            }
        }
        //
        if(sRet==""){
            bool bOk = false;
            double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000,	100000,1,&bOk);

            if (bOk) {
                sRet = QString::number(dRet);
            }
        }
        item.test_value_one = sRet;
        ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet));
    }
}

void VerifyWindow::on_pushButton_pause_clicked()
{

}

void VerifyWindow::on_pushButton_stop_clicked()
{

}

void VerifyWindow::on_pushButton_save_clicked()
{

}

void VerifyWindow::on_pushButton_close_clicked()
{
    ui->stackedWidget_2->setCurrentIndex(0);
    ui->stackedWidget->setCurrentIndex(0);
    getVerifyMethod();
}

void VerifyWindow::on_pushButton_12_clicked()
{
    showDevice();
}

void VerifyWindow::on_pushButton_10_clicked()
{
    getVerifyMethod();
}

void VerifyWindow::on_pushButton_11_clicked()
{
    ui->lineEdit_9->setText("");
    ui->lineEdit_10->setText("");
    getVerifyMethod();
}