UserConfigDlg.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. #include "UserConfigDlg.h"
  2. #include "ui_UserConfigDlg.h"
  3. #include "dbService/DBServiceSet.h"
  4. #include <QDoubleSpinBox>
  5. #include <QComboBox>
  6. #include <QCheckBox>
  7. #include <QMessageBox>
  8. #include <QDebug>
  9. #include <QMenu>
  10. UserConfigDlg::UserConfigDlg(QWidget *parent) : QDialog(parent), ui(new Ui::UserConfigDlg)
  11. {
  12. ui->setupUi(this);
  13. setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
  14. this->setWindowTitle("专家信息配置");
  15. this->setAttribute(Qt::WA_DeleteOnClose);
  16. this->resize(1000, 600);
  17. ui->splitter->setStretchFactor(0, 1);
  18. ui->splitter->setStretchFactor(1, 2);
  19. ui->userLabel->setText("用户名称:未选中");
  20. ui->msgLabel->setText("");
  21. init();
  22. }
  23. UserConfigDlg::~UserConfigDlg()
  24. {
  25. qDeleteAll(m_engineerInfos);
  26. m_engineerInfos.clear();
  27. delete ui;
  28. }
  29. void UserConfigDlg::userItemClicked(QListWidgetItem *item)
  30. {
  31. int id = item->data(Qt::UserRole).toInt();
  32. QFUser user;
  33. if (!DBServiceSet().QueryUserInfoById(&user, id)) {
  34. qDebug() << "用户 " << item->text() << " " << id << " 数据库查询失败!";
  35. return;
  36. }
  37. QStringList roles = { "超级管理员", "普通管理员", "专家" };
  38. QString msg =
  39. "用户名称:" + user.userName + "\t" + "账号ID:" + user.userNo + "\n" + "角色:" + roles[user.role] + "\t";
  40. msg += "工作单位:" + user.workPosition + "\n" + "职务:" + user.post + "\t" + "专业:" + user.major + "\n";
  41. msg += "联系方式:" + user.phone + "\n" + "注释信息:" + user.remark;
  42. //"文化程度:" + user.educationDegree + "\t"
  43. ui->userLabel->setText(msg);
  44. refreshConfigTable(user.id);
  45. }
  46. void UserConfigDlg::addNewUserItem()
  47. {
  48. QList<QListWidgetItem *> items = ui->listWidget->selectedItems();
  49. if (items.count() == 0) {
  50. return;
  51. }
  52. int row = ui->tableWidget->rowCount();
  53. ui->tableWidget->setRowCount(row + 1); //设置行数
  54. QPushButton *editBtn = nullptr;
  55. QCheckBox *check = nullptr;
  56. QWidget *widget = nullptr;
  57. QGridLayout *layout = nullptr;
  58. widget = new QWidget;
  59. layout = new QGridLayout;
  60. check = new QCheckBox;
  61. layout->setSpacing(0);
  62. layout->setMargin(0);
  63. layout->addWidget(check);
  64. layout->setAlignment(check, Qt::AlignCenter); //居中
  65. widget->setLayout(layout);
  66. ui->tableWidget->setCellWidget(row, 0, widget);
  67. ui->tableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(-1)));
  68. ui->tableWidget->item(row, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  69. ui->tableWidget->item(row, 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  70. ui->tableWidget->item(row, 1)->setData(Qt::UserRole, -1);
  71. QComboBox *comb = new QComboBox;
  72. for (auto enj : m_engineerInfos) {
  73. comb->addItem(enj->engineerName, enj->engineerId);
  74. }
  75. comb->setCurrentIndex(-1);
  76. ui->tableWidget->setCellWidget(row, 2, comb);
  77. connect(comb, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &UserConfigDlg::engineerCombChanged);
  78. QDoubleSpinBox *dspin = new QDoubleSpinBox;
  79. dspin->setRange(0.0, 1000.0);
  80. ui->tableWidget->setCellWidget(row, 3, dspin);
  81. ui->tableWidget->setItem(row, 4,
  82. new QTableWidgetItem(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz")));
  83. ui->tableWidget->item(row, 4)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  84. ui->tableWidget->item(row, 4)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  85. ui->tableWidget->setItem(row, 5,
  86. new QTableWidgetItem(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz")));
  87. ui->tableWidget->item(row, 5)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  88. ui->tableWidget->item(row, 5)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  89. widget = new QWidget;
  90. layout = new QGridLayout;
  91. editBtn = new QPushButton;
  92. editBtn->setText("保存");
  93. editBtn->setProperty("saveAction", "add");
  94. connect(editBtn, &QPushButton::clicked, this, &UserConfigDlg::saveCurrentRow);
  95. layout->setSpacing(0);
  96. layout->setMargin(0);
  97. layout->addWidget(editBtn);
  98. widget->setLayout(layout);
  99. ui->tableWidget->setCellWidget(row, 6, widget);
  100. }
  101. void UserConfigDlg::deleteUserItem()
  102. {
  103. //采取下面方式获取
  104. QWidget *widget = nullptr;
  105. QCheckBox *checkBox = nullptr;
  106. QVector<int> deleteRows;
  107. for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
  108. widget = ui->tableWidget->cellWidget(row, 0);
  109. if (widget) {
  110. checkBox = qobject_cast<QCheckBox *>(widget->children().at(1)); //通过children来访问checkbox
  111. if (checkBox && (checkBox->checkState() == Qt::Checked)) {
  112. int id = ui->tableWidget->item(row, 1)->data(Qt::UserRole).toInt();
  113. if (id >= 0) {
  114. if (!DBServiceSet().DeleteUserConfigById(id)) {
  115. qDebug() << QString("删除第%1条数据失败").arg(id);
  116. QMessageBox::warning(nullptr, "删除失败", "数据库操作异常");
  117. return;
  118. }
  119. }
  120. deleteRows.append(row);
  121. }
  122. }
  123. }
  124. int num = 0;
  125. for (auto d : deleteRows) {
  126. ui->tableWidget->removeRow(d - num);
  127. num++;
  128. }
  129. }
  130. void UserConfigDlg::engineerCombChanged(int index)
  131. {
  132. if (rollback) {
  133. rollback = false;
  134. return;
  135. }
  136. ui->msgLabel->setText("");
  137. QComboBox *comb = qobject_cast<QComboBox *>(sender());
  138. if (comb) {
  139. QComboBox *enjComb;
  140. bool repeat = false;
  141. int whichRow = 0;
  142. for (int r = 0; r < ui->tableWidget->rowCount(); ++r) {
  143. enjComb = qobject_cast<QComboBox *>(ui->tableWidget->cellWidget(r, 2));
  144. if (comb == enjComb) {
  145. whichRow = r;
  146. if (repeat) { //循环提取结束
  147. break;
  148. }
  149. } else {
  150. if (enjComb->currentIndex() == index) {
  151. ui->msgLabel->setText("工程名重复");
  152. repeat = true; //出现重复
  153. }
  154. }
  155. }
  156. if (!repeat) { //无重复
  157. if (index >= 0) {
  158. ui->tableWidget->item(whichRow, 1)->setText(QString::number(m_engineerInfos.at(index)->engineerId));
  159. }
  160. } else {
  161. rollback = true;
  162. int oldId = ui->tableWidget->item(whichRow, 1)->text().toInt(); //取出旧的id,并恢复旧的combox内容
  163. if (oldId == -1) {
  164. comb->setCurrentIndex(-1);
  165. return;
  166. }
  167. for (auto info : m_engineerInfos) {
  168. if (info->engineerId == oldId) {
  169. comb->setCurrentText(info->engineerName);
  170. break;
  171. }
  172. }
  173. }
  174. }
  175. }
  176. void UserConfigDlg::saveCurrentRow()
  177. {
  178. ui->msgLabel->setText("");
  179. QPushButton *btn = qobject_cast<QPushButton *>(sender());
  180. if (btn) {
  181. for (int r = 0; r < ui->tableWidget->rowCount(); ++r) {
  182. if (btn == ui->tableWidget->cellWidget(r, 6)->layout()->itemAt(0)->widget()) {
  183. QListWidgetItem *currentItem = ui->listWidget->currentItem();
  184. UserConfig cfg;
  185. cfg.userId = currentItem->data(Qt::UserRole).toInt();
  186. cfg.engineerId = ui->tableWidget->item(r, 1)->text().toInt();
  187. if (cfg.engineerId <= 0) {
  188. QMessageBox::warning(nullptr, "提示", "未选择工程");
  189. break;
  190. }
  191. // QComboBox *comb = qobject_cast<QComboBox *>(ui->tableWidget->cellWidget(r, 2));
  192. cfg.weight = qobject_cast<QDoubleSpinBox *>(ui->tableWidget->cellWidget(r, 3))->value();
  193. cfg.createTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
  194. ui->tableWidget->item(r, 4)->setText(cfg.createTime);
  195. cfg.updateTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
  196. ui->tableWidget->item(r, 5)->setText(cfg.updateTime);
  197. QString ops = btn->property("saveAction").toString();
  198. //新增或更新之前确该工程权重
  199. if (ops == "add") {
  200. int sum = DBServiceSet().QueryUserWeightSum(cfg.engineerId);
  201. int result = sum + cfg.weight;
  202. if (result > 100) {
  203. QMessageBox::warning(nullptr, "警告", "专家权重和>100,请确认!");
  204. break;
  205. }
  206. //新增前需要把之前设置为无效状态
  207. if (DBServiceSet().UpdateUserValid(cfg.userId, 0)) {
  208. int newId = DBServiceSet().AddUserConfig(cfg);
  209. if (newId == -1) {
  210. QMessageBox::critical(nullptr, "异常", "添加用户配置失败!");
  211. break;
  212. } else {
  213. ui->tableWidget->item(r, 1)->setData(Qt::UserRole, newId);
  214. btn->setProperty("saveAction", "update");
  215. QMessageBox::information(nullptr, "成功", "添加用户配置成功!");
  216. }
  217. }
  218. } else if (ops == "update") {
  219. cfg.id = ui->tableWidget->item(r, 1)->data(Qt::UserRole).toInt();
  220. int sum = DBServiceSet().QueryUserWeightSum(cfg.engineerId, cfg.userId);
  221. int result = sum + cfg.weight;
  222. if (result > 100) {
  223. QMessageBox::warning(nullptr, "警告", "专家权重和>100,请确认!");
  224. refreshConfigTable(cfg.userId);
  225. break;
  226. }
  227. if (!DBServiceSet().UpdateUserConfig(cfg)) {
  228. QMessageBox::critical(nullptr, "异常", "修改用户配置失败!");
  229. break;
  230. } else {
  231. QMessageBox::information(nullptr, "成功", "修改用户配置成功!");
  232. }
  233. }
  234. refreshConfigTable(cfg.userId);
  235. break;
  236. }
  237. }
  238. }
  239. }
  240. void UserConfigDlg::userListMenuRequested(const QPoint &pos)
  241. {
  242. QListWidgetItem *curItem = ui->listWidget->itemAt(pos);
  243. if (curItem == nullptr) {
  244. return;
  245. }
  246. QMenu *popMenu = new QMenu(this);
  247. QAction *deleteAct = new QAction("删除用户", this);
  248. QAction *cancelAct = new QAction("取消", this);
  249. popMenu->addAction(deleteAct);
  250. popMenu->addAction(cancelAct);
  251. connect(deleteAct, &QAction::triggered, this, &UserConfigDlg::deleteUserAction);
  252. connect(deleteAct, &QAction::triggered, [=]() {
  253. });
  254. popMenu->exec(QCursor::pos());
  255. popMenu->deleteLater();
  256. deleteAct->deleteLater();
  257. cancelAct->deleteLater();
  258. }
  259. void UserConfigDlg::deleteUserAction()
  260. {
  261. QListWidgetItem *curItem = ui->listWidget->currentItem();
  262. if (curItem) {
  263. int userId = curItem->data(Qt::UserRole).toInt();
  264. if (DBServiceSet().DeleteUserById(userId)) {
  265. DBServiceSet().DeleteUserConfigByUserId(userId);
  266. ui->tableWidget->clearContents();
  267. ui->tableWidget->setRowCount(0);
  268. ui->listWidget->takeItem(ui->listWidget->currentRow());
  269. } else {
  270. QMessageBox::critical(nullptr, "异常", "删除用户失败");
  271. }
  272. }
  273. }
  274. void UserConfigDlg::init()
  275. {
  276. const QStringList headers = { "选中", "工程id", "工程名", "权重", "创建时间", "修改时间", "操作" };
  277. //设置整行选中的方式
  278. ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
  279. ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  280. ui->tableWidget->setColumnCount(headers.count());
  281. ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); //填充表格
  282. // ui->tableWidget->horizontalHeader()->setSectionResizeMode(
  283. // 3, QHeaderView::ResizeToContents); //然后设置要根据内容使用宽度的列(其他没设置的列自动缩放)
  284. ui->tableWidget->setHorizontalHeaderLabels(headers);
  285. refreshUserList();
  286. connect(ui->listWidget, &QListWidget::itemClicked, this, &UserConfigDlg::userItemClicked);
  287. connect(ui->addBtn, &QPushButton::clicked, this, &UserConfigDlg::addNewUserItem);
  288. connect(ui->deleteBtn, &QPushButton::clicked, this, &UserConfigDlg::deleteUserItem);
  289. if (!DBServiceSet().QueryEngineerList(&m_engineerInfos)) {
  290. qDebug() << "工程信息数据库查询失败!";
  291. }
  292. ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
  293. connect(ui->listWidget, &QListWidget::customContextMenuRequested, this, &UserConfigDlg::userListMenuRequested);
  294. }
  295. void UserConfigDlg::refreshUserList()
  296. {
  297. QList<QFUser *> users;
  298. if (!DBServiceSet().QueryUserList(&users)) {
  299. qDebug() << "用户数据库查询失败!";
  300. return;
  301. }
  302. int row = 0;
  303. for (auto user : users) {
  304. if (user->role == QFUser::Expert) {
  305. QListWidgetItem *newItem = new QListWidgetItem;
  306. newItem->setText(QString("%1 [%2]").arg(user->userName).arg(user->userNo));
  307. newItem->setData(Qt::UserRole, user->id);
  308. ui->listWidget->insertItem(row, newItem);
  309. row++;
  310. }
  311. }
  312. qDeleteAll(users);
  313. users.clear();
  314. ui->listWidget->setCurrentRow(-1);
  315. }
  316. void UserConfigDlg::refreshConfigTable(int userId)
  317. {
  318. ui->tableWidget->clearContents();
  319. QList<UserConfig *> userConfigs;
  320. if (!DBServiceSet().QueryUserConfigListInfoByUserId(&userConfigs, userId)) {
  321. qDebug() << "用户数据库查询失败!";
  322. return;
  323. }
  324. ui->tableWidget->setRowCount(userConfigs.count()); //设置行数
  325. QPushButton *editBtn = nullptr;
  326. QCheckBox *check = nullptr;
  327. QWidget *widget = nullptr;
  328. QGridLayout *layout = nullptr;
  329. int row = 0;
  330. for (auto cfg : userConfigs) {
  331. widget = new QWidget;
  332. layout = new QGridLayout;
  333. check = new QCheckBox;
  334. layout->setSpacing(0);
  335. layout->setMargin(0);
  336. layout->addWidget(check);
  337. layout->setAlignment(check, Qt::AlignCenter); //居中
  338. widget->setLayout(layout);
  339. ui->tableWidget->setCellWidget(row, 0, widget);
  340. ui->tableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(cfg->engineerId)));
  341. ui->tableWidget->item(row, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  342. ui->tableWidget->item(row, 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  343. ui->tableWidget->item(row, 1)->setData(Qt::UserRole, cfg->id);
  344. QComboBox *comb = new QComboBox;
  345. for (auto enj : m_engineerInfos) {
  346. comb->addItem(enj->engineerName, enj->engineerId);
  347. if (enj->engineerId == cfg->engineerId) {
  348. comb->setCurrentText(enj->engineerName);
  349. }
  350. }
  351. ui->tableWidget->setCellWidget(row, 2, comb);
  352. connect(comb, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &UserConfigDlg::engineerCombChanged);
  353. QDoubleSpinBox *dspin = new QDoubleSpinBox;
  354. dspin->setRange(0.0, 1000.0);
  355. dspin->setValue(cfg->weight);
  356. ui->tableWidget->setCellWidget(row, 3, dspin);
  357. ui->tableWidget->setItem(row, 4, new QTableWidgetItem(cfg->createTime));
  358. ui->tableWidget->item(row, 4)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  359. ui->tableWidget->item(row, 4)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  360. ui->tableWidget->setItem(row, 5, new QTableWidgetItem(cfg->updateTime));
  361. ui->tableWidget->item(row, 5)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  362. ui->tableWidget->item(row, 5)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  363. widget = new QWidget;
  364. layout = new QGridLayout;
  365. editBtn = new QPushButton;
  366. editBtn->setProperty("saveAction", "update");
  367. editBtn->setText("保存");
  368. connect(editBtn, &QPushButton::clicked, this, &UserConfigDlg::saveCurrentRow);
  369. layout->setSpacing(0);
  370. layout->setMargin(0);
  371. layout->addWidget(editBtn);
  372. widget->setLayout(layout);
  373. ui->tableWidget->setCellWidget(row, 6, widget);
  374. row++;
  375. }
  376. qDeleteAll(userConfigs);
  377. }