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