Newer
Older
CasicBioRecNew / AddPersonForm.cpp
#include "AddPersonForm.h"
#include "ui_AddPersonForm.h"

AddPersonForm::AddPersonForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AddPersonForm)
{
    ui->setupUi(this);

    // 加载css文件设置控件样式
    QFile file(QApplication::applicationDirPath() + "/qss/addPerson.css");
    if (file.open(QFile::ReadOnly))
    {
        QString qssStr = QLatin1String(file.readAll());
        this->setStyleSheet(qssStr);
        file.close();
    }

    SelectDeptUtil::getInstance().initSelectDept(ui->selectDept, CacheManager::getInstance().getDeptCachePtr());

    faceLabel = new QLabel(this);
    faceLabel->hide();

    // 绑定图像双击槽函数
    connect(ui->labPhotoFace, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoFaceDoubleClicked);
    connect(ui->labPhotoEyeLeft, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoIrisDoubleClicked);
    connect(ui->labPhotoEyeRight, &QDblClickLabel::doubleClicked, this, &AddPersonForm::on_btnHome_clicked);
}

AddPersonForm::~AddPersonForm()
{
    delete ui;
}

void AddPersonForm::setPersonId(QString personId)
{
    this->personId = personId;
}

void AddPersonForm::updateFormTitle(QString title)
{
    ui->labPersonTitle->setText(title);
}

void AddPersonForm::loadPersonInfo(QString personId)
{
    SysPersonDao personDao;
    QVariantMap person = personDao.findRecordById(personId);
    if (person.isEmpty() == false)
    {
        // 赋值姓名
        ui->inputName->setText(person.find("name")->toString());
        ui->inputName->setDisabled(true);
        // 赋值员工编号
        ui->inputCardNo->setText(person.find("person_code")->toString());
        ui->inputCardNo->setDisabled(true);
        // 赋值性别 如果不为空则不能修改
        QString gender = person.find("gender")->toString();
        if (gender == "1")
        {
            ui->radioMale->setChecked(true);
            ui->radioFemale->setDisabled(true);
        } else if (gender == "2")
        {
            ui->radioMale->setDisabled(true);
            ui->radioFemale->setChecked(true);
        } else
        {
            ui->radioMale->setChecked(false);
            ui->radioMale->setChecked(false);
        }
        // 赋值部门 部门可以重新选择
        QString deptId = person.find("deptid")->toString();
        SelectDeptUtil::getInstance().checkDeptSelected(ui->selectDept, CacheManager::getInstance().getDeptCachePtr(), deptId);

        // 查询并显示人脸照片
        FaceDataImgDao faceImgDao;
        QVariantMap faceImage = faceImgDao.findRecordByPersonId(personId);
        ui->labPhotoFace->setPixmap(QPixmap(":/images/photoFace.png"));
        if (faceImage.isEmpty() == false)
        {
            if (faceImage.find("face_image")->toString().isEmpty() == false)
            {
                QString imageData = faceImage.find("face_image")->toString();
                QImage image;
                QPixmap pixmap;
                image.loadFromData(QByteArray::fromBase64(imageData.toLatin1()));
                image = image.scaledToHeight(240, Qt::SmoothTransformation);
                pixmap = QPixmap::fromImage(image);
                ui->labPhotoFace->setPixmap(pixmap);
            }
        }

        // 查询并显示虹膜照片
        IrisDataImgDao irisImgDao;
        QVariantMap irisImage = irisImgDao.findRecordByPersonId(personId);
        ui->labPhotoEyeLeft->setPixmap(QPixmap(":/images/photoEyeLeft.png"));
        ui->labPhotoEyeRight->setPixmap(QPixmap(":/images/photoEyeRight.png"));
        if (irisImage.isEmpty() == false)
        {
            if (irisImage.find("left_image1")->toString().isEmpty() == false)
            {
                QString imageDataLeft = irisImage.find("left_image1")->toString();
                QImage imageLeft;
                QPixmap pixmapLeft;
                imageLeft.loadFromData(QByteArray::fromBase64(imageDataLeft.toLatin1()));
                pixmapLeft = QPixmap::fromImage(imageLeft);
                pixmapLeft = pixmapLeft.scaled(200, 150);
                ui->labPhotoEyeLeft->setPixmap(pixmapLeft);
            }

            if (irisImage.find("right_image1")->toString().isEmpty() == false)
            {
                QString imageDataRight = irisImage.find("right_image1")->toString();
                QImage imageRight;
                QPixmap pixmapRight;
                imageRight.loadFromData(QByteArray::fromBase64(imageDataRight.toLatin1()));
                pixmapRight = QPixmap::fromImage(imageRight);
                pixmapRight = pixmapRight.scaled(200, 150);
                ui->labPhotoEyeRight->setPixmap(pixmapRight);
            }
        }

        // 查询并显示识别记录

    }
}

