feat: validate new product survey step three
parent
ab625e616f
commit
302410be98
@ -0,0 +1,20 @@
|
||||
package com.sztzjy.linkCommerce.entity.dto;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class NewProductSurveyStepThreeValidationRequest {
|
||||
private List<Row> rows;
|
||||
|
||||
public List<Row> getRows() { return rows; }
|
||||
public void setRows(List<Row> rows) { this.rows = rows; }
|
||||
|
||||
public static class Row {
|
||||
private String dimension;
|
||||
private List<String> points;
|
||||
|
||||
public String getDimension() { return dimension; }
|
||||
public void setDimension(String dimension) { this.dimension = dimension; }
|
||||
public List<String> getPoints() { return points; }
|
||||
public void setPoints(List<String> points) { this.points = points; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package com.sztzjy.linkCommerce.entity.dto;
|
||||
|
||||
public class NewProductSurveyStepThreeValidationResult {
|
||||
private boolean valid;
|
||||
private String message;
|
||||
|
||||
public boolean isValid() { return valid; }
|
||||
public void setValid(boolean valid) { this.valid = valid; }
|
||||
public String getMessage() { return message; }
|
||||
public void setMessage(String message) { this.message = message; }
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
package com.sztzjy.linkCommerce.service;
|
||||
|
||||
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationResult;
|
||||
|
||||
public interface NewProductSurveyStepThreeService {
|
||||
NewProductSurveyStepThreeValidationResult validate(NewProductSurveyStepThreeValidationRequest request, JwtUser user);
|
||||
}
|
||||
@ -0,0 +1,63 @@
|
||||
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.dto.NewProductSurveyStepThreeValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationResult;
|
||||
import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class NewProductSurveyStepThreeServiceImpl implements NewProductSurveyStepThreeService {
|
||||
private static final Set<String> DIMENSIONS = new LinkedHashSet<>(Arrays.asList("核心层", "有形层", "延伸层"));
|
||||
|
||||
@Override
|
||||
public NewProductSurveyStepThreeValidationResult validate(NewProductSurveyStepThreeValidationRequest request, JwtUser user) {
|
||||
requireStudent(user);
|
||||
if (request == null || request.getRows() == null || request.getRows().size() != DIMENSIONS.size()) {
|
||||
throw badRequest("请完成核心层、有形层和延伸层分析");
|
||||
}
|
||||
Set<String> submittedDimensions = new LinkedHashSet<>();
|
||||
for (NewProductSurveyStepThreeValidationRequest.Row row : request.getRows()) {
|
||||
String dimension = row == null ? "" : StringUtils.trimToEmpty(row.getDimension());
|
||||
if (!DIMENSIONS.contains(dimension) || !submittedDimensions.add(dimension)) {
|
||||
throw badRequest("提交的分析维度不完整或重复");
|
||||
}
|
||||
List<String> points = row.getPoints() == null ? Arrays.asList() : row.getPoints().stream()
|
||||
.filter(StringUtils::isNotBlank)
|
||||
.map(StringUtils::trim)
|
||||
.collect(Collectors.toList());
|
||||
if (points.size() < 2) {
|
||||
throw badRequest(dimension + "至少填写 2 条分析要点");
|
||||
}
|
||||
}
|
||||
if (!submittedDimensions.equals(DIMENSIONS)) {
|
||||
throw badRequest("请完成核心层、有形层和延伸层分析");
|
||||
}
|
||||
NewProductSurveyStepThreeValidationResult result = new NewProductSurveyStepThreeValidationResult();
|
||||
result.setValid(true);
|
||||
result.setMessage("校验通过");
|
||||
return result;
|
||||
}
|
||||
|
||||
private void requireStudent(JwtUser user) {
|
||||
if (user == null || StringUtils.isBlank(user.getUserId())) {
|
||||
throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再提交");
|
||||
}
|
||||
if (user.getRoleId() != 4) {
|
||||
throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可提交实训答案");
|
||||
}
|
||||
}
|
||||
|
||||
private ServiceException badRequest(String message) {
|
||||
return new ServiceException(HttpStatus.BAD_REQUEST, message);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
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.dto.NewProductSurveyStepThreeValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class NewProductSurveyStepThreeServiceImplTest {
|
||||
|
||||
@Test
|
||||
void validatesThreeDimensionsWithTwoPointsEach() {
|
||||
NewProductSurveyStepThreeServiceImpl service = new NewProductSurveyStepThreeServiceImpl();
|
||||
|
||||
NewProductSurveyStepThreeValidationResult result = service.validate(completeRequest(), student());
|
||||
|
||||
assertTrue(result.isValid());
|
||||
}
|
||||
|
||||
@Test
|
||||
void rejectsAOnePointRowDuplicateDimensionAndNonStudent() {
|
||||
NewProductSurveyStepThreeServiceImpl service = new NewProductSurveyStepThreeServiceImpl();
|
||||
|
||||
assertThrows(ServiceException.class, () -> service.validate(request(
|
||||
row("核心层", "仅一条"), tangible(), extended()), student()));
|
||||
assertThrows(ServiceException.class, () -> service.validate(request(
|
||||
core(), core(), extended()), student()));
|
||||
assertThrows(ServiceException.class, () -> service.validate(completeRequest(), teacher()));
|
||||
}
|
||||
|
||||
private NewProductSurveyStepThreeValidationRequest completeRequest() {
|
||||
return request(core(), tangible(), extended());
|
||||
}
|
||||
|
||||
private NewProductSurveyStepThreeValidationRequest request(NewProductSurveyStepThreeValidationRequest.Row... rows) {
|
||||
NewProductSurveyStepThreeValidationRequest request = new NewProductSurveyStepThreeValidationRequest();
|
||||
request.setRows(Arrays.asList(rows));
|
||||
return request;
|
||||
}
|
||||
|
||||
private NewProductSurveyStepThreeValidationRequest.Row core() {
|
||||
return row("核心层", "AI 作业批改", "自适应学习路径");
|
||||
}
|
||||
|
||||
private NewProductSurveyStepThreeValidationRequest.Row tangible() {
|
||||
return row("有形层", "护眼屏幕", "NPU 芯片");
|
||||
}
|
||||
|
||||
private NewProductSurveyStepThreeValidationRequest.Row extended() {
|
||||
return row("延伸层", "题库持续更新", "家长社群服务");
|
||||
}
|
||||
|
||||
private NewProductSurveyStepThreeValidationRequest.Row row(String dimension, String... points) {
|
||||
NewProductSurveyStepThreeValidationRequest.Row row = new NewProductSurveyStepThreeValidationRequest.Row();
|
||||
row.setDimension(dimension);
|
||||
row.setPoints(Arrays.asList(points));
|
||||
return row;
|
||||
}
|
||||
|
||||
private JwtUser student() {
|
||||
JwtUser user = new JwtUser();
|
||||
user.setUserId("stu-1");
|
||||
user.setRoleId(4);
|
||||
return user;
|
||||
}
|
||||
|
||||
private JwtUser teacher() {
|
||||
JwtUser user = student();
|
||||
user.setRoleId(3);
|
||||
return user;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue