lrj
2 天以前 c61d4fe27c97d2ecc907756aa571a4ef14a7b9b6
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
package com.rongyichuang.rating.service;
 
import com.rongyichuang.common.dto.PageRequest;
import com.rongyichuang.common.dto.PageResponse;
import com.rongyichuang.common.exception.BusinessException;
import com.rongyichuang.rating.dto.request.RatingItemInput;
import com.rongyichuang.rating.dto.request.RatingSchemeInput;
import com.rongyichuang.rating.dto.response.RatingSchemeResponse;
import com.rongyichuang.rating.entity.RatingItem;
import com.rongyichuang.rating.entity.RatingScheme;
import com.rongyichuang.rating.repository.RatingItemRepository;
import com.rongyichuang.rating.repository.RatingSchemeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
 
/**
 * 评分模板服务层
 */
@Service
public class RatingSchemeService {
 
    @Autowired
    private RatingSchemeRepository ratingSchemeRepository;
 
    @Autowired
    private RatingItemRepository ratingItemRepository;
 
    /**
     * 分页查询评分模板列表
     */
    public PageResponse<RatingSchemeResponse> getSchemeList(PageRequest pageRequest, String name) {
        Pageable pageable = pageRequest.toPageable();
        Page<RatingScheme> page;
        
        if (StringUtils.hasText(name)) {
            page = ratingSchemeRepository.findByNameContaining(name, pageable);
        } else {
            page = ratingSchemeRepository.findAll(pageable);
        }
        
        List<RatingSchemeResponse> content = page.getContent().stream()
                .map(RatingSchemeResponse::new)
                .collect(Collectors.toList());
        
        return new PageResponse<>(content, page.getTotalElements(), page.getNumber(), page.getSize());
    }
 
    /**
     * 根据ID获取评分模板详情
     */
    public RatingSchemeResponse getSchemeById(Long id) {
        Optional<RatingScheme> optional = ratingSchemeRepository.findById(id);
        if (optional.isEmpty()) {
            throw new BusinessException("评分模板不存在");
        }
        return new RatingSchemeResponse(optional.get());
    }
 
    /**
     * 保存评分模板(新增或修改)
     */
    @Transactional
    public RatingSchemeResponse saveScheme(RatingSchemeInput input) {
        RatingScheme scheme;
        
        if (input.getId() == null) {
            // 新增
            scheme = new RatingScheme();
        } else {
            // 修改
            Optional<RatingScheme> optional = ratingSchemeRepository.findById(input.getId());
            if (optional.isEmpty()) {
                throw new BusinessException("评分模板不存在");
            }
            scheme = optional.get();
        }
        
        // 设置基本信息
        scheme.setName(input.getName());
        scheme.setDescription(input.getDescription());
        
        // 保存模板
        scheme = ratingSchemeRepository.save(scheme);
        
        // 处理评分条目
        if (input.getItems() != null) {
            saveRatingItems(scheme, input.getItems());
        }
        
        return new RatingSchemeResponse(scheme);
    }
 
    /**
     * 删除评分模板
     */
    @Transactional
    public boolean deleteScheme(Long id) {
        Optional<RatingScheme> optional = ratingSchemeRepository.findById(id);
        if (optional.isEmpty()) {
            throw new BusinessException("评分模板不存在");
        }
        
        // 检查是否被比赛使用
        if (ratingSchemeRepository.isUsedByActivity(id)) {
            throw new BusinessException("该评分模板已被比赛使用,无法删除");
        }
        
        RatingScheme scheme = optional.get();
        scheme.setState(0); // 逻辑删除
        ratingSchemeRepository.save(scheme);
        
        return true;
    }
 
    /**
     * 保存评分条目
     */
    private void saveRatingItems(RatingScheme scheme, List<RatingItemInput> itemInputs) {
        // 获取现有条目
        List<RatingItem> existingItems = ratingItemRepository.findBySchemeIdOrderByOrderNo(scheme.getId());
        
        // 处理新的条目列表
        List<RatingItem> newItems = new ArrayList<>();
        
        for (int i = 0; i < itemInputs.size(); i++) {
            RatingItemInput itemInput = itemInputs.get(i);
            RatingItem item;
            
            if (itemInput.getId() == null) {
                // 新增条目
                item = new RatingItem();
                item.setScheme(scheme);
            } else {
                // 修改条目
                item = existingItems.stream()
                        .filter(existing -> existing.getId().equals(itemInput.getId()))
                        .findFirst()
                        .orElse(new RatingItem());
                if (item.getScheme() == null) {
                    item.setScheme(scheme);
                }
            }
            
            item.setName(itemInput.getName());
            item.setMaxScore(itemInput.getMaxScore());
            item.setOrderNo(itemInput.getOrderNo() != null ? itemInput.getOrderNo() : i + 1);
            
            newItems.add(item);
        }
        
        // 删除不在新列表中的条目
        List<Long> newItemIds = newItems.stream()
                .map(RatingItem::getId)
                .filter(id -> id != null)
                .collect(Collectors.toList());
        
        for (RatingItem existingItem : existingItems) {
            if (!newItemIds.contains(existingItem.getId())) {
                existingItem.setState(0); // 逻辑删除
                ratingItemRepository.save(existingItem);
            }
        }
        
        // 保存新的条目列表
        ratingItemRepository.saveAll(newItems);
    }
 
    /**
     * 获取所有评分模板(用于下拉选择)
     */
    public List<RatingSchemeResponse> getAllSchemes() {
        List<RatingScheme> schemes = ratingSchemeRepository.findAll();
        return schemes.stream()
                .map(RatingSchemeResponse::new)
                .collect(Collectors.toList());
    }
}