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