本文介绍了在苍穹系统中,针对业务单据上的弹性域字段进行自动赋默认值及将值赋给其他字段(文本和基础资料)的实现过程。首先,通过系统服务云维护辅助属性定义和物料数据,并在新增单据时给弹性域字段赋默认值。然后,通过点击工具栏按钮,将弹性域字段的值赋给其他字段。实现过程中详细说明了代码实现,包括如何获取和设置弹性域字段的值,以及如何将值传递给其他字段。最后,提供了开发环境版本要求、注意事项及参考资料。
关键词:弹性域
一、需求
某业务单据上包含一弹性域字段。在新增时,系统自动给该弹性域字段自动赋默认值。然后,在点击工具栏的按钮后,将弹性域字段的值赋值给其它字段(文本 & 基础资料)。
二、思路与方案
弹性域字段是苍穹里面很复杂的控件之一,如涉及该控件的二次开发,请一定要先弄清弹性域字段数据的底层存储关系,可参考 关于弹性域字段开发的样例(一) 。
三、实现过程
1. 新建单据,其设计器界面如下图所示。
单据设计器
2. 在 【系统服务云】—【基础资料】—【供应链数据】—【辅助属性定义】中维护 2 个辅助属性定义。
3. 在【系统服务云】—【基础资料】—【主数据】—【物料】中维护 1 条物料数据,然后在“公共信息”中开启“启用辅助属性”,并新增两个辅助属性,分别选择上一步添加的辅助属性定义。
4. 新增单据时,给弹性域字段赋默认值。
@Override public void afterCreateNewData(EventObject e) { super.afterCreateNewData(e); this.setFlexFieldDefVal(); } /** * * 场景1:单据加载的时候给弹性域字段赋默认值 * */ private void setFlexFieldDefVal() { // 给基础资料字段(物料)设置默认值 DynamicObject baseDataDefValObj = BusinessDataServiceHelper.loadSingle(VAL_BASEDATA, KEY_BASEDATAENTITYNUM); getModel().setValue(KEY_BASEDATAFIELD, baseDataDefValObj); // 获取基础资料的弹性域字段 BasedataEdit basedataEdit = getControl(KEY_BASEDATAFIELD); String flexFieldKey = basedataEdit.getFlexKey(); // 获取单据上弹性域字段的type & value & property FlexEdit flexEdit = getControl(flexFieldKey); IDataModel fModel = flexEdit.getFlexModel(); MainEntityType flexFieldEntityType = fModel.getDataEntityType(); DynamicObject flexFieldVal = fModel.getDataEntity(); DataEntityPropertyCollection properties = flexFieldEntityType.getProperties(); // 设置初始值 for (IDataEntityProperty prop : properties) { String key = prop.getName(); if ("id".equals(key)) { continue; } if (!(prop instanceof BasedataProp)) { if (key.endsWith("_id")) { // 可不设置 // prop.setValue(flexFieldVal, VAL_FLEX1_BASEDATA); continue; } String subKey = key; key = subKey.split("__")[1]; switch (key) { case "f000002": prop.setValue(flexFieldVal, VAL_FLEX1_TXT); break; default: break; } } else { prop.setValue(flexFieldVal, BusinessDataServiceHelper.loadSingle(VAL_FLEX2_BASEDATA, "bos_user")); } } FlexEntireData flexEntireData = new FlexEntireData(); flexEntireData.setFlexData(flexFieldEntityType, flexFieldVal); long id = FlexService.saveFlexData(flexFieldEntityType, flexEntireData); logger.info("保存弹性域字段值后生成的主键ID: " + id); flexFieldEntityType.getPrimaryKey().setValue(flexFieldVal, id); // new一个弹性域字段对象,并赋值 DynamicObject flexObject = (DynamicObject) ((FlexProp) flexEdit.getProperty()).getComplexType().createInstance(); flexObject.set("id", id); Map<String, Object> values = flexEntireData.getFlexValue(); flexObject.set("value", SerializationUtils.toJsonString(values)); getModel().setValue(flexFieldKey, flexObject); }
5. 点击按钮,将弹性域字段的值赋值给其它字段(文本 & 基础资料)。
@Override public void itemClick(ItemClickEvent evt) { super.itemClick(evt); String itemKey = evt.getItemKey(); if (StringUtils.equalsIgnoreCase(KEY_BAR_TEST, itemKey)) { this.setFlexFieldValToOtherField(); } } /** * 将弹性域字段的值赋值给其它字段(文本 & 基础资料) */ private void setFlexFieldValToOtherField() { BasedataEdit basedataEdit = getControl(KEY_BASEDATAFIELD); String flexFieldKey = basedataEdit.getFlexKey(); DynamicObject flexFieldVal = (DynamicObject) getModel().getValue(flexFieldKey); String flex1Val = null; DynamicObject flex2Val = null; String valueStr = null; if (flexFieldVal != null) { valueStr = flexFieldVal.get("value").toString(); Map<String, Object> values = SerializationUtils.fromJsonString(valueStr, Map.class); flex1Val = values.get("f000002").toString(); flex2Val = BusinessDataServiceHelper.loadSingle(values.get("f000003"), "bos_user"); } getModel().setValue(KEY_TXT, flex1Val); getModel().setValue(KEY_BASEDATAFIELD1, flex2Val); }
四、效果图
新增单据时,给弹性域字段赋默认值。
点击按钮,将弹性域字段的值赋值给其它字段(文本 & 基础资料)。
五、开发环境版本
V2.0.039.57(含)以上
六、注意事项
1. 维护一条物料数据后,需将其主键ID更新至插件中的全局变量 VAL_BASEDATA。
2. 如需给弹性域字段赋默认值,需先给其绑定的基础资料字段赋值。参考资料 关于苍穹弹性域字段开发的样例(一) 已介绍,弹性域字段需通过其“基础资料字段”属性与某个基础资料相关联。
七、参考资料
前端页面上弹性域字段的取值&赋值.zip(8.86KB)
推荐阅读