找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 1735|回复: 3

[技巧] 如何实现通用的基础档案翻译

[复制链接]
发表于 2022-7-13 16:04:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
与外部系统集成时,经常会存在code,name翻译为pk,或者反过来的情况。


参考以下类,应可以实现通用的基础档案翻译功能。以下作为记录,待有时间时,再做个通用工具补丁,以便实现快速的档案翻译。
一:(注:档案指实现了  nc.vo.bd.meta.IBDObject  的实体类型)

public interface IBDObject {
        Object getId();
        Object getPId();
        Object getPk_org();
        Object getCode();
        Object getName();
        Object getPk_group();
}


二:管控模式实体类:
nc.vo.bd.config.BDModeSelectedVO  
对应数据库表:bd_mode_selected  存储了各基础档案的管理模式,可见模式,以及唯一模式。具体枚举像如下:
1=全局;
2=全局+集团;
3=全局+集团+组织;
4=全局+组织;
5=集团;
6=集团+组织;
7=组织;
通过以上,可以查询基础档案的唯一性模式,是否与组织有关,是否与集团有关。


三、通过如下示例代码。可以获得基础档案与接口IBDObject的字段映射关系
  private static String getBillPK_org(CircularlyAccessibleValueObject mvo) {
    try {
      IBean be =
          MDBaseQueryFacade.getInstance().getBeanByFullClassName(
              mvo.getClass().getName());    //获得元数据定义
      if (null != be && MDUtil.isEntityType(be)) {
        Map<String, String> map =
            ((IBusinessEntity) be).getBizInterfaceMapInfo(IBDObject.class
                .getName());   //获得对应接口的字段映射关系
        return (String) mvo.getAttributeValue(map.get("pk_org"));
      }
      throw new BusinessRuntimeException("单据元数据请实现IBDObject接口");/*-=notranslate=-*/
    }
    catch (MetaDataException e) {
      ExceptionUtils.wrappException(e);
    }
    return null;
  }



四、根据元数据信息及字段映射关系,可按要翻译的实体进行查询(可批量查询,缓存提升性能)


//todo: 待后续实现




发表于 2022-7-18 09:49:16 | 显示全部楼层

mark学习一下mark学习一下mark学习一下
回复 点赞 拍砖

使用道具 举报

发表于 2022-7-26 19:43:11 | 显示全部楼层
回复 点赞 拍砖

使用道具 举报

 楼主| 发表于 2023-6-10 16:20:54 | 显示全部楼层
