|
|
@ -22,6 +22,7 @@ import java.util.*; |
|
|
import java.util.regex.Matcher; |
|
|
import java.util.regex.Matcher; |
|
|
import java.util.regex.Pattern; |
|
|
import java.util.regex.Pattern; |
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 标签数据处理服务实现类 |
|
|
* 标签数据处理服务实现类 |
|
|
@ -40,6 +41,9 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
@Autowired |
|
|
@Autowired |
|
|
private com.gaotao.modules.base.service.FontService fontService; |
|
|
private com.gaotao.modules.base.service.FontService fontService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private com.gaotao.modules.base.dao.ReportLabelListMapper reportLabelListMapper; |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public List<ReportLabelList> processLabelData(List<ReportLabelList> elements, Map<String, Object> dataMap,Boolean printFlag) { |
|
|
public List<ReportLabelList> processLabelData(List<ReportLabelList> elements, Map<String, Object> dataMap,Boolean printFlag) { |
|
|
if (elements == null || elements.isEmpty()) { |
|
|
if (elements == null || elements.isEmpty()) { |
|
|
@ -50,14 +54,22 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
|
|
|
|
|
// 第一轮处理:处理基本数据替换(不包含元素组合) |
|
|
// 第一轮处理:处理基本数据替换(不包含元素组合) |
|
|
List<ReportLabelList> firstPassElements = new ArrayList<>(); |
|
|
List<ReportLabelList> firstPassElements = new ArrayList<>(); |
|
|
|
|
|
Map<String, Object> enhancedDataMap = new HashMap<>(dataMap != null ? dataMap : new HashMap<>()); |
|
|
|
|
|
|
|
|
for (ReportLabelList element : elements) { |
|
|
for (ReportLabelList element : elements) { |
|
|
ReportLabelList processedElement = processElementData(element, dataMap,true, printFlag); |
|
|
|
|
|
|
|
|
ReportLabelList processedElement = processElementData(element, enhancedDataMap,true, printFlag); |
|
|
firstPassElements.add(processedElement); |
|
|
firstPassElements.add(processedElement); |
|
|
|
|
|
|
|
|
|
|
|
// 如果是流水号元素,将其数据添加到数据映射中,供其他元素引用 |
|
|
|
|
|
if ("serialNumber".equals(element.getType()) && processedElement.getData() != null && !processedElement.getData().isEmpty()) { |
|
|
|
|
|
enhancedDataMap.put("SERIAL_NUMBER", processedElement.getData()); |
|
|
|
|
|
log.debug("将流水号数据添加到数据映射: SERIAL_NUMBER={}", processedElement.getData()); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 第二轮处理:处理元素组合引用 |
|
|
// 第二轮处理:处理元素组合引用 |
|
|
for (ReportLabelList element : firstPassElements) { |
|
|
for (ReportLabelList element : firstPassElements) { |
|
|
ReportLabelList finalElement = processElementCombinations(element, dataMap, firstPassElements, printFlag); |
|
|
|
|
|
|
|
|
ReportLabelList finalElement = processElementCombinations(element, enhancedDataMap, firstPassElements, printFlag); |
|
|
|
|
|
|
|
|
// 如果元素被设置为不显示,则跳过该元素 |
|
|
// 如果元素被设置为不显示,则跳过该元素 |
|
|
if (("onecode".equals(element.getType()) || "qrcode".equals(element.getType()) |
|
|
if (("onecode".equals(element.getType()) || "qrcode".equals(element.getType()) |
|
|
@ -73,6 +85,133 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
return processedElements; |
|
|
return processedElements; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 处理二维码/一维码元素,特别处理流水号引用 |
|
|
|
|
|
*/ |
|
|
|
|
|
private String processBarcodeElement(String originalData, Map<String, Object> dataMap, ReportLabelList element, Boolean printFlag) { |
|
|
|
|
|
if (originalData == null || originalData.isEmpty()) { |
|
|
|
|
|
return originalData; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
log.debug("处理条码元素: type={}, originalData={}", element.getType(), originalData); |
|
|
|
|
|
|
|
|
|
|
|
// 检查是否包含流水号引用(各种可能的格式) |
|
|
|
|
|
if (containsSerialNumberReference(originalData)) { |
|
|
|
|
|
log.debug("检测到流水号引用,开始处理"); |
|
|
|
|
|
|
|
|
|
|
|
// 获取流水号的真实数据 |
|
|
|
|
|
String serialNumberData = getSerialNumberData(element.getReportId(), dataMap, printFlag); |
|
|
|
|
|
|
|
|
|
|
|
if (serialNumberData != null && !serialNumberData.isEmpty()) { |
|
|
|
|
|
// 清理流水号数据,直接返回纯净的流水号 |
|
|
|
|
|
String cleanSerialNumber = cleanSerialNumberData(serialNumberData); |
|
|
|
|
|
log.debug("流水号处理完成: {} -> {}", originalData, cleanSerialNumber); |
|
|
|
|
|
return cleanSerialNumber; |
|
|
|
|
|
} else { |
|
|
|
|
|
log.warn("未能获取到流水号数据,使用原始数据"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果不包含流水号引用,使用常规的数据源字段替换 |
|
|
|
|
|
return replaceDataSourceFields(originalData, dataMap); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 检查数据中是否包含流水号引用 |
|
|
|
|
|
*/ |
|
|
|
|
|
private boolean containsSerialNumberReference(String data) { |
|
|
|
|
|
if (data == null || data.isEmpty()) { |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 检查各种可能的流水号引用格式 |
|
|
|
|
|
return data.contains("流水号") || |
|
|
|
|
|
data.contains("#{SERIAL_NUMBER}") || |
|
|
|
|
|
data.contains("serialNumber"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 获取流水号的真实数据(用于二维码引用,不递增流水号) |
|
|
|
|
|
*/ |
|
|
|
|
|
private String getSerialNumberData(String reportId, Map<String, Object> dataMap, Boolean printFlag) { |
|
|
|
|
|
try { |
|
|
|
|
|
// 直接通过BaseService查询流水号元素,避免循环依赖 |
|
|
|
|
|
List<ReportLabelList> allElements = getElementsByReportId(reportId); |
|
|
|
|
|
|
|
|
|
|
|
for (ReportLabelList element : allElements) { |
|
|
|
|
|
if ("serialNumber".equals(element.getType())) { |
|
|
|
|
|
log.debug("找到流水号元素: itemNo={}, data={}", element.getItemNo(), element.getData()); |
|
|
|
|
|
|
|
|
|
|
|
// 获取流水号当前值,不递增(false参数) |
|
|
|
|
|
String serialData = processSerialNumberElement(element, dataMap, false, printFlag); |
|
|
|
|
|
log.debug("获取的流水号数据(不递增): {}", serialData); |
|
|
|
|
|
|
|
|
|
|
|
return serialData; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
log.warn("未找到流水号元素: reportId={}", reportId); |
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("获取流水号数据失败: reportId={}, error={}", reportId, e.getMessage(), e); |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 通过Mapper直接查询元素,避免循环依赖 |
|
|
|
|
|
*/ |
|
|
|
|
|
private List<ReportLabelList> getElementsByReportId(String reportId) { |
|
|
|
|
|
try { |
|
|
|
|
|
// 使用Mapper直接查询,避免循环依赖 |
|
|
|
|
|
return reportLabelListMapper.selectList( |
|
|
|
|
|
new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<ReportLabelList>() |
|
|
|
|
|
.eq("report_id", reportId) |
|
|
|
|
|
); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("查询元素失败: reportId={}, error={}", reportId, e.getMessage(), e); |
|
|
|
|
|
return new ArrayList<>(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 替换数据中的流水号引用为真实数据 |
|
|
|
|
|
*/ |
|
|
|
|
|
private String replaceSerialNumberReferences(String originalData, String serialNumberData) { |
|
|
|
|
|
String result = originalData; |
|
|
|
|
|
|
|
|
|
|
|
// 清理流水号数据,移除不需要的后缀 |
|
|
|
|
|
String cleanSerialNumber = cleanSerialNumberData(serialNumberData); |
|
|
|
|
|
|
|
|
|
|
|
// 替换各种可能的流水号引用格式 |
|
|
|
|
|
result = result.replaceAll("\\{流水号[^}]*\\}", cleanSerialNumber); |
|
|
|
|
|
result = result.replaceAll("#\\{SERIAL_NUMBER\\}", cleanSerialNumber); |
|
|
|
|
|
result = result.replaceAll("流水号", cleanSerialNumber); |
|
|
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 清理流水号数据,移除不需要的后缀 |
|
|
|
|
|
* 例如:P120250918000003+#{CURRENT_DATE_YYYYMMDD}) -> P120250918000003 |
|
|
|
|
|
*/ |
|
|
|
|
|
private String cleanSerialNumberData(String serialNumberData) { |
|
|
|
|
|
if (serialNumberData == null || serialNumberData.isEmpty()) { |
|
|
|
|
|
return serialNumberData; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 移除 +#{...} 格式的后缀 |
|
|
|
|
|
String cleaned = serialNumberData.replaceAll("\\+#\\{[^}]*\\}[)]*", ""); |
|
|
|
|
|
|
|
|
|
|
|
// 移除其他可能的后缀模式 |
|
|
|
|
|
cleaned = cleaned.replaceAll("\\+.*$", ""); // 移除+号及其后面的所有内容 |
|
|
|
|
|
|
|
|
|
|
|
log.debug("流水号数据清理: {} -> {}", serialNumberData, cleaned); |
|
|
|
|
|
|
|
|
|
|
|
return cleaned.trim(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 处理元素组合引用 |
|
|
* 处理元素组合引用 |
|
|
*/ |
|
|
*/ |
|
|
@ -141,14 +280,8 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
break; |
|
|
break; |
|
|
case "onecode": |
|
|
case "onecode": |
|
|
case "qrcode": |
|
|
case "qrcode": |
|
|
// 检查是否包含元素组合引用 |
|
|
|
|
|
if (containsElementReferences(originalData)) { |
|
|
|
|
|
// 需要传入所有元素列表来处理组合 |
|
|
|
|
|
// 这里暂时使用基本的数据源替换,完整的组合处理在processLabelData中进行 |
|
|
|
|
|
processedElement.setData(replaceDataSourceFields(originalData, dataMap)); |
|
|
|
|
|
} else { |
|
|
|
|
|
processedElement.setData(replaceDataSourceFields(originalData, dataMap)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 直接处理二维码/一维码的流水号引用 |
|
|
|
|
|
processedElement.setData(processBarcodeElement(originalData, dataMap, element, printFlag)); |
|
|
break; |
|
|
break; |
|
|
case "serialNumber": |
|
|
case "serialNumber": |
|
|
// 处理流水号元素,生成真实的流水号 |
|
|
// 处理流水号元素,生成真实的流水号 |
|
|
@ -247,8 +380,14 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
if (reference.startsWith("#{") && reference.endsWith("}")) { |
|
|
if (reference.startsWith("#{") && reference.endsWith("}")) { |
|
|
String fieldName = reference.substring(2, reference.length() - 1); |
|
|
String fieldName = reference.substring(2, reference.length() - 1); |
|
|
|
|
|
|
|
|
|
|
|
// 特殊处理流水号引用 |
|
|
|
|
|
if ("SERIAL_NUMBER".equals(fieldName)) { |
|
|
|
|
|
Object serialValue = dataMap.get("SERIAL_NUMBER"); |
|
|
|
|
|
replacement = serialValue != null ? serialValue.toString() : ""; |
|
|
|
|
|
log.debug("元素组合中使用流水号引用: SERIAL_NUMBER={}", replacement); |
|
|
|
|
|
} |
|
|
// 首先检查是否是系统变量 |
|
|
// 首先检查是否是系统变量 |
|
|
if (isSystemVariable(fieldName)) { |
|
|
|
|
|
|
|
|
else if (isSystemVariable(fieldName)) { |
|
|
replacement = getSystemVariableValue(fieldName); |
|
|
replacement = getSystemVariableValue(fieldName); |
|
|
log.debug("元素组合中使用系统变量: {}={}", fieldName, replacement); |
|
|
log.debug("元素组合中使用系统变量: {}={}", fieldName, replacement); |
|
|
} else { |
|
|
} else { |
|
|
@ -582,8 +721,21 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
String fieldName = matcher.group(1); |
|
|
String fieldName = matcher.group(1); |
|
|
String replacement; |
|
|
String replacement; |
|
|
|
|
|
|
|
|
|
|
|
// 特殊处理流水号引用 |
|
|
|
|
|
if ("SERIAL_NUMBER".equals(fieldName)) { |
|
|
|
|
|
// 对于流水号引用,需要从dataMap中获取已处理的流水号数据 |
|
|
|
|
|
Object serialValue = dataMap.get("SERIAL_NUMBER"); |
|
|
|
|
|
if (serialValue != null) { |
|
|
|
|
|
replacement = serialValue.toString(); |
|
|
|
|
|
log.debug("替换流水号引用: SERIAL_NUMBER={}", replacement); |
|
|
|
|
|
} else { |
|
|
|
|
|
// 如果没有找到流水号数据,保持原样,让后续处理 |
|
|
|
|
|
replacement = "#{SERIAL_NUMBER}"; |
|
|
|
|
|
log.debug("流水号数据未准备好,保持原样: #{SERIAL_NUMBER}"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
// 首先检查是否是系统变量 |
|
|
// 首先检查是否是系统变量 |
|
|
if (isSystemVariable(fieldName)) { |
|
|
|
|
|
|
|
|
else if (isSystemVariable(fieldName)) { |
|
|
replacement = getSystemVariableValue(fieldName); |
|
|
replacement = getSystemVariableValue(fieldName); |
|
|
log.debug("替换系统变量: {}={}", fieldName, replacement); |
|
|
log.debug("替换系统变量: {}={}", fieldName, replacement); |
|
|
} else if (dataMap != null && !dataMap.isEmpty()) { |
|
|
} else if (dataMap != null && !dataMap.isEmpty()) { |
|
|
|