自定义信息内容和访问 > 自定义设备导入服务 > 导入服务的自定义示例
导入服务的自定义示例
以下各节提供了某些可覆盖服务的自定义示例:
导入
GetImportSupportedBaseTypes
GetImportSupportedBaseTypes 服务用于控制支持导入的属性基本类型。该自定义示例可排除某个属性基本类型导入。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportExportEquipmentUtils 事物以进行编辑。
2. “服务”下,找到 GetImportSupportedBaseTypes,然后单击 以改写该服务。
3. 在脚本编辑器中,查看支持的基本类型列表。
var result = ['Boolean', 'DateTime', 'Integer', 'Long', 'JSON', 'Number', 'String'];
4. 若要排除某种基本类型的导入,请删除或注释掉要从列表中排除的基本类型。例如,若要排除 JSON 基本类型,请按照以下方式更新服务:
var result = ['Boolean', 'DateTime', 'Integer', 'Long', 'Number', 'String'];
5. 单击“完成”保存对服务的更改。
6. 单击“保存”以保存事物。
在更改之后,导入电子表格中即使存在具有 JSON 基本类型的属性也不会导入。在上传和验证电子表格时,具有 JSON 基本类型的属性将被视作无效,并在导入过程中被跳过。
* 
若要查看无效导入数据的详细信息,请访问脚本日志:
1. ThingWorx Composer 中,单击左侧窗格中的“监控”
2. “日志”中,单击 ScriptLog
3. 选择 ScriptLog 表中的一行即可查看该条目的“日志消息”
ParseImportFile
以下示例对导入解析过程进行了自定义,以便在 ScriptLog 中显示带有“警告”等级的解析消息。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ParseExcelProcessor 事物。
2. “服务”下,找到 ParseImportFile,然后单击 以改写该服务。
3. 在脚本编辑器中,如下所示,将记录器等级更改为“警告”:
var result = (function () {
var constants = Things["PTC.SCA.SCO.Common.ImportExportEquipmentUtils"].GetImportExportConstants();
logger.warn("Parsing process started");
var user = Resources["CurrentSessionInfo"].GetCurrentUser();
var lastFileEntry = Things["PTC.SCA.SCO.Common.ImportProcessHistoryDataTable"].GetDataTableEntryByKey({ key: user });
// Invoke service which parses equipment data
var parsedInfoTable = Resources["PTC.Factory.CommonUtilities"].ParseImportFile({
fileName: lastFileEntry.FileName /* STRING */ ,
dataShape: constants.importExportDataShape /* DATASHAPENAME */
});
logger.warn("Parsing process completed");
return parsedInfoTable;
})();
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ValidateEquipment
以下示例对设备验证进行了自定义,使得即使导入电子表格中指定的项目不存在时也会创建设备。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateEquipment,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行并添加注释:
if (project.length > 0 && !validateProject(project)) {
logger.warn("Import Validation Process: [General Information Tab] [Name: " + name + "] Invalid reason: Project does not exist");
isInformationIncorrect = true;
}
这会导致代码不验证是否存在为设备指定的项目。
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ValidateEquipmentHierarchyTab
此自定义示例会导致 ScriptLogValidateEquipmentHierarchyTab 服务的开始记录为“追踪”条目。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateEquipmentHierarchyTab,然后单击 以改写该服务。
3. 在脚本编辑器中,在脚本末尾添加以下代码:
logger.trace("Validation complete for EquipmentHierarchyTab custom service");
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
6. 导航至“监控” > “ScriptLog”,并将日志级别设置更改为“追踪”。日志中现在包括了一个“追踪”条目,用于进入 ValidateEquipmentHierarchyTab 自定义服务。
ValidateImportFile
该自定义示例可使“验证结果”表的工作表 (选项卡) 名称显示为“层次结构”,而不是“设备结构”
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateImportFile,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行并添加注释:
var equipmentHierarchyToken = Resources["RuntimeLocalizationFunctions"].GetEffectiveTokenForLanguage({
language: currentUserLanguage,
token: constants.equipmentHierarchyToken
});
4. 在添加新注释后,立即编辑行中的等式,将值从 equipmentHierarchyToken 更改为 Hierarchy,如下所示:
hierarchyReport[workSheetColumn] = Hierarchy;
5. 单击“完成”保存对服务的更改。
6. 单击“保存”以保存事物。
ValidateLocallyBoundProperty
以下示例对本地绑定属性的验证进行了自定义,使得只有指定的 PTC.SCA.SCO.Demo.KepServer 事物才能用于本地绑定属性:
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateLocallyBoundProperty,然后单击 以改写该服务。
3. 在脚本编辑器中,搜索并查找以下行:
// Check if server thing or property for bounding exists
if (!boundThingExists || property.length === 0) {
validationResult = me.GenerateReportForEquipment({
operation: constants.invalid
});
if (!boundThingExists) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Thing does not exist");
}
if (property.length === 0) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Property not specified");
}
} else {
将这些行替换为以下代码:
// Check if server thing or property for bounding exists and if thing is same as required
if (!boundThingExists || thing !== "PTC.SCA.SCO.Demo.KepServer" || property.length === 0) {
validationResult = me.GenerateReportForEquipment({
operation: constants.invalid
});
if (!boundThingExists) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Thing does not exist");
}
if (thing !== "PTC.SCA.SCO.Demo.KepServer") {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Property can be locally bounded only to specified thing");
}
if (property.length === 0) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Property not specified");
}
}
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ValidatePropertiesTab
以下示例对导入设备时的导入电子表格“属性”标签的验证进行了自定义,从而在属性名称不是以 InternalPrefix 开头时,将其视作有效属性名称。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidatePropertiesTab,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行:
var isNameValid = isValidPropertyName(propertyName);
插入以下代码作为下一行:
isNameValid = !propertyName.startsWith("InternalPrefix");
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ValidateProperty
以下示例对验证进行了自定义,从而将任何在导入电子表格中已指定其“绑定”列值为“远程绑定”的属性视作无效,并且导入过程不会创建或更新该属性。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateProperty,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行并添加注释:
} else if (equalsIgnoreCase(binding, constants.remotelyBound)) {
validationResult = me.ValidateRemotelyBoundProperty({
parsedInfoTable: parsedInfoTable
});
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ValidateRemotelyBoundProperty
该示例对验证进行了自定义,以便在导入电子表格中现有远程绑定属性的“远程属性名称”值发生更改时,验证过程不会识别此更改,且在导入过程中不会更新此属性值。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateRemotelyBoundProperty,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行:
if (isRemotePropertyNameDifferent(remotePropertyName, remotePropertyBindingInfo)) {
updated = true;
} else if (isCacheIntervalDifferent(cacheInterval, thingName, name)) {
通过 else 语句为代码添加注释,如此处所示:
/* if (isRemotePropertyNameDifferent(remotePropertyName, remotePropertyBindingInfo)) {
updated = true;
} else */
if (isCacheIntervalDifferent(cacheInterval, thingName, name)) {
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ValidateGeneralInformationTab
以下示例对验证进行了自定义,从而将任何在电子表格中定义的其名称中未带必需 Equipment_ 前缀的设备视作无效,并且在导入过程中不会创建该设备。
若要对导入设备时的“常规信息”标签验证进行自定义:
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportValidator 事物。
2. “服务”下,找到 ValidateGeneralInformationTab,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下代码行:
// validate context and network
紧接在该行代码之前插入以下代码:
if (name.substring(0, 10) !== "Equipment_") {
reportInfoTable = markEquipment(reportInfoTable, reportDataShapeFields, constants.invalid);
logger.warn("Import Validation Process: [General Information Tab] [Row number: " + rowNum + "] Invalid reason: Name does not have required prefix");
continue;
}
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
导入
该自定义示例可阻止运行导入的进程。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 Import,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行并添加注释:
// Run post-import process
me.PostImport({
parsedInfoTable: parsedInfoTable
});
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ImportEquipmentHierarchy
此自定义示例会导致 ScriptLogImportEquipmentHierarchy 服务的开始记录为“追踪”条目。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 ImportEquipmentHierarchy,然后单击 以改写该服务。
3. 在脚本编辑器中,在脚本末尾添加以下代码:
logger.trace("Entering ImportEquipmentHierarchy custom service");
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
6. 导航至“监控” > “ScriptLog”,并将日志级别设置更改为“追踪”。日志中现在包括了一个“追踪”条目,用于进入 ImportEquipmentHierarchy 自定义服务。
ImportEquipmentInformation
该自定义示例会在导入电子表格中任何未指定其显示名称值的设备的默认显示名称前添加“E_”前缀。默认显示名称是 ThingWorx Composer 中的事物名称。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 ImportEquipmentInformation,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下代码:
if (thing != null) {
if (displayName.length > 0) {
thing.displayName = displayName;
}
在右括号后插入以下代码:
else {
thing.displayName = "E_" + name;
}
代码现在显示如下:
if (thing != null) {
if (displayName.length > 0) {
thing.displayName = displayName;
} else {
thing.displayName = "E_" + name;
}
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ImportGeneralInformation
该自定义示例会在 ScriptLog 中显示导入期间所处理的行数,并将显示的日志级别更改为“追踪”
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 ImportEquipmentInformation,然后单击 以改写该服务。
3. 在服务窗格中,在第 27 行末尾添加以下代码行以发送有关已处理行的日志信息:
logger.trace("Import Process: [General Information Tab] Already processed rows: " + (i + 1));
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
若要更改 ScriptLog 中显示的日志级别:
1. ScriptLog 中,单击“配置”
2. “配置日志”窗口中,从“日志级别”下拉列表中选择所需的级别。
3. 单击“应用”
ImportNoneBoundProperty
该自定义示例可使任何在导入电子表格中指定“绑定”值为“无”的属性在 ThingWorx Composer 中创建时将“已记录”值设置为 true (无论在导入电子表格中对该属性的“已记录”值如何指定)。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 ImportNoneBoundProperty,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行:
var logged = getBooleanValue(equipmentProperty[loggedHeader]);
编辑此行以显示如下:
var logged = true;
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ImportProperties
该自定义示例将阻止导入过程创建任何本地绑定属性,即使导入电子表格中指定了这些属性。这些属性在验证过程中也不会被报告为无效行。
若要自定义导入设备时的属性导入:
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 ImportProperties,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下行并添加注释:
} else if (equalsIgnoreCase(binding, constants.locallyBound)) {
me.ImportLocallyBoundProperty({
equipmentProperty: propertyRowInfoTable
});
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
ImportRemotelyBoundProperty
该自定义示例可使任何由导入过程创建且在导入电子表格中指定其“绑定”值为“远程绑定”的属性将该设备在 ThingWorx Composer 中的“属性和警报”页面上的“断开连接时”值设置为“将所有的更改合并为单个上次更改值”
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 ImportRemotelyBoundProperty,然后单击 以改写该服务。
3. 在脚本编辑器中,查找以下代码部分,并在各部分将值从 NONE 更改为 FOLD
if (params.whenDisconnected.length === 0) {
params.whenDisconnected = 'NONE';
}
if (whenDisconnected.length === 0 || whenDisconnected.length > 0 && !isWhenDisconnectedAllowed(whenDisconnected)) {
whenDisconnected = 'NONE';
}
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
PreImport
此自定义示例会导致 ScriptLogPreImport 服务的开始记录为“追踪”条目。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 PreImport,然后单击 以改写该服务。
3. 在脚本编辑器中,将以下代码添加到脚本末尾以启用 PreImport 自定义服务:
logger.trace("Entering PreImport custom service");
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
6. 导航至“监控” > “ScriptLog”,并将日志级别设置更改为“追踪”。日志中现在包括了一个“追踪”条目,用于进入 PreImport 自定义服务。
PostImport
此自定义示例会导致 ScriptLogPostImport 服务的开始记录为“追踪”条目。
1. ThingWorx Composer 中,打开 PTC.SCA.SCO.Common.ImportProcessor 事物。
2. “服务”下,找到 PostImport,然后单击 以改写该服务。
3. 在脚本编辑器中,将以下代码添加到脚本末尾以启用 PostImport 自定义服务:
logger.trace("Entering PostImport custom service");
4. 单击“完成”保存对服务的更改。
5. 单击“保存”以保存事物。
6. 导航至“监控” > “ScriptLog”,并将日志级别设置更改为“追踪”。日志中现在包括了一个“追踪”条目,用于进入 PostImport 自定义服务。