上篇文章讲了IT设备信息表的导入接口的思路,这篇文章趁热打铁,把IT维修记录表的导入接口的思路给说一下。
首先我们要知道IT维修记录表的数据是什么来的?这个问题必须要搞懂,不搞懂的话对接下来的思路其实是不利的。IT维修记录表的每一行数据都是一个设备的维修记录,而一个设备是可以维修多次的,证明IT维修记录表存的是所有设备的维修记录,且一个设备可以在IT设备维修表中有多行数据。
搞懂了这个之后,那就好办了,我们就不用像IT设备信息表的导入接口那样,做一堆的判断,我们直接就将excel中的数据导入到IT维修记录表中即可。
@SneakyThrows@ApiOperation(value = "导入维修记录")@PostMapping("/uploadDevice")public Result uploadDevice(@RequestParam("file") MultipartFile file, @RequestParam("extraCheck") boolean extraCheck) {//必要校验final StringBuffer sb = new StringBuffer();//额外校验的校验结果final StringBuffer extra = new StringBuffer();final List<ItMaintenanceRecordsData> cacheDataList = new ArrayList<>(8);EasyExcel.read(file.getInputStream(), ItMaintenanceRecordsData.class, new ReadListener<ItMaintenanceRecordsData>() {int index = 1;private Map<String, Integer> map = new HashMap<>(8);@Overridepublic void invoke(ItMaintenanceRecordsData data, AnalysisContext analysisContext) {try {index++;// 校验参数是否合法ValidateUtil.validate(data);map.put(data.getDeviceCode(), index);cacheDataList.add(data);} catch (ValidationException e) {sb.append("第").append(index).append("行参数有误:").append(e.getMessage()).append(System.getProperty("line.separator"));} catch (Exception e) {log.error("数据导入异常", e);sb.append("第").append(index).append("行参数有误:").append("数据异常").append(System.getProperty("line.separator"));}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}).sheet().doRead();if (sb.length() > 0) {cacheDataList.clear();//停止导入return Result.fail(sb.toString());}if (extraCheck && extra.length() > 0) {cacheDataList.clear();return Result.success(extra.toString());}//数据导入for (ItMaintenanceRecordsData data : cacheDataList) {itMaintenanceRecordsService.importItMaintenanceRecords(data);}return Result.success(sb.toString());}
如果你有兴趣,可以翻看我上篇写IT设备信息表导入接口的文章,你会发现我的导入接口少了对数据进行重复性判断,因为IT维修记录表是重复也可以插进去的,这就是为什么我一开始说要把这张表的数据是怎么存的搞懂。
importItMaintenanceRecords方法是这样的:
首先还是将excel中的数据转换成entity,然后看看有没有通用参数需要转换,如果不需要转换的话基本就完成了。但是现在这里有一个问题,因为IT维修记录表中的it_device_id没有数据,所以要对这个字段进行手动赋值,赋值的代码看上面。其实就是通过设备编码找到这个设备的设备id,然后把设备id赋值到it_decice_id中。
至此,导入接口就写完了。
其实纵观整个思路,你会发现excel中的数据和最后数据库存的数据差别其实很大,比如说excel中的数据是“在保”,而数据库中是用“0”来存储的;再比如说,excel中可能有3个字段,但是数据库中有5个字段,那剩下那两个字段就要自己手动想办法去赋值了,这是导入接口最难最难的一点。只要把这个写到位了,基本这个导入接口就完成了95%了。