以下为朋友分享的共享工具类
  1. package nc.bs.arap.waasvo;

  2. import nc.bs.framework.common.InvocationInfoProxy;
  3. import nc.pubitf.bd.accessor.GeneralAccessorFactory;
  4. import nc.vo.bd.accessor.IBDData;
  5. import org.apache.commons.lang3.StringUtils;

  6. /**
  7. * @author:lxd
  8. * @Description: 通用存取器工厂
  9. * 注意:如果接口使用,使用前需要加载环境上下文信息如:InvocationInfoProxy.getInstance().setGroupId("主键")
  10. */
  11. public class GeneralAccessorUtil {

  12.     // 元数据主键
  13.     private String classId;
  14.     // 主键
  15.     private String pk;
  16.     // 名称
  17.     private String name;
  18.     // 编码
  19.     private String code;
  20.     // 业务单元/集团,不传值默认为集团
  21.     private String pkOrg;
  22.     // 主键数组
  23.     private String[] pks;
  24.     // 名称数组
  25.     private String[] names;
  26.     // 编码数组
  27.     private String[] codes;
  28.     // 异常信息
  29.     private String errorMessage;

  30.     public static void main(String[] args) {
  31.         //测试示例:物料元数据id(eae040f4-3c88-413d-abc9-b15774463d46)
  32.         // 1.正常情况使用
  33.         IBDData bdData = new GeneralAccessorUtil("eae040f4-3c88-413d-abc9-b15774463d46").setCode("1030103622").getBdData();
  34.         System.out.println(bdData);
  35.         // 2.如果元数据id有问题,或者参数有问题导致数据没有查询出来
  36.         GeneralAccessorUtil bdData1 = new GeneralAccessorUtil("1-3c88-413d-abc9-b15774463d46").setPk("1");
  37.         // 3.此时bdData1.getBDData()等于null,这时候在不影响业务的情况下,通过方法getErrorMessage获取异常信息记录下来
  38.         System.out.println(bdData1.getBdData());
  39.         System.out.println(bdData1.getErrorMessage());
  40.     }

  41.     /**
  42.      * 备注:元数据id必传
  43.      * @Param: [classId]
  44.      * @return:
  45.      * @Author: lxd
  46.      */
  47.     public GeneralAccessorUtil(String classId) {
  48.         this.classId = classId;
  49.     }


  50.     public GeneralAccessorUtil(String classId,String pk) {
  51.         this.classId = classId;
  52.         this.pk = pk;
  53.     }

  54.     public GeneralAccessorUtil(String classId,String pk,String name) {
  55.         this.classId = classId;
  56.         this.name = name;
  57.         this.pk = pk;
  58.     }

  59.     public GeneralAccessorUtil(String classId,String pk,String name,String code) {
  60.         this.classId = classId;
  61.         this.pk = pk;
  62.         this.name = name;
  63.         this.code = code;
  64.     }
  65.     public GeneralAccessorUtil(String classId,String pk,String name,String code,String[] pks) {
  66.         this.classId = classId;
  67.         this.pk = pk;
  68.         this.name = name;
  69.         this.code = code;
  70.         this.pks = pks;
  71.     }
  72.     public GeneralAccessorUtil(String classId,String pk,String name,String code,String[] pks,String[] names) {
  73.         this.classId = classId;
  74.         this.pk = pk;
  75.         this.name = name;
  76.         this.code = code;
  77.         this.pks = pks;
  78.         this.names = names;
  79.     }
  80.     public GeneralAccessorUtil(String classId,String pk,String name,String code,String[] pks,String[] names,String[] codes) {
  81.         this.classId = classId;
  82.         this.pk = pk;
  83.         this.name = name;
  84.         this.code = code;
  85.         this.pks = pks;
  86.         this.names = names;
  87.         this.codes = codes;
  88.     }


  89.     /**
  90.      * 备注:获取单个档案
  91.      * @Param: []
  92.      * @return: nc.vo.bd.accessor.IBDData
  93.      * @Author: lxd
  94.      */
  95.     public IBDData getBdData() {
  96.         try {
  97.             if(StringUtils.isNotEmpty(pk)){
  98.                 return GeneralAccessorFactory.getAccessor(classId).getDocByPk(pk);
  99.             }
  100.             if(StringUtils.isNotEmpty(name)){
  101.                 return GeneralAccessorFactory.getAccessor(classId).getDocByNameWithMainLang(getPkOrg(),name);
  102.             }
  103.             if(StringUtils.isNotEmpty(code)){
  104.                 return GeneralAccessorFactory.getAccessor(classId).getDocByCode(getPkOrg(),code);
  105.             }
  106.         } catch (Exception e) {
  107.             errorMessage = getStackTrace(e);
  108.         }
  109.         return null;
  110.     }

  111.     /**
  112.      * 备注:获取多个档案数据
  113.      * @Param: []
  114.      * @return: nc.vo.bd.accessor.IBDData[]
  115.      * @Author: lxd
  116.      */
  117.     public IBDData[] getBdDatas() {
  118.         try {
  119.             if(pks.length > 0){
  120.                 return GeneralAccessorFactory.getAccessor(classId).getDocbyPks(pks);
  121.             }
  122.             if(names.length > 0){
  123.                 return GeneralAccessorFactory.getAccessor(classId).getDocByNamesWithMainLang(getPkOrg(),names);
  124.             }
  125.             if(codes.length > 0){
  126.                 return GeneralAccessorFactory.getAccessor(classId).getDocByCodes(getPkOrg(),codes);
  127.             }
  128.         } catch (Exception e) {
  129.             errorMessage = getStackTrace(e);
  130.         }
  131.         return null;
  132.     }

  133.     public String getClassId() {
  134.         return classId;
  135.     }

  136.     public GeneralAccessorUtil setClassId(String classId) {
  137.         this.classId = classId;
  138.         return this;
  139.     }

  140.     public String getPk() {
  141.         return pk;
  142.     }

  143.     public GeneralAccessorUtil setPk(String pk) {
  144.         this.pk = pk;
  145.         return this;
  146.     }

  147.     public String getName() {
  148.         return name;
  149.     }

  150.     public GeneralAccessorUtil setName(String name) {
  151.         this.name = name;
  152.         return this;
  153.     }

  154.     public String getCode() {
  155.         return code;
  156.     }

  157.     public GeneralAccessorUtil setCode(String code) {
  158.         this.code = code;
  159.         return this;
  160.     }

  161.     public String getPkOrg() {
  162.         if(StringUtils.isEmpty(pkOrg)) {
  163.             // 获取集团信息
  164.             pkOrg = InvocationInfoProxy.getInstance().getGroupId();
  165.         }
  166.         return pkOrg;
  167.     }

  168.     public GeneralAccessorUtil setPkOrg(String pkOrg) {
  169.         this.pkOrg = pkOrg;
  170.         return this;
  171.     }

  172.     public String[] getPks() {
  173.         return pks;
  174.     }

  175.     public GeneralAccessorUtil setPks(String[] pks) {
  176.         this.pks = pks;
  177.         return this;
  178.     }

  179.     public String[] getNames() {
  180.         return names;
  181.     }

  182.     public GeneralAccessorUtil setNames(String[] names) {
  183.         this.names = names;
  184.         return this;
  185.     }

  186.     public String[] getCodes() {
  187.         return codes;
  188.     }

  189.     public GeneralAccessorUtil setCodes(String[] codes) {
  190.         this.codes = codes;
  191.         return this;
  192.     }

  193.     public String getErrorMessage() {
  194.         return errorMessage;
  195.     }

  196.     public void setErrorMessage(String errorMessage) {
  197.         this.errorMessage = errorMessage;
  198.     }

  199.     /**
  200.      * 备注:获取堆栈信息
  201.      * @Param: [e]
  202.      * @return: java.lang.String
  203.      * @Author: lxd
  204.      */
  205.     private static final String getStackTrace(Exception e) {
  206.         StringBuffer msg = new StringBuffer(e.getMessage() + "\r\n");
  207.         StackTraceElement[] stackTrace = e.getStackTrace();
  208.         for (int i = 0, j = stackTrace.length; i < j; i++) {
  209.             msg.append("          " + stackTrace[i] + "\r\n");
  210.         }

  211.         return msg.toString();
  212.     }
  213. }
复制代码
回复 点赞 拍砖

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-4-19 06:04 , Processed in 0.038906 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表