merge: validate new product survey steps three and four

main
chenyuan 3 weeks ago
commit 2ed7613f29

@ -8,8 +8,14 @@ import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationResult;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationResult;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService;
import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService;
import com.sztzjy.linkCommerce.util.ResultEntity;
import io.swagger.annotations.Api;
@ -33,6 +39,12 @@ public class StudentTrainingAnswerController {
@Autowired
private NewProductSurveyStepTwoService newProductSurveyStepTwoService;
@Autowired
private NewProductSurveyStepThreeService newProductSurveyStepThreeService;
@Autowired
private NewProductSurveyStepFourService newProductSurveyStepFourService;
@GetMapping("/{taskKey}")
@ApiOperation("查询当前学生指定实训任务答案")
public ResultEntity<StudentTrainingAnswer> detail(@PathVariable String taskKey,
@ -83,6 +95,30 @@ public class StudentTrainingAnswerController {
}
}
@PostMapping("/new-product-survey/step-3/validate")
@ApiOperation("新产品调查与分析第三步校验")
public ResultEntity<NewProductSurveyStepThreeValidationResult> validateNewProductSurveyStepThree(
@RequestBody NewProductSurveyStepThreeValidationRequest answer, HttpServletRequest request) {
try {
JwtUser user = TokenProvider.getJWTUser(request);
return new ResultEntity<>(HttpStatus.OK, "校验通过", newProductSurveyStepThreeService.validate(answer, user));
} catch (ServiceException e) {
return new ResultEntity<>(e.getCode(), e.getMessage());
}
}
@PostMapping("/new-product-survey/step-4/validate")
@ApiOperation("新产品调查与分析第四步校验")
public ResultEntity<NewProductSurveyStepFourValidationResult> validateNewProductSurveyStepFour(
@RequestBody NewProductSurveyStepFourValidationRequest answer, HttpServletRequest request) {
try {
JwtUser user = TokenProvider.getJWTUser(request);
return new ResultEntity<>(HttpStatus.OK, "校验通过", newProductSurveyStepFourService.validate(answer, user));
} catch (ServiceException e) {
return new ResultEntity<>(e.getCode(), e.getMessage());
}
}
@DeleteMapping("/{taskKey}")
@ApiOperation("删除当前学生指定实训任务答案")
public ResultEntity delete(@PathVariable String taskKey,

@ -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);
}
}

@ -7,8 +7,14 @@ import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationResult;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepFourValidationResult;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService;
import com.sztzjy.linkCommerce.util.ResultEntity;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpStatus;
@ -59,6 +65,40 @@ class StudentTrainingAnswerControllerTest {
verify(service).validate(any(NewProductSurveyStepTwoValidationRequest.class), any(JwtUser.class));
}
@Test
void validateStepThreeUsesTheAuthenticatedStudentAndReturnsTheValidationResult() {
StudentTrainingAnswerController controller = new StudentTrainingAnswerController();
NewProductSurveyStepThreeService service = mock(NewProductSurveyStepThreeService.class);
ReflectionTestUtils.setField(controller, "newProductSurveyStepThreeService", service);
NewProductSurveyStepThreeValidationResult validation = new NewProductSurveyStepThreeValidationResult();
validation.setValid(true);
when(service.validate(any(NewProductSurveyStepThreeValidationRequest.class), any(JwtUser.class))).thenReturn(validation);
NewProductSurveyStepThreeValidationRequest answer = new NewProductSurveyStepThreeValidationRequest();
ResultEntity<NewProductSurveyStepThreeValidationResult> result = controller.validateNewProductSurveyStepThree(answer, authenticatedStudentRequest());
assertEquals(HttpStatus.OK, result.getStatusCode());
assertEquals(validation, result.getBody().getData());
verify(service).validate(any(NewProductSurveyStepThreeValidationRequest.class), any(JwtUser.class));
}
@Test
void validateStepFourUsesTheAuthenticatedStudentAndReturnsTheValidationResult() {
StudentTrainingAnswerController controller = new StudentTrainingAnswerController();
NewProductSurveyStepFourService service = mock(NewProductSurveyStepFourService.class);
ReflectionTestUtils.setField(controller, "newProductSurveyStepFourService", service);
NewProductSurveyStepFourValidationResult validation = new NewProductSurveyStepFourValidationResult();
validation.setValid(true);
when(service.validate(any(NewProductSurveyStepFourValidationRequest.class), any(JwtUser.class))).thenReturn(validation);
NewProductSurveyStepFourValidationRequest answer = new NewProductSurveyStepFourValidationRequest();
ResultEntity<NewProductSurveyStepFourValidationResult> result = controller.validateNewProductSurveyStepFour(answer, authenticatedStudentRequest());
assertEquals(HttpStatus.OK, result.getStatusCode());
assertEquals(validation, result.getBody().getData());
verify(service).validate(any(NewProductSurveyStepFourValidationRequest.class), any(JwtUser.class));
}
private HttpServletRequest authenticatedStudentRequest() {
JwtUser user = new JwtUser();
user.setUserId("stu-1");

@ -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…
Cancel
Save