DPS/DataPlatform/DataAttribute.cpp

382 lines
10 KiB
C++
Raw Normal View History

2025-06-23 10:41:33 +08:00
#pragma execution_character_set("utf-8")
#include "DataAttribute.h"
#include "M_NormalColumnDAO.h"
#include "M_EntityModelDAO.h"
#include "global.h"
#include "DataClass.h"
#include "DataManager.h"
#include < regex >
DataAttribute::DataAttribute()
{
_baseType = g_TYPE_DATAATTRUBUTE;
}
DataAttribute::~DataAttribute()
{
}
// void static backupDAOData(DBPlatformSpace::M_NormalColumnDAO& src, DBPlatformSpace::M_NormalColumnDAO& dst)
// {
2025-06-23 10:41:33 +08:00
// }
2025-06-23 10:41:33 +08:00
// void static restoreData(DBPlatformSpace::M_NormalColumnDAO& src, DataAttribute& dst)
// {
// //主要恢复界面属性值
// }
2025-06-23 10:41:33 +08:00
void DataAttribute::checkImportAttributeName(DPData* pParent)
{
DataClass* pClass = qobject_cast<DataClass*>(pParent);
2025-06-23 18:01:09 +08:00
/*新加入属性*/
//看属性是否有显示名称相同的,有相同则加序号
2025-06-23 10:41:33 +08:00
int id = 0;
QString newName = _strDisplayName;
while (pClass->hasSameNameChild("displayName", newName))
{
2025-06-23 18:01:09 +08:00
LOG(INFO) << CommonHelper::utf8ToStdString("新加属性显示名称与原有属性相同, 加序号");
2025-06-23 10:41:33 +08:00
id += 1;
newName = _strDisplayName + QString::number(id);
}
_strDisplayName = newName;
}
2025-06-23 18:01:09 +08:00
//属性名第一个字母大写C,第二个字母大写
2025-06-23 10:41:33 +08:00
void DataAttribute::reName( )
{
QString oldName = _name;
QString newName;
2025-06-23 18:01:09 +08:00
//首字母变成大写
2025-06-23 10:41:33 +08:00
if (oldName.at(0) == "C" || oldName.at(0) == "c")
{
if (oldName.size() >= 2)
{
_name = 'C' + oldName.at(1).toUpper() + oldName.right(oldName.size() - 2);
}
else
{
_name = 'C' ;
}
}
else
{
newName = oldName.at(0).toUpper() + oldName.right(oldName.size() - 1);
_name = "C" + newName;
}
}
void DataAttribute::toJson(json& jsonObj, bool)
{
jsonObj["id"] = _id;
jsonObj["label"] = CommonHelper::qstringToUtf8(_strDisplayName);
jsonObj["name"] = CommonHelper::qstringToUtf8(_name);
jsonObj["description"] = CommonHelper::qstringToUtf8(_strDescription);
jsonObj["createVersion"] = _wCreateVersion;
jsonObj["delVersion"] = _wDeleteVersion;
jsonObj["dataType"] = _wDataType;
jsonObj["defaultValue"] = CommonHelper::qstringToUtf8(_strDefaultValue);
jsonObj["isIndex"] = CommonHelper::intTobool(_wIsIndex);
jsonObj["isOnly"] = CommonHelper::intTobool(_wIsOnly);
jsonObj["isAutoincrement"] = CommonHelper::intTobool(_wIsAutoincrement);
jsonObj["maxLength"] = _wMaxLength;
jsonObj["minLength"] = _wMinLength;
jsonObj["numLength"] = _wNumLength;
jsonObj["numPresision"] = _wNumPresision;
jsonObj["isFindKey"] = CommonHelper::intTobool(_wIsFindKey);
jsonObj["fkType"] = _FKType;
jsonObj["fkTableID"] = _wFkTableID;
jsonObj["classType"] = g_TYPE_DATAATTRUBUTE;
jsonObj["innerName"] = CommonHelper::qstringToUtf8(_strInternalName);
2025-06-23 18:01:09 +08:00
//是否为主键
2025-06-23 10:41:33 +08:00
jsonObj["isPk"] = CommonHelper::intTobool(_isPrimaryKey);
if (_displayfield == "")
{
using namespace DBPlatformSpace;
M_NormalColumnDAO* pAtt = static_cast<M_NormalColumnDAO*>(_pDBDAO);
string name = pAtt->NameToDAOAttriName(pAtt->_name);
_displayfield = QString::fromStdString(name);
}
//[20230914]
jsonObj["field"] = CommonHelper::qstringToUtf8(_displayfield);
}
bool DataAttribute::saveSelf()
{
using namespace DBPlatformSpace;
ResultMsg rm;
2025-06-23 18:01:09 +08:00
/*将这条项目数据写入数据库*/
2025-06-23 10:41:33 +08:00
M_NormalColumnDAO* pDao = dynamic_cast<M_NormalColumnDAO*>(_pDBDAO);
2025-06-23 18:01:09 +08:00
/*备份DAO数据*/
2025-06-23 10:41:33 +08:00
M_NormalColumnDAO oldDaoData;
// backupDAOData(*pDao, oldDaoData);
2025-06-23 10:41:33 +08:00
if (pDao == nullptr)
{
pDao = new M_NormalColumnDAO();
}
saveToDao();
rm = pDao->save();
if (rm.rCode == 0)
{
LOG(INFO) << CommonHelper::utf8ToStdString("M_NormalColumnDAO.save success ");
return true;
}
else
{
LOG(INFO) << CommonHelper::utf8ToStdString("M_NormalColumnDAO.save failed ");
LOG(ERROR) << rm.rMsg;
// restoreData(oldDaoData, *this);
2025-06-23 10:41:33 +08:00
return false;
}
}
bool DataAttribute::deleteSelf()
{
using namespace DBPlatformSpace;
if (_pDBDAO)
{
DPData* pDataModel = getDataModelOwner();
M_EntityModelDAO* pModelDAO = dynamic_cast<M_EntityModelDAO*>(pDataModel->_pDBDAO);
M_NormalColumnDAO* pAttributeDao = dynamic_cast<M_NormalColumnDAO*>(_pDBDAO);
ResultMsg rm = pAttributeDao->delFromEntityModel(pModelDAO);
if (rm.rCode == 0)
{
LOG(INFO) << CommonHelper::utf8ToStdString("M_NormalColumnDAO.delFromEntityModel success ");
2025-06-23 18:01:09 +08:00
QString msg = "NormalColumn:" + QString::number(_id) + "--" + _name + "删除成功";
2025-06-23 10:41:33 +08:00
LOG(INFO) << CommonHelper::qstringToString(msg);
if (_parent)
{
_parent->deleteChild(_id);
return true;
}
else
{
2025-06-23 18:01:09 +08:00
LOG(INFO) << CommonHelper::utf8ToStdString("属性_parent = null");
//_parent为空
2025-06-23 10:41:33 +08:00
return false;
}
}
else
{
LOG(INFO) << CommonHelper::utf8ToStdString("M_NormalColumnDAO.delFromEntityModel failed ");
LOG(ERROR) << rm.rMsg;
2025-06-23 18:01:09 +08:00
//数据库删除失败
2025-06-23 10:41:33 +08:00
return false;
}
}
else
{
LOG(ERROR) << CommonHelper::utf8ToStdString("DataAttribute._pDBDAO = null ");
2025-06-23 18:01:09 +08:00
//_pDBDAO为空
2025-06-23 10:41:33 +08:00
return false;
}
}
void DataAttribute::loadData(DBPlatformSpace::DAO* pDao)
{
_pDBDAO = pDao;
DBPlatformSpace::M_NormalColumnDAO* pDAOData = dynamic_cast<DBPlatformSpace::M_NormalColumnDAO*>(_pDBDAO);
_id = pDAOData->_ID;
_name = CommonHelper::stringToQstring(pDAOData->_name);
_wCreateVersion = pDAOData->_addVersion;
_wDataType = pDAOData->_dataType;
_strDefaultValue = CommonHelper::stringToQstring(pDAOData->_defaultValue);
_wDeleteVersion = pDAOData->_delVersion;
_strDescription = CommonHelper::stringToQstring(pDAOData->_description);
_strDisplayName = CommonHelper::stringToQstring(pDAOData->_displayName);
_wFkTableID = pDAOData->_fkTableID;
_FKType = pDAOData->_fkType;
_strInternalName = CommonHelper::stringToQstring(pDAOData->_innerName);
2025-06-23 18:01:09 +08:00
// int _interfaceAttrTyp; ///<接口属性(需要添加专属接口的属性)类型
2025-06-23 10:41:33 +08:00
_wIsAutoincrement = pDAOData->_isAutoIncrement;
2025-06-23 18:01:09 +08:00
// _isDeleted 是否逻辑删除
2025-06-23 10:41:33 +08:00
_wIsFindKey = pDAOData->_isFindKey;
_wIsIndex = pDAOData->_isIndex;
_wIsOnly = pDAOData->_isOnly;
_wMaxLength = pDAOData->_maxLength;
_wMinLength = pDAOData->_minLength;
_wNumLength = pDAOData->_numLength;
_wNumPresision = pDAOData->_numPresision;
_isPrimaryKey = pDAOData->_isPk;
2025-06-23 18:01:09 +08:00
//_t_M_EntityTableID 所属数据类id
2025-06-23 10:41:33 +08:00
}
void DataAttribute::saveToDao()
{
using namespace DBPlatformSpace;
M_NormalColumnDAO* pDao = dynamic_cast<M_NormalColumnDAO*>(_pDBDAO);
if (pDao == nullptr)
{
pDao = new M_NormalColumnDAO();
_pDBDAO = pDao;
}
// pDao->_ID = getID();
2025-06-23 18:01:09 +08:00
//名称标识
2025-06-23 10:41:33 +08:00
pDao->_name = CommonHelper::qstringToStdString(getName());
2025-06-23 18:01:09 +08:00
//数据类型
2025-06-23 10:41:33 +08:00
pDao->_dataType = _wDataType;
pDao->_fkTableID = _wFkTableID;
pDao->_fkType = _FKType;
2025-06-23 18:01:09 +08:00
//默认值
2025-06-23 10:41:33 +08:00
pDao->_defaultValue = CommonHelper::qstringToStdString(_strDefaultValue);
2025-06-23 18:01:09 +08:00
//描述
2025-06-23 10:41:33 +08:00
pDao->_description = CommonHelper::qstringToStdString(_strDescription);
2025-06-23 18:01:09 +08:00
//显示名称
2025-06-23 10:41:33 +08:00
pDao->_displayName = CommonHelper::qstringToStdString(_strDisplayName);
2025-06-23 18:01:09 +08:00
//是否索引
2025-06-23 10:41:33 +08:00
pDao->_isIndex = _wIsIndex;
2025-06-23 18:01:09 +08:00
//是否唯一
2025-06-23 10:41:33 +08:00
pDao->_isOnly = _wIsOnly;
2025-06-23 18:01:09 +08:00
//是否自增
2025-06-23 10:41:33 +08:00
pDao->_isAutoIncrement = _wIsAutoincrement;
2025-06-23 18:01:09 +08:00
//最大长度
2025-06-23 10:41:33 +08:00
pDao->_maxLength = _wMaxLength;
2025-06-23 18:01:09 +08:00
//最小长度
2025-06-23 10:41:33 +08:00
pDao->_minLength = _wMinLength;
2025-06-23 18:01:09 +08:00
//数值位数
2025-06-23 10:41:33 +08:00
pDao->_numLength = _wNumLength;
2025-06-23 18:01:09 +08:00
//数值精度
2025-06-23 10:41:33 +08:00
pDao->_numPresision = _wNumPresision;
2025-06-23 18:01:09 +08:00
//是否为查找序列
2025-06-23 10:41:33 +08:00
pDao->_isFindKey = _wIsFindKey;
2025-06-23 18:01:09 +08:00
//是否为主键
2025-06-23 10:41:33 +08:00
pDao->_isPk = _isPrimaryKey;
}
2025-06-23 18:01:09 +08:00
//名称标识是否合法 不合法返回true
2025-06-23 10:41:33 +08:00
bool DataAttribute::illegalName( QString& errMsg)
{
2025-06-23 18:01:09 +08:00
//CR开头ID结尾给出不合理提示
2025-06-23 10:41:33 +08:00
if (_name.left(2) =="CR" && _name.right(2) == "ID" && _name.size() > 4)
{
2025-06-23 18:01:09 +08:00
errMsg = "因(规范化后)名称与关系属性命名规则冲突,建议重新定义: " + _name;
2025-06-23 10:41:33 +08:00
return true;
}
return false;
}
void DataAttribute::getNewProperty(json& parameter, QVariantMap& valueMap)
{
auto data = parameter["data"];
2025-06-23 18:01:09 +08:00
//显示名称
2025-06-23 10:41:33 +08:00
valueMap.insert("displayName", CommonHelper::utf8ToQString(data["label"]));
2025-06-23 18:01:09 +08:00
//名称标识
2025-06-23 10:41:33 +08:00
if (!data["name"].is_null())
{
valueMap.insert("name", CommonHelper::utf8ToQString(data["name"]));
}
2025-06-23 18:01:09 +08:00
//描述
2025-06-23 10:41:33 +08:00
valueMap.insert("description", CommonHelper::utf8ToQString(data["description"]));
2025-06-23 18:01:09 +08:00
//默认值
2025-06-23 10:41:33 +08:00
valueMap.insert("defaultValue", CommonHelper::utf8ToQString(data["defaultValue"]));
2025-06-23 18:01:09 +08:00
//数据类型
2025-06-23 10:41:33 +08:00
if (!data["dataType"].is_null())
{
valueMap.insert("dataType", (int)data["dataType"]);
}
2025-06-23 18:01:09 +08:00
//是否索引
2025-06-23 10:41:33 +08:00
valueMap.insert("isIndex", (int)data["isIndex"]);
2025-06-23 18:01:09 +08:00
//是否唯一
2025-06-23 10:41:33 +08:00
valueMap.insert("isOnly", (int)data["isOnly"]);
2025-06-23 18:01:09 +08:00
//是否自增
2025-06-23 10:41:33 +08:00
if (!data["isAutoincrement"].is_null())
{
valueMap.insert("isAutoIncrement", (int)data["isAutoincrement"]);
}
2025-06-23 18:01:09 +08:00
//最大长度
2025-06-23 10:41:33 +08:00
valueMap.insert("maxLen", (int)data["maxLength"]);
2025-06-23 18:01:09 +08:00
//最小长度
2025-06-23 10:41:33 +08:00
valueMap.insert("minLen", (int)data["minLength"]);
2025-06-23 18:01:09 +08:00
//数值位数
2025-06-23 10:41:33 +08:00
valueMap.insert("numLen", (int)data["numLength"]);
2025-06-23 18:01:09 +08:00
//数值精度
2025-06-23 10:41:33 +08:00
valueMap.insert("numPresision", (int)data["numPresision"]);
2025-06-23 18:01:09 +08:00
//是否为查找序列
2025-06-23 10:41:33 +08:00
valueMap.insert("isFindKey", (int)data["isFindKey"]);
2025-06-23 18:01:09 +08:00
//是否主键
2025-06-23 10:41:33 +08:00
valueMap.insert("isPK", (int)data["isPk"]);
}
void DataAttribute::setNewData(json& parameter)
{
QVariantMap newValues;
getNewProperty(parameter, newValues);
setProperties(newValues);
}
void DataAttribute::setFileData(FileGenerate* generator, QStringList flag)
{
if (flag.size() == 2)
{
generator->AttTableData.append(new CCS_Report::CCSModelDataSet(flag[0], flag[1], _strDisplayName, _strInternalName, CommonHelper::convertAttributeTypeTpString(_wDataType)));
}
else if (flag.size() == 3)
{
generator->AttTableData111.append(new CCS_Report::CCSModelDataSet(flag[0], flag[1], flag[2], _strDisplayName, _strInternalName, CommonHelper::convertAttributeTypeTpString(_wDataType)));
}
}
2025-06-23 18:01:09 +08:00
//合法 true. 不合法 false
2025-06-23 10:41:33 +08:00
bool DataAttribute::checkNameSize(int min, int max, QString& errMsg)
{
if (_name.size() >= min && _name.size() <= max)
{
return true;
}
2025-06-23 18:01:09 +08:00
errMsg = "数据类名称标识长度不合法:" + _name;
2025-06-23 10:41:33 +08:00
return false;
}
2025-06-23 18:01:09 +08:00
//判断第index+1位 是不是字母是返回true, 否返回false
2025-06-23 10:41:33 +08:00
bool DataAttribute::checkLetter(QString& errmsg, int index)
{
if (_name.at(index).isLetter())
{
return true;
}
2025-06-23 18:01:09 +08:00
errmsg = "数据类名称标识第" + QString::number(index + 1) + "位需为字母:" +_name;
2025-06-23 10:41:33 +08:00
return false;
}
2025-06-23 18:01:09 +08:00
//判断其它合法性, 全部为合法字符返回true,
2025-06-23 10:41:33 +08:00
bool DataAttribute::checkNameillegal(QString& errMsg)
{
bool foundmatch = false;
try {
2025-06-23 18:01:09 +08:00
std::regex re(R"(^[\w\(\)\[\]\\]+$)");
2025-06-23 10:41:33 +08:00
foundmatch = std::regex_search(_name.toStdString(), re);
}
catch (std::regex_error& e) {
// Syntax error in the regular expression
LOG(ERROR) << "Regex error: " << e.what();
2025-06-23 10:41:33 +08:00
}
if (foundmatch)
2025-06-23 18:01:09 +08:00
{//合法
2025-06-23 10:41:33 +08:00
return true;
}
else
{
2025-06-23 18:01:09 +08:00
errMsg = "名称标识 " + _name + " 含无效字符";
2025-06-23 10:41:33 +08:00
return false;
}
}