hejianhao
2026-08-28 f208fd1df2629384485df6c88aec08a275f7fd12
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
187
188
189
190
191
192
193
194
195
196
197
package com.tcm.training.admin.system.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.system.dto.PlatformQualificationPublishStatusRequest;
import com.tcm.training.admin.system.dto.PlatformQualificationSaveRequest;
import com.tcm.training.admin.system.entity.PlatformQualification;
import com.tcm.training.admin.system.mapper.PlatformQualificationMapper;
import com.tcm.training.admin.system.vo.PlatformQualificationDetailVO;
import com.tcm.training.admin.system.vo.PlatformQualificationListItemVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.ArrayList;
import java.util.List;
 
@Service
public class PlatformQualificationAppService {
 
    private final PlatformQualificationMapper platformQualificationMapper;
 
    public PlatformQualificationAppService(PlatformQualificationMapper platformQualificationMapper) {
        this.platformQualificationMapper = platformQualificationMapper;
    }
 
    public PageResponse<PlatformQualificationListItemVO> page(int page, int pageSize, String qualificationName) {
        LambdaQueryWrapper<PlatformQualification> queryWrapper = new LambdaQueryWrapper<PlatformQualification>()
                .eq(PlatformQualification::getDeleted, 0)
                .like(qualificationName != null && !qualificationName.trim().isEmpty(),
                        PlatformQualification::getQualificationName,
                        qualificationName == null ? null : qualificationName.trim())
                .orderByDesc(PlatformQualification::getCreatedAt)
                .orderByDesc(PlatformQualification::getId);
        IPage<PlatformQualification> result = platformQualificationMapper.selectPage(
                new Page<PlatformQualification>(page, pageSize),
                queryWrapper
        );
        List<PlatformQualificationListItemVO> list = new ArrayList<PlatformQualificationListItemVO>();
        for (PlatformQualification item : result.getRecords()) {
            list.add(toListItem(item));
        }
        return PageResponse.of(list, result.getTotal(), result.getCurrent(), result.getSize());
    }
 
    public PlatformQualificationDetailVO detail(Long id) {
        return toDetailVO(requireItem(id));
    }
 
    @Transactional
    public PlatformQualificationDetailVO create(PlatformQualificationSaveRequest request) {
        PlatformQualification item = new PlatformQualification();
        fillEntity(item, request);
        item.setDeleted(0);
        platformQualificationMapper.insert(item);
        return detail(item.getId());
    }
 
    @Transactional
    public PlatformQualificationDetailVO update(Long id, PlatformQualificationSaveRequest request) {
        PlatformQualification item = requireItem(id);
        fillEntity(item, request);
        platformQualificationMapper.updateById(item);
        return detail(id);
    }
 
    @Transactional
    public void delete(Long id) {
        requireItem(id);
        platformQualificationMapper.deleteById(id);
    }
 
    @Transactional
    public void patchPublishStatus(Long id, PlatformQualificationPublishStatusRequest request) {
        PlatformQualification item = requireItem(id);
        item.setPublishEnabled(booleanToInteger(request.getPublishEnabled()));
        platformQualificationMapper.updateById(item);
    }
 
    private void fillEntity(PlatformQualification item, PlatformQualificationSaveRequest request) {
        String qualificationType = normalizeQualificationType(request.getQualificationType());
        item.setQualificationName(normalizeRequired(request.getQualificationName(), "请输入资质名称"));
        item.setQualificationType(qualificationType);
        item.setRecordNumber(normalizeRequired(request.getRecordNumber(), "请输入备案号"));
        item.setSort(request.getSort());
        item.setPublishEnabled(booleanToInteger(request.getPublishEnabled()));
 
        if (PlatformQualification.TYPE_RICH_TEXT.equals(qualificationType)) {
            item.setContentHtml(normalizeContent(request.getContentHtml()));
            item.setLinkUrl(null);
            return;
        }
 
        item.setLinkUrl(normalizeRequired(request.getLinkUrl(), "请输入跳转链接"));
        item.setContentHtml(null);
    }
 
