苍穹引入插件BatchImportPlugin重写保存方法原创
金蝶云社区-蒋经东
蒋经东
3人赞赏了该文章 1,228次浏览 未经作者许可,禁止转载编辑于2023年09月11日 17:53:39

关于苍穹的引出引入插件,单纯的重写自带拓展方法不能满足特殊需求,做了特殊二开定制化


需求:先对列表数据做引出,再这个引出的excel上,修改:”快递公司,快递单号,产品编码“三个值,再用此excel引入

实现方式:

1、单据列表跟正常的单据列表不一样,是配置了一张视图,因为数据是从多个表汇集起来的

2、能用苍穹自带的引出功能(按列表数据引出),也可以按照引入模板引出,需配置一个引入模板

3、根据excel手工填好的”快递公司,快递单号,产品编码“,更新到具体表中


产生问题:

       苍穹自带的引入功能无法正常使用,因为单据列表是一张视图,试图是无法插入和更新的,所以需求的三个值,也无法更新到试图的基础表中


故需要使用插件BatchImportPlugin重写save方法

1、读取excel里面的记录

2、取出”快递公司,快递单号,产品编码“三个值的具体值

3、手动写SQL语句,把三个值更新到具体的表中


界面如图:是一个视图

image.png


实现方式:

1、根据单据列表,配置一个引入模板

image.png


2、单据列表配置引出方式:选择“引出数据(按引入模板)”,操作方式1到5方式配置,注意不要勾选按列表引出,因为勾中就不会使用引入模板,会按照列表字段引出

image.png


3、此时导出的excel格式如下:

     (重要)因为引入的模板需要有1,2,3行的表头格式,如果没有的话,是不能引入的(反复测试发现的规律,可能可以去掉,但是没仔细研究源码,哪位大佬知道可以告知

image.png


4、填写好这三个字段

image.png


5、配置引入插件

        先选中引入按钮,配置引入importdata引入数据(这个是苍穹自带的,不需要更改)

        配置一个java插件,并继承BatchImportPlugin,重写save方法

image.png

image.png

image.png


6、编写读取excel行的值代码,和更新数据库代码(更新数据库属于是基础的CRUD,此处就不贴了)

for (int i = 0; i < rowdatas.size(); i++) {
    //这个是读取excel行记录的核心
    ImportBillData importBillData = rowdatas.get(i);
    JSONObject data = importBillData.getData();

    //取值,把excel对应的字段编号填入即可,如:快递公司
    String company = data.getString("kdmk_fexpressagecompany");
    
    .......省略插入sql代码,比较简单,不做说明
}


7、(重要)更新完数据库之后,有一个要注意的地方,就是要填充save方法的返回值ApiResult

// ApiResult是一个通用类,需要研究一下具体的填充值的方式,因为它代表着引入的后续提示,成功,失败等,必须填充,具体可以研究一下源码

//此处是我使用的方式:
Map<String, Object> billResult = Maps.newHashMap();

//第i行是成功的
billResult.put("dindex", i);

//成功标识,如果是失败异常的,可以填false
billResult.put("success", true);


//失败的对象,主要用来提示第几行出现什么异常
OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
operateErrorInfo.setMessage(msg);

//失败时候的data对象,成功可以不填
if (operateErrorInfo != null) {
    billResult.put("data", Lists.newArrayList(operateErrorInfo));
}
billResults.add(billResult);

//最后将billResult放到通用类中

//导入成功
ApiResult.success(billResults);

//导入失败
ApiResult.fail(billResults);


8、引入效果:

     第一栏的三个选项可以无视,第二栏可以下载配置的引入模板,第三栏上传excel

     引入后,结果会有提示,成功的记录不会有信息提示,失败的消息会提示出OperateErrorInfo类设置的msg信息

image.png

image.png

image.png


还有很多细节是没有摸透的,还需更进一步的研究一下流程和源码,如有不正确,各位大佬可以提出,一起学习!

赞 3