package com.iailab.module.infra.service.config; import com.iailab.framework.common.pojo.PageResult; import com.iailab.module.infra.controller.admin.config.vo.ConfigPageReqVO; import com.iailab.module.infra.controller.admin.config.vo.ConfigSaveReqVO; import com.iailab.module.infra.convert.config.ConfigConvert; import com.iailab.module.infra.dal.dataobject.config.ConfigDO; import com.iailab.module.infra.dal.mysql.config.ConfigMapper; import com.iailab.module.infra.enums.config.ConfigTypeEnum; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.iailab.module.infra.enums.ErrorCodeConstants.*; /** * 参数配置 Service 实现类 */ @Service @Slf4j @Validated public class ConfigServiceImpl implements ConfigService { @Resource private ConfigMapper configMapper; @Resource private StringRedisTemplate stringRedisTemplate; @Override public Long createConfig(ConfigSaveReqVO createReqVO) { // 校验参数配置 key 的唯一性 validateConfigKeyUnique(null, createReqVO.getKey()); // 插入参数配置 ConfigDO config = ConfigConvert.INSTANCE.convert(createReqVO); config.setType(ConfigTypeEnum.CUSTOM.getType()); configMapper.insert(config); return config.getId(); } @Override public void updateConfig(ConfigSaveReqVO updateReqVO) { // 校验自己存在 validateConfigExists(updateReqVO.getId()); // 校验参数配置 key 的唯一性 validateConfigKeyUnique(updateReqVO.getId(), updateReqVO.getKey()); // 更新参数配置 ConfigDO updateObj = ConfigConvert.INSTANCE.convert(updateReqVO); configMapper.updateById(updateObj); } @Override public void deleteConfig(Long id) { // 校验配置存在 ConfigDO config = validateConfigExists(id); // 内置配置,不允许删除 if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); } // 删除 configMapper.deleteById(id); } @Override public ConfigDO getConfig(Long id) { return configMapper.selectById(id); } @Override public ConfigDO getConfigByKey(String key) { return configMapper.selectByKey(key); } @Override public PageResult getConfigPage(ConfigPageReqVO pageReqVO) { return configMapper.selectPage(pageReqVO); } @VisibleForTesting public ConfigDO validateConfigExists(Long id) { if (id == null) { return null; } ConfigDO config = configMapper.selectById(id); if (config == null) { throw exception(CONFIG_NOT_EXISTS); } return config; } @VisibleForTesting public void validateConfigKeyUnique(Long id, String key) { ConfigDO config = configMapper.selectByKey(key); if (config == null) { return; } // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 if (id == null) { throw exception(CONFIG_KEY_DUPLICATE); } if (!config.getId().equals(id)) { throw exception(CONFIG_KEY_DUPLICATE); } } @Override public String getValue(String configCode) { String paramValue = stringRedisTemplate.opsForValue().get(configCode); if(paramValue == null){ ConfigDO configDO = configMapper.selectByKey(configCode); paramValue = configDO.getValue(); stringRedisTemplate.opsForValue().set(configCode, paramValue); } return paramValue; } }