You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
3.5 KiB
Java
61 lines
3.5 KiB
Java
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<String> 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;
|
|
}
|
|
}
|