diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/OptionalBomConstant.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/OptionalBomConstant.java index bf8d7339..5959ea4b 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/OptionalBomConstant.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/OptionalBomConstant.java @@ -76,8 +76,8 @@ public class OptionalBomConstant { public enum ExcelErrorTagEnum implements ValueEnum { NO(0, "无错误"), REPEAT(1, "重复的标配"), - MATERIA_NO_UNKOWN(2, "无物料号"), - ALL(3, "同时满足(重复标配、无物料号)"); + MATERIA_NO_UNKOWN(2, "主数据无匹配物料号"), + ALL(3, "同时满足(重复标配、主数据无匹配物料号)"); private final Integer value; private final String description; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java index 73521db7..9cf460aa 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java @@ -28,6 +28,8 @@ import org.apache.poi.xssf.usermodel.XSSFColor; import java.io.OutputStream; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /**' * 移动破导出设备 @@ -49,7 +51,7 @@ public class ExportDeviceHelper { .needHead(false)//是否需要head .build(); - buildHeader(2, voObj.getDeviceInfo(), sheet, writer, tableNoCounting); + buildHeader(4, voObj.getDeviceInfo(), sheet, writer, tableNoCounting); buildList(voObj.getSingleList(), sheet, writer, tableNoCounting); writer.finish(); @@ -177,15 +179,21 @@ public class ExportDeviceHelper { case 0: columnWidth = 50; break; + case 1: - columnWidth = 70; + columnWidth = 20; break; case 2: - columnWidth = 20; + columnWidth = 70; break; case 3: - columnWidth = 40; + columnWidth = 20; + + break; + case 4: + + columnWidth = 20; break; default: @@ -200,13 +208,10 @@ public class ExportDeviceHelper { // 自定义表头样式处理 if (context.getHead() != null && context.getHead().booleanValue()) { - if(cellIndex==0 || cellIndex ==1) { + if(cellIndex==0 || cellIndex ==1 || cellIndex ==2) { WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); - - CellStyle cellStyle = initCellStyle(workbook); - XSSFCellStyle xssfCellStyle = (XSSFCellStyle) workbook.createCellStyle(); xssfCellStyle.cloneStyleFrom(cellStyle); xssfCellStyle.getFont().setBold(true); @@ -224,10 +229,11 @@ public class ExportDeviceHelper { } - if(cellIndex ==1){ + //合并选项头单元格 0~2 + if(cellIndex == 2){ WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); Sheet sheet = writeSheetHolder.getSheet(); - CellRangeAddress cellRangeAddress = new CellRangeAddress(rowIndex, rowIndex, 0, 1); + CellRangeAddress cellRangeAddress = new CellRangeAddress(rowIndex, rowIndex, 0, 2); sheet.addMergedRegion(cellRangeAddress); } @@ -270,11 +276,15 @@ public class ExportDeviceHelper { head2.add(""); List head3 = new ArrayList(); head3.add(""); + List head4 = new ArrayList(); + head4.add(""); + list.add(head0); list.add(head1); list.add(head2); list.add(head3); + list.add(head4); return list; } @@ -318,6 +328,7 @@ public class ExportDeviceHelper { cellList.add(StrUtil.format("{} {}", header.getDeviceNo(), header.getDeviceName())); List cellList2 = new ArrayList<>(); cellList2.add("选配内容"); + cellList2.add(""); //空格合并单元格 cellList2.add(""); cellList2.add("标配\\可选"); cellList2.add("备注"); @@ -327,7 +338,15 @@ public class ExportDeviceHelper { //写入表格 writer.write(rowList, sheet, table); } + boolean isContainChinese(String str) { + Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); + Matcher m = p.matcher(str); + if (m.find()) { + return true; + } + return false; + } /** * 构建列表部分 */ @@ -348,11 +367,6 @@ public class ExportDeviceHelper { optionParentDrawingNoName = item1.getOptionDrawingNo(); List list2 = item1.getChild(); -// List cellList = new ArrayList<>(); -// cellList.add(opParentName); - - - for (OptionalEbomImportVO item2 : list2) { { @@ -363,15 +377,19 @@ public class ExportDeviceHelper { ImportExcelField excelField = new ImportExcelField(); excelField.setCellFirst(StrUtil.format("{} {}",optionChildDrawingNo,opChildName)); + excelField.setCellSecond(StrUtil.format("{}", item3.getMaterialNo())); + if(StrUtil.isEmpty(item3.getDrawingNo())) { - excelField.setCellSecond(StrUtil.format("{}", item3.getMaterialName())); - }else { - excelField.setCellSecond(StrUtil.format ("{} {}", item3.getDrawingNo(), item3.getMaterialName())); + excelField.setCellThird(StrUtil.format("{}", item3.getMaterialName())); + }else if(isContainChinese(item3.getDrawingNo())){ + excelField.setCellThird(StrUtil.format("{}", item3.getDrawingNo())); + }else{ + excelField.setCellThird(StrUtil.format ("{} {}", item3.getDrawingNo(), item3.getMaterialName())); } - excelField.setCellThird(StrUtil.format("{}",item3.getChooseStatus() == 1 ? "标配" : "可选")) ; - excelField.setCellFourth(item3.getRemak()); + excelField.setCellFourth(StrUtil.format("{}",item3.getChooseStatus() == 1 ? "标配" : "可选")); ; + excelField.setCellFifth(item3.getRemak()); items.add(excelField); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java index 5f015c74..7f74b86f 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java @@ -9,19 +9,22 @@ import lombok.Data; public class ImportExcelField{ @ExcelIgnore private Integer lineNo; - + //选项 @ExcelProperty(value="",index = 0) private String cellFirst; - + //物料 @ExcelProperty(value="",index = 1) private String cellSecond; - + //选配内容 @ExcelProperty(value="",index = 2) private String cellThird; - + //标配/可选 @ExcelProperty(value="",index = 3) private String cellFourth; + //备注 + @ExcelProperty(value="",index = 4) + private String cellFifth; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java index 6338cfd9..3ed9971f 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java @@ -22,6 +22,7 @@ import com.nflg.product.bomnew.pojo.entity.OptionalEbomImportChildEntity; import com.nflg.product.bomnew.pojo.entity.OptionalEbomImportEntity; import com.nflg.product.bomnew.pojo.entity.OptionalEbomMainEntity; import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; +import com.nflg.product.bomnew.pojo.vo.BomNewMbomMiddleVO; import com.nflg.product.bomnew.service.*; import com.nflg.product.bomnew.service.domain.OptionalEBom.ConvertToMainHistory; import lombok.extern.slf4j.Slf4j; @@ -51,70 +52,56 @@ public class OptionalExcelService { @Resource private OptionalEbomImportService optionalEbomImportService; - private void parsecColumn3(List v1, OptionalEbomImportDTO optionalEbomImportLevel2Dto) { - AtomicInteger partTypeCount = new AtomicInteger(); - boolean tag=false; - //解析物料 - for (ImportExcelField item: - v1) { + /* + 解析物料 + */ + private void parseColumn3(List v1, OptionalEbomImportDTO optionalEbomImportLevel2Dto) { + AtomicInteger partTypeCount = new AtomicInteger(); + boolean tag = false; + int lineNo =v1.get(0).getLineNo(); + //解析物料 + for (ImportExcelField item : + v1) { if (StrUtil.isEmpty(item.getCellSecond())) { throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行, {} {}出现空物料数据", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); } if (StrUtil.isEmpty(item.getCellThird())) { + throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行, {} {}无选项数据", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); + } + + + if (StrUtil.isEmpty(item.getCellFourth())) { throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,物料信息{}未填写标配/可选", item.getLineNo(), item.getCellSecond())); } - //OCE-NFS780DP-037B-OPT:加装回料输送机(可选) - OptionalEbomImportChildDTO levelDto3 = new OptionalEbomImportChildDTO(); + OptionalEbomImportChildDTO levelDto3 = new OptionalEbomImportChildDTO(); if (CollectionUtil.isEmpty(optionalEbomImportLevel2Dto.getChild())) { optionalEbomImportLevel2Dto.setChild(new ArrayList()); } - String materialDesc = item.getCellSecond().trim(); - //替换统一格式 - // materialDesc = materialDesc.replace(":", ":"); - int optionChildPos=materialDesc.indexOf(" "); + String materialName = item.getCellThird().trim(); - if(optionChildPos<0){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("第{}行,格式错误,选项使用空格分隔图号和名称 {}",item.getLineNo(), item.getCellSecond())); - } - levelDto3.setDrawingNo(StrUtil.sub(materialDesc, 0, optionChildPos)); - String materialName = StrUtil.subSuf(materialDesc, optionChildPos + 1); - -// if (StrUtil.isEmpty(levelDto3.getDrawingNo())) { -// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,解析后不包含物料图号", item.getLineNo(), item.getCellSecond())); -// } - - if (StrUtil.isEmpty(materialName)) { - throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,解析后不包含物料名", item.getLineNo(), item.getCellSecond())); - } - - levelDto3.setMaterialName(materialName); levelDto3.setLineNo(item.getLineNo()); levelDto3.setPartType(OptionalBomConstant.PartTypeEnum.PART_TYPE_RADIO.getValue()); - //(标配) (可选) + levelDto3.setMaterialNo(item.getCellSecond()); levelDto3.setTag(materialName.contains("无")); - levelDto3.setMaterialDesc(materialDesc); -//多个无 + // levelDto3.setMaterialDesc(materialName); + // levelDto3.setMaterialNo(materialName); + // levelDto3.setMaterialName(materialName); + //多个无 if (tag && levelDto3.getTag()) { - throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,{} {} 包含多个无", item.getLineNo(),optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); - + throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,{} {} 包含多个无", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); } tag = levelDto3.getTag(); - -// if (levelDto3.getTag()) { -// levelDto3.setMaterialDesc(materialName); -// } - - if (item.getCellThird().contains("标配")) { + if (item.getCellFourth().contains("标配")) { levelDto3.setChooseStatus(OptionalBomConstant.ChooseStatusEnum.CHOOSE_STATUS_YES.getValue()); partTypeCount.getAndIncrement(); //包含多个标配 @@ -122,36 +109,129 @@ public class OptionalExcelService { levelDto3.setError(OptionalBomConstant.ExcelErrorTagEnum.REPEAT.getValue()); optionalEbomImportLevel2Dto.setError(true); - throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,{} {} 包含多个标配", item.getLineNo(),optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); + throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,{} {} 包含多个标配", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); } } else { levelDto3.setChooseStatus(OptionalBomConstant.ChooseStatusEnum.CHOOSE_STATUS_NO.getValue()); } - levelDto3.setRemak(item.getCellFourth()); + levelDto3.setRemak(item.getCellFifth()); optionalEbomImportLevel2Dto.getChild().add(levelDto3); -// levelDto3.setMaterialName(materialName.replace("(标配)", "").replace("(可选)", "")); -// levelDto3.setMaterialDesc(levelDto3.getMaterialDesc()); } + + + } - private void parsecColumn2(Map> listMap, OptionalEbomImportDTO optionalEbomImportDTO) { + + + + + + + +// private void parseColumn3(List v1, OptionalEbomImportDTO optionalEbomImportLevel2Dto) { +// AtomicInteger partTypeCount = new AtomicInteger(); +// boolean tag = false; +// //解析物料 +// for (ImportExcelField item : +// v1) { +// +// if (StrUtil.isEmpty(item.getCellSecond())) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行, {} {}出现空物料数据", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); +// } +// +// if (StrUtil.isEmpty(item.getCellThird())) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,物料信息{}未填写标配/可选", item.getLineNo(), item.getCellSecond())); +// } +// +// +// //OCE-NFS780DP-037B-OPT:加装回料输送机(可选) +// OptionalEbomImportChildDTO levelDto3 = new OptionalEbomImportChildDTO(); +// +// if (CollectionUtil.isEmpty(optionalEbomImportLevel2Dto.getChild())) { +// optionalEbomImportLevel2Dto.setChild(new ArrayList()); +// } +// +// +// String materialDesc = item.getCellSecond().trim(); +// //替换统一格式 +// +// int optionChildPos = materialDesc.indexOf(" "); +// +// if (optionChildPos < 0) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,选项使用空格分隔图号和名称 {}", item.getLineNo(), item.getCellSecond())); +// } +// +// levelDto3.setDrawingNo(StrUtil.sub(materialDesc, 0, optionChildPos)); +// String materialName = StrUtil.subSuf(materialDesc, optionChildPos + 1); +// +//// if (StrUtil.isEmpty(levelDto3.getDrawingNo())) { +//// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,解析后不包含物料图号", item.getLineNo(), item.getCellSecond())); +//// } +// +// if (StrUtil.isEmpty(materialName)) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,解析后不包含物料名", item.getLineNo(), item.getCellSecond())); +// } +// +// levelDto3.setMaterialName(materialName); +// levelDto3.setLineNo(item.getLineNo()); +// levelDto3.setPartType(OptionalBomConstant.PartTypeEnum.PART_TYPE_RADIO.getValue()); +// //(标配) (可选) +// levelDto3.setTag(materialName.contains("无")); +// levelDto3.setMaterialDesc(materialDesc); +// //多个无 +// if (tag && levelDto3.getTag()) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,{} {} 包含多个无", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); +// +// } +// tag = levelDto3.getTag(); +// +// if (item.getCellThird().contains("标配")) { +// levelDto3.setChooseStatus(OptionalBomConstant.ChooseStatusEnum.CHOOSE_STATUS_YES.getValue()); +// partTypeCount.getAndIncrement(); +// //包含多个标配 +// if (partTypeCount.get() > 1) { +// levelDto3.setError(OptionalBomConstant.ExcelErrorTagEnum.REPEAT.getValue()); +// optionalEbomImportLevel2Dto.setError(true); +// +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,{} {} 包含多个标配", item.getLineNo(), optionalEbomImportLevel2Dto.getOptionName(), optionalEbomImportLevel2Dto.getOptionDrawingNo())); +// } +// } else { +// levelDto3.setChooseStatus(OptionalBomConstant.ChooseStatusEnum.CHOOSE_STATUS_NO.getValue()); +// } +// +// levelDto3.setRemak(item.getCellFourth()); +// optionalEbomImportLevel2Dto.getChild().add(levelDto3); +// +// +// } +// } + + /** + * 解析子项 + + */ + private void parseOptionColumn2(Map> listMap, OptionalEbomImportDTO optionalEbomImportDTO) { + + List optionList=new ArrayList(); //子项 listMap.forEach((k, v) -> { - if(CollectionUtil.isEmpty(v)){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("{} {} 下无物料数据",optionalEbomImportDTO.getOptionDrawingNo(),optionalEbomImportDTO.getOptionName())); + if (CollectionUtil.isEmpty(v)) { + throw new NflgBusinessException(STATE.Error, StrUtil.format("{} {} 下无物料数据", optionalEbomImportDTO.getOptionDrawingNo(), optionalEbomImportDTO.getOptionName())); } - int optionChildPos=k.indexOf(" "); + k= k.replace("\t", " "); + int optionChildPos = k.indexOf(" "); - if(optionChildPos<0){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("第{}行,格式错误,选项使用空格分隔图号和名称",v.get(0).getLineNo())); + if (optionChildPos < 0) { + throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,选项使用空格分隔图号和名称", v.get(0).getLineNo())); } OptionalEbomImportDTO optionalEbomImportL2 = new OptionalEbomImportDTO(); - optionalEbomImportL2.setOptionDrawingNo(StrUtil.sub(k,0,optionChildPos)); - optionalEbomImportL2.setOptionName(StrUtil.subSuf(k,optionChildPos+1)); + optionalEbomImportL2.setOptionDrawingNo(StrUtil.sub(k, 0, optionChildPos)); + optionalEbomImportL2.setOptionName(StrUtil.subSuf(k, optionChildPos + 1)); if (StrUtil.isEmpty(optionalEbomImportL2.getOptionDrawingNo())) { throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,解析后没有图号", v.get(0).getLineNo())); @@ -161,184 +241,263 @@ public class OptionalExcelService { throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,解析后没有选项名", v.get(0).getLineNo())); } - if (CollectionUtil.isEmpty(optionalEbomImportDTO.getChild())) { optionalEbomImportDTO.setChild(new ArrayList()); } optionalEbomImportDTO.getChild().add(optionalEbomImportL2); - parsecColumn3(v, optionalEbomImportL2); + parseColumn3(v, optionalEbomImportL2); + optionList.addAll(optionalEbomImportL2.getChild()); + }); + //检查选项下是否包含重复物料 + Map frequencyMap = optionList.stream().collect(Collectors.groupingBy(OptionalEbomImportChildDTO::getMaterialNo, Collectors.counting())); + List duplicates = frequencyMap.entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(duplicates)){ + String result = duplicates.stream().collect(Collectors.joining(",")); + throw new NflgBusinessException(STATE.Error, StrUtil.format(" {} {} 选项下有相同物料号{}", optionalEbomImportDTO.getOptionDrawingNo(),optionalEbomImportDTO.getOptionName(),result)); + } + + //选项下同步主数据 + SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(optionList,OptionalEbomImportChildDTO::getMaterialNo); + for (OptionalEbomImportChildDTO childDTO : optionList) { + //!childDTO.getTag() && + if (StringUtils.isEmpty(childDTO.getDrawingNo())) { + childDTO.setError(childDTO.getError() | OptionalBomConstant.ExcelErrorTagEnum.MATERIA_NO_UNKOWN.getValue()); + + optionalEbomImportDTO.setError(true); + } + } + + + } - private OptionalEbomImportExcelDTO parsecColumn1(List list) { +// +// private OptionalEbomImportExcelDTO parsecColumn1(List list) { +// OptionalEbomImportExcelDTO optionalEbomInportExcelDTO = new OptionalEbomImportExcelDTO(); +// //第一行设备信息 +// ImportExcelField device = list.get(0); +// optionalEbomInportExcelDTO.setDeviceInfo(parseDevcieInfo(device)); +// +// +// String name = ""; +// //相同类 +// List classList = new ArrayList<>(); +// //跳过 第一行标题 选配内容 标配\可选 +// int row = 2; +// for (; row < list.size(); row++) { +// ImportExcelField rowField = list.get(row); +// +// //第一选项未合并单元格 单元格拆分后 第1 2 3列相等 +//// if (!rowField.getCellFirst().equals(rowField.getCellSecond()) || !rowField.getCellFirst().equals(rowField.getCellThird()) ){ +//// throw new NflgBusinessException(STATE.Error,StrUtil.format("第{}行,请保持相同格式,{} 未合并单元格 ",rowField.getLineNo(),rowField.getCellFirst())); +//// } +// +// //相同列为根选项(黄色背景) +// if ((row == list.size() - 1) || (rowField.getCellFirst().equals(rowField.getCellSecond()) +// && StrUtil.isEmpty(rowField.getCellThird()))) { +// +// +// if ((row == list.size() - 1)) { +// classList.add(rowField); +// } +// +// name = rowField.getCellFirst(); +// if (CollectionUtil.isNotEmpty(classList)) { +// String finalName = name; +// //黄色根部选项解析 +// int optionParentPos = finalName.indexOf(" "); +// +// OptionalEbomImportDTO optionalEbomImportL1 = new OptionalEbomImportDTO(); +// optionalEbomImportL1.setOptionDrawingNo(StrUtil.sub(finalName, 0, optionParentPos)); +// optionalEbomImportL1.setOptionName(StrUtil.subSuf(finalName, optionParentPos + 1)); +// +// if (CollectionUtil.isEmpty(optionalEbomInportExcelDTO.getOptionInfo())) { +// optionalEbomInportExcelDTO.setOptionInfo(new ArrayList()); +// } +// optionalEbomInportExcelDTO.getOptionInfo().add(optionalEbomImportL1); +// +// Map> group1 = classList.parallelStream() +// .collect(Collectors.groupingBy(ImportExcelField::getCellFirst, LinkedHashMap::new, Collectors.toList())); +// +// if (group1 == null || CollectionUtil.isEmpty(group1)) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("转换{}选项下数据异常", name)); +// } +// +// parsecColumn2(group1, optionalEbomImportL1); +// +// classList.clear(); +// +// } +// if ((row != list.size() - 1)) { +// name = rowField.getCellFirst(); +// if (StrUtil.isEmpty(name)) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,选项数据不能为空", rowField.getLineNo())); +// } +// +// if (!name.contains(" ")) { +// throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,选项使用空格分隔名称和图号", rowField.getLineNo())); +// } +// +// } +// +// } else { +// classList.add(rowField); +// } +// } +// //最后一项处理 +// return optionalEbomInportExcelDTO; +// +// } + + + OptionalEbomImportExcelDTO parseOptionColumn(List list) { + + OptionalEbomImportExcelDTO optionalEbomInportExcelDTO = new OptionalEbomImportExcelDTO(); - + //第一行设备信息 ImportExcelField device = list.get(0); + optionalEbomInportExcelDTO.setDeviceInfo(parseDevcieInfo(device)); - if(StrUtil.isEmpty(device.getCellFirst())){ - throw new NflgBusinessException(STATE.Error,"机型数据不能为空"); - } - String deviceInfo = device.getCellFirst(); - int deviceSplitPos=deviceInfo.indexOf(" "); - //设备信息 - if(deviceSplitPos<0 ){ - throw new NflgBusinessException(STATE.Error,"第1行,机型设备型号格式异常,使用空格分隔设备编号和名称"); - } - - optionalEbomInportExcelDTO.setDeviceInfo(new OptionalEbomMainDTO()); - optionalEbomInportExcelDTO.getDeviceInfo().setDeviceNo(StrUtil.sub(deviceInfo,0 ,deviceSplitPos )); - - optionalEbomInportExcelDTO.getDeviceInfo().setDeviceName(StrUtil.subSuf(deviceInfo, deviceSplitPos+1 )); - - if(StrUtil.isEmpty( optionalEbomInportExcelDTO.getDeviceInfo().getDeviceName())){ - throw new NflgBusinessException(STATE.Error,"第1行,格式错误,解析后不包含设备名称"); - } - optionalEbomInportExcelDTO.getDeviceInfo().setDeviceName( optionalEbomInportExcelDTO.getDeviceInfo().getDeviceName() .replace("\n","")); - - String name = ""; + String optionName = ""; //相同类 List classList = new ArrayList<>(); + //跳过 第一行标题 选配内容 标配\可选 int row = 2; for (; row < list.size(); row++) { ImportExcelField rowField = list.get(row); + optionName = rowField.getCellFirst(); + optionName= optionName.replace("\t", " "); - //第一选项未合并单元格 - if (StrUtil.isEmpty(rowField.getCellThird()) && !rowField.getCellFirst().equals(rowField.getCellSecond())){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("第{}行,请保持相同格式,{} 未合并单元格 ",rowField.getLineNo(),rowField.getCellFirst())); + + //黄色根部选项解析 + int optionParentPos = optionName.indexOf(" "); + if (optionParentPos<0) { + throw new NflgBusinessException(STATE.Error, StrUtil.format("第{}行,格式错误,选项{}使用空格分隔图号和名称", rowField.getLineNo(), optionName)); + } + OptionalEbomImportDTO optionalEbomImportL1 = new OptionalEbomImportDTO(); + optionalEbomImportL1.setOptionDrawingNo(StrUtil.sub(optionName, 0, optionParentPos).trim()); + optionalEbomImportL1.setOptionName(StrUtil.subSuf(optionName, optionParentPos + 1)); + + if (CollectionUtil.isEmpty(optionalEbomInportExcelDTO.getOptionInfo())) { + optionalEbomInportExcelDTO.setOptionInfo(new ArrayList()); + } + optionalEbomInportExcelDTO.getOptionInfo().add(optionalEbomImportL1); + + while (++row()); - } - optionalEbomInportExcelDTO.getOptionInfo().add(optionalEbomImportL1); - - Map > group1 = classList.parallelStream() - .collect(Collectors.groupingBy(ImportExcelField::getCellFirst,LinkedHashMap::new,Collectors.toList())); - - if(group1==null || CollectionUtil.isEmpty(group1)){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("转换{}选项下数据异常",name)); - } - - parsecColumn2(group1, optionalEbomImportL1); - - classList.clear(); - - } - if((row!=list.size()-1)) { - name = rowField.getCellFirst(); - if(StrUtil.isEmpty(name)){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("第{}行,选项数据不能为空",rowField.getLineNo())); - } - - if(!name.contains(" ")){ - throw new NflgBusinessException(STATE.Error,StrUtil.format("第{}行,格式错误,选项使用空格分隔名称和图号",rowField.getLineNo())); - } - - } - - } else { - classList.add(rowField); + Map> group1 = classList.parallelStream() + .collect(Collectors.groupingBy(ImportExcelField::getCellFirst, LinkedHashMap::new, Collectors.toList())); + if (group1 == null || CollectionUtil.isEmpty(group1)) { + throw new NflgBusinessException(STATE.Error, StrUtil.format("转换{}选项下数据异常", optionName)); } + parseOptionColumn2(group1, optionalEbomImportL1); + classList.clear(); + + } - //最后一项处理 - - - - return optionalEbomInportExcelDTO; + } + + + /** + * 解析设备 + * + * @param device + * @return + */ + OptionalEbomMainDTO parseDevcieInfo(ImportExcelField device) { + if (StrUtil.isEmpty(device.getCellFirst())) { + throw new NflgBusinessException(STATE.Error, "机型数据不能为空"); + } + String deviceInfo = device.getCellFirst(); + int deviceSplitPos = deviceInfo.indexOf(" "); + + //设备信息 + if (deviceSplitPos < 0) { + throw new NflgBusinessException(STATE.Error, "第1行,机型设备型号格式异常,使用空格分隔设备编号和名称"); + } + OptionalEbomMainDTO deviceDto = new OptionalEbomMainDTO(); + deviceDto.setDeviceNo(StrUtil.sub(deviceInfo, 0, deviceSplitPos)); + deviceDto.setDeviceName(StrUtil.subSuf(deviceInfo, deviceSplitPos + 1)); + + if (StrUtil.isEmpty(deviceDto.getDeviceNo())) { + throw new NflgBusinessException(STATE.Error, "第1行,格式错误,解析后不包含设备编码"); + } + if (StrUtil.isEmpty(deviceDto.getDeviceName())) { + throw new NflgBusinessException(STATE.Error, "第1行,格式错误,解析后不包含设备名称"); + } + + deviceDto.setDeviceName(deviceDto.getDeviceName().replace("\n", "")); + + return deviceDto; } public Boolean importExcel(InputStream inputStream) throws NflgBusinessException { if (inputStream == null) { - new NflgBusinessException(STATE.Error, "文件流内容空"); + throw new NflgBusinessException(STATE.Error, "文件流内容空"); } //解析excel ImportExcelHelper helper = new ImportExcelHelper<>(); List list = helper.getList(inputStream, ImportExcelField.class, 0, 0); OptionalEbomImportExcelDTO optionalEbomInportExcelDTO = null; if (CollectionUtil.isNotEmpty(list)) { - optionalEbomInportExcelDTO = parsecColumn1(list); + optionalEbomInportExcelDTO = parseOptionColumn(list); } - if (optionalEbomInportExcelDTO != null) { - optionalEbomInportExcelDTO.getOptionInfo().forEach(item -> { - List listParent = item.getChild(); - for (OptionalEbomImportDTO item1 : - listParent) { - List listChild = item1.getChild(); - - // - SpringUtil.getBean(MaterialMainService.class).initMaterialForDrawdingNoImmul(listChild, OptionalEbomImportChildDTO::getDrawingNo, OptionalEbomImportChildDTO::setMaterialNo, OptionalEbomImportChildDTO::setMaterialDesc); - - for (OptionalEbomImportChildDTO childDTO : listChild) { - if (!childDTO.getTag() && StringUtils.isEmpty(childDTO.getMaterialNo())) { - //in 批量没匹配到 再模糊匹配一次 - List likeList= SpringUtil.getBean(MaterialMainService.class) - .getMaterialLikeByDrawingNo(StrUtil.format("{} {}",childDTO.getDrawingNo(),childDTO.getMaterialName())); - if(CollectionUtil.isNotEmpty(likeList) ) { - if (likeList.size() == 1) { - BaseMaterialVO materialVO = likeList.get(0); - childDTO.setMaterialNo(materialVO.getMaterialNo()); - childDTO.setMaterialDesc(materialVO.getMaterialDesc()); - continue; - } else if (likeList.size() > 1) { - throw new NflgBusinessException(STATE.BusinessError, StrUtil.format("第{}行,{} 图号匹配到多条物料数据", childDTO.getLineNo(), childDTO.getDrawingNo())); - } - - } - - // childDTO.setMaterialNo(childDTO.getDrawingNo()); - childDTO.setError(childDTO.getError() | OptionalBomConstant.ExcelErrorTagEnum.MATERIA_NO_UNKOWN.getValue()); - item1.setError(true); - } - } - - - } - }); - - + if(optionalEbomInportExcelDTO==null){ + throw new NflgBusinessException(STATE.Error, "解析数据失败"); } +// if (optionalEbomInportExcelDTO != null) { +// for( OptionalEbomImportDTO item:optionalEbomInportExcelDTO.getOptionInfo()) { +// List listParent = item.getChild(); +// for (OptionalEbomImportDTO item1 : +// listParent) { +// List listChild = item1.getChild(); +// // +// // SpringUtil.getBean(MaterialMainService.class).initMaterialForDrawdingNoImmul(listChild, OptionalEbomImportChildDTO::getDrawingNo, OptionalEbomImportChildDTO::setMaterialNo, OptionalEbomImportChildDTO::setMaterialDesc); +// +// SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(listChild,OptionalEbomImportChildDTO::getMaterialNo); +// for (OptionalEbomImportChildDTO childDTO : listChild) { +// //!childDTO.getTag() && +// if (StringUtils.isEmpty(childDTO.getDrawingNo())) { +// childDTO.setError(childDTO.getError() | OptionalBomConstant.ExcelErrorTagEnum.MATERIA_NO_UNKOWN.getValue()); +// item1.setError(true); +// } +// } +// } +// } +// } + //检查是否满足条件 除了‘无’ ,物料号不能为空 String hintMsg = isValiData(optionalEbomInportExcelDTO.getOptionInfo()); if (StrUtil.isNotEmpty(hintMsg)) { throw new NflgBusinessException(STATE.Error, hintMsg); } - System.out.println(JSON.toJSONString(optionalEbomInportExcelDTO)); - // return true; + System.out.println(JSON.toJSONString(optionalEbomInportExcelDTO)); + // return true; //保存db - return batchExcelToRepertory(optionalEbomInportExcelDTO); + return batchExcelToRepertory(optionalEbomInportExcelDTO); } @@ -348,8 +507,6 @@ public class OptionalExcelService { excelList.forEach(item -> { List listParent = item.getChild(); for (OptionalEbomImportDTO item1 : listParent) { - if (item1.isError()) { - List listChild = item1.getChild(); for (OptionalEbomImportChildDTO item2 : listChild) { if (item2.getError() == OptionalBomConstant.ExcelErrorTagEnum.REPEAT.getValue()) { @@ -360,9 +517,6 @@ public class OptionalExcelService { title.append(String.format("第%d行 %s ,", item2.getLineNo(), OptionalBomConstant.ExcelErrorTagEnum.ALL.getDescription())); } - } - - } } }); @@ -371,7 +525,7 @@ public class OptionalExcelService { } - // @Transactional(rollbackFor = Exception.class) + // @Transactional(rollbackFor = Exception.class) public Boolean batchExcelToRepertory(OptionalEbomImportExcelDTO ebomImportExcelDTO) { OptionalEbomMainEntity optionalEbomMainEntity = Convert.convert(new TypeReference() { @@ -396,10 +550,10 @@ public class OptionalExcelService { optionalEbomMainService.save(optionalEbomMainEntity); - }else{ - optionalEbomMainEntity=queryDevice; + } else { + optionalEbomMainEntity = queryDevice; - } + } if (optionalEbomMainEntity == null || optionalEbomMainEntity.getRowId() == null) { throw new NflgBusinessException(STATE.Error, "保存设备数据失败"); @@ -409,7 +563,7 @@ public class OptionalExcelService { List parentOptionList = ebomImportExcelDTO.getOptionInfo(); - ConvertToMainHistory convertToMainHistory=new ConvertToMainHistory(); + ConvertToMainHistory convertToMainHistory = new ConvertToMainHistory(); convertToMainHistory.convertToMainHistory(optionalEbomMainEntity.getRowId()); //保存选项 @@ -425,7 +579,7 @@ public class OptionalExcelService { parentOptionEntity = Convert.convert(new TypeReference() { }, parentOption); parentOptionEntity.setRootRowId(optionalEbomMainEntity.getRowId()); - parentOptionEntity.setCreatedTime(DateUtil.now()); + parentOptionEntity.setCreatedTime(DateUtil.now()); parentOptionEntity.setCreatedBy(SessionUtil.getUserCode()); optionalEbomImportService.save(parentOptionEntity); } @@ -437,8 +591,6 @@ public class OptionalExcelService { List childOptionList = parentOption.getChild(); - - for (OptionalEbomImportDTO childOption : childOptionList) { QueryWrapper queryWrapper2 = new QueryWrapper<>(); @@ -453,7 +605,7 @@ public class OptionalExcelService { childOptionEntity.setRootRowId(optionalEbomMainEntity.getRowId()); childOptionEntity.setParentRowId(parentOptionEntity.getRowId()); - childOptionEntity.setCreatedTime(DateUtil.now()); + childOptionEntity.setCreatedTime(DateUtil.now()); optionalEbomImportService.save(childOptionEntity); } // else{ @@ -494,8 +646,8 @@ public class OptionalExcelService { } //首次添加设备不用操作保存历史记录 - if(queryDevice!=null){ - SpringUtil.getBean(OptionalEbomMainHistoryService.class).convertToHistory(convertToMainHistory,true); + if (queryDevice != null) { + SpringUtil.getBean(OptionalEbomMainHistoryService.class).convertToHistory(convertToMainHistory, true); } return true; diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/template/importDataTemplate.xlsx b/nflg_project_dev/nflg-bom-new/src/main/resources/template/importDataTemplate.xlsx index b956028a..1fab073d 100644 Binary files a/nflg_project_dev/nflg-bom-new/src/main/resources/template/importDataTemplate.xlsx and b/nflg_project_dev/nflg-bom-new/src/main/resources/template/importDataTemplate.xlsx differ