关于苍穹的引出引入插件,单纯的重写自带拓展方法不能满足特殊需求,做了特殊二开定制化
需求:先对列表数据做引出,再这个引出的excel上,修改:”快递公司,快递单号,产品编码“三个值,再用此excel引入
实现方式:
1、单据列表跟正常的单据列表不一样,是配置了一张视图,因为数据是从多个表汇集起来的
2、能用苍穹自带的引出功能(按列表数据引出),也可以按照引入模板引出,需配置一个引入模板
3、根据excel手工填好的”快递公司,快递单号,产品编码“,更新到具体表中
产生问题:
苍穹自带的引入功能无法正常使用,因为单据列表是一张视图,试图是无法插入和更新的,所以需求的三个值,也无法更新到试图的基础表中
故需要使用插件BatchImportPlugin重写save方法
1、读取excel里面的记录
2、取出”快递公司,快递单号,产品编码“三个值的具体值
3、手动写SQL语句,把三个值更新到具体的表中
界面如图:是一个视图
实现方式:
1、根据单据列表,配置一个引入模板
2、单据列表配置引出方式:选择“引出数据(按引入模板)”,操作方式1到5方式配置,注意不要勾选按列表引出,因为勾中就不会使用引入模板,会按照列表字段引出
3、此时导出的excel格式如下:
(重要)因为引入的模板需要有1,2,3行的表头格式,如果没有的话,是不能引入的(反复测试发现的规律,可能可以去掉,但是没仔细研究源码,哪位大佬知道可以告知)
4、填写好这三个字段
5、配置引入插件
先选中引入按钮,配置引入importdata引入数据(这个是苍穹自带的,不需要更改)
配置一个java插件,并继承BatchImportPlugin,重写save方法
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信息
还有很多细节是没有摸透的,还需更进一步的研究一下流程和源码,如有不正确,各位大佬可以提出,一起学习!
推荐阅读