From ce7e6574a1f9942fc090d989b52aceaa11ba8f3e Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期一, 15 四月 2024 21:54:08 +0800
Subject: [PATCH] 1.得分计算部分调整; 2.大屏得分计算;

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java |  239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 237 insertions(+), 2 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
index 273a224..6e3712d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
@@ -1,10 +1,48 @@
 package com.ruoyi.system.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.enums.CalculateTypeEnum;
+import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.enums.ValueTypeEnum;
+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.TbBasicDataConfig;
+import com.ruoyi.system.domain.TbBasicDataConfigDetail;
+import com.ruoyi.system.domain.TbField;
+import com.ruoyi.system.dto.BasicDataConfigDTO;
+import com.ruoyi.system.dto.CalculateDTO;
+import com.ruoyi.system.dto.CalculateItemDTO;
+import com.ruoyi.system.dto.ShowHideDTO;
+import com.ruoyi.system.dto.update.BasicDataConfigUpdateDTO;
 import com.ruoyi.system.mapper.TbBasicDataConfigMapper;
+import com.ruoyi.system.mapper.TbFieldMapper;
+import com.ruoyi.system.query.BasicDataConfigQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
+import com.ruoyi.system.service.TbBasicDataCategoryService;
+import com.ruoyi.system.service.TbBasicDataConfigDetailService;
 import com.ruoyi.system.service.TbBasicDataConfigService;
+import com.ruoyi.system.vo.BasicDataConfigDetailVO;
+import com.ruoyi.system.vo.BasicDataConfigVO;
+import com.ruoyi.system.vo.CalculateVO;
+import com.ruoyi.system.vo.ScoreCalculateVO;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -12,9 +50,206 @@
  * </p>
  *
  * @author mitao
- * @since 2024-03-13
+ * @since 2024-03-18
  */
 @Service
