From 0ac092bc9522156845535806972f641d0bb748d7 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 17:22:41 +0800 Subject: [PATCH 1/4] feat: validate competitive analysis step one --- .../stu/StudentTrainingAnswerController.java | 17 ++++++++++ ...nmentAnalysisStepOneValidationRequest.java | 16 +++++++++ ...onmentAnalysisStepOneValidationResult.java | 10 ++++++ ...tiveEnvironmentAnalysisStepOneService.java | 9 +++++ ...EnvironmentAnalysisStepOneServiceImpl.java | 27 +++++++++++++++ .../StudentTrainingAnswerControllerTest.java | 20 +++++++++++ ...ronmentAnalysisStepOneServiceImplTest.java | 34 +++++++++++++++++++ 7 files changed, 133 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepOneValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepOneValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepOneService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImplTest.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 cbf8e22..46a1c51 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -4,6 +4,8 @@ import com.sztzjy.linkCommerce.config.exception.handler.ServiceException; import com.sztzjy.linkCommerce.config.security.JwtUser; 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.NewProductSurveyStepOneCheckRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; @@ -29,6 +31,7 @@ import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepTwoService; 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.util.ResultEntity; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -45,6 +48,9 @@ public class StudentTrainingAnswerController { @Autowired private StudentTrainingAnswerService studentTrainingAnswerService; + @Autowired + private CompetitiveEnvironmentAnalysisStepOneService competitiveEnvironmentAnalysisStepOneService; + @Autowired private NewProductSurveyStepOneService newProductSurveyStepOneService; @@ -93,6 +99,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/competitive-environment-analysis/step-1/validate") + @ApiOperation("竞争环境分析第一步校验") + public ResultEntity validateCompetitiveEnvironmentAnalysisStepOne( + @RequestBody CompetitiveEnvironmentAnalysisStepOneValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", competitiveEnvironmentAnalysisStepOneService.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/CompetitiveEnvironmentAnalysisStepOneValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepOneValidationRequest.java new file mode 100644 index 0000000..ea64e5e --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepOneValidationRequest.java @@ -0,0 +1,16 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class CompetitiveEnvironmentAnalysisStepOneValidationRequest { + 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/CompetitiveEnvironmentAnalysisStepOneValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepOneValidationResult.java new file mode 100644 index 0000000..2135f03 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepOneValidationResult.java @@ -0,0 +1,10 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class CompetitiveEnvironmentAnalysisStepOneValidationResult { + 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/CompetitiveEnvironmentAnalysisStepOneService.java b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepOneService.java new file mode 100644 index 0000000..fe750e5 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepOneService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationResult; + +public interface CompetitiveEnvironmentAnalysisStepOneService { + CompetitiveEnvironmentAnalysisStepOneValidationResult validate(CompetitiveEnvironmentAnalysisStepOneValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImpl.java new file mode 100644 index 0000000..6ccf350 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImpl.java @@ -0,0 +1,27 @@ +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.CompetitiveEnvironmentAnalysisStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationResult; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +@Service +public class CompetitiveEnvironmentAnalysisStepOneServiceImpl implements CompetitiveEnvironmentAnalysisStepOneService { + @Override + public CompetitiveEnvironmentAnalysisStepOneValidationResult validate(CompetitiveEnvironmentAnalysisStepOneValidationRequest request, JwtUser user) { + if (user == null || StringUtils.isBlank(user.getUserId())) throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再校验"); + if (user.getRoleId() != 4) throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可进行实训校验"); + 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, "请完整填写优势、劣势、机会和威胁四类信息"); + } + CompetitiveEnvironmentAnalysisStepOneValidationResult result = new CompetitiveEnvironmentAnalysisStepOneValidationResult(); + 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 801bc42..f7efc05 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java @@ -4,6 +4,8 @@ import com.sztzjy.linkCommerce.config.Constant; 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.CompetitiveEnvironmentAnalysisStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult; @@ -18,6 +20,7 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValida import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; @@ -40,6 +43,23 @@ import static org.mockito.Mockito.when; class StudentTrainingAnswerControllerTest { + @Test + void validateCompetitiveEnvironmentAnalysisStepOneUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { + StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); + CompetitiveEnvironmentAnalysisStepOneService service = mock(CompetitiveEnvironmentAnalysisStepOneService.class); + ReflectionTestUtils.setField(controller, "competitiveEnvironmentAnalysisStepOneService", service); + CompetitiveEnvironmentAnalysisStepOneValidationResult validation = new CompetitiveEnvironmentAnalysisStepOneValidationResult(); + validation.setValid(true); + when(service.validate(any(CompetitiveEnvironmentAnalysisStepOneValidationRequest.class), any(JwtUser.class))).thenReturn(validation); + + ResultEntity result = controller + .validateCompetitiveEnvironmentAnalysisStepOne(new CompetitiveEnvironmentAnalysisStepOneValidationRequest(), authenticatedStudentRequest()); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals(validation, result.getBody().getData()); + verify(service).validate(any(CompetitiveEnvironmentAnalysisStepOneValidationRequest.class), any(JwtUser.class)); + } + @Test void checkStepOneUsesTheAuthenticatedStudentAndReturnsTheGrade() { StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImplTest.java new file mode 100644 index 0000000..a2485aa --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepOneServiceImplTest.java @@ -0,0 +1,34 @@ +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.CompetitiveEnvironmentAnalysisStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneValidationResult; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CompetitiveEnvironmentAnalysisStepOneServiceImplTest { + @Test + void validateAcceptsAllFourSwotDimensions() { + CompetitiveEnvironmentAnalysisStepOneValidationResult result = new CompetitiveEnvironmentAnalysisStepOneServiceImpl().validate(completedRequest(), student()); + assertTrue(result.isValid()); + } + + @Test + void validateRejectsMissingDimensionAndNonStudent() { + CompetitiveEnvironmentAnalysisStepOneValidationRequest missingThreat = completedRequest(); + missingThreat.setThreats(" "); + CompetitiveEnvironmentAnalysisStepOneServiceImpl service = new CompetitiveEnvironmentAnalysisStepOneServiceImpl(); + assertThrows(ServiceException.class, () -> service.validate(missingThreat, student())); + assertThrows(ServiceException.class, () -> service.validate(completedRequest(), teacher())); + } + + private CompetitiveEnvironmentAnalysisStepOneValidationRequest completedRequest() { + CompetitiveEnvironmentAnalysisStepOneValidationRequest request = new CompetitiveEnvironmentAnalysisStepOneValidationRequest(); + 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; } + private JwtUser teacher() { JwtUser user = student(); user.setRoleId(3); return user; } +} From 567f25a86d9c3029367554073fbf589e4ee7ad3c Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 17:39:23 +0800 Subject: [PATCH 2/4] 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; } +} From a4f8adf68adc496598afb9fec3b8817e054776c5 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 17:48:51 +0800 Subject: [PATCH 3/4] feat: validate competitive analysis step three --- .../stu/StudentTrainingAnswerController.java | 17 ++++++ ...entAnalysisStepThreeValidationRequest.java | 23 ++++++++ ...mentAnalysisStepThreeValidationResult.java | 11 ++++ ...veEnvironmentAnalysisStepThreeService.java | 9 +++ ...vironmentAnalysisStepThreeServiceImpl.java | 51 ++++++++++++++++ .../StudentTrainingAnswerControllerTest.java | 15 +++++ ...nmentAnalysisStepThreeServiceImplTest.java | 59 +++++++++++++++++++ 7 files changed, 185 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepThreeService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImplTest.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 adfd982..66c0dfa 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -8,6 +8,8 @@ import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneV 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.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; @@ -35,6 +37,7 @@ 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.service.CompetitiveEnvironmentAnalysisStepThreeService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -57,6 +60,9 @@ public class StudentTrainingAnswerController { @Autowired private CompetitiveEnvironmentAnalysisStepTwoService competitiveEnvironmentAnalysisStepTwoService; + @Autowired + private CompetitiveEnvironmentAnalysisStepThreeService competitiveEnvironmentAnalysisStepThreeService; + @Autowired private NewProductSurveyStepOneService newProductSurveyStepOneService; @@ -127,6 +133,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/competitive-environment-analysis/step-3/validate") + @ApiOperation("竞争环境分析第三步校验") + public ResultEntity validateCompetitiveEnvironmentAnalysisStepThree( + @RequestBody CompetitiveEnvironmentAnalysisStepThreeValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", competitiveEnvironmentAnalysisStepThreeService.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/CompetitiveEnvironmentAnalysisStepThreeValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationRequest.java new file mode 100644 index 0000000..94b2f8c --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationRequest.java @@ -0,0 +1,23 @@ +package com.sztzjy.linkCommerce.entity.dto; + +import java.util.List; + +public class CompetitiveEnvironmentAnalysisStepThreeValidationRequest { + private List strategies; + + public List getStrategies() { return strategies; } + public void setStrategies(List strategies) { this.strategies = strategies; } + + public static class Strategy { + private String strategyType; + private String recommendation; + private String expectedEffect; + + public String getStrategyType() { return strategyType; } + public void setStrategyType(String strategyType) { this.strategyType = strategyType; } + public String getRecommendation() { return recommendation; } + public void setRecommendation(String recommendation) { this.recommendation = recommendation; } + public String getExpectedEffect() { return expectedEffect; } + public void setExpectedEffect(String expectedEffect) { this.expectedEffect = expectedEffect; } + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationResult.java new file mode 100644 index 0000000..4fd5773 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepThreeValidationResult.java @@ -0,0 +1,11 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class CompetitiveEnvironmentAnalysisStepThreeValidationResult { + 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/CompetitiveEnvironmentAnalysisStepThreeService.java b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepThreeService.java new file mode 100644 index 0000000..f102a0f --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepThreeService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; + +public interface CompetitiveEnvironmentAnalysisStepThreeService { + CompetitiveEnvironmentAnalysisStepThreeValidationResult validate(CompetitiveEnvironmentAnalysisStepThreeValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImpl.java new file mode 100644 index 0000000..c11fe2e --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImpl.java @@ -0,0 +1,51 @@ +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.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepThreeService; +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; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@Service +public class CompetitiveEnvironmentAnalysisStepThreeServiceImpl implements CompetitiveEnvironmentAnalysisStepThreeService { + private static final String TASK_KEY = "competitive-environment-analysis"; + private static final Set STRATEGY_TYPES = new HashSet<>(Arrays.asList("so", "wo", "st", "wt")); + + @Autowired private StudentTrainingAnswerService studentTrainingAnswerService; + + @Override + public CompetitiveEnvironmentAnalysisStepThreeValidationResult validate(CompetitiveEnvironmentAnalysisStepThreeValidationRequest 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()) || StringUtils.isBlank(savedAnswer.getStep2Answer())) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存前两步的 SWOT 信息归类与补充"); + } + if (request == null || request.getStrategies() == null || request.getStrategies().size() != STRATEGY_TYPES.size()) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请完成 SO、WO、ST 和 WT 四类策略"); + } + Set submittedTypes = new HashSet<>(); + for (CompetitiveEnvironmentAnalysisStepThreeValidationRequest.Strategy strategy : request.getStrategies()) { + String strategyType = strategy == null ? "" : StringUtils.trimToEmpty(strategy.getStrategyType()); + if (!STRATEGY_TYPES.contains(strategyType) || !submittedTypes.add(strategyType)) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请完成 SO、WO、ST 和 WT 四类策略"); + } + if (StringUtils.isBlank(strategy.getRecommendation()) || StringUtils.isBlank(strategy.getExpectedEffect())) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请为每类策略填写建议和预期效果"); + } + } + CompetitiveEnvironmentAnalysisStepThreeValidationResult result = new CompetitiveEnvironmentAnalysisStepThreeValidationResult(); + 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 c54cf48..1f92189 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java @@ -8,6 +8,8 @@ import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepOneV 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.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult; @@ -24,6 +26,7 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeVali import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepTwoService; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; @@ -75,6 +78,18 @@ class StudentTrainingAnswerControllerTest { verify(service).validate(any(CompetitiveEnvironmentAnalysisStepTwoValidationRequest.class), any(JwtUser.class)); } + @Test + void validateCompetitiveEnvironmentAnalysisStepThreeUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { + StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); + CompetitiveEnvironmentAnalysisStepThreeService service = mock(CompetitiveEnvironmentAnalysisStepThreeService.class); + ReflectionTestUtils.setField(controller, "competitiveEnvironmentAnalysisStepThreeService", service); + CompetitiveEnvironmentAnalysisStepThreeValidationResult validation = new CompetitiveEnvironmentAnalysisStepThreeValidationResult(); validation.setValid(true); + when(service.validate(any(CompetitiveEnvironmentAnalysisStepThreeValidationRequest.class), any(JwtUser.class))).thenReturn(validation); + ResultEntity result = controller.validateCompetitiveEnvironmentAnalysisStepThree(new CompetitiveEnvironmentAnalysisStepThreeValidationRequest(), authenticatedStudentRequest()); + assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals(validation, result.getBody().getData()); + verify(service).validate(any(CompetitiveEnvironmentAnalysisStepThreeValidationRequest.class), any(JwtUser.class)); + } + @Test void checkStepOneUsesTheAuthenticatedStudentAndReturnsTheGrade() { StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImplTest.java new file mode 100644 index 0000000..55fc249 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepThreeServiceImplTest.java @@ -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.StudentTrainingAnswer; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.ArrayList; +import java.util.Arrays; + +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 CompetitiveEnvironmentAnalysisStepThreeServiceImplTest { + @Test + void validateAcceptsAllStrategiesAfterFirstTwoStepsAreSaved() { + CompetitiveEnvironmentAnalysisStepThreeValidationResult result = serviceWithFirstTwoSteps().validate(completedRequest(), student()); + assertTrue(result.isValid()); + } + + @Test + void validateRejectsIncompleteStrategiesAndMissingPrerequisiteSteps() { + CompetitiveEnvironmentAnalysisStepThreeValidationRequest incomplete = completedRequest(); + incomplete.getStrategies().get(0).setExpectedEffect(" "); + assertThrows(ServiceException.class, () -> serviceWithFirstTwoSteps().validate(incomplete, student())); + + CompetitiveEnvironmentAnalysisStepThreeServiceImpl service = new CompetitiveEnvironmentAnalysisStepThreeServiceImpl(); + 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 CompetitiveEnvironmentAnalysisStepThreeServiceImpl serviceWithFirstTwoSteps() { + CompetitiveEnvironmentAnalysisStepThreeServiceImpl service = new CompetitiveEnvironmentAnalysisStepThreeServiceImpl(); + StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); + StudentTrainingAnswer answer = new StudentTrainingAnswer(); answer.setStep1Answer("{\"swot\":{}}"); answer.setStep2Answer("{\"supplements\":{}}"); + when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(answer); + ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); + return service; + } + + private CompetitiveEnvironmentAnalysisStepThreeValidationRequest completedRequest() { + CompetitiveEnvironmentAnalysisStepThreeValidationRequest request = new CompetitiveEnvironmentAnalysisStepThreeValidationRequest(); + ArrayList strategies = new ArrayList<>(); + Arrays.asList("so", "wo", "st", "wt").forEach(type -> { CompetitiveEnvironmentAnalysisStepThreeValidationRequest.Strategy item = new CompetitiveEnvironmentAnalysisStepThreeValidationRequest.Strategy(); item.setStrategyType(type); item.setRecommendation(type + " 策略建议"); item.setExpectedEffect(type + " 预期效果"); strategies.add(item); }); + request.setStrategies(strategies); return request; + } + + private JwtUser student() { JwtUser user = new JwtUser(); user.setUserId("stu-1"); user.setRoleId(4); return user; } +} From 5e3ace65072d8394460461bf4ab75454652596ec Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 17:57:29 +0800 Subject: [PATCH 4/4] feat: validate competitive analysis step four --- .../stu/StudentTrainingAnswerController.java | 17 ++++++ ...mentAnalysisStepFourValidationRequest.java | 38 ++++++++++++ ...nmentAnalysisStepFourValidationResult.java | 11 ++++ ...iveEnvironmentAnalysisStepFourService.java | 9 +++ ...nvironmentAnalysisStepFourServiceImpl.java | 49 +++++++++++++++ .../StudentTrainingAnswerControllerTest.java | 15 +++++ ...onmentAnalysisStepFourServiceImplTest.java | 60 +++++++++++++++++++ 7 files changed, 199 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepFourService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImplTest.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 66c0dfa..f014a60 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -10,6 +10,8 @@ import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoV import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; @@ -38,6 +40,7 @@ import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepTwoService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepThreeService; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepFourService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -63,6 +66,9 @@ public class StudentTrainingAnswerController { @Autowired private CompetitiveEnvironmentAnalysisStepThreeService competitiveEnvironmentAnalysisStepThreeService; + @Autowired + private CompetitiveEnvironmentAnalysisStepFourService competitiveEnvironmentAnalysisStepFourService; + @Autowired private NewProductSurveyStepOneService newProductSurveyStepOneService; @@ -144,6 +150,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/competitive-environment-analysis/step-4/validate") + @ApiOperation("竞争环境分析第四步校验") + public ResultEntity validateCompetitiveEnvironmentAnalysisStepFour( + @RequestBody CompetitiveEnvironmentAnalysisStepFourValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", competitiveEnvironmentAnalysisStepFourService.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/CompetitiveEnvironmentAnalysisStepFourValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationRequest.java new file mode 100644 index 0000000..722cbae --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationRequest.java @@ -0,0 +1,38 @@ +package com.sztzjy.linkCommerce.entity.dto; + +import java.util.List; + +public class CompetitiveEnvironmentAnalysisStepFourValidationRequest { + private String overallEvaluation; + private List priorities; + private String coreRiskOne; + private String coreRiskTwo; + private String otherRisk; + private String conclusion; + + public String getOverallEvaluation() { return overallEvaluation; } + public void setOverallEvaluation(String overallEvaluation) { this.overallEvaluation = overallEvaluation; } + public List getPriorities() { return priorities; } + public void setPriorities(List priorities) { this.priorities = priorities; } + public String getCoreRiskOne() { return coreRiskOne; } + public void setCoreRiskOne(String coreRiskOne) { this.coreRiskOne = coreRiskOne; } + public String getCoreRiskTwo() { return coreRiskTwo; } + public void setCoreRiskTwo(String coreRiskTwo) { this.coreRiskTwo = coreRiskTwo; } + public String getOtherRisk() { return otherRisk; } + public void setOtherRisk(String otherRisk) { this.otherRisk = otherRisk; } + public String getConclusion() { return conclusion; } + public void setConclusion(String conclusion) { this.conclusion = conclusion; } + + public static class PriorityStrategy { + private String strategyType; + private Integer priority; + private String reason; + + public String getStrategyType() { return strategyType; } + public void setStrategyType(String strategyType) { this.strategyType = strategyType; } + public Integer getPriority() { return priority; } + public void setPriority(Integer priority) { this.priority = priority; } + public String getReason() { return reason; } + public void setReason(String reason) { this.reason = reason; } + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationResult.java new file mode 100644 index 0000000..6d599b8 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/CompetitiveEnvironmentAnalysisStepFourValidationResult.java @@ -0,0 +1,11 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class CompetitiveEnvironmentAnalysisStepFourValidationResult { + 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/CompetitiveEnvironmentAnalysisStepFourService.java b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepFourService.java new file mode 100644 index 0000000..a6d0622 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/CompetitiveEnvironmentAnalysisStepFourService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationResult; + +public interface CompetitiveEnvironmentAnalysisStepFourService { + CompetitiveEnvironmentAnalysisStepFourValidationResult validate(CompetitiveEnvironmentAnalysisStepFourValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImpl.java new file mode 100644 index 0000000..6af17af --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImpl.java @@ -0,0 +1,49 @@ +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.CompetitiveEnvironmentAnalysisStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationResult; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepFourService; +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; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@Service +public class CompetitiveEnvironmentAnalysisStepFourServiceImpl implements CompetitiveEnvironmentAnalysisStepFourService { + private static final String TASK_KEY = "competitive-environment-analysis"; + private static final Set STRATEGY_TYPES = new HashSet<>(Arrays.asList("so", "wo", "st", "wt")); + private static final Set EVALUATION_OPTIONS = new HashSet<>(Arrays.asList("优势明显,建议快速进入", "机会大于挑战,建议积极布局", "挑战与机会并存,需谨慎推进", "劣势突出,建议暂缓进入")); + + @Autowired private StudentTrainingAnswerService studentTrainingAnswerService; + + @Override + public CompetitiveEnvironmentAnalysisStepFourValidationResult validate(CompetitiveEnvironmentAnalysisStepFourValidationRequest 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.getStep3Answer())) throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存第 3 步的 SWOT 策略"); + if (request == null || !EVALUATION_OPTIONS.contains(StringUtils.trimToEmpty(request.getOverallEvaluation())) || StringUtils.isBlank(request.getCoreRiskOne()) || StringUtils.isBlank(request.getCoreRiskTwo()) || StringUtils.isBlank(request.getConclusion())) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请完整填写总体判断、至少 2 个风险点和总结结论"); + } + if (request.getPriorities() == null || request.getPriorities().size() != STRATEGY_TYPES.size()) throw new ServiceException(HttpStatus.BAD_REQUEST, "请完成 SO、WO、ST、WT 四类策略的优先级排序"); + Set submittedTypes = new HashSet<>(); + Set priorities = new HashSet<>(); + for (CompetitiveEnvironmentAnalysisStepFourValidationRequest.PriorityStrategy item : request.getPriorities()) { + String strategyType = item == null ? "" : StringUtils.trimToEmpty(item.getStrategyType()); + if (!STRATEGY_TYPES.contains(strategyType) || !submittedTypes.add(strategyType) || item.getPriority() == null || item.getPriority() < 1 || item.getPriority() > 4 || !priorities.add(item.getPriority()) || StringUtils.isBlank(item.getReason())) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "请完成 SO、WO、ST、WT 四类策略的 1 至 4 优先级排序及理由"); + } + } + CompetitiveEnvironmentAnalysisStepFourValidationResult result = new CompetitiveEnvironmentAnalysisStepFourValidationResult(); + 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 1f92189..282c2b6 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java @@ -10,6 +10,8 @@ import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoV import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepThreeValidationResult; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepOneCheckResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult; @@ -27,6 +29,7 @@ import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepOneService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepTwoService; import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepThreeService; +import com.sztzjy.linkCommerce.service.CompetitiveEnvironmentAnalysisStepFourService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; @@ -90,6 +93,18 @@ class StudentTrainingAnswerControllerTest { verify(service).validate(any(CompetitiveEnvironmentAnalysisStepThreeValidationRequest.class), any(JwtUser.class)); } + @Test + void validateCompetitiveEnvironmentAnalysisStepFourUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { + StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); + CompetitiveEnvironmentAnalysisStepFourService service = mock(CompetitiveEnvironmentAnalysisStepFourService.class); + ReflectionTestUtils.setField(controller, "competitiveEnvironmentAnalysisStepFourService", service); + CompetitiveEnvironmentAnalysisStepFourValidationResult validation = new CompetitiveEnvironmentAnalysisStepFourValidationResult(); validation.setValid(true); + when(service.validate(any(CompetitiveEnvironmentAnalysisStepFourValidationRequest.class), any(JwtUser.class))).thenReturn(validation); + ResultEntity result = controller.validateCompetitiveEnvironmentAnalysisStepFour(new CompetitiveEnvironmentAnalysisStepFourValidationRequest(), authenticatedStudentRequest()); + assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals(validation, result.getBody().getData()); + verify(service).validate(any(CompetitiveEnvironmentAnalysisStepFourValidationRequest.class), any(JwtUser.class)); + } + @Test void checkStepOneUsesTheAuthenticatedStudentAndReturnsTheGrade() { StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImplTest.java new file mode 100644 index 0000000..833345c --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/CompetitiveEnvironmentAnalysisStepFourServiceImplTest.java @@ -0,0 +1,60 @@ +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.CompetitiveEnvironmentAnalysisStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.CompetitiveEnvironmentAnalysisStepFourValidationResult; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.ArrayList; +import java.util.Arrays; + +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 CompetitiveEnvironmentAnalysisStepFourServiceImplTest { + @Test + void validateAcceptsCompleteDecisionAfterStepThreeIsSaved() { + CompetitiveEnvironmentAnalysisStepFourValidationResult result = serviceWithStepThree().validate(completedRequest(), student()); + assertTrue(result.isValid()); + } + + @Test + void validateRejectsDuplicatePriorityAndMissingStepThree() { + CompetitiveEnvironmentAnalysisStepFourValidationRequest incomplete = completedRequest(); + incomplete.getPriorities().get(1).setPriority(1); + assertThrows(ServiceException.class, () -> serviceWithStepThree().validate(incomplete, student())); + + CompetitiveEnvironmentAnalysisStepFourServiceImpl service = new CompetitiveEnvironmentAnalysisStepFourServiceImpl(); + 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 CompetitiveEnvironmentAnalysisStepFourServiceImpl serviceWithStepThree() { + CompetitiveEnvironmentAnalysisStepFourServiceImpl service = new CompetitiveEnvironmentAnalysisStepFourServiceImpl(); + StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); + StudentTrainingAnswer answer = new StudentTrainingAnswer(); answer.setStep3Answer("{\"strategies\":{}}"); + when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(answer); + ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); + return service; + } + + private CompetitiveEnvironmentAnalysisStepFourValidationRequest completedRequest() { + CompetitiveEnvironmentAnalysisStepFourValidationRequest request = new CompetitiveEnvironmentAnalysisStepFourValidationRequest(); + request.setOverallEvaluation("机会大于挑战,建议积极布局"); request.setCoreRiskOne("核心风险一"); request.setCoreRiskTwo("核心风险二"); request.setConclusion("形成完整竞争环境结论"); + ArrayList priorities = new ArrayList<>(); + Arrays.asList("so", "wo", "st", "wt").forEach(type -> { CompetitiveEnvironmentAnalysisStepFourValidationRequest.PriorityStrategy item = new CompetitiveEnvironmentAnalysisStepFourValidationRequest.PriorityStrategy(); item.setStrategyType(type); item.setPriority(priorities.size() + 1); item.setReason(type + " 排序理由"); priorities.add(item); }); + request.setPriorities(priorities); return request; + } + + private JwtUser student() { JwtUser user = new JwtUser(); user.setUserId("stu-1"); user.setRoleId(4); return user; } +}