#include "syscommugroupmgt.h" #include <QDockWidget> #include <QGraphicsEffect> #include <QToolBar> #include <QVBoxLayout> #include <tbaseutil/tdataresponse.h> #include <tbaseutil/tdataparse.h> #include <tbaseutil/tenumlist.h> #include <tbaseutil/ttheme.h> #include <tdatabaseutil/tsqlselectorv2.h> #include <topcore/topclasssqlthread.h> #include <topcore/topcore.h> #include <topcore/topenummanager.h> #include <toputil/t.h> #include <twidget/tmessagebar.h> #include <twidget/tpagetool.h> #include <twidget/tsearchentry.h> #include <twidget/tsplitter.h> #include <twidget/ttableview.h> #include <twidget/taccordion.h> #include "syscommugroup.h" #include "syscommugroupmgtthread.h" #define ENUM_SYS_COMMU_SEND_MODE "sys-commu-send-mode" SysCommuGroupMgt::SysCommuGroupMgt(const QString &iModuleNameStr, const QVariantMap &iUrlPars, QWidget *iParent) : TopClassAbs(iParent) { this->appendLanguage("sys-commu-group"); this->setLicenseKey(""); this->initModule(iModuleNameStr, iUrlPars); mBodySplitter = new TSplitter(this); QWidget *mBodyWgt = new QWidget(this); mBodyWgt->setProperty("SS_BG", "BODY"); QVBoxLayout *vboxlayout = new QVBoxLayout(mBodyWgt); vboxlayout->setMargin(0); vboxlayout->setSpacing(0); this->setCentralWidget(mBodySplitter); mBodyWidget = new TSplitter(this); mBodySplitter->addWidget(mBodyWidget); QString detailModuleName = config("detailModuleName").toString(); if (detailModuleName.isEmpty()) { detailModuleName = "sys-mail-group"; } mDetailView = new SysCommuGroup(detailModuleName, QVariantMap(), this); TopClassHelper::parseTableConf0(this, "view", &mTableConf); initTableView(); initNaviView(); if (QToolBar *toolbar = qobject_cast<QToolBar*>(uim()->getWidget("MAIN_TOOLBAR"))) { vboxlayout->addWidget(toolbar, 0); } if (QMenu *table_popup = qobject_cast<QMenu *>(uim()->getWidget("TABLEVIEW_POPUP"))) { mTableView->setContextMenu(table_popup); } vboxlayout->addWidget(mTableView, 1); if (QToolBar* bToolbar = qobject_cast<QToolBar*>(uim()->getWidget("BOTTOM_TOOLBAR"))){ vboxlayout->addWidget(bToolbar); mPageTool = qobject_cast<TPageTool *>(uim()->getWidget("BOTTOM_TOOLBAR/PAGE_TOOL")); } mDetailView->resize(TTHEME_DP(config("detail.perfect_size.width", mDetailView->perfectSize().width()).toInt()), mDetailView->height()); connect(mDetailView, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant))); connect(mDetailView, SIGNAL(windowModifyChanged(bool)), SLOT(onDetailChanged())); //左侧查询 TAccordion *accordion = new TAccordion(this); accordion->setProperty("SS_BG","NAVI"); accordion->setMinimumWidth(TTHEME_DP(config("navi.min_size.width", 210).toInt())); accordion->setAccordionLocation(TAccordion::AccordionLocation::Left); accordion->setIsExpanded(false); QVBoxLayout *accordionLayout = new QVBoxLayout(accordion); accordionLayout->setMargin(0); accordionLayout->setSpacing(0); QLabel *naviLabel = new QLabel(ttr("Navigation")); naviLabel->setProperty("SS_TYPE", "SUBHEADER"); accordionLayout->addWidget(naviLabel, 0); accordionLayout->addSpacing(TTHEME_DP(4)); accordionLayout->addWidget(mNaviView,999); accordion->setGraphicsEffect(TTHEME->getShadowEffect(1, "left")); accordion->expandButton()->setFixedHeight(TTHEME_DP(40)); accordion->expandButton()->setToolTip(ttr("Display Navigation")); accordion->collapseButton()->setToolTip(ttr("Hide Navigation")); accordion->setIsExpanded(false); mBodyWidget->addWidget(accordion); mBodyWidget->addWidget(mBodyWgt); mBodySplitter->addWidget(mDetailView); mBodySplitter->setStretchFactor(0, 1); mBodyWidget->setStretchFactor(1, 2); mBodyWidget->setSizes(QList<int>() << TTHEME_DP(config("navi.perfect_size.width", 230).toInt()) << 1); mBodySplitter->setSizes(QList<int>() << 1 << TTHEME_DP(config("detail.perfect_size.width", 600).toInt())); mSearchEntry = qobject_cast<TSearchEntry *>(uim()->getWidget("MAIN_TOOLBAR/SEARCH_ENTRY")); if (mSearchEntry != nullptr) { mSearchEntry->setOptionList(TDataParse::headerItem2searchList(mTableView->headerItem())); mSearchEntry->setPlaceholderText(ttr("Search %1")); connect(mSearchEntry, SIGNAL(search(QString,QVariant)), this, SLOT(refresh())); this->setFocusProxy(mSearchEntry); } if (mPageTool != nullptr) { mPageTool->setPageSizeVisible(true); connect(mPageTool, SIGNAL(pageChanged(int,int)), this, SLOT(onPageChanged())); } connect(mTableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(onSelectionChanged())); if (QAction *openAct = this->getAction("open")) { connect(mTableView, SIGNAL(activated(QModelIndex)), openAct, SLOT(trigger())); } this->restoreSizeState(); this->restoreObjectState(mTableView); refreshActionState(); mDetailView->setWorkcenterId(this->uid()); QTimer::singleShot(0, this, SLOT(onNaviDataChanged())); } SysCommuGroupMgt::~SysCommuGroupMgt() { this->saveSizeState(); this->saveObjectState(mTableView); } void SysCommuGroupMgt::refresh(bool iResetPageBol) { t::loading(this); TSqlSelectorV2 selector = getSqlSelector(iResetPageBol); QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector)); unloading(); TDataResponse dataRes(data.toMap()); if (dataRes.hasError()) { alertError(ttr("Load data failed!"), dataRes.errText()); } else { fillTableData(dataRes); alertOk(ttr("Data loaded")); } } void SysCommuGroupMgt::deleteItem(const QVariantList &iIdLst) { loading(ttr("Deleting data...")); QVariant data = doThreadWork(new SysCommuGroupMgtThread(this), "DELETE_MAILGROUP", iIdLst); unloading(); TDataResponse dataRes(data.toMap()); if (dataRes.hasError()) { alertError(ttr("Delete data failed!"), dataRes.errText()); } else { refresh(true); alertOk(ttr("Data deleted")); } } QVariantList SysCommuGroupMgt::selectedItems() { return mTableView->selectedPrimaryKeys(); } TopClassAbs *SysCommuGroupMgt::openItem(int iIdInt) { QString detailModuleName = "sys-commu-group"; if (!config("detail_module_name").toString().isEmpty()) { detailModuleName = config("detail_module_name").toString(); } SysCommuGroup *detail = qobject_cast<SysCommuGroup *>(APP->openModule(detailModuleName)); if (detail != nullptr) { connect(detail, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant))); connect(this, SIGNAL(destroyed()), detail, SLOT(close())); detail->setUid(iIdInt); } return detail; } void SysCommuGroupMgt::newItem() { mBodySplitter->cacheSizes(); mDetailView->create(); mDetailView->refreshActionState(); } void SysCommuGroupMgt::onClearNavi() { mFixedSqlWhere = ""; refresh(); } void SysCommuGroupMgt::onNaviDataChanged() { //导航查询 QVariantMap curNaviMap; curNaviMap = mNaviView->getAllValues().toVariant().toMap(); QStringList sqlStrList; if (!curNaviMap.isEmpty()) { QString titleStr = curNaviMap.value("title").toString(); QString sysnameStr = curNaviMap.value("sys_name").toString(); QString plant = curNaviMap.value("attr_data.plant").toString(); QString department = curNaviMap.value("attr_data.department").toString(); if (!plant.isEmpty()) { QStringList strList = plant.split(","); sqlStrList.append(QString("attr_data#>>'{plant}' IN('%1')").arg(strList.join("','"))); } if (!department.isEmpty()) { QStringList strList = department.split(","); sqlStrList.append(QString("attr_data#>>'{department}' IN('%1')").arg(strList.join("','"))); } if (!titleStr.isEmpty()) { sqlStrList.append(QString("lower(title) like '%1%'").arg(titleStr.toLower())); } if (!sysnameStr.isEmpty()) { sqlStrList.append(QString("lower(sys_name) like '%%1%'").arg(sysnameStr.toLower())); } mFixedSqlWhere = sqlStrList.join(" AND "); } else { mFixedSqlWhere = ""; } refresh(); } QVariantList SysCommuGroupMgt::plantList() { return mDetailView->plantList(); } QVariantList SysCommuGroupMgt::departmentList() { return mDetailView->departmentList(); } QVariantMap SysCommuGroupMgt::departmentMap() { return mDetailView->departmentMap(); } void SysCommuGroupMgt::onPageChanged() { refresh(false); } void SysCommuGroupMgt::onSelectionChanged() { if (mTableView != nullptr) { mSelectedLst = mTableView->selectedPrimaryKeys(); int curIdInt = -1; if (!mSelectedLst.isEmpty()) { curIdInt = mSelectedLst.value(0).toInt(); } if (mDetailView->uid().toInt() != curIdInt) { mDetailView->setLastUid(curIdInt); if (!mDetailView->isDataModified()) { mDetailView->setUid(curIdInt); } } refreshActionState(); } } void SysCommuGroupMgt::onDetailSaved(const QVariant &iUidStr) { this->refresh(false); mTableView->selectRow(iUidStr); } void SysCommuGroupMgt::onDetailChanged() { bool isModified = mDetailView->isDataModified(); mTableView->setEnabled(!isModified); if (isModified) { this->showMaskFrame(mBodySplitter->widget(0)); } else { if (mBodySplitter->sizes().value(0) < 20) { mBodySplitter->setWidgetSize(0, mBodySplitter->getCacheSize(0), true); } this->hideMaskFrame(); } refreshActionState(); } TSqlSelectorV2 SysCommuGroupMgt::getSqlSelector(bool iResetPageBol) { TSqlSelectorV2 selector; if (!mTableConf.dbSql.isEmpty()) { selector.setTable(QString("(%1) _TEMP_TABLE_").arg(mTableConf.dbSql)); } else if (!mTableConf.dbTableName.isEmpty()) { selector.setTable(mTableConf.dbTableName); } else { // db_sql为空和db_table_name为空时不作处理 return selector;; } selector.setField(mTableConf.queryFields); selector.setFieldFormat(mTableConf.fieldFormatMap); selector.setReturnRowCount(true); // 分页 TopClassHelper::handleSearchPageOnQuery(nullptr, mPageTool, iResetPageBol, &selector); // 排序 TopClassHelper::handleOrderOnQuery(mTableView, &mTableConf, &selector); // 搜索 if (mSearchEntry != nullptr) { selector.addWhere(mSearchEntry->sqlWhere()); } // 只获取有效数据 if (!mTableConf.dbDelFlagKey.isEmpty()) { selector.addWhere(QString("%1 = 0 OR %1 IS NULL").arg(mTableConf.dbDelFlagKey)); } // 过滤项 if(!mTableConf.dbFilter.isEmpty()) { selector.addWhere(mTableConf.dbFilter); } if (!mFixedSqlWhere.isEmpty()) { selector.addWhere(mFixedSqlWhere); } if (!this->uid().isEmpty()) { selector.addWhere(QString("attr_data#>>'{department}' = (SELECT code from mes_workcenter WHERE id = '%1')").arg(this->uid())); } return selector; } void SysCommuGroupMgt::initTableView() { mTableView = new TTableView(this); mTableView->setObjectName("TableView"); mTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); mTableView->verticalHeader()->setVisible(false); mTableView->horizontalHeader()->setSortIndicatorShown(true); mTableView->horizontalHeader()->setSectionsMovable(true); mTableView->horizontalHeader()->setStretchLastSection(true); mTableView->setHeaderPopupEnabled(true); mTableView->setDataKeyList(mTableConf.dataKeys); mTableView->setPrimaryKey(mTableConf.primaryKey); QVariantList headerItems = mTableConf.horizontalHeaders; headerItems.prepend(QVariant()); mTableView->setHeaderItem(headerItems); connect(mTableView->horizontalHeader(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(refresh())); } void SysCommuGroupMgt::initNaviView() { QString naviUiStr = ui("navi-view").toString(); if (naviUiStr.isEmpty()) { return; } mNaviView = new TUiLoader(this); mNaviView->setScriptEngine(APP->scriptEngine()); mNaviView->setSelf(this); mNaviView->setUiStr(naviUiStr); } void SysCommuGroupMgt::fillTableData(const TDataResponse &iDataRes) { if (mPageTool != nullptr) { mPageTool->setRowCount(iDataRes.dataCount(), true); } QVariantList tableData = iDataRes.data().toList(); TopClassHelper::formatTableData(this, &mTableConf, tableData); if (isHookExists("handleTableData")) { tableData = callHooksQuick("handleTableData", QVariantList() << QVariant(tableData)).toVariant().toList(); } mTableView->loadData(tableData); mDetailView->setUid(-1); }