sysrolethread.cpp 7.66 KB
#include "sysrolethread.h"
#include <QTime>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/thttputil.h>
#include <tbaseutil/tjsonapi.h>
#include <tdatabaseutil/tsqlconnectionpoolv2.h>
#include <tdatabaseutil/tsqlqueryv2.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <topcore/topcore.h>

SysRoleThread::SysRoleThread(QObject *iParent)
    : TopClassThreadAbs(iParent)
{

}

SysRoleThread::~SysRoleThread()
{

}

void SysRoleThread::run()
{
    if (invokeName() == "LOAD_DATA") {
        QVariantMap paraMap = invokeParameter().toMap();
        loadData(paraMap.value("uid").toInt(), paraMap.value("config_product_category").toStringList());
    } else if (invokeName() == "SAVE_DATA") {
        saveData(invokeParameter().toMap());
    } else if (invokeName() == "LOAD_RGT") {
        loadRgt(invokeParameter().toStringList());
    }
}

void SysRoleThread::loadData(int iIdInt, const QStringList &iProductCategoryStrLst)
{
    TDataResponse dataRes;

    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        TSqlSelectorV2 sqlSelector;
        sqlSelector.setTable("sys_role");
        sqlSelector.setField("*");
        sqlSelector.setFieldFormat("product_category", "array");
        sqlSelector.setWhere("id", QVariant(iIdInt));
        QVariantMap dataMap = sqlQuery.selectMap(sqlSelector);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlSelector.clear();
        sqlSelector.setTable("sys_role_map_permission");
        sqlSelector.setField(QStringList() << "permission_name" << "product_category");
        sqlSelector.addWhere("role_id", QVariant(iIdInt));
        sqlSelector.addWhere("product_category", iProductCategoryStrLst);
        QVariantList rgtIdLst = sqlQuery.selectArrayMap(sqlSelector);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }
        QStringList rgtStrLst;
        for (QVariant rgtId: rgtIdLst) {
            rgtStrLst << (rgtId.toMap().value("product_category").toString() + "%" +
                           rgtId.toMap().value("permission_name").toString());
        }
        dataMap.insert("RGT_LIST", rgtStrLst);

        sqlSelector.clear();
        sqlSelector.setTable("sys_role_map_user AS LNK INNER JOIN sys_user AS U ON LNK.user_id = U.id");
        sqlSelector.fieldRef() <<"U.id"<< "U.username"<< "U.fullname"<<"U.remark";
        sqlSelector.setWhere("LNK.role_id", iIdInt);
        QVariantList userLst = sqlQuery.selectArrayMap(sqlSelector);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }
        dataMap.insert("USER_LIST", userLst);

        sqlQuery.commit();

        dataRes.setData(dataMap);
        setInvokeResult(dataRes.toVariantMap());
        return;
    } catch (const TError &err) {
        dataRes.setError(err);
    } catch (...) {
        dataRes.setErrText(ttr("Unknow Error!"));
    }
    sqlQuery.rollback();
    setInvokeResult(dataRes.toVariantMap());
}

void SysRoleThread::saveData(const QVariantMap &iDataMap)
{
    TDataResponse dataRes;

    TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
    sqlQuery.begin();
    try {
        TSqlSelectorV2 sqlSelector;
        sqlSelector.setTable("sys_role");
        sqlSelector.setField("COUNT(1)");
        sqlSelector.addWhere("name", iDataMap.value("name"));
        sqlSelector.addWhere("id", iDataMap.value("id"), "!=");
        int count = sqlQuery.selectCount(sqlSelector);
        if (count > 0) {
            throw TError(ttr("'%1' already exists!").arg(iDataMap.value("name").toString()), "ERROR", "ALREADY_EXISTS");
        }

        QStringList fieldLst;
        fieldLst << "description" << "name" << "product_category";
        QVariantMap dataMap = iDataMap;
        QStringList productCategory = dataMap.value("product_category").toStringList();
        // 只要产品分类列表中包含有*, 就只存*
        if (productCategory.contains("*")) {
            productCategory = (QStringList() << "*");
        }
        dataMap.insert("product_category", productCategory);

        // 1. 保存角色信息
        // 角色信息保存到用户选择的product_category
        TSqlInserterV2 sqlInserter;
        sqlInserter.setTable("sys_role");
        sqlInserter.setData(dataMap);
        sqlInserter.setField(fieldLst);
        sqlInserter.setUniqueField("id");
        sqlInserter.setAutoIncrementField("id");
        QVariant dataId = sqlQuery.replaceRow(sqlInserter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        // 2. 保存角色的权限列表
        // 权限列表保存到配置的product_category
        TSqlDeleterV2 sqlDeleter;
        sqlDeleter.setTable("sys_role_map_permission");
        sqlDeleter.addWhere("role_id", dataId);
        sqlDeleter.addWhere("product_category", iDataMap.value("config_product_category"));
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        QVariantList roleMapPermissionLst;
        for (QVariant rgtkey : iDataMap.value("RGT_LIST").toList()) {
            QVariantMap tempMap;
            QStringList tmpLst = rgtkey.toString().split("%");
            if (tmpLst.count() == 2) {
                tempMap.insert("product_category", tmpLst.value(0));
                tempMap.insert("permission_name", tmpLst.value(1));
                tempMap.insert("role_id", dataId.toString());
                roleMapPermissionLst << tempMap;
            }
        }
        sqlQuery.batchInsert("sys_role_map_permission",
                             QStringList() << "product_category" << "permission_name" << "role_id",
                             roleMapPermissionLst);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        // 3. 保存角色对应的用户列表
        sqlDeleter.clear();
        sqlDeleter.setTable("sys_role_map_user");
        sqlDeleter.setWhere("role_id", dataId);
        sqlQuery.deleteRow(sqlDeleter);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        QVariantList roleMapUserLst;
        for (QVariant userid : iDataMap.value("USER_LIST").toList()) {
            QVariantMap tempMap;
            tempMap.insert("user_id", userid.toString());
            tempMap.insert("role_id", dataId.toString());
            roleMapUserLst << tempMap;
        }
        sqlQuery.batchInsert("sys_role_map_user",
                             QStringList() << "user_id" << "role_id",
                             roleMapUserLst);
        if (sqlQuery.lastError().isValid()) {
            throw sqlQuery.lastError();
        }

        sqlQuery.commit();

        dataRes.setData(dataId);
        setInvokeResult(dataRes.toVariantMap());
        return;
    } catch (const TError &err) {
        dataRes.setError(err);
    } catch (...) {
        dataRes.setErrText(ttr("Unknow Error!"));
    }
    sqlQuery.rollback();
    setInvokeResult(dataRes.toVariantMap());
}

void SysRoleThread::loadRgt(const QStringList &iProductCategoryStrLst)
{
    TDataResponse dataRes;
    THttpUtil httpUtil = APP->httpUtil();
    QVariantMap bodyMap;
    bodyMap.insert("product_category", iProductCategoryStrLst);
    bodyMap.insert("language", APP->language());
    TJsonApiResponse response = httpUtil.httpRequest("/system/getPermissionListByLang", bodyMap)
            .httpPost().toJsonApiResponse();
    if (response.hasError()) {
        dataRes.setErrText(response.firstError().title() + "\n" + response.firstError().detail());
    } else {
        dataRes.setData(response.data());
    }
    setInvokeResult(dataRes.toVariantMap());
}