背景
已知分类ID,获取分类属性、分类节点对应的实例、实例对应的分类属性值
TCSession session = (TCSession) AIFUtility.getCurrentApplication().getSession();
TCClassificationService tccs=session.getClassificationService();
G4MUserAppContext context = new G4MUserAppContext(new ClassificationService(), "ICM");
ICSApplicationObject icsObject = context.getICSApplicationObject();
1、获取分类属性
如下图,已知分类节点ID为ICM0103,需要获取该分类节点的类属性
/**
* 获取分类属性
* @param classId 分类节点ID
*/
public static List<ICSPropertyDescription> getICSProperties(String classId){
List<ICSPropertyDescription> icsPropertyDescriptions = new ArrayList<>();
try {
ICSHierarchyNodeDescriptor descriptor = tccs.describeNode(classId, 0);
if (descriptor.isClass()) {
icsObject.setView("Base", descriptor.getId());
ICSPropertyDescription[] propertyDescriptions = icsObject.getView().getPropertyDescriptions();
for (ICSPropertyDescription icsPropertyDescription : propertyDescriptions)
{
System.out.println(icsPropertyDescription.getName()+"---"+icsPropertyDescription.getId());
icsPropertyDescriptions.add(icsPropertyDescription);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return icsPropertyDescriptions;
}
2、获取分类节点对应的实例
如下图,已知分类节点ID为ICM0103,需要获取该分类节点对应的实例,图中只有2个
/**
* search Icos by classId
* @param classId
* @return
*/
public static TCComponent[] findICOsByClassId(String classId) {
ICSAdminClass adminClass = null;
try {
adminClass = tccs.newICSAdminClass();
adminClass.load(classId);
} catch (TCException e) {
e.printStackTrace();
return new TCComponent[0];
}
Vector<TCComponent> componentVector = new Vector<TCComponent>();
try {
ICSSearchResult[] searchResults = tccs.searchICOs(classId, null, 1);
for (ICSSearchResult result : searchResults) {
TCComponent component = session.stringToComponent(result.getWsoUid());
if (component != null) {
componentVector.add(component);
}
}
} catch (TCException e) {
e.printStackTrace();
}
return componentVector.toArray(new TCComponent[componentVector.size()]);
}
获取出来的是2个版本对象,后续取属性(除了分类属性)按正常方式取就行
3、通过获取出来的分类实例获取其分类属性的值
如下图,已经获取到该分类节点上的实例对象,现在需要获取对象上的分类属性(长度、类型)的值
类型是个KeyLov,要获取到显示值需要转换一下
/**
* 根据查出来的分类实例获取该实例的分类属性id和值
* @param rev
* @return 分类属性id和值
*/
public static Map<String, String> getIcoPropertyIdAndValue(TCComponentItemRevision rev){
Map<String, String> propertyMap = new HashMap<>();
try {
ICSApplicationObject appObject = tccs.newICSApplicationObject("ICM");
// ItemRevision分类
String item_id = rev.getProperty("item_id");
String item_rid = rev.getProperty("item_revision_id");
String uid = rev.getUid();
int ICOCount = appObject.searchById(item_id + "/" + item_rid, uid);
System.out.println("ICOCOUNT =" + ICOCount);
if (ICOCount > 0) {
appObject.read(1);
} else if (ICOCount <= 0) {
appObject.create(item_id + "/" + item_rid, uid);
}
String classId = appObject.getClassId();
System.out.println("classId:"+classId);
appObject.setView("Base", classId);
ICSPropertyDescription[] ppDesc = appObject.getView().getPropertyDescriptions();
// 分类属性是lov的,key为属性id,value为属性真实值和显示值的map
Map<String, Map<String, String>> lovPropertyMap = new HashMap<String, Map<String,String>>();
for (ICSPropertyDescription icsPropertyDescription : ppDesc) {
ICSFormat format = icsPropertyDescription.getFormat();
if (format.isList()) {
Map<String, String> realDisplayValueMap=
getICSPropertyRealDisplayValueMap(icsPropertyDescription);
lovPropertyMap.put(icsPropertyDescription.getId()+"", realDisplayValueMap);
}
}
ICSProperty[] properties = appObject.getProperties();
for (ICSProperty icsProperty : properties) {
String id = icsProperty.getId()+"";
String value = icsProperty.getValue();
if (lovPropertyMap.containsKey(id)) {
value = lovPropertyMap.get(id).get(icsProperty.getValue());
}
propertyMap.put(id, value);
}
} catch (Exception e) {
e.printStackTrace();
}
return propertyMap;
}
/**
* keyLov的分类属性的属性id和属性显示名称
* @param icsPropertyDescription
*/
public static Map<String, String> getICSPropertyRealDisplayValueMap(ICSPropertyDescription icsPropertyDescription)
{
Map<String, String> map = new HashMap<>();
ICSFormat icsFormat = icsPropertyDescription.getFormat();
if (icsFormat.isList())
{
ICSKeyLov icsKeyLov = icsPropertyDescription.getKeyLov();
String[] keys = icsKeyLov.getKeys();
String[] keyValues = icsKeyLov.getValues();
for (int i = 0; i < keys.length; i++)
{
map.put(keys[i], keyValues[i]);
}
}
return map;
}
获取结果:
长度对应的属性ID-----1
类型对应的属性ID-----手机