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