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 srcBills, String targetEntityNumber, String targetEntryKey, String targetFieldKey, String srcEntityNumber, String srcEntryKey, String srcFieldKey, String lkEntryKey) { // 循环分析源单行,提取源单行号、源单内码、分录行内码对应关系,放在字典中备用: key = 源单行号; value = [源单内码、分录行内码] Map 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传入各种自定义参数 } }