#include "syscommugroup.h"
#include <QResizeEvent>
#include <QToolBar>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.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 <topcore/topclasshelper.h>
#include <toputil/t.h>
#include <twidget/tmessagebar.h>
#include <twidget/ttableview.h>
#include <twidget/ttableviewdialog.h>
#include <twidget/tmessagebox.h>
#include <twidget/tuiloader.h>
#include <twidget/tuiloaderdialog.h>
#include "syscommugroupthread.h"

#define ENUM_SYS_COMMU_SEND_MODE "sys-commu-send-mode"

SysCommuGroup::SysCommuGroup(const QString &iModuleNameStr, const QVariantMap &iUrlPars, QWidget *iParent)
    : TopClassAbs(iParent)
{
    this->setLicenseKey("");
    this->initModule(iModuleNameStr, iUrlPars);

    QWidget *centerWgt = new QWidget(this);
    this->setCentralWidget(centerWgt);
    QVBoxLayout *centerLayout = new QVBoxLayout(centerWgt);
    centerLayout->setMargin(0);
    centerLayout->setSpacing(0);

    if (QToolBar *toolbar = qobject_cast<QToolBar *>(uim()->getWidget("MAIN_TOOLBAR"))) {
        centerLayout->addWidget(toolbar, 0);
    }

    mBodyLayout = new QHBoxLayout();
    centerLayout->addLayout(mBodyLayout, 1);
    mBodyLayout->setMargin(TTHEME_DP(16));
    mBodyLayout->setSpacing(0);

    mUiLoader = new TUiLoader(this);
    mUiLoader->setProperty("SS_BG", "PANLE");
    mUiLoader->setScriptEngine(APP->scriptEngine());
    mUiLoader->setSelf(this);

    mBodyLayout->addStretch(1);
    mBodyLayout->addWidget(mUiLoader, 99999);
    mBodyLayout->addStretch(1);

    initPlantList();
    mUiLoader->setUiStr(ui("top-commu-group").toString());
    mTableView = qobject_cast<TTableView*>(mUiLoader->getObject("MAILINFO_LIST"));
    if (QMenu *table_popup = qobject_cast<QMenu *>(uim()->getWidget("MAINMENU_POPUP"))) {
        mTableView->setContextMenu(table_popup);
    }
    connect(mTableView->selectionModel(), &QItemSelectionModel::selectionChanged, [=](){
            mUiLoader->refreshState();refreshActionState();
    });
    connect(mUiLoader, SIGNAL(dataChanged()), this, SLOT(setDataModified()));

    initSearchEntry();

    restoreSizeState();

    uidChangeEvent(this->uid());

    refreshActionState();
}

SysCommuGroup::~SysCommuGroup()
{
    saveSizeState();
}

void SysCommuGroup::reload()
{
    QString uidStr = lastUid().isEmpty() ? uid() : lastUid();
    setUid(uidStr, true);
}

void SysCommuGroup::copy()
{
    setLastUid(this->uid());
    setUid(0, false);
    QVariantMap data;
    data.insert("sys_name", "");
    data.insert("id", "");
    setData(data);
    setTitle(ttr("New MailGroup"));
    setDataModified(true);
}

void SysCommuGroup::create()
{
    setLastUid(this->uid());
    setUid(0, true);
    setDataModified(true);
}

void SysCommuGroup::clearData()
{
    mUiLoader->loadValues(QVariantMap(), true);
    if (mTableView != nullptr) {
        mTableView->loadData(QVariantList());
    }
}

