lc/lc123/cloud/app/plugin/utils/AutoFixLinkUtil.java

92 lines
4.7 KiB
Java
Raw Normal View History

2025-10-30 07:47:33 +00:00
package tqq9.lc123.cloud.app.plugin.utils;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.EntityMetadataCache;
import kd.bos.entity.botp.runtime.TableDefine;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 示例提供方法自动创建(修复)与源单的关联关系支持联查反写
*
* @author rd_johnnyding
*/
public class AutoFixLinkUtil {
/**
* @param targetBill 目标单据
* @param srcBills 上游单据
* @param targetEntityNumber 目标单据标识
* @param targetEntryKey 目标单据体标识
* @param targetFieldKey 目标单据体的上游单据行ID字段标识
* @param srcEntityNumber 上游单据标识
* @param srcEntryKey 上游单据体标识
* @param srcFieldKey 上游单据体主键字段标识-默认空
* @param lkEntryKey 目标单中关联配置单据体标识
*/
public void linkSourceRow(DynamicObject targetBill, List<DynamicObject> srcBills,
String targetEntityNumber, String targetEntryKey, String targetFieldKey,
String srcEntityNumber, String srcEntryKey, String srcFieldKey, String lkEntryKey) {
// 循环分析源单行,提取源单行号、源单内码、分录行内码对应关系,放在字典中备用: key = 源单行号; value = [源单内码、分录行内码]
Map<String, Object[]> srcRowIds = new HashMap<>();
for (DynamicObject srcBill : srcBills) {
DynamicObjectCollection srcRows = srcBill.getDynamicObjectCollection(srcEntryKey);
for (DynamicObject srcRow : srcRows) {
String shkd_bussysentryno = null;
if (!kd.bos.util.StringUtils.isEmpty(srcFieldKey)) {
shkd_bussysentryno = srcRow.getString(srcFieldKey);
} else {
shkd_bussysentryno = srcRow.getPkValue().toString();
}
Object[] srcRowId = new Object[]{srcBill.getPkValue(), srcRow.getPkValue()};
srcRowIds.put(shkd_bussysentryno, srcRowId);
}
}
// 获取源单单据体的表格编码:传入源单标识、源单单据体,记录关联关系时,需要用此编码,标识源单及单据体
TableDefine tableDefine = EntityMetadataCache.loadTableDefine(srcEntityNumber, srcEntryKey);
Long srcTableId = tableDefine.getTableId();
// 拼接处关联子实体标识如果是单据头下的lk子表固定使用billhead_lk如果是单据体下的lk子表用单据体标识+lk
// String lkEntryKey = StringUtils.equals(targetEntityNumber, targetEntryKey) ? "billhead_lk" : targetEntryKey + "_lk";
// 当前单据
TableDefine targetTableDefine = EntityMetadataCache.loadTableDefine(targetEntityNumber, targetEntryKey);
DynamicObjectCollection targetRows = targetBill.getDynamicObjectCollection(targetTableDefine.getEntityKey());
for (DynamicObject targetRow : targetRows) {
// 获取下级_lk子实体行
DynamicObjectCollection linkRows = targetRow.getDynamicObjectCollection(lkEntryKey);
if (!linkRows.isEmpty()) {
continue;
}
linkRows.clear();
// 寻找匹配的源单行:提取本行的匹配字段值,和源单行进行比对
String shkd_bussysentryno = targetRow.getString(targetFieldKey);
if (srcRowIds.containsKey(shkd_bussysentryno)) {
// 找到了匹配的行创建一条_lk子实体上数据记录源单内码
DynamicObject linkRow = new DynamicObject(linkRows.getDynamicObjectType());
linkRows.add(linkRow);
// 在lk行中记录源单分录表格编码、源单内码、源单分录内码
Object[] srcRowId = srcRowIds.get(shkd_bussysentryno);
linkRow.set(lkEntryKey + "_stableid", srcTableId); // 源单分录表格编码:以此标识源单类型及单据体
linkRow.set(lkEntryKey + "_sbillid", srcRowId[0]); // 源单内码
linkRow.set(lkEntryKey + "_sid", srcRowId[1]); // 源单分录行内码
}
}
// // 至此:目标单分录行上,已经自动填写源单分录行内码;保存时,会自动创建关联关系及反写
// SaveServiceHelper.save(
// // 目标单主实体编码
// new DynamicObject[] {targetBill} // 目标单数据包
// ); // 操作参数可通过option传入各种自定义参数
}
}