Browse Source

真实流水号生成

master
han\hanst 8 months ago
parent
commit
efe267796f
  1. 1
      src/main/java/com/gaotao/modules/base/dao/BaseMapper.java
  2. 2
      src/main/java/com/gaotao/modules/base/service/BaseService.java
  3. 5
      src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java
  4. 253
      src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java
  5. 2
      src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java
  6. 12
      src/main/resources/mapper/base/BaseMapper.xml

1
src/main/java/com/gaotao/modules/base/dao/BaseMapper.java

@ -259,6 +259,7 @@ public interface BaseMapper {
*/
List<LabelContentData> getUsedLabelContent(LabelContentData inData);
List<LabelContentData> getLabelContent(LabelContentData inData);
/**
* @description: 获取标签内容的流水号规则
* @author LR

2
src/main/java/com/gaotao/modules/base/service/BaseService.java

@ -253,6 +253,8 @@ public interface BaseService {
*/
List<LabelContentData> getUsedLabelContent(LabelContentData inData);
List<LabelContentData> getLabelContent(LabelContentData inData);
/**
* @description: 获取标签内容的流水号规则
* @author LR

5
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<LabelContentData> getLabelContent(LabelContentData inData) {
return baseMapper.getLabelContent(inData);
}
@Override
public List<LabelContentSerialRuleData> getLabelContentSerialRule(LabelContentData inData) {
//获取标签内容的流水号规则

253
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<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 {

2
src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java

@ -141,7 +141,7 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
LabelContentData inData = new LabelContentData();
inData.setLabelNo(reportId);
inData.setItemNo(element.getItemNo());
List<LabelContentData> data = baseMapper.getUsedLabelContent(inData);
List<LabelContentData> data = baseMapper.getLabelContent(inData);
if (!data.isEmpty()) {
element.setDigits(data.getFirst().getSequenceBits());
element.setStep(data.getFirst().getIntervalValue());

12
src/main/resources/mapper/base/BaseMapper.xml

@ -368,6 +368,18 @@
ORDER BY ItemNo
</select>
<!--获取要用的标签内容-->
<select id="getLabelContent" parameterType="LabelContentData" resultType="LabelContentData">
SELECT ItemNo itemNo, ShowSeqNo showSeqNo, ItemDesc itemDesc, ObjectName objectName, ObjectGroup objectGroup,
DBFieldName dbFieldName, SequenceNoflag sequenceNoFlag, SequenceBits sequenceBits, [Interval] intervalValue,
ReportID labelNo
FROM ReportContentItem
<where>
AND ReportID = #{labelNo} AND ItemNo = #{itemNo}
</where>
ORDER BY ItemNo
</select>
<!--获取标签内容的流水号规则-->
<select id="getLabelContentSerialRule" parameterType="LabelContentData" resultType="LabelContentSerialRuleData">
SELECT rcs.ReportID labelNo, rcs.ItemNo itemNo, rcs.SeqNo seqNo, rcs.ObjectName objectName

Loading…
Cancel
Save