void AddPersonForm::clearPersonInfo()
{
    ui->inputName->setDisabled(false);
    ui->inputCardNo->setDisabled(false);
    ui->radioMale->setDisabled(false);
    ui->radioFemale->setDisabled(false);
    ui->radioMale->setAutoExclusive(false);
    ui->radioFemale->setAutoExclusive(false);

    ui->inputName->setText("");
    ui->inputCardNo->setText("");
    ui->radioMale->setChecked(false);
    ui->radioFemale->setChecked(false);
    ui->selectDept->setCurrentIndex(0);

    ui->radioMale->setAutoExclusive(true);
    ui->radioFemale->setAutoExclusive(true);

    ui->labPhotoFace->setScaledContents(false);
    ui->labPhotoFace->setPixmap(QPixmap(":/images/photoFace.png"));

    ui->labPhotoEyeLeft->setPixmap(QPixmap(":/images/photoEyeLeft.png"));
    ui->labPhotoEyeRight->setPixmap(QPixmap(":/images/photoEyeRight.png"));
}

void AddPersonForm::drawImageOnForm(QImage imageDisp)
{
    if (this->faceLabel->isVisible() == true)
    {
        LOG(TRACE) << "DRAW IMAGE ON FORM " << imageDisp.width() << "*" << imageDisp.height();

        faceLabel->setPixmap(QPixmap::fromImage(imageDisp));
    }
}

void AddPersonForm::onFailedCaptureFace()
{
    // 隐藏人脸画面显示界面
    faceLabel->hide();

    // 停止拍图
    ProMemory::getInstance().faceCam->stopTakingPhoto();

    // 语音提示
    SpeakerUtil::getInstance().speak(QString("没有找到人脸,请重试"));
}

void AddPersonForm::onSuccessCaptureFace(QString personIdByFace)
{
    // 隐藏人脸画面显示界面
    faceLabel->hide();

    // 停止拍图
    ProMemory::getInstance().faceCam->stopTakingPhoto();

    // 语音提示
    SpeakerUtil::getInstance().speak(QString("人脸采集成功"));

    LOG(DEBUG) << "人脸采集成功";
    if (personIdByFace == "")
    {
        // 人脸库中没有
        // 设置显示人脸照片
        face = CasicFaceRecState::getInstance().imgBase64;
        QPixmap pm;
        pm.loadFromData(QByteArray::fromBase64(face.toLocal8Bit()));
        pm = pm.scaledToHeight(240, Qt::SmoothTransformation);
        ui->labPhotoFace->setPixmap(pm);

        // 计算特征值的字节数组
        for (int i = 0; i < 1024; i++)
        {
            faceCode.append(ByteUtil::floatToBytes(CasicFaceRecState::getInstance().faceInfo->feature[i]));
        }
        this->faceReCaptured = true;
    } else {
        // 命中人脸库中的某人 分以下情况
        // 1. this.personId == "" 表示是重复注册 加载人员信息并语音提示
        // 2. personIdByFace == this.personId 表示是同一个人重新采集人脸 只更新人脸照片和人脸特征值
        // 3. personIdByFace != this.personId 表示重新采集人脸时识别到另一人 需要重新编辑
        if (this->personId.isEmpty() == true)
        {
            // 情况1 重复注册
            loadPersonInfo(personIdByFace);

            // 语音提示
            SpeakerUtil::getInstance().speak(QString("人脸重复注册,请重试"));
            LOG(DEBUG) << "人脸已经注册" << ui->inputName->text().toStdString();
        } else
        {
            if (this->personId == personIdByFace)
            {
                // 情况2 编辑本人
                face = CasicFaceRecState::getInstance().imgBase64;
                QPixmap pm;
                pm.loadFromData(QByteArray::fromBase64(face.toLocal8Bit()));
                pm = pm.scaledToHeight(240, Qt::SmoothTransformation);
                ui->labPhotoFace->setPixmap(pm);

                // 计算特征值的字节数组
                for (int i = 0; i < 1024; i++)
                {
                    faceCode.append(ByteUtil::floatToBytes(CasicFaceRecState::getInstance().faceInfo->feature[i]));
                }

                this->faceReCaptured = true;
            } else {
                // 情况3 编辑时非本人 人脸重复

                // 语音提示
                SpeakerUtil::getInstance().speak(QString("人脸重复注册,请重试"));
                LOG(DEBUG) << "人脸已经注册" << ui->inputName->text().toStdString();
            }
        }
    }
}

