UserConfigDlg.cpp 16 KB

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