void SysCommuGroup::setData(const QVariantMap &iDataMap)
{
    QVariantMap dataMap = iDataMap;
    dataMap.insert("attr_data.category", iDataMap.value("attr_data").toMap().value("category").toString());
    dataMap.insert("attr_data.plant", iDataMap.value("attr_data").toMap().value("plant").toString());
    dataMap.insert("attr_data.department", iDataMap.value("attr_data").toMap().value("department").toString());
    mUiLoader->loadValues(dataMap, false);
    TEnumList* enumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
    if ((mTableView != nullptr) && iDataMap.contains("MAILINFO_LIST")) {
        QVariantList dataLst;
        for (QVariant oneVar : iDataMap.value("MAILINFO_LIST").toList()) {
            QVariantMap oneMap = oneVar.toMap();
            oneMap.insert("mode.text", enumLst->itemText(oneMap.value("mode").toString()));

            if (QStringLiteral("pub_contacts") == oneMap.value("src_type").toString()) {
                oneMap.insert("src_type.text", ttr("Contact"));
            } else if (QStringLiteral("manual") == oneMap.value("src_type")) {
                oneMap.insert("src_type.text", ttr("manual"));
            } else {
                oneMap.insert("src_type.text", oneMap.value("src_type").toString());
            }
            dataLst.append(oneMap);
        }
        fillTableData(dataLst);
    }

    if (iDataMap.contains("name")) {
        setTitle(ttr("MailGroup-%1").arg(iDataMap.value("name").toString()));
    }
}

QVariantMap SysCommuGroup::getData() const
{
    QVariantMap saveMap;
    QMap<QString, QString> updatePolicy;
    TopClassHelper::fetchSaveFieldsFromUi(mUiLoader, saveMap, updatePolicy);
    if (mTableView != nullptr) {
        saveMap.insert("MAILINFO_LIST", mTableView->allDataMap());
    }
    QVariantMap newUpdatePolicy;
    for (QMap<QString, QString>::iterator it = updatePolicy.begin(); it != updatePolicy.end(); ++it) {
        newUpdatePolicy.insert(it.key(), it.value());
    }
    saveMap.insert("id", this->uid());
    saveMap.insert("updatePolicy", newUpdatePolicy);
    return saveMap;
}

void SysCommuGroup::saveData()
{
    // 有效性验证
    QVariantList errLst = mUiLoader->validateAll("COMMIT", true, "ERROR");
    if (!errLst.isEmpty()) {
        QStringList errStrLst;
        for (QVariant err : errLst) {
            errStrLst.append(err.toMap().value("text").toString());
        }
        TMessageBox::error(this, ttr("Save data failed!"), errStrLst.join("\n"));
        return;
    }
    t::saving(this);
    QVariantMap dataMap = getData();
    QVariantMap attrData = dataMap.value("attr_data").toMap();
    if (this->uid().toInt() == 0 && !mWorkcenterId.isEmpty()) {
        TSqlSelectorV2 selector;
        selector.setTable("mes_workcenter AS MW1 left join mes_workcenter AS MW2 ON MW1.parent_id = MW2.id");
        selector.setField("MW1.code as department, MW2.code as plant");
        selector.setWhere("MW1.id", mWorkcenterId);
        QVariant departData = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_MAP, QVariant::fromValue(selector));
        TDataResponse departRes(departData.toMap());
        if (departRes.hasError()) {
            alertError(ttr("Save data failed!"), departRes.errText());
            return;
        } else {
            QVariantMap departMap = departRes.data().toMap();
            attrData = TDataParse::mergeVariantMap(attrData, departMap);
            dataMap.insert("attr_data", attrData);
        }
    } else if (!mWorkcenterId.isEmpty()) {
        attrData.remove("plant");
        attrData.remove("department");
        dataMap.insert("attr_data", attrData);
    }

    QVariant data = doThreadWork(new SysCommuGroupThread(this), "SAVE_DATA", dataMap);
    unloading();
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        alertError(ttr("Save data failed!"), dataRes.errText());
    } else {
        setUid(dataRes.data().toInt());
        emit dataSaved(this->uid());
        alertOk(ttr("Data saved"));
    }
}

