package com.finance.system.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.finance.common.enums.DataScreenConfigEnum; import com.finance.common.exception.ServiceException; import com.finance.common.utils.BeanUtils; import com.finance.common.utils.CalculateUtil; import com.finance.common.utils.Checker; import com.finance.common.utils.CollUtils; import com.finance.common.utils.StringUtils; import com.finance.system.domain.TbDataScreenConfig; import com.finance.system.dto.CalculateItemDTO; import com.finance.system.dto.update.DataIndicatorsUpdDTO; import com.finance.system.dto.update.FormalIndicatorsUpdDTO; import com.finance.system.dto.update.RiskLevelUpdDTO; import com.finance.system.mapper.TbDataScreenConfigMapper; import com.finance.system.service.TbDataScreenConfigService; import com.finance.system.vo.DataScreenConfigVO; import java.util.ArrayList; 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; /** *

* 大屏数据配置表 服务实现类 *

* * @author mitao * @since 2024-03-13 */ @Service public class TbDataScreenConfigServiceImpl extends ServiceImpl implements TbDataScreenConfigService { @Override public DataScreenConfigVO getRiskLevel() { TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery() .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.RISK_LEVEL) .one(); if (Objects.isNull(tbDataScreenConfig)) { return new DataScreenConfigVO(); } DataScreenConfigVO vo = BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class); List 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 calculateItemList = dto.getCalculateItemList(); validateCalculateItemList(calculateItemList); String numberCalculateFormulaJsonStr = JSON.toJSONString(calculateItemList); tbDataScreenConfig.setCalculateFormula(numberCalculateFormulaJsonStr); tbDataScreenConfig.setType(DataScreenConfigEnum.RISK_LEVEL); this.saveOrUpdate(tbDataScreenConfig); DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class); dataScreenConfigVO.setRateCalculateList(calculateItemList); return dataScreenConfigVO; } private void validateCalculateItemList(List calculateItemList) { if (CollUtils.isEmpty(calculateItemList)) { throw new ServiceException("计算公式不能为空"); } CollUtils.check(calculateItemList, new Checker() { @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 calculateItemList) { return IntStream.range(1, calculateItemList.size()) .anyMatch(i -> calculateItemList.get(i - 1).getValueType() .equals(calculateItemList.get(i).getValueType())); } @Override public List getIndicatorsConfig(@NotNull DataScreenConfigEnum type) { List list = this.lambdaQuery() .eq(TbDataScreenConfig::getType, type).list(); return list.stream().map(item -> { DataScreenConfigVO vo = BeanUtils.copyBean(item, DataScreenConfigVO.class); List scoreCalculateList = JSONArray.parseArray( item.getCalculateFormula(), CalculateItemDTO.class); vo.setScoreCalculateList(scoreCalculateList); List rateCalculateList = JSONArray.parseArray( item.getCalculateRateFormula(), CalculateItemDTO.class); vo.setRateCalculateList(rateCalculateList); return vo; }).collect(Collectors.toList()); } @Override @Transactional(rollbackFor = Exception.class) public List editDataIndicatorsConfig(List dtoList) { List vosList = new ArrayList<>(); for (DataIndicatorsUpdDTO dto : dtoList) { //查询是否有该指标配置 TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery() .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.DATA_INDICATORS) .eq(TbDataScreenConfig::getSubType, dto.getSubType()).oneOpt().orElseGet(() -> BeanUtils.copyBean(dto, TbDataScreenConfig.class)); List scoreCalculateList = dto.getScoreCalculateList(); List 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); DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class); dataScreenConfigVO.setScoreCalculateList(scoreCalculateList); dataScreenConfigVO.setRateCalculateList(rateCalculateList); vosList.add(dataScreenConfigVO); } return vosList; } @Override @Transactional(rollbackFor = Exception.class) public List editFormalIndicatorsConfig( List dtoList) { List vosList = new ArrayList<>(); for (FormalIndicatorsUpdDTO dto : dtoList) { //查询是否有该指标配置 TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery() .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.FORMAL_INDICATORS) .eq(TbDataScreenConfig::getSubType, dto.getSubType()).oneOpt().orElseGet(() -> BeanUtils.copyBean(dto, TbDataScreenConfig.class)); tbDataScreenConfig.setType(DataScreenConfigEnum.FORMAL_INDICATORS); tbDataScreenConfig.setMaxScore(dto.getMaxScore()); List calculateItemList = dto.getCalculateItemList(); validateCalculateItemList(calculateItemList); String calculateFormulaJsonStr = JSON.toJSONString(calculateItemList); tbDataScreenConfig.setCalculateFormula(calculateFormulaJsonStr); this.saveOrUpdate(tbDataScreenConfig); DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig, DataScreenConfigVO.class); dataScreenConfigVO.setScoreCalculateList(calculateItemList); vosList.add(dataScreenConfigVO); } return vosList; } }