fix(智慧超市):修复导入

This commit is contained in:
zjf committed 2025-08-08 12:04:20 +08:00
1 parent b4cab80e68
commit dd8eb85c96
2 files changed
+39 -135

No files matched your search

@@ -985,36 +985,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
SmErpSpuEntity spu;
if (existingSpu != null) {
// 商品已存在,记录警告但不更新(保护线上数据)
errorReasons.add("商品已存在,跳过导入以避免覆盖线上数据。货号:" + dto.getProductCode() + ",商品名称:" + existingSpu.getProductName());
errorList.add(createErrorInfo(rowNumber, dto.getProductCode(), errorReasons));
continue;
// 如果需要更新模式,可以取消注释下面的代码
/*
// 商品已存在:不更新主数据,继续为该 SPU 处理包装单位与条码
spu = existingSpu;
spu.setProductName(dto.getProductName());
spu.setSpec(dto.getSpec());
spu.setOrigin(dto.getOrigin());
spu.setBarCode(dto.getBarCode());
spu.setPurchasePrice(dto.getPurchasePrice() != null ?
BigDecimal.valueOf(dto.getPurchasePrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
spu.setRetailPrice(dto.getRetailPrice() != null ?
BigDecimal.valueOf(dto.getRetailPrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
spu.setPromotionPrice(dto.getPromotionPrice() != null ?
BigDecimal.valueOf(dto.getPromotionPrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
spu.setCostPrice(dto.getCostPrice() != null ?
BigDecimal.valueOf(dto.getCostPrice()).multiply(BigDecimal.valueOf(100)).doubleValue() : 0.0);
spu.setProductNature("电子称称重商品".equals(dto.getProductNature()) ? "2" : "1");
spu.setStatus("停销".equals(dto.getStatus()) ? "1" : "0");
if (categoryId != null) {
spu.setCategoryId(categoryId);
}
if (supplierId != null) {
spu.setSupplierId(supplierId);
}
this.updateById(spu);
*/
} else {
// 创建新商品
spu = new SmErpSpuEntity();
@@ -1049,9 +1021,9 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
unit.setUnit(dto.getUnit());
unit.setPackageNum(dto.getPackageNum());
unit.setIsBase(true); // 默认为基础单位
unit.setBarCode(StringUtils.isNotBlank(dto.getBarCode()) ? dto.getBarCode() : null); // 包装单位的条码来自主条码
unit.setTaste(StringUtils.isNotBlank(dto.getTaste()) ? dto.getTaste() : null); // 设置口味,空值设为null
unit.setSpec(StringUtils.isNotBlank(dto.getSpec()) ? dto.getSpec() : null); // 设置规格字段,空值设为null
unit.setBarCode(org.apache.commons.lang3.StringUtils.isNotBlank(dto.getBarCode()) ? dto.getBarCode() : null); // 条码
unit.setTaste(org.apache.commons.lang3.StringUtils.isNotBlank(dto.getTaste()) ? dto.getTaste() : null); // 口味
unit.setSpec(org.apache.commons.lang3.StringUtils.isNotBlank(dto.getSpec()) ? dto.getSpec() : null); // 规格
unit.setPurchasePrice(dto.getPurchasePrice() != null ?
BigDecimal.valueOf(dto.getPurchasePrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
unit.setRetailPrice(dto.getRetailPrice() != null ?
@@ -1061,50 +1033,30 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
unit.setCostPrice(dto.getCostPrice() != null ?
BigDecimal.valueOf(dto.getCostPrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
// 检查单位是否已存在(根据条码,因为每个商品下的包装单位条码是唯一的)
// 检查单位是否已存在:条码优先,其次使用 单位+口味+规格 的组合
LambdaQueryWrapper<SmErpUnitEntity> existingUnitWrapper = new LambdaQueryWrapper<>();
existingUnitWrapper.eq(SmErpUnitEntity::getSpuId, spu.getId());
if (StringUtils.isNotBlank(dto.getBarCode())) {
// 如果有条码,使用条码作为主要去重依据
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getBarCode())) {
existingUnitWrapper.eq(SmErpUnitEntity::getBarCode, dto.getBarCode());
} else {
// 如果条码为空,使用单位名称、口味和规格的组合作为去重依据
existingUnitWrapper.eq(SmErpUnitEntity::getUnit, dto.getUnit());
// 处理口味字段的查询条件
if (StringUtils.isNotBlank(dto.getTaste())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getTaste())) {
existingUnitWrapper.eq(SmErpUnitEntity::getTaste, dto.getTaste());
} else {
// 当口味为空时,查询口味为null或空字符串的记录
existingUnitWrapper.and(wrapper -> wrapper
.isNull(SmErpUnitEntity::getTaste)
.or()
.eq(SmErpUnitEntity::getTaste, "")
);
existingUnitWrapper.and(w -> w.isNull(SmErpUnitEntity::getTaste).or().eq(SmErpUnitEntity::getTaste, ""));
}
// 处理规格字段的查询条件
if (StringUtils.isNotBlank(dto.getSpec())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getSpec())) {
existingUnitWrapper.eq(SmErpUnitEntity::getSpec, dto.getSpec());
} else {
// 当规格为空时,查询规格为null或空字符串的记录
existingUnitWrapper.and(wrapper -> wrapper
.isNull(SmErpUnitEntity::getSpec)
.or()
.eq(SmErpUnitEntity::getSpec, "")
);
existingUnitWrapper.and(w -> w.isNull(SmErpUnitEntity::getSpec).or().eq(SmErpUnitEntity::getSpec, ""));
}
}
SmErpUnitEntity existingUnit = smErpUnitService.getOne(existingUnitWrapper);
if (existingUnit != null) {
// 更新现有包装单位
// 更新现有包装单位(不改动主数据)
existingUnit.setPackageNum(dto.getPackageNum());
existingUnit.setBarCode(StringUtils.isNotBlank(dto.getBarCode()) ? dto.getBarCode() : null); // 更新条码
existingUnit.setTaste(StringUtils.isNotBlank(dto.getTaste()) ? dto.getTaste() : null); // 更新口味
existingUnit.setSpec(StringUtils.isNotBlank(dto.getSpec()) ? dto.getSpec() : null); // 更新规格
existingUnit.setBarCode(org.apache.commons.lang3.StringUtils.isNotBlank(dto.getBarCode()) ? dto.getBarCode() : null); // 更新条码
existingUnit.setPurchasePrice(unit.getPurchasePrice());
existingUnit.setRetailPrice(unit.getRetailPrice());
existingUnit.setPromotionPrice(unit.getPromotionPrice());
@@ -1116,19 +1068,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
// 6. 处理辅助条码(多个辅助条码)
List<String> auxiliaryBarcodes = new ArrayList<>();
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode1())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode1())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode1());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode2())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode2())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode2());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode3())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode3())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode3());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode4())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode4())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode4());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode5())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode5())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode5());
}
@@ -1167,9 +1119,12 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
SmErpStockEntity existingStock = smErpStockService.getOne(existingStockWrapper);
if (existingStock != null) {
// 库存记录已存在,记录警告但不更新(保护线上数据)
errorReasons.add("库存记录已存在,跳过导入以避免覆盖线上数据");
continue;
// 更新现有库存记录
existingStock.setInventoryUpperLimit(dto.getInventoryUpperLimit() != null ? dto.getInventoryUpperLimit() : 1000);
existingStock.setInventoryLowerLimit(dto.getInventoryLowerLimit() != null ? dto.getInventoryLowerLimit() : 10);
existingStock.setBaseStock(dto.getStock() != null ? dto.getStock() : 0.0);
existingStock.setCurrentStock(dto.getStock() != null ? dto.getStock() : 0.0);
smErpStockService.updateById(existingStock);
} else {
smErpStockService.save(stock);
}
@@ -1251,29 +1206,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
SmErpSpuEntity spu;
if (existingSpu != null) {
// 更新现有商品
// 商品已存在:不更新主数据,继续为该 SPU 处理包装单位与条码
spu = existingSpu;
spu.setProductName(dto.getProductName());
spu.setSpec(dto.getSpec());
spu.setOrigin(dto.getOrigin());
spu.setBarCode(dto.getBarCode());
spu.setPurchasePrice(dto.getPurchasePrice() != null ?
BigDecimal.valueOf(dto.getPurchasePrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
spu.setRetailPrice(dto.getRetailPrice() != null ?
BigDecimal.valueOf(dto.getRetailPrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
spu.setPromotionPrice(dto.getPromotionPrice() != null ?
BigDecimal.valueOf(dto.getPromotionPrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
spu.setCostPrice(dto.getCostPrice() != null ?
BigDecimal.valueOf(dto.getCostPrice()).multiply(BigDecimal.valueOf(100)).doubleValue() : 0.0);
spu.setProductNature("电子称称重商品".equals(dto.getProductNature()) ? "2" : "1");
spu.setStatus("停销".equals(dto.getStatus()) ? "1" : "0");
if (categoryId != null) {
spu.setCategoryId(categoryId);
}
if (supplierId != null) {
spu.setSupplierId(supplierId);
}
this.updateById(spu);
} else {
// 创建新商品
spu = new SmErpSpuEntity();
@@ -1309,8 +1243,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
unit.setPackageNum(dto.getPackageNum());
unit.setIsBase(true); // 默认为基础单位
unit.setBarCode(dto.getBarCode()); // 包装单位的条码来自主条码
unit.setTaste(StringUtils.isNotBlank(dto.getTaste()) ? dto.getTaste() : null); // 设置口味,空值设为null
unit.setSpec(StringUtils.isNotBlank(dto.getSpec()) ? dto.getSpec() : null); // 设置规格字段,空值设为null
unit.setTaste(dto.getTaste()); // 设置口味
unit.setSpec(dto.getSpec()); // 设置规格字段
unit.setPurchasePrice(dto.getPurchasePrice() != null ?
BigDecimal.valueOf(dto.getPurchasePrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
unit.setRetailPrice(dto.getRetailPrice() != null ?
@@ -1320,50 +1254,20 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
unit.setCostPrice(dto.getCostPrice() != null ?
BigDecimal.valueOf(dto.getCostPrice()).multiply(BigDecimal.valueOf(100)).intValue() : 0);
// 检查单位是否已存在(根据条码,因为每个商品下的包装单位条码是唯一的)
// 检查单位是否已存在(根据单位名称、口味和规格)
LambdaQueryWrapper<SmErpUnitEntity> existingUnitWrapper = new LambdaQueryWrapper<>();
existingUnitWrapper.eq(SmErpUnitEntity::getSpuId, spu.getId());
if (StringUtils.isNotBlank(dto.getBarCode())) {
// 如果有条码,使用条码作为主要去重依据
existingUnitWrapper.eq(SmErpUnitEntity::getBarCode, dto.getBarCode());
} else {
// 如果条码为空,使用单位名称、口味和规格的组合作为去重依据
existingUnitWrapper.eq(SmErpUnitEntity::getUnit, dto.getUnit());
// 处理口味字段的查询条件
if (StringUtils.isNotBlank(dto.getTaste())) {
existingUnitWrapper.eq(SmErpUnitEntity::getTaste, dto.getTaste());
} else {
// 当口味为空时,查询口味为null或空字符串的记录
existingUnitWrapper.and(wrapper -> wrapper
.isNull(SmErpUnitEntity::getTaste)
.or()
.eq(SmErpUnitEntity::getTaste, "")
);
}
// 处理规格字段的查询条件
if (StringUtils.isNotBlank(dto.getSpec())) {
existingUnitWrapper.eq(SmErpUnitEntity::getSpec, dto.getSpec());
} else {
// 当规格为空时,查询规格为null或空字符串的记录
existingUnitWrapper.and(wrapper -> wrapper
.isNull(SmErpUnitEntity::getSpec)
.or()
.eq(SmErpUnitEntity::getSpec, "")
);
}
}
existingUnitWrapper.eq(SmErpUnitEntity::getSpuId, spu.getId())
.eq(SmErpUnitEntity::getUnit, dto.getUnit())
.eq(SmErpUnitEntity::getTaste, dto.getTaste())
.eq(SmErpUnitEntity::getSpec, dto.getSpec()); // 加入规格字段作为查询条件
SmErpUnitEntity existingUnit = smErpUnitService.getOne(existingUnitWrapper);
if (existingUnit != null) {
// 更新现有包装单位
existingUnit.setPackageNum(dto.getPackageNum());
existingUnit.setBarCode(dto.getBarCode()); // 更新条码
existingUnit.setTaste(StringUtils.isNotBlank(dto.getTaste()) ? dto.getTaste() : null); // 更新口味
existingUnit.setSpec(StringUtils.isNotBlank(dto.getSpec()) ? dto.getSpec() : null); // 更新规格
existingUnit.setTaste(dto.getTaste()); // 更新口味
existingUnit.setSpec(dto.getSpec()); // 更新规格
existingUnit.setPurchasePrice(unit.getPurchasePrice());
existingUnit.setRetailPrice(unit.getRetailPrice());
existingUnit.setPromotionPrice(unit.getPromotionPrice());
@@ -1375,19 +1279,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
// 6. 处理辅助条码(多个辅助条码)
List<String> auxiliaryBarcodes = new ArrayList<>();
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode1())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode1())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode1());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode2())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode2())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode2());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode3())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode3())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode3());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode4())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode4())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode4());
}
if (StringUtils.isNotBlank(dto.getAuxiliaryBarcode5())) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(dto.getAuxiliaryBarcode5())) {
auxiliaryBarcodes.add(dto.getAuxiliaryBarcode5());
}
@@ -170,7 +170,7 @@
spu.sales_count,
spu.dept_id,
spu.create_by,
spu.unit,
unit.unit,
spu.spec,
unit.retail_price,
spu.cost_price,