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;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 元数据参照同一功能模块下的其他元数据即可,属性和接口多多益善,多了可以不用,少了以后再想加就麻烦了。记得保存好建库...
    把酒对牛阅读 2,207评论 0 0
  • 中国人民银行、中国银行业监督管理委员会 ...
    3cefeff33c29阅读 996评论 0 3
  • 职场销售,免不了出差,很多人都有这样的看法,就是火车上的食物不但贵,味道还一般。所以,大多数餐车服务人员用手推车叫...
    晴宇家阅读 363评论 0 0
  • 最近,《我们不一样》这首歌火的不行,“我们不一样, 每个人都有不同的梦境,我们在这里,在这里等你~”不同的时...
    行云流水畅遨游阅读 329评论 1 0
  • 周一开始,第一节11班的课就开始破坏美妙的周末心情,一个班15+个不完成周末作业,真是生气,好在这帮家伙还是挺乖的...
    我在枣快乐呀阅读 167评论 1 3