package com.smartor.message;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.enums.WxGZHEnum;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.message.wechat.WechatMpConfig;
import com.ruoyi.message.wechat.WechatMpConfigProvider;
import com.ruoyi.system.service.ISysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 微信公众号机构级配置实现:收口原先散落在三个类里的 {@code WxGZHEnum.getDescByCode(orgid)}
* 调用({@code RyTask} / {@code RedisMqReceiver} / {@code ServiceSubtaskServiceImpl})。
*
* 配置源优先级:
*
* - {@code sys_config} 表 key = {@code wx.mp.config.},值形如
* {@code {"appid":"xx","appSecret":"yy","address":"zz"}} —— 便于新机构不改代码接入;
* - 代码内 {@link WxGZHEnum} 枚举(保持原有配置源不变,行为与线上一致)。
*
* 同时把「按 List 下标取 appid/appSecret/address」这种脆弱写法改成了显式字段取值。
*/
@Slf4j
@Component
public class WechatMpConfigProviderImpl implements WechatMpConfigProvider {
/**
* 机构级公众号配置的配置项 key 前缀
*/
private static final String CONFIG_KEY_PREFIX = "wx.mp.config.";
private final ISysConfigService configService;
public WechatMpConfigProviderImpl(ISysConfigService configService) {
this.configService = configService;
}
@Override
public WechatMpConfig getConfig(String orgid) {
if (StringUtils.isEmpty(orgid)) {
return null;
}
//优先取数据库配置(支持新机构)
WechatMpConfig fromDb = readFromDb(orgid);
if (fromDb != null && fromDb.isComplete()) {
return fromDb;
}
WechatMpConfig config = new WechatMpConfig();
config.setOrgid(orgid);
for (WxGZHEnum item : WxGZHEnum.values()) {
if (orgid.equals(item.getOrgid())) {
config.setAppid(item.getAppid());
config.setAppSecret(item.getAppSecret());
config.setAddress(item.getAddress());
break;
}
}
if (!config.isComplete()) {
log.warn("【WechatMpConfigProviderImpl】机构 {} 的公众号配置不完整:{}", orgid, config);
}
return config;
}
private WechatMpConfig readFromDb(String orgid) {
try {
String value = configService.selectConfigByKey(CONFIG_KEY_PREFIX + orgid, orgid);
if (StringUtils.isEmpty(value)) {
return null;
}
Map map = new ObjectMapper().readValue(value, Map.class);
WechatMpConfig config = new WechatMpConfig();
config.setOrgid(orgid);
config.setAppid(map.get("appid"));
config.setAppSecret(map.get("appSecret"));
config.setAddress(map.get("address"));
return config;
} catch (Exception e) {
log.warn("【WechatMpConfigProviderImpl】读取 {} 配置失败,orgid:{},err:{}",
CONFIG_KEY_PREFIX + orgid, orgid, e.getMessage());
return null;
}
}
}