#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(); leftIrisLabel = new QLabel(this); leftIrisLabel->hide(); rightIrisLabel = new QLabel(this); rightIrisLabel->hide(); // 绑定图像双击槽函数 connect(ui->labPhotoFace, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoFaceDoubleClicked); connect(ui->labPhotoEyeLeft, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoIrisDoubleClicked); connect(ui->labPhotoEyeRight, &QDblClickLabel::doubleClicked, this, &AddPersonForm::onPhotoIrisDoubleClicked); } 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::drawIrisImageOnFrame(QImage image, int leftOrRight) { if (this->leftIrisLabel->isVisible() == true) { if (leftOrRight == 0) { leftIrisLabel->setPixmap(QPixmap::fromImage(image)); } else if (leftOrRight == 1) { rightIrisLabel->setPixmap(QPixmap::fromImage(image)); } } } 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("人脸采集成功")); // 重置识别状态码 CasicFaceRecState::getInstance().state = CasicFaceRecState::FaceRecStateName::REC_NOT_START; 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(); } } } } void AddPersonForm::onFailedCaptureIris() { // 隐藏虹膜画面显示界面 leftIrisLabel->hide(); rightIrisLabel->hide(); // 停止拍图 ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().irisRegistPro->setWorking(false); // 语音提示 SpeakerUtil::getInstance().speak(QString("虹膜采集失败,请重试")); } void AddPersonForm::onMatchedIris(QString personIdByIris) { // 找到重复的人 提示需要重新采集 leftIrisLabel->hide(); rightIrisLabel->hide(); // 停止拍图 ProMemory::getInstance().irisCam->stopCapture(); ProMemory::getInstance().irisRegistPro->setWorking(false); if (this->personId.isEmpty() == true) { // 情况1 新注册 重复注册 loadPersonInfo(personIdByIris); // 语音提示 SpeakerUtil::getInstance().speak(QString("虹膜已经注册,请重试")); LOG(DEBUG) << "虹膜已经注册" << ui->inputName->text().toStdString(); } else { // 语音提示 SpeakerUtil::getInstance().speak(QString("虹膜已注册其他人,请重试")); LOG(DEBUG) << "虹膜已注册其他人" << personIdByIris.toStdString(); } } void AddPersonForm::onSuccessCaptureIrisWithoutMatch(CasicIrisInfo * irisInfo) { LOG(INFO) << QString("[AddPersonForm]虹膜编码成功[%1][%2]").arg(irisInfo->leftOrRight).arg(CasicIrisRecState::getInstance().state).toStdString(); updateIrisImage(irisInfo); if (irisInfo->leftOrRight == "left") { // 已经找到右眼, 又找到左眼则编码成功 if (CasicIrisRecState::getInstance().state == CasicIrisRecState::IrisRecStateName::REC_RIGHT_FIND_EYE) { CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT; SpeakerUtil::getInstance().speak("虹膜采集成功"); ProMemory::getInstance().irisCam->stopCapture(); this->irisReCaptured = true; } else { SpeakerUtil::getInstance().speak("左眼虹膜编码成功"); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_LEFT_FIND_EYE; ProMemory::getInstance().irisRegistPro->setWorking(true); // 左眼采集成功 重新开始工作 } } else { // 已经找到左眼, 又找到右眼则编码成功 if (CasicIrisRecState::getInstance().state == CasicIrisRecState::IrisRecStateName::REC_LEFT_FIND_EYE) { CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_FEATURE_EXTRACT; SpeakerUtil::getInstance().speak("虹膜采集成功"); ProMemory::getInstance().irisCam->stopCapture(); this->irisReCaptured = true; } else { SpeakerUtil::getInstance().speak("右眼虹膜编码成功"); CasicIrisRecState::getInstance().state = CasicIrisRecState::IrisRecStateName::REC_RIGHT_FIND_EYE; ProMemory::getInstance().irisRegistPro->setWorking(true); // 右眼采集成功 重新开始工作 } } } 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); } // 重新加载人脸库 ProMemory::getInstance().initFaceFeatures(); } // 注册虹膜信息 if (leftIrisCode.isEmpty() == false && rightIrisCode.isEmpty() == false) { IrisDataDao irisDao; IrisDataImgDao irisImgDao; QVariantMap irisVar; irisVar.insert("person_id", perIdReg); irisVar.insert("left_image1", leftIris); irisVar.insert("right_image1", rightIris); irisVar.insert("left_iris_code1", leftIrisCode); irisVar.insert("right_iris_code1", rightIrisCode); QString irisImgId = irisImgDao.save(irisVar); if (irisImgId.toULongLong() > 0) { irisVar.insert("image_id", irisImgId); } QString irisCodeId = irisDao.save(irisVar); if (irisImgId.toULongLong() < 0 || irisCodeId.toULongLong() < 0) { OperationTipsDialog tipsDlg; tipsDlg.setTipsDialogType(false); tipsDlg.setTipsText(QString("%1 虹膜保存失败").arg(ui->inputName->text())); tipsDlg.exec(); return; } else { // 虹膜保存成功 更新SYS_PERSON表的虹膜字段 QVariantMap irisValid; irisValid.insert("iris_valid", "1"); personDao.edit(irisValid, perIdReg); } // 重新加载虹膜库 ProMemory::getInstance().initIrisFeatures(); } // 弹出提示框 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(); } // 需要更新虹膜数据 if (irisReCaptured == true && leftIrisCode.isEmpty() == false && rightIrisCode.isEmpty() == false) { QVariantMap irisVar; irisVar.insert("left_image1", leftIris); irisVar.insert("right_image1", rightIris); irisVar.insert("left_iris_code1", leftIrisCode); irisVar.insert("right_iris_code1", rightIrisCode); QString irisImgId; QString irisCodeId; // 更新虹膜图像数据 IrisDataImgDao irisImgDao; QVariantMap irisImageRec = irisImgDao.findRecordByPersonId(personId); // 查找人脸照片数据库记录 if (irisImageRec.isEmpty() == true) { // 没有找到记录 需要新增一条人脸图像 irisVar.insert("person_id", personId); irisImgId = irisImgDao.save(irisVar); } else { // 找到一条记录 irisImgId = irisImageRec.value("id").toString(); irisImgDao.edit(irisVar, irisImgId); } // 更新虹膜特征值数据 IrisDataDao irisDao; QVariantMap irisCodeRec = irisDao.findRecordByPersonId(personId); // 查找人脸特征值数据库记录 if (irisCodeRec.isEmpty() == true) { // 没有找到记录 需要新增一条人脸特征值 irisVar.insert("person_id", personId); irisVar.insert("image_id", irisImgId); irisCodeId = irisDao.save(irisVar); } else { // 找到一条记录 irisCodeId = irisCodeRec.value("id").toString(); irisDao.edit(irisVar, irisCodeId); } this->irisReCaptured = false; // 虹膜保存成功 更新SYS_PERSON表的虹膜字段 QVariantMap irisValid; irisValid.insert("iris_valid", "1"); personDao.edit(irisValid, personId); // 重新加载虹膜库 ProMemory::getInstance().initIrisFeatures(); } // 弹出提示框 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::updateIrisImage(CasicIrisInfo * irisInfo) { if (irisInfo->leftOrRight == "left") { // 显示左眼的虹膜图像 QPixmap pmLeft = QPixmap::fromImage(irisInfo->data); pmLeft = pmLeft.scaled(192, 144); ui->labPhotoEyeLeft->setPixmap(pmLeft); leftIris = ImageUtil::QImageToBase64(irisInfo->data); // 虹膜特征值字节数组 leftIrisCode = irisInfo->irisCode; leftIrisLabel->hide(); } else if (irisInfo->leftOrRight == "right") { // 设置显示左右虹膜照片 QPixmap pmRight = QPixmap::fromImage(irisInfo->data); pmRight = pmRight.scaled(192, 144); ui->labPhotoEyeRight->setPixmap(pmRight); rightIris = ImageUtil::QImageToBase64(irisInfo->data); rightIrisCode = irisInfo->irisCode; rightIrisLabel->hide(); } } 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(TRACE) << "DOUBLE CLICKED IRIS " << personId.toStdString(); // 编辑时先发指令重新加载虹膜库 去掉自己 ProMemory::getInstance().initIrisFeatures(personId); // 0. 语音提示开始采集 SpeakerUtil::getInstance().speak(QString("采集虹膜")); // 开始拍图 ProMemory::getInstance().irisCam->startCapture(); // 1虹膜图像显示的容器 leftIrisLabel->resize(640, 480); leftIrisLabel->move(0, 80); leftIrisLabel->raise(); leftIrisLabel->show(); rightIrisLabel->resize(640, 480); rightIrisLabel->move(640, 80); rightIrisLabel->raise(); rightIrisLabel->show(); ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::ADD_PERSON_CAPTURE_IRIS; ProMemory::getInstance().irisRegistPro->setWorking(true); // 开始工作 }