概述
内容
• 单行页签和多行页签实体的建立
• 数据源导入模板的配置
• 代码逻辑的编写
预期目标
• 掌握数据源导入的基本原理
• 能够实现自定义的数据源导入
单行页签和多行页签实体的建立
一、单行页签实体的建立
对于单行页签的建立,新建实体的时候父实体选择:com.kingdee.eas.hr.base.app.EmpInfoSinglePage
二、多行页签实体的建立
对于多行页签的建立,新建实体的时候父实体选择:com.kingdee.eas.hr.base.app. EmpInfoMultiPage
原因
• 多行页签父类里面有多行页签共有校验逻辑,继承多行页签无需重写这些逻辑,能够与标准产品逻辑保持一致。
• 单行页签父类虽然没有加校验逻辑,但是以后是可能填加的,继承它,可以保证与标准产品逻辑保持一致。
说明
• 本节我们以多行页签实体导入为例,多行页签实体的导入逻辑包含单行页签,掌握了多行页签导入的话,单行页签的逻辑就很简单了,单行页签这里不在详细讲解。
三、字段添加
一、为了方便讲解,在PersonMultiDemo实体上添加了几个字段,如下图所示:
二、com.kingdee.shr.custom.app.R_PersonMultiDemo_Occupation实体关系如下:
数据源导入模板的配置
说明
• 字段添加完成以后,实体导出表,以及实体校验发布和导出sql语句前面老师已经讲过,这里不再详细讲解,实体发布,相关表建好以后,下面说明一下数据源导入模板的配置。
• 数据源导入与实体导入的原理是不一样的,数据源导入是基本结构配置和查询配置实现的,因此在配置数据源模板之前,我们首先需要配置结构配置和查询配置。
一、结构配置
注意:实体继承com.kingdee.shr.base.syssetting.app.SHRBaseItem的,结构配置中的基础数据必须勾选为是
二、查询配置
首先需要在查询配置列表界面增加一个新的信息集
点击图中创建按钮出现查询配置信息集界面
注意新增字段的时候要注意一下字段对应的实体是否正确,点击保存按钮,查询配置完成。
三、模板配置
四、新建实现类
模板配置完成以后,就可以在对应的uipk页面下载模板,如下图所示:
点击其他信息导入,会弹出导入任务窗口,如下图所示:
点击图中的模板下载按钮,会列出与该页面uipk绑定的已经启用的模板,如下图所示:
点击图中的配置的多行页签演示模板下载,会报错,如下图所示:
图中的报错很容易理解,我们没有对应的实现类,因此需要新建一个实现类。
打开eclipse,按照模板配置的实现类新建,如下图所示:
注意:实现继承平台com.kingdee.shr.base.syssetting.app.io.fileImport.BaseImportService,点击图中按钮,如图所示:
在父类选择框选择对应的实现类,点击OK,然后点击Finish,新建类完成。
补充说明:实现类新建以后,重启服务,下载模板已经没有问题。关于数据源导入,模板下载逻辑无需编写,平台逻辑已经满足需求。我们只要讲解导入的编写逻辑。
代码逻辑的编写
一、复写基类的数据源导入方法。
数据源导入我们首先需要复写平台的数据源导入方法。
说明
• 基类的importDataSource(BaseRowInfo row)方法不满足要求,这里我们需要复写。
• DynamicModelHelper大家需要注意其全路径,import类的时候会看到两个名称一样的类,需要 import com.kingdee.shr.base.syssetting.app.io.fileImport.DynamicModelHelper,不要搞混。
• DynamicModelHelper是数据源导入的主要逻辑处理类,其作用有:
(1) 根据导入模板表格信息拿到全部涉及实体信息。
(2) 根据实体信息判断当前导入类型【多行导入、单行导入】。
(3) 若涉及多行导入时,若主实体是员工,则根据员工配的置主键查询是否存在,若不存在则导入结束。
(4) 根据模板配置主键字段去数据库中查找已存在对象实体;若是选择更新导入,但有实体未查找到,则此行导入结束;若新增导入时,若实体查找到不为空,则提示错误,导入结束;新增导入时,创建空对象实体。
(5) 将上一步的处理得出的实体与导入行填写数据进行赋值。
(6) 将需要保存的实体返回给业务领域,由业务领域处理保存逻辑
二、设置主实体ID
说明
• 根据员工编码和员工名称获取PersonInfo对象的代码相对容易理解,但是需要注意的是BaseRowInfo对象获取员工编码和员工名称值的方法。
• helper.setCurrentBillid(personInfo.getId().toString())设置主实体ID是非常关键的一步,001数据源导入是以person为主实体的,这里需要设置主实体ID,跟设置的主键一起用于确定更新多行页签的哪一条数据。
三、获取要保存的实体对象,调用保存方法
说明
• model.getSaveModelMap()返回的是一个map集合,key为String类型,value为 IObjectValue类型,可以根据key值获取对应的对象,key为实体全名称。
• saveModelDatas(model)是父类的保存逻辑,里面使用的是对应的实体的 controllerbean的默认保存逻辑。
四、添加自定义实体的逻辑校验
根据实体全名称从map中获取相应的对象,进行强制转换以后,就可以进行相应的逻辑校验
五、保存逻辑优化
前面几步关于数据源的导入已经基本完成,但是目前存在一个问题,数据源导入是多实体导入,导入的时候,各自调用默认的保存方法即可,这里就可以看到,多实体保存没有实物,就会导致导入的时候某些实体导入成功,某些实体导入不成功的问题。因此最后再说一下数据源导入保存逻辑添加事务的方法:
• 新建Facade。
• 改造导入逻辑。
(1)、新加Facade。
在对应路径下鼠标右键-新建,选择功能。会弹出新建功能向导,如下图所示:
填写完名称别名点击完成按钮,如下图所示:
点击图中的方法页签,为façade添加对应的方法。
下面是方法参数和方法异常的添加。下图分别为方法参数和方法异常添加按钮。
首先点击方法参数添加按钮,弹出方法参数对话框,如下图所示:
注意类型选择框没有map类型,这里手动填写全名称,其次点击方法异常添加按钮,如下图:
点击图中的选择按钮,选择相应的异常即可,这样façade添加完成,校验发布后即可开始保存方法的改造。
(2)、改造导入逻辑
根据实体名称获取对应的实体,用于调用保存方法。
自定义导入实现类引入façade的保存方法即可。
六、限制标准实体数据导入
对于标准实体的导入,最好使用预置模板上的预置实现类导入,因为预置实现类里面有一些预置的逻辑校验。限制标准标准实体导入可以有以下两方面:
• 根据实体名称限制导入 。
• 限制实体的某个字段导入。
(1)、根据实体名称限制导入
说明
• Person员工实体需要从集合中删除,关于person实体的导入,有很多逻辑在标准实现类里面,因此导入员工Person实体信息的时候不使用自定义实现类。同时这里不抛异常的原因是Person实体是主实体,抛异常的话会影响自定义实体的导入
• 对于除了Person以外的其他标准实体导入,也不建议在自定义实现类导入,这里可直接抛异常即可
(2)、限制实体的某个字段导入
问:这里限制字段导入,为什么不通过模板上的字段名称(perMultiDemo.description)来判断呢?
• 因为数据源导入的字段名称是由结构配置对象编码+查询字段设置下的字段名称组成,结构配置对象编码是变的