ensign/src/main/java/com/yem/wm/utils/DynamicObjectUtil.java

356 lines
15 KiB
Java
Raw Normal View History

2024-08-26 09:19:12 +08:00
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;
}
}