diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml
index 5792285a1..6dded74c2 100644
--- a/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml
@@ -13,6 +13,13 @@
pjcloud-supermarket-biz
+
+
+
+ com.bsd
+ pjcloud-common-idempotent
+
+
org.springframework.boot
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java
index a5fda12b3..7d3165347 100644
--- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.excel.annotation.RequestExcel;
+import com.bsd.pjcloud.common.idempotent.annotation.Idempotent;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO;
@@ -228,6 +229,7 @@ public class SmErpSpuController {
*/
@PostMapping("/import")
@PreAuthorize("@pms.hasPermission('supermarket_supermarketSpu_import')" )
+ @Idempotent(key = "#key", expireTime = 10, info = "请勿重复导入,10秒后再重新尝试")
public R importErpSpu(@RequestExcel List dtos, BindingResult bindingResult) {
List collect = dtos.stream().filter(smErpSpuImportDto -> smErpSpuImportDto.getProductCode() != null).collect(Collectors.toList());
if (CollectionUtils.isEmpty(collect)) {
diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java
index 482db88fc..82231c9ba 100644
--- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java
+++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java
@@ -519,6 +519,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl> errorList = new ArrayList<>();
+
+
+ //查询这一批导入的数据是否纯在货号相同,存在标记出行数
+ // 1. 收集本次导入的所有货号及行号映射
+ Map> importProductCodeMap = new HashMap<>();
+ for (int i = 0; i < smErpSpuImportDtos.size(); i++) {
+ SmErpSpuImportDto dto = smErpSpuImportDtos.get(i);
+ int row = i + 1;
+ String code = dto.getProductCode();
+ importProductCodeMap.computeIfAbsent(code, k -> new ArrayList<>()).add(row);
+ }
+
+
//货号-商品映射
Map productCodeToSpuMap = new HashMap<>();
@@ -545,6 +558,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl duplicateRows = importProductCodeMap.get(productCode);
+ if (duplicateRows.size() > 1) {
+ String duplicateInfo = duplicateRows.stream()
+ .filter(r -> r < rowNumber) // 只显示之前的重复行
+ .map(r -> "第" + r + "行")
+ .collect(Collectors.joining(","));
+ if (!duplicateInfo.isEmpty()) {
+ errorReasons.add("货号在本批导入数据中重复,重复行号:" + duplicateInfo);
+ }
+ }
+
// 数据校验
List validationErrors = ErpSpuValidator.validate(dto, rowNumber);
//添加验证错误记录
@@ -586,17 +612,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl