From 54f3f9d6c99f6890c39ff05b1e251a555709341a Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 08 四月 2025 11:55:36 +0800
Subject: [PATCH] 1.原辅料下单 2.检验对象选择
---
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java | 346 +++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 227 insertions(+), 119 deletions(-)
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..3490bf4 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,19 +2,16 @@
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;
+import com.ruoyi.basic.dto.*;
import com.ruoyi.basic.excel.StructureTestObjectData;
import com.ruoyi.basic.service.*;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
-import com.ruoyi.basic.dto.PageTestObjectDto;
-import com.ruoyi.basic.dto.TestItemDto;
import com.ruoyi.basic.mapper.*;
import com.ruoyi.basic.pojo.*;
import com.ruoyi.common.utils.StringUtils;
@@ -22,11 +19,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)琛ㄦ湇鍔″疄鐜扮被
@@ -59,7 +55,9 @@
private StructureItemParameterService structureItemParameterService;
private WorkShopMapper workShopMapper;
-
+
+ private ModelMapper modelMapper;
+
@Override
public IPage<StructureItemParameter> selectItemParameterList(Page page, StructureItemParameter itemParameter) {
return structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter));
@@ -70,8 +68,7 @@
if (itemParameter.getBsm().equals("") || itemParameter.getBsm() == null) {
itemParameter.setBsm("0");
}
- int insert = structureItemParameterMapper.insert(itemParameter);
- return insert;
+ return structureItemParameterMapper.insert(itemParameter);
}
@Override
@@ -193,131 +190,242 @@
return structureItemParameterMapper.getItemTree();
}
+ @Override
+ public List<TestItemDto> getItemTreeProduct(StructureTestObjectDto structureTestObjectDto) {
+ return structureItemParameterMapper.getItemTreeProduct(structureTestObjectDto.getObjectType());
+ }
+
+ @Override
+ public List<Model> getProductTypes(ModelDto modelDto) {
+ return modelMapper.selectList(Wrappers.<Model>lambdaQuery().eq(Model::getProductId, modelDto.getProductId()));
+ }
+
+ @Override
+ public List<ProductPart> getPartNoList(ProductPartDto productPartDto) {
+ return productPartMapper.selectList(Wrappers.<ProductPart>lambdaQuery().eq(ProductPart::getProductId, productPartDto.getProductId()));
+ }
+
@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);
+ // 闃舵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()))
+ .in(StructureTestObject::getObjectType, list.stream().map(StructureTestObjectData::getObjectType).collect(Collectors.toSet()))
+ ).stream().collect(Collectors.toMap(
+ obj -> generateStructureKey(obj.getSpecimenName(), obj.getSpecimenNameEn(), obj.getObjectType()), // 缁熶竴閿敓鎴�
+ Function.identity(),
+ (existing, replacement) -> existing
+ ));
- List<StructureTestObject> insertStructureTestObjects = new ArrayList<>();
- List<StructureTestObject> updateStructureTestObjects = new ArrayList<>();
- List<Product> insertProducts = new ArrayList<>();
- List<Product> updateProducts = new ArrayList<>();
-
- 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() + "|" + i.getObjectType();
+ 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 String generateStructureKey(String name, String nameEn, String objectType) {
+ return name + "|" + nameEn + "|" + objectType;
+ }
+
+ // 澶勭悊浜у搧鏁版嵁
+ private void processProductData(StructureTestObjectData data,
+ Integer objectId,
+ Map<String, WorkShop> workShopCache,
+ List<Product> insertList,
+ List<Product> updateList) {
+ // 鏋勫缓浜у搧鍞竴鏍囪瘑
+ String productKey = data.getName() + "|" + data.getNameEn() + "|" + data.getObjectType();
+
+ // 妫�鏌ュ唴瀛樹腑鏄惁宸插鐞嗚繃璇ヤ骇鍝�
+ 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() + "|" + obj.getObjectType();
+ 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() + "|" + i.getObjectType();
+ 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);
+ }
+ }
+
}
--
Gitblit v1.9.3