void SysCommuGroup::setSendMode(const QString &iModeStr)
{
    QModelIndexList indexLst = mTableView->selectedIndexes();
    if (indexLst.isEmpty()) {
        return;
    }

    TEnumList *enumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
    for (QModelIndex index : indexLst) {
        mTableView->setRowKeyValue(index, "mode", iModeStr);
        mTableView->setRowKeyValue(index, "mode.text", enumLst->itemText(iModeStr));
    }
}

void SysCommuGroup::showAddContactMail()
{
    QVariantList selLst = getAddContactMailList();
    if (selLst.isEmpty()) {
        return;
    }

    QVariantList selData;
    for (QVariant item : selLst) {
        QVariantMap itemMap = item.toMap();
        itemMap.insert("src_uid", itemMap.value("id"));
        itemMap.insert("address", itemMap.value("mail"));
        itemMap.insert("mode", "mail_to");
        itemMap.insert("src_type", "pub_contacts");
        itemMap.insert("src_type.text", ttr("Contact"));
        TEnumList *enumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
        itemMap.insert("mode.text",enumLst->itemText("mail_to"));
        selData.append(QVariant(itemMap));
    }

    QModelIndexList indexs =  mTableView->appendRows(selData);
    mTableView->unselectAll();
    mTableView->selectRows(indexs);
    mTableView->scrollToBottom();
}

QVariantList SysCommuGroup::getAddContactMailList()
{
    TTableViewDialog *dialog = new TTableViewDialog(this);
    dialog->setTitle( ttr("Add Mail"));
    dialog->setButtons(QStringList()
                       << ttr("Ok") + ":Ok"
                       << ttr("Cancel") + ":Cancel"
                       << ttr("Unselect All") + ":UnselectAll:ResetRole");

    QVariantList headeritems;
    headeritems << QVariant();
    headeritems << tableHeaderItem("name", ttr("Login Name"),100, "string");
    headeritems << tableHeaderItem("company", ttr("Company"),100, "string");
    headeritems << tableHeaderItem("department", ttr("DepartMent"), 100, "string");
    headeritems << tableHeaderItem("mail", ttr("Mail"), 100, "string");
    headeritems << tableHeaderItem("remark", ttr("Remark"), 100, "string");

    dialog->setPrimaryKey("id");
    dialog->setDataKeyList(QStringList() << "id" << "name" << "company" << "department" << "remark" << "mail");
    dialog->setHeaderItem(headeritems);
    dialog->searchEntry()->setPlaceholderText(ttr("Search %1"));
    dialog->searchEntry()->setSearchDelayTime(1);
    dialog->searchEntry()->setOptionList(TDataParse::headerItem2searchList(headeritems));
    dialog->setSearchKeys(QStringList() << "name" << "company" << "department" << "remark" << "mail");
    dialog->tableView()->verticalHeader()->setVisible(false);
    dialog->setSearchText("");
    dialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
    dialog->tableView()->horizontalHeader()->setStretchLastSection(true);

    // 增加other_mail字段的查找
    TSqlSelectorV2 selector;
    selector.setTable("pub_contacts");
    selector.fieldRef() << "id" << "name" << "company" << "mail"
                        << "other_mail::json->'work_mail' as workmail"
                        << "other_mail::json->'private_mail' as privatemail"
                        << "department" << "remark";

    QStringList excludeIdLst;
    for (QVariant id : mTableView->allPrimaryKey()) {
        if(id.toString().trimmed().isEmpty()) {
            continue;
        }

        excludeIdLst.append(id.toString().trimmed());
    }

    if (excludeIdLst.length()>0){
        selector.addWhere(QString(" id not in(%1) ").arg(excludeIdLst.join(",")));
    }

    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        unloading();alertError(ttr("Load data failed!"), dataRes.errText());
        return QVariantList();
    }

    QVariantList allContacts = dataRes.data().toList();

    // 判断数据库表pub_contacts的mail及other_mail字段
    // mail字段优先级最高,other_mail的work_mail次之,other_mail的private_mail最低
    QVariantList dataLst;
    for (QVariant row : allContacts) {
        QVariantMap map = row.toMap();
        QString mail = map["mail"].toString();
        if (!mail.trimmed().isEmpty()) {
            map.insert("mail", mail);
        } else {
            QStringList workmail = TDataParse::jsonStr2Variant(map["workmail"].toString()).toStringList();
            if (workmail.count() != 0) {
                map.insert("mail", workmail.first());
            } else {
                QStringList privatemail = TDataParse::jsonStr2Variant(map["privatemail"].toString()).toStringList();
                if (privatemail.count() != 0) {
                    map.insert("mail", privatemail.first());
                } else {
                    map.insert("mail", "");
                }
            }
        }
        dataLst.append(map);
    }
    dialog->loadData(dataLst);
    QHeaderView *headerView = dialog->tableView()->horizontalHeader();
    connect(headerView, &QHeaderView::sortIndicatorChanged, [=](){
        QString orderField = dialog->tableView()->columnName(headerView->sortIndicatorSection());
        QVariantList allDataList = dialog->tableView()->allDataMap();
        if (headerView->sortIndicatorOrder() == Qt::AscendingOrder) {
            qSort(allDataList.begin(), allDataList.end(), [orderField](QVariant a, QVariant b){
                return a.toMap().value(orderField).toString() < b.toMap().value(orderField).toString();
            });
        } else {
            qSort(allDataList.begin(), allDataList.end(), [orderField](QVariant a, QVariant b){
                return a.toMap().value(orderField).toString() > b.toMap().value(orderField).toString();
            });
        }
        dialog->tableView()->clearData();
        dialog->loadData(allDataList);
    });
    QVariantList selLst = dialog->run();
    return selLst;
}

