?DynamicObject对象复制拷贝,界面对象复制拷贝,万能拷贝方法分享原创
金蝶云社区-丁养校_1
丁养校_1
7人赞赏了该文章 3,053次浏览 未经作者许可,禁止转载编辑于2021年06月10日 20:44:22

场景1,由A实体数据复制到B实体,根据字段名相同赋值,前提字段类型要相同

场景2,由A实体生成一个数据相同的实体可用于存库

代码如下

/**
	 * 拷贝对象数据 包含分录数据<br>
	 * 从 from 拷贝到 to<br>
	 * 以 to 有的属性 从 from 中获取
	 * @param from
	 * @param to
	 * @param entryCopyType 1 分录不处理 2 分录清空全覆盖 3 分录追加 4 分录按ID覆盖
	 * @param ignoreNull 空值 不设
	 * @param isMulReset 重置多选主键
	 * @param clearPrimarykeyValue 清除主键
	 */
	public static void copyDynamicObject(DynamicObject from, DynamicObject to, int entryCopyType, boolean ignoreNull, boolean isMulReset, boolean clearPrimarykeyValue) {
		DynamicObjectType dynamicObjectType = to.getDynamicObjectType();
		DataEntityPropertyCollection properties = dynamicObjectType.getProperties();
		DynamicObjectType dataFromDynamicObjectType = from.getDynamicObjectType();
		DataEntityPropertyCollection dataFromProperties = dataFromDynamicObjectType.getProperties();
		
		for(IDataEntityProperty property : properties) {
			String name = property.getName();
			if(!dataFromProperties.containsKey(name)) {
				continue;
			}
			//分录处理
			if(property instanceof EntryProp) {
				if(entryCopyType == 1) {
					continue;
				}
				//分录对象
				DynamicObjectCollection toDynamicObjectCollection = to.getDynamicObjectCollection(name);
				if(entryCopyType == 2) {
					toDynamicObjectCollection.clear();
				}
				DynamicObjectCollection dataFromDynamicObjectCollection = from.getDynamicObjectCollection(name);
				for(DynamicObject dataFromDynamicObject : dataFromDynamicObjectCollection) {
					String fromEntryPk = DTF.getString(dataFromDynamicObject.getPkValue());
					DynamicObject dynamicObject = null;
					boolean isadd = false;//是追加的行
					if(entryCopyType == 4 && !DTF.isEmpty(fromEntryPk)) {
						for(DynamicObject toObj : toDynamicObjectCollection) {
							String toEntryPk = DTF.getString(toObj.getPkValue());
							if(DTF.isEmpty(toEntryPk)) {
								continue;
							}
							if(toEntryPk.equals(fromEntryPk)) {
								dynamicObject = toObj;
								break;
							}
						}
					}
					if(dynamicObject == null) {
						dynamicObject = new DynamicObject(toDynamicObjectCollection.getDynamicObjectType());
						isadd = true;
					}
					
					copyDynamicObject(dataFromDynamicObject, dynamicObject, 1, ignoreNull, isMulReset, clearPrimarykeyValue);
					if((entryCopyType == 2 || entryCopyType == 3) && isadd) {
						toDynamicObjectCollection.add(dynamicObject);
					}
				}
			}
			else if(property instanceof MulBasedataProp && isMulReset) {
				MulBasedataProp mulBasedataProp = ((MulBasedataProp) property);
				
				IDataEntityType itemType = mulBasedataProp.getItemType();
				ISimpleProperty primaryKey = itemType.getPrimaryKey();
				DynamicObjectCollection toColls = (DynamicObjectCollection)to.get(name);
				toColls.clear();
				DynamicObjectType toDynamicObjectType = toColls.getDynamicObjectType();
				
				DynamicObjectCollection fromColls = (DynamicObjectCollection)from.get(name);
				for (DynamicObject coll : fromColls) {
					DynamicObject mulBaseData = new DynamicObject(toDynamicObjectType);
					copyDynamicObject(coll, mulBaseData, 1, ignoreNull, false, false);
					primaryKey.resetValue(mulBaseData);
					toColls.add(mulBaseData);
				}
			}
			else {
				if(ignoreNull && from.get(name) == null) {
					continue;
				}
				to.set(name, from.get(name));
			}
		}
		if(clearPrimarykeyValue) {
			ISimpleProperty toPrimaryKey = dynamicObjectType.getPrimaryKey();
			toPrimaryKey.resetValue(to);
		}
	}


赞 7