外部交换平台

具体的可以参照红皮书,以下只是根据我平时项目遇到的着重做一下总结。

一、开发:

利用前台插件开发的:

1、注册:pfxx\auxiregister\jzpub.xml

<?xml version="1.0" encoding='gb2312'?>
<auxiregister>
    <billtype editable="Yes" id="H550">
    </billtype>
</auxiregister>

\pfxx\businessprocessor\jzpub.xml

<?xml version="1.0" encoding='gb2312'?>
<businessprocessors>
    <businessprocessor baseclassname="" billtype="H550" classname="nc.bs.pfxx.plugins.PrPayPlanPlugin" locklevel="3" metadataid="e8bcfb91-8bfa-4a76-b11f-08e22db60fe9" name="H550">
    </businessprocessor>
</businessprocessors>

2、定义字段规则:pfxx\billdefine\jzpub\H550_MY.xml

3、定义报文规范:H550.xml

4、编写代码:modules\jzpub\META-INF\classes\nc\bs\pfxx\plugins\PrPayPlanPlugin.java

package nc.bs.pfxx.plugins;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import nc.bs.framework.common.NCLocator;
import nc.bs.logging.Logger;
import nc.itf.jzpm.jzpr8005.IPrPayPlanMaintain;
import nc.itf.jzpm.jzpr8005.IPrPayPlanQuery;
import nc.itf.uap.pf.IPFBusiAction;
import nc.itf.uap.pfxx.IPFxxEJBService;
import nc.pubitf.cmp.changebill.ICmpChangeBillPubService;
import nc.pubitf.cmp.paybill.ICmpPayBillPubService;
import nc.pubitf.cmp.recbill.ICmpRecBillPubService;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.pfxx.util.FileUtils;
import nc.vo.pfxx.util.PfxxPluginUtils;
import nc.bs.pfxx.ISwapContext;
import nc.vo.pfxx.auxiliary.AggxsysregisterVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.ISuperVO;
import nc.vo.pub.SuperVO;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;


import nc.vo.cmp.bill.BillAggVO;
import nc.vo.cmp.bill.ChangeBillAggVO;
import nc.vo.cmp.bill.RecBillAggVO;
import nc.vo.jzpm.jzpr8005.AggPrPayPlanVO;
import nc.vo.jzpm.jzpr8005.PrPayPlanAccVO;
import nc.vo.jzpm.jzpr8005.PrPayPlanOthVO;
import nc.vo.jzpm.jzpr8005.PrPayPlanPettyVO;
import nc.vo.jzpm.jzpr8005.PrPayPlanSettleVO;
import nc.vo.jzpm.jzpr8005.PrPayPlanVO;


/**
 * <b> 在此处简要描述此类的功能 </b>
 *
 * <p>
 *     在此处添加此类的描述信息
 * </p>
 *
 * @author xueyl
 * @version Your Project V60
 */
public class PrPayPlanPlugin extends nc.bs.pfxx.plugin.AbstractPfxxPlugin  {    
    
