hejianhao
2026-08-19 4fa3099ff1d2fc02bbbfafcda7fded28f609f6ea
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
package com.tcm.training.admin.live.service;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tcm.training.admin.common.PageResponse;
import com.tcm.training.admin.live.dto.LiveCourseCategorySaveRequest;
import com.tcm.training.admin.live.entity.LiveCourseCategory;
import com.tcm.training.admin.live.mapper.LiveCourseCategoryMapper;
import com.tcm.training.admin.live.vo.LiveCourseCategoryDetailVO;
import com.tcm.training.admin.live.vo.LiveCourseCategoryItemVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.ArrayList;
import java.util.List;
 
@Service
public class LiveCourseCategoryAppService {
 
    public static final String TYPE_LEVEL = "LEVEL";
    public static final String TYPE_DIFFICULTY = "DIFFICULTY";
 
    private final LiveCourseCategoryMapper liveCourseCategoryMapper;
 
    public LiveCourseCategoryAppService(LiveCourseCategoryMapper liveCourseCategoryMapper) {
        this.liveCourseCategoryMapper = liveCourseCategoryMapper;
    }
 
    public PageResponse<LiveCourseCategoryItemVO> page(int page, int pageSize, String type) {
        String normalizedType = normalizeType(type);
        LambdaQueryWrapper<LiveCourseCategory> qw = new LambdaQueryWrapper<LiveCourseCategory>()
                .eq(LiveCourseCategory::getType, normalizedType)
                .orderByAsc(LiveCourseCategory::getSort)
                .orderByAsc(LiveCourseCategory::getId);
        IPage<LiveCourseCategory> p = liveCourseCategoryMapper.selectPage(new Page<LiveCourseCategory>(page, pageSize), qw);
        List<LiveCourseCategoryItemVO> list = new ArrayList<LiveCourseCategoryItemVO>();
        for (LiveCourseCategory item : p.getRecords()) {
            list.add(new LiveCourseCategoryItemVO(
                    item.getId(),
                    item.getType(),
                    item.getName(),
                    item.getSort(),
                    item.getCreatedAt()
            ));
        }
        return PageResponse.of(list, p.getTotal(), p.getCurrent(), p.getSize());
    }
 
    public LiveCourseCategoryDetailVO detail(Long id) {
        return toDetailVO(requireCategory(id));
    }
 
    @Transactional
    public LiveCourseCategoryDetailVO create(String type, LiveCourseCategorySaveRequest req) {
        String normalizedType = normalizeType(type);
        String name = normalizeName(req.getName());
        validateUniqueName(normalizedType, name, null);
 
        LiveCourseCategory entity = new LiveCourseCategory();
        entity.setType(normalizedType);
        entity.setName(name);
        entity.setSort(resolveSort(req.getSort()));
        entity.setDeleted(0);
        liveCourseCategoryMapper.insert(entity);
        return detail(entity.getId());
    }
 
    @Transactional
    public LiveCourseCategoryDetailVO update(Long id, LiveCourseCategorySaveRequest req) {
        LiveCourseCategory entity = requireCategory(id);
        String name = normalizeName(req.getName());
        validateUniqueName(entity.getType(), name, id);
 
        entity.setName(name);
        entity.setSort(resolveSort(req.getSort()));
        liveCourseCategoryMapper.updateById(entity);
        return detail(id);
    }
 
    @Transactional
    public void delete(Long id) {
        requireCategory(id);
        liveCourseCategoryMapper.deleteById(id);
    }
 
    private LiveCourseCategory requireCategory(Long id) {
        LiveCourseCategory entity = liveCourseCategoryMapper.selectOne(new LambdaQueryWrapper<LiveCourseCategory>()
                .eq(LiveCourseCategory::getId, id)
                .eq(LiveCourseCategory::getDeleted, 0)
                .last("limit 1"));
        if (entity == null) {
            throw new IllegalArgumentException("分类不存在");
        }
        return entity;
    }
 
    private void validateUniqueName(String type, String name, Long excludeId) {
        LambdaQueryWrapper<LiveCourseCategory> qw = new LambdaQueryWrapper<LiveCourseCategory>()
                .eq(LiveCourseCategory::getType, type)
                .eq(LiveCourseCategory::getName, name)
                .eq(LiveCourseCategory::getDeleted, 0);
        if (excludeId != null) {
            qw.ne(LiveCourseCategory::getId, excludeId);
        }
        Long count = liveCourseCategoryMapper.selectCount(qw);
        if (count != null && count > 0) {
            throw new IllegalArgumentException(resolveLabel(type) + "名称已存在");
        }
    }
 
    private String normalizeType(String type) {
        if (type == null) {
            throw new IllegalArgumentException("分类类型不能为空");
        }
        String normalized = type.trim().toUpperCase();
        if (!TYPE_LEVEL.equals(normalized) && !TYPE_DIFFICULTY.equals(normalized)) {
            throw new IllegalArgumentException("分类类型不合法");
        }
        return normalized;
    }
 
    private String normalizeName(String name) {
        String normalized = name == null ? "" : name.trim();
        if (normalized.isEmpty()) {
            throw new IllegalArgumentException("请输入分类名称");
        }
        return normalized;
    }
 
    private Integer resolveSort(Integer sort) {
        return sort == null ? 0 : sort;
    }
 
    private String resolveLabel(String type) {
        return TYPE_LEVEL.equals(type) ? "养生主题" : "难度";
    }
 
    private LiveCourseCategoryDetailVO toDetailVO(LiveCourseCategory entity) {
        LiveCourseCategoryDetailVO vo = new LiveCourseCategoryDetailVO();
        vo.setId(entity.getId());
        vo.setType(entity.getType());
        vo.setName(entity.getName());
        vo.setSort(entity.getSort());
        vo.setCreatedAt(entity.getCreatedAt());
        vo.setUpdatedAt(entity.getUpdatedAt());
        return vo;
    }
}