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

92 lines
4.7 KiB
Java
Raw Permalink 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 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传入各种自定义参数
}
}