From 567f25a86d9c3029367554073fbf589e4ee7ad3c Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 17:39:23 +0800 Subject: [PATCH] feat: validate competitive analysis step two --- .../stu/StudentTrainingAnswerController.java | 17 +++++++++ ...nmentAnalysisStepTwoValidationRequest.java | 16 +++++++++ ...onmentAnalysisStepTwoValidationResult.java | 10 ++++++ ...tiveEnvironmentAnalysisStepTwoService.java | 9 +++++ ...EnvironmentAnalysisStepTwoServiceImpl.java | 31 ++++++++++++++++ .../StudentTrainingAnswerControllerTest.java | 15 ++++++++ ...ronmentAnalysisStepTwoServiceImplTest.java | 35 +++++++++++++++++++ 7 files changed, 133 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepTwoService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImplTest.java diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java index 46a1c51..adfd982 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -6,6 +6,8 @@ import com.sztzjy.linkCommerce.config.security.TokenProvider; import com.sztzjy.linkCommerce.entity.StudentTrainingAnswer; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationRequest; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationResult; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; @@ -32,6 +34,7 @@ import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepThreeService import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepFourService; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepTwoService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -51,6 +54,9 @@ public class StudentTrainingAnswerController { @Autowired private CompetitiveEnvironmentAnalysisStepOneService competitiveEnvironmentAnalysisStepOneService; + @Autowired + private CompetitiveEnvironmentAnalysisStepTwoService competitiveEnvironmentAnalysisStepTwoService; + @Autowired private NewProductSurveyStepOneService newProductSurveyStepOneService; @@ -110,6 +116,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/competitive-environment-analysis/step-2/validate") + @ApiOperation("竞争环境分析第二步校验") + public ResultEntity validateCompetitiveEnvironmentAnalysisStepTwo( + @RequestBody CompetitiveEnvironmentAnalysisStepTwoValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", competitiveEnvironmentAnalysisStepTwoService.validate(answer, TokenProvider.getJWTUser(request))); + } catch (ServiceException e) { + return new ResultEntity<>(e.getCode(), e.getMessage()); + } + } + @PostMapping("/new-product-survey/step-1/check") @ApiOperation("新产品调查与分析第一步判题") public ResultEntity checkNewProductSurveyStepOne( diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationRequest.java new file mode 100644 index 0000000..ec135ef --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationRequest.java @@ -0,0 +1,16 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class CompetitiveEnvironmentAnalysisStepTwoValidationRequest { + private String strengths; + private String weaknesses; + private String opportunities; + private String threats; + public String getStrengths() { return strengths; } + public void setStrengths(String strengths) { this.strengths = strengths; } + public String getWeaknesses() { return weaknesses; } + public void setWeaknesses(String weaknesses) { this.weaknesses = weaknesses; } + public String getOpportunities() { return opportunities; } + public void setOpportunities(String opportunities) { this.opportunities = opportunities; } + public String getThreats() { return threats; } + public void setThreats(String threats) { this.threats = threats; } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationResult.java new file mode 100644 index 0000000..0023a4a --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepTwoValidationResult.java @@ -0,0 +1,10 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class CompetitiveEnvironmentAnalysisStepTwoValidationResult { + 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; } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepTwoService.java b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepTwoService.java new file mode 100644 index 0000000..1e526d1 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepTwoService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; + +public interface CompetitiveEnvironmentAnalysisStepTwoService { + CompetitiveEnvironmentAnalysisStepTwoValidationResult validate(CompetitiveEnvironmentAnalysisStepTwoValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImpl.java new file mode 100644 index 0000000..3cbd686 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImpl.java @@ -0,0 +1,31 @@ +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.CompetitiveEnvironmentAnalysisStepTwoValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepTwoService; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +@Service +public class CompetitiveEnvironmentAnalysisStepTwoServiceImpl implements CompetitiveEnvironmentAnalysisStepTwoService { + private static final String TASK_KEY = "competitive-environment-analysis"; + @Autowired private StudentTrainingAnswerService studentTrainingAnswerService; + + @Override + public CompetitiveEnvironmentAnalysisStepTwoValidationResult validate(CompetitiveEnvironmentAnalysisStepTwoValidationRequest 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); + if (savedAnswer == null || StringUtils.isBlank(savedAnswer.getStep1Answer())) throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存第 1 步的 SWOT 信息归类"); + if (request == null || StringUtils.isBlank(request.getStrengths()) || StringUtils.isBlank(request.getWeaknesses()) || StringUtils.isBlank(request.getOpportunities()) || StringUtils.isBlank(request.getThreats())) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请为优势、劣势、机会和威胁各补充至少 1 条信息"); + } + CompetitiveEnvironmentAnalysisStepTwoValidationResult result = new CompetitiveEnvironmentAnalysisStepTwoValidationResult(); result.setValid(true); result.setMessage("校验通过"); return result; + } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java index f7efc05..c54cf48 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java @@ -6,6 +6,8 @@ import com.sztzjy.linkCommerce.config.security.TokenProvider; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckRequest; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationRequest; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationResult; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult; @@ -21,6 +23,7 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeVali import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; @@ -60,6 +63,18 @@ class StudentTrainingAnswerControllerTest { verify(service).validate(any(CompetitiveEnvironmentAnalysisStepOneValidationRequest.class), any(JwtUser.class)); } + @Test + void validateCompetitiveEnvironmentAnalysisStepTwoUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { + StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); + CompetitiveEnvironmentAnalysisStepTwoService service = mock(CompetitiveEnvironmentAnalysisStepTwoService.class); + ReflectionTestUtils.setField(controller, "competitiveEnvironmentAnalysisStepTwoService", service); + CompetitiveEnvironmentAnalysisStepTwoValidationResult validation = new CompetitiveEnvironmentAnalysisStepTwoValidationResult(); validation.setValid(true); + when(service.validate(any(CompetitiveEnvironmentAnalysisStepTwoValidationRequest.class), any(JwtUser.class))).thenReturn(validation); + ResultEntity result = controller.validateCompetitiveEnvironmentAnalysisStepTwo(new CompetitiveEnvironmentAnalysisStepTwoValidationRequest(), authenticatedStudentRequest()); + assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals(validation, result.getBody().getData()); + verify(service).validate(any(CompetitiveEnvironmentAnalysisStepTwoValidationRequest.class), any(JwtUser.class)); + } + @Test void checkStepOneUsesTheAuthenticatedStudentAndReturnsTheGrade() { StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImplTest.java new file mode 100644 index 0000000..02d6a71 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepTwoServiceImplTest.java @@ -0,0 +1,35 @@ +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.CompetitiveEnvironmentAnalysisStepTwoValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class CompetitiveEnvironmentAnalysisStepTwoServiceImplTest { + @Test + void validateAcceptsAllSwotSupplementsAfterStepOneIsSaved() { + CompetitiveEnvironmentAnalysisStepTwoValidationResult result = serviceWithStepOne().validate(completedRequest(), student()); + assertTrue(result.isValid()); + } + @Test + void validateRejectsMissingSupplementAndMissingStepOne() { + CompetitiveEnvironmentAnalysisStepTwoValidationRequest incomplete = completedRequest(); incomplete.setThreats(" "); + assertThrows(ServiceException.class, () -> serviceWithStepOne().validate(incomplete, student())); + CompetitiveEnvironmentAnalysisStepTwoServiceImpl service = new CompetitiveEnvironmentAnalysisStepTwoServiceImpl(); StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(null); + assertThrows(ServiceException.class, () -> service.validate(completedRequest(), student())); + } + private CompetitiveEnvironmentAnalysisStepTwoServiceImpl serviceWithStepOne() { CompetitiveEnvironmentAnalysisStepTwoServiceImpl service = new CompetitiveEnvironmentAnalysisStepTwoServiceImpl(); StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); StudentTrainingAnswer answer = new StudentTrainingAnswer(); answer.setStep1Answer("{\"swot\":{}}"); when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(answer); ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); return service; } + private CompetitiveEnvironmentAnalysisStepTwoValidationRequest completedRequest() { CompetitiveEnvironmentAnalysisStepTwoValidationRequest request = new CompetitiveEnvironmentAnalysisStepTwoValidationRequest(); request.setStrengths("产品能力补充信息"); request.setWeaknesses("体验短板补充信息"); request.setOpportunities("市场机会补充信息"); request.setThreats("竞争威胁补充信息"); return request; } + private JwtUser student() { JwtUser user = new JwtUser(); user.setUserId("stu-1"); user.setRoleId(4); return user; } +}