Browse Source

feat(order): 添加订单明细重复检查功能

- 在PODetailMapper中新增countByOrderAndItem方法用于检查重复数据
- 在PODetailMapper.xml中添加对应的SQL查询语句
- 修改PODetailServiceImpl实现重复数据检测逻辑
- 添加duplicateItems列表收集重复数据信息
- 在批量导入时检查数据库中是否已存在相同订单号+款号的数据
- 遇到重复数据时跳过并抛出异常提示用户
master
qiankanghui 2 months ago
parent
commit
5b6c5f681a
  1. 1
      src/main/java/com/xujie/modules/order/controller/PODetailController.java
  2. 11
      src/main/java/com/xujie/modules/order/dao/PODetailMapper.java
  3. 33
      src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java
  4. 9
      src/main/resources/mapper/order/PODetailMapper.xml

1
src/main/java/com/xujie/modules/order/controller/PODetailController.java

@ -235,5 +235,4 @@ public class PODetailController {
}
}
}

11
src/main/java/com/xujie/modules/order/dao/PODetailMapper.java

@ -33,4 +33,15 @@ public interface PODetailMapper extends BaseMapper<PODetail> {
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);
}

33
src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java

@ -145,19 +145,22 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> i
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 新增控制 item_no每个PO递增
// 新增:控制 item_no(每个PO递增)
Map<String, Integer> 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<String> duplicateItems = new ArrayList<>();
// 转换并保存每条数据
for (PODetailExcelDTO excelDTO : excelList) {
@ -216,13 +219,23 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> 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<PODetailMapper, PODetail> i
}
}
// 如果有重复数据抛出异常并提示
if (!duplicateItems.isEmpty()) {
String duplicateMsg = String.join("; ", duplicateItems);
throw new RuntimeException("以下数据已存在,跳过保存: " + duplicateMsg);
}
} catch (IOException e) {
throw new RuntimeException("文件读取失败: " + e.getMessage());
}

9
src/main/resources/mapper/order/PODetailMapper.xml

@ -491,4 +491,13 @@
WHERE order_no = #{poNo}
AND site = #{site}
</select>
<select id="countByOrderAndItem" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM PODetail
WHERE order_no = #{orderNo}
AND site = #{site}
AND item = #{item}
</select>
</mapper>
Loading…
Cancel
Save