UDN-企业互联网技术人气社区

板块导航

浏览  : 1511
回复  : 13

单据转换规则中具体规则的匹配方案

[复制链接]
uec_HOLLvLyPOV的头像 楼主
发表于 2018-7-26 17:07:56 | 显示全部楼层 |阅读模式
我先描述一下问题.环境是NC65

具体代码在
riart模块的private包,riart_riartplatformLevel-1.jar中
nc.impl.uap.pf.PfExchangeServiceImpl.class 的
public ExchangeVO queryMostSuitableExchangeVO(String srcType, String destType, String pkBusitype, String pkgroup, ExchangeVO excludeVO)方法中.

规则表为pub_vochange.



对于单据转换时选择系统哪条规则,NC里是这样的方案.

    在识别规则时有四个重要的参数,即来源单据类型,来源交易类型,目的单据类型,目的交易类型.
    (src_billtype,src_transtype,dest_billtype,dest_transtype);
    在我的观察中,单据类型与交易类型是一个一对多的关系,单据类型一,交易类型多.

    当使用来源交易类型,目的交易类型来查找规则时.NC是这样处理的
    SQL如下:
AND (( src_transtype = '45-Cxx-13' AND dest_transtype = '21-Cxx-09' )
OR ( src_transtype = '45-Cxx-13' AND dest_billtype = '21' AND isnull ( dest_transtype, '~' ) = '~' )
OR ( src_billtype = '45' AND dest_transtype = '21-Cxx-09' AND isnull ( src_transtype, '~' ) = '~' )
OR ( src_billtype = '45' AND isnull ( src_transtype, '~' ) = '~' AND dest_billtype = '21' AND isnull ( dest_transtype, '~' ) = '~' ))
  模式为
      来源交易类型+目的交易类型
      or 来源交易类型 + 目的单据类型 + 目的交易类型为空
      or 目的交易类型 + 来源单据类型 + 来源交易类型为空
      or 来源交易类型 + 目的交易类型 + 来源交易类型为空 + 目的交易类型为空

查询结果会有很多条规则

    下一步再匹配精准的规则.
    匹配逻辑如下

   public static ExchangeVO getMostExactExchangeVO(Collection<ExchangeVO> exchangeVOs, ExchangeVO excludeVO)
{
     ExchangeVO resultVO = null;
   for (Iterator<ExchangeVO> iterator = exchangeVOs.iterator(); iterator.hasNext();) {
       ExchangeVO exchangeVO = (ExchangeVO)iterator.next();

     if ((excludeVO == null) || (!exchangeVO.getPrimaryKey().equals(excludeVO.getPrimaryKey())))
     {
       if (resultVO == null) {
           resultVO = exchangeVO;
       }
       if (isLastSuitable(resultVO, exchangeVO))
           resultVO = exchangeVO;
       }
   }
    return resultVO;   }
   }


public static boolean isLastSuitable(ExchangeVO resultVO, ExchangeVO exchangeVO)
{
     if (!isEqual(resultVO.getSrc_transtype(), exchangeVO.getSrc_transtype())) {
       if (!StringUtil.isEmptyWithTrim(resultVO.getSrc_transtype()))
       return false;
       return true; }
     if (!isEqual(resultVO.getDest_transtype(), exchangeVO.getDest_transtype())) {
       if (!StringUtil.isEmptyWithTrim(resultVO.getDest_transtype()))
         return false;
       return true; }
     if (StringUtil.isEmptyWithTrim(resultVO.getPk_busitype()))
     {
       if ((!StringUtil.isEmptyWithTrim(resultVO.getPk_group())) && (StringUtil.isEmptyWithTrim(exchangeVO.getPk_group())))
       {
         return false; }
       return true;
     }
   return false;
   }



参数excludeVO为不包含的规则,最后会遍历排除不包含以后的所有规则
最终会挑选出最细粒度的规则.即  符合 来源交易类型+目的交易类型 的规则.


这里我想不明白的是为啥要查出这么多规则,再挑选出一个最符合要求的.
直接在查询的时候查出最符合要求的不就可以了吗?

如果描述有问题欢迎提问,我会再详细叙述.
希望有大神可以帮我解惑,万分感谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部