|
|
|
@ -96,12 +96,10 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
processedElement.setData(replaceDataSourceFields(originalData, dataMap)); |
|
|
|
break; |
|
|
|
case "serialNumber": |
|
|
|
// 流水号元素通常不需要数据替换,保持原样 |
|
|
|
// 处理流水号元素,生成真实的流水号 |
|
|
|
processedElement.setData(processSerialNumberElement(element, dataMap)); |
|
|
|
break; |
|
|
|
case "image": |
|
|
|
case "picture": |
|
|
|
// 图片元素,替换数据源字段(如果有的话) |
|
|
|
processedElement.setData(replaceDataSourceFields(originalData, dataMap)); |
|
|
|
case "pic": |
|
|
|
break; |
|
|
|
default: |
|
|
|
processedElement.setData(replaceDataSourceFields(originalData, dataMap)); |
|
|
|
@ -666,6 +664,251 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
|
|
|
|
return copy; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 处理流水号元素,生成真实的流水号 |
|
|
|
* |
|
|
|
* @param element 流水号元素 |
|
|
|
* @param dataMap 数据源映射 |
|
|
|
* @return 生成的流水号字符串 |
|
|
|
*/ |
|
|
|
private String processSerialNumberElement(ReportLabelList element, Map<String, Object> dataMap) { |
|
|
|
try { |
|
|
|
log.debug("开始处理流水号元素: itemNo={}, data={}", element.getItemNo(), element.getData()); |
|
|
|
|
|
|
|
// 1. 获取流水号配置信息 |
|
|
|
com.gaotao.modules.base.entity.LabelContentData contentQuery = new com.gaotao.modules.base.entity.LabelContentData(); |
|
|
|
contentQuery.setLabelNo(element.getReportId()); |
|
|
|
contentQuery.setItemNo(element.getItemNo()); |
|
|
|
|
|
|
|
// 获取流水号基本配置 |
|
|
|
List<com.gaotao.modules.base.entity.LabelContentData> contentList = baseService.getLabelContent(contentQuery); |
|
|
|
if (contentList.isEmpty()) { |
|
|
|
log.warn("未找到流水号配置: reportId={}, itemNo={}", element.getReportId(), element.getItemNo()); |
|
|
|
return "000001"; // 默认流水号 |
|
|
|
} |
|
|
|
|
|
|
|
com.gaotao.modules.base.entity.LabelContentData contentData = contentList.get(0); |
|
|
|
int sequenceBits = contentData.getSequenceBits(); // 流水号位数 |
|
|
|
int intervalValue = contentData.getIntervalValue(); // 步长 |
|
|
|
|
|
|
|
// 获取流水号规则 |
|
|
|
List<com.gaotao.modules.base.entity.LabelContentSerialRuleData> ruleList = baseService.getLabelContentSerialRule(contentQuery); |
|
|
|
|
|
|
|
// 2. 生成流水号的关键信息 (KeyInfo) |
|
|
|
String keyInfo = generateSerialKeyInfo(ruleList, dataMap); |
|
|
|
log.debug("生成的KeyInfo: {}", keyInfo); |
|
|
|
|
|
|
|
// 3. 获取或生成下一个流水号 |
|
|
|
int nextSeqNo = getNextSerialNumber(element.getReportId(), element.getItemNo(), keyInfo, intervalValue); |
|
|
|
log.debug("获取的下一个流水号: {}", nextSeqNo); |
|
|
|
|
|
|
|
// 4. 格式化流水号 |
|
|
|
String formattedSeqNo = formatSerialNumber(nextSeqNo, sequenceBits); |
|
|
|
|
|
|
|
// 5. 组装完整的流水号 |
|
|
|
String fullSerialNumber = assembleFullSerialNumber(ruleList, dataMap, formattedSeqNo); |
|
|
|
|
|
|
|
log.debug("生成的完整流水号: {}", fullSerialNumber); |
|
|
|
return fullSerialNumber; |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("处理流水号元素失败: reportId={}, itemNo={}, error={}", |
|
|
|
element.getReportId(), element.getItemNo(), e.getMessage(), e); |
|
|
|
return "ERROR"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 生成流水号的关键信息 (KeyInfo) |
|
|
|
* KeyInfo用于区分不同条件下的流水号序列,使用真实数据 |
|
|
|
* |
|
|
|
* @param ruleList 流水号规则列表 |
|
|
|
* @param dataMap 数据源映射 |
|
|
|
* @return 生成的KeyInfo字符串 |
|
|
|
*/ |
|
|
|
private String generateSerialKeyInfo(List<com.gaotao.modules.base.entity.LabelContentSerialRuleData> ruleList, |
|
|
|
Map<String, Object> dataMap) { |
|
|
|
if (ruleList == null || ruleList.isEmpty()) { |
|
|
|
return "DEFAULT"; |
|
|
|
} |
|
|
|
|
|
|
|
StringBuilder keyInfoBuilder = new StringBuilder(); |
|
|
|
|
|
|
|
for (com.gaotao.modules.base.entity.LabelContentSerialRuleData rule : ruleList) { |
|
|
|
String objectName = rule.getObjectName(); |
|
|
|
|
|
|
|
if (objectName == null || objectName.trim().isEmpty()) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
// 跳过流水号占位符,KeyInfo中不包含流水号 |
|
|
|
if ("流水号".equals(objectName) || "SERIAL".equalsIgnoreCase(objectName) || "SEQ".equalsIgnoreCase(objectName)) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
// 检查是否是数据源字段 (格式: #{fieldName}) |
|
|
|
if (objectName.startsWith("#{") && objectName.endsWith("}")) { |
|
|
|
String fieldName = objectName.substring(2, objectName.length() - 1); |
|
|
|
Object fieldValue = dataMap.get(fieldName); |
|
|
|
String value = fieldValue != null ? fieldValue.toString() : ""; |
|
|
|
if (!value.isEmpty()) { |
|
|
|
keyInfoBuilder.append(value); |
|
|
|
keyInfoBuilder.append("_"); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 固定字符串,直接使用真实数据 |
|
|
|
keyInfoBuilder.append(objectName); |
|
|
|
keyInfoBuilder.append("_"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 移除最后的下划线 |
|
|
|
if (keyInfoBuilder.length() > 0) { |
|
|
|
keyInfoBuilder.setLength(keyInfoBuilder.length() - 1); |
|
|
|
} |
|
|
|
|
|
|
|
String keyInfo = keyInfoBuilder.toString(); |
|
|
|
return keyInfo.isEmpty() ? "DEFAULT" : keyInfo; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取下一个流水号 |
|
|
|
* |
|
|
|
* @param reportId 报表ID |
|
|
|
* @param itemNo 项目编号 |
|
|
|
* @param keyInfo 关键信息 |
|
|
|
* @param intervalValue 步长 |
|
|
|
* @return 下一个流水号 |
|
|
|
*/ |
|
|
|
private int getNextSerialNumber(String reportId, Integer itemNo, String keyInfo, int intervalValue) { |
|
|
|
try { |
|
|
|
// 查询现有的流水号信息 |
|
|
|
com.gaotao.modules.base.entity.LabelContentData query = new com.gaotao.modules.base.entity.LabelContentData(); |
|
|
|
query.setLabelNo(reportId); |
|
|
|
query.setItemNo(itemNo); |
|
|
|
|
|
|
|
List<com.gaotao.modules.base.entity.LabelContentSerialInfoData> existingInfos = baseService.getLabelSerialInfos(query); |
|
|
|
|
|
|
|
// 查找匹配的KeyInfo |
|
|
|
com.gaotao.modules.base.entity.LabelContentSerialInfoData matchingInfo = null; |
|
|
|
for (com.gaotao.modules.base.entity.LabelContentSerialInfoData info : existingInfos) { |
|
|
|
if (keyInfo.equals(info.getKeyInfo())) { |
|
|
|
matchingInfo = info; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int nextSeqNo; |
|
|
|
if (matchingInfo != null) { |
|
|
|
// 存在记录,递增流水号 |
|
|
|
nextSeqNo = matchingInfo.getLastSeqNo() + intervalValue; |
|
|
|
|
|
|
|
// 更新数据库记录 |
|
|
|
com.gaotao.modules.base.entity.LabelContentSerialInfoData updateInfo = new com.gaotao.modules.base.entity.LabelContentSerialInfoData(); |
|
|
|
updateInfo.setLabelNo(reportId); |
|
|
|
updateInfo.setItemNo(itemNo); |
|
|
|
updateInfo.setKeyInfo(keyInfo); |
|
|
|
updateInfo.setLastSeqNo(nextSeqNo); |
|
|
|
updateInfo.setOriKeyInfo(keyInfo); // 用于WHERE条件 |
|
|
|
|
|
|
|
baseService.updateLabelSerialInfo(updateInfo); |
|
|
|
log.debug("更新流水号记录: reportId={}, itemNo={}, keyInfo={}, lastSeqNo={}", |
|
|
|
reportId, itemNo, keyInfo, nextSeqNo); |
|
|
|
} else { |
|
|
|
// 不存在记录,创建新记录 |
|
|
|
nextSeqNo = intervalValue; // 从步长开始 |
|
|
|
|
|
|
|
com.gaotao.modules.base.entity.LabelContentSerialInfoData newInfo = new com.gaotao.modules.base.entity.LabelContentSerialInfoData(); |
|
|
|
newInfo.setLabelNo(reportId); |
|
|
|
newInfo.setItemNo(itemNo); |
|
|
|
newInfo.setKeyInfo(keyInfo); |
|
|
|
newInfo.setLastSeqNo(nextSeqNo); |
|
|
|
|
|
|
|
baseService.insertLabelSerialInfo(newInfo); |
|
|
|
log.debug("创建流水号记录: reportId={}, itemNo={}, keyInfo={}, lastSeqNo={}", |
|
|
|
reportId, itemNo, keyInfo, nextSeqNo); |
|
|
|
} |
|
|
|
|
|
|
|
return nextSeqNo; |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("获取下一个流水号失败: reportId={}, itemNo={}, keyInfo={}, error={}", |
|
|
|
reportId, itemNo, keyInfo, e.getMessage(), e); |
|
|
|
// 发生错误时返回默认值 |
|
|
|
return intervalValue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 格式化流水号,补齐前导零 |
|
|
|
* |
|
|
|
* @param seqNo 流水号数值 |
|
|
|
* @param sequenceBits 流水号位数 |
|
|
|
* @return 格式化后的流水号字符串 |
|
|
|
*/ |
|
|
|
private String formatSerialNumber(int seqNo, int sequenceBits) { |
|
|
|
if (sequenceBits <= 0) { |
|
|
|
return String.valueOf(seqNo); |
|
|
|
} |
|
|
|
|
|
|
|
String format = "%0" + sequenceBits + "d"; |
|
|
|
return String.format(format, seqNo); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 组装完整的流水号,使用真实数据拼接流水号 |
|
|
|
* |
|
|
|
* @param ruleList 流水号规则列表 |
|
|
|
* @param dataMap 数据源映射(真实数据) |
|
|
|
* @param formattedSeqNo 格式化后的流水号 |
|
|
|
* @return 完整的流水号字符串 |
|
|
|
*/ |
|
|
|
private String assembleFullSerialNumber(List<com.gaotao.modules.base.entity.LabelContentSerialRuleData> ruleList, |
|
|
|
Map<String, Object> dataMap, String formattedSeqNo) { |
|
|
|
if (ruleList == null || ruleList.isEmpty()) { |
|
|
|
return formattedSeqNo; |
|
|
|
} |
|
|
|
|
|
|
|
StringBuilder serialNumberBuilder = new StringBuilder(); |
|
|
|
boolean hasSerialNumberPlaceholder = false; |
|
|
|
|
|
|
|
for (com.gaotao.modules.base.entity.LabelContentSerialRuleData rule : ruleList) { |
|
|
|
String objectName = rule.getObjectName(); |
|
|
|
|
|
|
|
if (objectName == null || objectName.trim().isEmpty()) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
// 检查是否是流水号占位符 |
|
|
|
if ("流水号".equals(objectName) || "SERIAL".equalsIgnoreCase(objectName) || "SEQ".equalsIgnoreCase(objectName)) { |
|
|
|
serialNumberBuilder.append(formattedSeqNo); |
|
|
|
hasSerialNumberPlaceholder = true; |
|
|
|
} |
|
|
|
// 检查是否是数据源字段 (格式: #{fieldName}) - 使用真实数据 |
|
|
|
else if (objectName.startsWith("#{") && objectName.endsWith("}")) { |
|
|
|
String fieldName = objectName.substring(2, objectName.length() - 1); |
|
|
|
Object fieldValue = dataMap.get(fieldName); |
|
|
|
String value = fieldValue != null ? fieldValue.toString() : ""; |
|
|
|
serialNumberBuilder.append(value); |
|
|
|
log.debug("使用真实数据字段: {}={}", fieldName, value); |
|
|
|
} else { |
|
|
|
// 固定字符串,直接使用 |
|
|
|
serialNumberBuilder.append(objectName); |
|
|
|
log.debug("使用固定字符串: {}", objectName); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 如果没有找到流水号占位符,则在末尾添加流水号 |
|
|
|
if (!hasSerialNumberPlaceholder) { |
|
|
|
serialNumberBuilder.append(formattedSeqNo); |
|
|
|
} |
|
|
|
|
|
|
|
String result = serialNumberBuilder.toString(); |
|
|
|
log.debug("组装完整流水号: 规则数={}, 最终结果={}", ruleList.size(), result); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String generateZplWithRealData(String reportId, List<ReportLabelList> elements, LabelSettingData labelSetting) { |
|
|
|
try { |
|
|
|
|