6 天以前 1e123568c2f561013f5636e45dc0db30b17a3517
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -17,7 +17,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.LossProductModelDto;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -30,6 +30,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -53,9 +54,12 @@
    public int addOrEditProductModel(ProductModelDto productModelDto) {
        String model = StringUtils.trim(productModelDto.getModel());
        String productCode = StringUtils.trim(productModelDto.getProductCode());
        String barcode = StringUtils.trim(productModelDto.getBarcode());
        productModelDto.setModel(model);
        productModelDto.setProductCode(productCode);
        productModelDto.setBarcode(barcode);
        checkModelAndProductCodeUnique(model, productCode, productModelDto.getId());
        checkBarcodeUnique(barcode, productModelDto.getId());
        if (productModelDto.getId() == null) {
            ProductModel productModel = new ProductModel();
@@ -78,6 +82,19 @@
        ProductModel duplicateProductModel = productModelMapper.selectOne(queryWrapper);
        if (duplicateProductModel != null) {
            throw new ServiceException("对应的型号" + model + "的产品编码" + productCode + "已经存在");
        }
    }
    private void checkBarcodeUnique(String barcode, Long currentId) {
        if (StringUtils.isEmpty(barcode)) {
            return;
        }
        LambdaQueryWrapper<ProductModel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProductModel::getBarcode, barcode)
                .ne(currentId != null, ProductModel::getId, currentId)
                .last("limit 1");
        if (productModelMapper.selectOne(queryWrapper) != null) {
            throw new ServiceException("条形码" + barcode + "已经存在");
        }
    }
@@ -124,14 +141,14 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R<?> importProductModel(MultipartFile file, Integer productId) {
    public AjaxResult importProductModel(MultipartFile file, Integer productId) {
        if (productId == null) {
            return R.fail("请先选择产品再导入规格型号");
            return AjaxResult.error("请先选择产品再导入规格型号");
        }
        Product product = productMapper.selectById(productId);
        if (product == null) {
            return R.fail("选择的产品不存在");
            return AjaxResult.error("选择的产品不存在");
        }
        try {
@@ -139,12 +156,23 @@
            List<ProductModel> productModelList = productModelExcelUtil.importExcel(file.getInputStream());
            if (CollectionUtils.isEmpty(productModelList)) {
                return R.fail("导入数据不能为空");
                return AjaxResult.error("导入数据不能为空");
            }
            //  获取当前产品下所有的规格型号名
            List<ProductModel> existingModels = list(new LambdaQueryWrapper<ProductModel>().eq(ProductModel::getProductId, productId));
            Set<String> existingModelNames = existingModels.stream().map(ProductModel::getModel).collect(Collectors.toSet());
            //  已存在于数据库中的条码(全局查重)
            List<String> importBarcodes = productModelList.stream()
                    .map(item -> StringUtils.trim(item.getBarcode()))
                    .filter(StringUtils::isNotEmpty)
                    .distinct()
                    .collect(Collectors.toList());
            Set<String> dbBarcodeSet = importBarcodes.isEmpty() ? new HashSet<>()
                    : list(new LambdaQueryWrapper<ProductModel>().in(ProductModel::getBarcode, importBarcodes))
                    .stream().map(ProductModel::getBarcode).collect(Collectors.toSet());
            Set<String> fileBarcodes = new HashSet<>();
            List<ProductModel> waitToSaveList = new ArrayList<>();
            int skipCount = 0;
@@ -154,13 +182,23 @@
                int rowNum = i + 2;
                if (StringUtils.isEmpty(item.getProductCode())) {
                    return R.fail("第 " + rowNum + " 行导入失败: [产品编码] 不能为空");
                    return AjaxResult.error("第 " + rowNum + " 行导入失败: [产品编码] 不能为空");
                }
                if (StringUtils.isEmpty(item.getModel())) {
                    return R.fail("第 " + rowNum + " 行导入失败: [规格型号] 不能为空");
                    return AjaxResult.error("第 " + rowNum + " 行导入失败: [规格型号] 不能为空");
                }
                if (StringUtils.isEmpty(item.getUnit())) {
                    return R.fail("第 " + rowNum + " 行导入失败: [单位] 不能为空");
                    return AjaxResult.error("第 " + rowNum + " 行导入失败: [单位] 不能为空");
                }
                item.setBarcode(StringUtils.trim(item.getBarcode()));
                if (StringUtils.isNotEmpty(item.getBarcode())) {
                    if (!fileBarcodes.add(item.getBarcode())) {
                        return AjaxResult.error("第 " + rowNum + " 行导入失败: 条形码 " + item.getBarcode() + " 在文件中重复");
                    }
                    if (dbBarcodeSet.contains(item.getBarcode())) {
                        return AjaxResult.error("第 " + rowNum + " 行导入失败: 条形码 " + item.getBarcode() + " 已存在");
                    }
                }
                //  去重,如果已包含该型号,则跳过
@@ -180,13 +218,31 @@
            }
            if (skipCount == 0) {
                return R.ok(null, String.format("成功导入 %d 条数据", waitToSaveList.size()));
                return AjaxResult.success(String.format("成功导入 %d 条数据", waitToSaveList.size()));
            } else {
                return R.ok(null, String.format("成功导入 %d 条,跳过已存在数据 %d 条", waitToSaveList.size(), skipCount));
                return AjaxResult.success(String.format("成功导入 %d 条,跳过已存在数据 %d 条", waitToSaveList.size(), skipCount));
            }
        } catch (Exception e) {
            log.error("导入产品规格异常", e);
            throw new ServiceException("导入失败");
        }
    }
    @Override
    public ProductModel selectByBarcode(String barcode) {
        if (StringUtils.isEmpty(barcode)) {
            return null;
        }
        LambdaQueryWrapper<ProductModel> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProductModel::getBarcode, StringUtils.trim(barcode))
                .last("limit 1");
        ProductModel productModel = productModelMapper.selectOne(queryWrapper);
        if (productModel != null && productModel.getProductId() != null) {
            Product product = productMapper.selectById(productModel.getProductId());
            if (product != null) {
                productModel.setProductName(product.getProductName());
            }
        }
        return productModel;
    }
}