日常技术点记录-one

生成word文档

serviceImpl层
@Override
    public void genAddressInfoReport(BigDecimal longitude, BigDecimal latitude, Integer busNum, String address) {
        BusStationSelectAddressVo selectAddressInfo = getSelectAddressInfo(longitude, latitude, busNum);
        /**
         * 生成word文档
         */
        if (selectAddressInfo == null) {
            throw new RuntimeException("数据为空");
        }
        List<SelectAddressBusVo> busVoList = selectAddressInfo.getList();
        if(CollectionUtil.isEmpty(busVoList)){
            throw new RuntimeException("无调整线路明细");
        }
        long lineCount = busVoList.stream().map(b -> b.getLineName()).distinct().count();
        // 初始化数据map
        Map<String, Object> dataMap = new HashMap<>();
        // 录入采购基本数据
        dataMap.put("address", address);
        dataMap.put("lineNum", lineCount);
        dataMap.put("busNum", busVoList.size());
        dataMap.put("saveDistance",selectAddressInfo.getDistanceTotal());
        dataMap.put("saveEnergy",selectAddressInfo.getPowerTotal());
        dataMap.put("saveDailyTotal",selectAddressInfo.getDayTotal());
        dataMap.put("saveMonthTotal",selectAddressInfo.getMonthTotal());
        dataMap.put("saveYearTotal", selectAddressInfo.getYearTotal());
        dataMap.put("list",busVoList);
        //Configuration 用于读取ftl文件
        //new Configuration()构造方法内是当前依赖的版本号
        try {
            Configuration cfg = new Configuration();
            cfg.setDirectoryForTemplateLoading(new File("D:\\sc_energy_consumption\\energy_consumption_service\\src\\main\\resources\\templates"));
            //输出文档路径及名称
            File outFile = new File("D:\\testFile\\okk.doc");
            //以utf-8的编码读取ftl文件
            Template template = cfg.getTemplate("xzbg.ftl","UTF-8");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
            template.process(dataMap, out);
            out.close();
        }catch (IOException e){
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    }

LocalDateTime转时间戳

Long timestamp = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();

以属性方式获取Nacos配置数据(同时包含多个不同的客户端)

首先创建多个客户端的字段父类(去实现get set)
public abstract class AbstractWeChatProperties {
    private String appid;
    private String appsecret;
    private String jscode2session;
    private String accesstoken;
    private String userinfo;
    private String wxacode;
    private String qrcode;
    private String channelCode;
}
创建对应各个客户端的实体 (并且去继承我们的父类AbstractWeChatProperties)
@Data
@Configuration
@ConfigurationProperties(prefix = "com.gzstrong.cloud.bus.user.gdytwechat")
public class GdytWeChatProperties extends AbstractWeChatProperties {

}

@Data
@Configuration
@ConfigurationProperties(prefix = "com.gzstrong.cloud.bus.user.wangyiwechat")
public class WeChatProperties extends AbstractWeChatProperties{

}
做一个根据不同的key区分不同的客户端的map
public class ChannelWeChatProperties {

    /**
     * 渠道编码对应 app info Map
     * {@link InitChannelMapRunner} 注入
     */
    public final static Map<String, AbstractWeChatProperties> channelPropertiesMap = new HashMap<>();
}
创建一个在项目启动的时候,去循环nacos中的加载下来的不同客户端,使用map对其保存
@Component
public class InitChannelMapRunner implements ApplicationRunner {

    @Autowired
    private List<AbstractWeChatProperties> chatProperties;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        chatProperties.forEach(item -> {
            ChannelWeChatProperties.channelPropertiesMap.put(item.getChannelCode(),item);
        });
    }
}
此方法是获取AccessToken方法,根据传入进来的渠道,也就是key,去获取对应的客户端实体然后通过Redis
获取对应的AccessToken
public String getAccessToken(String channelCode) {
        AbstractWeChatProperties properties = ChannelWeChatProperties.channelPropertiesMap.get(channelCode);
        if(properties==null){
            throw new RuntimeException("无该渠道码对应数据");
        }
        String accesstoken = redisService.get(RedisKey.COMMON_WECHAT_CACHE_ACCESSTOKEN+properties.getAppid());
        if (StringUtils.isBlank(accesstoken)) {
            accesstoken = refreshAccessToken(channelCode);
        }
        return accesstoken;
    }
此方法是刷新Accesstoken,根据渠道获取不同的客户端,然后存入Redis中
public String refreshAccessToken(String channelCode) {
        AbstractWeChatProperties properties = ChannelWeChatProperties.channelPropertiesMap.get(channelCode);
        if(properties==null){
            throw new RuntimeException("无该渠道码对应数据");
        }
        try {
            String url = String.format(weChatUrlProperties.getAccesstoken(), properties.getAppid(), properties.getAppsecret());
            String strResult = outRestTemplate.getForEntity(url, String.class).getBody();
            JSONObject wxResult = JSON.parseObject(strResult);
            if (null == wxResult || null == wxResult.get("access_token") || StringUtils.isBlank(wxResult.get("access_token").toString())) {
                throw new RuntimeException("未获取到对应的access_token!");
            }
            String accessToken = wxResult.get("access_token").toString();
            redisService.set(RedisKey.COMMON_WECHAT_CACHE_ACCESSTOKEN + properties.getAppid(), accessToken, RedisKey.WECHAT_ACCESSTOKEN_EXPIRE);
            return accessToken;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException("未获取到对应的access_token!");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值