如何实现页面上弹性域字段的取值&赋值原创
金蝶云社区-聚宝彭
聚宝彭
10人赞赏了该文章 4379次浏览 未经作者许可,禁止转载编辑于2022年04月15日 18:49:01

关键词:弹性域


一、需求

某业务单据上包含一弹性域字段。在新增时,系统自动给该弹性域字段自动赋默认值。然后,在点击工具栏的按钮后,将弹性域字段的值赋值给其它字段(文本 & 基础资料)。


二、思路与方案

弹性域字段是苍穹里面很复杂的控件之一,如涉及该控件的二次开发,请一定要先弄清弹性域字段数据的底层存储关系,可参考 关于弹性域字段开发的样例(一) 。


三、实现过程

1. 新建单据,其设计器界面如下图所示。

单据设计器

image.png


2. 在 【系统服务云】—【基础资料】—【供应链数据】—【辅助属性定义】中维护 2 个辅助属性定义。

image.png


3. 在【系统服务云】—【基础资料】—【主数据】—【物料】中维护 1 条物料数据,然后在“公共信息”中开启“启用辅助属性”,并新增两个辅助属性,分别选择上一步添加的辅助属性定义。

图3-new.png图4-new.png


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);
	}


四、效果图

新增单据时,给弹性域字段赋默认值。

图6-new.png


点击按钮,将弹性域字段的值赋值给其它字段(文本 & 基础资料)。

图8-new.png


五、开发环境版本

V2.0.039.57(含)以上


六、注意事项

1. 维护一条物料数据后,需将其主键ID更新至插件中的全局变量 VAL_BASEDATA

2. 如需给弹性域字段赋默认值,需先给其绑定的基础资料字段赋值。参考资料 关于苍穹弹性域字段开发的样例(一) 已介绍,弹性域字段需通过其“基础资料字段”属性与某个基础资料相关联。


七、参考资料

开发平台

学习成长中心

控件使用指南——弹性域字段

关于苍穹弹性域字段开发的样例(一)

弹性域字段后台赋值


赞 10