void SysCommuGroup::showAddContactWeixin()
{
    QVariantList selLst = getAddContactWeixinList();
    if (selLst.isEmpty()) {
        return;
    }

    QVariantList selData;
    for (QVariant item : selLst) {
        QVariantMap itemMap = item.toMap();
        itemMap.insert("src_uid", itemMap.value("id"));
        itemMap.insert("address", itemMap.value("wechat"));
        itemMap.insert("mode", "weixin");
        itemMap.insert("src_type", "pub_contacts");
        itemMap.insert("src_type.text", ttr("Contact"));
        TEnumList *enumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
        itemMap.insert("mode.text", enumLst->itemText("weixin"));
        selData.append(QVariant(itemMap));
    }

    QModelIndexList indexs =  mTableView->appendRows(selData);
    mTableView->unselectAll();
    mTableView->selectRows(indexs);
    mTableView->scrollToBottom();
}

QVariantList SysCommuGroup::getAddContactWeixinList()
{
    TTableViewDialog *dialog = new TTableViewDialog(this);
    dialog->setTitle(ttr("Add Wechat"));
    dialog->setButtons(QStringList()
                       << ttr("Add") + ":Ok"
                       << ttr("Cancel")+":Cancel"
                       << ttr("Unselect All")+":UnselectAll:ResetRole");

    QVariantList headeritems;
    headeritems << QVariant();
    headeritems << tableHeaderItem("name", ttr("Login Name"),100, "string");
    headeritems << tableHeaderItem("company", ttr("Company"),100, "string");
    headeritems << tableHeaderItem("department", ttr("DepartMent"), 100, "string");
    headeritems << tableHeaderItem("wechat", ttr("Wechat"), 100, "string");
    headeritems << tableHeaderItem("remark", ttr("Remark"), 100, "string");

    dialog->setPrimaryKey("id");
    dialog->setDataKeyList(QStringList() << "id" << "name" << "company" << "department" << "remark" << "wechat");
    dialog->setHeaderItem(headeritems);
    dialog->searchEntry()->setPlaceholderText(ttr("Search %1"));
    dialog->searchEntry()->setSearchDelayTime(1);
    dialog->searchEntry()->setOptionList(TDataParse::headerItem2searchList(headeritems));
    dialog->setSearchKeys(QStringList() << "name" << "company" << "department" << "remark" << "wechat");
    dialog->tableView()->verticalHeader()->setVisible(false);
    dialog->setSearchText("");
    dialog->setSelectionMode(QAbstractItemView::ExtendedSelection);
    dialog->tableView()->horizontalHeader()->setStretchLastSection(true);

    TSqlSelectorV2 selector;
    selector.setTable("pub_contacts");
    selector.fieldRef() << "id" << "name" << "company" << " other_contact::json->'weixin' as wechat " << "department"
                        << "remark";

    QStringList excludeIdLst;
    for (QVariant id : mTableView->allPrimaryKey()){
        if(id.toString().trimmed().isEmpty())  continue;

        excludeIdLst.append(id.toString().trimmed());
    }

    if (excludeIdLst.length() > 0) {
        selector.addWhere(QString(" id not in(%1) ").arg(excludeIdLst.join(",")));
    }

    QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        unloading();
        alertError(ttr("Load data failed!"), dataRes.errText());
        return QVariantList();
    }

    QVariantList allContacts = dataRes.data().toList();

    // 转换微信json字段
    QVariantList dataLst;
    for (QVariant row : allContacts) {
        QVariantMap map = row.toMap();
        QStringList wechat = TDataParse::jsonStr2Variant(map["wechat"].toString()).toStringList();
        if (wechat.count() != 0) {
            map.insert("wechat", wechat.first());
        } else {
            map.insert("wechat", "");
        }
        dataLst.append(map);
    }

    dialog->loadData(dataLst);
    QHeaderView *headerView = dialog->tableView()->horizontalHeader();
    connect(headerView, &QHeaderView::sortIndicatorChanged, [=](){
        QString orderField = dialog->tableView()->columnName(headerView->sortIndicatorSection());
        QVariantList allDataList = dialog->tableView()->allDataMap();
        if (headerView->sortIndicatorOrder() == Qt::AscendingOrder) {
            qSort(allDataList.begin(), allDataList.end(), [orderField](QVariant a, QVariant b){
                return a.toMap().value(orderField).toString() < b.toMap().value(orderField).toString();
            });
        } else {
            qSort(allDataList.begin(), allDataList.end(), [orderField](QVariant a, QVariant b){
                return a.toMap().value(orderField).toString() > b.toMap().value(orderField).toString();
            });
        }
        dialog->tableView()->clearData();
        dialog->loadData(allDataList);
    });
    QVariantList selList = dialog->run();
    return selList;
}

