搜索并添加 零件与零件族关系的创建过程
背景:公司实施了零件族管理模块(PFM),从零件相关项界面点击“搜索并添加”进入搜索界面,选“叶节点族”进行搜索后将所有叶节点族搜索出来提供用户选择一个与当前零件建立关系。
要求:建立零件分类与零件族的配置关系,在用户搜索“叶节点族”进行与零件创建关系的时候,仅仅选出由配置关系定义了的零件族。
实现:
CS端用户输入零件的obid,返回配置相关的零件族对象集合,CS的开发注意要在QueryDb之后对FamilySet中的每个对象调用InflateAllDynamicAttrs方法,确保其显示的正确性:
Java API
MTIObjectVector k2cGetCfgPrtFams(TaskContext taskC, String className, String prtobid);
定义Java Processor类PartFamiliesProcessor,用于调用CS端API:
mtidata = K2C. k2cGetCfgPrtFams (getTaskContext(), "Assembly", partObid);
int count = mtidata == null ? 0 : mtidata.size();
Vector list = new Vector(count);
for(int i = 0; i < count; i++)
{
list.add(new com.sdrc._metaphase.enterprise.es_evista.omf.find.Found(mtidata.elementAt(i)));
}
return list;
int count = mtidata == null ? 0 : mtidata.size();
Vector list = new Vector(count);
for(int i = 0; i < count; i++)
{
list.add(new com.sdrc._metaphase.enterprise.es_evista.omf.find.Found(mtidata.elementAt(i)));
}
return list;
定义Java ActionComponent类RedirectRelLeafFamHandler,用于在用户点击搜索的时候判断是重定向到客户化功能点还是系统默认:
String bgClassName = (String)arguments.getString("inBgClassName");
String schClassName = (String)arguments.getString("inSchClassName");
OptionSet options = action_context.getOptionSet();
if ( bgClassName != null && bgClassName.equals("Assembly") && schClassName.equals("LeafFam") )
{
return options.getOption("success"); // 重定向到客户化功能
}
else
{
return options.getOption("failure"); // 使用系统默认
}
String schClassName = (String)arguments.getString("inSchClassName");
OptionSet options = action_context.getOptionSet();
if ( bgClassName != null && bgClassName.equals("Assembly") && schClassName.equals("LeafFam") )
{
return options.getOption("success"); // 重定向到客户化功能
}
else
{
return options.getOption("failure"); // 使用系统默认
}
修改用户点击“搜索”按钮的默认action,原来为(eds_search_link_submit_advanced_class)
<edit parent="/PageInfo/PageElements/SearchNestedSearchNext">
<change>
<map>
<entry key="action" value="javascript:formsubmit_advanced('bbk_search_link_submit_advanced_class');" />
</map>
</change>
</edit>
<change>
<map>
<entry key="action" value="javascript:formsubmit_advanced('bbk_search_link_submit_advanced_class');" />
</map>
</change>
</edit>
在application-map.xml中添加以下代码:
<!-- *************************************************************** -->
<!-- 从零件 创建与零件族关系的时候,通过数据集配置查询零件族 -->
<!-- *************************************************************** -->
<link id="bbk_search_link_submit_advanced_class"
response-chain="bbk_search_resp_chain_submit_advanced_class"/>
<response-chain id="bbk_search_resp_chain_submit_advanced_class">
<chain-options>
<option id="success" advance="true"/>
<option id="failure" page="failurepage"/>
</chain-options>
<action-component id="store_search_class_in_context"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.extractor.CloneVariable">
<component-input id="inAttribute" source="search_class" />
<component-output id="outAttribute" destination="eds_search_class_name" />
</action-component>
<!-- 判断当前是否为 零件搜索添加零件族,如果是则需要重定向到客户化功能点 -->
<action-component id="detect_background_class_is_assembly"
handler="com.bbk.RedirectRelLeafFamHandler">
<component-input id="inBgClassName" source="eds_search_background_class_name" />
<component-input id="inSchClassName" source="eds_search_class_name" />
<option id="success" advance="true"/>
<option id="failure" response-chain="eds_search_resp_chain_submit_advanced_class"/>
</action-component>
<final-option response-chain="bbk_get_config_families_from_assembly" />
</response-chain>
<!-- 该 response-chain 从系统 eds_search_resp_chain_do_search 上作了一定的修改 -->
<response-chain id="bbk_get_config_families_from_assembly">
<chain-options>
<option id="success" advance="true"/>
<option id="failure" page="failurepage"/>
</chain-options>
<!-- 调用CS,获取与物料相关的零件族对象 -->
<action-component id="get_families" handler="com.bbk.GetPartFamiliesAction">
<component-input id="inBgClassName" source="eds_search_background_class_name" />
<component-input id="inSchClassName" source="eds_search_class_name" />
<component-input id="inBgItemHandle" source="eds_global_background_item_handle" />
<component-output id="outSearchResults" destination="eds_search_results" />
<component-output id="outFoundItemsCount" destination="eds_search_found_items_count" />
<option id="noResultsFound" action-component="eds_search_prepare_display_no_results"/>
</action-component>
<!-- Use this hook to filter the search results. -->
<hook id="eds_search_hook_filter_search_results" />
<call-action-chain id="prepare_collection_for_display"
action-chain="eds_mwau_act_chain_prepare_collection_for_display">
<chain-input id="inModelEntityCollection" source="eds_search_results" />
<chain-output id="outModelEntityContainerBean" destination ="sdrcResultsDataBean" />
</call-action-chain>
<call-action-chain id="prepare_page_criteria"
action-chain="eds_mwau_act_chain_clone_variable">
<chain-input id="inVariable" source="eds_search_class_name" />
<chain-output id="outVariable" destination="eds_global_criteria_model_class_name" />
</call-action-chain>
<action-component id="prepare_display_results"
handler="com.edsplm.tc.ent._wcc.search.DisplaySearchResults">
<component-input id="inFoundItemsCount" source="eds_search_found_items_count" />
<component-input id="inMaxItemsToRetrieve" source="MaxItemsToRetrieve" />
<component-output id="outGuidanceMessage" destination="sdrcSearchResultsGuidance" />
</action-component>
<action-component id="set_source_data_list"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.appflow.ConfigParamToAttrConverter">
<config-param name="inParam" value="SearchResults" />
<component-output id="outAttribute" destination="eds_global_criteria_source_data_list" />
</action-component>
<action-component id="set_source_link"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.appflow.ConfigParamToAttrConverter">
<config-param name="inParam" value="eds_search_link_do_search_again" />
<component-output id="outAttribute" destination="eds_global_source_link" />
</action-component>
<!-- restore the background icon -->
<call-action-chain id="restore_background_class_name"
action-chain="eds_mwau_act_chain_clone_variable">
<chain-input id="inVariable" source="eds_search_background_class_name" />
<chain-output id="outVariable" destination="sdrcClassName" />
</call-action-chain>
<!-- copy back the activetab to the original value -->
<call-action-chain id="active_tab_param_clone_action"
action-chain="eds_mwau_act_chain_clone_variable">
<chain-input id="inVariable" source="eds_search_global_active_tab" />
<chain-output id="outVariable" destination="eds_global_active_tab" />
</call-action-chain>
<!-- Use this hook to do set the environment before displaying the
results page. -->
<hook id="eds_search_hook_prepare_search_results_page" />
<final-option>
<action-component id="route_based_on_class_name"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.appflow.ClassHierarchyOptionSelector">
<component-input id="inClassName" source="eds_search_class_name" />
<option id="PdmItem" page="search_resultpage"/>
</action-component>
</final-option>
</response-chain>
<!-- *************************************************************** -->
<!-- End of 零件 零件族关系 客制化 -->
<!-- *************************************************************** -->
<!-- 从零件 创建与零件族关系的时候,通过数据集配置查询零件族 -->
<!-- *************************************************************** -->
<link id="bbk_search_link_submit_advanced_class"
response-chain="bbk_search_resp_chain_submit_advanced_class"/>
<response-chain id="bbk_search_resp_chain_submit_advanced_class">
<chain-options>
<option id="success" advance="true"/>
<option id="failure" page="failurepage"/>
</chain-options>
<action-component id="store_search_class_in_context"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.extractor.CloneVariable">
<component-input id="inAttribute" source="search_class" />
<component-output id="outAttribute" destination="eds_search_class_name" />
</action-component>
<!-- 判断当前是否为 零件搜索添加零件族,如果是则需要重定向到客户化功能点 -->
<action-component id="detect_background_class_is_assembly"
handler="com.bbk.RedirectRelLeafFamHandler">
<component-input id="inBgClassName" source="eds_search_background_class_name" />
<component-input id="inSchClassName" source="eds_search_class_name" />
<option id="success" advance="true"/>
<option id="failure" response-chain="eds_search_resp_chain_submit_advanced_class"/>
</action-component>
<final-option response-chain="bbk_get_config_families_from_assembly" />
</response-chain>
<!-- 该 response-chain 从系统 eds_search_resp_chain_do_search 上作了一定的修改 -->
<response-chain id="bbk_get_config_families_from_assembly">
<chain-options>
<option id="success" advance="true"/>
<option id="failure" page="failurepage"/>
</chain-options>
<!-- 调用CS,获取与物料相关的零件族对象 -->
<action-component id="get_families" handler="com.bbk.GetPartFamiliesAction">
<component-input id="inBgClassName" source="eds_search_background_class_name" />
<component-input id="inSchClassName" source="eds_search_class_name" />
<component-input id="inBgItemHandle" source="eds_global_background_item_handle" />
<component-output id="outSearchResults" destination="eds_search_results" />
<component-output id="outFoundItemsCount" destination="eds_search_found_items_count" />
<option id="noResultsFound" action-component="eds_search_prepare_display_no_results"/>
</action-component>
<!-- Use this hook to filter the search results. -->
<hook id="eds_search_hook_filter_search_results" />
<call-action-chain id="prepare_collection_for_display"
action-chain="eds_mwau_act_chain_prepare_collection_for_display">
<chain-input id="inModelEntityCollection" source="eds_search_results" />
<chain-output id="outModelEntityContainerBean" destination ="sdrcResultsDataBean" />
</call-action-chain>
<call-action-chain id="prepare_page_criteria"
action-chain="eds_mwau_act_chain_clone_variable">
<chain-input id="inVariable" source="eds_search_class_name" />
<chain-output id="outVariable" destination="eds_global_criteria_model_class_name" />
</call-action-chain>
<action-component id="prepare_display_results"
handler="com.edsplm.tc.ent._wcc.search.DisplaySearchResults">
<component-input id="inFoundItemsCount" source="eds_search_found_items_count" />
<component-input id="inMaxItemsToRetrieve" source="MaxItemsToRetrieve" />
<component-output id="outGuidanceMessage" destination="sdrcSearchResultsGuidance" />
</action-component>
<action-component id="set_source_data_list"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.appflow.ConfigParamToAttrConverter">
<config-param name="inParam" value="SearchResults" />
<component-output id="outAttribute" destination="eds_global_criteria_source_data_list" />
</action-component>
<action-component id="set_source_link"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.appflow.ConfigParamToAttrConverter">
<config-param name="inParam" value="eds_search_link_do_search_again" />
<component-output id="outAttribute" destination="eds_global_source_link" />
</action-component>
<!-- restore the background icon -->
<call-action-chain id="restore_background_class_name"
action-chain="eds_mwau_act_chain_clone_variable">
<chain-input id="inVariable" source="eds_search_background_class_name" />
<chain-output id="outVariable" destination="sdrcClassName" />
</call-action-chain>
<!-- copy back the activetab to the original value -->
<call-action-chain id="active_tab_param_clone_action"
action-chain="eds_mwau_act_chain_clone_variable">
<chain-input id="inVariable" source="eds_search_global_active_tab" />
<chain-output id="outVariable" destination="eds_global_active_tab" />
</call-action-chain>
<!-- Use this hook to do set the environment before displaying the
results page. -->
<hook id="eds_search_hook_prepare_search_results_page" />
<final-option>
<action-component id="route_based_on_class_name"
handler="com.edsplm.tc.ent._wcc.mwau.actioncomponents.appflow.ClassHierarchyOptionSelector">
<component-input id="inClassName" source="eds_search_class_name" />
<option id="PdmItem" page="search_resultpage"/>
</action-component>
</final-option>
</response-chain>
<!-- *************************************************************** -->
<!-- End of 零件 零件族关系 客制化 -->
<!-- *************************************************************** -->
添加Java ActionComponent类,输入bgClass = 'Assembly', searchClass = 'LeafFam', bgItemHandle = {Item Handle of Assembly},然后从调用Processor获取相关的Leaf Family对象集,设置到display bean中(outSearchResults,outFoundItemsCount)
public Option handleEnterpriseAction(ActionContext action_context, Arguments arguments)
throws RequestManagerException, EnterpriseException
{
Manager esManager = ESUtil.getESManager(action_context);
Session esSession = ESUtil.getESSession(action_context, arguments);
String bgClassName = (String)arguments.getString("inBgClassName");
String schClassName = (String)arguments.getString("inSchClassName");
String bgItemHandle = (String)arguments.getString("inBgItemHandle");
ActionComponentUtil.assertArgument(action_context,
arguments,
"inBgClassName",
bgClassName,
this);
ActionComponentUtil.assertArgument(action_context,
arguments,
"inSchClassName",
schClassName,
this);
ActionComponentUtil.assertArgument(action_context,
arguments,
"inBgItemHandle",
bgItemHandle,
this);
System.out.println("===GetPartFamiliesAction===");
System.out.println("bg class : <" + bgClassName +">");
System.out.println("search class : <" + schClassName +">");
System.out.println("bg item handle : <" + bgItemHandle +">");
OptionSet options = action_context.getOptionSet();
if ( !bgClassName.equals("Assembly") )
{
return options.getOption("failure");
}
if ( !schClassName.equals("LeafFam") )
{
return options.getOption("failure");
}
Accessor accessor = (Accessor)esManager.getProcessor("base.Accessor", esSession);
// import com.sdrc.metaphase.enterprise.es.base.EntityHandle
EntityHandle entity_handle = accessor.reconstructEntityHandle(bgItemHandle);
// import com.sdrc.metaphase.enterprise.es.base.ModelEntity
ModelEntity model_entity = accessor.get(entity_handle);
// get string value
// import com.sdrc.metaphase.wcc.mwau.entitybean.ModelEntityBean
// import com.edsplm.tc.ent.wcc.mwau.entitybean.ModelEntityBeanFactory
ModelEntityBean bean = ModelEntityBeanFactory.createModelEntityBean(action_context, arguments, model_entity);
Object objObid = bean.getItemAttributeValue("OBID");
String strObid = (objObid == null ? null : objObid.toString());
List list = null;
IPartFamiliesProcessor processor = (IPartFamiliesProcessor)esManager.getProcessor("bbk.PartFamiliesProcessor", esSession);
try
{
list = processor.GetPartFamilies(strObid);
}
catch(Exception e)
{
e.printStackTrace();
return options.getOption("failure");
}
if ( list == null || list.size() == 0 )
{
return options.getOption("noResultsFound");
}
arguments.setObject("outSearchResults", list);
arguments.setObject("outFoundItemsCount", new Integer(list.size()));
return options.getOption("success");
}
throws RequestManagerException, EnterpriseException
{
Manager esManager = ESUtil.getESManager(action_context);
Session esSession = ESUtil.getESSession(action_context, arguments);
String bgClassName = (String)arguments.getString("inBgClassName");
String schClassName = (String)arguments.getString("inSchClassName");
String bgItemHandle = (String)arguments.getString("inBgItemHandle");
ActionComponentUtil.assertArgument(action_context,
arguments,
"inBgClassName",
bgClassName,
this);
ActionComponentUtil.assertArgument(action_context,
arguments,
"inSchClassName",
schClassName,
this);
ActionComponentUtil.assertArgument(action_context,
arguments,
"inBgItemHandle",
bgItemHandle,
this);
System.out.println("===GetPartFamiliesAction===");
System.out.println("bg class : <" + bgClassName +">");
System.out.println("search class : <" + schClassName +">");
System.out.println("bg item handle : <" + bgItemHandle +">");
OptionSet options = action_context.getOptionSet();
if ( !bgClassName.equals("Assembly") )
{
return options.getOption("failure");
}
if ( !schClassName.equals("LeafFam") )
{
return options.getOption("failure");
}
Accessor accessor = (Accessor)esManager.getProcessor("base.Accessor", esSession);
// import com.sdrc.metaphase.enterprise.es.base.EntityHandle
EntityHandle entity_handle = accessor.reconstructEntityHandle(bgItemHandle);
// import com.sdrc.metaphase.enterprise.es.base.ModelEntity
ModelEntity model_entity = accessor.get(entity_handle);
// get string value
// import com.sdrc.metaphase.wcc.mwau.entitybean.ModelEntityBean
// import com.edsplm.tc.ent.wcc.mwau.entitybean.ModelEntityBeanFactory
ModelEntityBean bean = ModelEntityBeanFactory.createModelEntityBean(action_context, arguments, model_entity);
Object objObid = bean.getItemAttributeValue("OBID");
String strObid = (objObid == null ? null : objObid.toString());
List list = null;
IPartFamiliesProcessor processor = (IPartFamiliesProcessor)esManager.getProcessor("bbk.PartFamiliesProcessor", esSession);
try
{
list = processor.GetPartFamilies(strObid);
}
catch(Exception e)
{
e.printStackTrace();
return options.getOption("failure");
}
if ( list == null || list.size() == 0 )
{
return options.getOption("noResultsFound");
}
arguments.setObject("outSearchResults", list);
arguments.setObject("outFoundItemsCount", new Integer(list.size()));
return options.getOption("success");
}