    /**
     * 将由XML转换过来的VO导入NC系统。业务插件实现此方法即可。<br>
     * 请注意,业务方法的校验一定要充分
     * 仅限表体零星费用。其他表体没测试
     * @param vo
     *            转换后的vo数据,在NC系统中可能为ValueObject,SuperVO,AggregatedValueObject,IExAggVO等。
     * @param swapContext
     *            各种交换参数,组织,接受方,发送方,帐套等等
     * @param aggxsysvo
     *            辅助信息vo
     * @return
     * @throws BusinessException
     */
    protected Object processBill(Object vo, ISwapContext swapContext, AggxsysregisterVO aggxsysvo) throws BusinessException {

        //1.得到转换后的VO数据,取决于向导第一步注册的VO信息
         AggPrPayPlanVO resvo = (AggPrPayPlanVO)vo;
         Map<String, SuperVO[]> map = resvo.getAllChildrenMap();
        if(null != map ){
          PrPayPlanPettyVO[] pettys=null;
          PrPayPlanOthVO[] oths=null;
          PrPayPlanSettleVO[] settles=null;
          PrPayPlanAccVO[] accs=null;
          List<String> pklist=new ArrayList<String>();
          for (String key : map.keySet()) {
               pklist.add(key);
          }
          Map<String,PrPayPlanAccVO> accmap=new HashMap<String,PrPayPlanAccVO>();
          if(pklist.contains("pk_payplan_acc")){
              if(0<map.get("pk_payplan_acc").length){
                     accs=(PrPayPlanAccVO[]) map.get("pk_payplan_acc");
                     for (PrPayPlanAccVO accvo : accs) {
                         accmap.put(accvo.getVbdef1(), accvo);
                    }
              }
          }
          if(pklist.contains("pk_payplan_petty")){
              if(0<map.get("pk_payplan_petty").length){
                   pettys=(PrPayPlanPettyVO[]) map.get("pk_payplan_petty");
                   for (PrPayPlanPettyVO petty : pettys) {
                       for (String key : accmap.keySet()) {
                           if(key.equals(petty.getVbdef1())){
                              petty.setBisnewline(UFBoolean.TRUE);
                              petty.setGrandsonVO(new PrPayPlanAccVO[]{accmap.get(key)});
                           }
                        }
                }
               }
           resvo.setChildren(PrPayPlanPettyVO.class, pettys);
          }else{
              resvo.setChildren(PrPayPlanPettyVO.class, new PrPayPlanPettyVO[]{});
          }
          
          if(pklist.contains("pk_payplan_settle")){
              if(0<map.get("pk_payplan_settle").length){
                  settles=(PrPayPlanSettleVO[]) map.get("pk_payplan_settle");
                  resvo.setChildren(PrPayPlanSettleVO.class, settles);
              }
          }else{
              resvo.setChildren(PrPayPlanSettleVO.class, new PrPayPlanSettleVO[]{});
          }
          
          if(pklist.contains("pk_payplan_oth")){
              if(0<map.get("pk_payplan_oth").length){
                  oths=(PrPayPlanOthVO[]) map.get("pk_payplan_oth");
                  resvo.setChildren(PrPayPlanOthVO.class, oths);
              }
          }else{
              resvo.setChildren(PrPayPlanOthVO.class, new PrPayPlanOthVO[]{});
          }
        }
        resvo.setChildren( PrPayPlanAccVO.class,new PrPayPlanAccVO[]{});
        resvo.getAllChildrenMap().clear();
         //2.查询此单据是否已经被导入过,有两个方法,具体使用哪一个请参考方法说明javadoc
          String vopk = PfxxPluginUtils.queryBillPKBeforeSaveOrUpdate(swapContext.getBilltype(), swapContext.getDocID());
          
          //3. 如果单据设置有辅助信息,aggxsysvo为用户配置的具体辅助信息
          
          //4.如果此单据没有导入过,那么准备保存新单据,保存单据前请进行必要的数据检查,并给出明确的业务异常...
        IPrPayPlanQuery lookup = NCLocator.getInstance().lookup(IPrPayPlanQuery.class);
          if (vopk != null) {
              Logger.info("如果单据已经导入过则进行单据更新...");
              if (swapContext.getReplace().equalsIgnoreCase("N")) {
                   throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("3607mng_0", "03607mng-0359"));
              }
              AggPrPayPlanVO[] oldaggvo = lookup.queryBillByPK(new String[]{vopk});
              PrPayPlanPettyVO[] oldpettys = (PrPayPlanPettyVO[]) oldaggvo[0].getChildren(PrPayPlanPettyVO.class);
              PrPayPlanAccVO[] oldaccs= (PrPayPlanAccVO[]) oldaggvo[0].getChildren(PrPayPlanAccVO.class);
              Map<String,PrPayPlanAccVO> oldaccmap=new HashMap<String,PrPayPlanAccVO>();
                for (PrPayPlanAccVO oldacc : oldaccs) {
                   oldaccmap.put(oldacc.getVbdef1(), oldacc);
                }
              for (PrPayPlanPettyVO oldpetty : oldpettys) {
                   for (String key : oldaccmap.keySet()) {
                       if(key.equals(oldpetty.getVbdef1())){
                           oldpetty.setGrandsonVO(new PrPayPlanAccVO[]{oldaccmap.get(key)});
                       }
                  }
               }
               //根据老数据为新的数据赋值-------start---------
               resvo.getParentVO().setBhasbeyondrecord(UFBoolean.FALSE);
               resvo.getParentVO().setStatus(1);
               resvo.getParentVO().setPk_payplan(oldaggvo[0].getParentVO().getPk_payplan());
               resvo.getParentVO().setVbillcode(oldaggvo[0].getParentVO().getVbillcode());
               PrPayPlanPettyVO[] newpettys = (PrPayPlanPettyVO[]) resvo.getChildren(PrPayPlanPettyVO.class);
               List<PrPayPlanAccVO> acclist=new ArrayList<PrPayPlanAccVO>();
               for (PrPayPlanPettyVO newpetty : newpettys) {
                  newpetty.setStatus(1);
                  newpetty.setBisnewline(UFBoolean.FALSE);
                  newpetty.setTs(new UFDateTime());
                  newpetty.setPk_payplan(oldaggvo[0].getParentVO().getPk_payplan());
                  for (String key : oldaccmap.keySet()) {
                        if(key.equals(newpetty.getVbdef1())){
                              PrPayPlanAccVO oldacc = oldaccmap.get(key);
                              newpetty.setPk_payplan_petty(oldacc.getPk_payplan_b());
                              PrPayPlanAccVO[] newaccs = (PrPayPlanAccVO[])newpetty.getGrandsonVO();
                              for (PrPayPlanAccVO prPayPlanAccVO : newaccs) {
                                 prPayPlanAccVO.setPk_payplan(oldacc.getPk_payplan());
                                  prPayPlanAccVO.setPk_payplan_b(oldacc.getPk_payplan_b());
                                  prPayPlanAccVO.setPk_payplan_acc(oldacc.getPk_payplan_acc());
                                  prPayPlanAccVO.setTs(new UFDateTime());
                                  prPayPlanAccVO.setStatus(0);
                          }
                        }
                   }
                 
                  PrPayPlanAccVO[] newaccs = (PrPayPlanAccVO[]) newpetty.getGrandsonVO();
                  for (PrPayPlanAccVO prPayPlanAccVO : newaccs) {
                     acclist.add(prPayPlanAccVO);
                }
              }
               //根据老数据为新的数据赋值-------end---------
               PrPayPlanAccVO[] array = new PrPayPlanAccVO[acclist.size()];
               for (int i = 0; i < acclist.size(); i++) {
                  array[i]=acclist.get(i);
              }
               resvo.setChildren(PrPayPlanAccVO.class,array);
               
               AggPrPayPlanVO[] vos = ((IPrPayPlanMaintain)NCLocator.getInstance().lookup(IPrPayPlanMaintain.class)).update(new AggPrPayPlanVO[] { resvo},oldaggvo);
               vopk = vos[0].getPrimaryKey();
//             throw new BusinessException("目前此单据不支持更新");
         } else {
             Logger.info("如果此单据没有导入过,保存新单据...");
             PrPayPlanVO parentVO = resvo.getParentVO();
             
             AggPrPayPlanVO[] vos = ((IPrPayPlanMaintain)NCLocator.getInstance().lookup(IPrPayPlanMaintain.class)).insert(new AggPrPayPlanVO[] { resvo});
             vopk = vos[0].getPrimaryKey();
             
             //提交并启动审批流
            AggPrPayPlanVO[] newaggvo = lookup.queryBillByPK(new String[]{vopk});
             IPFBusiAction ipf = (IPFBusiAction)NCLocator.getInstance().lookup(IPFBusiAction.class);
             AggPrPayPlanVO[] processAction = (AggPrPayPlanVO[]) ipf.processAction("SAVE", "H550", null,newaggvo[0], null, null);//动作,单据类型,null,vo,null,null
              
             //6.如果希望单据将来可以更新,请调用下列接口插入文档流水号与生成PK的对照关系
             //  第2步查询对照关系相对应,也有两个个方法,具体请看javadoc
             //1)PfxxPluginUtils.addDocIDVsPKContrast(swapContext.getBilltype(),swapContext.getDocID(),pk);
             //2)PfxxPluginUtils.addDocIDVsPKContrast(swapContext.getBilltype(),swapContext.getDocID(),swapContext.getOrgPk(),pk);
                              
             PfxxPluginUtils.addDocIDVsPKContrast(swapContext.getBilltype(), swapContext.getDocID(), vopk);
         }
          //7.准备返回值,此函数的返回值,最终会以字符串的形式返回给外系统,
         //  对于普通单据可以返回NC系统生成的PK值,对于凭证可能返回凭证号,具体视单据而定
         //  对于查询插件要求返回org.w3c.dom.Node[]数组 或者org.w3c.dom.Node
         return vopk;
      }
     
    
}
二、联调测试:

涉及的类:

nc.bs.cmp.pfxx.CMPPlugin

nc.bs.bd.pfxx.translator.AccessorTranslator

nc.vo.pfxx.util.PfxxPluginUtils      

报文说明:

<?xml version="1.0" encoding='UTF-8'?>  
<!-- billtype属性,单据类型   isexchange属性是否使用信息交换平台提供的翻译转换和校验功能  
    replace属性表示该文档已经正确的受到过并正确 处理过时是否进行覆盖处理 
 operator属性指定当前发送方对应的nc操作员pk   sender属性外系统编码,4位长 -->          
<ufinterface  billtype="supplier"   isexchange="Y"  replace="Y"  proc="delete" sender="001" operator="1001B110000000000016">
    <!--id 数据唯一值,第一次新增,第二次可更新,字符或数字,不能超过30位-->
    <bill id="113123">
        <billhead>
            <!--供应商编号,最大长度为40,类型为:String-->
            <code>113123</code>
            <!--供应商名称,最大长度为200,类型为:String-->
            <name>224123</name>
             <!--纳税人识别号,最大长度为20,类型为:String-->
            <taxpayerid>22222123</taxpayerid>
             <!--供应商基本分类,最大长度为20,类型为:String-->
            <pk_supplierclass>0101</pk_supplierclass>
        </billhead>
    </bill>