void SysCommuGroup::showManuallyAddMail()
{
    TUiloaderDialog *dlg = new TUiloaderDialog(this);
    dlg->setTitle(ttr("Add Mail"));
    dlg->resize(300, 200);
    dlg->uiLoader()->setScriptEngine(APP->scriptEngine());
    dlg->setSelf(this);
    dlg->setUiStr(ui("add-mail").toString());

    QVariantMap res = dlg->run();
    if (res.isEmpty()) {
        return;
    }

    QString userName = res.value("name").toString();
    QString userMail = res.value("address").toString();

    QVariantList selData;
    QVariantMap rowInfo;
    TEnumList *enumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
    rowInfo.insert("mode", QString("mail_to"));
    rowInfo.insert("mode.text", enumLst->itemText("mail_to"));
    rowInfo.insert("src_type", "manual");
    rowInfo.insert("src_type.text", ttr("manual"));
    rowInfo.insert("name", userName);
    rowInfo.insert("address", userMail);
    selData.append(QVariant(rowInfo));

    QModelIndexList indexs =  mTableView->appendRows(selData);
    mTableView->unselectAll();
    mTableView->selectRows(indexs);
    mTableView->scrollToBottom();
}

void SysCommuGroup::showManuallyAddWeixin()
{
    TUiloaderDialog *dlg = new TUiloaderDialog(this);
    dlg->setTitle(ttr("Add Wechat"));
    dlg->resize(300, 200);
    dlg->uiLoader()->setScriptEngine(APP->scriptEngine());
    dlg->setSelf(this);
    dlg->setUiStr(ui("add-wechat").toString());

    QVariantMap res = dlg->run();
    if (res.isEmpty()) {
        return;
    }

    QString userName = res.value("name").toString();
    QString userWeixin = res.value("address").toString();

    QVariantList selData;
    QVariantMap rowInfo;
    TEnumList *toEnumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
    rowInfo.insert("mode",QString("weixin"));
    rowInfo.insert("mode.text", toEnumLst->itemText("weixin"));
    rowInfo.insert("src_type", "manual");
    rowInfo.insert("src_type.text", ttr("manual"));
    rowInfo.insert("name", userName);
    rowInfo.insert("address", userWeixin);
    selData.append(QVariant(rowInfo));

    QModelIndexList indexs =  mTableView->appendRows(selData);
    mTableView->unselectAll();
    mTableView->selectRows(indexs);
    mTableView->scrollToBottom();
}

