|
|
|
@ -614,7 +614,7 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
} |
|
|
|
break; |
|
|
|
case "date": |
|
|
|
return processDateElement(replacedData, element); |
|
|
|
return processDateText(originalData, replacedData, element); |
|
|
|
case "string": |
|
|
|
return processStringElement(replacedData, element); |
|
|
|
case "text": |
|
|
|
@ -629,6 +629,25 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
return replacedData; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 处理日期文本,支持"#{CURRENT_DATE_...}后缀"场景 |
|
|
|
*/ |
|
|
|
private String processDateText(String originalData, String replacedData, ReportLabelList element) { |
|
|
|
// 常规场景:替换后是纯日期,直接按日期配置处理 |
|
|
|
String processed = processDateElement(replacedData, element); |
|
|
|
if (parseDate(replacedData) != null) { |
|
|
|
return processed; |
|
|
|
} |
|
|
|
|
|
|
|
// 扩展场景:日期系统变量 + 固定前后缀(例如 "#{CURRENT_DATE_YYYY-MM-DD}F") |
|
|
|
String dateTokenProcessed = replaceCurrentDateTokenWithFormattedDate(originalData, element); |
|
|
|
if (!dateTokenProcessed.equals(originalData)) { |
|
|
|
return dateTokenProcessed; |
|
|
|
} |
|
|
|
|
|
|
|
return processed; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 检查元素是否有数字格式化设置 |
|
|
|
*/ |
|
|
|
@ -798,12 +817,60 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
return dateValue; |
|
|
|
} |
|
|
|
|
|
|
|
// 日期偏移处理:正数加天,负数减天 |
|
|
|
Integer dateOffsetDays = element.getDateOffsetDays(); |
|
|
|
date = applyDateOffset(date, element.getDateOffsetDays()); |
|
|
|
return extractDateByType(date, extractType, element); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("日期处理失败: dateValue={}, error={}", dateValue, e.getMessage()); |
|
|
|
return dateValue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将日期系统变量替换为按配置格式化后的日期(保留前后缀) |
|
|
|
*/ |
|
|
|
private String replaceCurrentDateTokenWithFormattedDate(String originalData, ReportLabelList element) { |
|
|
|
if (originalData == null || originalData.trim().isEmpty()) { |
|
|
|
return originalData; |
|
|
|
} |
|
|
|
|
|
|
|
String[] dateTokens = {"#{CURRENT_DATE_YYYY-MM-DD}", "#{CURRENT_DATE_YYYYMMDD}"}; |
|
|
|
boolean hasDateToken = false; |
|
|
|
for (String token : dateTokens) { |
|
|
|
if (originalData.contains(token)) { |
|
|
|
hasDateToken = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!hasDateToken) { |
|
|
|
return originalData; |
|
|
|
} |
|
|
|
|
|
|
|
String extractType = element.getDateExtractType() != null ? element.getDateExtractType() : "full"; |
|
|
|
LocalDate currentDate = applyDateOffset(LocalDate.now(), element.getDateOffsetDays()); |
|
|
|
String formattedCurrentDate = extractDateByType(currentDate, extractType, element); |
|
|
|
|
|
|
|
String result = originalData; |
|
|
|
for (String token : dateTokens) { |
|
|
|
result = result.replace(token, formattedCurrentDate); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 日期偏移处理:正数加天,负数减天 |
|
|
|
*/ |
|
|
|
private LocalDate applyDateOffset(LocalDate date, Integer dateOffsetDays) { |
|
|
|
if (dateOffsetDays != null && dateOffsetDays != 0) { |
|
|
|
date = date.plusDays(dateOffsetDays.longValue()); |
|
|
|
return date.plusDays(dateOffsetDays.longValue()); |
|
|
|
} |
|
|
|
return date; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 按提取类型输出日期文本 |
|
|
|
*/ |
|
|
|
private String extractDateByType(LocalDate date, String extractType, ReportLabelList element) { |
|
|
|
switch (extractType) { |
|
|
|
case "year": |
|
|
|
return String.valueOf(date.getYear()); |
|
|
|
@ -819,11 +886,6 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService |
|
|
|
default: |
|
|
|
return formatFullDate(date, element); |
|
|
|
} |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("日期处理失败: dateValue={}, error={}", dateValue, e.getMessage()); |
|
|
|
return dateValue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
|