    private PlatformQualification requireItem(Long id) {
        PlatformQualification item = platformQualificationMapper.selectOne(new LambdaQueryWrapper<PlatformQualification>()
                .eq(PlatformQualification::getId, id)
                .eq(PlatformQualification::getDeleted, 0)
                .last("limit 1"));
        if (item == null) {
            throw new IllegalArgumentException("平台资质不存在");
        }
        return item;
    }
 
    private PlatformQualificationListItemVO toListItem(PlatformQualification item) {
        PlatformQualificationListItemVO vo = new PlatformQualificationListItemVO();
        vo.setId(item.getId());
        vo.setQualificationName(item.getQualificationName());
        vo.setQualificationType(item.getQualificationType());
        vo.setRecordNumber(item.getRecordNumber());
        vo.setSort(item.getSort());
        vo.setPublishEnabled(integerToBoolean(item.getPublishEnabled()));
        vo.setCreatedBy(item.getCreatedBy());
        vo.setCreatedAt(item.getCreatedAt());
        return vo;
    }
 
    private PlatformQualificationDetailVO toDetailVO(PlatformQualification item) {
        PlatformQualificationDetailVO vo = new PlatformQualificationDetailVO();
        vo.setId(item.getId());
        vo.setQualificationName(item.getQualificationName());
        vo.setQualificationType(item.getQualificationType());
        vo.setRecordNumber(item.getRecordNumber());
        vo.setContentHtml(item.getContentHtml());
        vo.setLinkUrl(item.getLinkUrl());
        vo.setSort(item.getSort());
        vo.setPublishEnabled(integerToBoolean(item.getPublishEnabled()));
        vo.setCreatedBy(item.getCreatedBy());
        vo.setUpdatedBy(item.getUpdatedBy());
        vo.setCreatedAt(item.getCreatedAt());
        vo.setUpdatedAt(item.getUpdatedAt());
        return vo;
    }
 
    private String normalizeQualificationType(String qualificationType) {
        String normalized = normalizeRequired(qualificationType, "请选择资质类型").toUpperCase();
        if (PlatformQualification.TYPE_RICH_TEXT.equals(normalized) || PlatformQualification.TYPE_LINK.equals(normalized)) {
            return normalized;
        }
        throw new IllegalArgumentException("资质类型不合法");
    }
 
    private String normalizeRequired(String value, String message) {
        String trimmed = trimToNull(value);
        if (trimmed == null) {
            throw new IllegalArgumentException(message);
        }
        return trimmed;
    }
 
    private String normalizeContent(String contentHtml) {
        String trimmed = trimToNull(contentHtml);
        if (trimmed == null || isBlankRichText(trimmed)) {
            throw new IllegalArgumentException("请输入资质内容");
        }
        return trimmed;
    }
 
    private boolean isBlankRichText(String html) {
        String normalized = html
                .replaceAll("(?i)<br\\s*/?>", "")
                .replaceAll("(?i)</p>", "")
                .replace("&nbsp;", "")
                .replace("&#160;", "")
                .replaceAll("<[^>]+>", "")
                .trim();
        if (!normalized.isEmpty()) {
            return false;
        }
        String lowerCaseHtml = html.toLowerCase();
        return !lowerCaseHtml.contains("<img")
                && !lowerCaseHtml.contains("<video")
                && !lowerCaseHtml.contains("<audio")
                && !lowerCaseHtml.contains("<iframe");
    }
 
    private Integer booleanToInteger(Boolean value) {
        return Boolean.TRUE.equals(value) ? 1 : 0;
    }
 
    private Boolean integerToBoolean(Integer value) {
        return value != null && value == 1;
    }
 
    private String trimToNull(String value) {
        if (value == null) {
            return null;
        }
        String trimmed = value.trim();
        return trimmed.isEmpty() ? null : trimmed;
    }
}