merge: validate new product survey steps three and four
commit
2ed7613f29
@ -0,0 +1,14 @@
|
||||
package com.sztzjy.linkCommerce.entity.dto;
|
||||
|
||||
public class NewProductSurveyStepFourValidationRequest {
|
||||
private String coreValue;
|
||||
private String tangibleValue;
|
||||
private String extendedValue;
|
||||
|
||||
public String getCoreValue() { return coreValue; }
|
||||
public void setCoreValue(String coreValue) { this.coreValue = coreValue; }
|
||||
public String getTangibleValue() { return tangibleValue; }
|
||||
public void setTangibleValue(String tangibleValue) { this.tangibleValue = tangibleValue; }
|
||||
public String getExtendedValue() { return extendedValue; }
|
||||
public void setExtendedValue(String extendedValue) { this.extendedValue = extendedValue; }
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package com.sztzjy.linkCommerce.entity.dto;
|
||||
|
||||
public class NewProductSurveyStepFourValidationResult {
|
||||
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,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.NewProductSurveyStepFourValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationResult;
|
||||
|
||||
public interface NewProductSurveyStepFourService {
|
||||
NewProductSurveyStepFourValidationResult validate(NewProductSurveyStepFourValidationRequest request, JwtUser user);
|
||||
}
|
||||
@ -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,48 @@
|
||||
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.NewProductSurveyStepFourValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationResult;
|
||||
import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class NewProductSurveyStepFourServiceImpl implements NewProductSurveyStepFourService {
|
||||
@Override
|
||||
public NewProductSurveyStepFourValidationResult validate(NewProductSurveyStepFourValidationRequest request, JwtUser user) {
|
||||
requireStudent(user);
|
||||
if (request == null) {
|
||||
throw badRequest("请完成三层次AI应用价值分析");
|
||||
}
|
||||
requireNonBlank(request.getCoreValue(), "请填写核心层AI应用价值分析");
|
||||
requireNonBlank(request.getTangibleValue(), "请填写有形层AI应用价值分析");
|
||||
requireNonBlank(request.getExtendedValue(), "请填写延伸层AI应用价值分析");
|
||||
|
||||
NewProductSurveyStepFourValidationResult result = new NewProductSurveyStepFourValidationResult();
|
||||
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 void requireNonBlank(String value, String message) {
|
||||
if (StringUtils.isBlank(value)) {
|
||||
throw badRequest(message);
|
||||
}
|
||||
}
|
||||
|
||||
private ServiceException badRequest(String message) {
|
||||
return new ServiceException(HttpStatus.BAD_REQUEST, message);
|
||||
}
|
||||
}
|
||||
@ -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,59 @@
|
||||
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.NewProductSurveyStepFourValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class NewProductSurveyStepFourServiceImplTest {
|
||||
|
||||
@Test
|
||||
void acceptsStudentWithAllThreeNonBlankValues() {
|
||||
NewProductSurveyStepFourServiceImpl service = new NewProductSurveyStepFourServiceImpl();
|
||||
|
||||
NewProductSurveyStepFourValidationResult result = service.validate(request("核心分析", "有形分析", "延伸分析"), student());
|
||||
|
||||
assertTrue(result.isValid());
|
||||
}
|
||||
|
||||
@Test
|
||||
void rejectsBlankValuesForEachLayer() {
|
||||
NewProductSurveyStepFourServiceImpl service = new NewProductSurveyStepFourServiceImpl();
|
||||
|
||||
assertThrows(ServiceException.class, () -> service.validate(request(" ", "有形分析", "延伸分析"), student()));
|
||||
assertThrows(ServiceException.class, () -> service.validate(request("核心分析", "\t", "延伸分析"), student()));
|
||||
assertThrows(ServiceException.class, () -> service.validate(request("核心分析", "有形分析", ""), student()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void rejectsNonStudent() {
|
||||
NewProductSurveyStepFourServiceImpl service = new NewProductSurveyStepFourServiceImpl();
|
||||
|
||||
assertThrows(ServiceException.class, () -> service.validate(request("核心分析", "有形分析", "延伸分析"), teacher()));
|
||||
}
|
||||
|
||||
private NewProductSurveyStepFourValidationRequest request(String coreValue, String tangibleValue, String extendedValue) {
|
||||
NewProductSurveyStepFourValidationRequest request = new NewProductSurveyStepFourValidationRequest();
|
||||
request.setCoreValue(coreValue);
|
||||
request.setTangibleValue(tangibleValue);
|
||||
request.setExtendedValue(extendedValue);
|
||||
return request;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -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