public class PrintFormatFactory {
public static Object formatValue(Object value, String format, String setting) {
Map<String, IPrintFormatValue> formatImpls = SpringUtil.getApplicationContext().getBeansOfType(IPrintFormatValue.class);
if (formatImpls != null && formatImpls.size() > 0) {
for (Map.Entry<String, IPrintFormatValue> entry : formatImpls.entrySet()) {
if (entry.getValue().containsFormat(format)) {
try {
return entry.getValue().formatValue(value, format, setting);
} catch (Exception ex) {
throw new RuntimeException(String.format("format类型[%s]转换出错:%s", format, ex.getMessage()));
}
}
}
throw new RuntimeException(String.format("未支持的format类型[%s]!", format));
}
throw new RuntimeException("没有找到注入的格式转换类!");
}
}
public interface IPrintFormatValue {
boolean containsFormat(String format);
Object formatValue(Object value,String format,String setting);
}
@Service("BoxFormatImpl")
public class BoxFormatImpl implements IPrintFormatValue {
@Override
public boolean containsFormat(String format) {
try {
return BoxFormatEnum.valueOf(format) != null;
} catch (Exception e) {
return false;
}
}
@Override
public Object formatValue(Object value, String format, String setting) {
String valueString = value != null ? value.toString() : null;
if (BoxFormatEnum.CHK.name().equals(format)) {
return this.handleCheckBox(valueString, setting);
} else if (BoxFormatEnum.CHKG.name().equals(format)) {
return this.handleCheckBoxJson(valueString);
} else if (BoxFormatEnum.RDO.name().equals(format)) {
return this.handleRadio(valueString, setting);
} else if (BoxFormatEnum.RDOG.name().equals(format)) {
return this.handleRadioJson(valueString);
}
return null;
}
public TextRenderData handleCheckBox(String value, String setting) {
TextRenderData selSymbol = new TextRenderData("■", new Style("Wingdings 2", 10.5));
TextRenderData unselSymbol = new TextRenderData("□", new Style("Wingdings 2", 10.5));
if (StrUtil.isNotBlank(value) && !"[]".equals(value) || (StrUtil.isNotBlank(value) && StrUtil.isNotBlank(setting) && value.indexOf(setting) != -1)) {
return selSymbol;
} else {
return unselSymbol;
}
}
public StringBuffer handleCheckBoxJson(String value) {
Map<String, Boolean> checkColorMap = new LinkedHashMap<>();
JSONArray jsonArray = new JSONArray(value);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String checkBoxValue = jsonObject.getStr("value");
String checkBoxLabel = jsonObject.getStr("label");
String ifCheckBox = jsonObject.getStr("checked");
boolean aBoolean = Boolean.parseBoolean(ifCheckBox);
checkColorMap.put(checkBoxLabel, aBoolean);
}
StringBuffer sb = new StringBuffer();
Set<Map.Entry<String, Boolean>> entries = checkColorMap.entrySet();
for (Map.Entry<String, Boolean> map : entries) {
String checkBox;
if (map.getValue()) {
checkBox = "■";
} else {
checkBox = "□";
}
sb.append(checkBox).append(map.getKey() + " ");
}
return sb;
}
public TextRenderData handleRadio(String value, String setting) {
TextRenderData selSymbol = new TextRenderData("●", new Style("Wingdings 2", 10.5));
TextRenderData unselSymbol = new TextRenderData("○", new Style("Wingdings 2", 10.5));
if (StrUtil.isNotBlank(value) || (StrUtil.isNotBlank(setting) && value.equals(setting))) {
return selSymbol;
} else {
return unselSymbol;
}
}
public StringBuffer handleRadioJson(String value) {
Map<String, Boolean> checkColorMap = new LinkedHashMap<>();
JSONArray jsonArray = new JSONArray(value);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String checkBoxLabel = jsonObject.getStr("label");
String checkBoxValue = jsonObject.getStr("value");
String ifCheckBox = jsonObject.getStr("checked");
boolean aBoolean = Boolean.parseBoolean(ifCheckBox);
checkColorMap.put(checkBoxLabel, aBoolean);
}
StringBuffer sb = new StringBuffer();
Set<Map.Entry<String, Boolean>> entries = checkColorMap.entrySet();
for (Map.Entry<String, Boolean> map : entries) {
String checkBox;
if (map.getValue()) {
checkBox = "●";
} else {
checkBox = "○";
}
sb.append(checkBox).append(map.getKey() + " ");
}
return sb;
}
}
@Service("ImageFormatImpl")
public class ImageFormatImpl implements IPrintFormatValue {
@Resource
private MinioTemplates minioTemplates;
@Override
public boolean containsFormat(String format) {
try {
return PhotoFormatEnum.valueOf(format) != null;
} catch (Exception e) {
return false;
}
}
@Override
public Object formatValue(Object value, String format, String setting) {
String valueString = value != null ? value.toString() : null;
if (format.equals(PhotoFormatEnum.IMG.name())) {
return this.photoFormat(valueString, setting);
} else if (format.equals(PhotoFormatEnum.IMG_STR.name())) {
return this.qrCodeFormat(valueString);
} else if (format.equals(PhotoFormatEnum.IMGLIST.name())) {
return this.photoFormatList(valueString, setting);
}
return null;
}
public List<PrintPhotoFormatDTO> photoFormatList(String value, String setting) {
int width = 0;
int height = 0;
if (Objects.nonNull(setting)) {
String[] size = setting.split("x");
width = Integer.parseInt(size[0]);
height = Integer.parseInt(size[1]);
}
List<String> objectUrls = getPhotoUrls(value);
List<PrintPhotoFormatDTO> nameList = new ArrayList<>();
if (objectUrls.size() > 0) {
for (String objectUrl : objectUrls) {
PrintPhotoFormatDTO photoFormatDTO = new PrintPhotoFormatDTO();
if (width == 0) {
photoFormatDTO.setNAME(Pictures.of(objectUrl).create());
} else {
photoFormatDTO.setNAME(Pictures.of(objectUrl).size(width, height).create());
}
nameList.add(photoFormatDTO);
}
return nameList;
}
return null;
}
public PictureRenderData photoFormat(String value, String setting) {
int width = 0;
int height = 0;
if (Objects.nonNull(setting)) {
String[] size = setting.split("x");
width = Integer.parseInt(size[0]);
height = Integer.parseInt(size[1]);
}
List<String> objectUrls = getPhotoUrls(value);
if (objectUrls.size() > 0) {
if (width == 0) {
return Pictures.of(objectUrls.get(0)).create();
} else {
return Pictures.of(objectUrls.get(0)).size(width, height).create();
}
}
return null;
}
public PictureRenderData qrCodeFormat(String value) {
if (Objects.nonNull(value)) {
return Pictures.ofBase64(value, PictureType.PNG).create();
}
return null;
}
private List<String> getPhotoUrls(String value) {
List<String> photoUrls = new ArrayList<>();
if (Objects.nonNull(value)) {
JSONArray jsonArray = new JSONArray(value);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String filePath = jsonObject.getStr("filePath");
photoUrls.add(filePath);
}
}
List<String> photoUrlList = new ArrayList<>();
for (String photoUrl : photoUrls) {
String url = photoUrl.substring(photoUrl.indexOf("from-file"));
photoUrlList.add(url);
}
List<String> objectUrls = new ArrayList<>();
for (String objectName : photoUrlList) {
String objectUrl = minioTemplates.getObjectUrl(objectName);
objectUrls.add(objectUrl);
}
return objectUrls;
}
}
@Service("CommonFormatImpl")
public class CommonFormatImpl implements IPrintFormatValue {
@Override
public boolean containsFormat(String format) {
try {
return FormatEnum.valueOf(format) != null;
}catch (Exception e){
return false;
}
}
@Override
public Object formatValue(Object value, String format, String setting) {
String valueString = value != null ? value.toString() : null;
if (format.equals(FormatEnum.DATETYPE1.getValue()) || format.equals(FormatEnum.DATETYPE2.getValue())) {
return FormatUtil.toUpper(valueString, format);
} else if (format.equals(FormatEnum.DATECN.getValue())) {
return FormatUtil.toCnUpper(valueString);
} else if (format.equals(FormatEnum.DATEDAY.getValue()) || format.equals(FormatEnum.DATEMONTH.getValue()) || format.equals(FormatEnum.DATEYEAR.getValue()) || format.equals(FormatEnum.DATEDAY_CN.getValue()) || format.equals(FormatEnum.DATEMONTH_CN.getValue()) || format.equals(FormatEnum.DATEYEAR_CN.getValue())) {
return FormatUtil.toFormatSpecificDate(valueString, format);
} else if (format.equals(FormatEnum.NUMBERCN.getValue()) || format.equals(FormatEnum.NUMBERCN2.getValue())) {
return FormatUtil.toCnUpperNum(Integer.parseInt(valueString), format);
} else if (format.equals(FormatEnum.MONEYCN.getValue())) {
return FormatUtil.toCnUpperNum(valueString);
}
return null;
}
Object formatValue = PrintFormatFactory.formatValue(value, format, strings[2]);
private void getFormatValue(Map<String, Object> entry, String[] split) {
Object value = null;
for (String s : split) {
String[] strings = s.split("\\|");
String key = null;
String format = null;
String setting = null;
if (strings.length >= 2) {
key = strings[0];
format = strings[1];
if (strings.length > 2) {
setting = strings[2];
}
if (key.startsWith("@") || key.startsWith("?")) {
String substring = key.substring(1);
value = entry.get(substring);
}else {
value = entry.get(key);
}
if (value != null && value != "") {
Object formatValue = PrintFormatFactory.formatValue(value, format, setting);
if (s.startsWith("@") || s.startsWith("?")) {
entry.put(s.substring(1), formatValue == null ? "" : formatValue);
} else {
entry.put(s, formatValue == null ? "" : formatValue);
}
}
}
}
}