From 8bf9254ba43e744517d4de2516121da2979fd057 Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期二, 01 四月 2025 11:29:51 +0800 Subject: [PATCH] 1.检验项目参数导入 2.对象导入 --- basic-server/src/main/java/com/ruoyi/basic/excel/ExcelMultiSheetImporter.java | 31 + basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java | 132 ++++++ basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java | 321 ++++++++++------ cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java | 4 pom.xml | 2 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonnelHeaderApi.java | 2 basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java | 108 +++- cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java | 6 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonDto.java | 2 basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java | 247 ------------ basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java | 4 basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java | 6 basic-server/src/main/java/com/ruoyi/basic/excel/MultiSheetImportListener.java | 224 +++++++++++ 13 files changed, 687 insertions(+), 402 deletions(-) diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java index 7923abd..97ac1cf 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java +++ b/basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java @@ -1,22 +1,18 @@ package com.ruoyi.basic.controller; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.poi.excel.ExcelUtil; + import com.alibaba.excel.EasyExcel; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.ProductDto; import com.ruoyi.basic.dto.StructureTestObjectDto; +import com.ruoyi.basic.excel.ExcelMultiSheetImporter; import com.ruoyi.common.core.domain.Result; -import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.basic.dto.PageTestObjectDto; import com.ruoyi.basic.dto.ProductDTO1; import com.ruoyi.basic.excel.StructureTestObjectData; import com.ruoyi.basic.excel.StructureTestObjectListener; import com.ruoyi.basic.pojo.Product; -import com.ruoyi.basic.pojo.StandardTemplate; import com.ruoyi.basic.pojo.StructureItemParameter; import com.ruoyi.basic.pojo.StructureTestObject; import com.ruoyi.basic.service.CapacityScopeService; @@ -27,18 +23,13 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; /** * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ帶鍒跺眰 @@ -152,240 +143,16 @@ return Result.success(capacityScopeService.getItemTree()); } - - @ApiOperation(value = "瑁呭瀵煎叆妫�楠岄」鐩�") @PostMapping("/importEquipData") - @Transactional - public Result importEquipData(@RequestParam("file") MultipartFile file) throws Exception { - InputStream inputStream = file.getInputStream(); - List<StructureItemParameter> lists = new ArrayList<>(); - AtomicReference<String> sample = new AtomicReference<>(); - ExcelUtil.readBySax(inputStream, -1, (i, l, list1) -> { - if (l == 1) { - sample.set(list1.get(1) + ""); - } - if (l >= 1) { - StructureItemParameter str = new StructureItemParameter(); - // 娴嬭瘯瀵硅薄 - if (list1.get(1) == null) { - str.setSample(null); - } else { - String brand = (String) list1.get(1); - StringBuilder builder = new StringBuilder(); - builder.append("["); - // 浜у搧 - if (ObjectUtil.isNotEmpty(list1.get(2))) { - String production = (String) list1.get(2); - if (!production.contains("锛�")) { - builder.append(String.format("[\"%s\",\"%s\"]", brand, production)); - } else { - Arrays.stream(production.split("锛�")).forEach(item -> { - builder.append(String.format("[\"%s\",\"%s\"],", brand, item)); - }); - builder.deleteCharAt(builder.length() - 1); - } - } else { - builder.append("["); - builder.append(String.format("\"%s\"", brand)); - builder.append("]"); - } - builder.append("]"); - str.setSample(builder.toString()); - } - // 妫�楠岄」 - str.setInspectionItem(list1.get(4).toString().trim()); - // 妫�楠岄」鑻辨枃 - if (list1.get(5) != null) { - str.setInspectionItemEn(list1.get(5).toString()); - } - // 妫�楠屽瓙椤� - if (list1.get(6) == null) { - str.setInspectionItemSubclass(null); - } else { - str.setInspectionItemSubclass(list1.get(6).toString().trim()); - } - // 妫�楠屽瓙椤硅嫳鏂� - if (list1.get(7) == null) { - str.setInspectionItemSubclassEn(null); - } else { - str.setInspectionItemSubclassEn(String.valueOf(list1.get(7).toString())); - } - // 妫�楠岄」鍒嗙被 - if (list1.get(22) != null && list1.get(22) != "") { - str.setInspectionItemClass(list1.get(22).toString().trim()); - } else { - str.setInspectionItemClass(null); - } - // 妫�楠岄」鍒嗙被鑻辨枃 - if (list1.get(23) != null && list1.get(23) != "") { - str.setInspectionItemClassEn(list1.get(23) + ""); - } else { - str.setInspectionItemClassEn(null); - } - - LambdaQueryWrapper<StructureItemParameter> wrapper = Wrappers.lambdaQuery(StructureItemParameter.class) - .eq(StructureItemParameter::getInspectionItem, str.getInspectionItem()) - .eq(StructureItemParameter::getSample, str.getSample()) - - .last("limit 1"); - // 鍒ゆ柇鏄惁鏈夋楠岄」绫诲瀷 - if (ObjectUtils.isNotEmpty(str.getInspectionItemClass())) { - wrapper.eq(StructureItemParameter::getInspectionItemClass, str.getInspectionItemClass()); - } - - // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤� - if (ObjectUtils.isNotEmpty(str.getInspectionItemSubclass())) { - wrapper.eq(StructureItemParameter::getInspectionItemSubclass, str.getInspectionItemSubclass()); - } - StructureItemParameter db_str = structureItemParameterService.getOne(wrapper); - if (ObjectUtils.isNotEmpty(db_str)) { - str.setId(db_str.getId()); - } - // 鏂规硶鍚嶇О - if (list1.get(8) == null) { - str.setMethod(null); - } else { - StringBuffer buffer = new StringBuffer(); - String input = list1.get(8).toString(); - buffer.append("["); - String[] values = input.split("锛�"); - for (String value : values) { - buffer.append("\"").append(value.trim()).append("\","); - } - buffer.deleteCharAt(buffer.length() - 1); - buffer.append("]"); - str.setMethod(buffer.toString()); - } - // 璇曢獙瀹� - if (list1.get(9) == null) { - str.setSonLaboratory(null); - } else { - str.setSonLaboratory(list1.get(9).toString()); - } - // 璁¢噺鍗曚綅 - if (list1.get(10) == null) { - str.setUnit(null); - } else { - str.setUnit(list1.get(10).toString()); - } - // 瑕佹眰鍊� - if (list1.get(11) == null) { - str.setAskTell(null); - } else { - str.setAskTell(list1.get(11).toString()); - } - // 瑕佹眰鎻忚堪 - if (list1.get(12) == null) { - str.setAsk(null); - } else { - str.setAsk(list1.get(12).toString()); - } - // 鍗曚环 - if (list1.get(13) == null) { - str.setPrice(null); - } else { - str.setPrice(list1.get(13) + ""); - } - // 宸ユ椂绯绘暟 - if (list1.get(14) == null) { - str.setManHour(null); - } else { - str.setManHour(Double.valueOf(list1.get(14).toString())); - } - // 宸ユ椂鍒嗙粍 - if (list1.get(15) == null) { - str.setManHourGroup(null); - } else { - str.setManHourGroup(list1.get(15).toString()); - } - // 棰勮瀹屾垚鏃堕棿 - if (list1.get(16) == null) { - str.setManDay(null); - } else { - str.setManDay(Integer.valueOf(list1.get(16).toString())); - } - // 鏁版嵁绫诲瀷 - String jy; - if (list1.get(17).toString().equals("闈為噰闆嗙被鍨�")) { - jy = "0"; - } else { - jy = "1"; - } - str.setInspectionItemType(jy); - // 妫�楠岄」绫诲瀷 - String validateValueType = list1.get(18).toString(); - if (ObjectUtils.isNotEmpty(validateValueType)) { - List<SysDictData> enums = dictTypeService.selectDictDataByName("妫�楠屽�肩被鍨�") - .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(validateValueType)).collect(Collectors.toList()); - str.setInspectionValueType(enums.get(0).getDictValue()); - } - int bsm; - //鐗规畩鏍囪瘑 - if (list1.get(19).toString().equals("鍚�")) { - bsm = 0; - } else { - bsm = 1; - } - str.setBsm(bsm + ""); - // 鏁板瓧瀛楀吀 - if (list1.get(20) != null) { - str.setDic(list1.get(20) + ""); - } else { - str.setDic(null); - } - // 鍘熷璁板綍妯℃澘 - StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list1.get(21))); - if (standTempIdByName != null) { - str.setTemplateId(standTempIdByName.getId()); - } else { - str.setTemplateId(null); - } - try { - if (list1.get(24) != null) { - str.setLaboratory(list1.get(24) + ""); - } - } catch (Exception e) { - } - - // 鏉′欢 - if (list1.get(25) == null) { - str.setRadiusList(null); - } else { - StringBuffer buffer = new StringBuffer(); - String input = list1.get(25).toString(); - buffer.append("["); - String[] values = input.split("锛�"); - for (String value : values) { - buffer.append("\"").append(value.trim()).append("\","); - } - buffer.deleteCharAt(buffer.length() - 1); - buffer.append("]"); - str.setRadiusList(buffer.toString()); - } - //鏀惰垂鏍囧噯 - if (list1.get(26) == null) { - str.setRates(null); - } else { - str.setRates(list1.get(26) + ""); - } - - lists.add(str); - } - }); -// structureItemParameterService.removeNoSample(sample.get()); - // 濡傛灉鏁版嵁搴撻噷闈㈢殑鏁版嵁瀛樺湪閭d箞灏辨墽琛屾洿鏂版嫹璐濇搷浣� - try { - structureItemParameterService.saveOrUpdateBatch(lists); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("鏈嶅姟绔姤閿�"); - } - return Result.success(); + public Result importData(@RequestParam("file") MultipartFile file) { + // 璋冪敤瀵煎叆宸ュ叿 + String result = ExcelMultiSheetImporter.importExcel(file, structureItemParameterService, standardTemplateService, dictTypeService); + return Result.success(result); } @ApiOperation(value = "瀵煎叆妫�楠屽璞�") @PostMapping("/importExcel") - public Result importExcel(@RequestParam("file") MultipartFile file){ + public Result importExcel(@RequestParam("file") MultipartFile file) { List<String> processedFiles = new ArrayList<>(); try (InputStream inputStream = file.getInputStream()) { String fileHash = DigestUtils.md5Hex(inputStream); diff --git a/basic-server/src/main/java/com/ruoyi/basic/excel/ExcelMultiSheetImporter.java b/basic-server/src/main/java/com/ruoyi/basic/excel/ExcelMultiSheetImporter.java new file mode 100644 index 0000000..56159cb --- /dev/null +++ b/basic-server/src/main/java/com/ruoyi/basic/excel/ExcelMultiSheetImporter.java @@ -0,0 +1,31 @@ +package com.ruoyi.basic.excel; + +import com.alibaba.excel.EasyExcel; +import com.ruoyi.basic.pojo.StructureItemParameter; +import com.ruoyi.basic.service.StandardTemplateService; +import com.ruoyi.basic.service.StructureItemParameterService; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysDictTypeService; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public class ExcelMultiSheetImporter { + + public static String importExcel(MultipartFile file, StructureItemParameterService service, StandardTemplateService standardTemplateService, + ISysDictTypeService dictTypeService) { + try { + // 璇诲彇鎵�鏈塖heet锛堥�氳繃鐩戝惉鍣ㄥ鐞嗘瘡涓猄heet锛� + EasyExcel.read(file.getInputStream()) + .head(StructureItemParameter.class) + // 娉ㄥ唽鐩戝惉鍣紙姣忎釜Sheet鍏辩敤鍚屼竴涓洃鍚櫒锛� + .registerReadListener(new MultiSheetImportListener(service, standardTemplateService, dictTypeService)) + // 鑷姩璇嗗埆鎵�鏈塖heet骞堕亶鍘嗚鍙� + .doReadAll(); + return "瀵煎叆鎴愬姛"; + } catch (IOException e) { + System.out.println(e.getMessage()); + return "瀵煎叆澶辫触锛�" + StringUtils.substring(e.getMessage(), 0, 100); + } + } +} \ No newline at end of file diff --git a/basic-server/src/main/java/com/ruoyi/basic/excel/MultiSheetImportListener.java b/basic-server/src/main/java/com/ruoyi/basic/excel/MultiSheetImportListener.java new file mode 100644 index 0000000..281061c --- /dev/null +++ b/basic-server/src/main/java/com/ruoyi/basic/excel/MultiSheetImportListener.java @@ -0,0 +1,224 @@ +package com.ruoyi.basic.excel; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.excel.util.ListUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.basic.pojo.StandardTemplate; +import com.ruoyi.basic.pojo.StructureItemParameter; +import com.ruoyi.basic.service.StandardTemplateService; +import com.ruoyi.basic.service.StructureItemParameterService; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.system.service.ISysDictTypeService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@AllArgsConstructor +public class MultiSheetImportListener implements ReadListener<StructureItemParameter> { + + // 姣忔壒澶勭悊1000鏉℃暟鎹� + private static final int BATCH_COUNT = 1000; + private List<StructureItemParameter> cachedList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + private final StructureItemParameterService parameterService; + private String currentSheetName; + + private final ISysDictTypeService dictTypeService; + + private final StandardTemplateService standardTemplateService; + + public MultiSheetImportListener(StructureItemParameterService parameterService, StandardTemplateService standardTemplateService, + ISysDictTypeService dictTypeService) { + this.parameterService = parameterService; + this.standardTemplateService = standardTemplateService; + this.dictTypeService = dictTypeService; + } + + + @Override + public void invoke(StructureItemParameter data, AnalysisContext context) { + data.setId(null); + // 娴嬭瘯瀵硅薄 + if (data.getSample() == null) { + data.setSample(null); + } else { + String brand = data.getSample(); + StringBuilder builder = new StringBuilder(); + builder.append("["); + // 浜у搧 + if (ObjectUtil.isNotEmpty(data.getProduct())) { + String production = data.getProduct(); + if (!production.contains("锛�")) { + builder.append(String.format("[\"%s\",\"%s\"]", brand, production)); + } else { + Arrays.stream(production.split("锛�")).forEach(item -> { + builder.append(String.format("[\"%s\",\"%s\"],", brand, item)); + }); + builder.deleteCharAt(builder.length() - 1); + } + } else { + builder.append("["); + builder.append(String.format("\"%s\"", brand)); + builder.append("]"); + } + builder.append("]"); + data.setSample(builder.toString()); + } + + // 鏌ヨ鏁版嵁搴撲腑鏄惁瀛樺湪鐩稿悓璁板綍 + LambdaQueryWrapper<StructureItemParameter> wrapper = Wrappers.lambdaQuery(StructureItemParameter.class) + .eq(StructureItemParameter::getInspectionItem, data.getInspectionItem()) + .eq(StructureItemParameter::getSample, data.getSample()) + .last("limit 1"); + + // 鍒ゆ柇鏄惁鏈夋楠岄」绫诲瀷 + if (ObjectUtils.isNotEmpty(data.getInspectionItemClass())) { + wrapper.eq(StructureItemParameter::getInspectionItemClass, data.getInspectionItemClass()); + } + + // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤� + if (ObjectUtils.isNotEmpty(data.getInspectionItemSubclass())) { + wrapper.eq(StructureItemParameter::getInspectionItemSubclass, data.getInspectionItemSubclass()); + } + + StructureItemParameter db_str = parameterService.getOne(wrapper); + if (db_str != null) { + // 鑻ラ渶鏇存柊锛岃缃� id + data.setId(db_str.getId()); + } + + // 鍘熷璁板綍妯℃澘 + StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(data.getTemplateName())); + if (standTempIdByName != null) { + data.setTemplateId(standTempIdByName.getId()); + } else { + data.setTemplateId(null); + } + + // 鏁版嵁绫诲瀷 + String jy; + String inspectionType = data.getInspectionItemType() != null ? + data.getInspectionItemType().toString() : ""; + if ("闈為噰闆嗙被鍨�".equals(inspectionType)) { + jy = "0"; + } else { + jy = "1"; + } + data.setInspectionItemType(jy); + + // 鏂规硶鍚嶇О + if (data.getMethod() == null) { + data.setMethod(null); + } else { + StringBuffer buffer = new StringBuffer(); + String input = data.getMethod().toString(); + buffer.append("["); + String[] values = input.split("锛�"); + for (String value : values) { + buffer.append("\"").append(value.trim()).append("\","); + } + buffer.deleteCharAt(buffer.length() - 1); + buffer.append("]"); + data.setMethod(buffer.toString()); + } + + // 鐗规畩鏍囪瘑 + String bs; + String bsmValue = data.getBsm() == null ? "" : data.getBsm().trim(); + if ("鍚�".equals(bsmValue)) { + bs = "0"; + } else { + bs = "1"; + } + data.setBsm(bs); + + //妫�楠岄」绫诲瀷 + String validateValueType = data.getInspectionValueType().toString(); + if (ObjectUtils.isNotEmpty(validateValueType)) { + List<SysDictData> enums = dictTypeService.selectDictDataByName("妫�楠屽�肩被鍨�") + .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(validateValueType)).collect(Collectors.toList()); + data.setInspectionValueType(enums.get(0).getDictValue()); + } + + // 鏉′欢 + if (data.getRadiusList() == null) { + data.setRadiusList(null); + } else { + StringBuffer buffer = new StringBuffer(); + String input = data.getRadiusList(); + buffer.append("["); + String[] values = input.split("锛�"); + for (String value : values) { + buffer.append("\"").append(value.trim()).append("\","); + } + buffer.deleteCharAt(buffer.length() - 1); + buffer.append("]"); + data.setRadiusList(buffer.toString()); + } + + if (data.getManDay() == null) { + data.setManDay(null); + } + + // 璁剧疆褰撳墠Sheet鍚嶄负鍒嗙被鏍囪瘑 + data.setInspectionItemClass(currentSheetName); + + // 娣诲姞鍒扮紦瀛樺垪琛� + cachedList.add(data); + + // 杈惧埌鎵规澶勭悊闃堝�兼椂鍏ュ簱 + if (cachedList.size() >= BATCH_COUNT) { + saveData(); + cachedList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 鏈�鍚庝竴鎵规暟鎹鐞� + if (!cachedList.isEmpty()) { + saveData(); + } + log.info("Sheet [{}] 瀵煎叆瀹屾垚", currentSheetName); + } + + @Override + public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) { + this.currentSheetName = context.readSheetHolder().getSheetName(); + } + + private void saveData() { + // 鎵归噺鎻掑叆锛堜娇鐢ㄨ嫢渚漇ervice灞傛柟娉曪級 + parameterService.saveOrUpdateBatch(cachedList); + } + + @Override + public void onException(Exception exception, AnalysisContext context) { + String sheetName = context.readSheetHolder().getSheetName(); + int rowIndex = context.readRowHolder().getRowIndex() + 1; + int columnIndex = -1; + String errorMsg = exception.getMessage(); + + // 閽堝 ExcelDataConvertException 鎻愬彇鍒楀彿 + if (exception instanceof ExcelDataConvertException) { + ExcelDataConvertException ex = (ExcelDataConvertException) exception; + columnIndex = ex.getColumnIndex() + 1; + errorMsg = String.format("鍒梉%s]鏁版嵁鏍煎紡閿欒: %s", + ex.getCellData().getStringValue(), + errorMsg + ); + } + // 鎵撳嵃瀹屾暣閿欒鍫嗘爤锛堣皟璇曟椂寮�鍚級 + log.error("Sheet[{}] 绗瑊}琛岀{}鍒楄В鏋愬け璐�: {}", sheetName, rowIndex, columnIndex, errorMsg); + } +} \ No newline at end of file diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java index 8fdbc4a..e926a00 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java +++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java @@ -1,11 +1,11 @@ package com.ruoyi.basic.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.ProductDTO1; import com.ruoyi.basic.pojo.Product; +import com.ruoyi.framework.mybatis_config.MyBaseMapper; import org.apache.ibatis.annotations.Param; /** @@ -14,7 +14,7 @@ * @createDate 2024-04-26 01:11:02 * @Entity com.ruoyi.basic.pojo.Product */ -public interface ProductMapper extends BaseMapper<Product> { +public interface ProductMapper extends MyBaseMapper<Product> { IPage<Product> selectProductListByObjectId(Page page, @Param("ew") QueryWrapper<ProductDTO1> ew, @Param("partNo") String partNo); } diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java index 449d6f0..ae82d26 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java +++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java @@ -1,12 +1,14 @@ package com.ruoyi.basic.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.PageTestObjectDto; import com.ruoyi.basic.pojo.StructureTestObject; +import com.ruoyi.framework.mybatis_config.MyBaseMapper; import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 妫�娴嬪璞�(StructureTestObject)琛ㄦ暟鎹簱璁块棶灞� @@ -14,7 +16,7 @@ * @author makejava * @since 2024-02-26 17:36:41 */ -public interface StructureTestObjectMapper extends BaseMapper<StructureTestObject> { +public interface StructureTestObjectMapper extends MyBaseMapper<StructureTestObject> { IPage<PageTestObjectDto> selectTestObjectList(Page page, @Param("ew") QueryWrapper<PageTestObjectDto> ew, @Param("specimenName") String specimenName); diff --git a/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java b/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java index 7faa8be..a2b34ba 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java +++ b/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; +import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; import java.io.Serializable; @@ -14,108 +15,235 @@ * @author makejava * @since 2024-02-26 16:21:17 */ -@TableName(value ="structure_item_parameter") +@TableName(value = "structure_item_parameter") @Data public class StructureItemParameter implements Serializable { + + /** + * 涓婚敭 + */ @ApiModelProperty(value = "涓婚敭") @TableId(type = IdType.AUTO) private Integer id; + /** + * 妫�楠岄」 + */ @ApiModelProperty(value = "妫�楠岄」") + @ExcelProperty(value = "妫�娴嬪弬鏁板悕绉�",index = 4) private String inspectionItem; + /** + * 妫�楠岄」EN + */ @ApiModelProperty(value = "妫�楠岄」EN") + @ExcelProperty(value = "妫�娴嬪弬鏁板悕绉帮紙EN锛�",index = 5) private String inspectionItemEn; + /** + * 妫�楠屽瓙椤� + */ @ApiModelProperty(value = "妫�楠屽瓙椤�") + @ExcelProperty(value = "妫�娴嬪瓙椤�",index = 6) private String inspectionItemSubclass; + /** + * 妫�楠屽瓙椤笶N + */ @ApiModelProperty(value = "妫�楠屽瓙椤笶N") + @ExcelProperty(value = "妫�娴嬪瓙椤�(EN)",index = 7) private String inspectionItemSubclassEn; + /** + * 妫�楠屽璞� + */ @ApiModelProperty(value = "妫�楠屽璞�") + @ExcelProperty(value = "娴嬭瘯瀵硅薄",index = 1) private String sample; + /** + * 鍗曚环(鍏�) + */ @ApiModelProperty(value = "鍗曚环(鍏�)") + @ExcelProperty(value = "鍗曚环",index = 13) private String price; + /** + * 鍦烘墍 + */ @ApiModelProperty(value = "鍦烘墍") + @ExcelProperty(value = "鍦烘墍",index = 24) private String laboratory; + /** + * 璇曢獙瀹� + */ @ApiModelProperty(value = "璇曢獙瀹�") + @ExcelProperty(value = "璇曢獙瀹�",index = 9) private String sonLaboratory; + /** + * 瑕佹眰鎻忚堪 + */ @ApiModelProperty(value = "瑕佹眰鎻忚堪") + @ExcelProperty(value = "鏍囧噯鏄剧ず",index = 11) private String askTell; + /** + * 瑕佹眰鍊� + */ @ApiModelProperty(value = "瑕佹眰鍊�") + @ExcelProperty(value = "鍒ゆ柇瑕佹眰",index = 12) private String ask; + /** + * 璁¢噺鍗曚綅 + */ @ApiModelProperty(value = "璁¢噺鍗曚綅") + @ExcelProperty(value = "璁¢噺鍗曚綅",index = 10) private String unit; + /** + * 璇曢獙鏂规硶 + */ @ApiModelProperty(value = "璇曢獙鏂规硶") + @ExcelProperty(value = "鏂规硶鍚嶇О",index = 8) private String method; + /** + * 宸ユ椂(H) + */ @ApiModelProperty(value = "宸ユ椂(H)") + @ExcelProperty(value = "宸ユ椂绯绘暟",index = 14) private Double manHour; + /** + * 棰勮鏃堕棿(H) + */ @ApiModelProperty(value = "棰勮鏃堕棿(H)") + @ExcelProperty(value = "棰勮瀹屾垚鏃堕棿",index = 16) private Integer manDay; + /** + * 宸ユ椂鍒嗙粍 + */ @ApiModelProperty(value = "宸ユ椂鍒嗙粍") + @ExcelProperty(value = "宸ユ椂鍒嗙粍",index = 15) private String manHourGroup; + /** + * 妫�楠岄」绫诲瀷 + */ @ApiModelProperty(value = "妫�楠岄」绫诲瀷") + @ExcelProperty(value = "鏁版嵁绫诲瀷",index = 17) private String inspectionItemType; + /** + * 妫�楠屽�肩被鍨� + */ @ApiModelProperty(value = "妫�楠屽�肩被鍨�") + @ExcelProperty(value = "妫�楠屽�肩被鍨�",index = 18) private String inspectionValueType; + /** + * 妫�楠屾鏁� + */ @ApiModelProperty(value = "妫�楠屾鏁�") private Integer checkoutNumber; + /** + * 鍖洪棿 + */ @ApiModelProperty(value = "鍖洪棿") private String section; + /** + * 鐗规畩鏍囪瘑 + */ @ApiModelProperty(value = "鐗规畩鏍囪瘑") + @ExcelProperty(value = "鐗规畩鏍囪瘑",index = 19) private String bsm; + /** + * 鍘熷璁板綍妯℃澘 + */ @ApiModelProperty(value = "鍘熷璁板綍妯℃澘") private Integer templateId; + @TableField(exist = false) + @ExcelProperty(value = "鍘熷璁板綍妯℃澘",index = 21) + private String templateName; + + /** + * 鍒涘缓浜篿d + */ @ApiModelProperty(value = "鍒涘缓浜篿d") @TableField(fill = FieldFill.INSERT) private Integer createUser; + /** + * 淇敼浜篿d + */ @ApiModelProperty(value = "淇敼浜篿d") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; + /** + * 鍒涘缓鏃堕棿 + */ @ApiModelProperty(value = "鍒涘缓鏃堕棿") @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; + /** + * 淇敼鏃堕棿 + */ @ApiModelProperty(value = "淇敼鏃堕棿") @TableField(fill = FieldFill.INSERT_UPDATE) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; + /** + * 瀛楀吀绫诲瀷 + */ @ApiModelProperty(value = "瀛楀吀绫诲瀷") + @ExcelProperty(value = "鏁版嵁瀛楀吀",index = 20) private String dic; + /** + * 妫�楠岄」鍒嗙被 + */ @ApiModelProperty(value = "妫�楠岄」鍒嗙被") + @ExcelProperty(value = "妫�楠岄」鍒嗙被",index = 22) private String inspectionItemClass; + /** + * 妫�楠岄」鍒嗙被EN + */ @ApiModelProperty(value = "妫�楠岄」鍒嗙被EN") + @ExcelProperty(value = "妫�楠岄」鍒嗙被",index = 23) private String inspectionItemClassEn; + /** + * 鏉′欢 + */ @ApiModelProperty(value = "鏉′欢") + @ExcelProperty(value = "璇曢獙鏉′欢",index = 25) private String radiusList; + /** + * 鏀惰垂鏍囧噯(鍏�/娆�) + */ @ApiModelProperty(value = "鏀惰垂鏍囧噯(鍏�/娆�)") + @ExcelProperty(value = "鏀惰垂鏍囧噯",index = 26) private String rates; -} + @TableField(exist = false) + @ExcelProperty(value = "浜у搧",index = 2) + private String product; + @ExcelProperty(value = "妫�娴嬪弬鏁扮紪鍙�",index = 3) + @TableField(exist = false) + private String parameterNumber; +} \ No newline at end of file diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java index c58580b..d59f70f 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java +++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java @@ -2,10 +2,8 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -22,11 +20,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ湇鍔″疄鐜扮被 @@ -192,132 +189,228 @@ public List<TestItemDto> getItemTree() { return structureItemParameterMapper.getItemTree(); } - + @Transactional(rollbackFor = Exception.class) @Override public void importPartExcel(List<StructureTestObjectData> list) { - // 鎵归噺鏌ヨ StructureTestObject - Map<String, StructureTestObject> structureTestObjectMap = getStructureTestObjectMap(list); - // 鎵归噺鏌ヨ WorkShop - Map<String, WorkShop> workShopMap = getWorkShopMap(list); + // 闃舵1: 鏁版嵁棰勫鐞� + // 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑鏍囨湰淇℃伅 + Set<String> specimenKeys = list.stream() + .map(i -> i.getSpecimenName() + "|" + i.getSpecimenNameEn()) + .collect(Collectors.toSet()); - List<StructureTestObject> insertStructureTestObjects = new ArrayList<>(); - List<StructureTestObject> updateStructureTestObjects = new ArrayList<>(); - List<Product> insertProducts = new ArrayList<>(); - List<Product> updateProducts = new ArrayList<>(); + // 闃舵2: 鎵归噺鏌ヨ鐜版湁缁撴瀯娴嬭瘯瀵硅薄 + Map<String, StructureTestObject> existStructureTestObjects = structureTestObjectMapper.selectList( + Wrappers.<StructureTestObject>lambdaQuery() + .in(StructureTestObject::getSpecimenName, list.stream().map(StructureTestObjectData::getSpecimenName).collect(Collectors.toSet())) + .in(StructureTestObject::getSpecimenNameEn, list.stream().map(StructureTestObjectData::getSpecimenNameEn).collect(Collectors.toSet())) + ).stream().collect(Collectors.toMap( + obj -> obj.getSpecimenName() + "|" + obj.getSpecimenNameEn(), + Function.identity(), + (existing, replacement) -> existing // 澶勭悊閲嶅閿� + )); - for (StructureTestObjectData data : list) { - String key = data.getSpecimenName() + "_" + data.getSpecimenNameEn(); - StructureTestObject structureTestObject = structureTestObjectMap.get(key); - - if (ObjectUtils.isEmpty(structureTestObject)) { - structureTestObject = createStructureTestObject(data); - insertStructureTestObjects.add(structureTestObject); - } else { - updateStructureTestObject(structureTestObject, data); - updateStructureTestObjects.add(structureTestObject); - } - - String productKey = data.getName() + "_" + data.getNameEn(); - Product product = productMapper.selectOne(new LambdaQueryWrapper<Product>() - .eq(Product::getName, data.getName()) - .eq(Product::getNameEn, data.getNameEn())); - - if (ObjectUtils.isEmpty(product)) { - product = createProduct(data, structureTestObject.getId(), workShopMap); - insertProducts.add(product); - } else { - updateProduct(product, data, structureTestObject.getId(), workShopMap); - updateProducts.add(product); - } - } - - // 鎵归噺鎻掑叆鍜屾洿鏂� - if (!insertStructureTestObjects.isEmpty()) { - structureTestObjectService.saveOrUpdateBatch(insertStructureTestObjects); - } - if (!updateStructureTestObjects.isEmpty()) { - structureTestObjectService.updateBatchById(updateStructureTestObjects); - } - if (!insertProducts.isEmpty()) { - productService.saveOrUpdateBatch(insertProducts); - } - if (!updateProducts.isEmpty()) { - productService.updateBatchById(updateProducts); - } - } - - private Map<String, StructureTestObject> getStructureTestObjectMap(List<StructureTestObjectData> list) { - List<String> specimenNames = list.stream().map(StructureTestObjectData::getSpecimenName).collect(Collectors.toList()); - List<String> specimenNamesEn = list.stream().map(StructureTestObjectData::getSpecimenNameEn).collect(Collectors.toList()); - List<StructureTestObject> structureTestObjects = structureTestObjectMapper.selectList(new LambdaQueryWrapper<StructureTestObject>() - .in(StructureTestObject::getSpecimenName, specimenNames) - .in(StructureTestObject::getSpecimenNameEn, specimenNamesEn)); - Map<String, StructureTestObject> map = new HashMap<>(); - for (StructureTestObject obj : structureTestObjects) { - map.put(obj.getSpecimenName() + "_" + obj.getSpecimenNameEn(), obj); - } - return map; - } - - private Map<String, WorkShop> getWorkShopMap(List<StructureTestObjectData> list) { - List<String> workShopNames = list.stream() + // 闃舵3: 棰勫鐞嗚溅闂翠俊鎭� + Set<String> workShopNames = list.stream() .map(StructureTestObjectData::getWorkShopName) .filter(StringUtils::isNotEmpty) - .distinct() - .collect(Collectors.toList()); - List<WorkShop> workShops = workShopMapper.selectList(new LambdaQueryWrapper<WorkShop>() - .in(WorkShop::getName, workShopNames)); - Map<String, WorkShop> map = new HashMap<>(); - for (WorkShop workShop : workShops) { - map.put(workShop.getName(), workShop); - } - return map; - } + .collect(Collectors.toSet()); - private StructureTestObject createStructureTestObject(StructureTestObjectData data) { - StructureTestObject structureTestObject = new StructureTestObject(); - structureTestObject.setLaboratoryId(9); - structureTestObject.setSpecimenName(data.getSpecimenName()); - structureTestObject.setSpecimenNameEn(data.getSpecimenNameEn()); - structureTestObject.setCode(data.getCode()); - structureTestObject.setWorkShopName(""); - return structureTestObject; - } + Map<String, WorkShop> workShopCache = workShopNames.isEmpty() ? + Collections.emptyMap() : + workShopMapper.selectList(Wrappers.<WorkShop>lambdaQuery() + .in(WorkShop::getName, workShopNames)) + .stream() + .collect(Collectors.toMap(WorkShop::getName, Function.identity())); - private void updateStructureTestObject(StructureTestObject structureTestObject, StructureTestObjectData data) { - structureTestObject.setCode(data.getCode()); - structureTestObject.setLaboratoryId(9); - } + // 闃舵4: 鍑嗗鎵归噺鎿嶄綔鏁版嵁 + List<StructureTestObject> structureTestObjectsToInsert = new ArrayList<>(); + List<StructureTestObject> structureTestObjectsToUpdate = new ArrayList<>(); + List<Product> productsToInsert = new ArrayList<>(); + List<Product> productsToUpdate = new ArrayList<>(); - private Product createProduct(StructureTestObjectData data, Integer objectId, Map<String, WorkShop> workShopMap) { - Product product = new Product(); - product.setName(data.getName()); - product.setNameEn(data.getNameEn()); - if (StringUtils.isNotEmpty(data.getWorkShopName())) { - WorkShop workShop = workShopMap.get(data.getWorkShopName()); - if (workShop == null) { - throw new BaseException("璇峰厛缁存姢杞﹂棿淇℃伅"); + // 闃舵5: 涓诲鐞嗛�昏緫锛堜粎澶勭悊缁撴瀯娴嬭瘯瀵硅薄锛� + List<StructureTestObjectData> pendingProducts = new ArrayList<>(); // 鏂板锛氭殏瀛樺緟澶勭悊鐨勪骇鍝佹暟鎹� + + for (StructureTestObjectData i : list) { + // 澶勭悊缁撴瀯娴嬭瘯瀵硅薄锛堥�昏緫涓嶅彉锛� + String specimenKey = i.getSpecimenName() + "|" + i.getSpecimenNameEn(); + StructureTestObject structureTestObject = existStructureTestObjects.get(specimenKey); + + if (structureTestObject == null) { + StructureTestObject newObj = createNewStructureTestObject(i, workShopCache); // 淇敼锛氫紶鍏ヨ溅闂寸紦瀛� + structureTestObjectsToInsert.add(newObj); + existStructureTestObjects.put(specimenKey, newObj); + } else { + updateExistingStructureTestObject(structureTestObject, i); + structureTestObjectsToUpdate.add(structureTestObject); } - product.setWorkShopId(workShop.getId()); + + // 鏆傚瓨浜у搧澶勭悊鏁版嵁锛堟柊澧烇級 + pendingProducts.add(i); } - product.setWorkShopName(data.getWorkShopName()); - product.setObjectId(objectId); - return product; + + // 闃舵6: 鍏堝鐞嗙粨鏋勬祴璇曞璞℃壒閲忔搷浣� + executeStructureTestObjectBatch(structureTestObjectsToInsert, structureTestObjectsToUpdate); + + // 闃舵7: 鏇存柊缂撳瓨涓殑ID锛堝叧閿柊澧炴楠わ級 + refreshStructureTestObjectIds(existStructureTestObjects, structureTestObjectsToInsert); + + // 闃舵8: 澶勭悊浜у搧鏁版嵁 + processProducts(pendingProducts, existStructureTestObjects, workShopCache, + productsToInsert, productsToUpdate); + + // 闃舵9: 鎵ц浜у搧鎵归噺鎿嶄綔 + executeProductBatch(productsToInsert, productsToUpdate); } - private void updateProduct(Product product, StructureTestObjectData data, Integer objectId, Map<String, WorkShop> workShopMap) { - if (StringUtils.isNotEmpty(data.getWorkShopName())) { - WorkShop workShop = workShopMap.get(data.getWorkShopName()); - if (workShop == null) { - throw new BaseException("璇峰厛缁存姢杞﹂棿淇℃伅"); - } - product.setWorkShopId(workShop.getId()); + // 鏇存柊鐜版湁缁撴瀯娴嬭瘯瀵硅薄 + private void updateExistingStructureTestObject(StructureTestObject obj, StructureTestObjectData data) { + obj.setCode(data.getCode()); + obj.setLaboratoryId(9); + } + + // 澶勭悊浜у搧鏁版嵁 + private void processProductData(StructureTestObjectData data, + Integer objectId, + Map<String, WorkShop> workShopCache, + List<Product> insertList, + List<Product> updateList) { + // 鏋勫缓浜у搧鍞竴鏍囪瘑 + String productKey = data.getName() + "|" + data.getNameEn(); + + // 妫�鏌ュ唴瀛樹腑鏄惁宸插鐞嗚繃璇ヤ骇鍝� + Optional<Product> existingProduct = findProductInBatchLists(productKey, insertList, updateList); + + // 濡傛灉鍐呭瓨涓笉瀛樺湪锛屾煡璇㈡暟鎹簱 + if (!existingProduct.isPresent()) { + Product dbProduct = productMapper.selectOne(Wrappers.<Product>lambdaQuery() + .eq(Product::getName, data.getName()) + .eq(Product::getNameEn, data.getNameEn()) + .last("limit 1")); + existingProduct = Optional.ofNullable(dbProduct); } - product.setWorkShopName(data.getWorkShopName()); + + // 鍒涘缓鎴栨洿鏂颁骇鍝� + Product product = existingProduct.orElseGet(Product::new); + boolean isNew = product.getId() == null; + + // 璁剧疆浜у搧灞炴�� + setupProduct(product, data, objectId, workShopCache); + + // 鍔犲叆瀵瑰簲鍒楄〃 + if (isNew) { + insertList.add(product); + } else { + updateList.add(product); + } + } + + // 鍦ㄤ骇鍝佹壒閲忓垪琛ㄤ腑鏌ユ壘 + private Optional<Product> findProductInBatchLists(String productKey, + List<Product> insertList, + List<Product> updateList) { + return Stream.concat(insertList.stream(), updateList.stream()) + .filter(p -> (p.getName() + "|" + p.getNameEn()).equals(productKey)) + .findFirst(); + } + + // 璁剧疆浜у搧淇℃伅 + private void setupProduct(Product product, + StructureTestObjectData data, + Integer objectId, + Map<String, WorkShop> workShopCache) { product.setName(data.getName()); product.setNameEn(data.getNameEn()); product.setObjectId(objectId); + // 澶勭悊杞﹂棿淇℃伅 + if (StringUtils.isNotEmpty(data.getWorkShopName())) { + WorkShop workShop = workShopCache.get(data.getWorkShopName()); + if (workShop == null) { + throw new BaseException("杞﹂棿淇℃伅鏈淮鎶�: " + data.getWorkShopName()); + } + product.setWorkShopId(workShop.getId()); + product.setWorkShopName(data.getWorkShopName()); + } } + + // 鍒涘缓缁撴瀯娴嬭瘯瀵硅薄锛堜娇鐢ㄧ紦瀛樿溅闂翠俊鎭級 + private StructureTestObject createNewStructureTestObject(StructureTestObjectData data, + Map<String, WorkShop> workShopCache) { + StructureTestObject obj = new StructureTestObject(); + obj.setLaboratoryId(9); + obj.setSpecimenName(data.getSpecimenName()); + obj.setSpecimenNameEn(data.getSpecimenNameEn()); + obj.setCode(data.getCode()); + obj.setObjectType(data.getObjectType()); + + // 浣跨敤缂撳瓨鑾峰彇杞﹂棿淇℃伅 + if (StringUtils.isNotEmpty(data.getWorkShopName())) { + WorkShop workShop = workShopCache.get(data.getWorkShopName()); + if (workShop == null) { + throw new BaseException("杞﹂棿淇℃伅鏈淮鎶�: " + data.getWorkShopName()); + } + obj.setWorkShopId(workShop.getId()); + obj.setWorkShopName(data.getWorkShopName()); + } else { + obj.setWorkShopName(""); + } + return obj; + } + + // 鍒锋柊缁撴瀯娴嬭瘯瀵硅薄ID锛堝叧閿柟娉曪級 + private void refreshStructureTestObjectIds( + Map<String, StructureTestObject> existStructureTestObjects, + List<StructureTestObject> insertedObjects) { + + insertedObjects.forEach(obj -> { + String key = obj.getSpecimenName() + "|" + obj.getSpecimenNameEn(); + existStructureTestObjects.get(key).setId(obj.getId()); // 鏇存柊缂撳瓨涓殑ID + }); + } + + // 澶勭悊浜у搧鏁版嵁锛堢嫭绔嬫柟娉曪級 + private void processProducts(List<StructureTestObjectData> pendingProducts, + Map<String, StructureTestObject> structureTestObjectCache, + Map<String, WorkShop> workShopCache, + List<Product> insertList, + List<Product> updateList) { + + // 闃舵5鍘熸湁浜у搧澶勭悊閫昏緫杩佺Щ鑷虫 + pendingProducts.forEach(i -> { + String specimenKey = i.getSpecimenName() + "|" + i.getSpecimenNameEn(); + StructureTestObject sto = structureTestObjectCache.get(specimenKey); + + processProductData( + i, + sto.getId(), // 姝ゆ椂ID宸叉纭缃� + workShopCache, + insertList, + updateList + ); + }); + } + + // 鍒嗘媶鎵归噺鎿嶄綔鏂规硶 + private void executeStructureTestObjectBatch(List<StructureTestObject> toInsert, + List<StructureTestObject> toUpdate) { + if (!toInsert.isEmpty()) { + structureTestObjectMapper.insertBatchSomeColumn(toInsert); + } + if (!toUpdate.isEmpty()) { + structureTestObjectService.updateBatchById(toUpdate); + } + } + + private void executeProductBatch(List<Product> toInsert, + List<Product> toUpdate) { + if (!toInsert.isEmpty()) { + productMapper.insertBatchSomeColumn(toInsert); + } + if (!toUpdate.isEmpty()) { + productService.updateBatchById(toUpdate); + } + } + } diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java index e78edbf..4b893f1 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java +++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java @@ -171,58 +171,76 @@ } public void addStructureTest(List<Object> structureTestObjectIdList, List<StandardMethod> standardMethodList) { + // 鐢ㄤ簬瀛樺偍鏂板銆佹洿鏂板拰鍒犻櫎鐨勬暟鎹� List<StandardMethod> updateList = new ArrayList<>(); List<Integer> deleteListId = new ArrayList<>(); List<StandardMethod> addList = new ArrayList<>(); - // 鍏堝皢 Excel 鏁版嵁鎸� key 鍒嗙粍 + // 鍏堝皢 Excel 鏁版嵁鎸� code 鍒嗙粍锛屽苟鍚堝苟 field Map<String, StandardMethod> excelDataMap = new HashMap<>(); for (StandardMethod excelMethod : standardMethodList) { String key = generateKey(excelMethod); - excelDataMap.put(key, excelMethod); + if (excelDataMap.containsKey(key)) { + // 濡傛灉宸插瓨鍦ㄧ浉鍚岀殑 code锛屽垯鍚堝苟 field + StandardMethod existingMethod = excelDataMap.get(key); + String mergedField = mergeFields(existingMethod.getField(), excelMethod.getField()); + existingMethod.setField(mergedField); + } else { + // 鍚﹀垯鐩存帴娣诲姞鍒� map 涓� + excelDataMap.put(key, excelMethod); + } } -// if (!structureTestObjectIdList.isEmpty()) { - // 浠� excel 涓殑缁勫悕鏌ヨ鏁版嵁搴撲腑鐨勫垎缁� - List<StandardMethod> allDbMethods = new ArrayList<>(); - for (Object j : structureTestObjectIdList) { - List<StandardMethod> standardMethods = baseMapper.selectList(new LambdaQueryWrapper<StandardMethod>() - .like(StandardMethod::getStructureTestObjectId, "\"" + j + "\"")); - allDbMethods.addAll(standardMethods); - } + // 鏌ヨ鏁版嵁搴撲腑鐨勫垎缁勬暟鎹� + List<StandardMethod> allDbMethods = new ArrayList<>(); + for (Object j : structureTestObjectIdList) { + List<StandardMethod> standardMethods = baseMapper.selectList( + new LambdaQueryWrapper<StandardMethod>() + .apply("JSON_CONTAINS(structure_test_object_id, {0})", j) // MySQL JSON 鏌ヨ + ); + allDbMethods.addAll(standardMethods); + } - // 灏嗘暟鎹簱鏁版嵁鎸� key 鍒嗙粍 - Map<String, StandardMethod> dbDataMap = new HashMap<>(); - for (StandardMethod dbMethod : allDbMethods) { - String key = generateKey(dbMethod); + // 灏嗘暟鎹簱鏁版嵁鎸� code 鍒嗙粍锛屽苟鍚堝苟 field + Map<String, StandardMethod> dbDataMap = new HashMap<>(); + for (StandardMethod dbMethod : allDbMethods) { + String key = generateKey(dbMethod); + if (dbDataMap.containsKey(key)) { + // 濡傛灉宸插瓨鍦ㄧ浉鍚岀殑 code锛屽垯鍚堝苟 field + StandardMethod existingMethod = dbDataMap.get(key); + String mergedField = mergeFields(existingMethod.getField(), dbMethod.getField()); + existingMethod.setField(mergedField); + } else { + // 鍚﹀垯鐩存帴娣诲姞鍒� map 涓� dbDataMap.put(key, dbMethod); } + } - // 澶勭悊鏇存柊鍜屾柊澧� - for (Map.Entry<String, StandardMethod> entry : excelDataMap.entrySet()) { - String key = entry.getKey(); - StandardMethod excelMethod = entry.getValue(); - StandardMethod dbMethod = dbDataMap.get(key); - if (dbMethod != null) { - // 鏇存柊 - excelMethod.setId(dbMethod.getId()); - updateList.add(excelMethod); - } else { - // 鏂板 - addList.add(excelMethod); - } + // 澶勭悊鏇存柊鍜屾柊澧� + for (Map.Entry<String, StandardMethod> entry : excelDataMap.entrySet()) { + String key = entry.getKey(); + StandardMethod excelMethod = entry.getValue(); + StandardMethod dbMethod = dbDataMap.get(key); + if (dbMethod != null) { + // 鏇存柊 + excelMethod.setId(dbMethod.getId()); + updateList.add(excelMethod); + } else { + // 鏂板 + addList.add(excelMethod); } + } - // 澶勭悊鍒犻櫎 - for (Map.Entry<String, StandardMethod> entry : dbDataMap.entrySet()) { - String key = entry.getKey(); - if (!excelDataMap.containsKey(key)) { - StandardMethod dbMethod = entry.getValue(); - deleteListId.add(dbMethod.getId()); - } + // 澶勭悊鍒犻櫎 + for (Map.Entry<String, StandardMethod> entry : dbDataMap.entrySet()) { + String key = entry.getKey(); + if (!excelDataMap.containsKey(key)) { + StandardMethod dbMethod = entry.getValue(); + deleteListId.add(dbMethod.getId()); } + } - + // 鎵ц鎵归噺鎿嶄綔 if (!addList.isEmpty()) { // 鏂板 baseMapper.insertBatchSomeColumn(addList); @@ -241,8 +259,26 @@ } } + private String mergeFields(String field1, String field2) { + if (field1 == null || field1.isEmpty()) { + return field2; + } + if (field2 == null || field2.isEmpty()) { + return field1; + } + + // 浣跨敤 Set 鍘婚噸 + String[] fields1 = field1.split(","); + String[] fields2 = field2.split(","); + Set<String> uniqueFields = new HashSet<>(Arrays.asList(fields1)); + uniqueFields.addAll(Arrays.asList(fields2)); + + // 杩斿洖閫楀彿鎷兼帴鐨勭粨鏋� + return String.join(",", uniqueFields); + } + private String generateKey(StandardMethod method) { - return method.getStructureTestObjectId() + "-" + method.getCode() + "-" + method.getField(); + return method.getCode(); } // 鏍煎紡鍖栨暟鎹� diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java index 1637118..e7b0af4 100644 --- a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java @@ -1,11 +1,11 @@ package com.ruoyi.device.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceDto; import com.ruoyi.device.pojo.Device; +import com.ruoyi.framework.mybatis_config.MyBaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -15,7 +15,7 @@ /** * 璁惧(Device)琛ㄦ暟鎹簱璁块棶灞� */ -public interface DeviceMapper extends BaseMapper<Device> { +public interface DeviceMapper extends MyBaseMapper<Device> { IPage<Device> selectDeviceParameter(Page page, QueryWrapper<Device> ew); List<Device> selectEquipmentOverview(Page page, QueryWrapper<Device> ew); diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java index f1aacac..3f9b658 100644 --- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java +++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java @@ -607,12 +607,12 @@ } } - // 鎵归噺鎻掑叆锛堜娇鐢∕yBatis-Plus鐨刬nsertBatch锛岄粯璁atchSize=1000锛� + // 鎵归噺鎻掑叆 if (CollUtil.isNotEmpty(toInsert)) { - saveOrUpdateBatch(toInsert); + baseMapper.insertBatchSomeColumn(toInsert); } - // 鎵归噺鏇存柊锛堜娇鐢∕yBatis-Plus鐨剈pdateBatchById锛岄粯璁atchSize=1000锛� + // 鎵归噺鏇存柊 if (CollUtil.isNotEmpty(toUpdate)) { updateBatchById(toUpdate); } diff --git a/pom.xml b/pom.xml index 2a75212..bc9706c 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ <minio.version>8.4.3</minio.version> <okhttp.version>4.9.0</okhttp.version> <hutool.version>5.8.18</hutool.version> - <easyexcel.version>3.3.2</easyexcel.version> + <easyexcel.version>3.3.3</easyexcel.version> <poi.tl.version>1.12.2</poi.tl.version> </properties> diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonDto.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonDto.java index 50e8481..38b73f9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonDto.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonDto.java @@ -17,4 +17,6 @@ private Integer roleId; + private Integer deptId; + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonnelHeaderApi.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonnelHeaderApi.java index 120e899..38b17d1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonnelHeaderApi.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PersonnelHeaderApi.java @@ -183,6 +183,7 @@ user.setIsCustom(0); user.setPassword(SecurityUtils.encryptPassword("zttZTT123!")); user.setCompany(BeanUtil.isNotEmpty(custom) ? (custom.getId() + "") : companyName); + user.setDeptId(personDto.getDeptId()); userMapper.insert(user); } else { user.setName(person.getName()); @@ -190,6 +191,7 @@ user.setEmail(person.getCompanyEmail()); user.setIsCustom(0); user.setCompany(BeanUtil.isNotEmpty(custom) ? (custom.getId() + "") : companyName); + user.setDeptId(personDto.getDeptId()); userMapper.updateById(user); } }); -- Gitblit v1.9.3