Browse Source

标签校准

master
常熟吴彦祖 2 weeks ago
parent
commit
df228095b8
  1. 51
      src/main/java/com/gaotao/modules/automatedWarehouse/mapper/DataArchiveMapper.java
  2. 136
      src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/DataArchiveServiceImpl.java
  3. 50
      src/main/resources/mapper/automatedWarehouse/DataArchiveMapper.xml

51
src/main/java/com/gaotao/modules/automatedWarehouse/mapper/DataArchiveMapper.java

@ -3,14 +3,62 @@ package com.gaotao.modules.automatedWarehouse.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
/**
* @Description 数据归档Mapper接口 - rqrq
* @Author rqrq
* @Date 2025/11/11
*
* <p><b>更新说明</b></p>
* <ul>
* <li>2025-12-26: 改为调用存储过程方式避免Druid WallFilter误判DELETE TOP语法为SQL注入</li>
* </ul>
*/
@Mapper
public interface DataArchiveMapper {
// ========== 存储过程调用方法推荐使用========== - rqrq
/**
* @Description 调用存储过程归档interface_call_log数据 - rqrq
* @param params 参数Map包含:
* - keepCount: 保留最新记录数量
* - archivedCount: 输出参数归档的记录数量
* @author rqrq
*/
void callArchiveInterfaceCallLog(Map<String, Object> params);
/**
* @Description 调用存储过程归档wcs_callback_pallet_scan数据 - rqrq
* @param params 参数Map包含:
* - keepCount: 保留最新记录数量
* - archivedCount: 输出参数归档的记录数量
* @author rqrq
*/
void callArchiveWcsCallbackPalletScan(Map<String, Object> params);
/**
* @Description 调用存储过程归档wcs_callback_task数据 - rqrq
* @param params 参数Map包含:
* - keepCount: 保留最新记录数量
* - archivedCount: 输出参数归档的记录数量
* @author rqrq
*/
void callArchiveWcsCallbackTask(Map<String, Object> params);
/**
* @Description 调用存储过程归档wms_transport_task数据包含主表和明细表- rqrq
* @param params 参数Map包含:
* - keepCount: 保留最新记录数量
* - archivedTaskCount: 输出参数归档的主表记录数量
* - archivedDetailCount: 输出参数归档的明细表记录数量
* @author rqrq
*/
void callArchiveWmsTransportTask(Map<String, Object> params);
// ========== 以下为原有方法保留备用 ========== - rqrq
/**
* @Description 查询倒数第N条记录的ID通用方法- rqrq
* @param tableName 表名
@ -44,7 +92,9 @@ public interface DataArchiveMapper {
* @param thresholdId 阈值ID
* @return 本次删除的记录数
* @author rqrq
* @deprecated 此方法因Druid WallFilter不支持DELETE TOP语法已弃用请使用存储过程
*/
@Deprecated
int deleteInterfaceCallLogByThresholdIdBatch(@Param("thresholdId") Long thresholdId);
// ========== wcs_callback_pallet_scan 归档相关方法 ========== - rqrq
@ -117,4 +167,3 @@ public interface DataArchiveMapper {
*/
int deleteWmsTransportTaskByThresholdId(@Param("thresholdId") Long thresholdId);
}

136
src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/DataArchiveServiceImpl.java

@ -7,10 +7,18 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.Map;
/**
* @Description 数据归档服务实现类 - rqrq
* @Author rqrq
* @Date 2025/11/11
*
* <p><b>更新说明</b></p>
* <ul>
* <li>2025-12-26: 改为调用存储过程方式避免Druid WallFilter误判DELETE TOP语法为SQL注入</li>
* </ul>
*/
@Slf4j
@Service
@ -31,34 +39,17 @@ public class DataArchiveServiceImpl implements DataArchiveService {
System.out.println("开始归档interface_call_log数据 - rqrq,保留最新" + keepCount + "条");
try {
// 1. 查询倒数第N条的ID - rqrq
Long thresholdId = dataArchiveMapper.getThresholdIdByKeepCount("interface_call_log", keepCount);
if (thresholdId == null) {
System.out.println("数据量不足" + keepCount + "条,无需归档 - rqrq");
return 0;
}
System.out.println("查询到阈值ID=" + thresholdId + ",将归档小于此ID的数据 - rqrq");
// 2. 插入到历史表不带id字段- rqrq
int insertCount = dataArchiveMapper.insertInterfaceCallLogToHistory(thresholdId);
System.out.println("已插入" + insertCount + "条数据到interface_call_log_history - rqrq");
// 3. 批量删除原表数据每次1000条避免锁升级- rqrq
int totalDeleted = 0;
int deleted;
do {
deleted = dataArchiveMapper.deleteInterfaceCallLogByThresholdIdBatch(thresholdId);
totalDeleted += deleted;
if (deleted > 0) {
System.out.println("本批次删除" + deleted + "条,累计删除" + totalDeleted + "条 - rqrq");
}
} while (deleted > 0);
System.out.println("已删除" + totalDeleted + "条数据从interface_call_log - rqrq");
System.out.println("interface_call_log归档完成 - rqrq,归档数量=" + totalDeleted);
return totalDeleted;
// 调用存储过程执行归档 - rqrq
Map<String, Object> params = new HashMap<>();
params.put("keepCount", keepCount);
params.put("archivedCount", 0);
dataArchiveMapper.callArchiveInterfaceCallLog(params);
int archivedCount = (Integer) params.get("archivedCount");
System.out.println("interface_call_log归档完成 - rqrq,归档数量=" + archivedCount);
return archivedCount;
} catch (Exception e) {
System.out.println("归档interface_call_log失败 - rqrq:" + e.getMessage());
@ -78,26 +69,17 @@ public class DataArchiveServiceImpl implements DataArchiveService {
System.out.println("开始归档wcs_callback_pallet_scan数据 - rqrq,保留最新" + keepCount + "条");
try {
// 1. 查询倒数第N条的ID - rqrq
Long thresholdId = dataArchiveMapper.getThresholdIdByKeepCount("wcs_callback_pallet_scan", keepCount);
// 调用存储过程执行归档 - rqrq
Map<String, Object> params = new HashMap<>();
params.put("keepCount", keepCount);
params.put("archivedCount", 0);
if (thresholdId == null) {
System.out.println("数据量不足" + keepCount + "条,无需归档 - rqrq");
return 0;
}
dataArchiveMapper.callArchiveWcsCallbackPalletScan(params);
System.out.println("查询到阈值ID=" + thresholdId + ",将归档小于此ID的数据 - rqrq");
int archivedCount = (Integer) params.get("archivedCount");
// 2. 插入到历史表不带id字段- rqrq
int insertCount = dataArchiveMapper.insertWcsCallbackPalletScanToHistory(thresholdId);
System.out.println("已插入" + insertCount + "条数据到wcs_callback_pallet_scan_history - rqrq");
// 3. 删除原表数据 - rqrq
int deleteCount = dataArchiveMapper.deleteWcsCallbackPalletScanByThresholdId(thresholdId);
System.out.println("已删除" + deleteCount + "条数据从wcs_callback_pallet_scan - rqrq");
System.out.println("wcs_callback_pallet_scan归档完成 - rqrq,归档数量=" + deleteCount);
return deleteCount;
System.out.println("wcs_callback_pallet_scan归档完成 - rqrq,归档数量=" + archivedCount);
return archivedCount;
} catch (Exception e) {
System.out.println("归档wcs_callback_pallet_scan失败 - rqrq:" + e.getMessage());
@ -117,26 +99,17 @@ public class DataArchiveServiceImpl implements DataArchiveService {
System.out.println("开始归档wcs_callback_task数据 - rqrq,保留最新" + keepCount + "条");
try {
// 1. 查询倒数第N条的ID - rqrq
Long thresholdId = dataArchiveMapper.getThresholdIdByKeepCount("wcs_callback_task", keepCount);
if (thresholdId == null) {
System.out.println("数据量不足" + keepCount + "条,无需归档 - rqrq");
return 0;
}
// 调用存储过程执行归档 - rqrq
Map<String, Object> params = new HashMap<>();
params.put("keepCount", keepCount);
params.put("archivedCount", 0);
System.out.println("查询到阈值ID=" + thresholdId + ",将归档小于此ID的数据 - rqrq");
dataArchiveMapper.callArchiveWcsCallbackTask(params);
// 2. 插入到历史表不带id字段- rqrq
int insertCount = dataArchiveMapper.insertWcsCallbackTaskToHistory(thresholdId);
System.out.println("已插入" + insertCount + "条数据到wcs_callback_task_history - rqrq");
int archivedCount = (Integer) params.get("archivedCount");
// 3. 删除原表数据 - rqrq
int deleteCount = dataArchiveMapper.deleteWcsCallbackTaskByThresholdId(thresholdId);
System.out.println("已删除" + deleteCount + "条数据从wcs_callback_task - rqrq");
System.out.println("wcs_callback_task归档完成 - rqrq,归档数量=" + deleteCount);
return deleteCount;
System.out.println("wcs_callback_task归档完成 - rqrq,归档数量=" + archivedCount);
return archivedCount;
} catch (Exception e) {
System.out.println("归档wcs_callback_task失败 - rqrq:" + e.getMessage());
@ -156,37 +129,19 @@ public class DataArchiveServiceImpl implements DataArchiveService {
System.out.println("开始归档wms_transport_task及明细数据 - rqrq,保留最新" + keepCount + "条");
try {
// 1. 查询倒数第N条的ID - rqrq
Long thresholdId = dataArchiveMapper.getThresholdIdByKeepCount("wms_transport_task", keepCount);
if (thresholdId == null) {
System.out.println("数据量不足" + keepCount + "条,无需归档 - rqrq");
return 0;
}
System.out.println("查询到阈值ID=" + thresholdId + ",将归档小于此ID的数据 - rqrq");
// 调用存储过程执行归档 - rqrq
Map<String, Object> params = new HashMap<>();
params.put("keepCount", keepCount);
params.put("archivedTaskCount", 0);
params.put("archivedDetailCount", 0);
// 2. 先归档明细表 wms_transport_task_detail - rqrq
// 2.1 插入明细数据到历史表根据task_no关联- rqrq
int detailInsertCount = dataArchiveMapper.insertWmsTransportTaskDetailToHistory(thresholdId);
System.out.println("已插入" + detailInsertCount + "条数据到wms_transport_task_detail_history - rqrq");
dataArchiveMapper.callArchiveWmsTransportTask(params);
// 3. 再归档主表 wms_transport_task - rqrq
// 3.1 插入主表数据到历史表 - rqrq
int taskInsertCount = dataArchiveMapper.insertWmsTransportTaskToHistory(thresholdId);
System.out.println("已插入" + taskInsertCount + "条数据到wms_transport_task_history - rqrq");
int archivedTaskCount = (Integer) params.get("archivedTaskCount");
int archivedDetailCount = (Integer) params.get("archivedDetailCount");
// 4. 删除原表数据先删明细再删主表- rqrq
// 4.1 删除明细表数据 - rqrq
int detailDeleteCount = dataArchiveMapper.deleteWmsTransportTaskDetailByThresholdId(thresholdId);
System.out.println("已删除" + detailDeleteCount + "条数据从wms_transport_task_detail - rqrq");
// 4.2 删除主表数据 - rqrq
int taskDeleteCount = dataArchiveMapper.deleteWmsTransportTaskByThresholdId(thresholdId);
System.out.println("已删除" + taskDeleteCount + "条数据从wms_transport_task - rqrq");
System.out.println("wms_transport_task及明细归档完成 - rqrq,归档任务数=" + taskDeleteCount + ",明细数=" + detailDeleteCount);
return taskDeleteCount;
System.out.println("wms_transport_task及明细归档完成 - rqrq,归档任务数=" + archivedTaskCount + ",明细数=" + archivedDetailCount);
return archivedTaskCount;
} catch (Exception e) {
System.out.println("归档wms_transport_task失败 - rqrq:" + e.getMessage());
@ -194,4 +149,3 @@ public class DataArchiveServiceImpl implements DataArchiveService {
}
}
}

50
src/main/resources/mapper/automatedWarehouse/DataArchiveMapper.xml

@ -2,6 +2,44 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gaotao.modules.automatedWarehouse.mapper.DataArchiveMapper">
<!-- ========== 存储过程调用(推荐使用)========== rqrq -->
<!-- 2025-12-26: 改为调用存储过程方式,避免Druid WallFilter误判DELETE TOP语法为SQL注入 -->
<!-- rqrq - 调用存储过程归档interface_call_log数据 -->
<select id="callArchiveInterfaceCallLog" parameterType="java.util.Map" statementType="CALLABLE">
{call ArchiveInterfaceCallLog(
#{keepCount, mode=IN, jdbcType=INTEGER},
#{archivedCount, mode=OUT, jdbcType=INTEGER}
)}
</select>
<!-- rqrq - 调用存储过程归档wcs_callback_pallet_scan数据 -->
<select id="callArchiveWcsCallbackPalletScan" parameterType="java.util.Map" statementType="CALLABLE">
{call ArchiveWcsCallbackPalletScan(
#{keepCount, mode=IN, jdbcType=INTEGER},
#{archivedCount, mode=OUT, jdbcType=INTEGER}
)}
</select>
<!-- rqrq - 调用存储过程归档wcs_callback_task数据 -->
<select id="callArchiveWcsCallbackTask" parameterType="java.util.Map" statementType="CALLABLE">
{call ArchiveWcsCallbackTask(
#{keepCount, mode=IN, jdbcType=INTEGER},
#{archivedCount, mode=OUT, jdbcType=INTEGER}
)}
</select>
<!-- rqrq - 调用存储过程归档wms_transport_task数据(包含主表和明细表)-->
<select id="callArchiveWmsTransportTask" parameterType="java.util.Map" statementType="CALLABLE">
{call ArchiveWmsTransportTask(
#{keepCount, mode=IN, jdbcType=INTEGER},
#{archivedTaskCount, mode=OUT, jdbcType=INTEGER},
#{archivedDetailCount, mode=OUT, jdbcType=INTEGER}
)}
</select>
<!-- ========== 以下为原有SQL,保留备用 ========== rqrq -->
<!-- rqrq - 查询倒数第N条记录的ID(通用方法)-->
<select id="getThresholdIdByKeepCount" resultType="java.lang.Long">
SELECT id
@ -34,10 +72,15 @@
WHERE id &lt; #{thresholdId}
</delete>
<!-- rqrq - 批量删除interface_call_log(每次最多删除1000条,避免锁升级导致死锁)-->
<!-- rqrq - 批量删除interface_call_log(已弃用,Druid WallFilter不支持DELETE TOP语法)-->
<!-- @deprecated 请使用存储过程 callArchiveInterfaceCallLog -->
<delete id="deleteInterfaceCallLogByThresholdIdBatch">
DELETE TOP (1000) FROM interface_call_log WITH (ROWLOCK)
WHERE id &lt; #{thresholdId}
DELETE FROM interface_call_log WITH (ROWLOCK)
WHERE id IN (
SELECT TOP (1000) id
FROM interface_call_log WITH (NOLOCK)
WHERE id &lt; #{thresholdId}
)
</delete>
<!-- ========== wcs_callback_pallet_scan 归档相关SQL ========== rqrq -->
@ -151,4 +194,3 @@
</delete>
</mapper>
Loading…
Cancel
Save