package com.tcm.training.admin.system.service; 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.member.entity.AppUser; import com.tcm.training.admin.member.mapper.UserMapper; import com.tcm.training.admin.system.dto.UserFeedbackSubmitRequest; import com.tcm.training.admin.system.entity.UserFeedback; import com.tcm.training.admin.system.mapper.UserFeedbackMapper; import com.tcm.training.admin.system.mapper.UserFeedbackQueryMapper; import com.tcm.training.admin.system.vo.UserFeedbackListItemVO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.regex.Pattern; @Service public class UserFeedbackAppService { private static final Pattern PHONE_PATTERN = Pattern.compile("^1\\d{10}$"); private static final Pattern EMAIL_PATTERN = Pattern.compile("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"); private final UserFeedbackMapper userFeedbackMapper; private final UserFeedbackQueryMapper userFeedbackQueryMapper; private final UserMapper userMapper; public UserFeedbackAppService(UserFeedbackMapper userFeedbackMapper, UserFeedbackQueryMapper userFeedbackQueryMapper, UserMapper userMapper) { this.userFeedbackMapper = userFeedbackMapper; this.userFeedbackQueryMapper = userFeedbackQueryMapper; this.userMapper = userMapper; } public PageResponse page(int page, int pageSize, String content) { IPage result = userFeedbackQueryMapper.selectUserFeedbackPage( new Page(page, pageSize), trimToNull(content) ); return PageResponse.of(result.getRecords(), result.getTotal(), result.getCurrent(), result.getSize()); } @Transactional public void submit(Long appUserId, UserFeedbackSubmitRequest request) { requireAppUser(appUserId); UserFeedback item = new UserFeedback(); item.setAppUserId(appUserId); item.setContent(normalizeContent(request.getContent())); item.setContact(normalizeContact(request.getContact())); item.setDeleted(0); userFeedbackMapper.insert(item); } private void requireAppUser(Long appUserId) { AppUser user = userMapper.selectById(appUserId); if (user == null || (user.getDeleted() != null && user.getDeleted() == 1)) { throw new IllegalArgumentException("用户不存在"); } } private String normalizeContent(String content) { String trimmed = trimToNull(content); if (trimmed == null) { throw new IllegalArgumentException("请输入问题和意见"); } return trimmed; } private String normalizeContact(String contact) { String trimmed = trimToNull(contact); if (trimmed == null) { return null; } if (!PHONE_PATTERN.matcher(trimmed).matches() && !EMAIL_PATTERN.matcher(trimmed).matches()) { throw new IllegalArgumentException("请输入正确的手机号或邮箱"); } return trimmed; } private String trimToNull(String value) { if (value == null) { return null; } String trimmed = value.trim(); return trimmed.isEmpty() ? null : trimmed; } }