自学内容网 自学内容网

IT维修记录表导入接口的思路

上篇文章讲了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);

            @Override
            public 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"));
                }
            }

            @Override
            public 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%了。


原文地址:https://blog.csdn.net/qq_54432917/article/details/143629458

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!