bool AddPersonForm::validateForm()
{
    // 验证姓名字段
    QString nameValue = ui->inputName->text().trimmed();
    if (nameValue.isEmpty())
    {
//        ui->inputName->setStyleSheet("border: 2px solid #FF1111;");
        ui->inputName->setPlaceholderText("姓名不能为空");
        return false;
    } else
    {
        ui->inputName->setText(nameValue);
//        ui->inputName->setStyleSheet("border: 1px solid #CCCCCC;");
    }

    // 验证所在部门
    int deptIndex = ui->selectDept->currentIndex();
    if (deptIndex == 0)
    {
//        ui->selectDept->setStyleSheet("border: 2px solid #FF1111;");
        return false;
    } else
    {
//        ui->selectDept->setStyleSheet("border: 1px solid #CCCCCC;");
    }

    return true;
}

void AddPersonForm::registPerson()
{
    SysPersonDao personDao;

    QVariantMap perToRegist;

    // 添加姓名 员工编号 所在部门 性别等信息
    perToRegist.insert("name", ui->inputName->text());
    perToRegist.insert("person_code", ui->inputCardNo->text());
    perToRegist.insert("deptid", ui->selectDept->currentData().toString());
    QString gender = "";
    if (ui->radioMale->isChecked())
    {
        gender = "1";
    } else if (ui->radioFemale->isChecked())
    {
        gender = "2";
    }
    perToRegist.insert("gender", gender);

    // 数据库操作
    QString perIdReg = personDao.save(perToRegist);

    // 注册人脸信息
    if (face.isEmpty() == false && faceCode.isEmpty() == false)
    {
        FaceDataDao faceDataDao;
        FaceDataImgDao faceImgDao;

        QVariantMap faceVar;
        faceVar.insert("person_id", perIdReg);
        faceVar.insert("face_image", face);
        faceVar.insert("face_code", faceCode);
        QString faceImgId = faceImgDao.save(faceVar);
        if (faceImgId.toULongLong() > 0)
        {
            faceVar.insert("image_id", faceImgId);
        }
        QString faceCodeId = faceDataDao.save(faceVar);

        if (faceImgId.toULongLong() < 0 && faceCodeId.toULongLong() < 0)
        {
            OperationTipsDialog tipsDlg;
            tipsDlg.setTipsDialogType(false);
            tipsDlg.setTipsText(QString("%1 人脸保存失败").arg(ui->inputName->text()));
            tipsDlg.exec();
            return;
        } else {
            // 人脸保存成功 更新SYS_PERSON表的人脸字段
            QVariantMap faceValid;
            faceValid.insert("face_valid", "1");
            personDao.edit(faceValid, perIdReg);
        }
    }

    // 注册虹膜信息

    // 弹出提示框
    bool succ = perIdReg == "-1" ? false : true;
    OperationTipsDialog tipsDlg;
    tipsDlg.setTipsDialogType(succ);
    tipsDlg.setTipsText(QString("%1 人员注册%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败"));
    int ret = tipsDlg.exec();

    LOG(INFO) << QString("%1 人员注册%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败").toStdString();

    if (ret == 1)
    {
        emit switchToUserListForm();
    }
}

