1. 引言
在上篇文章中,我们详细讨论了IT设备信息表的导入接口设计思路。这篇文章趁热打铁,继续探讨IT维修记录表的导入接口设计思路。
2. 理解IT维修记录表的数据来源
首先,我们需要明确IT维修记录表的数据来源。每一行数据代表一个设备的维修记录,而一个设备可以有多次维修记录。因此,IT维修记录表存储的是所有设备的维修记录,每个设备可以在表中有多行数据。
3. 导入接口的实现思路
理解了数据来源后,我们的任务就变得简单了。与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());
}
4. 数据转换与特殊处理
在导入数据时,我们需要将Excel中的数据转换为实体对象,并进行必要的参数转换。例如,Excel中的数据可能是“在保”,而数据库中存储的值是“0”。此外,Excel中的字段可能不全,需要我们手动赋值。例如,IT维修记录表中的it_device_id
字段需要通过设备编码找到对应的设备ID,并进行赋值。
importItMaintenanceRecords
方法的实现如下。
5. 深度思考
其实纵观整个思路,你会发现Excel中的数据和最终存储在数据库中的数据差别其实很大。比如说,Excel中的数据是“在保”,而数据库中是用“0”来存储的;再比如说,Excel中可能有3个字段,而数据库中有5个字段,那么剩下的两个字段就需要我们手动赋值。这是导入接口最难的一点,只要把这一点处理到位,基本上导入接口就完成了95%。