#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()); }