</ufinterface>

涉及的表:

//辅助信息详细信息
select * from NC65ZS.XX_AUXIREGISTER;
//基础数据对照
select * from NC65ZS.XX_BDCONTRA;
//基础数据详细对照
select * FROM NC65ZS.XX_BDCONTRA_B;
//外部 系统信息
select * from NC65ZS.XX_EXSYSTEM;
//基础档案翻译器信息
select * from NC65ZS.XX_EXSYSTEMDOC;
//id对照表
select * from NC65ZS.XX_IDCONTRAST;
//翻译器
select * from NC65ZS.XX_TRANSLATOR where XX_TRANSLATOR.PK_TRANSLATOR='1001Z01000000000R5MN';
//详细日志
select * from NC65ZS.XX_XLOG;
//辅助信息基本信息
select * from NC65ZS.XX_XSYSREGISTER;
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Kepopc 工业互联网数据交换平台 v2.4.9 是一款面向制造业和工业生产领域的云平台,主要用于数据采集、传输、分析和存储。该平台提供了实时性高、扩展性强等特点,使得企业能够更好地管理和监控生产流程,提高生产效率和质量控制。 Kepopc 工业互联网数据交换平台 v2.4.9 支持多种数据采集方式,包括 OPC UA、Modbus RTU、Modbus TCP、OPC DA、Ethernet TCP/IP 等。同时,该平台也支持多种数据格式和协议,包括 JSON、XML、CSV、MQTT、DDS 等。这些特性使得平台可以自由地与不同类型的设备和软件进行对接,实现数据的集成化和共享化。 平台提供了可视化的配置工具,使得用户可以自定义数据采集和数据分析的条件和规则。它还提供了 AI 分析模块,通过机器学习技术可以预测设备的故障和维护周期,提高断点维护和预防性维护的效率和准确性。 为了保证数据的安全性,平台采用了多层次的安全措施,包括数据传输加密、用户身份验证、IP 地址限制等。这些措施能够确保数据传输过程中不被窃取或篡改,保证企业数据的安全。 总的来说,Kepopc 工业互联网数据交换平台 v2.4.9 是一款功能强大、安全可靠的工业互联网平台,可以帮助企业实现智能化管理,提高生产效率和质量控制水平,推动企业数字化转型。 ### 回答2: Kepopc工业互联网数据交换平台v2.4.9是一种基于物联网技术的数据交换平台,主要应用于制造业、物流业等领域。它可以实现设备间的信息传输和数据交换,使不同设备之间的数据实现共享。同时,Kepopc工业互联网数据交换平台v2.4.9还可以将物联网数据集成到企业级信息系统中,从而实现系统之间的数据交互和集成。 该平台具有高度可扩展性,可以适应不同行业和不同企业的需求。它支持多种通信协议和数据格式,包括OPC UA、Modbus、MQTT等,可以实现不同设备的互联互通。此外,它还提供了丰富的数据分析和处理功能,可以帮助企业对数据进行分析和挖掘,并生成相关报告和分析结果。 Kepopc工业互联网数据交换平台v2.4.9采用了先进的安全技术和隐私保护措施,可以确保数据传输和储存的安全性和可靠性。同时,它还提供了高效的数据管理和监控功能,可以实时监测设备的运行状态和数据变化,及时预警和处理数据异常情况。 综上所述,Kepopc工业互联网数据交换平台v2.4.9是一种功能强大、安全可靠的物联网技术平台,可以帮助企业实现设备间的互联互通和数据共享,提高企业生产效率和经济效益。 ### 回答3: kepopc工业互联网数据交换平台v2.4.9是一款专业的工业互联网数据交换平台。该平台通过物联网技术,将工业设备、生产数据、企业管理等数据相互连接,实现了工业数据的共享和交换平台具有高效、稳定、安全、易用等特点,可实现数据的实时交换和传输,帮助企业优化生产流程,提高生产效率,降低生产成本。 kepopc工业互联网数据交换平台v2.4.9支持多种数据传输协议和格式,能够对不同类型的设备、数据进行兼容,实现了设备互联互通。同时,该平台提供高效的数据存储和分析功能,可以对大量数据进行收集、处理和管理,并通过数据分析算法提供合理的生产指导和决策建议。 该平台还可以实现多种级别和领域的数据交换和共享,包括供应链数据、领导者数据、行业数据等,实现了企业内部和外部的数据沟通与合作。 总之,kepopc工业互联网数据交换平台v2.4.9是一款功能强大、稳定可靠、易用性高的工业互联网数据平台,能够为生产企业提供全方位的数据支持和决策指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值