void SysCommuGroup::fillTableData(const QVariantList &iDataLst)
{
     TEnumList *enumLst = TOPENM->enumList(ENUM_SYS_COMMU_SEND_MODE);
     if (!enumLst) {
         mTableView->loadData(iDataLst);
         return;
     }

     QVariantList dataLst;
     for (QVariant item : iDataLst) {
         QVariantMap itemMap = item.toMap();
         itemMap.insert("to_cc.text", enumLst->itemText(itemMap.value("to_cc").toString()));
         itemMap.insert("src.text", ttr(itemMap.value("src").toString()));
         dataLst << itemMap;
     }
     mTableView->loadData(dataLst);
}

TTableView *SysCommuGroup::getTableView()
{
    return mTableView;
}

QVariantList SysCommuGroup::plantList()
{
    return mPlantList;
}

QVariantList SysCommuGroup::departmentList()
{
    return mDepartmentList;
}

QVariantMap SysCommuGroup::departmentMap()
{
    return mDepartmentMap;
}

void SysCommuGroup::setWorkcenterId(const QString &iId)
{
    mWorkcenterId = iId;
    mUiLoader->refreshState();
    refreshActionState();
}

QString SysCommuGroup::workcenterId()
{
    return mWorkcenterId;
}

void SysCommuGroup::uidChangeEvent(const QString &iUidStr)
{
    if (iUidStr.toInt() == -1) {
        this->setEnabled(false);
    } else {
        this->setEnabled(true);
    }
    if (iUidStr.toInt() == 0) {
        setTitle(ttr("New Contact Group"));
        clearData();
    } else {
        t::loading(this);
        QVariant data = doThreadWork(new SysCommuGroupThread(this), "LOAD_DATA", QVariant(this->uid()));
        TDataResponse dataRes(data.toMap());
        unloading();
        if (dataRes.hasError()) {
            alertError(ttr("Load data failed!"), dataRes.errText());
        } else {
            QVariantMap dataMap = dataRes.data().toMap();
            clearData();
            setData(dataMap);
            setTitle(ttr("Contact Group-%1").arg(dataMap.value("title").toString()));
        }
    }
    setDataModified(false);
}

void SysCommuGroup::resizeEvent(QResizeEvent *iEvent)
{
    QSize size = iEvent->size();
    if (size.width() > this->perfectSize().width()) {
        mBodyLayout->setMargin(TTHEME_DP(16));
        mUiLoader->setProperty("SS_BORDER", 1);
        mUiLoader->setStyleSheet(".Q{}");
    } else {
        mBodyLayout->setMargin(0);
        mUiLoader->setProperty("SS_BORDER", 0);
        mUiLoader->setStyleSheet(".Q{}");
    }
}

