后续会加上详细注释,或者出一个贴图详细的2.0版本,大家不要错过!我会详细教大家如何使用自定义注解开发!让你的代码瞬间高大上起来
@Data public class ReportDateDTO {/*** 年*/@ApiModelProperty(value = "年", notes = "")@ReportFiled(value = "year", description = "date", font = FONT_MS_YH, fontsize = 13.5f)private String year;/*** 月*/@ApiModelProperty(value = "月", notes = "")@ReportFiled(value = "month", description = "date", font = FONT_MS_YH, fontsize = 13.5f)private String month;/*** 日*/@ApiModelProperty(value = "日", notes = "")@ReportFiled(value = "day", description = "date", font = FONT_MS_YH, fontsize = 13.5f)private String day;@ReportList("report_")private List<ForecastDataDTO> forecastDataDTOList; }
/*** @author:Ttc* @date 2024/1/22 14:36* @description: 导出大屏预报数据VO*/ @Data public class ForecastDataDTO {/*** 日期*/@ApiModelProperty(value = "日期", notes = "")@ReportFiled(value = "date")private String formattedDate;/*** 天气*/@ApiModelProperty(value = "天气", notes = "")@ReportFiled(value = "weather")private String weaDay;/*** 大屏显示风力等级*/@ApiModelProperty(value = "大屏显示风力等级", notes = "")@ReportFiled(value = "wind")private String largeScreenWind;/*** 最高温度*/@ApiModelProperty(value = "最高温度", notes = "")@ReportFiled(value = "tem_max")private String tem1;/*** 最低温度*/@ApiModelProperty(value = "最低温度", notes = "")@ReportFiled(value = "tem_min")private String tem2; }
/*** @author:Ttc* @date 2024/1/18 17:54* @description: 报告字段*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ReportFiled {String value() default "";float fontsize() default 12.0f;/*** 字体路径* 如果为空,使用默认字体* @return*/String font() default "";String prefix() default "";String description() default ""; }
/*** @author:Ttc* @date 2024/1/23 14:48* @description: pdf*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ReportList {/*** 报表集合名称* 作为其中元素的前缀* @return*/String value() default ""; }
public Map<String, PdfFiledDto> getParamMap(Object param, String prefix, int index) {Map<String, PdfFiledDto> map = new HashMap<>(16);if (param == null) {return map;}Field[] fields = param.getClass().getDeclaredFields();for (Field field : fields) {Object formVal = ReflectUtil.getFieldValue(param, field.getName());ReportFiled reportFiled = field.getAnnotation(ReportFiled.class);if (reportFiled != null) {fillParamMapByReportFiled(map, formVal, reportFiled, prefix, index);}ReportList reportList = field.getAnnotation(ReportList.class);if (reportList != null) {String formKeyPrefix = reportList.value();if (formVal instanceof List) {List<Object> formObjList = (List<Object>) formVal;for (int i = 0; i < formObjList.size(); i++) {Object subObj = formObjList.get(i);Map<String, PdfFiledDto> subMap = getParamMap(subObj, formKeyPrefix, i + 1);map.putAll(subMap);}}}}return map; }
private static void fillParamMapByReportFiled(Map<String, PdfFiledDto> map,Object formVal, ReportFiled reportFiled, String prefix, int index) {String formKey = reportFiled.value();if (StrUtil.isNotBlank(prefix)) {// 获取实际keyformKey = handleFormKey(prefix, index, formKey);}if (formVal == null) {map.put(formKey, getPdfFiledDto("", -1.0f));return;}fillParamMapByObject(map, reportFiled, formKey, formVal, index); }
private static void fillParamMapByReportFiled(Map<String, PdfFiledDto> map,
Object formVal, ReportFiled reportFiled, String prefix, int index) {
String formKey = reportFiled.value();
if (StrUtil.isNotBlank(prefix)) {
// 获取实际key
formKey = handleFormKey(prefix, index, formKey);
}
if (formVal == null) {
map.put(formKey, getPdfFiledDto("", -1.0f));
return;
}
if (formVal.getClass().isArray()) {
Object[] arr = (Object[]) formVal;
for (int i = 0; i < arr.length; i++) {
Object item = arr[i];
fillParamMapByObject(map, reportFiled, handleFormKey(formKey, i, ""), item);
}
return;
}
fillParamMapByObject(map, reportFiled, formKey, formVal);
}
这里list集合,单独处理,加上文本域对应序号。
private static String handleFormKey(String prefix, int index, String formKey) {prefix = prefix.endsWith(StrPool.UNDERLINE) ? prefix : prefix + StrPool.UNDERLINE;return StrUtil.isBlank(formKey) ?prefix + index: prefix + formKey + StrPool.UNDERLINE + index; }
private static PdfFiledDto getPdfFiledDto(String val, float fontsize) {return new PdfFiledDto(val, fontsize, null); }private static PdfFiledDto getPdfFiledDto(String val, float fontsize, String fontPath) {return new PdfFiledDto(val, fontsize, fontPath); }