|
|
|
@ -24,6 +24,7 @@ import org.dromara.rfid.service.IRfidReadRecordService;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.Collection;
|
|
|
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 读取记录Service业务层处理
|
|
|
|
* 读取记录Service业务层处理
|
|
|
|
@ -41,6 +42,12 @@ public class RfidReadRecordServiceImpl implements IRfidReadRecordService {
|
|
|
|
|
|
|
|
|
|
|
|
private final RfidReadRecordMapper baseMapper;
|
|
|
|
private final RfidReadRecordMapper baseMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 用于清理条码中的不可见字符(空格、NULL字符、控制字符等)
|
|
|
|
|
|
|
|
* 匹配:空格、NULL字符(\x00)、制表符、换行符等控制字符
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private static final Pattern BARCODE_CLEAN_PATTERN = Pattern.compile("[\\s\\x00-\\x1F\\x7F]+");
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 查询读取记录
|
|
|
|
* 查询读取记录
|
|
|
|
*
|
|
|
|
*
|
|
|
|
@ -51,7 +58,10 @@ public class RfidReadRecordServiceImpl implements IRfidReadRecordService {
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public RfidReadRecordVo queryById(Long id, Date queryDate) {
|
|
|
|
public RfidReadRecordVo queryById(Long id, Date queryDate) {
|
|
|
|
String tableName = RfidReadRecordTableHelper.getTableName(queryDate);
|
|
|
|
String tableName = RfidReadRecordTableHelper.getTableName(queryDate);
|
|
|
|
return baseMapper.selectCustomRfidReadRecordVoById(tableName, id);
|
|
|
|
RfidReadRecordVo record = baseMapper.selectCustomRfidReadRecordVoById(tableName, id);
|
|
|
|
|
|
|
|
// 清理条码中的不可见字符
|
|
|
|
|
|
|
|
cleanBarcode(record);
|
|
|
|
|
|
|
|
return record;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -81,6 +91,9 @@ public class RfidReadRecordServiceImpl implements IRfidReadRecordService {
|
|
|
|
? baseMapper.selectCustomRfidReadRecordVoPage(tableNames.get(0), pageQuery.build(), lqw)
|
|
|
|
? baseMapper.selectCustomRfidReadRecordVoPage(tableNames.get(0), pageQuery.build(), lqw)
|
|
|
|
: baseMapper.selectCustomRfidReadRecordVoPageMultiTable(tableNames, pageQuery.build(), lqw);
|
|
|
|
: baseMapper.selectCustomRfidReadRecordVoPageMultiTable(tableNames, pageQuery.build(), lqw);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 清理条码中的不可见字符
|
|
|
|
|
|
|
|
cleanBarcodeList(result.getRecords());
|
|
|
|
|
|
|
|
|
|
|
|
return TableDataInfo.build(result);
|
|
|
|
return TableDataInfo.build(result);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -112,15 +125,22 @@ public class RfidReadRecordServiceImpl implements IRfidReadRecordService {
|
|
|
|
// 采样查询:每 N 分钟取一条代表数据
|
|
|
|
// 采样查询:每 N 分钟取一条代表数据
|
|
|
|
// tableNames.size() == 1 表示只涉及一张分表,直接调用单表采样SQL;
|
|
|
|
// tableNames.size() == 1 表示只涉及一张分表,直接调用单表采样SQL;
|
|
|
|
// 否则说明跨多天/多张分表,调用多表采样SQL进行 UNION ALL 聚合。
|
|
|
|
// 否则说明跨多天/多张分表,调用多表采样SQL进行 UNION ALL 聚合。
|
|
|
|
return tableNames.size() == 1
|
|
|
|
List<RfidReadRecordVo> sampledRecords = tableNames.size() == 1
|
|
|
|
? baseMapper.selectWithSampling(tableNames.get(0), samplingInterval, lqw)
|
|
|
|
? baseMapper.selectWithSampling(tableNames.get(0), samplingInterval, lqw)
|
|
|
|
: baseMapper.selectWithSamplingMultiTable(tableNames, samplingInterval, lqw);
|
|
|
|
: baseMapper.selectWithSamplingMultiTable(tableNames, samplingInterval, lqw);
|
|
|
|
|
|
|
|
// 清理条码中的不可见字符
|
|
|
|
|
|
|
|
cleanBarcodeList(sampledRecords);
|
|
|
|
|
|
|
|
return sampledRecords;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 普通查询
|
|
|
|
// 普通查询
|
|
|
|
return tableNames.size() == 1
|
|
|
|
List<RfidReadRecordVo> records = tableNames.size() == 1
|
|
|
|
? baseMapper.selectCustomRfidReadRecordVoList(tableNames.get(0), lqw)
|
|
|
|
? baseMapper.selectCustomRfidReadRecordVoList(tableNames.get(0), lqw)
|
|
|
|
: baseMapper.selectCustomRfidReadRecordVoListMultiTable(tableNames, lqw);
|
|
|
|
: baseMapper.selectCustomRfidReadRecordVoListMultiTable(tableNames, lqw);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 清理条码中的不可见字符
|
|
|
|
|
|
|
|
cleanBarcodeList(records);
|
|
|
|
|
|
|
|
return records;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -151,6 +171,53 @@ public class RfidReadRecordServiceImpl implements IRfidReadRecordService {
|
|
|
|
return lqw;
|
|
|
|
return lqw;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 批量清理条码中的不可见字符
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param records 记录列表
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private void cleanBarcodeList(List<RfidReadRecordVo> records) {
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(records)) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for (RfidReadRecordVo record : records) {
|
|
|
|
|
|
|
|
cleanBarcode(record);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 清理单条记录的条码不可见字符
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 设备返回的条码可能包含空格(0x20)、NULL字符(0x00)等不可见字符,
|
|
|
|
|
|
|
|
* 需要在返回前端前清理掉。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param record 记录
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private void cleanBarcode(RfidReadRecordVo record) {
|
|
|
|
|
|
|
|
if (record == null || record.getBarcode() == null) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
String originalBarcode = record.getBarcode();
|
|
|
|
|
|
|
|
// 使用正则替换所有不可见字符,仅保留可见业务字符
|
|
|
|
|
|
|
|
String cleanedBarcode = BARCODE_CLEAN_PATTERN.matcher(originalBarcode).replaceAll("");
|
|
|
|
|
|
|
|
record.setBarcode(cleanedBarcode);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将字符串转换为十六进制表示,用于调试
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private String toHexString(String str) {
|
|
|
|
|
|
|
|
if (str == null) {
|
|
|
|
|
|
|
|
return "null";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
|
|
for (char c : str.toCharArray()) {
|
|
|
|
|
|
|
|
sb.append(String.format("%02X ", (int) c));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return sb.toString().trim();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 新增读取记录
|
|
|
|
* 新增读取记录
|
|
|
|
* <p>
|
|
|
|
* <p>
|
|
|
|
|