#include "sysuserv1thread.h" #include <topcore/topclassabs.h> #include <tbaseutil/tdataparse.h> #include <tbaseutil/tdataresponse.h> #include <tdatabaseutil/tsqlconnectionpoolv2.h> #include <tdatabaseutil/tsqlqueryv2.h> #include <tdatabaseutil/tsqlselectorv2.h> SysUserV1Thread::SysUserV1Thread(QObject *iParent) : TopClassThreadAbs(iParent) { } SysUserV1Thread::~SysUserV1Thread() { } void SysUserV1Thread::run() { if (invokeName() == "LOAD_DATA") { loadData(invokeParameter().toInt()); } else if (invokeName() == "SAVE_DATA") { saveData(invokeParameter().toMap()); } } //iIdInt invokeParameter().toInt() void SysUserV1Thread::loadData(int iIdInt) { //dataRes传回给QVariant data = doThreadWork(new SysUserV1Thread(this), "LOAD_DATA", QVariant(this->uid()))定义的data对象 TDataResponse dataRes; //TSql这个类执行sql语句,获取一个数据库,这个数据库在软件里选择 TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase()); sqlQuery.begin(); // 开始操作数据库 try { // Selector:查 TSqlSelectorV2 sqlSelector; //将sys_user取小名为U,左连接pub_contacts表,pub_contacts的小名为C,两表连接的条件是U.contcat_id = C.id sqlSelector.setTable("sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id"); //设置要查找的字段,查找的字段是U里面所有表格的C.mail //这是查的内容 sqlSelector.setField("U.*, C.mail"); //设置查找条件U.id==QVariant(iIdInt) sqlSelector.setWhere("U.id", QVariant(iIdInt)); //设置表里"product_category"字段的格式为数组 sqlSelector.setFieldFormat("product_category", "array"); sqlSelector.setFieldFormat("attr_data", "json"); //sqlQuery是执行器,用来执行sqlSelector表格,会返回查询结果给dataMap QVariantMap dataMap = sqlQuery.selectMap(sqlSelector); //这句话是在看查询语句是否错误,如果错误,抛出错误:可以看到这个错 if (sqlQuery.lastError().isValid()) { throw sqlQuery.lastError(); } //提交:把执行结果提交给数据库 sqlQuery.commit(); //dataMap是查询结果,要把dataMap传回给dataRes,然后再 dataRes.setData(dataMap); //设置结果:把dataRes返回给data setInvokeResult(dataRes.toVariantMap()); return; //捕获异常 } catch (const TError &err) { dataRes.setError(err); } catch (...) { dataRes.setErrText(ttr("Unknow Error!")); } //回滚:改了一个东西,但发现错了,就撤回SQL操作 sqlQuery.rollback(); //再次把结果传给data setInvokeResult(dataRes.toVariantMap()); } void SysUserV1Thread::saveData(const QVariantMap &iDataMap) { TDataResponse dataRes; TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase()); sqlQuery.begin(); try { TSqlSelectorV2 sqlSelector; sqlSelector.setTable("sys_user"); sqlSelector.setField("COUNT(1)"); sqlSelector.addWhere("username", iDataMap.value("username")); sqlSelector.addWhere("id", iDataMap.value("id"), "!="); int count = sqlQuery.selectCount(sqlSelector); if (count > 0) { throw TError(ttr("'%1' already exists!").arg(iDataMap.value("username").toString()), "ERROR", "ALREADY_EXISTS"); } // 更新pub_contacts表的mail QVariantMap contactMap; contactMap.insert("mail", iDataMap.value("mail")); QString username = iDataMap.value("username").toString(); QString fullname = iDataMap.value("fullname").toString(); QString name; if (!fullname.isEmpty() && (username != fullname)) { name = QString("%1(%2)").arg(fullname).arg(username); } else { name = username; } contactMap.insert("name", name); contactMap.insert("id", iDataMap.value("contcat_id").toInt()); contactMap.insert("source", "company"); contactMap.insert("status", iDataMap.value("status").toString() == "active" ? "active" : "inactive"); TopClassAbs *parentModule = static_cast<TopClassAbs*>(this->parent()); if (parentModule) { if (parentModule->isHookExists("handleContactData")) { contactMap = parentModule->callHooksQuick("handleContactData", QVariantList()<<contactMap<<iDataMap).toVariant().toMap(); } } QStringList contactFields = contactMap.keys(); contactFields.removeOne("id"); TSqlInserterV2 sqlInserter; sqlInserter.setTable("pub_contacts"); sqlInserter.setData(contactMap); sqlInserter.setField(contactFields); sqlInserter.setUniqueField("id"); sqlInserter.setAutoIncrementField("id"); QVariant contactId = sqlQuery.replaceRow(sqlInserter); if (sqlQuery.lastError().isValid()) { throw sqlQuery.lastError(); } // 更新sys_commu_grp_detail TSqlUpdaterV2 sqlUpdater; sqlUpdater.setTable("sys_commu_grp_detail"); sqlUpdater.setField(QStringList() << "address" << "name"); QVariantMap commuGrpDetailDataMap; commuGrpDetailDataMap.insert("address", iDataMap.value("mail")); commuGrpDetailDataMap.insert("name", name); sqlUpdater.setData(commuGrpDetailDataMap); TSqlWhereCompsiteV2 commuGrpDetailWhere; commuGrpDetailWhere.append("src_type", "pub_contacts"); commuGrpDetailWhere.append("src_uid", iDataMap.value("contcat_id").toString()); commuGrpDetailWhere.setLogic(TSqlWhereCompsiteV2::Logic_And); sqlUpdater.setWhere(commuGrpDetailWhere); sqlQuery.updateRow(sqlUpdater); if (sqlQuery.lastError().isValid()) { throw sqlQuery.lastError(); } // 更新sys_user表 QVariantMap dataMap = iDataMap; QStringList fieldLst = dataMap.keys(); dataMap.insert("contcat_id", contactId); QStringList productCategory = dataMap.value("product_category").toStringList(); // 只要产品分类列表中包含有*, 就只存* if (productCategory.contains("*")) { productCategory = (QStringList() << "*"); } dataMap.insert("product_category", productCategory); if (iDataMap.value("id").toInt() == 0) { // 新建时插入默认密码 QString password = iDataMap.value("password").toString(); if (password.isEmpty()) { password = QStringLiteral("123456"); } dataMap.insert("password", TDataParse::getVariantMd5(password)); } else { fieldLst.removeOne("password"); } fieldLst.removeOne("id"); fieldLst.removeOne("mail"); QVariantMap attrDataMap = dataMap.value("attr_data").toMap(); if (attrDataMap.value("password_validity_control") == 0) { attrDataMap.insert("effective_date", QString("")); attrDataMap.insert("validity_period", QString("")); dataMap.insert("attr_data", attrDataMap); } qDebug().noquote().nospace()<<TDataParse::variant2JsonStr(dataMap); sqlInserter.clear(); sqlInserter.setTable("sys_user"); sqlInserter.setData(dataMap); sqlInserter.setField(fieldLst); sqlInserter.setUpdatePolicy("attr_data", "json_merge"); sqlInserter.setUniqueField("id"); sqlInserter.setAutoIncrementField("id"); QVariant userId = sqlQuery.replaceRow(sqlInserter); if (sqlQuery.lastError().isValid()) { throw sqlQuery.lastError(); } sqlQuery.commit(); dataRes.setData(userId); setInvokeResult(dataRes.toVariantMap()); return; } catch (const TError &err) { dataRes.setError(err); } catch (...) { dataRes.setErrText(ttr("Unknow Error!")); } sqlQuery.rollback(); setInvokeResult(dataRes.toVariantMap()); }