Java工厂模式

  • 首先创建一个工厂全部需要用到的统一入口
public class PrintFormatFactory {
    /**
     * Description: 格式化数据
     *
     * @param value   值
     * @param format  格式化类型
     * @param setting 格式化配置
     * @Author: 洪家洪
     * @Date: 2023/8/9 11:01
     * @return:
     **/
    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 {

    /**
      * Description: 匹配格式化类型
      * @Author: 洪家洪
      * @Date: 2023/8/9 10:57
      * @param format
      * @return:
    **/
    boolean containsFormat(String format);

    /**
      * Description: 格式化数据
      * @Author: 洪家洪
      * @Date: 2023/8/9 10:53
      * @param value 值
      * @param format 格式化类型
      * @param setting 格式化配置
      * @return:
    **/
    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) {
        //勾选 F0FE 25A1 25A0
        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;
        }
    }

    //复选框JSON组模式
    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);
            //获取checkbox的值与是否勾选标识
            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;
            // 勾选(一个大写的R加上Wingdings 2字体就是一个勾选的方框)
            if (map.getValue()) {
                checkBox = "■";
            } else {
                // 不勾选的unicode编码
                checkBox = "□";
            }
            sb.append(checkBox).append(map.getKey() + "  ");
        }
        return sb;
    }


    //处理单选框
    public TextRenderData handleRadio(String value, String setting) {
        //勾选 009E
        TextRenderData selSymbol = new TextRenderData("●", new Style("Wingdings 2", 10.5));
        //不勾选 0099
        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;
        }
    }


    //处理单选框json
    public StringBuffer handleRadioJson(String value) {
        //复选框JSON组模式
        Map<String, Boolean> checkColorMap = new LinkedHashMap<>();
        JSONArray jsonArray = new JSONArray(value);
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            //获取checkbox的值与是否勾选标识
            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;
            // 勾选 \uF0A4
            if (map.getValue()) {
                checkBox = "●";
            } else {
                // 不勾选 \uF0A1
                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]);
        }
        //获取minio图片地址
        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]);
        }
        //获取minio图片地址
        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;
    }


    //获取minio图片地址
    private List<String> getPhotoUrls(String value) {
        //获取到图片路径存到list
        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);
        }
        //获取minio图片文件绝对路径
        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);
                    }
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java中的战斗机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值