- •Нияу мифи Факультет «Автоматики и электроники» Кафедра «Компьютерные медицинские системы»
- •Оглавление
- •Глоссарий
- •Цели и задачи
- •Предпроектное исследование
- •2.1. Актуальность
- •2.2. Анализ предметной области
- •Классификации
- •Функциональные сппр
- •Сппр, использующие независимые витрины данных
- •Сппр на основе двухуровневого хранилища данных
- •Сппр на основе трехуровневого хранилища данных
- •Структура
- •Преимущества
- •Динамическое моделирование
- •Преимущества sqLite
- •Недостатки sqLite
- •Когда использовать sqLite
- •Когда отказаться от sqLite
- •Преимущества MySql
- •Недостатки MySql
- •Когда следует использовать MySql
- •Когда лучше отказаться от MySql
- •Файловая бд
- •Возраст
- •Раса и этнический фактор
- •Генетический фактор. Роль наследственности
- •Роль диеты, особенностей питания и конституции
- •2.3. Междисциплинарные исследования
- •2.4.Анализ объектной среды
- •3 Требования к экспертной системе
- •3.1. Системные требования
- •3.2 Функциональные требования бд
- •3.3. Требования к среде и языку разработки:
- •3.4. Требования к тестированию:
- •5.Проектные решения
- •5.1 Разработка ребований к среде и языку разработки:
- •5 Физическая реализация и тестирование
- •5.1. Реализация
- •5.2. Тестирование
- •1 Этап.
- •2 Этап проверка работоспособности бд с данными признаками и изображениями
- •Заключение
- •Список литературы
3.3. Требования к среде и языку разработки:
Язык разработки – SQLite.
Среда разработки интерфейса– Qt 5.2.0.
Язык разработки интерфейса – C++.
3.4. Требования к тестированию:
а) Необходимые условия для тестирования:
Наличие компонентов программы.
Наличие компонентов системы.
б) Работы по тестированию:
Программа должна быть протестирована на выполнение всех функций, заявленных в п. 1.1.
в) Протоколы тестирования:
План тестирования или технические требования (спецификация) к тестированию.
Все результаты, связанные с контрольными примерами, включая все ошибки, выявленные при выполнении теста.
г) Отчет о тестировании:
Обозначение продукта.
Вычислительные системы, использованные при тестировании (технические средства, программные средства и их конфигурация).
Использованные документы (включая их обозначения).
Результаты тестирования программы и данных.
Перечень несоответствий требованиям, либо перечень несоответствий рекомендациям, либо перечень неучтенных в продукте рекомендаций, либо формулировка того, что продукт не был протестирован на соответствие рекомендациям.
5.Проектные решения
5.1 Разработка ребований к среде и языку разработки:
Язык разработки базы данных – SQLite.
Среда разработки базы данных– Qt 5.2.0.
Язык разработки базы данных – C++.
Реализация база данных пациента и визуальных признаков
База пациенты
voidMyDAO::createDatabase()
{
QSqlQueryquery(sdb);
query.exec("CREATETABLEcard(idINTEGERPRIMARYKEY,id_patientINTEGER,id_imageINTEGER,create_dateSTRING)");
query.exec("CREATETABLEcategory_prizn(idINTEGERPRIMARYKEY,nameSTRING)");
query.exec("CREATETABLEill_category(idINTEGERPRIMARYKEY,nameSTRING)");
query.exec("CREATETABLEill_table(idINTEGERPRIMARYKEY,id_categoryINTEGER,nameSTRING)");
query.exec("CREATETABLEimages(idINTEGERPRIMARYKEY,nameSTRING,pathSTRING,typeINTEGER)");
query.exec("CREATETABLEpatient(idINTEGERPRIMARYKEY,last_nameSTRING,first_nameSTRING,middle_nameSTRING,birth_dateSTRING,sexINTEGER,create_dateSTRING)");
query.exec("CREATETABLEpatient_ill(id_cardINTEGER,id_illINTEGER)");
query.exec("CREATETABLEpatient_prizn(id_cardINTEGER,id_priznakINTEGER)");
query.exec("CREATETABLEvisual_priznaki(idINTEGERPRIMARYKEY,id_categoryINTEGER,nameSTRING)");
}
QList<Patient>MyDAO::getAllPatients()
{
QList<Patient>result;
QSqlQueryquery(sdb);
query.exec("SELECT*FROMpatient");
while(query.next()){
Patientpatient;
patient.setId(query.value(0).toInt());
patient.setLastName(query.value(1).toString());
patient.setFirstName(query.value(2).toString());
patient.setMiddleName(query.value(3).toString());
patient.setBirthDate(QDate::fromString(query.value(4).toString(),"yyyy-MM-dd"));
patient.setSex(query.value(5).toInt());
patient.setCreateDate(QDate::fromString(query.value(6).toString(),"yyyy-MM-dd"));
result<<patient;
}
returnresult;
}
PatientMyDAO::getPatientById(intid)
{
Patientresult;
QSqlQueryquery(sdb);
QStringsql="SELECT*FROMpatientwhereid="+QString::number(id);
query.exec(sql);
while(query.next()){
result.setId(query.value(0).toInt());
result.setLastName(query.value(1).toString());
result.setFirstName(query.value(2).toString());
result.setMiddleName(query.value(3).toString());
result.setBirthDate(QDate::fromString(query.value(4).toString(),"yyyy-MM-dd"));
result.setSex(query.value(5).toInt());
result.setCreateDate(QDate::fromString(query.value(6).toString(),"yyyy-MM-dd"));
}
returnresult;
}
voidMyDAO::insertPatient(Patientpatient)
{
QSqlQueryquery(sdb);
QStringsql="INSERTintopatient(last_name,first_name,middle_name,birth_date,sex,create_date)values('"+
patient.getLastName()+"','"+patient.getFirstName()+"','"+patient.getMiddleName()+"','"+
patient.getBirthDate().toString("yyyy-MM-dd")+"','"+QString::number(patient.getSex())+"','"+
patient.getCreateDate().toString("yyyy-MM-dd")+"')";
query.exec(sql);
}
voidMyDAO::updatePatient(Patientpatient)
{
QSqlQueryquery(sdb);
QStringsql="UPDATEpatientsetlast_name='"+patient.getLastName()+"',first_name='"+patient.getFirstName()+
"',middle_name='"+patient.getMiddleName()+"',birth_date='"+patient.getBirthDate().toString("yyyy-MM-dd")+
"',sex='"+QString::number(patient.getSex())+"',create_date='"+patient.getCreateDate().toString("yyyy-MM-dd")+"'whereid="+QString::number(patient.getId());
query.exec(sql);
}
voidMyDAO::deletePatient(intid)
{
QSqlQueryquery(sdb);
QStringsql="DELETEFROMpatientwhereid="+QString::number(id);
query.exec(sql);
}
QList<PImage>MyDAO::getAllImages()
{
QList<PImage>result;
QSqlQueryquery(sdb);
query.exec("SELECT*FROMimages");
while(query.next()){
if(query.value(3).toInt()==1)
{
PImageimage;
image.setId(query.value(0).toInt());
image.setName(query.value(1).toString());
image.setPath(query.value(2).toString());
result<<image;
}
}
returnresult;
}
voidMyDAO::insertPatient(Patientpatient)
{
QSqlQueryquery(sdb);
QStringsql="INSERTintopatient(last_name,first_name,middle_name,birth_date,sex,create_date)values('"+
patient.getLastName()+"','"+patient.getFirstName()+"','"+patient.getMiddleName()+"','"+
patient.getBirthDate().toString("yyyy-MM-dd")+"','"+QString::number(patient.getSex())+"','"+
patient.getCreateDate().toString("yyyy-MM-dd")+"')";
query.exec(sql);
}
voidMyDAO::updatePatient(Patientpatient)
{
QSqlQueryquery(sdb);
QStringsql="UPDATEpatientsetlast_name='"+patient.getLastName()+"',first_name='"+patient.getFirstName()+
"',middle_name='"+patient.getMiddleName()+"',birth_date='"+patient.getBirthDate().toString("yyyy-MM-dd")+
"',sex='"+QString::number(patient.getSex())+"',create_date='"+patient.getCreateDate().toString("yyyy-MM-dd")+"'whereid="+QString::number(patient.getId());
query.exec(sql);
}
voidMyDAO::deletePatient(intid)
{
QSqlQueryquery(sdb);
QStringsql="DELETEFROMpatientwhereid="+QString::number(id);
query.exec(sql);
}
QList<PImage>MyDAO::getAllImages()
{
QList<PImage>result;
QSqlQueryquery(sdb);
query.exec("SELECT*FROMimages");
while(query.next()){
if(query.value(3).toInt()==1)
{
PImageimage;
image.setId(query.value(0).toInt());
image.setName(query.value(1).toString());
image.setPath(query.value(2).toString());
result<<image;
}
}
returnresult;
}
Виз.признаки
VisualPriznakMyDAO::getPriznakById(intid)
{
VisualPriznakresult;
QSqlQueryquery(sdb);
QSqlQueryquery2(sdb);
QStringsql="SELECT*FROMvisual_priznakiwhereid="+QString::number(id);
query.exec(sql);
while(query.next()){
result.setId(query.value(0).toInt());
result.setName(query.value(2).toString());
QStringsubQuery="SELECT*FROMcategory_priznWHEREid="+query.value(1).toString();
query2.exec(subQuery);
if(query2.next()){
PriznakCategorycategory;
category.setId(query2.value(0).toInt());
category.setName(query2.value(1).toString());
result.setPriznakCategory(category);
}
}
returnresult;
}
voidMyDAO::insertPriznak(VisualPriznakpriznak)
{
QSqlQueryquery(sdb);
QStringsql="INSERTintovisual_priznaki(id_category,name)values('"+
QString::number(priznak.getPriznakCategory().getId())+"','"+priznak.getName()+"')";
query.exec(sql);
}
voidMyDAO::updatePriznak(VisualPriznakpriznak)
{
QSqlQueryquery(sdb);
QStringsql="UPDATEvisual_priznakisetname='"+priznak.getName()+"',id_category='"+QString::number(priznak.getPriznakCategory().getId())+"'whereid="+QString::number(priznak.getId());
query.exec(sql);
}
voidMyDAO::deletePriznak(intid)
{
QSqlQueryquery(sdb);
QStringsql="DELETEFROMvisual_priznakiwhereid="+QString::number(id);
query.exec(sql);
}
Добавление удаление редактирование записей в таблицах пациенты и виз.признаки
voidAddEditDialog::okClicked()
{
MyDAO*myDao=newMyDAO();
if(type==0)//newrecord
{
if(state==0)
{
Patientitem;
item.setLastName(name1->text());
item.setFirstName(name2->text());
item.setMiddleName(name3->text());
item.setBirthDate(dateEdit->date());
item.setSex((isMale)?1:0);
myDao->insertPatient(item);
}
if(state==1)
{
PImageitem;
item.setName(name1->text());
item.setPath(name2->text());
item.setType(1);
myDao->insertImage(item);
}
if(state==3)
{
VisualPriznakitem;
item.setName(name2->text());
item.setPriznakCategory(myDao->getPriznakCategory(categoryId.toInt()));
myDao->insertPriznak(item);
}
if(state==4)
{
PriznakCategoryitem;
item.setName(name1->text());
myDao->insertPriznakCategory(item);
}
}
if(type==1)//updaterecord
{
if(state==0)
{
Patientitem;
item.setId(id.toInt());
item.setLastName(name1->text());
item.setFirstName(name2->text());
item.setMiddleName(name3->text());
item.setBirthDate(dateEdit->date());
item.setSex((isMale)?1:0);
myDao->updatePatient(item);
}
if(state==1)
{
PImageitem;
item.setId(id.toInt());
item.setName(name1->text());
item.setPath(name2->text());
item.setType(1);
myDao->updateImage(item);
}
if(state==3)
{
VisualPriznakitem;
item.setId(id.toInt());
item.setName(name2->text());
item.setPriznakCategory(myDao->getPriznakCategory(categoryId.toInt()));
myDao->updatePriznak(item);
}
if(state==5)
{
PriznakCategoryitem;
item.setId(id.toInt());
item.setName(name1->text());
myDao->updatePriznakCategory(item);
}
}
myDao->closeDb();
accept();
}
Запрос по пациентам и виз.признакам
voidReportDialog::patientSel()
{
ItemBookDialogdlg(this,0,1);
if(dlg.exec()==QDialog::Accepted)
{
patientName->setText(dlg.getName());
patientId=dlg.getId();
}
}
voidReportDialog::patientClear()
{
patientName->clear();
patientId="0";
}
voidReportDialog::illSel()
{
MultipleSelectDialogdlg(this,2);
if(dlg.exec()==QDialog::Accepted)
{
QStringListnames=dlg.names;
illIds=dlg.ids;
QStringtxtNames="";
foreach(QStringitem,names)
{
txtNames+=item+",";
}
illName->setText(txtNames);
}
}
voidReportDialog::illClear()
{
illName->clear();
foreach(QStringitem,illIds)
{
item="-1";
}
}
voidReportDialog::prSel()
{
MultipleSelectDialogdlg(this,3);
if(dlg.exec()==QDialog::Accepted)
{
QStringListnames=dlg.names;
prIds=dlg.ids;
QStringtxtNames="";
foreach(QStringitem,names)
{
txtNames+=item+",";
}
prName->setText(txtNames);
}
}
voidReportDialog::prClear()
{
prName->clear();
foreach(QStringitem,prIds)
{
item="-1";
}
}
voidReportDialog::save()
{
if(m_document==NULL)return;
QStringsaveName=QFileDialog::getSaveFileName(this,"Сохранениерезультата",QDir::currentPath(),"ODFdocument(*.odf);;Allfiles(*.*)");
if(!saveName.isNull())
{
QTextDocumentWriterwriter(saveName);
writer.setFormat("odf");
writer.write(m_document);
}
}
voidReportDialog::report()
{
if(prName->text()!="")
{
QStringname=prName->text();
DiagnozReportDialogdlg(this,true,&prIds,&name);
dlg.exec();
}
}
voidReportDialog::itemDoubleClicked(QTableWidgetItem*item)
{
introw=item->row();
QTableWidgetItem*it=newQTableWidgetItem;
it=this->tableWidget->item(row,3);
imageshowimg(this,it->text().toInt());
img.exec();
}
voidReportDialog::updateTable()
{
tableWidget->clear();
QStringallSql="selectcard.*fromcard";
if(box3->isChecked())
{
allSql+="joinpatient_illoncard.id=patient_ill.id_card";
}
if(box4->isChecked())
{
allSql+="joinpatient_priznoncard.id=patient_prizn.id_card";
}
if((box1->isChecked())||(box2->isChecked())||(box3->isChecked())||(box4->isChecked()))allSql+="where1";
if(box1->isChecked())
{
allSql+="andcard.create_date>='"+dateEdit1->date().toString("yyyy-MM-dd")+"'andcard.create_date<='"+dateEdit2->date().toString("yyyy-MM-dd")+"'";
}
if(box2->isChecked())
{
allSql+="andcard.id_patient="+patientId+"";
}
if(box3->isChecked())
{
intfirst=0;
foreach(QStringitem,illIds)
{
if(first==0)
{
first=1;
allSql+="and(patient_ill.id_ill="+item+"";
}
else
{
allSql+="orpatient_ill.id_ill="+item+"";
}
}
allSql+=")";
}
if(box4->isChecked())
{
allSql+="and(patient_prizn.id_priznak="+prIds[0]+")";
}
if(type==1)
{
allSql+="groupbypatient_prizn.id_priznak";
}
MyDAO*myDao=newMyDAO();
QList<PatientCard>tempList=myDao->findAllCards(allSql);
QList<PatientCard>cardList;
foreach(PatientCardcard,tempList)
{
intk=0;
inti=prIds.size();
foreach(QStringoneid,prIds)
{
foreach(VisualPriznakpr,card.getVisulPriznaks())
{
if(pr.getId()==oneid.toInt())
{
++k;
break;
}
}
}
if(k==i)
cardList.append(card);
}
tableWidget->setColumnCount(4);
tableWidget->setColumnWidth(0,300);
tableWidget->setColumnWidth(1,200);
tableWidget->setColumnWidth(2,420);
tableWidget->setColumnWidth(3,1);
tableWidget->clear();
tableWidget->setRowCount(0);
QTableWidgetItem*hdr2=newQTableWidgetItem(tr("Данныепациента"));
QTableWidgetItem*hdr4=newQTableWidgetItem(tr("Визуальныепризнаки"));
tableWidget->setHorizontalHeaderItem(0,hdr2);
tableWidget->setHorizontalHeaderItem(2,hdr4);
intraw_num=0;
foreach(PatientCarditem,cardList)
{
tableWidget->setRowCount(raw_num+1);
QStringpatientInfo;
patientInfo=item.getPatient().getLastName()+""+item.getPatient().getFirstName()+""+item.getPatient().getMiddleName();
patientInfo+="\nДатарождения:"+item.getPatient().getBirthDate().toString("dd.MM.yyyy");
patientInfo+="\nДатаобращения:"+item.getCreateDate().toString("dd.MM.yyyy");
QList<Ill>ills=item.getIlls();
QStringtext1="";
foreach(Illi1,ills)
{
text1+=i1.getName()+"";
}
patientInfo+="\nЗаболевание:"+text1;
QTableWidgetItem*patient=newQTableWidgetItem(patientInfo);
QList<VisualPriznak>vps=item.getVisulPriznaks();
QStringtext2="";
intm=0;
foreach(VisualPriznaki1,vps)
{
++m;
text2+=QString::number(m)+"."+i1.getName()+"\n";
}
QTableWidgetItem*priznak=newQTableWidgetItem(text2);
QImagepicture1;
picture1.load(item.getImage().getPath());
picture1=picture1.scaled(200,200,Qt::IgnoreAspectRatio,Qt::FastTransformation);
QBrushbrush(picture1);
QTableWidgetItem*preview=newQTableWidgetItem();
preview->setBackground(brush);
QTableWidgetItem*imgId=newQTableWidgetItem(QString::number(item.getImage().getid()));
tableWidget->setRowHeight(raw_num,200);
tableWidget->setItem(raw_num,3,imgId);
tableWidget->setItem(raw_num,0,patient);
tableWidget->setItem(raw_num,1,preview);
tableWidget->setItem(raw_num,2,priznak);
++raw_num;
}
QStringstatStr="Всегонайдено"+QString::number(raw_num)+"случаев.";
statistic->setText(statStr);
myDao->closeDb();
deleteButton->setVisible(true);
}
4 Концептуальная модель системы
Пользователь системы
База знаний признаков

Рабочий интерфейс
Программный код интерфейса


База знаний болезней




Постановка диагноза

База знаний изображений



Вывод данных на экран
