现场需求:多客户使用同一套代码,不同用户的word模板不同(入职申请,工作时间表。。。。)系统需要根据不同客户根据他们自己的模板生成各自的word。
多模块化进行管理word模板
实现思想:
在这里插入图片描述
代码路径如下:
请添加图片描述

fileConfigBase方法:

 @PostConstruct
    public void initCrewDocDataBean() throws IOException {
        String module = FileConfigCrew.getModule();
        String defaultBean = FileConfigCrew.getDefaultBean();
        String configValue = configService.selectConfigByKey("yuyou_customer_code");
        BasYuyouCustomer basYuyouCustomer = yuyouCustomerMapper.selectOne(Wrappers.<BasYuyouCustomer>lambdaQuery()
                .eq(BasYuyouCustomer::getYuyouCustCode, configValue));
        //模块地址
        directory = basYuyouCustomer.getDirectory();
        //TODO 改名字
        String beanName = ImplBeanUtils.resolveBeanNameByShipCodes(directory, module, defaultBean, platformId);
        fileConfigBase = SpringUtils.getBean(beanName);
    }

注: @PostConstruct注解表示在代码构建时就运行,只运行一次(这里有个坑你们应该踩不到)!
ImplBeanUtils.resolveBeanNameByShipCodes()方法就是流程图中提到的”在该方法中查找客户对应的文件地址并进行比较确认地址路径“
获取模块地址的方法就是我们公司自己的代码了 这里就不多说了!
主要介绍一下resolveBeanNameByShipCodes()方法:

/**
     * 获取className通过shipCodes
     *
     * @param directory    船舶身份Id号,唯一
     * @param module      模块
     * @param defaultBean 默认实现类
     * @param platformId    平台Id
     * @return
     */
    public static String resolveBeanNameByShipCodes(String directory, String module, String defaultBean, Long platformId) {
        String ymlFilePath = module + "-impl-" + platformId + ".yml";
        //System.err.println("ymlFilePath="+ymlFilePath);
        List<ImplBean> implBeanList = readImplBean(ymlFilePath);

        String beanName = defaultBean;
        //若是配置内容为空,则默认用配置类
        if (CollectionUtils.isEmpty(implBeanList)) {
            return beanName;
        }
        for (ImplBean implBean : implBeanList) {
            String shipIdCodes = implBean.getShipCodes();
            if (StringUtils.isEmpty(shipIdCodes)) {
                return beanName;
            }
            String[] shipIdNoArr = shipIdCodes.split(",");
            for (String shipIdNoTmp : shipIdNoArr) {
                if (StringUtils.equalsIgnoreCase(shipIdNoTmp, directory)) {
                    String beanNameTmp = implBean.getBeanName();
                    return beanNameTmp;
                }
            }
        }
        return beanName;
    }

可以看得到他是读取了相应的yml文件,并获取到需要的beanName
这里有个文件集成构造模式如下
在这里插入图片描述
其中FileConfigBase是基础类
内容如下:

public abstract  class FileConfigBase {
    //doc数据转化
    public abstract void  delopyDoc(Map<String, Object> map, HttpServletResponse response,
                                    XWPFTemplate template, BasSystemDoc systemDoc) throws IOException;
}

下面是继承他的三个模块化方法:
举个例子:
在这里插入图片描述
注:@Service(“fileConfigZhongjiao”)就是用来
fileConfigBase = SpringUtils.getBean(beanName);获取bean时所需的beanName
下面是实现了父类中定义的方法。
然后就可以把这个根据不同客户获取到的不同模块的fileConfigBase发给需要使用的service方法。在这里插入图片描述
以上就完成了简单的不同客户对应不同word模板的需求。

Logo

快速构建 Web 应用程序

更多推荐