void SysCommuGroup::initSearchEntry()
{
    if (TSearchEntry *searchentry = qobject_cast<TSearchEntry *>(mUiLoader->getObject("search"))) {
        QVariantList searchOptionLst;

        QVariantMap option;
        option.insert("name", "name");
        option.insert("text", ttr("User Name"));
        searchOptionLst.append(option);

        searchentry->setPlaceholderText(ttr("Search %1"));
        searchentry->setSearchDelayTime(1);
        searchentry->setOptionList(searchOptionLst);
        mSearchKey << "name";

        connect(searchentry, SIGNAL(search(QString,QVariant)), this, SLOT(onDoSearch(QString,QVariant)));
    }
}

QVariantMap SysCommuGroup::tableHeaderItem(const QString &iKeyStr, const QString &iDispStr, int iSizeInt, const QString &iTypeStr)
{
    QVariantList itemLst;
    itemLst << "name" << iKeyStr << "display" << iDispStr
         << "displayRole" << QString("$%1").arg(iKeyStr)
         << "resizeMode" << "Interactive" << "size" << iSizeInt ;
    if (!iTypeStr.isEmpty()) {
        itemLst << "search" << iTypeStr;
    }
    return TDataParse::variantList2Map(itemLst);
}

void SysCommuGroup::initPlantList()
{
    TSqlSelectorV2 selector;
    selector.setTable("mes_workcenter");
    selector.setField("id,code AS name,name AS text");
    selector.setWhere("node_type = 'plant'");
    selector.addWhere("attr_data#>>'{del_flag}' <> '1' OR attr_data#>>'{del_flag}' IS NULL");
    selector.setOrder("code", Qt::AscendingOrder);
    QVariant data  = doThreadWork(new TopClassSqlThread(this),TOPSQLTHREAD_SELECT_ARRAYMAP,QVariant::fromValue(selector));
    TDataResponse dataRes(data.toMap());
    if (dataRes.hasError()) {
        alertError(ttr("Load data failed!"), dataRes.errText());
        return;
    } else {
        mPlantList = dataRes.data().toList();
    }
    QStringList pidList;
    for (QVariant &var: mPlantList) {
        QVariantMap varMap = var.toMap();
        pidList.append(varMap.value("id").toString());
    }
    if (pidList.length() > 0) {
        selector.clear();
        selector.setTable("mes_workcenter");
        selector.setField("parent_id,code AS name,name AS text");
        selector.setWhere("parent_id", pidList);
        selector.addWhere("attr_data#>>'{del_flag}' <> '1' OR attr_data#>>'{del_flag}' IS NULL");
        selector.setOrder("code", Qt::AscendingOrder);
        QVariant data2  = doThreadWork(new TopClassSqlThread(this),TOPSQLTHREAD_SELECT_ARRAYMAP,QVariant::fromValue(selector));
        TDataResponse dataRes2(data2.toMap());
        if (dataRes2.hasError()) {
            alertError(ttr("Load data failed!"), dataRes2.errText());
            return;
        } else {
            mDepartmentList = dataRes2.data().toList();
            for (QVariant &pvar: mPlantList) {
                QVariantMap pvarMap = pvar.toMap();
                QString pid = pvarMap.value("id").toString();
                QString pcode = pvarMap.value("name").toString();
                QVariantList subList;
                for (QVariant &cvar: mDepartmentList) {
                    QVariantMap cvarMap = cvar.toMap();
                    QString cid = cvarMap.value("parent_id").toString();
                    if (pid == cid) {
                        subList.append(cvarMap);
                    }
                }
                mDepartmentMap.insert(pcode, subList);
            }
        }
    }
}

void SysCommuGroup::onDoSearch(const QString &iSearchStr, const QVariant &iOptions)
{
    if (mTableView) {
        QRegExp rx(iSearchStr);
        rx.setPatternSyntax(QRegExp::Wildcard);
        rx.setCaseSensitivity(Qt::CaseInsensitive);
        QStringList searchlist = iOptions.toStringList();
        if (searchlist.isEmpty()) {
            searchlist = mSearchKey;
        }

        mTableView->findRows(rx,searchlist,1);
    }
}