package com.tcm.training.admin.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tcm.training.admin.system.dto.AgreementContentSaveRequest;
import com.tcm.training.admin.system.entity.AgreementContent;
import com.tcm.training.admin.system.mapper.AgreementContentMapper;
import com.tcm.training.admin.system.vo.AgreementContentItemVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@Service
public class AgreementContentAppService {
private static final String[] AGREEMENT_TYPES = new String[]{
AgreementContent.TYPE_USER_AGREEMENT,
AgreementContent.TYPE_PRIVACY_POLICY,
AgreementContent.TYPE_INVITE_CODE_INSTRUCTIONS
};
private final AgreementContentMapper agreementContentMapper;
public AgreementContentAppService(AgreementContentMapper agreementContentMapper) {
this.agreementContentMapper = agreementContentMapper;
}
public List list() {
List records = agreementContentMapper.selectList(new LambdaQueryWrapper()
.eq(AgreementContent::getDeleted, 0));
List result = new ArrayList();
for (String agreementType : AGREEMENT_TYPES) {
result.add(toItemVO(agreementType, findByType(records, agreementType)));
}
return result;
}
/**
* 按协议类型读取单条协议内容,供 APP 协议详情页使用。
*/
public AgreementContentItemVO detail(String agreementType) {
String normalizedType = normalizeAgreementType(agreementType);
AgreementContent record = agreementContentMapper.selectOne(new LambdaQueryWrapper()
.eq(AgreementContent::getAgreementType, normalizedType)
.eq(AgreementContent::getDeleted, 0)
.last("limit 1"));
return toItemVO(normalizedType, record);
}
@Transactional
public AgreementContentItemVO save(String agreementType, AgreementContentSaveRequest request) {
String normalizedType = normalizeAgreementType(agreementType);
String contentHtml = normalizeContent(request == null ? null : request.getContentHtml());
AgreementContent record = agreementContentMapper.selectOne(new LambdaQueryWrapper()
.eq(AgreementContent::getAgreementType, normalizedType)
.eq(AgreementContent::getDeleted, 0)
.last("limit 1"));
if (record == null) {
record = new AgreementContent();
record.setAgreementType(normalizedType);
record.setContentHtml(contentHtml);
record.setDeleted(0);
agreementContentMapper.insert(record);
} else {
record.setContentHtml(contentHtml);
agreementContentMapper.updateById(record);
}
return toItemVO(normalizedType, record);
}
private AgreementContent findByType(List records, String agreementType) {
for (AgreementContent record : records) {
if (agreementType.equals(record.getAgreementType())) {
return record;
}
}
return null;
}
private AgreementContentItemVO toItemVO(String agreementType, AgreementContent record) {
AgreementContentItemVO vo = new AgreementContentItemVO();
vo.setAgreementType(agreementType);
vo.setAgreementName(resolveAgreementName(agreementType));
vo.setContentHtml(record == null || record.getContentHtml() == null ? "" : record.getContentHtml());
return vo;
}
private String normalizeAgreementType(String agreementType) {
String normalized = trimToNull(agreementType);
if (normalized == null) {
throw new IllegalArgumentException("协议类型不合法");
}
normalized = normalized.toUpperCase();
for (String item : AGREEMENT_TYPES) {
if (item.equals(normalized)) {
return normalized;
}
}
throw new IllegalArgumentException("协议类型不合法");
}
private String resolveAgreementName(String agreementType) {
if (AgreementContent.TYPE_USER_AGREEMENT.equals(agreementType)) {
return "用户协议";
}
if (AgreementContent.TYPE_PRIVACY_POLICY.equals(agreementType)) {
return "隐私协议";
}
if (AgreementContent.TYPE_INVITE_CODE_INSTRUCTIONS.equals(agreementType)) {
return "获取邀请码说明";
}
throw new IllegalArgumentException("协议类型不合法");
}
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)
", "")
.replaceAll("(?i)
", "")
.replace(" ", "")
.replace(" ", "")
.replaceAll("<[^>]+>", "")
.trim();
if (!normalized.isEmpty()) {
return false;
}
String lowerCaseHtml = html.toLowerCase();
return !lowerCaseHtml.contains("![]()