mitao
2024-04-07 5980a5fed8092f9866cb2f6a8b74abb7d631c018
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package com.ruoyi.system.service.impl;
 
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.exception.ServiceException;
import com.ruoyi.common.utils.BeanUtils;
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.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.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 lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 基础数据配置表 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2024-03-18
 */
@Service
@RequiredArgsConstructor
public class TbBasicDataConfigServiceImpl extends ServiceImpl<TbBasicDataConfigMapper, TbBasicDataConfig> implements TbBasicDataConfigService {
 
    private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
    private final TbFieldMapper fieldMapper;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add(BasicDataConfigDTO dto) {
        TbBasicDataConfig tbBasicDataConfig = BeanUtils.copyBean(dto, TbBasicDataConfig.class);
        //参数校验
        CalculateTypeEnum calculateType = tbBasicDataConfig.getCalculateType();
        List<CalculateDTO> dtoList = dto.getDtoList();
        if (CalculateTypeEnum.NUMBER.equals(calculateType) && StringUtils.isBlank(dto.getNumberCalculateFormula())) {
            throw new ServiceException("计算公式不能为空");
        }
        boolean verify = (CalculateTypeEnum.TEXT.equals(calculateType) || CalculateTypeEnum.PERCENTAGE.equals(calculateType)) && CollUtils.isNotEmpty(dtoList);
        if (verify) {
            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不能为空");
                    }
                }
            });
        } else {
            throw new ServiceException("计算公式不能为空");
        }
        this.save(tbBasicDataConfig);
        if (verify) {
            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);
        }
    }
 
    @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) && StringUtils.isBlank(dto.getNumberCalculateFormula())) {
            throw new ServiceException("计算公式不能为空");
        }
        boolean verify = CalculateTypeEnum.TEXT.equals(calculateType) || CalculateTypeEnum.PERCENTAGE.equals(calculateType);
        if (verify && CollUtils.isEmpty(dtoList)) {
            throw new ServiceException("计算公式不能为空");
        }
        this.updateById(tbBasicDataConfig);
        if (verify) {
            //删除原来的配置信息,重新添加新的
            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);
        }
    }
 
    @Override
    public BasicDataConfigDetailVO getDetails(Integer id) {
        TbBasicDataConfig config = this.getById(id);
        if (Objects.isNull(config)) {
            throw new ServiceException("非法参数");
        }
        BasicDataConfigDetailVO vo = BeanUtils.copyBean(config, BasicDataConfigDetailVO.class);
        Integer code = vo.getCalculateType().getCode();
        if ((CalculateTypeEnum.TEXT.getCode().equals(code) || CalculateTypeEnum.PERCENTAGE.getCode().equals(code))) {
            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(Integer id) {
        TbBasicDataConfig config = this.getById(id);
        if (Objects.isNull(config)) {
            throw new ServiceException("非法参数");
        }
        this.removeById(id);
    }
 
    @Override
    public PageDTO<BasicDataConfigVO> queryPage(BasicDataConfigQuery query) {
        Page<TbBasicDataConfig> page = this.lambdaQuery()
                .like(StringUtils.isNotBlank(query.getBasicDataConfigName()), TbBasicDataConfig::getTypeName, query.getBasicDataConfigName())
                .eq(Objects.nonNull(query.getCalculateType()), TbBasicDataConfig::getCalculateType, query.getCalculateType())
                .eq(Objects.nonNull(query.getStatus()), TbBasicDataConfig::getStatus, query.getStatus()).page(new Page<>(query.getPageNum(), query.getPageSize()));
        return PageDTO.of(page, BasicDataConfigVO.class);
    }
 
    @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();
    }
}