From 5b6c5f681a37be7ea73fed9404797f5721d7911e Mon Sep 17 00:00:00 2001 From: qiankanghui Date: Wed, 29 Apr 2026 09:56:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=98=8E=E7=BB=86=E9=87=8D=E5=A4=8D=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在PODetailMapper中新增countByOrderAndItem方法用于检查重复数据 - 在PODetailMapper.xml中添加对应的SQL查询语句 - 修改PODetailServiceImpl实现重复数据检测逻辑 - 添加duplicateItems列表收集重复数据信息 - 在批量导入时检查数据库中是否已存在相同订单号+款号的数据 - 遇到重复数据时跳过并抛出异常提示用户 --- .../order/controller/PODetailController.java | 1 - .../modules/order/dao/PODetailMapper.java | 11 +++++++ .../service/Impl/PODetailServiceImpl.java | 33 +++++++++++++++---- .../resources/mapper/order/PODetailMapper.xml | 9 +++++ 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/xujie/modules/order/controller/PODetailController.java b/src/main/java/com/xujie/modules/order/controller/PODetailController.java index 7b74587..e78a52a 100644 --- a/src/main/java/com/xujie/modules/order/controller/PODetailController.java +++ b/src/main/java/com/xujie/modules/order/controller/PODetailController.java @@ -235,5 +235,4 @@ public class PODetailController { } } - } diff --git a/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java b/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java index daf8381..7c51968 100644 --- a/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java +++ b/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java @@ -33,4 +33,15 @@ public interface PODetailMapper extends BaseMapper { Integer getMaxItemNo(@Param("poNo") String poNo, @Param("site") String site); + + /** + * 检查订单明细是否已存在(用于防止重复上传) + * @param orderNo 订单号 + * @param site 工厂编码 + * @param item 款号 + * @return 存在的记录数 + */ + Integer countByOrderAndItem(@Param("orderNo") String orderNo, + @Param("site") String site, + @Param("item") String item); } diff --git a/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java b/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java index e1a00a0..616a42a 100644 --- a/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java +++ b/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java @@ -145,19 +145,22 @@ public class PODetailServiceImpl extends ServiceImpl i SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - // 新增:控制 item_no(每个PO递增) + // 新增:控制 item_no(每个PO递增) Map orderLineMap = new HashMap<>(); - - // 获取当前用户(避免循环里重复取) + + // 获取当前用户(避免循环里重复取) SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); if (currentUser == null || currentUser.getSite() == null) { throw new RuntimeException("无法获取当前用户站点信息"); } String site = currentUser.getSite(); - + if (site == null) { - throw new RuntimeException("当前用户site为空!"); + throw new RuntimeException("当前用户site为空!"); } + + // 用于收集重复数据的信息 + List duplicateItems = new ArrayList<>(); // 转换并保存每条数据 for (PODetailExcelDTO excelDTO : excelList) { @@ -216,13 +219,23 @@ public class PODetailServiceImpl extends ServiceImpl i } } - // ========== 2. 生成 item_no(核心) ========== + // ========== 2. 检查是否重复 ========== String poNo = excelDTO.getPoNo(); + String item = excelDTO.getItem(); + + // 检查数据库中是否已存在相同的订单号+款号 + Integer existCount = baseMapper.countByOrderAndItem(poNo, site, item); + if (existCount != null && existCount > 0) { + duplicateItems.add("订单号: " + poNo + ", 款号: " + item); + continue; // 跳过重复数据,继续处理下一条 + } + + // ========== 3. 生成 item_no(核心) ========== Integer maxItemNo = baseMapper.getMaxItemNo(poNo, site); int lineNo = (maxItemNo == null ? 0 : maxItemNo) + 1; orderLineMap.put(poNo, lineNo); - // ========== 3. 保存 PODetail ========== + // ========== 4. 保存 PODetail ========== PODetailVo poDetailVo = new PODetailVo(); // 主键字段(必须) @@ -276,6 +289,12 @@ public class PODetailServiceImpl extends ServiceImpl i } } + // 如果有重复数据,抛出异常并提示 + if (!duplicateItems.isEmpty()) { + String duplicateMsg = String.join("; ", duplicateItems); + throw new RuntimeException("以下数据已存在,跳过保存: " + duplicateMsg); + } + } catch (IOException e) { throw new RuntimeException("文件读取失败: " + e.getMessage()); } diff --git a/src/main/resources/mapper/order/PODetailMapper.xml b/src/main/resources/mapper/order/PODetailMapper.xml index 358f109..0d0076f 100644 --- a/src/main/resources/mapper/order/PODetailMapper.xml +++ b/src/main/resources/mapper/order/PODetailMapper.xml @@ -491,4 +491,13 @@ WHERE order_no = #{poNo} AND site = #{site} + + +