导入excel
public void uploadExcel(MultipartFile file, String dataId) {
String filename = file.getOriginalFilename();
if (filename != null) {
String extension = filename.substring(filename.lastIndexOf(".") + 1);
if (!(extension.equals("xls") || extension.equals("xlsx"))) {
throw new EcoBootException("文件格式有误");
}
}
List<Map<String, Object>> listDatas;
List<DictModel> isNormalModels = projectUtils.getDictModelList(CHECK_ISNORMAL);
ExcelReader reader;
try {
reader = ExcelUtil.getReader(file.getInputStream());
} catch (IOException e) {
throw new EcoBootException("文件异常");
}
try {
listDatas = reader.readAll();
}catch (Exception e){
throw new EcoBootException("excel数据超出或缺失");
}
verifyExcel(listDatas, isNormalModels);
insertToDb(listDatas, dataId, isNormalModels);
}
private void verifyExcel(List<Map<String, Object>> listDatas, List<DictModel> isNormalModels) {
if (CollectionUtil.isEmpty(listDatas)) {
throw new EcoBootException("excel 数据内容为空");
}
if (listDatas.size() != 90) {
throw new EcoBootException("excel 数据超出或缺失");
}
checkRows(listDatas, isNormalModels);
}
private void checkRows(List<Map<String, Object>> listDatas, List<DictModel> isNormalModels) {
StringBuilder excelErrorMsg = new StringBuilder();
HashMap<String, List<Integer>> map = new HashMap<>();
HashMap<String, List<Integer>> paramValueMap = new HashMap<>();
for (int i = 0; i < listDatas.size(); i++) {
Map<String, Object> oneRow = listDatas.get(i);
if (!checkNull(oneRow.get(CHECK_NAME))) {
addRowsInfo(map, CHECK_NAME,i);
}
if (!checkNull(oneRow.get(PARAM_NAME))) {
addRowsInfo(map, PARAM_NAME,i);
}
if (!checkNull(oneRow.get(RECOMMEND_VALUE))) {
addRowsInfo(map, RECOMMEND_VALUE, i);
}
Object paramValue = oneRow.get(PARAM_VALUE);
if (StringUtil.isNotEmpty(String.valueOf(paramValue)) &&
String.valueOf(paramValue).length() > 100) {
addRowsInfo(paramValueMap, PARAM_VALUE,i);
}
List<String> isNormalTitles =
isNormalModels.stream().map(DictModel::getTitle).collect(Collectors.toList());
Object isNormal = oneRow.get(IS_NORMAL);
if (StringUtil.isNotEmpty(String.valueOf(isNormal)) &&
!(isNormalTitles.contains(String.valueOf(isNormal)))) {
addRowsInfo(map, IS_NORMAL,i);
}
}
if (CollectionUtil.isNotEmpty(map)) {
getErrorRows(excelErrorMsg,map);
StringBuilder isNormalRowsMsg = new StringBuilder();
if(CollectionUtil.isNotEmpty(map.get(IS_NORMAL))){
checkRows(excelErrorMsg, map, isNormalRowsMsg, IS_NORMAL);
}
}
if (CollectionUtil.isNotEmpty(paramValueMap)) {
for (String key : paramValueMap.keySet()) {
List<Integer> rows = paramValueMap.get(key);
StringBuilder stringBuilder = new StringBuilder();
checkParamValueRows(rows,stringBuilder);
excelErrorMsg.append("第").append(stringBuilder.toString()).append("行 “").append(key).append("”字数不能超过100 \r\n");
}
}
if (StringUtil.isNotEmpty(excelErrorMsg.toString())) {
throw new EcoBootException(excelErrorMsg.toString());
}
}
private Boolean checkNull(Object param){
if (param==null){
return false;
}
return !StringUtil.isEmpty((String.valueOf(param)));
}
private void checkParamValueRows(List<Integer> rows, StringBuilder rowMsg){
for (int i = 0; i < rows.size(); i++) {
if (i > 0) {
rowMsg.append("、").append(rows.get(i));
continue;
}
rowMsg.append(" ").append(rows.get(i));
}
}
private void insertToDb(List<Map<String, Object>> listDatas, String dataId, List<DictModel> dictModels) {
List<ProjectReportDetail> projectReportDetails = this.list(new LambdaQueryWrapper<ProjectReportDetail>()
.eq(ProjectReportDetail::getDataId, dataId)
.in(ProjectReportDetail::getStatus, Arrays.asList(OAConstant.IS_OK, OAConstant.IS_DRAFT))
.orderByAsc(ProjectReportDetail::getSort)
);
List<ProjectReportDetail> datas = toDbCheck(projectReportDetails, listDatas, dictModels);
this.updateBatchById(datas);
}
private List<ProjectReportDetail> toDbCheck(List<ProjectReportDetail> projectReportDetails, List<Map<String, Object>> listDatas, List<DictModel> dictModels){
StringBuilder toDbErrorMsg = new StringBuilder();
HashMap<String, List<Integer>> map = new HashMap<>();
ArrayList<ProjectReportDetail> datas = new ArrayList<>();
if (CollectionUtil.isNotEmpty(projectReportDetails)) {
for (ProjectReportDetail detail : projectReportDetails) {
String checkName = detail.getCheckName();
String paramName = detail.getParamName();
String recommendValue = detail.getRecommendValue();
Integer sort = detail.getSort();
detail.setStatus(OAConstant.IS_OK);
Map<String, Object> sortMap = listDatas.get(sort);
if (!String.valueOf(sortMap.get(CHECK_NAME)).equals(checkName)) {
addRowsInfo(map, CHECK_NAME, sort);
}
if (!String.valueOf(sortMap.get(PARAM_NAME)).equals(paramName)) {
addRowsInfo(map, PARAM_NAME, sort);
}
if (!String.valueOf(sortMap.get(RECOMMEND_VALUE)).equals(recommendValue)) {
addRowsInfo(map, RECOMMEND_VALUE, sort);
}
String paramValue = String.valueOf(sortMap.get(PARAM_VALUE));
String isNormal = String.valueOf(sortMap.get(IS_NORMAL));
Optional<DictModel> any = dictModels.stream().filter(s -> isNormal.equals(s.getTitle())).findAny();
String isNormalValue = "";
if (any.isPresent()) {
isNormalValue = any.get().getValue();
}
detail.setIsNormal(isNormalValue);
detail.setParamValue(paramValue);
datas.add(detail);
}
}
if (CollectionUtil.isNotEmpty(map)) {
getErrorRows(toDbErrorMsg,map);
}
if (StringUtil.isNotEmpty(toDbErrorMsg.toString())) {
throw new EcoBootException(toDbErrorMsg.toString());
}
return datas;
}
private void addRowsInfo(HashMap<String, List<Integer>> map, String key, Integer row) {
if (map.containsKey(key)) {
List<Integer> list = map.get(key);
list.add(row + 2);
map.put(key, list);
} else {
ArrayList<Integer> list = new ArrayList<>();
list.add(row + 2);
map.put(key, list);
}
}
private void getErrorRows(StringBuilder errorMsg, HashMap<String, List<Integer>> map){
StringBuilder checkNameRowsMsg = new StringBuilder();
StringBuilder paramNameRowsMsg = new StringBuilder();
StringBuilder recommendRowsMsg = new StringBuilder();
if (CollectionUtil.isNotEmpty(map.get(CHECK_NAME))){
checkRows(errorMsg, map, checkNameRowsMsg,CHECK_NAME);
}
if (CollectionUtil.isNotEmpty(map.get(PARAM_NAME))){
checkRows(errorMsg, map, paramNameRowsMsg, PARAM_NAME);
}
if(CollectionUtil.isNotEmpty(map.get(RECOMMEND_VALUE))){
checkRows(errorMsg, map, recommendRowsMsg, RECOMMEND_VALUE);
}
}
private void checkRows(StringBuilder errorMsg, HashMap<String, List<Integer>> map, StringBuilder rowsMsg , String param) {
List<Integer> rows = map.get(param);
for (int j = 0; j < rows.size(); j++) {
if (j > 0) {
rowsMsg.append("、").append(rows.get(j));
continue;
}
rowsMsg.append(" ").append(rows.get(j));
}
errorMsg.append("第").append(rowsMsg.toString()).append("行 “").append(param).append("”数据异常 \r\n");
}