diff --git a/src/main/java/com/gaotao/modules/base/dao/BaseMapper.java b/src/main/java/com/gaotao/modules/base/dao/BaseMapper.java index c2a22e6..510939d 100644 --- a/src/main/java/com/gaotao/modules/base/dao/BaseMapper.java +++ b/src/main/java/com/gaotao/modules/base/dao/BaseMapper.java @@ -259,6 +259,7 @@ public interface BaseMapper { */ List getUsedLabelContent(LabelContentData inData); + List getLabelContent(LabelContentData inData); /** * @description: 获取标签内容的流水号规则 * @author LR diff --git a/src/main/java/com/gaotao/modules/base/service/BaseService.java b/src/main/java/com/gaotao/modules/base/service/BaseService.java index 03a563f..b231f4b 100644 --- a/src/main/java/com/gaotao/modules/base/service/BaseService.java +++ b/src/main/java/com/gaotao/modules/base/service/BaseService.java @@ -253,6 +253,8 @@ public interface BaseService { */ List getUsedLabelContent(LabelContentData inData); + List getLabelContent(LabelContentData inData); + /** * @description: 获取标签内容的流水号规则 * @author LR diff --git a/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java b/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java index b483a6c..5a7b706 100644 --- a/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java +++ b/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java @@ -786,6 +786,11 @@ public class BaseServiceImpl implements BaseService { return baseMapper.getUsedLabelContent(inData); } + @Override + public List getLabelContent(LabelContentData inData) { + return baseMapper.getLabelContent(inData); + } + @Override public List getLabelContentSerialRule(LabelContentData inData) { //获取标签内容的流水号规则 diff --git a/src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java b/src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java index e204934..e3cd9c3 100644 --- a/src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java +++ b/src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java @@ -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 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 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 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 ruleList, + Map 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 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 ruleList, + Map 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 elements, LabelSettingData labelSetting) { try { diff --git a/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java b/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java index 2c22c92..3f729c7 100644 --- a/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java +++ b/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java @@ -141,7 +141,7 @@ public class ReportLabelListServiceImpl extends ServiceImpl data = baseMapper.getUsedLabelContent(inData); + List data = baseMapper.getLabelContent(inData); if (!data.isEmpty()) { element.setDigits(data.getFirst().getSequenceBits()); element.setStep(data.getFirst().getIntervalValue()); diff --git a/src/main/resources/mapper/base/BaseMapper.xml b/src/main/resources/mapper/base/BaseMapper.xml index 05acbd8..392da6e 100644 --- a/src/main/resources/mapper/base/BaseMapper.xml +++ b/src/main/resources/mapper/base/BaseMapper.xml @@ -368,6 +368,18 @@ ORDER BY ItemNo + + +