Files
TeacherSalaryMgmt_Frontend_Qt/mainwindow.cpp
2026-01-07 21:26:28 +08:00

372 lines
21 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "Modules/global.h"
#include "Modules/socketactions.h"
#include "Modules/Logger.h"
#include "Modules/methods.h"
#include <Windows.h>
#include <QLabel>
#include <QTextEdit>
#include <QTableWidget>
#include <QComboBox>
#include <string>
structTableWidget tableWidget;
structComboBox comboBox;
extern structUserInfo userInfo;
extern structLabel label;
extern structPushButton pushButton;
extern structTextEdit textEdit;
extern structUserInfo userInfo;
extern structSession session;
using std::string;
using std::to_string;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLabel *sb_label_currentUser = new QLabel(("Current User: " + userInfo.userName).c_str(), this);
sb_label_currentUser->setMinimumWidth(100);
label.salaryActual = findChild<QLabel*>("label_salaryActual");
label.salaryDiscount = findChild<QLabel*>("label_salaryDiscount");
label.salaryShould = findChild<QLabel*>("label_salaryShould");
textEdit.search = findChild<QTextEdit*>("textEdit_search");
pushButton.clear = findChild<QPushButton*>("pushButton_clear");
pushButton.seacrh = findChild<QPushButton*>("pushButton_search");
pushButton.submit = findChild<QPushButton*>("pushButton_submit");
pushButton.remove = findChild<QPushButton*>("pushButton_remove");
comboBox.findBy = findChild<QComboBox*>("comboBox_findBy");
tableWidget.teacherInfo = findChild<QTableWidget*>("tableWidget_teacherInfo");
tableWidget.teacherSalary = findChild<QTableWidget*>("tableWidget_teacherSalary");
ui->statusbar->addWidget(sb_label_currentUser);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_search_clicked()
{
struct structSearch{
QString method;
QString content;
} search;
struct structTeacherInfo{
string id;
string name;
string gender;
string company;
string address;
string tel;
} teacherInfo;
struct structSalaryInfo{
string id;
string basicSalary;
string allowances;
string livingAllowances;
string phoneCost;
string waterPowerCost;
string incomeTax;
string houseRent;
string cleaningCost;
string houseingFund;
} salaryInfo;
struct structSalary{
int should;
int discount;
int actual;
} salary;
string searchResult = "";
search.method = comboBox.findBy->currentText();
search.content = textEdit.search->toPlainText();
if(search.method.isEmpty() && search.content.isEmpty()){
MessageBoxA(NULL, "Search method or context can't be empty.", "Error", MB_OK|MB_ICONERROR);
return;
} else {
if(search.method == "ID"){
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>teacherInfo</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
postLog("[method.search] " + searchResult, 0);
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
return;
} else {
teacherInfo.id = getTextMiddle(searchResult, "<itemID>", "</itemID>");
teacherInfo.name = getTextMiddle(searchResult, "<teacherName>", "</teacherName>");
teacherInfo.gender = getTextMiddle(searchResult, "<gender>", "</gender>");
teacherInfo.company = getTextMiddle(searchResult, "<companyName>", "</companyName>");
teacherInfo.address = getTextMiddle(searchResult, "<address>", "</address>");
teacherInfo.tel = getTextMiddle(searchResult, "<tel>", "</tel>");
tableWidget.teacherInfo->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(teacherInfo.id)));
tableWidget.teacherInfo->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(teacherInfo.name)));
tableWidget.teacherInfo->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(teacherInfo.gender)));
tableWidget.teacherInfo->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(teacherInfo.company)));
tableWidget.teacherInfo->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(teacherInfo.address)));
tableWidget.teacherInfo->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(teacherInfo.tel)));
}
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>salaryForm</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
postLog("[method.search] " + searchResult, 0);
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
return;
} else {
salaryInfo.id = getTextMiddle(searchResult, "<itemID>", "</itemID>");
salaryInfo.basicSalary = getTextMiddle(searchResult, "<basicSalary>", "</basicSalary>");
salaryInfo.allowances = getTextMiddle(searchResult, "<allowances>", "</allowances>");
salaryInfo.cleaningCost = getTextMiddle(searchResult, "<cleaningCost>", "</cleaningCost>");
salaryInfo.phoneCost = getTextMiddle(searchResult, "<phoneCost>", "</phoneCost>");
salaryInfo.waterPowerCost = getTextMiddle(searchResult, "<waterPowerCost>", "</waterPowerCost>");
salaryInfo.houseRent = getTextMiddle(searchResult, "<houseRent>", "</houseRent>");
salaryInfo.incomeTax = getTextMiddle(searchResult, "<incomeTax>", "</incomeTax>");
salaryInfo.livingAllowances = getTextMiddle(searchResult, "<livingAllowances>", "</livingAllowances>");
salaryInfo.houseingFund = getTextMiddle(searchResult, "<housingFund>", "</housingFund>");
tableWidget.teacherSalary->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(salaryInfo.basicSalary)));
tableWidget.teacherSalary->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(salaryInfo.allowances)));
tableWidget.teacherSalary->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(salaryInfo.livingAllowances)));
tableWidget.teacherSalary->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(salaryInfo.phoneCost)));
tableWidget.teacherSalary->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(salaryInfo.waterPowerCost)));
tableWidget.teacherSalary->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseRent)));
tableWidget.teacherSalary->setItem(0, 6, new QTableWidgetItem(QString::fromStdString(salaryInfo.incomeTax)));
tableWidget.teacherSalary->setItem(0, 7, new QTableWidgetItem(QString::fromStdString(salaryInfo.cleaningCost)));
tableWidget.teacherSalary->setItem(0, 8, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseingFund)));
salary.should = stoi(salaryInfo.basicSalary) + stoi(salaryInfo.allowances) + stoi(salaryInfo.livingAllowances);
salary.discount = stoi(salaryInfo.phoneCost) + stoi(salaryInfo.waterPowerCost) + stoi(salaryInfo.houseRent) + stoi(salaryInfo.incomeTax) + stoi(salaryInfo.cleaningCost) + stoi(salaryInfo.houseingFund);
salary.actual = salary.should - salary.discount;
label.salaryShould->setText(QString::fromStdString("应发工资: " + to_string(salary.should)));
label.salaryDiscount->setText(QString::fromStdString("合计扣款: " + to_string(salary.discount)));
label.salaryActual->setText(QString::fromStdString("实发工资: " + to_string(salary.actual)));
}
}
if(search.method == "Name"){
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>teacherInfo</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
postLog("[method.search] " + searchResult, 0);
if(searchResult == "[Get_Rejected] ItemID does not exist."){
MessageBoxA(NULL, "Target item not found.", "Error", MB_OK|MB_ICONERROR);
return;
} else {
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
return;
} else {
teacherInfo.id = getTextMiddle(searchResult, "<itemID>", "</itemID>");
teacherInfo.name = getTextMiddle(searchResult, "<teacherName>", "</teacherName>");
teacherInfo.gender = getTextMiddle(searchResult, "<gender>", "</gender>");
teacherInfo.company = getTextMiddle(searchResult, "<companyName>", "</companyName>");
teacherInfo.address = getTextMiddle(searchResult, "<address>", "</address>");
teacherInfo.tel = getTextMiddle(searchResult, "<tel>", "</tel>");
tableWidget.teacherInfo->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(teacherInfo.id)));
tableWidget.teacherInfo->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(teacherInfo.name)));
tableWidget.teacherInfo->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(teacherInfo.gender)));
tableWidget.teacherInfo->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(teacherInfo.company)));
tableWidget.teacherInfo->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(teacherInfo.address)));
tableWidget.teacherInfo->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(teacherInfo.tel)));
}
searchResult = sockAct::tcpSend("[userGet] <userID>" + session.userID + "</userID> <userName>" + session.userName + "</userName> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp()) + "</timeStamp> <table>salaryForm</table> <itemID>" + search.content.toStdString() + "</itemID> <valueType>all</valueType>");
postLog("[method.search] " + searchResult, 0);
if(getTextMiddle(searchResult, "[", "]") == "Get_Rejected"){
::MessageBoxA(NULL, ("Failed to get data. Reason: " + searchResult.substr(searchResult.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
return;
} else {
salaryInfo.basicSalary = getTextMiddle(searchResult, "<basicSalary>", "</basicSalary>");
salaryInfo.cleaningCost = getTextMiddle(searchResult, "<cleaningCost>", "</cleaningCost>");
salaryInfo.phoneCost = getTextMiddle(searchResult, "<phoneCost>", "</phoneCost>");
salaryInfo.waterPowerCost = getTextMiddle(searchResult, "<waterPowerCost>", "</waterPowerCost>");
salaryInfo.houseRent = getTextMiddle(searchResult, "<houseRent>", "</houseRent>");
salaryInfo.incomeTax = getTextMiddle(searchResult, "<incomeTax>", "</incomeTax>");
salaryInfo.allowances = getTextMiddle(searchResult, "<allowances>", "</allowances>");
salaryInfo.livingAllowances = getTextMiddle(searchResult, "<livingAllowances>", "</livingAllowances>");
salaryInfo.houseingFund = getTextMiddle(searchResult, "<housingFund>", "</housingFund>");
tableWidget.teacherSalary->setItem(0, 0, new QTableWidgetItem(QString::fromStdString(salaryInfo.basicSalary)));
tableWidget.teacherSalary->setItem(0, 1, new QTableWidgetItem(QString::fromStdString(salaryInfo.allowances)));
tableWidget.teacherSalary->setItem(0, 2, new QTableWidgetItem(QString::fromStdString(salaryInfo.livingAllowances)));
tableWidget.teacherSalary->setItem(0, 3, new QTableWidgetItem(QString::fromStdString(salaryInfo.phoneCost)));
tableWidget.teacherSalary->setItem(0, 4, new QTableWidgetItem(QString::fromStdString(salaryInfo.waterPowerCost)));
tableWidget.teacherSalary->setItem(0, 5, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseRent)));
tableWidget.teacherSalary->setItem(0, 6, new QTableWidgetItem(QString::fromStdString(salaryInfo.incomeTax)));
tableWidget.teacherSalary->setItem(0, 7, new QTableWidgetItem(QString::fromStdString(salaryInfo.cleaningCost)));
tableWidget.teacherSalary->setItem(0, 8, new QTableWidgetItem(QString::fromStdString(salaryInfo.houseingFund)));
salary.should = stoi(salaryInfo.basicSalary) + stoi(salaryInfo.allowances) + stoi(salaryInfo.livingAllowances);
salary.discount = stoi(salaryInfo.phoneCost) + stoi(salaryInfo.waterPowerCost) + stoi(salaryInfo.houseRent) + stoi(salaryInfo.incomeTax) + stoi(salaryInfo.cleaningCost) + stoi(salaryInfo.houseingFund);
salary.actual = salary.should - salary.discount;
label.salaryShould->setText(QString::fromStdString("应发工资: " + to_string(salary.should)));
label.salaryDiscount->setText(QString::fromStdString("合计扣款: " + to_string(salary.discount)));
label.salaryActual->setText(QString::fromStdString("实发工资: " + to_string(salary.actual)));
}
}
}
}
}
void MainWindow::on_pushButton_submit_clicked()
{
struct structTeacherInfo{
string id = tableWidget.teacherInfo->item(0, 0)->text().toStdString();
string name = tableWidget.teacherInfo->item(0, 1)->text().toStdString();
string gender = tableWidget.teacherInfo->item(0, 2)->text().toStdString();
string company = tableWidget.teacherInfo->item(0, 3)->text().toStdString();
string address = tableWidget.teacherInfo->item(0, 4)->text().toStdString();
string tel = tableWidget.teacherInfo->item(0, 5)->text().toStdString();
} teacherInfo;
struct structSalaryInfo{
string id = tableWidget.teacherInfo->item(0, 0)->text().toStdString();
string basicSalary = tableWidget.teacherSalary->item(0, 0)->text().toStdString();
string allowances = tableWidget.teacherSalary->item(0, 1)->text().toStdString();
string livingAllowances = tableWidget.teacherSalary->item(0, 2)->text().toStdString();
string phoneCost = tableWidget.teacherSalary->item(0, 3)->text().toStdString();
string waterPowerCost = tableWidget.teacherSalary->item(0, 4)->text().toStdString();
string incomeTax = tableWidget.teacherSalary->item(0, 6)->text().toStdString();
string houseRent = tableWidget.teacherSalary->item(0, 5)->text().toStdString();
string cleaningCost = tableWidget.teacherSalary->item(0, 7)->text().toStdString();
string houseingFund = tableWidget.teacherSalary->item(0, 8)->text().toStdString();
} salaryInfo;
if(teacherInfo.id == "" && teacherInfo.name == ""){
MessageBoxA(NULL, "Name or ID can't be empty.", "Error", MB_OK|MB_ICONERROR);
return;
} else {
for(int i = 0; i < 6; i++){
string nowColumn;
string nowItem;
switch (i){
case 0:
nowColumn = "teacherID";
nowItem = teacherInfo.id;
break;
case 1:
nowColumn = "teacherName";
nowItem = teacherInfo.name;
break;
case 2:
nowColumn = "gender";
nowItem = teacherInfo.gender;
break;
case 3:
nowColumn = "companyName";
nowItem = teacherInfo.company;
break;
case 4:
nowColumn = "address";
nowItem = teacherInfo.address;
break;
case 5:
nowColumn = "tel";
nowItem = teacherInfo.tel;
break;
}
string resp = sockAct::tcpSend("[userSet] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>teacherInfo</table> <itemID>" + teacherInfo.id + "</itemID> <valueType>" + nowColumn + "</valueType> <value>" + nowItem + "</value>");
}
for(int i = 0; i < 11; i++){
string nowColumn;
string nowItem;
switch (i){
case 0:
nowColumn = "teacherID";
nowItem = teacherInfo.id;
break;
case 1:
nowColumn = "teacherName";
nowItem = teacherInfo.name;
break;
case 2:
nowColumn = "basicSalary";
nowItem = salaryInfo.basicSalary;
break;
case 3:
nowColumn = "allowances";
nowItem = salaryInfo.allowances;
break;
case 4:
nowColumn = "livingAllowances";
nowItem = salaryInfo.livingAllowances;
break;
case 5:
nowColumn = "phoneCost";
nowItem = salaryInfo.phoneCost;
break;
case 6:
nowColumn = "waterPowerCost";
nowItem = salaryInfo.waterPowerCost;
break;
case 7:
nowColumn = "houseRent";
nowItem = salaryInfo.houseRent;
break;
case 8:
nowColumn = "incomeTax";
nowItem = salaryInfo.incomeTax;
break;
case 9:
nowColumn = "cleaningCost";
nowItem = salaryInfo.cleaningCost;
break;
case 10:
nowColumn = "housingFund";
nowItem = salaryInfo.houseingFund;
break;
}
string resp = sockAct::tcpSend("[userSet] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>salaryForm</table> <itemID>" + teacherInfo.id + "</itemID> <valueType>" + nowColumn + "</valueType> <value>" + nowItem + "</value>");
}
MessageBoxA(NULL, "Submitted.", "Info", MB_OK|MB_ICONINFORMATION);
}
}
void MainWindow::on_pushButton_remove_clicked()
{
struct structTeacherInfo{
string id = tableWidget.teacherInfo->item(0, 0)->text().toStdString();
string name = tableWidget.teacherInfo->item(0, 1)->text().toStdString();
string gender = tableWidget.teacherInfo->item(0, 2)->text().toStdString();
string company = tableWidget.teacherInfo->item(0, 3)->text().toStdString();
string address = tableWidget.teacherInfo->item(0, 4)->text().toStdString();
string tel = tableWidget.teacherInfo->item(0, 5)->text().toStdString();
} teacherInfo;
string resp = sockAct::tcpSend("[userDel] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>teacherInfo</table> <itemID>" + teacherInfo.id + "</itemID>");
if (getTextMiddle(resp, "[", "]") == "Del_Rejected"){
postLog("[method.del] Failed to remove due to " + resp.substr(resp.find_first_of(' ')), 3);
::MessageBoxA(NULL, ("Failed to remove item. Reason: " + resp.substr(resp.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
return;
} else {
string resp = sockAct::tcpSend("[userDel] <userID>" + session.userID + "</userID> <token>" + session.token + "</token> <timeStamp>" + to_string(getUnixTimestamp())+ "</timeStamp> <table>salaryForm</table> <itemID>" + teacherInfo.id + "</itemID>");
if (getTextMiddle(resp, "[", "]") == "Del_Rejected"){
postLog("[method.del] Failed to remove due to " + resp.substr(resp.find_first_of(' ')), 3);
::MessageBoxA(NULL, ("Failed to remove item. Reason: " + resp.substr(resp.find_first_of(' '))).c_str(), "Error", MB_OK|MB_ICONERROR);
return;
}
}
MessageBoxA(NULL, "Remove successfully.", "Info", MB_OK|MB_ICONINFORMATION);
}
void MainWindow::on_pushButton_clear_clicked()
{
for(int i = 0; i < 6; i++){
tableWidget.teacherInfo->setItem(0, i, new QTableWidgetItem(""));
}
for(int i = 0; i < 10; i++){
tableWidget.teacherSalary->setItem(0, i, new QTableWidgetItem(""));
}
label.salaryShould->setText(QString::fromStdString("应发工资: "));
label.salaryDiscount->setText(QString::fromStdString("合计扣款: "));
label.salaryActual->setText(QString::fromStdString("实发工资: "));
}