package com.sztzjy.linkCommerce.service.impl; import com.sztzjy.linkCommerce.config.exception.handler.ServiceException; import com.sztzjy.linkCommerce.config.security.JwtUser; import com.sztzjy.linkCommerce.entity.StudentTrainingAnswer; import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepFiveValidationRequest; import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepFiveValidationResult; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.service.TargetUserProfileStepFiveService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; @Service public class TargetUserProfileStepFiveServiceImpl implements TargetUserProfileStepFiveService { private static final String TASK_KEY = "target-user-profile"; private static final int MAX_SEGMENTS = 6; private static final Set ATTRACTIVENESS_OPTIONS = new LinkedHashSet<>(Arrays.asList("高", "中", "低")); @Autowired private StudentTrainingAnswerService studentTrainingAnswerService; @Override public TargetUserProfileStepFiveValidationResult validate(TargetUserProfileStepFiveValidationRequest request, JwtUser user) { if (user == null || StringUtils.isBlank(user.getUserId())) { throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再校验"); } if (user.getRoleId() != 4) { throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可进行实训校验"); } StudentTrainingAnswer savedAnswer = studentTrainingAnswerService.get(TASK_KEY, null, user); String savedContent = savedAnswer == null ? "" : savedAnswer.getStep1Answer(); if (StringUtils.isBlank(savedContent) || !StringUtils.contains(savedContent, "keyUserRecords") || !StringUtils.contains(savedContent, "U01") || !StringUtils.contains(savedContent, "U02") || !StringUtils.contains(savedContent, "U03")) { throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存第 4 步重点用户画像"); } if (request == null || request.getSegments() == null || request.getSegments().isEmpty() || request.getSegments().size() > MAX_SEGMENTS) { throw new ServiceException(HttpStatus.BAD_REQUEST, "请完成细分市场分析表,最多可填写 6 行"); } for (TargetUserProfileStepFiveValidationRequest.MarketSegment segment : request.getSegments()) { if (segment == null || StringUtils.isBlank(segment.getMarket()) || !ATTRACTIVENESS_OPTIONS.contains(StringUtils.trim(segment.getAttractiveness())) || StringUtils.isBlank(segment.getPainPoints()) || StringUtils.isBlank(segment.getBehaviorCharacteristics()) || StringUtils.isBlank(segment.getProductOpportunity())) { throw new ServiceException(HttpStatus.BAD_REQUEST, "请完整填写每个细分市场的吸引力、需求痛点、行为特征和产品机会"); } } if (StringUtils.isBlank(request.getMarketSelection())) { throw new ServiceException(HttpStatus.BAD_REQUEST, "请完成市场选择结论"); } TargetUserProfileStepFiveValidationResult result = new TargetUserProfileStepFiveValidationResult(); result.setValid(true); result.setMessage("校验通过"); return result; } }