package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.BaseParamMapper;
import com.ruoyi.basic.pojo.BaseParam;
import com.ruoyi.basic.service.BaseParamService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* 基础参数定义接口实现类
*
*
* @author deslrey
* @version 1.0
* @since 2026/03/13 16:41
*/
@Slf4j
@Service
@Api("基础参数定义接口实现类")
public class BaseParamServiceImpl extends ServiceImpl implements BaseParamService {
@Override
public List baseParamList(BaseParam baseParam) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotEmpty(baseParam.getParamName())) {
queryWrapper.like(BaseParam::getParamName, baseParam.getParamName());
}
List list = list(queryWrapper);
if (list == null || list.isEmpty()) {
return new ArrayList<>(0);
}
// 处理日期格式展示
list.forEach(item -> {
if (Integer.valueOf(4).equals(item.getParamType()) && StringUtils.isNotEmpty(item.getParamFormat())) {
item.setParamFormat(toUpperCasePattern(item.getParamFormat()));
}
});
return list;
}
@Override
public int addBaseParam(BaseParam baseParam) {
if (baseParam == null) {
throw new RuntimeException("新增参数不能为空");
}
// 参数校验
checkBaseParam(baseParam);
// 自动生成paramKey
baseParam.setParamKey(generateParamKey());
baseParam.setCreateUser(SecurityUtils.getUsername());
baseParam.setCreateTime(LocalDateTime.now());
// 设置默认值
if (baseParam.getIsRequired() == null) baseParam.setIsRequired(0);
if (baseParam.getValueMode() == null) baseParam.setValueMode(1);
return baseMapper.insert(baseParam);
}
@Override
public int updateBaseParam(BaseParam baseParam) {
if (baseParam == null || baseParam.getId() == null) {
throw new RuntimeException("修改参数ID不能为空");
}
// 参数校验
checkBaseParam(baseParam);
baseParam.setUpdateUser(SecurityUtils.getUsername());
baseParam.setUpdateTime(LocalDateTime.now());
return baseMapper.updateById(baseParam);
}
/**
* 参数定义合法校验
*/
private void checkBaseParam(BaseParam baseParam) {
if (StringUtils.isEmpty(baseParam.getParamName())) {
throw new RuntimeException("参数名称不能为空");
}
// 类型校验 (1:数字, 2:文本, 3:下拉选择, 4:日期时间)
List validTypes = Arrays.asList(1, 2, 3, 4);
if (baseParam.getParamType() == null || !validTypes.contains(baseParam.getParamType())) {
throw new RuntimeException("非法参数类型");
}
// 如果是日期类型,校验日期格式配置
if (Integer.valueOf(4).equals(baseParam.getParamType())) {
if (StringUtils.isEmpty(baseParam.getParamFormat())) {
throw new RuntimeException("日期类型必须配置参数格式(如: yyyy-MM-dd)");
}
try {
String standardPattern = normalizePattern(baseParam.getParamFormat());
DateTimeFormatter.ofPattern(standardPattern);
baseParam.setParamFormat(standardPattern);
} catch (Exception e) {
throw new RuntimeException("日期格式非法: " + baseParam.getParamFormat());
}
}
}
/**
* 生成参数唯一key (PARAM_XXX)
*/
private String generateParamKey() {
String prefix = "PARAM_";
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.select(BaseParam::getParamKey)
.likeRight(BaseParam::getParamKey, prefix)
.orderByDesc(BaseParam::getParamKey)
.last("limit 1");
BaseParam last = baseMapper.selectOne(wrapper);
int nextNum = 1;
if (last != null && StringUtils.isNotEmpty(last.getParamKey())) {
try {
String numStr = last.getParamKey().replace(prefix, "");
nextNum = Integer.parseInt(numStr) + 1;
} catch (Exception e) {
log.error("解析ParamKey异常", e);
}
}
return prefix + String.format("%04d", nextNum);
}
/**
* 日期格式化
*/
private String normalizePattern(String pattern) {
if (StringUtils.isEmpty(pattern)) return "yyyy-MM-dd";
return pattern.replace("YYYY", "yyyy")
.replace("DD", "dd")
.replace("SS", "ss");
}
/**
* 转换为全大写显示
*/
private String toUpperCasePattern(String pattern) {
if (StringUtils.isEmpty(pattern)) return "";
return pattern.replace("yyyy", "YYYY")
.replace("dd", "DD")
.replace("ss", "SS");
}
@Override
public int deleteBaseParamByIds(Long[] ids) {
if (ids == null || ids.length == 0) {
throw new RuntimeException("删除ID不能为空");
}
return baseMapper.deleteBatchIds(Arrays.asList(ids));
}
}