diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/ProductModelController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/ProductModelController.java index 75d66ce4..d4c27dec 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/ProductModelController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/ProductModelController.java @@ -5,6 +5,9 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.nflg.mobilebroken.admin.pojo.dto.ModelParamsImportDTO; +import com.nflg.mobilebroken.admin.pojo.dto.ModelParamsImportItemDTO; +import com.nflg.mobilebroken.admin.pojo.dto.ModelParamsImportLanguageItemDTO; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.PublishState; import com.nflg.mobilebroken.common.constant.STATE; @@ -389,7 +392,7 @@ public class ProductModelController extends ControllerBase { VUtils.trueThrowBusinessError(Objects.isNull(info)).throwMessage("无效的数据"); VUtils.trueThrowBusinessError(StrUtil.equals(request.getLanguageCode(), Constant.DEFAULT_LANGUAGE_CODE) && productModelParamsItemService.lambdaQuery() - .ne(ProductModelParamsItem::getId,request.getModelParamsItemId()) + .ne(ProductModelParamsItem::getId, request.getModelParamsItemId()) .eq(ProductModelParamsItem::getModelParamsId, request.getModelParamsId()) .eq(ProductModelParamsItem::getLanguageCode, Constant.DEFAULT_LANGUAGE_CODE) .eq(ProductModelParamsItem::getIndexName, request.getIndexName()) @@ -656,9 +659,227 @@ public class ProductModelController extends ControllerBase { public ApiResult importModelParamsItem(@Valid @RequestParam @NotNull int modelId , @RequestParam(required = false, defaultValue = "0") int modelParamsId , @Valid @RequestParam(value = "file") @NotNull MultipartFile file) { + VUtils.trueThrowBusinessError(true).throwMessage("方法已弃用,改用importModelParamsItemMonolingual"); + return ApiResult.success(0); + } + + /** + * 导入设备技术参数项(多语言) + * @param modelParamsId 机型参数ID + * @param file 文件 + * @return 机型参数id + */ + @Transactional + @PostMapping("/importModelParamsItemMultilingual") + public ApiResult importModelParamsItemMultilingual(@Valid @RequestParam @NotNull int modelId + , @RequestParam(required = false, defaultValue = "0") int modelParamsId + , @Valid @RequestParam(value = "file") @NotNull MultipartFile file) { ProductModel model = productModelService.getById(modelId); VUtils.trueThrowBusinessError(Objects.isNull(model)).throwMessage("无效的" + modelId); - List repeats=new ArrayList<>(); + List repeats = new ArrayList<>(); + DataFormatter dataFormatter = new DataFormatter(); + try (InputStream inputStream = file.getInputStream(); org.apache.poi.ss.usermodel.Workbook workbook = new XSSFWorkbook(inputStream)) { + Sheet sheet = workbook.getSheetAt(0); + String no = StrUtil.trim(sheet.getRow(1).getCell(1).getStringCellValue()); + VUtils.trueThrowBusinessError(!StrUtil.equals(model.getNo(), no)).throwMessage("产品型号不一致"); + List datas = new ArrayList<>(); + String indexName = null; + ModelParamsImportDTO lastDTO = null; + for (int index = 4, count = sheet.getLastRowNum(); index <= count; index++) { + log.info("处理第{}行", index); + Row row = sheet.getRow(index); + if (Objects.isNull(row) || StrUtil.isBlank(row.getCell(1).getStringCellValue())) { + break; + } + ModelParamsImportDTO dto; + String rowIndexName = row.getCell(0).getStringCellValue(); + if (StrUtil.isBlank(rowIndexName) || StrUtil.equals(rowIndexName, indexName)) { + rowIndexName = indexName; + dto = lastDTO; + } else { + indexName = rowIndexName; + dto = new ModelParamsImportDTO().setIndexName(rowIndexName); + lastDTO = dto; + datas.add(dto); + } + ModelParamsImportItemDTO item = new ModelParamsImportItemDTO(); + item.setName(row.getCell(1).getStringCellValue()); + if (dto.getItems().stream().anyMatch(litem -> litem.getName().equals(item.getName()))) { + repeats.add(item.getName()); + } + item.setMain(row.getCell(3).getStringCellValue().equals("是")); + item.setCompare(row.getCell(4).getStringCellValue().equals("是")); + dto.getItems().add(item); + //中文 + ModelParamsImportLanguageItemDTO cn = new ModelParamsImportLanguageItemDTO().setLanguage("中文"); + cn.setIndexName(rowIndexName); + cn.setName(row.getCell(1).getStringCellValue()); + cn.setValue(dataFormatter.formatCellValue(row.getCell(2))); + item.getLanguages().add(cn); + int cc = 5; + while (row.getLastCellNum() > cc) { + int trindex = index; + ModelParamsImportLanguageItemDTO languageItem = new ModelParamsImportLanguageItemDTO(); + languageItem.setIndexName(row.getCell(cc).getStringCellValue()); + while (StrUtil.isBlank(languageItem.getIndexName())) { + languageItem.setIndexName(sheet.getRow(trindex).getCell(cc).getStringCellValue()); + trindex--; + } + languageItem.setLanguage(sheet.getRow(2).getCell(cc).getStringCellValue()); + languageItem.setName(row.getCell(cc + 1).getStringCellValue()); + languageItem.setValue(dataFormatter.formatCellValue(row.getCell(cc + 2))); + item.getLanguages().add(languageItem); + cc += 3; + } + } + VUtils.trueThrowBusinessError(CollectionUtil.isNotEmpty(repeats)) + .throwMessage("以下参数名称重复:" + StrUtil.join(",", repeats)); + VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("数据不能为空"); + List languages = languageService.getLanguages(); + int resultId; + if (modelParamsId == 0) { + resultId = productModelParamsService.add(modelId, IdUtil.getSnowflakeNextIdStr()); + List items = new ArrayList<>(); + int finalResultId = resultId; + datas.forEach(dto -> { + dto.getItems().forEach(dit -> { + String batchNumber = IdUtil.getSnowflakeNextIdStr(); + dit.getLanguages().forEach(languageItem -> { + Language language = languages.stream() + .filter(l -> StrUtil.equals(l.getName(), languageItem.getLanguage())) + .findFirst() + .orElse(null); + VUtils.trueThrowBusinessError(Objects.isNull(language)).throwMessage("语言不存在:" + languageItem.getLanguage()); + ProductModelParamsItem item = new ProductModelParamsItem() + .setModelParamsId(finalResultId) + .setLanguageCode(language.getCode()) + .setBatchNumber(batchNumber) + .setMain(dit.getMain()) + .setCompare(dit.getCompare()) + .setIndexName(languageItem.getIndexName()) + .setName(languageItem.getName()) + .setValue(languageItem.getValue()) + .setCreateBy(AdminUserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + items.add(item); + }); + }); + }); + productModelParamsItemService.saveBatch(items); + } else { + ProductModelParams info = productModelParamsService.getById(modelParamsId); + VUtils.trueThrowBusinessError(Objects.isNull(info)).throwMessage("无效的" + modelParamsId); + resultId = modelParamsId; + if (Objects.equals(info.getState(), PublishState.Published.getState())) { + resultId = productModelParamsService.add(modelId, info.getBatchNumber()); + productModelParamsService.copyItems(modelParamsId, resultId); + } + List oldItems = productModelParamsItemService.lambdaQuery().eq(ProductModelParamsItem::getModelParamsId, resultId).list(); + int finalResultId1 = resultId; + List itemsForAdd = new ArrayList<>(); + datas.forEach(dto -> { + dto.getItems().forEach(dit -> { + ProductModelParamsItem oitem = oldItems.stream() + .filter(it -> StrUtil.equals(it.getLanguageCode(), Constant.DEFAULT_LANGUAGE_CODE) + && StrUtil.equals(it.getIndexName(), dto.getIndexName()) + && StrUtil.equals(it.getName(), dit.getName()) + ) + .findFirst() + .orElse(null); + if (Objects.isNull(oitem)) { + String batchNumber = IdUtil.getSnowflakeNextIdStr(); + dit.getLanguages().forEach(languageItem -> { + Language language = languages.stream() + .filter(l -> StrUtil.equals(l.getName(), languageItem.getLanguage())) + .findFirst() + .orElse(null); + VUtils.trueThrowBusinessError(Objects.isNull(language)).throwMessage("语言不存在:" + languageItem.getLanguage()); + ProductModelParamsItem item = new ProductModelParamsItem() + .setModelParamsId(finalResultId1) + .setLanguageCode(language.getCode()) + .setBatchNumber(batchNumber) + .setMain(dit.getMain()) + .setCompare(dit.getCompare()) + .setIndexName(languageItem.getIndexName()) + .setName(languageItem.getName()) + .setValue(languageItem.getValue()) + .setCreateBy(AdminUserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + itemsForAdd.add(item); + }); + } else { + ModelParamsImportLanguageItemDTO cn = dit.getLanguages().stream() + .filter(it -> StrUtil.equals(it.getLanguage(), "中文")) + .findFirst() + .get(); + oitem.setValue(cn.getValue()); + oitem.setUpdateBy(AdminUserUtil.getUserName()); + oitem.setUpdateTime(LocalDateTime.now()); + languages.removeIf(l -> StrUtil.equals(l.getCode(), Constant.DEFAULT_LANGUAGE_CODE)); + dit.getLanguages().forEach(languageItem -> { + if (!StrUtil.equals(languageItem.getLanguage(), "中文")) { + Language language = languages.stream() + .filter(l -> StrUtil.equals(l.getName(), languageItem.getLanguage())) + .findFirst() + .orElse(null); + VUtils.trueThrowBusinessError(Objects.isNull(language)).throwMessage("语言不存在:" + languageItem.getLanguage()); + ProductModelParamsItem olitem = oldItems.stream() + .filter(it -> StrUtil.equals(it.getBatchNumber(), oitem.getBatchNumber()) + && StrUtil.equals(it.getLanguageCode(), language.getCode())) + .findFirst() + .orElse(null); + if (Objects.isNull(olitem)) { + ProductModelParamsItem item = new ProductModelParamsItem() + .setModelParamsId(finalResultId1) + .setLanguageCode(language.getCode()) + .setBatchNumber(oitem.getBatchNumber()) + .setMain(dit.getMain()) + .setCompare(dit.getCompare()) + .setIndexName(languageItem.getIndexName()) + .setName(languageItem.getName()) + .setValue(languageItem.getValue()) + .setCreateBy(AdminUserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()); + itemsForAdd.add(item); + } else { + olitem.setIndexName(languageItem.getIndexName()); + olitem.setName(languageItem.getName()); + olitem.setValue(languageItem.getValue()); + olitem.setUpdateBy(AdminUserUtil.getUserName()); + olitem.setUpdateTime(LocalDateTime.now()); + } + } + }); + } + }); + }); + if (CollectionUtil.isNotEmpty(oldItems)) { + productModelParamsItemService.updateBatchById(oldItems); + } + if (CollectionUtil.isNotEmpty(itemsForAdd)) { + productModelParamsItemService.saveBatch(itemsForAdd); + } + } + return ApiResult.success(resultId); + } catch (IOException e) { + throw new NflgException(STATE.BusinessError, "导入失败:" + e.getMessage()); + } + } + + /** + * 导入设备技术参数项(中文语言) + * @param modelParamsId 机型参数ID + * @param file 文件 + * @return 机型参数id + */ + @Transactional + @PostMapping("/importModelParamsItemMonolingual") + public ApiResult importModelParamsItemMonolingual(@Valid @RequestParam @NotNull int modelId + , @RequestParam(required = false, defaultValue = "0") int modelParamsId + , @Valid @RequestParam(value = "file") @NotNull MultipartFile file) { + ProductModel model = productModelService.getById(modelId); + VUtils.trueThrowBusinessError(Objects.isNull(model)).throwMessage("无效的" + modelId); + List repeats = new ArrayList<>(); try (InputStream inputStream = file.getInputStream(); org.apache.poi.ss.usermodel.Workbook workbook = new XSSFWorkbook(inputStream)) { Sheet sheet = workbook.getSheetAt(0); String no = StrUtil.trim(sheet.getRow(1).getCell(1).getStringCellValue()); diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportDTO.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportDTO.java new file mode 100644 index 00000000..8f3dc5c6 --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportDTO.java @@ -0,0 +1,19 @@ +package com.nflg.mobilebroken.admin.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Accessors(chain = true) +public class ModelParamsImportDTO { + + /** + * 指标名称 + */ + private String IndexName; + + private List items=new ArrayList<>(); +} diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportItemDTO.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportItemDTO.java new file mode 100644 index 00000000..f364901e --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportItemDTO.java @@ -0,0 +1,29 @@ +package com.nflg.mobilebroken.admin.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Accessors(chain = true) +public class ModelParamsImportItemDTO { + + /** + * 参数名称 + */ + private String name; + + /** + * 是否主要参数 + */ + private Boolean main; + + /** + * 是否参与比较 + */ + private Boolean compare; + + private List languages=new ArrayList<>(); +} diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportLanguageItemDTO.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportLanguageItemDTO.java new file mode 100644 index 00000000..63ea876b --- /dev/null +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/pojo/dto/ModelParamsImportLanguageItemDTO.java @@ -0,0 +1,29 @@ +package com.nflg.mobilebroken.admin.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class ModelParamsImportLanguageItemDTO { + + /** + * 语言 + */ + private String language; + + /** + * 指标名称 + */ + private String IndexName; + + /** + * 参数名称 + */ + private String name; + + /** + * 参数指标 + */ + private String value; +}