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传入各种自定义参数
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|