feat: validate new product survey step two

main
chenyuan 3 weeks ago
parent 956c07b8df
commit 4994409ccd

@ -6,7 +6,10 @@ import com.sztzjy.linkCommerce.config.security.TokenProvider;
import com.sztzjy.linkCommerce.entity.StudentTrainingAnswer;
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.service.NewProductSurveyStepOneService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService;
import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService;
import com.sztzjy.linkCommerce.util.ResultEntity;
import io.swagger.annotations.Api;
@ -27,6 +30,9 @@ public class StudentTrainingAnswerController {
@Autowired
private NewProductSurveyStepOneService newProductSurveyStepOneService;
@Autowired
private NewProductSurveyStepTwoService newProductSurveyStepTwoService;
@GetMapping("/{taskKey}")
@ApiOperation("查询当前学生指定实训任务答案")
public ResultEntity<StudentTrainingAnswer> detail(@PathVariable String taskKey,
@ -65,6 +71,18 @@ public class StudentTrainingAnswerController {
}
}
@PostMapping("/new-product-survey/step-2/validate")
@ApiOperation("新产品调查与分析第二步校验")
public ResultEntity<NewProductSurveyStepTwoValidationResult> validateNewProductSurveyStepTwo(
@RequestBody NewProductSurveyStepTwoValidationRequest answer, HttpServletRequest request) {
try {
JwtUser user = TokenProvider.getJWTUser(request);
return new ResultEntity<>(HttpStatus.OK, "校验通过", newProductSurveyStepTwoService.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,25 @@
package com.sztzjy.linkCommerce.entity.dto;
import java.util.List;
public class NewProductSurveyStepTwoValidationRequest {
private String platform;
private String scene;
private String customScene;
private String keyword;
private String productName;
private List<String> imageUrls;
public String getPlatform() { return platform; }
public void setPlatform(String platform) { this.platform = platform; }
public String getScene() { return scene; }
public void setScene(String scene) { this.scene = scene; }
public String getCustomScene() { return customScene; }
public void setCustomScene(String customScene) { this.customScene = customScene; }
public String getKeyword() { return keyword; }
public void setKeyword(String keyword) { this.keyword = keyword; }
public String getProductName() { return productName; }
public void setProductName(String productName) { this.productName = productName; }
public List<String> getImageUrls() { return imageUrls; }
public void setImageUrls(List<String> imageUrls) { this.imageUrls = imageUrls; }
}

@ -0,0 +1,11 @@
package com.sztzjy.linkCommerce.entity.dto;
public class NewProductSurveyStepTwoValidationResult {
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.NewProductSurveyStepTwoValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult;
public interface NewProductSurveyStepTwoService {
NewProductSurveyStepTwoValidationResult validate(NewProductSurveyStepTwoValidationRequest request, JwtUser user);
}

@ -0,0 +1,76 @@
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.NewProductSurveyStepTwoValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService;
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;
@Service
public class NewProductSurveyStepTwoServiceImpl implements NewProductSurveyStepTwoService {
private static final Set<String> PLATFORMS = new LinkedHashSet<>(Arrays.asList("京东", "天猫", "抖音电商"));
private static final String OTHER_SCENE = "其他场景";
@Override
public NewProductSurveyStepTwoValidationResult validate(NewProductSurveyStepTwoValidationRequest request, JwtUser user) {
requireStudent(user);
if (request == null) {
throw badRequest("请完成第二步信息后再进入下一步");
}
if (!PLATFORMS.contains(StringUtils.trimToEmpty(request.getPlatform()))) {
throw badRequest("请选择调查平台");
}
String scene = StringUtils.trimToEmpty(request.getScene());
if (StringUtils.isBlank(scene)) {
throw badRequest("请选择调查场景");
}
if (OTHER_SCENE.equals(scene) && StringUtils.isBlank(request.getCustomScene())) {
throw badRequest("请填写自定义调查场景");
}
if (StringUtils.isBlank(request.getKeyword())) {
throw badRequest("请填写搜索关键词");
}
if (StringUtils.isBlank(request.getProductName())) {
throw badRequest("请填写产品名称");
}
validateImageUrls(request.getImageUrls());
NewProductSurveyStepTwoValidationResult result = new NewProductSurveyStepTwoValidationResult();
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 validateImageUrls(List<String> imageUrls) {
if (imageUrls == null || imageUrls.isEmpty()) {
throw badRequest("请上传至少 1 张产品图片");
}
if (imageUrls.size() > 5) {
throw badRequest("产品图片最多上传 5 张");
}
if (imageUrls.stream().anyMatch(StringUtils::isBlank)) {
throw badRequest("产品图片地址不完整,请重新上传");
}
}
private ServiceException badRequest(String message) {
return new ServiceException(HttpStatus.BAD_REQUEST, message);
}
}

@ -5,7 +5,10 @@ import com.sztzjy.linkCommerce.config.security.JwtUser;
import com.sztzjy.linkCommerce.config.security.TokenProvider;
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.service.NewProductSurveyStepOneService;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService;
import com.sztzjy.linkCommerce.util.ResultEntity;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpStatus;
@ -39,6 +42,23 @@ class StudentTrainingAnswerControllerTest {
verify(service).check(any(NewProductSurveyStepOneCheckRequest.class), any(JwtUser.class));
}
@Test
void validateStepTwoUsesTheAuthenticatedStudentAndReturnsTheValidationResult() {
StudentTrainingAnswerController controller = new StudentTrainingAnswerController();
NewProductSurveyStepTwoService service = mock(NewProductSurveyStepTwoService.class);
ReflectionTestUtils.setField(controller, "newProductSurveyStepTwoService", service);
NewProductSurveyStepTwoValidationResult validation = new NewProductSurveyStepTwoValidationResult();
validation.setValid(true);
when(service.validate(any(NewProductSurveyStepTwoValidationRequest.class), any(JwtUser.class))).thenReturn(validation);
NewProductSurveyStepTwoValidationRequest answer = new NewProductSurveyStepTwoValidationRequest();
ResultEntity<NewProductSurveyStepTwoValidationResult> result = controller.validateNewProductSurveyStepTwo(answer, authenticatedStudentRequest());
assertEquals(HttpStatus.OK, result.getStatusCode());
assertEquals(validation, result.getBody().getData());
verify(service).validate(any(NewProductSurveyStepTwoValidationRequest.class), any(JwtUser.class));
}
private HttpServletRequest authenticatedStudentRequest() {
JwtUser user = new JwtUser();
user.setUserId("stu-1");

@ -0,0 +1,68 @@
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.NewProductSurveyStepTwoValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class NewProductSurveyStepTwoServiceImplTest {
@Test
void validatesACompleteStudentSubmission() {
NewProductSurveyStepTwoServiceImpl service = new NewProductSurveyStepTwoServiceImpl();
NewProductSurveyStepTwoValidationResult result = service.validate(
request("京东", "AI儿童玩具", "", Arrays.asList("/profile/upload/main.png", "/profile/upload/detail.png")), student());
assertTrue(result.isValid());
}
@Test
void rejectsOtherSceneWithoutCustomSceneAndMoreThanFiveImages() {
NewProductSurveyStepTwoServiceImpl service = new NewProductSurveyStepTwoServiceImpl();
assertThrows(ServiceException.class, () -> service.validate(request("京东", "其他场景", "", Collections.singletonList("/profile/upload/main.png")), student()));
assertThrows(ServiceException.class, () -> service.validate(request("京东", "AI儿童玩具", "", Arrays.asList("1", "2", "3", "4", "5", "6")), student()));
}
@Test
void rejectsNonStudentsAndMissingRequiredFields() {
NewProductSurveyStepTwoServiceImpl service = new NewProductSurveyStepTwoServiceImpl();
assertThrows(ServiceException.class, () -> service.validate(request("拼多多", "AI儿童玩具", "", Collections.singletonList("/profile/upload/main.png")), student()));
assertThrows(ServiceException.class, () -> service.validate(request("京东", "AI儿童玩具", "", Collections.emptyList()), student()));
assertThrows(ServiceException.class, () -> service.validate(request("京东", "AI儿童玩具", "", Collections.singletonList("/profile/upload/main.png")), teacher()));
}
private NewProductSurveyStepTwoValidationRequest request(String platform, String scene, String customScene, List<String> imageUrls) {
NewProductSurveyStepTwoValidationRequest request = new NewProductSurveyStepTwoValidationRequest();
request.setPlatform(platform);
request.setScene(scene);
request.setCustomScene(customScene);
request.setKeyword("AI智能对话机器人 3-6岁 玩具");
request.setProductName("AI 智能机器人");
request.setImageUrls(imageUrls);
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;
}
}
Loading…
Cancel
Save