参照开发基础知识参考上一篇文章:用友 NC65 参照开发常用知识总结

需求背景与分析

我们收到的参照需求是这样的:在采购模块下的一个节点单据中新增一个字段,该字段不与具体元数据关联,仅给用户提供库存数量相关参照选择用。该参照需要关联的数据表是一个新建的数据库视图,原来的系统中没有相关实体存在。

由此分析,我们需要做的事情有两部分,参照开发和参照部署。
需要开发的工作就只有一个表型参照类,由此看来这个开发需求很简单。该需求还有另一个依据表头某字段进行更新过滤的要求,我们放在编辑事件的内容中去讲。

那么捋清需求便可以开始动笔了。

定位功能节点

首先在NC系统的“动态建模平台 - 开发配置 - 功能注册”节点下找到用户需求所在功能节点,本例中的节点存在于“物资管理 - 采购管理”模块下。点开客户需求所在节点,查看参数注册:

参数名称参数值
BeanConfigFilePathnc/ui/pu/m422x/config/storereq_config.xml
PluginBeanConfigFilePath_Industry0_tempsavenc/ui/pu/m422x/config/storereq_tempsave_config.xml
transtype422X-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系统的“模板设置-集团”,同样找到需求所在的功能节点,选择要更改的子模板或新建(复制)一个模板作为要分配给用户的带参照模板。

打开要编辑的模板,右键表体,选择“增加自定义项目”,并填写项目主键。新建的字段默认类型为字符,我们需要选中该字段,并将其类型修改为参照,然后在类型设置中勾选自定义参照,并编辑自定义参照类名,如下:

自定义参照注册-sceunnlc.png

完成设置后,记得保存模板,退出该节点后进入我们设置的新节点。如果是新建的模板还要将其分配给指定用户或设为默认模板。

接下来我们便可以在模板中对参照效果进行验证了:

表型参照-pdeyjleu.png

文末的吐槽

我到时候一定还要根据这段时间的开发经历但写一篇文章,就算这样我也要在这里吐槽一下,因为这个开发经历的槽点实在是太多了。

像本文这样的小需求,不过十分二十分钟就能开发并且测试完成,但是对我来说却经历了一个非常痛苦的过程,包括其它我解决的很多需求也是这样。因为到了二开这个地步,产品文档不完善、没有开发资料,哪怕我再能再行也不能瞬间理解产品结构。在刚开始的一周里,我有80%的时间都花在了定位功能节点、定位包名、查找系统参考代码等等这些事情上,28定律了属于是。

而且没有一个成体系的东西可以指导开发入门,一切都得靠自己摸索,甚至红皮书什么的,很多资料都是上网搜的,这实在是太不符合我对企业开发的想象了。需求量少的情况下还好,如果区域想要建设成体系的、成规模的开发体系,这样万万不可啊。