用友 NC65 参照开发、应用实践思路整理与分享
参照开发基础知识参考上一篇文章:用友 NC65 参照开发常用知识总结
需求背景与分析
我们收到的参照需求是这样的:在采购模块下的一个节点单据中新增一个字段,该字段不与具体元数据关联,仅给用户提供库存数量相关参照选择用。该参照需要关联的数据表是一个新建的数据库视图,原来的系统中没有相关实体存在。
由此分析,我们需要做的事情有两部分,参照开发和参照部署。
需要开发的工作就只有一个表型参照类,由此看来这个开发需求很简单。该需求还有另一个依据表头某字段进行更新过滤的要求,我们放在编辑事件的内容中去讲。
那么捋清需求便可以开始动笔了。
定位功能节点
首先在NC系统的“动态建模平台 - 开发配置 - 功能注册”节点下找到用户需求所在功能节点,本例中的节点存在于“物资管理 - 采购管理”模块下。点开客户需求所在节点,查看参数注册:
参数名称 | 参数值 |
---|---|
BeanConfigFilePath | nc/ui/pu/m422x/config/storereq_config.xml |
PluginBeanConfigFilePath_Industry0_tempsave | nc/ui/pu/m422x/config/storereq_tempsave_config.xml |
transtype | 422X-02 |
由此,我们可以确定该需求在nc.ui.pu.m422x
这个包下面,接下来启动测试环境下的开发环境,定位到该节点,拉取该部分代码,查看类名和有关功能的开发命名规范、包类别规范作为开发参考,然后可以开始开发工作。
当然,在开始开发共工作之前,我们要把需求提到的数据库视图在测试环境中建立起来,便于后续测试。
参照开发
参考表型参照抽象类,新建的表型参照类也应按照<xxx>RefModel
的形式命名,我们新建的这个参照位于库存管理下,是关于仓库的参照,故将其命名为nc.ui.ic.ref.model.StoreReqRefModel
。
在本例中没有用到where字段的方法,但事实上没有使用where的情况下也建议重写setWherePart
并置为空。后续在实现编辑事件时在编辑事件中使用了addWherePart
方法。
package nc.ui.ic.ref.model;
import nc.ui.bd.ref.AbstractRefModel;
import nc.vo.pu.creditbalance.StoreReqRefVO;
public class StoreReqRefModel extends AbstractRefModel {
// 构造函数,初始化时调用reset方法
public StoreReqRefModel() {
reset();
}
/**
* 重置模型的方法,用于设置引用模型的各种属性。
* 这个方法在对象创建时调用,以确保模型被正确初始化。
*/
@Override
public void reset() {
// 设置模型字段代码数组,这些代码对应数据库中的字段名
setFieldCode(new String[] {
StoreReqRefVO.CODE, // 物料编码字段代码
StoreReqRefVO.NAME, // 物料名称字段代码
StoreReqRefVO.DVALIDATE, // 失效时间字段代码
StoreReqRefVO.BRANDNAME, // 品牌字段代码
StoreReqRefVO.SHORT_NAME, // 简称字段代码
StoreReqRefVO.WAREHOUSE // 仓库字段代码
});
// 设置模型字段名称数组,这些名称用于界面显示
setFieldName(new String[] {
"物料编码", // 对应StoreReqRefVO.CODE
"物料名称", // 对应StoreReqRefVO.NAME
"失效时间", // 对应StoreReqRefVO.DVALIDATE
"品牌", // 对应StoreReqRefVO.BRANDNAME
"简称", // 对应StoreReqRefVO.SHORT_NAME
"仓库" // 对应StoreReqRefVO.WAREHOUSE
});
// 设置模型所关联的表名,这里是结存视图
setTableName("jc_view_allstore");
// 设置模型的主键字段代码
setPkFieldCode(StoreReqRefVO.PK_CREDIT_BALANCE);
// 设置模型引用代码字段
setRefCodeField(StoreReqRefVO.PK_CREDIT_BALANCE);
// 设置模型引用名称字段
setRefNameField(StoreReqRefVO.NAME);
// 设置模型默认显示的字段数量
setDefaultFieldCount(6);
resetFieldName();
}
/**
*参照标题
*/
@Override
public String getRefTitle() {
return "结存参照";
}
/**
*设置不显示参照:这里的
*/
@Override
public String[] getHiddenFieldCode() {
return new String[] { StoreReqRefVO.PK_CREDIT_BALANCE, StoreReqRefVO.PK_MATERIAL, StoreReqRefVO.PK_WAREHOUSE};
}
/**
*按照物料编码和失效日期排序
*/
public String setOrderPart(){
return " order by materialcode, dvalidate";
}
/**
*获取主键字段,必要
*/
@Override
public String getPkFieldCode() {
return StoreReqRefVO.PK_CREDIT_BALANCE;
}
}
参照部署注册
参照开发完成后,还需要在NC系统的模板中为其添加显示字段,以最终实现需求所描述的效果。我们打开NC系统的“模板设置-集团”,同样找到需求所在的功能节点,选择要更改的子模板或新建(复制)一个模板作为要分配给用户的带参照模板。
打开要编辑的模板,右键表体,选择“增加自定义项目”,并填写项目主键。新建的字段默认类型为字符,我们需要选中该字段,并将其类型修改为参照,然后在类型设置中勾选自定义参照,并编辑自定义参照类名,如下:
完成设置后,记得保存模板,退出该节点后进入我们设置的新节点。如果是新建的模板还要将其分配给指定用户或设为默认模板。
接下来我们便可以在模板中对参照效果进行验证了:
文末的吐槽
我到时候一定还要根据这段时间的开发经历但写一篇文章,就算这样我也要在这里吐槽一下,因为这个开发经历的槽点实在是太多了。
像本文这样的小需求,不过十分二十分钟就能开发并且测试完成,但是对我来说却经历了一个非常痛苦的过程,包括其它我解决的很多需求也是这样。因为到了二开这个地步,产品文档不完善、没有开发资料,哪怕我再能再行也不能瞬间理解产品结构。在刚开始的一周里,我有80%的时间都花在了定位功能节点、定位包名、查找系统参考代码等等这些事情上,28定律了属于是。
而且没有一个成体系的东西可以指导开发入门,一切都得靠自己摸索,甚至红皮书什么的,很多资料都是上网搜的,这实在是太不符合我对企业开发的想象了。需求量少的情况下还好,如果区域想要建设成体系的、成规模的开发体系,这样万万不可啊。