ensign/src/main/java/com/yem/wm/utils/DynamicObjectUtil.java
2024-08-26 09:19:12 +08:00

356 lines
15 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.yem.wm.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.yem.wm.sys.utils.SpecialProcessingHelper;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.OrmLocaleValue;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.IDataEntityType;
import kd.bos.dataentity.metadata.ISimpleProperty;
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
import kd.bos.dataentity.metadata.dynamicobject.DynamicLocaleProperty;
import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.property.BasedataProp;
import kd.bos.entity.property.BooleanProp;
import kd.bos.entity.property.DateProp;
import kd.bos.entity.property.DateTimeProp;
import kd.bos.entity.property.DecimalProp;
import kd.bos.entity.property.EntryProp;
import kd.bos.entity.property.LongProp;
import kd.bos.entity.property.MulBasedataProp;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
/**
* 业务实体工具类
*
* @author longh
* @description:
* @date 2021年11月9日 下午7:09:02
*/
public class DynamicObjectUtil {
/**
* 拷贝对象数据 分录清空全覆盖 主键清空
*
* @param from
* @param to
*/
public static void copyDynamicObject(DynamicObject from, DynamicObject to) {
copyDynamicObject(from, to, 2, false, true, true);
}
/**
* 拷贝对象数据 包含分录数据
* 从 from 拷贝到 to
* 以 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 toType = to.getDynamicObjectType();
DataEntityPropertyCollection toProperties = toType.getProperties();
DynamicObjectType fromType = from.getDynamicObjectType();
DataEntityPropertyCollection fromProperties = fromType.getProperties();
for (IDataEntityProperty toProperty : toProperties) {
String name = toProperty.getName();
if (!fromProperties.containsKey(name)) {
continue;
}
//分录处理
if (toProperty instanceof EntryProp) {
if (entryCopyType == 1) {
continue;
}
//分录对象
DynamicObjectCollection toDynamicObjectCollection = to.getDynamicObjectCollection(name);
if (entryCopyType == 2) {
toDynamicObjectCollection.clear();
}
DynamicObjectCollection fromDynamicObjectCollection = from.getDynamicObjectCollection(name);
for (DynamicObject fromObj : fromDynamicObjectCollection) {
String fromEntryPk = fromObj.getPkValue() == null ? "" : fromObj.getPkValue().toString();
DynamicObject dynamicObject = null;
boolean isadd = false;//是追加的行
if (entryCopyType == 4 && fromEntryPk.length() > 0) {
for (DynamicObject toObj : toDynamicObjectCollection) {
String toEntryPk = toObj.getPkValue() == null ? "" : toObj.getPkValue().toString();
if (toEntryPk.length() == 0) {
continue;
}
if (toEntryPk.equals(fromEntryPk)) {
dynamicObject = toObj;
break;
}
}
}
if (dynamicObject == null) {
dynamicObject = new DynamicObject(toDynamicObjectCollection.getDynamicObjectType());
isadd = true;
}
copyDynamicObject(fromObj, dynamicObject, entryCopyType, ignoreNull, isMulReset, clearPrimarykeyValue);
if ((entryCopyType == 2 || entryCopyType == 3) && isadd) {
SpecialProcessingHelper.PrimaryInformation(toType,fromObj, dynamicObject);
toDynamicObjectCollection.add(dynamicObject);
}
}
}//多选基础资料类处理
else if (toProperty instanceof MulBasedataProp && isMulReset) {
MulBasedataProp mulBasedataProp = ((MulBasedataProp) toProperty);
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 (toProperty instanceof DynamicLocaleProperty) {
DynamicLocaleProperty localeProperty = ((DynamicLocaleProperty) toProperty);
IDataEntityType itemType = localeProperty.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));
SpecialProcessingHelper.PrimaryData(to,name, from);
}
}
if (clearPrimarykeyValue) {
ISimpleProperty toPrimaryKey = toType.getPrimaryKey();
toPrimaryKey.resetValue(to);
}
}
public static String getSelectfieldsFast(String entityKey, String... entityKeys) {
String srcSelect = getSelectfields(entityKey);
for (String key : entityKeys) {
srcSelect = getEntrySelectfields(srcSelect, entityKey, key);
}
return srcSelect;
}
public static String getSelectfields(String entityKey) {
return getSelectfields(entityKey, false);
}
@SuppressWarnings("rawtypes")
public static String getSelectfields(String entityKey, boolean isNeedAlias) {
DynamicObject obj = ORM.create().newDynamicObject(entityKey);
Map allProsMap = getDifferDynamicProperties(obj);
List allProsList = (List) allProsMap.get("allProList");
List bdList = (List) allProsMap.get("bdList");
StringBuilder sb = new StringBuilder();
Iterator arg6 = allProsList.iterator();
while (arg6.hasNext()) {
String key = (String) arg6.next();
if (bdList.contains(key)) {
if (sb.length() > 0) {
sb.append(",");
}
if (isNeedAlias) {
sb.append(key).append(".id").append(" ").append(key);
} else {
sb.append(key).append(".id");
}
} else if (!StringUtils.equals("materialentry", key) && !StringUtils.equals("billhead_lk", key)
&& !StringUtils.equals("multilanguagetext", key)) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(key);
}
}
return sb.toString();
}
public static String getEntrySelectfields(String srcSelect, String entityKey, String entryKey) {
return getEntrySelectfields(srcSelect, entityKey, entryKey, false);
}
@SuppressWarnings("rawtypes")
public static String getEntrySelectfields(String srcSelect, String entityKey, String entryKey, boolean isNeedAlias) {
DynamicObject entry = ORM.create().newDynamicObject(entityKey + "." + entryKey);
Map allProsMap = getDifferDynamicProperties(entry);
List allProsList = (List) allProsMap.get("allProList");
// List bdList = (List) allProsMap.get("bdList");
StringBuilder sb = new StringBuilder();
sb.append(srcSelect);
Iterator arg8 = allProsList.iterator();
while (arg8.hasNext()) {
String key = (String) arg8.next();
if (sb.length() > 0) {
sb.append(",");
}
sb.append(entryKey).append(".").append(key);
if (isNeedAlias) {
sb.append(" ").append(key);
}
}
return sb.toString();
}
public static String getEntrySelectfields(String srcSelect, String entityKey, String entryKey, String childentryKey) {
return getEntrySelectfields(srcSelect, entityKey, entryKey, childentryKey, false);
}
@SuppressWarnings("rawtypes")
public static String getEntrySelectfields(String srcSelect, String entityKey, String entryKey, String childentryKey, boolean isNeedAlias) {
DynamicObject entry = ORM.create().newDynamicObject(entityKey + "." + entryKey + "." + childentryKey);
String leftString = childentryKey;
Map allProsMap = getDifferDynamicProperties(entry);
List allProsList = (List) allProsMap.get("allProList");
// List bdList = (List) allProsMap.get("bdList");
StringBuilder sb = new StringBuilder();
sb.append(srcSelect);
Iterator arg10 = allProsList.iterator();
while (arg10.hasNext()) {
String key = (String) arg10.next();
if (!"entryentity_lk".equals(key) && !"materialentry_lk".equals(key)) {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(leftString).append(".").append(key);
if (isNeedAlias) {
sb.append(" ").append(key);
}
}
}
return sb.toString();
}
@SuppressWarnings({"rawtypes", "unchecked"})
public static Map<String, List<String>> getDifferDynamicProperties(DynamicObject dynamicObject) {
HashMap differProMap = new HashMap();
ArrayList allProList = new ArrayList();
ArrayList bdList = new ArrayList();
ArrayList dateList = new ArrayList();
ArrayList decimalList = new ArrayList();
ArrayList booleanList = new ArrayList();
if (dynamicObject != null) {
DataEntityPropertyCollection proptiesCol = dynamicObject.getDataEntityType().getProperties();
Iterator arg7 = proptiesCol.iterator();
label40:
while (true) {
while (true) {
IDataEntityProperty iDataEntityProperty;
do {
if (!arg7.hasNext()) {
break label40;
}
iDataEntityProperty = (IDataEntityProperty) arg7.next();
}//这里加了一个判空多选基础资料类字段无表名时getAlias()方法获取到的值为空
while (iDataEntityProperty.getAlias() == null || iDataEntityProperty.getAlias().equals(""));
if (!(iDataEntityProperty instanceof LongProp)) {
allProList.add(iDataEntityProperty.getName());
}
if (!(iDataEntityProperty instanceof DateProp) && !(iDataEntityProperty instanceof DateTimeProp)) {
if (iDataEntityProperty instanceof BasedataProp) {
bdList.add(iDataEntityProperty.getName());
} else if (iDataEntityProperty instanceof DecimalProp) {
decimalList.add(iDataEntityProperty.getName());
} else if (iDataEntityProperty instanceof BooleanProp) {
booleanList.add(iDataEntityProperty.getName());
}
} else {
dateList.add(iDataEntityProperty.getName());
}
}
}
}
differProMap.put("allProList", allProList);
differProMap.put("bdList", bdList);
differProMap.put("dateList", dateList);
differProMap.put("decimalList", decimalList);
differProMap.put("booleanList", booleanList);
return differProMap;
}
/**
* @param entityNumber 单据编码
* @param qfilter 查询条件
* @param filedNumber 返回值map中key 是哪个字段的值
* @param entryNumbers 单据体标识集合
* @return map key为传参字段的值 value为数据实体
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public static Map<Object, DynamicObject> getFiledDynamicObject(String entityNumber, List<QFilter> qfilter, String filedNumber, String... entryNumbers) {
Map<Object, DynamicObject> map = new HashMap();
String selectfields = DynamicObjectUtil.getSelectfields(entityNumber, false);
for (String entryNumber : entryNumbers) {
selectfields = DynamicObjectUtil.getEntrySelectfields(selectfields, entityNumber, entryNumber, false);
}
DynamicObject[] loads = null;
if (qfilter != null) {
loads = BusinessDataServiceHelper.load(entityNumber, selectfields, qfilter.toArray(new QFilter[qfilter.size()]));
} else {
loads = BusinessDataServiceHelper.load(entityNumber, selectfields, null);
}
for (DynamicObject load : loads) {
Object object = load.get(filedNumber);
if (object instanceof OrmLocaleValue) {
OrmLocaleValue str = (OrmLocaleValue) object;
map.put(str.getLocaleValue(), load);
} else {
map.put(object, load);
}
}
return map;
}
}