NC57收付款结算单拉建筑行业收付款申请

踩坑

付款申请单VO对照有问题,需要改正,在客户化>二次开发工具>单据管理>VO对照管理中将包名jzpr都改成jzinv,否则PfUtilClient获取信息出错无法拉单。
数据表jzinv_pr_payapp_invvlastbilltype字段的类型有问题,CHAR(20)导致单据类型补了大量空格,追溯的时候出问题,需要执行SQL修复。

update jzinv_pr_payapp_inv set VLASTBILLTYPE = trim(VLASTBILLTYPE);

配置流程

客户化>二次开发工具>流程配置>数据交换管理中,为D5付款结算单添加上游单据99VB建筑行业付款申请单。

拉单查询

需要为上游单据类型配置参照查询类RefclassFor99VB,SQL语句如下:

UPDATE "BD_BILLTYPE" SET "REFERCLASSNAME" = 'nc.bs.jzinv.refer.RefclassFor99VB', "WHERESTRING" = '1=1' WHERE "PK_BILLTYPECODE" = '99VB';

在查询类中,需要实现表头查询和表体查询:

public class RefclassFor99VB extends HYSuperDMO implements IQueryData,IQueryData2 {
    public CircularlyAccessibleValueObject[] queryAllHeadData(String whereString)
            throws BusinessException {
        return queryAllHeadData(PayapplyVO.class, whereString);
    }
    public CircularlyAccessibleValueObject[] queryAllBodyData(String key)
            throws BusinessException {
        return queryAllBodyData(key, null);
    }
    public CircularlyAccessibleValueObject[] queryAllBodyData(String key,
            String whereString) throws BusinessException {
        // 这个拉单不需要表体,设个空的即可
        return new PayapplyInvVO[] {new PayapplyInvVO()};
    }
}

单据转换规则

NC6系列的单据转换规则都可以在界面上配置,5系列应该也可以,但是没找到配置的方法,直接根据系统报错提示手写转换类,写完之后可以在单据转换规则里看到映射关系。
转换类分为前端和后端两种,内容都是一样的,只不过继承的类不一样,前端继承nc.ui.pf.change.VOConversionUI,后端继承nc.bs.pf.change.VOConversion。可以参考系统其他的转换类,名称大抵如CHG99VBTOD5这种格式。由于不知道具体需要映射哪些字段,只能根据系统报错和业务流程一个个去尝试。

    // 付款结算拉付款申请99VB
    public String[] getField() {
        return new String[] { "H_dwbm->H_pk_corp", "B_dwbm->H_pk_corp",
                "H_bbje->H_napprepmny", // 表头本币
                "H_ybje->H_nappreporigmny", // 表头原币
                "B_ddlx->H_pk_payapply", // 上层来源单据id
                "B_jsfsbm->H_pk_billtype", // 上层来源单据类型
                "B_jfbbje->H_nappreporigmny",// 表体原币
                "B_ybye->H_nappreporigmny", "H_jfybje->H_napprepmny",// 表体本币
                "B_jfybje->H_napprepmny",// 表体本币
                "B_bbye->H_napprepmny", "B_jfybwsje->H_napprepmny", // 
                "B_wbfbbje->H_napprepmny", // 
                "H_hbbm->H_pk_cusbasdoc", // 客商->收款单位,塞进去了但是没用
                "B_hbbm->H_pk_cusbasdoc", // 表体也要塞,否则无效H_pk_cusmandoc
                "B_pk_trader->H_pk_cusbasdoc" };
    }

    public String[] getAssign() {
        return new String[] { "H_pzglh->2", "H_djdl->fj", "H_djlxbm->D5",
                "B_bzbm->00010000000000000001", // 表头币种
                "H_bzbm->00010000000000000001", // 表头币种
                "B_bzmc->00010000000000000001", // 表体币种
                "H_tradertype->0", // 交易对象类型,客商
                "B_tradertype->0", "H_xslxbm->0001Z31000000000FQZT" // 委托付
        };
    }

    public String[] getFormulas() {
        return new String[] { "H_djrq->date()",
                "B_dfyhzh->getColValue(bd_custbank, pk_accbankA, pk_cubasdoc, H_pk_cusbasdoc)" };
    }

    // 收款结算拉收款申请99VA
    public String[] getField() {
        return new String[] { "H_dwbm->H_pk_corp", "B_dwbm->H_pk_corp",
                "H_bbje->H_ninbasemny", // 表头本币
                "H_ybje->H_ninoriginmny", // 表头原币
                "B_ddlx->H_pk_in", // 上层来源单据id
                "B_jsfsbm->H_pk_billtype", // 上层来源单据类型
                "B_dfbbje->H_ninoriginmny",// 表体原币
                "B_ybye->H_ninoriginmny", "H_dfybje->H_ninbasemny",// 表体本币
                "B_dfybje->H_ninbasemny",// 表体本币
                "B_bbye->H_ninbasemny", "B_jfybwsje->H_ninbasemny", // 
                "B_wbfbbje->H_ninbasemny", // 
                "H_hbbm->H_pk_paycubasdoc", // 客商->收款单位,塞进去了但是没用
                "B_hbbm->H_pk_paycubasdoc", // 表体也要塞,否则无效H_pk_cusmandoc
                "B_pk_trader->H_pk_paycubasdoc" };
    }

    public String[] getAssign() {
        return new String[] { "H_pzglh->2", "H_djdl->sj", "H_djlxbm->D4",
                "B_bzbm->00010000000000000001", // 表头币种
                "H_bzbm->00010000000000000001", // 表头币种
                "B_bzmc->00010000000000000001", // 表体币种
                "H_tradertype->0", // 交易对象类型,客商
                "B_tradertype->0", "H_xslxbm->0001Z31000000000FQZS" // 委托收
        };
    }

    public String[] getFormulas() {
        return new String[] { "H_djrq->date()",
                "B_dfyhzh->getColValue(bd_custbank, pk_accbank, pk_cubasdoc, H_pk_paycubasdoc)" };
    }

