生成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!");
}
}