void AddPersonForm::editPersonInfo()
{
    SysPersonDao personDao;

    // 只能重新选择所在部门
    QVariantMap perToEdit;
    perToEdit.insert("deptid", ui->selectDept->currentData().toString());

    // 如果性别为空则可以重新选择
    QString gender = "";
    if (ui->radioMale->isChecked())
    {
        gender = "1";
    } else if (ui->radioFemale->isChecked())
    {
        gender = "2";
    }
    perToEdit.insert("gender", gender);

    // 数据库操作
    bool succ = personDao.edit(perToEdit, personId);

    // 需要更新人脸数据
    if(this->faceReCaptured == true &&
            face.isEmpty() == false && faceCode.isEmpty() == false)
    {
        QVariantMap faceVar;
        faceVar.insert("face_image", face);
        faceVar.insert("face_code", faceCode);

        QString faceImgId;
        QString faceCodeId;

        // 更新人脸图像数据
        FaceDataImgDao faceImgDao;
        QVariantMap faceImageRec = faceImgDao.findRecordByPersonId(personId); // 查找人脸照片数据库记录
        if (faceImageRec.isEmpty() == true)
        {
            // 没有找到记录 需要新增一条人脸图像
            faceVar.insert("person_id", personId);
            faceImgId = faceImgDao.save(faceVar);
        } else {
            // 找到一条记录
            faceImgId = faceImageRec.value("id").toString();
            faceImgDao.edit(faceVar, faceImgId);
        }

        // 更新人脸特征值数据
        FaceDataDao faceDataDao;
        QVariantMap faceCodeRec = faceDataDao.findRecordByPersonId(personId); // 查找人脸特征值数据库记录
        if (faceCodeRec.isEmpty() == true)
        {
            // 没有找到记录 需要新增一条人脸特征值
            faceVar.insert("person_id", personId);
            faceVar.insert("image_id", faceImgId);
            faceCodeId = faceDataDao.save(faceVar);
        } else {
            // 找到一条记录
            faceCodeId = faceCodeRec.value("id").toString();
            faceDataDao.edit(faceVar, faceCodeId);
        }

        this->faceReCaptured = false;

        // 人脸保存成功 更新SYS_PERSON表的人脸字段
        QVariantMap faceValid;
        faceValid.insert("face_valid", "1");
        personDao.edit(faceValid, personId);

        // 重新加载人脸库
        ProMemory::getInstance().initFaceFeatures();
    }

    // 弹出提示框
    OperationTipsDialog tipsDlg;
    tipsDlg.setTipsDialogType(succ);
    tipsDlg.setTipsText(QString("%1 人员信息编辑%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败"));
    tipsDlg.exec();

    LOG(INFO) << QString("%1 人员信息编辑%2").arg(ui->inputName->text()).arg(succ == true ? "成功" : "失败").toStdString();
}

void AddPersonForm::on_btnBack_clicked()
{
    emit switchToUserListForm();
}

void AddPersonForm::on_btnHome_clicked()
{
    emit backToHomePage();
}

void AddPersonForm::on_btnSave_clicked()
{
    if (validateForm() == false)
    {
        return ;
    }

    // 表单验证通过后执行后续保存的操作
    if (personId.isEmpty() == false)
    {
        editPersonInfo();
    } else {
        registPerson();
    }
}

void AddPersonForm::onPhotoFaceDoubleClicked()
{
    ProMemory::getInstance().faceCam->openFaceCamera(SettingConfig::getInstance().FACE_FRAME_INTERVAL);

    // 1人脸图像显示的容器
    faceLabel->resize(1280, 720);
    faceLabel->move(0, 80);
    faceLabel->raise();
    faceLabel->show();

    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::ADD_PERSON_CAPTURE_FACE;
    ProMemory::getInstance().faceRegistPro->setWorking(true);
    CasicFaceRecState::getInstance().state = CasicFaceRecState::REC_NOT_START;

    LOG(TRACE) << "FACE IMAGE DOUBLE CLICKED";
}

void AddPersonForm::onPhotoIrisDoubleClicked()
{
    LOG(DEBUG) << "DOUBLE CLICKED IRIS";
}