拉单按钮

不知道财务模块的按钮是在哪里配置的,debug发现按钮在nc.ui.ep.dj.CMPFiFlowPanel中组装,于是在getDjButtons()方法中动态添加了按钮。

if (("20040320".equalsIgnoreCase(nodecode))) {
    ButtonObject[] btns = m_boAdd.getChildButtonGroup();
    boolean isExists = false;
    for (ButtonObject btn : btns) {
        if ("参照收款单".equals(btn.getCode())) {
            isExists = true;
        }
    }
    if (!isExists) {
        m_boAdd.addChildButton(new ExtButtonObject("参照收款单", "参照收款单", "参照收款单"));
    }
}
if (("20040321".equalsIgnoreCase(nodecode))) {
    ButtonObject[] btns = m_boAdd.getChildButtonGroup();
    boolean isExists = false;
    for (ButtonObject btn : btns) {
        if ("参照付款申请单".equals(btn.getCode())) {
            isExists = true;
        }
    }
    if (!isExists) {
        m_boAdd.addChildButton(new ExtButtonObject("参照付款申请单", "参照付款申请单", "参照付款申请单"));
    }
}

初始化的时候添加了按钮,但是界面如果刷新了,按钮就会消失,经过研究发现nc.ui.ep.dj.FiFlowPanelupdateLocalButtons()方法会从缓存中重新获取按钮,而动态添加的两个按钮在缓存中并不存在,所以更新的时候还需要重新添加。

if ("D5".equals(billtype)) {
    PfFlowBtnInfo add99VB =  new PfFlowBtnInfo();
    add99VB.setBtnTag("99VB:");
    add99VB.setShowName("参照付款申请单");
    addbtnlist.add(add99VB);
} else if ("D4".equals(billtype)) {
    PfFlowBtnInfo add99VA =  new PfFlowBtnInfo();
    add99VA.setBtnTag("99VA:");
    add99VA.setShowName("参照收款单");
    addbtnlist.add(add99VA);
}

最后是添加按钮事件,这个简单,在nc.ui.ep.dj.FiFlowPanelonButtonClicked()方法中写入逻辑即可。

if ("参照付款申请单".equals(bo.getCode())) {
    bo.setTag("99VB:");
    skipCaculate = true;
    PfUtilClient.childButtonClicked(bo, this.getCurrentCorp(), this.getNodeCode(), this.getDjSettingParam().getPk_user(), "D5", this);
} else if ("参照收款单".equals(bo.getCode())) {
    bo.setTag("99VA:");
    skipCaculate = true;
    PfUtilClient.childButtonClicked(bo, this.getCurrentCorp(), this.getNodeCode(), this.getDjSettingParam().getPk_user(), "D4", this);
} else {
    PfUtilClient.childButtonClicked(bo,this.getCurrentCorp(),this.getNodeCode(),this.getDjSettingParam().getPk_user(),
            getDjDataBuffer().getCurrentDjlxbm(),this);
}

单据追溯

付款结算拉付款申请99VB还好,付款申请单保留了来源单据,能继续往上追溯。但是收款结算拉收款申请99VA,收款申请并没有保留来源单据信息,用财务模块默认的追溯类无法继续往上追溯,只能想办法在财务模块调用建筑模块的追溯类。
在财务的联查按钮nc.ui.arap.actions.RelatedQueryActionrelatedQueryBackOrNextDj()方法中,使用自定义的联查类代替系统默认的。

SourceBillFlowDlg dlg = new SourceBillFlowDlg(this.getParent(),CMPCustomBillFinderFor99VA.class.getName(), head
        .getDjlxbm(), head.getVouchid(), head.getDjbh());

自定义查询类的代码如下,只是判断一下单据类型,如果追溯99VA的话就使用相应的查询类nc.bs.jzinv.pub.billsource.datafinder.PayReceiveMnyDataFinder

import nc.bs.jzinv.pub.billsource.datafinder.PayReceiveMnyDataFinder;
import nc.bs.pf.pub.PfDataCache;
import nc.bs.pub.pf.PfUtilTools;
import nc.vo.pf.change.PfUtilBaseTools;
import nc.vo.pub.billtype.BilltypeVO;

public class CMPCustomBillFinderFor99VA extends BillTypeSetBillFinder {
    
    @Override
    public IBillDataFinder createBillDataFinder(String billType) throws Exception {
        billType = PfUtilBaseTools.getRealBilltype(billType);
        BilltypeVO type = PfDataCache.getBillType(billType);
        if(type == null)
            return  new NullDataFinder();
        IBillDataFinder finder = null;
        String datafinderclassname = type.getDatafinderclz();
        if(datafinderclassname != null) {
            finder = (IBillDataFinder) PfUtilTools.instantizeObject(billType, datafinderclassname);
        }else if(type.getForwardbilltype() != null) {
            finder = new BillTypeSetDataFinder();
            if ("99VA".equals(billType)) {
                // 跨模块调用报错ClassNotFoundException,需要复制对应class到补丁中
                finder = new PayReceiveMnyDataFinder();
            }
        }
        else
            finder = super.createBillDataFinder(billType);
        return finder;
    }
}

你可能感兴趣的:(NC57收付款结算单拉建筑行业收付款申请)