踩坑
付款申请单VO对照有问题,需要改正,在客户化
>二次开发工具
>单据管理
>VO对照管理
中将包名jzpr
都改成jzinv
,否则PfUtilClient
获取信息出错无法拉单。
数据表jzinv_pr_payapp_inv
的vlastbilltype
字段的类型有问题,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.FiFlowPanel
的updateLocalButtons()
方法会从缓存中重新获取按钮,而动态添加的两个按钮在缓存中并不存在,所以更新的时候还需要重新添加。
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.FiFlowPanel
的onButtonClicked()
方法中写入逻辑即可。
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.RelatedQueryAction
的relatedQueryBackOrNextDj()
方法中,使用自定义的联查类代替系统默认的。
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;
}
}