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; } +}