mitao
2024-04-15 ce7e6574a1f9942fc090d989b52aceaa11ba8f3e
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDataScreenConfigServiceImpl.java
@@ -1,18 +1,28 @@
package com.ruoyi.system.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.DataScreenConfigEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.BeanUtils;
import com.ruoyi.common.utils.CalculateUtil;
import com.ruoyi.common.utils.Checker;
import com.ruoyi.common.utils.CollUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.TbDataScreenConfig;
import com.ruoyi.system.dto.CalculateItemDTO;
import com.ruoyi.system.dto.update.DataIndicatorsUpdDTO;
import com.ruoyi.system.dto.update.FormalIndicatorsUpdDTO;
import com.ruoyi.system.dto.update.RiskLevelUpdDTO;
import com.ruoyi.system.mapper.TbDataScreenConfigMapper;
import com.ruoyi.system.query.DataScreenConfigQuery;
import com.ruoyi.system.service.TbDataScreenConfigService;
import com.ruoyi.system.vo.DataScreenConfigVO;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.validation.constraints.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -34,28 +44,95 @@
        TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery()
                .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.RISK_LEVEL)
                .one();
        return Objects.nonNull(tbDataScreenConfig) ? BeanUtils.copyBean(tbDataScreenConfig,
                DataScreenConfigVO.class) : new DataScreenConfigVO();
        if (Objects.isNull(tbDataScreenConfig)) {
            return new DataScreenConfigVO();
        }
        DataScreenConfigVO vo = BeanUtils.copyBean(tbDataScreenConfig,
                DataScreenConfigVO.class);
        List<CalculateItemDTO> scoreCalculateList = JSONArray.parseArray(
                tbDataScreenConfig.getCalculateFormula(),
                CalculateItemDTO.class);
        vo.setScoreCalculateList(scoreCalculateList);
        return vo;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public DataScreenConfigVO editRiskLevel(RiskLevelUpdDTO dto) {
        if (dto.areRiskLevelsDistinct()) {
            throw new ServiceException("得分范围不能重叠");
        }
        //查询是否有该指标配置
        TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery()
                .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.RISK_LEVEL)
                .oneOpt().orElseGet(() -> BeanUtils.copyBean(dto,
                        TbDataScreenConfig.class));
        List<CalculateItemDTO> calculateItemList = dto.getCalculateItemList();
        validateCalculateItemList(calculateItemList);
        String numberCalculateFormulaJsonStr = JSON.toJSONString(calculateItemList);
        tbDataScreenConfig.setCalculateFormula(numberCalculateFormulaJsonStr);
        tbDataScreenConfig.setType(DataScreenConfigEnum.RISK_LEVEL);
        this.saveOrUpdate(tbDataScreenConfig);
        return BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class);
        DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig,
                DataScreenConfigVO.class);
        dataScreenConfigVO.setRateCalculateList(calculateItemList);
        return dataScreenConfigVO;
    }
    private void validateCalculateItemList(List<CalculateItemDTO> calculateItemList) {
        if (CollUtils.isEmpty(calculateItemList)) {
            throw new ServiceException("计算公式不能为空");
        }
        CollUtils.check(calculateItemList, new Checker<CalculateItemDTO>() {
            @Override
            public void check(CalculateItemDTO data) {
                if (Objects.isNull(data.getValueType())) {
                    throw new ServiceException("基础数据配置计算规则值类型不能为空");
                }
                if (StringUtils.isBlank(data.getContent())) {
                    throw new ServiceException("基础数据配置计算规则值内容不能为空");
                }
            }
        });
        boolean result = hasConsecutiveDuplicates(calculateItemList);
        if (result) {
            throw new ServiceException("计算表达式有误,请修改");
        }
        //参数校验
        String numberCalculateFormulaStr = calculateItemList.stream()
                .map(CalculateItemDTO::getContent)
                .collect(Collectors.joining());
        //校验表达式是否正确
        try {
            CalculateUtil.calculate(numberCalculateFormulaStr);
        } catch (Exception e) {
            throw new ServiceException("计算表达式有误,请修改");
        }
    }
    public boolean hasConsecutiveDuplicates(List<CalculateItemDTO> calculateItemList) {
        return IntStream.range(1, calculateItemList.size())
                .anyMatch(i -> calculateItemList.get(i - 1).getValueType()
                        .equals(calculateItemList.get(i).getValueType()));
    }
    @Override
    public List<DataScreenConfigVO> getIndicatorsConfig(DataScreenConfigQuery query) {
    public List<DataScreenConfigVO> getIndicatorsConfig(@NotNull DataScreenConfigEnum type) {
        List<TbDataScreenConfig> list = this.lambdaQuery()
                .eq(TbDataScreenConfig::getType, query.getType()).list();
        return BeanUtils.copyList(list, DataScreenConfigVO.class);
                .eq(TbDataScreenConfig::getType, type).list();
        return list.stream().map(item -> {
            DataScreenConfigVO vo = BeanUtils.copyBean(item,
                    DataScreenConfigVO.class);
            List<CalculateItemDTO> scoreCalculateList = JSONArray.parseArray(
                    item.getCalculateFormula(),
                    CalculateItemDTO.class);
            vo.setScoreCalculateList(scoreCalculateList);
            List<CalculateItemDTO> rateCalculateList = JSONArray.parseArray(
                    item.getCalculateRateFormula(),
                    CalculateItemDTO.class);
            vo.setRateCalculateList(rateCalculateList);
            return vo;
        }).collect(Collectors.toList());
    }
    @Override
@@ -67,9 +144,21 @@
                .eq(TbDataScreenConfig::getSubType,
                        dto.getSubType()).oneOpt().orElseGet(() -> BeanUtils.copyBean(dto,
                        TbDataScreenConfig.class));
        List<CalculateItemDTO> scoreCalculateList = dto.getScoreCalculateList();
        List<CalculateItemDTO> rateCalculateList = dto.getRateCalculateList();
        validateCalculateItemList(scoreCalculateList);
        validateCalculateItemList(rateCalculateList);
        String scoreCalculateFormulaJsonStr = JSON.toJSONString(scoreCalculateList);
        tbDataScreenConfig.setCalculateFormula(scoreCalculateFormulaJsonStr);
        String rateCalculateFormulaJsonStr = JSON.toJSONString(rateCalculateList);
        tbDataScreenConfig.setCalculateRateFormula(rateCalculateFormulaJsonStr);
        tbDataScreenConfig.setType(DataScreenConfigEnum.DATA_INDICATORS);
        this.saveOrUpdate(tbDataScreenConfig);
        return BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class);
        DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig,
                DataScreenConfigVO.class);
        dataScreenConfigVO.setScoreCalculateList(scoreCalculateList);
        dataScreenConfigVO.setRateCalculateList(rateCalculateList);
        return dataScreenConfigVO;
    }
    @Override
@@ -82,7 +171,14 @@
                        dto.getSubType()).oneOpt().orElseGet(() -> BeanUtils.copyBean(dto,
                        TbDataScreenConfig.class));
        tbDataScreenConfig.setType(DataScreenConfigEnum.FORMAL_INDICATORS);
        List<CalculateItemDTO> calculateItemList = dto.getCalculateItemList();
        validateCalculateItemList(calculateItemList);
        String calculateFormulaJsonStr = JSON.toJSONString(calculateItemList);
        tbDataScreenConfig.setCalculateFormula(calculateFormulaJsonStr);
        this.saveOrUpdate(tbDataScreenConfig);
        return BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class);
        DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig,
                DataScreenConfigVO.class);
        dataScreenConfigVO.setScoreCalculateList(calculateItemList);
        return dataScreenConfigVO;
    }
}