Рисунок А.2 - Главное окно приложения
При нажатии кнопки «Работа с задачами по устранению ТП», открывается окно работы с задачами по устранению ТП (рисунок А.3).
Рисунок А.3 - Окно работы с задачами по устранению ТП
Для получения приемов необходимо выбрать из двух таблиц параметры и добавить их в список выбранных параметров. По мере добавления приемы будут отображены в списке приемов для выбранных параметров (рисунок А.4).
Рисунок А.4 - Текущий набор параметров управляющей функции
Также в данной информационной системе присутствует возможность сохранения задачи в базу данных. Для сохранения задачи пользователю необходимо нажать на кнопку «Сохранить задачу» (рисунок А. 5), ввести название задачи и нажать кнопку «Ок», после чего система сохранит все данные.
Рисунок А.5 - Ввод названия сохраняемой задачи
Таблица А.1 - Описание аварийных ситуаций
|
Класс ошибки |
Ошибка |
Описание ошибки |
Требуемые действия пользователя при возникновении ошибки |
|
|
ИС поддержки генерирования новых идей на основе энерго-информационного подхода |
Ошибка: Введенные логии и/или пароль неверны |
При попытке авторизации в ИС введены несуществующие логин и/или пароль. |
Ввести валидные логин и пароль. |
|
|
Ошибка: К сожалению, для выбранных параметров нет приемов |
Пользователь выбрал пару параметров, для которых в БД нет приемов |
Выбрать другую пару параметров противоречия |
||
|
Ошибка: Выберите оба параметра! |
Пользователь не выбрал оба параметра противоречия. |
Нужно выбрать оба параметра противоречия |
||
|
Ошибка: Выбранное имя задачи уже существует, попробуйте другое |
Пользователь ввел название сохраняемой задачи, которое уже было сохранено системой |
Ввести другое название для сохранения задачи |
||
|
Ошибка: Выбранное имя параметра уже существует, попробуйте другое |
Пользователь ввел название параметра, которое уже было сохранено системой |
Ввести другое название параметра |
||
|
Ошибка: Выбранное имя приема уже существует, попробуйте другое |
Пользователь ввел название приема, которое уже было сохранено системой |
Ввести другое название приема |
||
|
Ошибка: Все поля обязательны к заполнению |
Пользователь ввел не все значения, необходимые для сохранения |
Ввести оставшиеся значения |
ПРИЛОЖЕНИЕ Б
Листинг программы
Workwithtask.cpp (Работа с задачами)
#include "workwithtask.h"
#include "math.h"
WorkWithTask::WorkWithTask(QWidget *parent, int newUserId, int newUserRights) : BaseWidget(parent)
{
this->setWindowTitle("Работа с задачами по устранению ТП");
this->setUserID(newUserId);this->setUserRights(newUserRights);
list_idparams_left_alreadyintable.clear();
list_idparams_right_alreadyintable.clear();
list_priems_alreadyintable.clear();
list_priems_overallRate_alreadyintable.clear();
QObject::connect(pushbutton_Add,SIGNAL(clicked(bool)),this,SLOT(pushbutton_Add_ok()));
QObject::connect(pushbutton_Load,SIGNAL(clicked(bool)),this,SLOT(pushbutton_Load_ok()));
QObject::connect(pushbutton_New,SIGNAL(clicked(bool)),this,SLOT(pushbutton_New_ok()));
QObject::connect(pushbutton_Save,SIGNAL(clicked(bool)),this,SLOT(pushbutton_Save_ok()));
QObject::connect(pushbutton_give_rates,SIGNAL(clicked(bool)),this,SLOT(pushbutton_give_rates_ok()));
QObject::connect(tablewidget_priems,SIGNAL(cellChanged(int,int)),this,SLOT(tablewidget_priems_data_changed(int,int)));
QObject::connect(pushbutton_sprav_priemov,SIGNAL(clicked(bool)),this,SLOT(pushbutton_sprav_priemov_ok()));
tablewidget_parametres_left->setSelectionMode(QAbstractItemView::SingleSelection);
tablewidget_parametres_left->setSelectionBehavior(QAbstractItemView::SelectItems);
tablewidget_parametres_left->verticalHeader()->hide();
tablewidget_parametres_right->setSelectionMode(QAbstractItemView::SingleSelection);
tablewidget_parametres_right->setSelectionBehavior(QAbstractItemView::SelectItems);
tablewidget_parametres_right->verticalHeader()->hide();
tablewidget_priems->setSelectionMode(QAbstractItemView::SingleSelection);
tablewidget_priems->setSelectionBehavior(QAbstractItemView::SelectItems);
tablewidget_priems->verticalHeader()->hide();
DbConnect db;
QSqlQuery query=db.dbExec("SELECT * FROM Parametres_left");
int size=db.dbSize(query);
tablewidget_parametres_left->setColumnCount(1);
tablewidget_parametres_left->setRowCount(size);
tablewidget_parametres_right->setColumnCount(1);
tablewidget_parametres_right->setRowCount(size);
tablewidget_parametres_left->setMinimumHeight(250);
tablewidget_parametres_right->setMinimumHeight(250);
tablewidget_priems->setColumnCount(3);
tablewidget_priems->setRowCount(0);
tablewidget_parametres_left->setColumnWidth(0,450);
tablewidget_parametres_right->setColumnWidth(0,450);
tablewidget_priems->setColumnWidth(0,300);
tablewidget_priems->setColumnWidth(1,92);
tablewidget_priems->setColumnWidth(2,92);
QStringList strlist;
strlist.append("Прием");strlist.append("Общая оценка");strlist.append("Ваша оценка");
tablewidget_priems->setHorizontalHeaderLabels(strlist);
strlist.clear();
strlist.append("Параметр улучшить");
tablewidget_parametres_left->setHorizontalHeaderLabels(strlist);
strlist.clear();
strlist.append("Параметр при этом ухудшается");
tablewidget_parametres_right->setHorizontalHeaderLabels(strlist);
\
for(int i=0;i<size;i++){
query.next();
QTableWidgetItem *item = new QTableWidgetItem;
item->setText(query.value(1).toString());
item->setFlags(item->flags() ^ Qt::ItemIsEditable);//УБИРАЕТ ИЗ ФЛАГОВ ЕДИТАБЛ
QTableWidgetItem *item2 = new QTableWidgetItem;
item2->setText(query.value(1).toString());
item2->setFlags(item2->flags() ^ Qt::ItemIsEditable);//УБИРАЕТ ИЗ ФЛАГОВ ЕДИТАБЛ
tablewidget_parametres_left->setItem(i,0,item);
tablewidget_parametres_right->setItem(i,0,item2);
}
//вывод на виджет
layout_main->addWidget(pushbutton_New,0,0,1,2);
layout_main->addWidget(pushbutton_Save,0,2,1,2);
layout_main->addWidget(pushbutton_Load,0,4,1,2);
layout_main->addWidget(label_task_name,1,0,1,3);
layout_main->addWidget(tablewidget_parametres_left,2,0,1,3);
layout_main->addWidget(tablewidget_parametres_right,2,3,1,3);
layout_main->addWidget(pushbutton_Add,3,0,1,2);
layout_main->addWidget(pushbutton_sprav_priemov,3,4,1,2);
layout_main->addWidget(label_spisok_paramov,4,0,1,3);
layout_main->addWidget(listwidget_params,5,0,1,3);
layout_main->addWidget(label_spisok_priemov,4,3,1,3);
layout_main->addWidget(tablewidget_priems,5,3,1,3);
// layout_main->addWidget(pushbutton_give_rates,6,0,1,3);
this->setLayout(layout_main);
}
void WorkWithTask::pushbutton_New_ok()
{
listwidget_params->clear();
tablewidget_priems->clear();
list_idparams_left_alreadyintable.clear();
list_idparams_right_alreadyintable.clear();
list_priems_alreadyintable.clear();
list_priems_overallRate_alreadyintable.clear();
label_task_name->setText("Имя задачи: Новая");
QStringList strlist;
strlist.append("Прием");strlist.append("Общая оценка");strlist.append("Ваша оценка");
tablewidget_priems->setHorizontalHeaderLabels(strlist);
tablewidget_priems->setRowCount(0);
}
void WorkWithTask::pushbutton_Save_ok()
{
QStringList strlist=label_task_name->text().split(": ");
if(strlist.at(1)=="Новая"){
bool ok;
QString text = QInputDialog::getText(this,
QString::fromUtf8("Введите название задачи"),
QString::fromUtf8("Название:"),
QLineEdit::Normal,
"", &ok);
if (ok && !text.isEmpty()){
if((text.toLower()=="новая")){
QMessageBox::information(this,"Ошибка","'новая' является зарезервированным словом, попробуйте другое");
return;
}
QSqlQuery query;
query.exec("SELECT * FROM Task_list WHERE id_user="+QString::number(this->getUserID())+" AND name_task="+text);
int size=0;
while(query.next()){
size++;
}
if(size!=0){
QMessageBox::information(this,"Ошибка","Выбранное имя уже существует, попробуйте другое");
return;
}
//стартуем процесс сохранения, а это сложно!
query.clear();
if(listwidget_params->count()==0){
QMessageBox::information(this,"Ошибка","Добавьте хотя бы один прием");
return;
}
query.exec("SELECT * FROM Task_list");
int last_id_taskList=0;
while(query.next()){
last_id_taskList=query.value(0).toInt();
}
query.clear();
query.prepare("INSERT INTO Task_list (id_task, name_task, id_user)"
" VALUES (:id_task, :name_task, :id_user)");
query.bindValue(":id_task",last_id_taskList+1);
query.bindValue(":name_task",text);
query.bindValue(":id_user",this->getUserID());
query.exec();
for(int i=0;i<listwidget_params->count();i++){
query.clear();//вставляем параметры
query.prepare("INSERT INTO Task_inside_parametres (id_task, id_parametr_left, id_parametr_right)"
" VALUES (:id_task, :id_parametr_left, :id_parametr_right)");
QStringList strlist=listwidget_params->item(i)->text().split(" - ");
query.bindValue(":id_task",last_id_taskList+1);
query.bindValue(":id_parametr_left",list_idparams_left_alreadyintable.at(i));
query.bindValue(":id_parametr_right",list_idparams_right_alreadyintable.at(i));
query.exec();
}
for(int i=0;i<list_priems_alreadyintable.size();i++){ //вставляем приемы
query.clear();
query.prepare("INSERT INTO Task_inside_priems (id_task, id_priem, id_rate)"
" VALUES (:id_task, :id_priem, :id_rate)");
query.bindValue(":id_task",last_id_taskList+1);
query.bindValue(":id_priem",list_priems_alreadyintable.at(i));
query.bindValue(":id_rate",tablewidget_priems->item(i,2)->text().toInt());
query.exec();
}
query.clear();
label_task_name->setText("Имя задачи: "+text);
}
}else{ //при работе с неновой надо просто обновить все значения! А это непросто!
QSqlQuery query;
//сначала проверяем все ли осталось на месте, если нет - то надо удалить
//да не, даже просто все проверяем по нашим текущим
// сначала по приемам проедемся
//тут сначала удаляем лишнее
// query.exec("SELECT * FROM Task_inside_parametres WHERE id_task="+QString::number(id_task_chosen));
//тут теперь вставляем новье
for(int i=0;i<list_idparams_left_alreadyintable.size();i++){
query.exec("SELECT * FROM Task_inside_parametres WHERE id_task="+QString::number(id_task_chosen)
+" AND id_parametr_left="+QString::number(list_idparams_left_alreadyintable.at(i))
+" AND id_parametr_right="+QString::number(list_idparams_right_alreadyintable.at(i)));
int size=0;
while(query.next()){
size++;
}
// QMessageBox::information(this,"size, if size then exist",QString::number(size));//отлично пашет 1 - есть, 0 - нет
if(size==0){//если нуль, значит такого еще нет, срочно добавить!
query.clear();
query.prepare("INSERT INTO Task_inside_parametres (id_task, id_parametr_left, id_parametr_right)"
" VALUES (:id_task, :id_parametr_left, :id_parametr_right)");
query.bindValue(":id_task",id_task_chosen);
query.bindValue(":id_parametr_left",list_idparams_left_alreadyintable.at(i));
query.bindValue(":id_parametr_right",list_idparams_right_alreadyintable.at(i));
query.exec();
}
}
//теперь втыкаем оценки для всех приемов без исключения, ибо проще
for(int i=0;i<list_priems_alreadyintable.size();i++){
query.clear();
query.exec("SELECT * FROM Task_inside_priems WHERE id_task="+QString::number(id_task_chosen)
+" AND id_priem="+QString::number(list_priems_alreadyintable.at(i)));
int size=0;
while(query.next()){
size++;
}
if(size==0){//значит нет - инсерти
query.clear();
query.prepare("INSERT INTO Task_inside_priems (id_task, id_priem, id_rate)"
" VALUES (:id_task, :id_priem, :id_rate)");
query.bindValue(":id_task",id_task_chosen);
query.bindValue(":id_priem",list_priems_alreadyintable.at(i));
query.bindValue(":id_rate",tablewidget_priems->item(i,2)->text().toInt());
query.exec();
}else{//значит есть - апдейтим
query.clear();
query.prepare("UPDATE Task_inside_priems SET id_rate="+QString::number(tablewidget_priems->item(i,2)->text().toInt())
+" WHERE id_task="+QString::number(id_task_chosen)
+" AND id_priem="+QString::number(list_priems_alreadyintable.at(i)));
query.exec();
}
}
}
}
void WorkWithTask::pushbutton_Load_ok()
{
QDialog *dialog = new QDialog;
QGridLayout *layout_dialog = new QGridLayout;
load_dialog = new WorkWithTaskLoadDialog(0,this->getUserID());
load_dialog->setWindowFlags(Qt::Window | Qt::WindowTitleHint);
load_dialog->exec();
if(load_dialog->id_task==-1){return;}
id_task_chosen = load_dialog->id_task;
// QMessageBox::information(this,"!!!",QString::number(id_task_chosen));
listwidget_params->clear();
tablewidget_priems->clear();
list_idparams_left_alreadyintable.clear();
list_idparams_right_alreadyintable.clear();
list_priems_alreadyintable.clear();
list_priems_overallRate_alreadyintable.clear();
label_task_name->setText("Имя задачи: Новая");
tablewidget_priems->setRowCount(0);
QStringList strlist;
strlist.append("Прием");strlist.append("Общая оценка");strlist.append("Ваша оценка");
tablewidget_priems->setHorizontalHeaderLabels(strlist);
QSqlQuery query;
query.exec("SELECT * FROM Task_list WHERE id_task="+QString::number(id_task_chosen));
query.next();
label_task_name->setText("Имя задачи: "+query.value(1).toString());
query.clear();
//грузим параметры
query.exec("SELECT * FROM Task_inside_parametres WHERE id_task="+QString::number(id_task_chosen));
QSqlQuery query_inside;
QString str_params;
while(query.next()){
query_inside.clear();
str_params.clear();
list_idparams_left_alreadyintable.append(query.value(1).toInt());
query_inside.exec("SELECT * FROM Parametres_left WHERE id_parametr="+query.value(1).toString());
query_inside.next();
str_params.append(query_inside.value(1).toString()+" - ");
query_inside.clear();
list_idparams_right_alreadyintable.append(query.value(2).toInt());
query_inside.exec("SELECT * FROM Parametres_left WHERE id_parametr="+query.value(2).toString());
query_inside.next();
str_params.append(query_inside.value(1).toString());
QListWidgetItem *item = new QListWidgetItem;
item->setText(str_params);
listwidget_params->addItem(item);
}
query.clear();
query.exec("SELECT * FROM Task_inside_priems WHERE id_task="+QString::number(id_task_chosen));
int row=-1;
while(query.next()){
row++;
list_priems_alreadyintable.append(query.value(1).toInt());
query_inside.clear();
query_inside.exec("SELECT * FROM Task_list WHERE id_user="+QString::number(this->getUserID()));
float sum=0; float amount=0;
QSqlQuery query_task;
while(query_inside.next()){//внутри таск листа бежим по всем задачам и считаем рейтинг конкретного приема
query_task.clear();
query_task.exec("SELECT * FROM Task_inside_priems WHERE id_task="+QString::number(query_inside.value(0).toInt()));
while(query_task.next()){
if(query_task.value(1).toInt()==list_priems_alreadyintable.at(list_priems_alreadyintable.size()-1)){
sum+=query_task.value(2).toInt();
amount++;
}
}
}
if(amount!=0){
list_priems_overallRate_alreadyintable.append(round((sum/amount)*100)/100);
}else{
list_priems_overallRate_alreadyintable.append(0);
}
// QMessageBox::information(this,"",QString::number(list_priems_overallRate_alreadyintable.at(list_priems_overallRate_alreadyintable.size()-1)));
}
for(int i=0; i<list_priems_overallRate_alreadyintable.size()-1;i++){ //сортируем по убыванию
for(int j=0;j<list_priems_overallRate_alreadyintable.size()-i-1;j++){
if(list_priems_overallRate_alreadyintable[j]<list_priems_overallRate_alreadyintable[j+1]){
float b=list_priems_overallRate_alreadyintable[j];
list_priems_overallRate_alreadyintable[j]=list_priems_overallRate_alreadyintable[j+1];
list_priems_overallRate_alreadyintable[j+1]=b;
int b1=list_priems_alreadyintable[j];
list_priems_alreadyintable[j]=list_priems_alreadyintable[j+1];
list_priems_alreadyintable[j+1]=b1;
}
}
}
for(int i=0;i<list_priems_alreadyintable.size();i++){
tablewidget_priems->insertRow(i);
for(int k=0;k<3;k++){
if(k==0){
QSqlQuery query_output;
query_output.exec("SELECT * FROM Priems WHERE id_priem="+QString::number(list_priems_alreadyintable.at(i)));
query_output.next();
QTableWidgetItem *item = new QTableWidgetItem;
item->setFlags(item->flags() ^ Qt::ItemIsEditable);//УБИРАЕТ ИЗ ФЛАГОВ ЕДИТАБЛ
item->setText(query_output.value(0).toString()+" - "+query_output.value(1).toString());
tablewidget_priems->setItem(i,k,item);
}
if(k==1){
QTableWidgetItem *item = new QTableWidgetItem;
item->setFlags(item->flags() ^ Qt::ItemIsEditable);//УБИРАЕТ ИЗ ФЛАГОВ ЕДИТАБЛ
item->setText(QString::number(list_priems_overallRate_alreadyintable.at(i)));
tablewidget_priems->setItem(i,k,item);
}
if(k==2){
QTableWidgetItem *item = new QTableWidgetItem;