-public class TbBasicDataConfigServiceImpl extends ServiceImpl<TbBasicDataConfigMapper, TbBasicDataConfig> implements TbBasicDataConfigService {
+@RequiredArgsConstructor
+public class TbBasicDataConfigServiceImpl extends
+        ServiceImpl<TbBasicDataConfigMapper, TbBasicDataConfig> implements
+        TbBasicDataConfigService {
 
+    private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
+    private final TbFieldMapper fieldMapper;
+    private final TbBasicDataCategoryService tbBasicDataCategoryService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(BasicDataConfigDTO dto) {
+        TbBasicDataConfig tbBasicDataConfig = BeanUtils.copyBean(dto, TbBasicDataConfig.class);
+        List<CalculateItemDTO> calculateItemList = dto.getCalculateItemList();
+        CalculateTypeEnum calculateType = tbBasicDataConfig.getCalculateType();
+        List<CalculateDTO> dtoList = dto.getDtoList();
+        if (CalculateTypeEnum.NUMBER.equals(calculateType)) {
+            String fieldIdStr = getFieldIdStr(calculateItemList, tbBasicDataConfig);
+            tbBasicDataConfig.setFieldIdStr(fieldIdStr);
+        } else {
+            if (CollUtils.isEmpty(dtoList)) {
+                throw new ServiceException("基础数据配置不能为空");
+            } else {
+                CollUtils.check(dto.getDtoList(), new Checker<CalculateDTO>() {
+                    @Override
+                    public void check(CalculateDTO data) {
+                        if (StringUtils.isBlank(data.getKey())) {
+                            throw new ServiceException("基础数据配置key不能为空");
+                        }
+                        if (StringUtils.isBlank(data.getValue())) {
+                            throw new ServiceException("基础数据配置value不能为空");
+                        }
+                    }
+                });
+                if (StringUtils.isBlank(dto.getFieldIdStr())) {
+                    throw new ServiceException("字段id不能为空");
+                }
+                List<TbBasicDataConfigDetail> details = BeanUtils.copyList(dtoList,
+                        TbBasicDataConfigDetail.class);
+                List<TbBasicDataConfigDetail> collect = details.stream()
+                        .peek(item -> item.setBasicDataConfigId(tbBasicDataConfig.getId()))
+                        .collect(Collectors.toList());
+                tbBasicDataConfigDetailService.saveBatch(collect);
+            }
+        }
+        this.save(tbBasicDataConfig);
+    }
+
+    public boolean hasConsecutiveDuplicates(List<CalculateItemDTO> calculateItemList) {
+        return IntStream.range(1, calculateItemList.size())
+                .anyMatch(i -> calculateItemList.get(i - 1).getValueType()
+                        .equals(calculateItemList.get(i).getValueType()));
+    }
+
+
+    @NotNull
+    private String getFieldIdStr(List<CalculateItemDTO> calculateItemList,
+            TbBasicDataConfig tbBasicDataConfig) {
+        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("计算表达式有误,请修改");
+        }
+        String numberCalculateFormulaJsonStr = JSON.toJSONString(calculateItemList);
+        tbBasicDataConfig.setNumberCalculateFormula(numberCalculateFormulaJsonStr);
+        String fieldIdStr = calculateItemList.stream()
+                .filter(item -> ValueTypeEnum.FIELD.equals(item.getValueType()))
+                .map(CalculateItemDTO::getContent).collect(
+                        Collectors.joining(","));
+        return fieldIdStr;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void edit(BasicDataConfigUpdateDTO dto) {
+        TbBasicDataConfig tbBasicDataConfig = BeanUtils.copyBean(dto, TbBasicDataConfig.class);
+        //参数校验
+        CalculateTypeEnum calculateType = tbBasicDataConfig.getCalculateType();
+        List<CalculateDTO> dtoList = dto.getDtoList();
+        if (CalculateTypeEnum.NUMBER.equals(calculateType)) {
+            tbBasicDataConfig.setFieldIdStr(
+                    getFieldIdStr(dto.getCalculateItemList(), tbBasicDataConfig));
+        } else {
+            if (CollUtils.isEmpty(dtoList)) {
+                throw new ServiceException("计算公式不能为空");
+            }
+            //删除原来的配置信息,重新添加新的
+            tbBasicDataConfigDetailService.lambdaUpdate()
+                    .eq(TbBasicDataConfigDetail::getBasicDataConfigId, tbBasicDataConfig.getId())
+                    .remove();
+            List<TbBasicDataConfigDetail> details = BeanUtils.copyList(dtoList,
+                    TbBasicDataConfigDetail.class);
+            List<TbBasicDataConfigDetail> collect = details.stream()
+                    .peek(item -> item.setBasicDataConfigId(tbBasicDataConfig.getId()))
+                    .collect(Collectors.toList());
+            tbBasicDataConfigDetailService.saveBatch(collect);
+        }
+        this.updateById(tbBasicDataConfig);
+    }
+
+    @Override
+    public BasicDataConfigDetailVO getDetails(Long id) {
+        TbBasicDataConfig config = this.getById(id);
+        if (Objects.isNull(config)) {
+            throw new ServiceException("非法参数");
+        }
+        BasicDataConfigDetailVO vo = BeanUtils.copyBean(config, BasicDataConfigDetailVO.class);
+
+        CalculateTypeEnum type = vo.getCalculateType();
+        if (CalculateTypeEnum.NUMBER.equals(type)) {
+            List<CalculateItemDTO> calculateItemDTOS = JSONArray.parseArray(
+                    config.getNumberCalculateFormula(),
+                    CalculateItemDTO.class);
+            vo.setCalculateItemList(calculateItemDTOS);
+        }
+        if ((CalculateTypeEnum.TEXT.equals(type) || CalculateTypeEnum.PERCENTAGE.equals(type))) {
+            List<TbBasicDataConfigDetail> list = tbBasicDataConfigDetailService.lambdaQuery()
+                    .eq(TbBasicDataConfigDetail::getBasicDataConfigId, config.getId()).list();
+            List<CalculateVO> calculateVOS = BeanUtils.copyList(list, CalculateVO.class);
+            vo.setDtoList(calculateVOS);
+        }
+        return vo;
+    }
+
+    @Override
+    public void delete(Long id) {
+        TbBasicDataConfig config = this.getById(id);
+        if (Objects.isNull(config)) {
+            throw new ServiceException("非法参数");
+        }
+        this.removeById(id);
+    }
+
+    @Override
+    public PageDTO<BasicDataConfigVO> queryPage(BasicDataConfigQuery query) {
+        Page<Object> page = new Page<>(query.getPageNum(), query.getPageSize());
+        Page<BasicDataConfigVO> pageVO = this.queryPage(
+                new Page<>(query.getPageNum(), query.getPageSize()), query);
+        return PageDTO.of(pageVO);
+    }
+
+    @Override
+    public void showHide(ShowHideDTO dto) {
+        TbBasicDataConfig config = this.getById(dto.getId());
+        if (Objects.isNull(config)) {
+            throw new ServiceException("非法参数");
+        }
+        if (ShowStatusEnum.SHOW.equals(dto.getStatus())) {
+            //查询改配置所使用字段状态
+            String fieldIdStr = config.getFieldIdStr();
+            String[] split = fieldIdStr.split(",");
+            List<TbField> list = fieldMapper.selectList(
+                    Wrappers.<TbField>lambdaQuery().in(TbField::getId, Arrays.asList(split))
+                            .eq(TbField::getStatus, ShowStatusEnum.HIDE));
+            if (CollUtils.isNotEmpty(list)) {
+                String fieldNames = list.stream().map(TbField::getFieldName)
+                        .collect(Collectors.joining(","));
+                throw new ServiceException(
+                        String.format("字段“%s”已被隐藏,请重新配置后再次操作!", fieldNames));
+            }
+        }
+        this.lambdaUpdate().set(TbBasicDataConfig::getStatus, dto.getStatus())
+                .eq(TbBasicDataConfig::getId, dto.getId()).update();
+    }
+
+    @Override
+    public Page<ScoreCalculateVO> scoreCalculatePage(ScoreCalculateQuery query,
+            Page<ScoreCalculateVO> page) {
+        return baseMapper.scoreCalculatePage(query, page);
+    }
+
+    @Override
+    public Page<BasicDataConfigVO> queryPage(Page<BasicDataConfigVO> page,
+            BasicDataConfigQuery query) {
+        return baseMapper.queryPage(page, query);
+    }
 }

--
Gitblit v1.7.1