#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("人脸采集成功")); // 重置识别状态码 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(); } } } } 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(); } // 注册虹膜信息 // 弹出提示框 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"; }