XNSim/XNSimHtml/utils/configuration-utils.js

938 lines
24 KiB
JavaScript

const { getDBConnection } = require('./file-utils');
const { deleteDataInterfaceTable, createDataInterfaceTable, copyDataInterfaceTable } = require('./data-interface-utils');
// 获取所有构型
function getConfigurations(planeName) {
try {
const db = getDBConnection(true);
let query = `
SELECT * FROM Configuration
`;
const params = [];
if (planeName) {
query += ` WHERE PlaneName = ?`;
params.push(planeName);
}
query += ` ORDER BY ConfID ASC`;
const configs = db.prepare(query).all(...params);
return configs;
} catch (error) {
console.error('获取构型列表失败:', error);
throw error;
}
}
// 根据ID获取构型
function getConfigurationById(confId) {
try {
const db = getDBConnection(true);
const config = db.prepare(`
SELECT * FROM Configuration
WHERE ConfID = ?
`).get(confId);
return config;
} catch (error) {
console.error(`获取构型ID ${confId} 失败:`, error);
throw error;
}
}
/**
* 复制模型组及其下的模型
* @param {number} sourceConfId - 源构型ID
* @param {number} targetConfId - 目标构型ID
*/
function copyModelGroupsAndModels(sourceConfId, targetConfId) {
try {
const db = getDBConnection();
// 1. 获取源构型的所有模型组
const sourceGroups = db.prepare(`
SELECT * FROM LoadModelGroups
WHERE ConfID = ?
`).all(sourceConfId);
// 2. 复制每个模型组及其下的模型
for (const group of sourceGroups) {
// 2.1 插入新的模型组
db.prepare(`
INSERT INTO LoadModelGroups (
ConfID, GroupName, Freq, Priority, CPUAff
) VALUES (?, ?, ?, ?, ?)
`).run(
targetConfId,
group.GroupName,
group.Freq,
group.Priority,
group.CPUAff
);
// 2.2 获取新插入的模型组ID
const newGroupId = db.prepare('SELECT GroupID FROM LoadModelGroups WHERE rowid = last_insert_rowid()').get().GroupID;
// 2.3 获取并复制该组下的所有模型
const sourceModels = db.prepare(`
SELECT * FROM LoadModels
WHERE GroupID = ?
`).all(group.GroupID);
// 2.4 插入新的模型
for (const model of sourceModels) {
db.prepare(`
INSERT INTO LoadModels (
GroupID, ClassName, ModelVersion, ModelName
) VALUES (?, ?, ?, ?)
`).run(
newGroupId,
model.ClassName,
model.ModelVersion,
model.ModelName
);
}
}
} catch (error) {
console.error('复制模型组和模型失败:', error);
throw error;
}
}
/**
* 复制服务
* @param {number} sourceConfId - 源构型ID
* @param {number} targetConfId - 目标构型ID
*/
function copyServices(sourceConfId, targetConfId) {
try {
const db = getDBConnection();
// 1. 获取源构型的所有服务
const sourceServices = db.prepare(`
SELECT * FROM LoadServices
WHERE ConfID = ?
`).all(sourceConfId);
// 2. 复制每个服务
for (const service of sourceServices) {
db.prepare(`
INSERT INTO LoadServices (
ConfID, ClassName, ServiceVersion, ServiceName
) VALUES (?, ?, ?, ?)
`).run(
targetConfId,
service.ClassName,
service.ServiceVersion,
service.ServiceName
);
}
} catch (error) {
console.error('复制服务失败:', error);
throw error;
}
}
// 创建新构型
function createConfiguration(configData) {
try {
// 验证必填字段
const requiredFields = ['ConfName', 'WorkPath', 'DomainID'];
for (const field of requiredFields) {
if (!configData[field]) {
throw new Error(`${field} 是必填字段`);
}
}
const db = getDBConnection();
const result = db.prepare(`
INSERT INTO Configuration (
PlaneName, ConfName, OSName, OSVersion, RTXVersion,
CPUAffinity, WorkPath, ModelsPath, ServicesPath,
DomainID, ConsoleDebug, ConsoleInfo, ConsoleWarning,
ConsoleError, LogDebug, LogInfo, LogWarning, LogError
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`).run(
configData.PlaneName || 'C909',
configData.ConfName,
configData.OSName || 'Debian 11',
configData.OSVersion || '5.10.0-32-rt-amd64',
configData.RTXVersion || 'preempt-rt',
configData.CPUAffinity || '0,1',
configData.WorkPath,
configData.ModelsPath || 'Models/',
configData.ServicesPath || 'Services/',
configData.DomainID,
configData.ConsoleDebug !== undefined ? configData.ConsoleDebug : 1,
configData.ConsoleInfo !== undefined ? configData.ConsoleInfo : 1,
configData.ConsoleWarning !== undefined ? configData.ConsoleWarning : 1,
configData.ConsoleError !== undefined ? configData.ConsoleError : 1,
configData.LogDebug !== undefined ? configData.LogDebug : 0,
configData.LogInfo !== undefined ? configData.LogInfo : 1,
configData.LogWarning !== undefined ? configData.LogWarning : 1,
configData.LogError !== undefined ? configData.LogError : 1
);
const newConfId = result.lastInsertRowid;
// 处理数据接口表和复制相关数据
if (configData.sourceConfId) {
// 如果有源构型,复制接口表
copyDataInterfaceTable(configData.sourceConfId, newConfId);
// 复制模型组和模型
copyModelGroupsAndModels(configData.sourceConfId, newConfId);
// 复制服务
copyServices(configData.sourceConfId, newConfId);
} else {
// 如果没有源构型,创建新的接口表
createDataInterfaceTable(newConfId);
}
return {
success: true,
confId: newConfId,
message: '构型创建成功'
};
} catch (error) {
console.error('创建构型失败:', error);
throw error;
}
}
// 更新构型
function updateConfiguration(configData) {
try {
// 验证必填字段
if (!configData.ConfID) {
throw new Error('ConfID 是必填字段');
}
const db = getDBConnection();
// 检查构型是否存在
const existingConfig = db.prepare(`
SELECT COUNT(*) as count FROM Configuration
WHERE ConfID = ?
`).get(configData.ConfID);
if (existingConfig.count === 0) {
throw new Error('要更新的构型不存在');
}
const result = db.prepare(`
UPDATE Configuration
SET PlaneName = ?,
ConfName = ?,
OSName = ?,
OSVersion = ?,
RTXVersion = ?,
CPUAffinity = ?,
WorkPath = ?,
ModelsPath = ?,
ServicesPath = ?,
DomainID = ?,
ConsoleDebug = ?,
ConsoleInfo = ?,
ConsoleWarning = ?,
ConsoleError = ?,
LogDebug = ?,
LogInfo = ?,
LogWarning = ?,
LogError = ?
WHERE ConfID = ?
`).run(
configData.PlaneName || 'C909',
configData.ConfName,
configData.OSName || 'Debian 11',
configData.OSVersion || '5.10.0-32-rt-amd64',
configData.RTXVersion || 'preempt-rt',
configData.CPUAffinity || '0,1',
configData.WorkPath,
configData.ModelsPath || 'Models/',
configData.ServicesPath || 'Services/',
configData.DomainID,
configData.ConsoleDebug !== undefined ? configData.ConsoleDebug : 1,
configData.ConsoleInfo !== undefined ? configData.ConsoleInfo : 1,
configData.ConsoleWarning !== undefined ? configData.ConsoleWarning : 1,
configData.ConsoleError !== undefined ? configData.ConsoleError : 1,
configData.LogDebug !== undefined ? configData.LogDebug : 0,
configData.LogInfo !== undefined ? configData.LogInfo : 1,
configData.LogWarning !== undefined ? configData.LogWarning : 1,
configData.LogError !== undefined ? configData.LogError : 1,
configData.ConfID
);
return {
success: true,
changes: result.changes,
message: '构型更新成功'
};
} catch (error) {
console.error('更新构型失败:', error);
throw error;
}
}
// 删除构型
function deleteConfiguration(confId) {
try {
const db = getDBConnection();
// 1. 删除构型下的所有服务
deleteLoadServicesByConf(confId);
// 2. 删除构型下的所有模型组(这会级联删除组下的所有模型)
deleteLoadModelGroupByConf(confId);
// 3. 删除构型对应的数据接口表
deleteDataInterfaceTable(confId);
// 4. 最后删除构型本身
const result = db.prepare('DELETE FROM Configuration WHERE ConfID = ?').run(confId);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '构型删除成功' : '构型不存在或已被删除'
};
} catch (error) {
console.error('删除构型失败:', error);
throw error;
}
}
/**
* 获取所有模型组
* @param {number} confId - 构型ID
* @returns {Array} 模型组列表
*/
function getLoadModelGroups(confId) {
try {
if (!confId) {
throw new Error('confId 是必填参数');
}
const db = getDBConnection(true);
const query = `
SELECT * FROM LoadModelGroups
WHERE ConfID = ?
ORDER BY GroupID ASC
`;
const groups = db.prepare(query).all(confId);
return groups;
} catch (error) {
console.error('获取模型组列表失败:', error);
throw error;
}
}
/**
* 根据ID获取模型组
* @param {number} groupId - 模型组ID
* @returns {Object} 模型组信息
*/
function getLoadModelGroupById(groupId) {
try {
const db = getDBConnection(true);
const group = db.prepare(`
SELECT * FROM LoadModelGroups
WHERE GroupID = ?
`).get(groupId);
return group;
} catch (error) {
console.error(`获取模型组ID ${groupId} 失败:`, error);
throw error;
}
}
/**
* 创建新模型组
* @param {Object} groupData - 模型组数据
* @returns {Object} 创建结果
*/
function createLoadModelGroup(groupData) {
try {
// 验证必填字段
const requiredFields = ['ConfID', 'GroupName', 'Freq', 'Priority', 'CPUAff'];
for (const field of requiredFields) {
if (!groupData[field]) {
throw new Error(`${field} 是必填字段`);
}
}
const db = getDBConnection();
const result = db.prepare(`
INSERT INTO LoadModelGroups (
ConfID, GroupName, Freq, Priority, CPUAff
) VALUES (?, ?, ?, ?, ?)
`).run(
groupData.ConfID,
groupData.GroupName,
groupData.Freq,
groupData.Priority,
groupData.CPUAff
);
return {
success: true,
groupId: result.lastInsertRowid,
message: '模型组创建成功'
};
} catch (error) {
console.error('创建模型组失败:', error);
throw error;
}
}
/**
* 更新模型组
* @param {Object} groupData - 模型组数据
* @returns {Object} 更新结果
*/
function updateLoadModelGroup(groupData) {
try {
// 验证必填字段
if (!groupData.GroupID) {
throw new Error('GroupID 是必填字段');
}
const db = getDBConnection();
// 检查模型组是否存在
const existingGroup = db.prepare(`
SELECT COUNT(*) as count FROM LoadModelGroups
WHERE GroupID = ?
`).get(groupData.GroupID);
if (existingGroup.count === 0) {
throw new Error('要更新的模型组不存在');
}
const result = db.prepare(`
UPDATE LoadModelGroups
SET ConfID = ?,
GroupName = ?,
Freq = ?,
Priority = ?,
CPUAff = ?
WHERE GroupID = ?
`).run(
groupData.ConfID,
groupData.GroupName,
groupData.Freq,
groupData.Priority,
groupData.CPUAff,
groupData.GroupID
);
return {
success: true,
changes: result.changes,
message: '模型组更新成功'
};
} catch (error) {
console.error('更新模型组失败:', error);
throw error;
}
}
/**
* 删除模型组
* @param {number} groupId - 模型组ID
* @returns {Object} 删除结果
*/
function deleteLoadModelGroup(groupId) {
try {
const db = getDBConnection();
// 1. 先删除组下的所有模型
deleteLoadModelsByGroup(groupId);
// 2. 再删除模型组本身
const result = db.prepare('DELETE FROM LoadModelGroups WHERE GroupID = ?').run(groupId);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '模型组删除成功' : '模型组不存在或已被删除'
};
} catch (error) {
console.error('删除模型组失败:', error);
throw error;
}
}
/**
* 获取所有模型
* @param {number} groupId - 模型组ID
* @returns {Array} 模型列表
*/
function getLoadModels(groupId) {
try {
if (!groupId) {
throw new Error('groupId 是必填参数');
}
const db = getDBConnection(true);
const query = `
SELECT * FROM LoadModels
WHERE GroupID = ?
ORDER BY ClassName ASC
`;
const models = db.prepare(query).all(groupId);
return models;
} catch (error) {
console.error('获取模型列表失败:', error);
throw error;
}
}
/**
* 根据组ID和类名获取模型
* @param {number} groupId - 模型组ID
* @param {string} className - 类名
* @returns {Object} 模型信息
*/
function getLoadModelById(groupId, className) {
try {
const db = getDBConnection(true);
const model = db.prepare(`
SELECT * FROM LoadModels
WHERE GroupID = ? AND ClassName = ?
`).get(groupId, className);
return model;
} catch (error) {
console.error(`获取模型失败 (GroupID: ${groupId}, ClassName: ${className}):`, error);
throw error;
}
}
/**
* 创建新模型
* @param {Object} modelData - 模型数据
* @returns {Object} 创建结果
*/
function createLoadModel(modelData) {
try {
// 验证必填字段
const requiredFields = ['GroupID', 'ClassName', 'ModelVersion'];
for (const field of requiredFields) {
if (!modelData[field]) {
throw new Error(`${field} 是必填字段`);
}
}
const db = getDBConnection();
// 检查是否已存在相同的记录
const existingModel = db.prepare(`
SELECT COUNT(*) as count FROM LoadModels
WHERE GroupID = ? AND ClassName = ?
`).get(modelData.GroupID, modelData.ClassName);
if (existingModel.count > 0) {
throw new Error('该组中已存在相同类名的模型');
}
const result = db.prepare(`
INSERT INTO LoadModels (
GroupID, ClassName, ModelVersion, ModelName
) VALUES (?, ?, ?, ?)
`).run(
modelData.GroupID,
modelData.ClassName,
modelData.ModelVersion,
modelData.ModelName || null
);
return {
success: true,
message: '模型创建成功'
};
} catch (error) {
console.error('创建模型失败:', error);
throw error;
}
}
/**
* 更新模型
* @param {Object} modelData - 模型数据
* @returns {Object} 更新结果
*/
function updateLoadModel(modelData) {
try {
// 验证必填字段
const requiredFields = ['GroupID', 'ClassName', 'ModelVersion'];
for (const field of requiredFields) {
if (!modelData[field]) {
throw new Error(`${field} 是必填字段`);
}
}
const db = getDBConnection();
// 检查模型是否存在
const existingModel = db.prepare(`
SELECT COUNT(*) as count FROM LoadModels
WHERE GroupID = ? AND ClassName = ?
`).get(modelData.GroupID, modelData.ClassName);
if (existingModel.count === 0) {
throw new Error('要更新的模型不存在');
}
const result = db.prepare(`
UPDATE LoadModels
SET ModelVersion = ?,
ModelName = ?
WHERE GroupID = ? AND ClassName = ?
`).run(
modelData.ModelVersion,
modelData.ModelName || null,
modelData.GroupID,
modelData.ClassName
);
return {
success: true,
changes: result.changes,
message: '模型更新成功'
};
} catch (error) {
console.error('更新模型失败:', error);
throw error;
}
}
/**
* 删除模型
* @param {number} groupId - 模型组ID
* @param {string} className - 类名
* @returns {Object} 删除结果
*/
function deleteLoadModel(groupId, className) {
try {
const db = getDBConnection();
const result = db.prepare(`
DELETE FROM LoadModels
WHERE GroupID = ? AND ClassName = ?
`).run(groupId, className);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '模型删除成功' : '模型不存在或已被删除'
};
} catch (error) {
console.error('删除模型失败:', error);
throw error;
}
}
/**
* 删除组下的所有模型
* @param {number} groupId - 模型组ID
* @returns {Object} 删除结果
*/
function deleteLoadModelsByGroup(groupId) {
try {
const db = getDBConnection();
const result = db.prepare(`
DELETE FROM LoadModels
WHERE GroupID = ?
`).run(groupId);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '组内所有模型删除成功' : '组内没有模型或已被删除'
};
} catch (error) {
console.error('删除组内模型失败:', error);
throw error;
}
}
/**
* 获取所有服务
* @param {number} confId - 构型ID
* @returns {Array} 服务列表
*/
function getLoadServices(confId) {
try {
if (!confId) {
throw new Error('confId 是必填参数');
}
const db = getDBConnection(true);
const query = `
SELECT * FROM LoadServices
WHERE ConfID = ?
ORDER BY ClassName ASC
`;
const services = db.prepare(query).all(confId);
return services;
} catch (error) {
console.error('获取服务列表失败:', error);
throw error;
}
}
/**
* 根据构型ID和类名获取服务
* @param {number} confId - 构型ID
* @param {string} className - 类名
* @returns {Object} 服务信息
*/
function getLoadServiceById(confId, className) {
try {
const db = getDBConnection(true);
const service = db.prepare(`
SELECT * FROM LoadServices
WHERE ConfID = ? AND ClassName = ?
`).get(confId, className);
return service;
} catch (error) {
console.error(`获取服务失败 (ConfID: ${confId}, ClassName: ${className}):`, error);
throw error;
}
}
/**
* 创建新服务
* @param {Object} serviceData - 服务数据
* @returns {Object} 创建结果
*/
function createLoadService(serviceData) {
try {
// 验证必填字段
const requiredFields = ['ConfID', 'ClassName', 'ServiceVersion'];
for (const field of requiredFields) {
if (!serviceData[field]) {
throw new Error(`${field} 是必填字段`);
}
}
const db = getDBConnection();
// 检查是否已存在相同的记录
const existingService = db.prepare(`
SELECT COUNT(*) as count FROM LoadServices
WHERE ConfID = ? AND ClassName = ?
`).get(serviceData.ConfID, serviceData.ClassName);
if (existingService.count > 0) {
throw new Error('该构型中已存在相同类名的服务');
}
const result = db.prepare(`
INSERT INTO LoadServices (
ConfID, ClassName, ServiceVersion, ServiceName
) VALUES (?, ?, ?, ?)
`).run(
serviceData.ConfID,
serviceData.ClassName,
serviceData.ServiceVersion,
serviceData.ServiceName || null
);
return {
success: true,
message: '服务创建成功'
};
} catch (error) {
console.error('创建服务失败:', error);
throw error;
}
}
/**
* 更新服务
* @param {Object} serviceData - 服务数据
* @returns {Object} 更新结果
*/
function updateLoadService(serviceData) {
try {
// 验证必填字段
const requiredFields = ['ConfID', 'ClassName', 'ServiceVersion'];
for (const field of requiredFields) {
if (!serviceData[field]) {
throw new Error(`${field} 是必填字段`);
}
}
const db = getDBConnection();
// 检查服务是否存在
const existingService = db.prepare(`
SELECT COUNT(*) as count FROM LoadServices
WHERE ConfID = ? AND ClassName = ?
`).get(serviceData.ConfID, serviceData.ClassName);
if (existingService.count === 0) {
throw new Error('要更新的服务不存在');
}
const result = db.prepare(`
UPDATE LoadServices
SET ServiceVersion = ?,
ServiceName = ?
WHERE ConfID = ? AND ClassName = ?
`).run(
serviceData.ServiceVersion,
serviceData.ServiceName || null,
serviceData.ConfID,
serviceData.ClassName
);
return {
success: true,
changes: result.changes,
message: '服务更新成功'
};
} catch (error) {
console.error('更新服务失败:', error);
throw error;
}
}
/**
* 删除服务
* @param {number} confId - 构型ID
* @param {string} className - 类名
* @returns {Object} 删除结果
*/
function deleteLoadService(confId, className) {
try {
const db = getDBConnection();
const result = db.prepare(`
DELETE FROM LoadServices
WHERE ConfID = ? AND ClassName = ?
`).run(confId, className);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '服务删除成功' : '服务不存在或已被删除'
};
} catch (error) {
console.error('删除服务失败:', error);
throw error;
}
}
/**
* 删除构型下的所有服务
* @param {number} confId - 构型ID
* @returns {Object} 删除结果
*/
function deleteLoadServicesByConf(confId) {
try {
const db = getDBConnection();
const result = db.prepare(`
DELETE FROM LoadServices
WHERE ConfID = ?
`).run(confId);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '构型下所有服务删除成功' : '构型下没有服务或已被删除'
};
} catch (error) {
console.error('删除构型下服务失败:', error);
throw error;
}
}
/**
* 删除构型下的所有模型组
* @param {number} confId - 构型ID
* @returns {Object} 删除结果
*/
function deleteLoadModelGroupByConf(confId) {
try {
const db = getDBConnection();
// 1. 获取该构型下的所有模型组ID
const groups = db.prepare(`
SELECT GroupID FROM LoadModelGroups
WHERE ConfID = ?
`).all(confId);
// 2. 删除每个模型组下的所有模型
for (const group of groups) {
db.prepare(`
DELETE FROM LoadModels
WHERE GroupID = ?
`).run(group.GroupID);
}
// 3. 删除所有模型组
const result = db.prepare(`
DELETE FROM LoadModelGroups
WHERE ConfID = ?
`).run(confId);
return {
success: true,
changes: result.changes,
message: result.changes > 0 ? '构型下所有模型组删除成功' : '构型下没有模型组或已被删除'
};
} catch (error) {
console.error('删除构型下模型组失败:', error);
throw error;
}
}
module.exports = {
getConfigurations,
getConfigurationById,
createConfiguration,
updateConfiguration,
deleteConfiguration,
getLoadModelGroups,
getLoadModelGroupById,
createLoadModelGroup,
updateLoadModelGroup,
deleteLoadModelGroup,
deleteLoadModelGroupByConf,
getLoadModels,
getLoadModelById,
createLoadModel,
updateLoadModel,
deleteLoadModel,
deleteLoadModelsByGroup,
getLoadServices,
getLoadServiceById,
createLoadService,
updateLoadService,
deleteLoadService,
deleteLoadServicesByConf
};